diff --git a/README.md b/README.md index bb2365c..45074c3 100644 --- a/README.md +++ b/README.md @@ -1 +1,18 @@ -# spdxl \ No newline at end of file +SPdxl is modification of dxlAPRS. + +The toolchain contains: + +- afskmodem soundmodem for 300-19200bd afsk/fsk modulation, 2 channels +- aprsmap powerful aprs-viewer using open street map +- gps2aprs aprs-tracker using connected gps-mouse +- gps2digipos generate pos-beacon for digi/igate using connected gps +- sondemod decode data produced by a RS92, SRC-C34, DFM06, RS41 wx-sonde, received with sondeudp +- sondeudp soundmodem for RS92 wx-sonde +- udpbox intelligent aprs-digipeater +- udpflex interface between serial RMNC/KISS and AXUDP +- udpgate4 aprs-igate +- udphub L2-switch for AX25, one AXUDP port from a digipeater interfaced + to many users +- udprfnet + +For more Details see doc diff --git a/aprsmap_common/NEW.txt b/aprsmap_common/NEW.txt new file mode 100644 index 0000000..2deae22 --- /dev/null +++ b/aprsmap_common/NEW.txt @@ -0,0 +1,1403 @@ ++ libpng und libz statisch dazu gelinkt + ++ font symbol und osm karten nun im png format + ++ 4 kursor tasten zum karte verschieben und backspace fuer letzte position(en) + (sofern die bei allen x11 gleichen hexcode haben) + ++ osm karten in unterverzeichnissen nach zoom faktor 1..16 + vorhandene maps loeschen oder einsortieren + ++ wenn tiles fehlen wird sofern vorhanden die mit dem naechste zoomfaktor gedehnt eingesetzt + ++ ./gm.sh starten bzw anpassen nach bedarf zum karten holen + ++ linke maus auf karte klicken oder auf track oder symbol offnet menue + viele funktionen mit klick erreichbar aber noch nicht alle + menues noch chaotisch aber mal zum testen + ++ wetter grafik + statistik auf x11 abrufbar + ++ ESC taste zum menues schliessen + ++ funktion der klicks auf symbol/text/map/track getrennt konfigurierbar + ++ 5 watch calls (ohne wildcard) statt "follow car" + ++ wetter symbol etwas besser anklickbar (symbols.png) + (alpha kanal nach heller verschoben, sollte mal nach 255 wenn alle symbole dafuer adaptiert) + ++ rechte maustaste = BACKSPACE (back in zoom/pan-history) (bei www version lokal back am browser) + ++ map move steps teil der fenstergroesse + + +6.1.2013 + ++ marker auf "Next click to Map": ohne einrasten auf symbole + "Next click to Symbol oder Text": mit einrasten auf genaue position wenn vorhanden + ++ marker loeschen und keycode "@" + ++ zoom to markers wieder da "Y" + ++ kmh histogramm und animation entsprechend der eingestellten sichtbarkeits zeit des tracks + ++ blaue popup menues sortiert nach der groesse angereiht von links oben + ++ "Expandes Tiles" geht auch weg wenn alle tiles 1:1 + ++ call in die watchlist mit click + + +7.1.2013 + ++ Taste "@" umgewidmet auf "on click" Reset + ++ Taste ":" loescht beide Marker + ++ 30s langer Retry Mechanismus zum Tiles Laden, + sobald "gettiles" geloescht, je Sekunde 1 Ladeversuch aller benoetigten oder expandierter + Tiles und was fehlt oder "png error" hat wird erneut im "gettiles" angefordert. + + +7.1.2013 + ++ Tasten "<" und ">" entsprechend "Debug Track" raw+decoded Text der Waypoints oder Baken + durchsteppen und setzt Marker 1 + ++ Backspace history size 20 statt 10 + +10. 1. 2013 + ++ Tasten < > getauscht und Textinfo bleibt sichtbar + ++ Click to WxSymbol neu und dort dann entweder 1 nicht-Wetter Messwert oder beliebig viele + Wetterwerte zugleich ein/aus schaltbar (Menue bleibt offen) + + +14. 1. 2013 + ++ Letzter Wettermesswert in der Kopfzeile der Wettergrafik + ++ Wettergrafik passt sich der Fensterbreite an (ab 320 Breite) + ++ Raw+Decoded Fenster bleibt trotz "Marker to Klick" Messdaten Fenster offen + + +16. 1. 2013 + ++ Decodiert positionless Wx Daten + ++ Decodiert negative NN im "/A="-Format + ++ Zoom to Markers geht auch bei Zoomlevel>14 + ++ Fractional Map Zoom rechnet etwa 2x so schnell und richtiger + ++ Shift-Taste bei Map Move macht 1/10 Schrittweite + ++ Shift-Taste bei Zoom (derzeit nur mit Maus) macht 1/10 Zoom Schritte + + +20. 1. 2013 + ++ Klick auf Track mit Raw+Decoded fuer den Geklickten Wegpunkt + ++ Raw+Decoded mit Wegpunkt Nummer / Gesamtpunkte zur Orientierung wo man ist + ++ Cut + Paste Puffer wird mit angeklicktem Call gefuellt + ++ Paste in Texteingabefelder + +- leider geht beides nicht nach aussen weil die fenster heute mit "selections" + miteinander telefonieren und das ist etwa so aufwendig wie das gesamte interface + zum X11 bis jetzt + ++ (derzeit noch nicht ein/ausschaltbares) Textfenster mit Scrollbalken fuer lange + Texte. Zum Test mit Rawdaten von tcp connect. + +- nach 4 Tagen Suche noch nicht gefunden wie man Kill des Fensters abfangen kann + ohne dass dabei alles abschmiert. Da auch die ganzen Xlib Aufrufe zum Text + reinzeichnen keiner auf Windoof/sontswas portieren wird, wirds wieder abgeschafft. + + +26. 1. 2013 + +- Textfenster mal wieder weg + ++ rawlog File wird nun auch nach dem Einlesen geschlossen und wie bisher beim Schreiben + fuer jede Zeile neu geoeffnet + ++ Marker 1 zu klick misst, wenn genau 1 objekt mit klick erfasst wird mit Einrasten + auf dieses, wenn "on next click set marker 2" immer ohne Einrasten + +3. 2. 2013 + ++ (minimierbare) fixe Toolbar (die minimierte verdeckt noch manchmal Text Messages) + ++ Popup Menues ausgemistet, z.B "Show All" nur wenns nicht schon ist + ++ Von den neuen Kommandos aus der Toolbar gehen erst ein paar wirklich (W V Q S) + Messages, Listen, Config noch nicht + + +6. 2. 2013 + ++ Fahrtrichtungspfeil + Windfahne bei Wx Symbol, 20kmh pro Strich + beides als Teil vom Symbol anklickbar und abschaltbar + + +10. 2. 2013 + ++ Auswahl ob Toolbar oder Popup Fenster, damit beim Start normale Toolbar da ist. + Muss noch optimiert werden was in welchem Menue sein soll und was offen bleibt + oder verschwindet. Histogramme verdecken die Pulldown Menues aus der Toolbar. + ++ Hoehenangabe bei den Symbolen, noch nicht abschaltbar weil alle Symbol-Attribute + ab einem einstellbaren Wert (mindest meter, km/h) konfigurierbar erscheinen sollten. + + +13. 2. 2013 + ++ Text Editor mit Scrollen fuer Config und (wenn fertig) Messages, Parameter werden + erst einzelne ausgewertet + ++ Screenshot mit Filename + ++ rawlog einlesen mit Filenamen (Datum Eingabe noch nicht ausgewertet) + + +16. 2. 2013 + ++ Watch Calls per Click suchen freien Platz in der Liste weil jetzt tastaturlos + auch wieder abschaltbar + ++ Watch Calls mit * als Wildcard + ++ Setzen der Start Map Position auf Bildmitte per Lokator, Long/Lat, oder mit "?" + im Config und dann Marker 1 setzen auf der Map + ++ eigene Position im Config auch mit "?" mit Marker 1 uebertragbar. + ++ Config File Speichern/Laden beim Start verwenden und automatisch bei Quit + Speichren + +- fehlt noch Auswerten einiger Config Parameter zb Helligkeiten und "next click to Wx" + + +15. 2. 2013 + ++ Ausser Igate/Network und LogDatum Configs sollten alle gehen und gekoppelt sein mit den + Schiebereglern. Manche Werte, die beim teilweise eingegeben sein Unfug machen, werden + erst bei "Save" "Reload" oder Start ausgewertet. + + +28. 2. 2013 + ++ Bei Click auf Pixel das zu mehr als 1 Objekt gehoert, werden die gefundenen Objekte + bei jedem weiteren Click der Reihe nach an die 1. Stelle cykliert + ++ Logfile Import mit Datum + ganze Stunde + ++ Netbeacon aus Configparametern damit per Modem empfangenes ein Symbol fuer MH hat + (noch nicht per tcp gesendet) + + +3. 3. 2013 + ++ Objekte Loeschen + ++ Filtern von Call, Igate, Objekt/Item-Absender (erst mal ohne Wildcards) + + +7. 3. 2013 + ++ transparente Menues oder schwarzer oder grauer Hintergrund + (Config Transparency 2..100, 1, 0) + ++ Config Baken Symbol mit Auswahlmenu ("My Symbol" clicken) + ++ Objekt loeschen mit DEL-Taste + + +17. 4. 2013 + ++ Nach wochenlangem Kampf mit den Windoof Compilern ist nun etwa Gleichstand bei der + Win32 Version und es kann wieder am gemeinsamen Teil weiter gebaut werden. + Die innere Struktur ist etwas umgekrempelt zwecks minimiertem systemabhaengigen + Teil. Leider hat sich die "Tile" Filestruktur (mit schnell mal 3500 Files in einem + Verzeichnis) am Win als Bremse erwiesen und daher ist noch eine Unterverzeichnis- + Ebene dazu gekommen und die Struktur nun gleich wie auf den Servern und "Marble". + Zum Konvertieren der vorhandenen Maps ist das "rentile" script dabei das man + noch anpassen muss und mit der Kommandozeile, die drin angegeben ist, Aufrufen. + Es wird nix geloescht nur kopiert. "gm.sh" ist auch darauf angepasst. + ++ Neu sind nur ein paar Filter im Config und fuer Besitzer eines Mausrades damit Zoomen + und Pull der Map mit der mittleren Maustaste. Fuer Touchpad-geschaedigte muss man sich + noch eine Alternative mit Shift/Alt oder Klick auf die leere Map ausdenken. + Screenshot geht nun auch als "bmp" wenns File .bmp heisst. + + +17. 4. 2013 + ++ Pull Map auch mit linker Maustaste auf leere Map (configurierbar ?) + ++ Shift + Click to Map: Set Marker 1 (configurierbare andere kommandos ?) + ++ On next Click to Wxsymbol: Raw+Decoded zu den Wettergrafiken dazu einschaltbar + + +20. 4. 2013 + ++ tcp Connect zum Server mit neuer Syntax, -g :[#] -g 44.143.100.1:14580#m/300 + MYCALL und PASSWORT jetzt schon aus dem Config statt -s -p + ++ Netzbake: "File" > "Config" -> Mycall, MyPos, Net Beacontext, My Symbol, + Netbeacontime mit Enable, PassCode mit Enable + My Symbol Anklicken fuer Auswahl + My Position "?" an 1. Stelle und dann Marker 1 Setzen + + +29. 4. 2013 + ++ tcp Connect nun probisorisch im File>Config, wenn man editiert gruen ausschalten und wenn + fertig wieder ein. + ++ auf Wunsch Massstab auf der Karte (noch nicht schaltbar) und auch problematisch wegen + nicht entfernungstreuer Merkator Karten bei kleinem Zoom + + +4. 5. 2013 + ++ Vorschlag von dl8rdl eingebaut, Maps Download im Hintergrund komplett fuer das sichtbare + Fenster von Zoom 1 bis einstellbarem maximalen Zoom mit Vorkalkulation der Datenmenge, + abbrechen, weitertun, und Fortschrittsanzeige. + ++ Messages empfangen (derzeit erst von tcp) + + +6. 5. 2013 + ++ "DAO"-Erweiterung in Frame-Decoder eingebaut zum Position auf etwa 20cm genau uebertragen + und auch genauere Auswertung vom GPS-raw-Format und Anpassung der Rundung auf Feldmitte + (leider ist die fliesskomma Genauigkeit nur etwa 1-2m) + + +8. 5. 2013 + ++ Mehr Status Meldungen von "on/off" Schaltern und (Shortcut) Funktionen + ++ legt "map.y4m" auch auf Linux neu an wenn nicht (zB. als named-pipe) vorhanden, + meldet Schreibvorgang, refresht alle 1s den Bildschirm und ist abbrechbar. + ++ Buttons mit noch nicht implementierter Funktion melden das. + ++ Im Screenshot Filenamen wird "%t" durch Datum-Uhrzeit und %n durch "000" bis "999" + ersetzt bis der Filename neu ist. + ++ Shortcut Tasten Liste im + + +10. 5. 2013 + ++ 4 direkt waehlbare Map Positionen + Zooms im Zoom-Menue oder per "1..4" Tasten. + Dabei kann entweder der Zoomlevel oder die Position oder beides abgerufen werden. + Der Eintrag dieser "Views" kann manuell im File>Config>View durch "Zoomfaktor Position" + (wobei Position auch ein QTH-Lokator sein kann), oder eines von beiden, oder viel + schneller durch "Shift" + Click auf einen der 3 "Views" im Zoom Menue erfolgen. + Dabei wird die aktuelle Karten-Position mit Zoom gespeichert. + Shortcuts anders: "1" (one user) nun "." + "2" +rf nun "=" + "On next click" neu einstellen erforderlich + + +12. 5. 2013 + ++ Tooltipps mit Text aus externem File "hints.txt" und schon etlichen Texten drin. + Darf natuerlich verbessert oder uebersetzt werden wobei das Ergebnis der Arbeit + sofort aktiv ist sobald das hints.txt gespeichert ist. + |Buttonnummer Text + die fehlenden Texte werden als " hint text" gezeigt + die Struktur des File>Config wird noch umgebaut daher mit den hints dafuer abwarten + + + +15. 5. 2013 + ++ "Zitter"-Toleranz fuer Mausposition innerhalb der die Hints sichtbar bleiben ++ Zeigt aktuelle "Mbytes written" des Video Files ++ List>Internals zeigt System Zustand ++ "L" Shortcut nun "toggle Labels on/off" Labels=Text bei den Symbolen ++ Fine Zoom Steps im Config + + +17. 5. 2013 + ++ "L" und "O" bzw "Labels off" "Objects off" wird nun nimmer in Form von 0% Helligkeit + im Config verewigt + ++ In Vorbereitung auf ein Text-Fenster kommt nun mal List>Messages und List>Bulletins + auf das Start Terminal Fenster raus, wobei die Bulletins noch nach + Absender/Eintreffzeit sortiert sind und nicht nach der BLN + ++ Angeklickte Objekte kann man in Infos>List Raw oder Infos>+Decoded auf das Textfenster + auflisten lassen (ohne farbige Fehlermeldungen) + + + +18. 5. 2013 + ++ Config>Show Incoming "n" Zeigt TCP-Frames auf dem Textfenster, "n+" Dekodiert + fuer die Radio Ports entsprechend 1 2 3 ... und 1+ 2+ ... Dekodiert + + + +21. 5. 2013 + ++ Raw+Decoded Sprechblase aktualisiert sich mit ankommenden Daten falls sie den letzten + Wegpunkt anzeigt + ++ Delete Waypoint, wenn mit Debug oder Raw+Decoded markiert. Mit DEL-Taste zum entfernen + von (falschen) Wegpunkten. Marker 1 springt dann zum naechsten (vermutlichen) Fehler weiter. + (Wann alles loeschen oder nur Waypoint muss noch besser definiertbar sein) + ++ Hoehe wird auch bei Symbolen ohne km/h Daten angezeigt falls Hoehendaten vorhanden und + eingeschaltet. + + + +23. 5. 2013 + ++ UDP-Port im Config (erst mal 1 Stueck) ++ Fenstergroesse veraendern schneller ++ Trackfilter Fehlererkennung verbessert ++ Bei Debug Funktionen Verzoegerungszeit von doppelten Waypoints in Sekunden sichtbar + + + +29. 5. 2013 + ++ Zwecks schnellem Tracks Debuggen mit "E" oder File>Infos>Waypoints-Button toggelt + alle, oder nur die als verdaechtig markierte Waypoints anzeigen mit den "<"">" Tasten + oder den Buttons daneben. + ++ rawlog mit lesbarem Datum/Zeitstempel, das alte Format wird lesend auch akzeptiert. + ++ axudp-kiss (usb)seriell Interface (udpflex) erweitert, sodass nebst an/abstecken von + usb-Seriellen auch ein resetteter TNC2 an empfangenen (nun nicht mehr kiss) Daten + erkannt und wieder auf kiss geschaltet wird. Geht mit init File auch fuer andere TNC + wie in THD7x oder TMD7x. + udpflex (linux), udpflex.exe (win32) + + +8. 6. 2013 + ++ Configurierbare default Speed fuer Animation ++ Parkplatzzittern-Erkennung fuer Animation Startzeit verbessert ++ Source Code Entruempelung zum einfacheren Compilieren fuer verschiedene Prozessoren + + +15. 6. 2013 + ++ km/h und/oder Hoehe in Animation und Video wobei Lesbarkeit bei schneller Aenderung + noch verbessert werden kann. ++ Uhrzeit beim Log schreiben laeuft nun auch waehrend Animation in Echtzeit. ++ +-24h Zeitversatz Systemzeit/angezeigte Zeit einstellbar + + + +5. 7. 2013 + ++ Objekte mit extra "keep in memory time" zB um den schon nach 5 bis 6h recycelten + Blitz-Object-Namen keinen Track erzeugen zu lassen. + ++ Logfile browsen geht gleichzeitig mit online Betrieb. Dazu wurde eine zweite + Uhrzeit geschaffen die den Logdaten folgt und die Echtzeit Daten werden unabhaengig + von den Logdaten (wie sonst auch) im RAM und writelog gepspeichert. + Es kann jederzeit zwischen Log und Echtzeit gschalten werden und in den Logdaten + an Anfang, Ende, und in "Fullbright" Zeitspruengen vor und zurueck gegangen werden + womit immer alle Daten einmal sichtbar sind. + ++ Status Bar zeigt Betriebszustand, erst mal experimentell zum sehen was man braucht + mit Buchstaben bis Symbole entworfen sind. Bei TCP (Internet) und und UDP (Funk) + wandert die Farbe von gruen nach rot binnen 1 Min. solang keine Daten ankommen. + Message soll mal anstatt dem Popup Fenster vorhandene Messages anzeigen und erst bei + draufklicken Inhalt zeigen. + + +16. 7. 2013 + ++ Hoehen Diagramm ueber Wegstrecke, mit Trackfiler on "F" wird versucht die manchmal + ungenaue Hoehenmessung etwas glatt zu buegeln. + ++ Beim Track anklicken wird der Wegpunkt ausgewaehlt der der Klickpunkt am naechten + liegt. + ++ Popup Meldungen, die Befehle bestaetigen, werden nach ein paar Sekunden wieder + entfernt. Da, um CPU Zeit zu sparen, der Bildschirm nur aktualisiert wird wenn neue + Daten kommn, geschieht das Loeschen nur im Zuge einem Updates. + + + +19. 7. 2013 + ++ "On Next Click To Track" mit Speed oder Altitude aktiviert, setzt eine Marke auf + dem Diagramm, die der angeklicken Stelle am Track entspricht. + ++ "On Next Click To Track" kann mit 1 Click Wegpunkt loeschen aktivert werden. + ++ Ein angewaehltes Objekt kann mit "Save" als Logfile mit dem Filenamen des Objekts + gespeichert werden (derzeit nur im Startverzeichnis). Existiert das File, wird + hinten dran geschrieben. Es werden alle Daten aus dem RAM geschrieben auch wenn + mit Trackfilter oder Fullbright Time ausgeblendet. + Manuell geloeschte Baken/Wegpunkte sind weg. + + +22. 7. 2013 + ++ Video/Animation Speed Einstellbereich erweitert von 1:1 (Echtzeit) bis 200s/Frame + womit die Speed-Zahl statt (Echt-)Sekunden zu Frames jetzt multiplikator fuer + Echtzeit ist. ++ Start Delay fuer beschleunigte Darstellung (wenn sich nichts bewegt) einstellbar + ++ Log Import fuer ein Call wobei immer auf eine Zeitspanne gesucht wird in der das + Call aktiv war (keine wildcards) + + +25. 7. 2013 + ++ "On Next Click" mit mehreren Optionen gleichzeitig (wo es Sinn macht). + + +9. 8. 2013 + ++ Durch erweitern der Menue-Darstellung auf Tabellen mit Farben und verbessern des + Zeilen-Editors (Maus kann Cursor setzen ...) ist Messages erstellen und verwalten + moeglich geworden. Empfangene Messages sind noch ohne Tabelle. + + +2. 9. 2013 + ++ Nach komplettem Umbau des Konfigurations-Tools mit dynamischer Anzahl der + Eintraege geht nun Messages senden, mehrere Aprs-Server-urls die abgeklappert + werden bis einer antwortet, beliebig viele Watchcalls, Filtereintraege, Baken... + Der Texteditor kann Insert/Overtype und Cursor setzen mit der Maus. + Mit Shift-Linksklick auf die Karte wird die Position in die Editorzeile + kopiert (jetzt einfach wiederholbar bis man "getroffen" hat) + (Die eigene Position und die Zoom>"Views" muessen neu eingegeben werden) + ++ Die aktuelle Fenstergroesse wird im Konfigfile mit gespeichert. + "View 1" wird beim Programmstart dargestellt. + (speichern der aktuellen Ansicht mit Shift-Linksklick im Zoom-Menue) + ++ Nach der Frage "was brauch ich alles um online zu gehn" ist dies nun in + einem Menue. Dabei kann man abgestuft von ganz ohne Call bis Call und eigene + Position nur dem Server sagen (zwecks funktionieren der m/... Filter) bis + Bake und Messages ins Netz senden konfigurieren. + ++ Igate-Funktion ist nur in der Linux Version vorhanden da das Win-tcp-System + keine Info ueber bestaetigte Daten hat und dann einen als "haengend" erkannten + Link nicht terminieren kann, ohne die veralteten Daten noch rauszuweinen. + Das waere im aktuellen AprsIs-Netz ohne Timestamps nicht mehr akzeptabel. + Auch die Linux Igate-Funktion sollte auf keinen Fall fuer einen Digi verwendet + werden da zB. beim Logfiles durchsuchen die Durchlaufzeit erheblich werden kann. + Fuer Igate gibts ohnhin ein eigenes Tool. + ++ UDP-Ports fuer Funk rx/tx mit Soundmodem oder mittels "udpflex" (USB)seriellen + TNC gibts derzeit 4. Eine dynamische Anzahl braucht noch Aufwand bei den + Schaltknöpfen in den Menues. + + Der Funk-Baken/Objekt/Items-Editor ist noch in Entwicklung, dort dann auch + wieder die verschwundene "Rfbeacomtime" fuer jede Bake extra. + (bis da hin 1 Bake manuell ins aprsmap.cfg) + + + + +4. 9. 2013 + ++ Baken senden mit Macros fuer Uhrzeit und File einfuegen (Wetterbake). Jede Bake + mit Port und Intervall Angabe und Zielport geht auch Net. Mit Beacons Shift Time + wird die Startzeit jeder weiteren Bake so verschoben, dass sie nicht innerhalb der + "dupe delete" zeit (meinst 57s) der Igates landen. + Syntax: intervall(s):port:rawformat 600:1:NOCALL>CQ:>test + \\z tag+zeit, \\h zeit, \\:filename:, \\\ \\ + + +8. 9. 2013 + ++ Maus Hint Texte verbessert und deren Erscheinen an der Status Bar. ++ User Infos erweitert, gefahrene km, Zaehler fuer Baken, Messages, Acks, Rejects + + + +9. 9. 2013 + ++ "Show Objects of Sender" zeigt alle (anderen) Objekte und Items von dem Absender + des Ausgewaehlten Objekts auf einer dafuer gezoomten Karte unter "Info>Objects of.." + ++ Shift-Click auf die Status-Bar (die bunten Laempchen) oeffnet direkt das zugehoerige + Config-Menue soweit Sinnvoll. + + +11. 9. 2013 + ++ Menue Positionierung korrigiert und Menues nimmer schliessen bei Shift-Click + auf Map zum Position in Editor Zeile kopieren + + +13. 9. 2013 + ++ Statusbar Netzwerk-Buttons Mouse-Over wenn nicht online normale Hints, + wenn online, Status Info. X/N zeigt offline/online (sollten mal Symbole werden) ++ "w" Temperatur-Karte wie bisher, "W" (w mit Shift) Regen-Karte mit blau fuer + 24h und rot fuer aktuellen Regen (noch ohne Fehlerfilter, luegende Stationen + anklicken und mit DEL entsorgen). + + +16. 9. 2013 + ++ Logfile lesen mitn Binaersuche fuer den Anfang ab wo ins RAM eingelesen wird + mit dem Vorteil, dass auch lange Logs beim Programmstart und Log Import schnell + nach Datum durchsucht sind, aber das Logfile muss nach Datum sortiert sein. + Derzeit max 4GB Logfile. + + +19. 9. 2013 + ++ Message (Query) Kommandowoerter + Antworten in Config > Rf-Ports. + Standard Querys (?APRSP) als auch beliebige Woerter koennen definiert + werden und in der Antwort Macros wie \\h Uhrzeit, \\p Path, \\l Position, + \\v Programm Version, \\ File senden, \\>filename> schreiben, + letzteres zum aktivieren von einem Programm zum was Steuern oder Sprachausgabe + "TALK:\\>/tmp/talk.txt>Text um \\h Gesprochen!" + "?HELP:?APRSP, ?VER, TALK" + + +22. 9. 2013 + ++ Windfahne und Temperatur beim Symbol mit Timeout. ++ 1 Kommastelle mehr bei Koordinaten-Ausgabe und bei Maus-Koordinaten + Grad/Minuten/Sekunden-Schreibweise zuaetzlich. ++ Win32: bei der (oder mehr) Start-Fenstergroesse die der Bildschirm kann, + "Maximized" Fenster. + + + +7. 10. 2013 + ++ Filesystem auf "Longfiles" umgestellt damit sollte Logfile >2GB geschrieben + und dank Binaersuche auch flott importiert werden koennen. + ++ Programm Starter fuer Maps-Downloader bei Bedarf (gm.sh bzw gm.bat) + der kann sich nach getaner Arbeit beenden. Status in der Status-Bar + mit "D" statt "E" fuer Downloader laeuft erkennbar. + ++ Beliebige Map-Typen configurierbar mit korrektur der Basis-Helligkeit, + die ersten 3 wie gewohnt mit Shortcut "7" "8" "9", die 1. beim Start aktiv. + Sat-Maps erst wenn ein JPEG-Dekoder vorhanden ist (ausser man wandelt + sie beim Download in PNG). Neu (voreingestellt): cyclemap + + +11. 10. 2013 + ++ Wegstrecken Summe (ohne Track) auf der Map (shift-click, click, click...) ++ Log Import (bis auf Suche rueckwaerts nach Call) bei unsortiertem File + versucht etwas zu verbessern + + + +13. 10. 2013 + ++ Schriftgroesse einstellbar (Config > Map Paramter > Font Size) + + +15. 10. 2013 + ++ Screenshot auch als ".png" (vorerst nur Linux Version) + und osm-Verzeichnispfad wieder configurierbar ++ "On next click to Track" bei mehrfacher Auswahl mit "Zoom to" wird erst gezoomt + und dann im 1 Track Mode die anderen Funktionen aktiv. + + + +31. 10. 2013 + ++ Beep-Sounds mit beliebiger Frequenz und Dauer wenn Message oder Ack eintrifft, + wenn sich wer in den Warnradius bewegt mit steigender Frequenz und/oder Dauer + je naeher er zum Zentrum kommt und wenn ein Call aus der Watch Liste aktiv wird. + Alle getrennt schaltbar und limitiert auf maximal alle 5s. + Windoof 7 oder 8 geschaedigte koennten evtl. keinen Piepser haben dann gibts als + Ersatz 3 System-Sounds (mit 0ms einschalten, bis 500, bis 1000, ab 1000Hz + jeweils ein anderer Gong). + Config > Map Moving > Bell/Sound + + +6. 11. 2013 + ++ In Animation und gedimmten nicht-movern wird die schrift der "mover" im + nun Vordergrund gehalten + ++ Einfaches Hyperlink Hilfetext System mit File "help.txt" unter "Help" + erreichbar mit ein bisschen Text als Beispiel + + + +18. 11. 2013 + ++ Einstellbarer Timer zum Verzoegern vom Mapdownload Start waehrend Karte + verschieben, wer so vermeiden will, dass in hohem Zoom der Streifen an Karten + entlang der Bewegung durch die Botanik geladen wird. Config / Timers + ++ Index Taste im Help Fenster + ++ Schutz vor ewig loopenden Mapdownloads wenn durch zB volle Platte oder nicht + identischem Schreib/Lese-Pfad immer die gleichen Karten angefordert werden. + Kommt ein Kartenteil immer wieder, wird nach ein paar Versuchen 1. nur mehr + 1 Karte angefordert, 2. die Pause zwischen Anforderungen immer Verdoppelt + und 3. poppt eine Fehlermeldung auf. + ++ Copy/Paste hinein ins Program (rechte Maustaste im Textfeld oder ctrl-v) + (bei linux jetzt mit dem aktuellen "keiner verstehts..." selection-Verfahren) + + + +22. 11. 2013 + ++ "Ok" im config-Zeileneditor schliesst das Fenster nach dem Speichern. ++ Map download Timing (im Fehlerfall) optimiert, dass mit dem in entwicklung + befindlichen hochgeschwindigkeits-Downloader von oe5krn bei falscher + Einstellung oder voller Platte keine "Gigabyte" ins Nirvana geladen werden. + + + +28. 11. 2013 + ++ "B" und "M" (gross) fuer Bakeneditor und Message senden + ++ Index bei Helptext + ++ Umfangreicher Baken/Objekt/Item Editor mit verschiebbarem Fenster, + Import von vorhandenen Objekten auf der Karte durch anklicken. + + Testen lokal vorm Senden. + + Einmal senden oder mit Timer und Verschiebung der Sendezeiten, dass die + Duplikatloeschung in den Igates Sendungen mit gleichen Inhalt aber + verschiedener Frequenz (oder direkt per tcp) im Netz sichtbar laesst. + + Einfaches Fernloeschen von Items und Objects. + + Normal/Mic-E/Compressed mit DAO Erweiterung fuer 20cm Genauigkeit + (die aber je nach Fliesskommaarithmetik nur etwa 1m schafft) + mit Bytezaehler der Gesamtlaenge beim editieren der Kommentarzeile zum + optimieren der Kompressionsart. + + Macros zum Einfuegen von Files zB fuer Wetterbake + ++ Query standard Antworten (?APRST ...) vorkonfiguriert mit opt-out wers + nicht will. Config > Rf Ports > Query Keywords + ++ Fehler behoben, Decodieren von Items mit kurzem Label. + + Unsichtbare User wegen keinem oder falschem Symbol (die aber trotzdem + watch/approxy-piepsen) haben nun Label und Track + ++ Listings im "Show 1 Modus" zeigen nun nur was zu dem User gehoert + + + +4. 12. 2013 + ++ Config > Rf-Ports > Monitor Headline + Damit kann man 0 bis 20 Calls + Tempertur oder km/h als "Ticker" + von aktuellen Frames auf der Fenster-Ueberschrift durchlaufen lassen. + Bei minimiertem Fenster ist das aktuellste Call in der Taskleiste. + N> kommt von, N< get ans Netz, 1> 2> Funkports, N- heisst der Frame + ist entweder in den Callfiltern oder ohne verwertbarem Inhalt. + ++ (grosses) "F" Shortcut Find (Call, Locator, Breite/Laenge) + ++ Bakeneditor "Draw" schreibt nimmer ins rawlog + + + + +10. 12. 2013 + ++ Calls + Temp,km/h,Hoehe der ankommenden und abgehenden Daten in der + Fenster-Kopfzeile. Anzahl der Calls Config>Rf-Ports>Monitor Headline. + Updaterate auf (Mittelwert) 1s limitiert. + ++ Maus-Verhalten umgestellt (aehnlich anderen Programmen). + Linksklick wartet auf Maus-Bewegung (mit ein bisschen Zitter Toleranz) + und zieht Karte (auch wenn ein Symbol getroffen) oder, am oberen Rand + angefasst, konnen einige Menues und die Status-Bar positioniert werden + mit "ankleben" an den Fensterrand und gespeichert in aprsmap.cfg. + Beim auslassen der Maustaste, wenn nicht bewegt, wird der normale Klick + ausgeloest. + + Mittlere Maustaste zieht alles was ziehbar ist und an beliebiger Stelle + angefasst. + + Rechte Maustaste wie bisher Back-in-zoom-History oder in einer + Texteingabe "Paste" (falls was im copy/paste Puffer ist) + + + +15. 12. 2013 + ++ Message Senden nun bis 67 Zeichen wie im Protokoll vorgesehen statt 57. ++ Umlautwandler auf "Ae Oe Ue ss" (bis mal ein 8 Bit Zeichensatz definiert ist). ++ Message Eingabezeile geleert wenn die vorherige Message abgeschickt wurde oder + an ein anderes Call als zuvor gesendet werden soll. + ++ Schnelles Zoomen mit Shift-Linksklick und Rahmen um den gewuenschten Inhalt + aufziehen. + ++ (nur Linux) jpeg-Dekoder fuer Maps wobei erst .png versucht wird dann + jpeg in .png Filenamen und zuletzt jpeg als .jpg (gm.sh modifizieren). + + + + +16. 1. 2014 + ++ Config / Online / Serverfilter Aenderungen werden bei "Ok" sofort zum + Server geschickt. (sofern der die "# filter ..." Syntax versteht) + ++ mit "<" ">" durch einen Track wandern geht mit gleichzeitig geoeffneter + Altitude- und Speed-Statistik und zeigt dort die Stelle am Track und die + Messwerte numerisch. + ++ Tools / List neu mit verschieb- maximier-, ikonisierbarem Textfenster + mit Scrollbalken (und Cursortasten und Mausrad) und nach Zeit und + alfabetisch sortierbarem Inhalt. + Es kann Rohdaten und dekodiert listen. Text kann man markieren und mit + "Paste" in andere Anwendungen kopieren (auch auf Win ohne umstaendlichen + Dialog). Gibt man in Tools / Find ("F"-Taste) ein Wort ein, werden alle + gleichnamigen Stellen farblich hervorgehoben zB. "APLM01" oder ein Call. + + Klickt man auf eine Zeile, wird auf der Landkarte die Herkunft gezeigt, + sofern die Zeile eine Position enthaelt und wenn nicht, die letzte + bekannte Position vom Absender der Zeile. + + Das Live-Monitor-Fenster fuer empfangene und gesendete Daten hat anstatt + sortieren "Clr" fuer Inhalt loeschen, es stoppt raufscrollen wenn man + mindesten 1 Zeile herunter geschoben hat, und kann mit "u"-Taste an und aus + geschaltet werden. (Beachten: bei Batteriebetrieb durch den laufenden + Bild-Update evtl mehr CPU/Akkuverbrauch) + Das Aktivieren des Monitors ist, bis eine selbsterklaerende Menue-Struktur + erfunden ist, noch wie zuvor unter Config / Rf-Ports / Monitor Frames. + ++ Linux: F11-Taste (bei "seltsamen" Fenstermachern die selber kein Maximieren + oder dann wieder kleiner machen koennen) toggelt Fullscreen/Normal. + ++ Win: Kein extra Textfenster mehr da Listings eingebaut. + + + +20. 1. 2014 (Ver 0.32) + ++ Funkport (Soundmodem / udpflex) Kommandozeile in Config / Rf Ports / + Serial Interface + Task wird automatisch gestartet. + ++ Monitor Ports off/raw/decoded einzeln mit Klick schaltbar Tools/List/Monitor. + + +3. 2. 2014 (Ver 0.32) + ++ Message Rx: Schalter fuer Pop-up Fenster + Schalter fuer zeigen von Messages an andere SSID + Schalter fuer Messages an sich selber weg filtern (default on) + + + +6. 6. 2014 (Ver 0.34-testversion) + ++ Hoehendaten (soweit in einem Datenfile vorhanden) + bei "show Location of Mouse" "on" werden m ueber NN angezeigt + ebenfalls neu, Distanz und Winkel zum Marker 1 wird angezeigt + + Files zum selber besorgen: + + osm/srtm3/N48E012.hgt + N48E013.hgt + ... + + (90m aufloesung, 1x1 grad 2.8MByte pro File + http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/Eurasia/) + + osm/srtm30/W020N90.DEM + (900m aufloesung, 20W..20E, 40 bis 90N 57Byte, deckt den Rest ab + http://dds.cr.usgs.gov/srtm/version2_1/SRTM30/) + + osm/eudem/ (noch nicht implementiert) + 30m Aufloesung, 640MByte fuer 5x5 grad, braucht aber erst konvertierprogramm + vom (unbrauchbaren) "eu-geotiff" in lesbares Format + http://www.eea.europa.eu/data-and-maps/data/eu-dem#eeaEsriMap + ++ Radiolink Berechnung zwischen Marker 1 und 2 nach Eingabe von Antennenhoehen + und Wellenlaenge. Vorerst mal Darstellung auf der Map als farbige Fresnelzone + "blau" frei, "gelb" bis "rot" von angekratzter 1. Fresnelzone bis voll verdeckt. + ++ Radiolink mit 2 Klicks oder fuer tastaturlose Bedienung + "On next click to Map" mit "Set Marker 1" beim 1. Klick und Marker 2 bei weiteren + Klicks nach "Clear Markers" wird wieder erst Marker 1 gesetzt. + ++ "d" Shortcut fuer Map downlod on/off + ++ Map download auch wenn auf "off" wenn "Reload" oder die Download funktion + betaetigt wird. + ++ Testweise "High Resolution Track" Dekodierung als Protokollerweiterung eingebaut. + Dabei werden mit einer Bake 2 bis 30 Positionen gepackt als Abweichung von einer + Geraden 2 oder 3 dimensional + Timestamp uebertragen. Wird die Erweiterung nicht + erkannt bleibt die normale Position pro Bake. + Die Optionen sind erweiterbar, Positionsaufloesung, End-zu-End Pruefsumme, + "QRV"-Frequenz, direktgehoert von Igate, Climb-Rate und fuer Wanderer hoehere + Geschwindigkeitsaufloesung sind mal vorgesehen. Traegt sich der direkthoerende + Igate ein, wird vom AprsIs-Service eine veraenderte Kommentarzeile erkannt und + damit ALLE Igates ersichtlich, die direkt gehoert haben und nicht nur der mit + der schnellsten Glasfaser Anbindung. Dekodiert wird dabei eine in vom Empfangsmodem + in Klartext umgesetzte Darstellung fuer AprsIs. Am Funkweg wird binaer und wesentlich + kleiner gepackt uebertragen. + + + + +13. 6. 2014 (Ver 0.35-testversion) + ++ osm/srtm1/N48E012.hgt + mit 30m horizontaler Aufloesung aus den EU-DEM Daten umformatiert in das srtm1-Format + wird bevorzugt verwendet. + ++ UDP-Ports restarten sich wenn beim Editieren was veraendert wurde. ++ Map Loader startet beim enabeln ohne nochmal herumzoomen. ++ Speed/Altitude/Gelaendeschnitt-Diagramm updatet sich mit ankommenden Daten wenn + mit letztem Wegpunkt oder Symbol anklicken geoeffnet. + ++ Igate (Rf to Net, nur Linux) jeder UDP Port kann einzeln freigeschaltet werden + ++ Gelaendeschnitt, Darstellungs-Versuch mit zusaetzlichem Freiraum-Diagramm auf der + Landkarte. Praktisch zum Zoomen aber evtl. missverstaendlich da nur die Fresnel-Zone + zur Karte passt und folglich die Punktreihe, die die Bodenhoehe darstellen soll, nicht. + + +17. 6. 2014 (Ver 0.35-testversion) + ++ Sichtweiten Farbkarte, mit Marker 1 oder 2 oder beiden gesetzt, wird mit "R"-Taste + die optische Sichtweite dargestellt. Antennenhoehen am Marker ist 1. Wert in + "Tools/Radiolink" am andern Ende gilt Wert 2. Die Wellenlaenge wird hier auf 0 gesetzt + und damit ist ab halber Fresnelzone "Sicht". Farbhelligkeit in + "Config/Map Parameter/Brightness Rfpath" + Die Berechnung ist noch experimentell und sollte nach optimierung deutlich schneller + werden und damit man die Landkarte noch lesen kann brauchts noch Darstellungs-ideen. + + + +28. 6. 2014 (Ver 0.37-testversion) + ++ Marker setzen mit Einrasten auf die genaue Position eines angeklicktes Objekts + (More Infos> ) und ohne Einrasten im Zoom Menue. Dort auch Marker einzeln Loeschbar. + Marker 1 als "hart (gelb)" oder "weich (blau)", letzerer entsteht durch einfaches + Anklicken, bewegt sich mit fahrenden Objekten bzw. huepft auf neu angeklickte Objekte + oder Wegpunke und hat ein Timeout. Harter Marker bleibt bis loeschen. + ++ Netz/Funkport Status-Laempchen zeigen nun letzte Sendung (gelb) und letzten Empfang + (gruen) seit 60s als Sanduhr. + ++ Mausrad (oder Zoom-Menue +/- mit Shift) Zoom Stufen (Config/Map Moveing/Fine Zoom Steps) + rastern nun die automatischen Zoomvorgaenge auf die eingestellten Werte insbesondere + auf "1" also original Osm-Stufen. + ++ Ausgeschaltete Tracks (Helligkeit auf 0) machen nun auch Funkwege und Zoom auf das + was man noch sieht. + + + + + + + + + + +1. 7. 2014 (Ver 0.38-testversion) + ++ Watchliste neu mit Schalter fuer Pieps / Landkarte mitbewegen / Logfile + zB. mit OE* getrennte Logfiles fuer jedes Call mit OE vorn schreiben. + ++ Shift-Click auf Rf-Port-Knopf geht direkt in Config-Editor. + ++ Portname nach dem Port-URL zeigt in "i"-Liste und beim "Hovern" auf den aktiven + Portknopf Namen und ip Nummer. + ++ On Next Click to Track mit "Zoom to" schaltet erst in den 1 User Modus + und tut dann (nun hoffentlich) die anderen aktivierten Dinge. + + + + +3. 7. 2014 (Ver 0.38-testversion) + ++ Baken sollten sichn nun auch mit den "\\" Macros wieder in den Editor laden + lassen ohne dass diese expandiert werden. (Vorhandene Objekt-Baken neu eingeben) + ++ Message Routing verbessert mit automatischer "NOGATE"-Option wenn nur Funkports + verwendet werden + ++ Message und Baken Sende-Meldung und Rueckfrage wenn man (meist versehentlich) + Leerzeilen Msg senden will. + + + +4. 7. 2014 (Ver 0.38-testversion) + ++ Logfile loeschen bzw. Filegroesse anzeigen ++ Etwas mehr "On Next Click"-Optionen kombinierbar + + + +8. 7. 2014 (Ver 0.39-testversion) + ++ WX grafik zeigen auch wenn WX Baken ohne WX Daten dabei sind ++ Schalter fuer nur WX-Stationen auf der Karte zeigen + + + +17. 7. 2014 (Ver 0.40-testversion) + ++ Nur WX Stationen auf der Karte Zeigen + ++ Relief Karten rechnen mit Fortschrittsanzeige und nach 4s Abfrage + auf Abbruch (mit srtm(1) Files (netzwerk-laufwerk zu langsam) und noch ohne + Antialiasing was ab zoom 12 sichtbar wird) + map parameter/brightness rfpath zB. "30 100 50 100 80 20 0 100 100" + (der 3. Wert 0 fuer harten Kontrast/Funkreichweite oder 500 fuer aufpeppen + von osm-Karten) + tools/radiolink "2000 0 0 200" marker 1 und evtl marker 2 setzen und "R" + "config/brightness map" zum ein/ausblenden der osm karte) + ++ Digipeater (abgespeckte udpbox derzeit noch ohne klicker-Editor und nur grob getestet) + Config/Rf-Ports/Digipeater, derweil Internes Format mit Zeileneditor bearbeiten. + ++ Message Sendetaetigkeit-popup-Meldungen verfeinert und korrigiert + + +18. 7. 2014 (Ver 0.40-testversion) + ++ der Logfile-Pfad fuer das rawlog wird auch fuer die Watchcall-Logs verwendet + + +19. 7. 2014 (Ver 0.40-testversion) + ++ Watchcall-Liste nach "longest-match" durchsuchen. + "OE0AAA" passt bei * OE* OE0* OE0B* auf OE0* + OE* +log / OE1X +log / OE1* nichts / OE5A +beep + schreibt log von oe ausser oe1 und oe5a aber schon oe1x und peept bei OE5A + ++ Call-Log Filegroesse anzeigen und Files loeschen + + + + +20. 7. 2014 (Ver 0.40-testversion) + ++ Cursor Up/Down Tasten in mehrzeiligen Textmenues ++ Tasten Fokus Lock auf Eingabefeld nach Anklicken oder Tastatureingabe ++ 1. Klick auf eine Zeile veraendert nicht die Kursorposition + + +25. 7. 2014 (Ver 0.41-testversion) + ++ Digipeater, mit fein dosierbaren Standard (mach QRG voll) bis "sehr beruhigt" Optionen ++ Editor dazu Config / Rf-Ports / Digipeater und "Hints" + + + + +28. 7. 2014 (Ver 0.41-testversion) + ++ Farbe fuer Schrift, Menues, Hintergrund, Transparenz, Radiorange, Reliefkarte + mit Farbauswaehler (der noch 3eckig werden soll damit umgekehrt auch eingestellte + Farbe drauf gezeigt werden kann) + + +31. 7. 2014 (Ver 0.42-testversion) + ++ Statusknopf zeigt durchgehend wenn Wx/Temp./Regen/Radiorange oder single User Modus ist + und kann da ausgeschaltet werden. + + + +24. 8. 2014 (Ver 0.42) + ++ "F"ind auf einen sonst unsichtbaren Objekt-Sender zeigt dessen Objekte. + ++ "More Infos" zeigt Button "Objects of Call" wenn Call Objekte sendet. + ++ Wx-only mit "L"abels off zeigt nur Temperatur und Windfahne beim Symbol. + ++ Antennenwinkel bei Gelaendeschnitt Info. + ++ "DUPE" Meldung bei Wegpunkt-Info nimmer "ewig" bei einer Fixposition nach einem + Ausreisser. + + + + +26. 8. 2014 (Ver 0.42) + ++ ip-Nummer schreiberei vereinfacht, "127.0.0.1" kann weggelassen werden + ++ udpflex erweitert auf "net-kiss", also kiss via tcp, damits mit dem + dire-wolf-Soundmodem kann "udpflex.exe -U :9002:9001 -T :" + (http://home.comcast.net/~wb2osz/site/ + geht mit default Einstellung, Sampelrate sollte man aber halbieren + sonst ziehts 750MHz CPU) + + + + +15. 10. 2014 (Ver 0.43) + ++ Input Filtern auf Stichwort im ganzen Frame + ++ kleines "e" oder "d" im Map-expansion-Laempchen zeigt automatischer Map Download + off (toggle mit "d"), Manueller Map Reload/Download geht aber auch in dem Modus. + ++ Im "F"ind Feld geht auch dezimal Grad "48.2 13.31". + ++ bei den Config Zeilen geht "Enter-Taste" als Ok oder Add. + ++ Textfarbe vom Items/Objects mit Farbauswaehler unabhaegnig von normalen Baken + einstellbar. + ++ Fontgroesse Eingabe zeigt sofort Ergebnis. + ++ ist ein Objekt im "show 1" modus, kann man mit "Focus" Karte mitziehn + einschalten ohne Watchlisten Eintrag. + ++ TAB-Taste schaltet zwischen 2 Kontexten hin und her, dazu zaehlt nebst + Wetterkarten-Modi auch der "Focus" Modus, womit 2 Objekte im Bild gehalten + werden koennen. + ++ Baken/Message/Ack Senden Warnmeldungen verbessert, wenn der eingestellte + Sendepfad vermutlich nicht zum Erfolg fuehrt. (Port ausgeschaltet, nicht + zum Senden konfiguriert, kein Passcode am Internet ....) + ++ Gelaendeschnitt, Reichweiten-, Relief-Karten Parameter in ausfuehrlicherem + Menue zusammengefasst. + ++ Gelaendeschnitt zeigt freie Meter zum Boden (Karte ziehen zum Messmarke bewegen) + ++ Trackfilter beim Suchen auf Duplikate mit Indexsystem so verschnellert, dass + beim aus dem Speicher Entfernen von Wegpunkten, auch deren Folgefehler mit + Entfernt werden koennen. + + + + + +11. 11. 2014 (Ver 0.45) + ++ Geleandeschnitt und Reliefkarten mit einstellbarem Hoehendaten Cache + damit Plattenzugriff auf etwa 0.5% verringert. ++ Schalter "kleine/mittlere/volle Aufloesung" entsprechend langsam bis schnell. ++ Interpolation der Hoehendaten und damit brauchbare Bilder bis Zoom 14 + ++ im "Find" Feld geht Call / Sender of Object / Locator / DDMM.MM / D.DDDD ++ Marker 1 setzen Sendet DDMM.MM zum c/p Buffer, Marker 2 D.DDDDD Format. + + + + + +9. 12. 2014 (Ver 0.46) + ++ Watchcall Popup-Fenster anklickbar und zentriert Map auf das Objekt + ++ Point-Of-Interest-File (osm/poi.txt) mit Name/Position/(optional) Hoehe + (als Beispiel ist ein File mit etwa 20000 mehr oder weniger richtigen + Alpengipfeln vorhanden) + ++ mit "F" oder Tools->Find kann mit Wildcards (ste?n*) auf die Namen gesucht + werden und die Karte zentriert auf die Position und setzt Marker 1. + Bei mehreren passenden Namen mit Enter oder Klick auf Find werden alle + Positionen durchgesteppt. + ++ ist "p" oder Config->Map Parameter->Show Loc of Mouse auf ON, geht beim + Bewegen der Maus eine Sprechblase mit Zeiger zum naechstgelegenen Poi auf. + mit "c" kann die Karte drauf zentriert werden. + + + + + + + +30. 12. 2014 (Ver 0.46) + ++ Marker 1 und 2 setzen ("x" "y") geht ohne vorher auf die Karte klicken + gleiches bei Zentrieren "c" mit dem Unterschied wenn ein POI maximal + 5 Pixel entfernt angezeigt wird, exakt auf diesen zentriert wird. + + + + +26. 1. 2015 (Ver 0.47) + ++ nebst "poi.txt" wird noch "mypoi.txt" gelesen damit beim Update bei Bedarf + die selber angelegten Punkte erhalten bleiben. + nun auch viele SOTA-Standorte im poi.txt + ++ Log File (rawlog) durch Anhaengen von %d zB. "logs/rawlog%d" auf tageweise + 1 File mit Datum umstellbar. Ist auch kompatibel zu den Logs am www-Server. + (Log Filename jetzt im "File" Menue) + ++ Bei tageweisem Log einstellbar nach wieviel Tagen automatisch (beim Start + oder Mitternacht) Logs geloescht werden sollen. + ++ im Log suchen nach Datum und/oder Call sollte auch dank "Load" (fuer ab + eingegebenen Datum) deutlich zuverlaessiger gehen. + ++ mehrfach eingetroffene selbe Message wird nur 1x Angezeigt. + ++ Baken (Netzbake, Objekte) koennen Position aus File (auch in Grad mit Komma) + lesen fuer bewegliche Objekte oder Mobilbetrieb. + ++ Baken koennen Text-Macro-File loeschen nach 1 mal Senden zum Zweck des + automatischen verstummens der Bake wenn zB das Wetterhaeuschen nimmer Updatet. + + + + +2. 3. 2015 (Ver 0.48) + ++ Nur Stationen mit einem bestimmten Symbol aufs Bild, Symbol-Wahl in + Tools / Select Data / Symbol>. On/Off mit "Symbol" oder "s"-Taste. + Achtung: Screenshot Taste ist jetzt "S". + ++ Overlay Symbole mit Mausklick eingebbar + + + + +6. 3. 2015 (Ver 0.48) + ++ Zoom-Lupe aufziehen mit rechter Maustaste halten. Ohne Maus bewegen wie bisher + Backspace in der Zoom/Pan History oder (Copy/)Paste in Texteingaben. + + +15.3. 2015 (Ver 0.49) + ++ Hover Info Popup (Tools/On Next Click/Hover) auf den Symbolen und Glaendeschnitt + zu Marker 1 wenn Tools/Radiolink enabled. + +24.3. 2015 (Ver 0.49) + ++ Linkstreckenberechnung mit einstellbarer Beugung (refraktion) der Hf in der Atmosphaere. + + + +15.6. 2015 (Ver 0.49) + ++ "H" fuer Hoehendaten Farbdarstellung. ++ Cache auch fuer nicht vorhandensein von Hoehendaten damits schneller mit Loechern im + Datenmaterial zurecht kommt. ++ poi.txt ohne Neustart einlesen mit "Reload Config". ++ Wx Radioaktivitaet dekodieren und (vorerst) als Text ausgeben. + + + +21.6. 2015 (Ver 0.50) + + ++ Maidenhead Locator Ausgabe langes Format, Eingabe "Find" 6 8 oder 10 stellig. ++ Treiber Aufruf fuer Soundmodems und (USB-)serielle kiss/smack TNC/Funkgeraete + betriebssystemspezifisch voreingestellt (sofern noch kein aprsmap.cfg vorhanden ist). ++ Popup Fenster Ueberlappungen etwas seltener. ++ Radioaktivitaet (Sievert) Dekodierung in den Wx-Baken (vorerst ohne Grafik) ++ Getrennte Backspace/Rechte-Maus History fuer beide TABs + + +27.6. 2015 (Ver 0.50) + ++ etwas verbesserte popup Fenster Platzierung. ++ Config > Map Parameter > Reset to Default oder kurz "D" stellt die meisten + Bildparameter und Klickverhalten auf Default. Die alten Werte gehen zuvor in die + Backspace/rechte Maus-History zwecks Undo der Funktion. ++ History/TAB speichert die wichtigsten Bildparameter + Kartentyp. + + + + +6. 7. 2015 (Ver 0.52) + ++ Parameter Reset "ctrl-L" statt "D" + ++ dekodieren und darstellen vom Area-Objects, Kreis, Ellypse, Rechteck, Dreieck, Linie + (ohne Corridor) gefuellt oder leer in 8 Farben nach APRS101.pdf. + ++ Baken Editor erstmal fuer numerische Eingabe der Area Objects. + ++ dekodieren und darstellen von Multiline-Objects mit 3 Linientypen und 4 Farben nach AE5PL + 1-23 Linien pro Bake geschlossen oder offen. + ++ Anklicken aller Linien und Flaechen am Rand und Verhalten wie normale Objekte aber ohne + Track bei Bewegung. + + +8. 7. 2015 (Ver 0.52) + ++ Multiline-Objekt Editor + + +25. 8. 2015 (Ver 0.54) + ++ Mic-e-Telemetrie Dekoder, die Herstellercodes aus den Mic-e Frames werden dazu vorher + entfernt (soweits geht) was auch sauberere Kommentarzeilen ergibt. + + + +16.10. 2015 (Ver 0.56) + ++ Wetterbake (Netbeacon, Rf Beacon, Query) aus .csv File + \\!wx.csv,,,t,,,,,h,b,r,w,d,,,,,g! im comment extrahiert die Werte aus der letzten Zeile + im File wx.csv. Es kann noch ein Multiplikator angegeben werden zb. ,w3.6, statt ,w, zum + Umrechnen von m/s auf km/h. Werte siehe Hints. Wx Symbol auswaehlen. + ++ Messages/Queries bei 9-stelligem Mycall sollten nun bestaetigt/beantwortet werden. + + + +24.11. 2015 (Ver 0.58) + ++ Wx Grafiken korrigiert + ++ Schaltknopf/Laempchen fuer Objekte Ein/Aus + ++ Gate Net-to-Rf mit Radius und Bit/s Limit und Option nur Message zu (gehoerten) Usern + (mit Standard-3rd-party Protokoll und ohne speichern/wiederholen von Messages). + Einschalten mit Config/Rf-Ports/Digipeater, Rx auf "N", Bit/s in "N-n Words" siehe Hints. + + + +28.11. 2015 (Ver 0.58) + ++ Starten ohne "terminal" und Abstellen sollte ohne X11 abschmieren gehen. ++ UDP Ports an und abschalten auch mit laufendem "serial interface". + + + +29.11. 2015 (Ver 0.58) + ++ History bei der "Find" Zeile mit Cursor up/down. ++ Rf-Monitor mit Txdelay, Level und Quality, sofern vom Modem geliefert (afskmodem linux). ++ Fenster Kopfzeile "nur neue" Calls (Config/rf-ports/monitor headline 0) und Zeit seit + letztem mal gehoert(1). + + + +7. 1. 2016 (Ver 0.59) + ++ "Storm Data" Auswertung und Flaechen-Darstellung mit interpolierter Animation. + (mangels Aktueller Testdaten nach APRS101.pdf in nautischen Meilen 1.609km) ++ Area-, Multiline-, Sturm-Objekte mit "<>" durchsteppen mit zum Wegpunkt gehoerender + Flaechendarstellung. + + + +23.1.2016 (Ver 0.59) + ++ Item in Messages, (B)akeneditor (auf "Item") + (M)essage Send Fenster geoeffnet + kopiert den Bakeninhalt in Message Text und erzeugt dann beim Empfaenger der Msg + ein Symbol auf der Karte. (APRS1.2) + Da sich die Protokollerweiterung Item-Message und Multiline-Object gegenseitig + beissen ("{" symbol), geht die Kombination vermutlich nur mit aprsmap + send with ack. + + + +25.5.2016 (Ver 0.61) + ++ Objekte ohne Richtung und Geschwindigkeit zeichnen keinen Track mehr. ++ alle alternativ Symbole koennen Overlay Zeichen haben (a..z A..Z 0..9) ++ Hamnet Symbol in symbols.png + + +15.3.2017 (Ver 0.64) + ++ Trackfilter geht bei mehr als 15000 Wegpunkten nimmer gegen Rechenzeit unendlich. ++ Trackfilter wird auch mit den kleinen Zappeleien bei Verzoegerungen unter 1Min fertig. ++ "Find Item Message" zeigt auch bei mehreren solchen Msgs die dazu passende Position. + + + + +5.4.2017 (Ver 0.65) + ++ Rotes Fehlermeldung-Popupfenster groesser und umfangreicher bei der Baken Eingabe. ++ mit []-Tasten Zeit aendern wie lang Dinge auf der Karte sichtbar bleiben. + + + + + + + + + + + + + + + + + + +h264 in mpeg4 Container: +Linux: 1 mal machen: mknod map.y4m p + fuer jedes Video starten: x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m + +win: File / Make Video gibt unkomprimiertes Videofile map.y4m + (.y4m sollten mplayer oder vlc abspielen koennen) + klein packen mit x264.exe "x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m" + (crf=22..27 qualitaet gut bis sparsam) + vorher mit Animate und auf Map klicken passende Geschwindigkeit einstellen + + + +files/dirs: + aprsmap programm + aprsmap.cfg beispiel config, wenn nicht vorhanden werden default werte erzeugt + hints.txt tipps beim verweilen mit der maus auf buttons + help.txt Hyperlink-Hilfetext unter Help > Helptext + gm.sh shell script zum osm karten holen + (geht nun auch mit der busybox am tinycore) ./gm.sh + (darf/soll verbessert werden HI) + symbols.png icons + font.png buchstaben + gettiles vom aprsmap erzeugte liste fehlender map tiles + rawlog timestamp+aprsis format wenn vorhanden beim start eingelesen + bei connect zu aprs server kommts neue dazu + dargestellt werden die eingestellten minuten vom ende des logs + mit connect zu server eingestellte minuten von jetzt + file darf editiert, beschnitten, gefiltert werden + wird nach timestamp sortiert eingelesen + (langes file einlesen geht mit serverconnect schneller + da erst ab "jetzt-darstellzeit" decodiert wird) + osm/tiles/ karten im osm format + osm/tiles_sat/ + osm/tiles_topo/ + udpflex axudp<->kiss/smack/flexkiss interface fuer TNC, TMx7xx ... + kisson.txt kiss initialisierung fuer TMD72 mit udpflex + getosm.exe Win: Schneller Maplader von OE5KRN + poi.txt globales/privates + mypoi.txt Points-Of-Interest-File mit aktiviertem "p" zum zeigen bei + Mauszeigernaehe oder Suchen mit "F" + +oe5dxl diff --git a/aprsmap_common/README b/aprsmap_common/README new file mode 100644 index 0000000..86d2c14 --- /dev/null +++ b/aprsmap_common/README @@ -0,0 +1,12 @@ +Filename Place to be what it does ... +================================================================ +favicon.png where the executeable is icon for taskbar +font.png -----------""----------- font for all text within aprsmap +symbols.png -----------""----------- symbols within aprsmap +hints.txt -----------""----------- info about a button does hover +gm.sh -----------""----------- shell script for downloading osm-maps +poi.txt osm/ point of interest file +help.txt where the executeable is interactive help +NEW.txt whereever you want version-history of aprsmap + + diff --git a/aprsmap_common/favicon.png b/aprsmap_common/favicon.png new file mode 100644 index 0000000..d61d70d Binary files /dev/null and b/aprsmap_common/favicon.png differ diff --git a/aprsmap_common/font-bold.png b/aprsmap_common/font-bold.png new file mode 100644 index 0000000..86d7b12 Binary files /dev/null and b/aprsmap_common/font-bold.png differ diff --git a/aprsmap_common/font-italic.png b/aprsmap_common/font-italic.png new file mode 100644 index 0000000..9a9a3cd Binary files /dev/null and b/aprsmap_common/font-italic.png differ diff --git a/aprsmap_common/font-thin.png b/aprsmap_common/font-thin.png new file mode 100644 index 0000000..80eea9f Binary files /dev/null and b/aprsmap_common/font-thin.png differ diff --git a/aprsmap_common/font.png b/aprsmap_common/font.png new file mode 100644 index 0000000..556534d Binary files /dev/null and b/aprsmap_common/font.png differ diff --git a/aprsmap_common/gm.sh b/aprsmap_common/gm.sh new file mode 100755 index 0000000..2152b77 --- /dev/null +++ b/aprsmap_common/gm.sh @@ -0,0 +1,148 @@ +#!/bin/sh + +# file created by aprsmap of a list of tiles to fetch +ORIGFN="gettiles" + +# map directory path specified by aprsmap +#DIR="osm" +DIR=$2 + +# move the original file to a temporary file to prevent a race +# condition with aprsmap where aprsmap sometimes attempts to write +# to the original file before this script completes processing. +FN=`mktemp` +mv $ORIGFN $FN + +# 3 sec timeout, 3 sec wait between retries, 1 retry +WGETCMDBASE="wget -q -T 3 -w 3 -t 1 " + +OSMSERVERS="\ + http://a.tile.openstreetmap.org \ + http://b.tile.openstreetmap.org \ + http://c.tile.openstreetmap.org \ + http://osm.oe2xzr.ampr.at/osm/tiles \ + " + +OSMSERVERSTOPO="\ + http://a.tile.thunderforest.com/landscape \ + http://b.tile.thunderforest.com/landscape \ + http://c.tile.thunderforest.com/landscape \ + http://osm.oe2xzr.ampr.at/osm/tiles_topo \ + " + +OSMSERVERSCYCLE="\ + http://a.tile.opencyclemap.org/cycle \ + http://b.tile.opencyclemap.org/cycle \ + http://osm.oe2xzr.ampr.at/osm/tiles_cyclemap \ + " + +OSMSERVERSTRANSPORT="\ + http://a.tile.opencyclemap.org/transport \ + http://b.tile.opencyclemap.org/transport \ + " + +# note: mapquest sat and quest tile servers are no longer providing direct access +OSMSERVERSSAT="\ + http://osm.oe2xzr.ampr.at/osm/tiles_sat \ + http://otile1.mqcdn.com/tiles/1.0.0/sat \ + http://otile2.mqcdn.com/tiles/1.0.0/sat \ + http://otile3.mqcdn.com/tiles/1.0.0/sat \ + http://otile4.mqcdn.com/tiles/1.0.0/sat \ + " + +OSMSERVERSQUEST="\ + http://otile1.mqcdn.com/tiles/1.0.0/osm \ + http://otile2.mqcdn.com/tiles/1.0.0/osm \ + http://otile3.mqcdn.com/tiles/1.0.0/osm \ + http://otile4.mqcdn.com/tiles/1.0.0/osm \ + " + +#-------------------------------------------------------------------------------------------------- + +# if the tiles directory does not exist then create one +if ! [ -d $DIR ]; then + mkdir $DIR +fi + +# if tiles directory found +if [ -d $DIR ] ; then +# search zero-size files and destroy them +#echo -n "cleanup zero-files ... " +#find $DIR/tiles -size 0 -delete +#echo "done." +# while true; do + for i in 1 2 3 4 5 6 7 8 9 10; do + + if [ -r $FN ] ; then + while read mapa mapb mapc mapd ; do + if ! [ -d $DIR/$mapa ] ; then + mkdir $DIR/$mapa + fi + if ! [ -d $DIR/$mapa/$mapb ] ; then + mkdir $DIR/$mapa/$mapb + fi + if ! [ -d $DIR/$mapa/$mapb/$mapc ] ; then + mkdir $DIR/$mapa/$mapb/$mapc + fi + + if [ tiles = $mapa ]; then + SERVERS=$OSMSERVERS + EXTENT="png" + + elif [ tiles_topo = $mapa ]; then + SERVERS=$OSMSERVERSTOPO + EXTENT="png" + + elif [ tiles_cyclemap = $mapa ]; then + SERVERS=$OSMSERVERSCYCLE + EXTENT="png" + + elif [ tiles_transport = $mapa ]; then + SERVERS=$OSMSERVERSTRANSPORT + EXTENT="png" + +# note: mapquest sat and quest tile servers are no longer providing direct access + elif [ tiles_sat = $mapa ]; then + SERVERS=$OSMSERVERSSAT + EXTENT="jpg" + + elif [ tiles_quest = $mapa ]; then + SERVERS=$OSMSERVERSQUEST + EXTENT="png" + fi + + MAPFILE=$DIR/$mapa/$mapb/$mapc/$mapd.$EXTENT + echo "Loading tile: $MAPFILE ..." + for OSMSERVER in $SERVERS ; do + echo -n "-> from $OSMSERVER - " + $WGETCMDBASE -O $MAPFILE "$OSMSERVER/$mapb/$mapc/$mapd.png" + if [ -s $MAPFILE ] ; then + echo "done." + if [ jpg = $EXTENT ]; then + jpegtopnm $MAPFILE | pnmtopng > $DIR/$mapa/$mapb/$mapc/$mapd.png + rm -f $MAPFILE + fi + break + else +# rm $MAPFILE +# echo -n "Zero-length file, using alternative URL - " +# $WGETCMDBASE -O $MAPFILE "$OSMSERVER/$mapa/$mapb/$mapc/$mapd.png" +# if [ -s $MAPFILE ] ; then +# echo "done." +# break +# else + rm $MAPFILE + echo "Zero-length file, trying next mirror." +# fi + fi + done + done < $FN + rm -f $FN + fi + done +else + echo Directory $DIR not found. + exit 1 +fi + +exit 0 diff --git a/aprsmap_common/help.txt b/aprsmap_common/help.txt new file mode 100644 index 0000000..4adf428 --- /dev/null +++ b/aprsmap_common/help.txt @@ -0,0 +1,1097 @@ +Aufbau: Kapitel Anfang und Ende mit "Strich"name neue zeile + Link mit "Strich"name:sichtbarer text: +Tipp: frisch editierter Text mit Klick aufs Help-Fenster aktualisierbar + + +|index +|lang-de:Deutsch: +|lang-en:English: + + + +|lang-de +|de-shortcuts:Tastenkuerzel: +|de-quick:Schnellstart: Minimal Konfiguration +|de-online:Online Konfiguration: Internet oder HAMNET +|de-rf:Funkport Konfiguration: TNC, Soundmodem +|de-map:Landkarten Konfiguration: +|de-move:Karten und Objekte:, Zoom, Verschieben, Sounds +|de-kontent:Was soll aufs Bild: +|de-messages:Messages: Wem was schreiben +Der Text kann im File "help.txt" erweitert werden. + + + +|lang-en +|en-shortcuts:Shortcuts: +|en-online:Online Config: +|en-rf:Radio Ports Config: +|en-map:Map Config: +The Help Text may be edited in File "help.txt" + + + +|de-quick +Um Daten auf die Landkarte zu bekommen muss eine Datenquelle +ausgewaehlt werden zB. das "rawlog" File von einem der +schon laengere Zeit Daten sammelt oder via |de-rf:Funk: mittels +|de-tnc:TNC: oder |de-modem:Soundmodem: oder via Internet/HAMNET. Ist letzteres +vorhanden, |de-online:Online Config: +|de-map:Landkarten Holen: +|de-view:Start Kartenausschnitt: + + + +|de-online +Config / Online +Es genuegt meist, eine |de-server:Server Adresse: oder |de-server:IP-Nummer: +einzutragen und |de-connect:Connect Server: anzuklicken. Funktioniert +die Verbindung, wechselt der Knopf "X" der Statusknoepfe auf +"N" und wenn (und solang) neue Daten kommen von rot auf gruen. +Um die Datenmenge zu begrenzen und bei Servern, die Daten der +ganzen Welt anbieten sogar ein Muss, ist die Angabe eines +|de-serverfilter:Filters:. Filter mit "m/.." erfordern auch die Eingabe der +|de-mypos:Eigenen Position: und zum Senden einer korrekten |de-netbeacon:Netzbake: +eines |de-symbol:Symbols: und wenn man will eines kurzen |de-netcomment:Kommentars:. Man +sollte aber auch das eigene |de-mycall:Call: eintragen und wenn man Daten +ins Netz schicken will auch den dazu gehoerenden |de-passcode:Passcode: + + + +|de-kontent +Was soll wie aufs Bild. +"Config / Brightness" sollte selbsterklaerend sein + +"Time full Bright" ist keine Helligkeit, dafuer die Zeit, +in der Objekte und deren Tracks sichtbar bleiben sollen. +Damit, vor allem Tracks, nicht schlagartig enden, gibts +"Time Fade Out" die nach Full Bright noch ein Ausblenden +des Tracks oder Objekts ermoeglicht. +Diese Timer koennen auch praeziser Numerisch in +|de-timer:"Config / Timer": eingestellt werden. +Die maximal darstellbare Zeitspanne enstpricht der Zeit +in der Daten im RAM gehalten werden und die ist in +|de-timer:Data in RAM: einstellbar +|de-objectsram:Objects in RAM: mit extra Timer +Will man nur Wegpunkte ohne Linien, stellt man +Brightness Tracks auf 1%. +|de-gamma:Gamma: +|de-symboltext:Symbol Beschriftung: +"Config / Map Parameter / Brightness notmover" ist die +Helligkeit in der gedimmte unbewegte Objekte noch +erkennbar sein sollten und die bewegten so verdeutlichen. +|de-rfpath:Brightness RfPath: +"Config / Map Parameter / Menu transparency" stellt bis +gegen 1 die Durchsichtigkeit der Menues ein. Mit 0 kommt +ein aufgehellter Hintergrund. +|de-trackcolor:Track Farben: +|de-qth:QTH Finden: +|de-poi:POI Finden: + + +|de-trackcolor +Die Farbe eines neuen Tracks wird so generiert, dass +sie zu den in der Naehe schon vorhandenen maximalen +Farbkontrast hat. Wenn nun festgelegt, sollte sich die +Farbe von selbst nimmer aendern auch wenn sich das +Objekt da hin bewegt, wo scho die gleiche Farbe in +Verwendung ist. Dann hilft manuell Farbe aendern durch +anklicken des Objekts und evtl. wieder mit 0-Taste oder +"Show All" alles zeigen und dann mit ~-Taste (Tilde) +oder "Infos / Change Trackcolour" die Farbe mit dem +besten Kontrast aussuchen. + + +|de-objectsram +Objects in RAM: gilt fuer Items/Objects die als "echtzeit" +Ereignisse zwar von der Ferne geloescht werden koennten, +was aber kaum gemacht wird. +Stellt man diesen Timer laenger, koennen die nun fehlenden +Daten aus dem |de-writelog:Logile: nachgeladen werden. + + +|de-gamma +"Gamma" ist eine Helligkeitsfunktion des Auges und +teilweise des Bildschirmes mit Normalwert 2.2. Zum +Feinjustieren kann man auf einer Animation Schrift sehr +langsam ueber die Pixel wandern lassen und wenn dabei von +weiter weg betrachtet die Helligkeit konstant bleibt, ist +Gamma ok. + + + +|de-symboltext +"Config / Map Parameter / Show Course Arrow" zeigt/zeigt +nicht einen Fahrtrichtungspfeil am Symbol + +"Config / Map Parameter / Wind Vane" zeigt/zeigt nicht +eine Windfahne an Symbolen mit Wind Info + +"Config / Map Parameter / Show Temp" zeigt/zeigt nicht +Temperatur bei Symbolen mit Temperatur Info + +"Config / Map Parameter / km/h text" ist der Text nach +dem km/h-Wert der hier auch ein/ausgeschaltet werden kann. + +"Config / Map Parameter / Show Altitute min m" sind +Hoehenmeter ab der die Hoehe zum Symbol geschrieben +werden soll. -100 ab -100m also "fast" immer. + + + + +|de-timer +Config / Timers +"Netbeacon" ist die Zeit in Sekunden zwischen 2 Baken ins +APRSIS-Netz sofern man online ist und Daten senden auf ein. + +"Data in RAM" nach dieser Zeit in Minuten werden Daten +aus dem Arbeitspeicher entfernt und sind dann nur mehr +im |de-rawlog:Logfile:. + +"Objects in RAM" nach dieser Zeit in Minuten werden Daten +von Items und Objects aus dem RAM entfernt und sind dann +nur mehr im |de-rawlog:Logfile:. + +"Show km/h" sind Sekunden, die die km/h Angabe nach einer +Fahrt noch sichtbar bleiben soll bei den Symbolen. + +"Duplicate lookback" sind Minuten die zurueck von jetzt +nach verzoegerten Baken gesucht wird zum ausblenden von +|de-trackfilter:Zacken im Track:. +Beim Laden eines Logfiles steigt die Rechenzeit +da alle Baken mit allen verglichen werden muessen. + +"Animation Speed" ist default-Zeitraffer bei |de-animate:Animation: +und |de-video:Video: in Echtzeit zu Spielzeit bei 25Hz Framerate. +Bei laufender Animation kann die Geschwindigkeit durch +aufs Bild klicken justiert werden und gilt dann auch fuer +Video erzeugen. + +"Nomove skip delay" ist die Zeit in der die |de-animate:Animation:/ +|de-video:Video: noch mit konstanter Geschwindigkeit weiter laeuft +auch wenn sich nichts mehr bewegt bevor auf hoehere +Geschwindigkeit gestellt wird bis zur naechsten Bewegung. + +"Local Time" ermoeglicht ein Verschieben der Zeitangaben +um +/- 24h gegen der Systemzeit. Im |de-rawlog:Logfile: bleibt +immer Systemzeit. + + + + +|de-tnc +Ein TNC mit KISS, SMACK oder FLEXKISS Modus oder ein Transceiver +mit eingebauten TNC kann per USB oder serieller Schnittstelle +mittels des Programms |de-udpflex:udpflex: als Protokollwandler auf |de-AXUDP:AXUDP: +angeschlossen werden. Dabei wird auch ein TNC3 mit mehreren +Funkports unterstuetzt. + + + +|de-udpflex +Programm udpflex gibts auf linux und win und ist ein bidirectionales +Interface KISS,SMACK,FLEXKISS und AXUDP von seriellen und +USBseriellen Port, letztere hotplugfaehig. Es versteht sich mit +Flexnet, TNC2, TNC3-multiport, TMD-710, TH7E. Die UDP-Seite +geht ueber localhost oder auf andere Rechner zu APRSmap. + + + +|de-AXUDP +Protokoll AXUDP +Enthaelt das Rohformat von AX.25 mit einer CRC Pruefsumme. + + + +|de-modem +Ein Soundmodem muss AXUDP oder KISS auf einer virtuellen Schnittstelle +koennen. Derzeit ist auf Linux "afskmodem" und auch auf Win "dire-wolf" +bekannt die verschiedene PR-Modulationen koennen. Als Interface zu KISS +und NETKISS dient "udpflex(.exe)" + + + +|de-server +Config / Online / Server url +Eine Server Adresse ist ein normaler URL wie "nuremberg.aprs2.net" +oder eine IP-Nummer wie 44.143.40.90:14580 letztere mit Angabe der +Port Nummer falls ein anderer als der Standardport verwendet werden +soll. +Es koennen auch mehrere Serveradressen eingetragen werden und bei +bedarf auf aktiv oder inaktiv geschaltet werden. Damit sucht das +System so lange bis ein funktionierender Server gefunden wird. +Die Suchfolge ist gemaess den Wuenschen der Server-Betreiber auf +einer alle 30s begrenzt. + + + +|de-serverfilter +Config / Online / Serverfilter +Server Filter dienen zur Auswahl der gewunschten Daten aus dem Netz. +Ein einfaches Filter (das aber das absenden der eigenen Position +voraus setzt) is das m/radius Filter fuer km um den eigenen Standort. +Das gleiche geht auch mit r/laenge/breite/radius also zB r/13/48.5/250 +oder rechteckig mit a/laenge/breite/laenge/breite/ in Grad mit Komma +zB. a/11.5/49/13.5/47.1 +Bei manchen Servern gibt es ein Vielzahl von Filtern fuer Calls +Protokolle, Symbole mehrere davon kombinier- und invertierbar. + + + +|de-mycall +Config / Online / MY Call +Ein Call besteht aus 3 bis 6 Grossbuchstaben und Ziffern und evtl. +einem "SSID" von -1 bis -15. Am Netz sind zwar andere Varianten +auch uebertragbar, machen aber keinen Sinn wenn man ein gueltiges +Call besitzt und werden auch oft weggefiltert. + + + +|de-mypos +Config / Online / My Position +Die eigene Position kann man per Tastatur eingeben in der +Schreibweise DDMM.MMN/DDDMM.MME also Grad und Minuten mit +Komma (keine Sekunden!) oder viel einfacher indem man zuerst +auf der |de-map:Landkarte: die eigene Position durch |de-move:Verschieben: +und |de-zoom:Zoomen: einstellt auf |de-zoomlevel:Zoomlevel: 15 oder mehr und dann bei +geoffneter "MY Position"-Eingabezeile mit gehaltener Shift- +Taste auf die eigene Position auf der Landkarte klickt und +wenn korrekt mit "Ok" speichert. + + + +|de-symbol +Config / Online / My Symbol +Einfach ein Symbol auswaehlen auf dem Bild und drauf klicken +Fuer spezielle Overlay Symbole, sofern man weiss was man tut, +kann der Buchstabe oder die Ziffer im Textfeld durch Klicken +auf "My Symbol" im Zeileneditor eingetragen und mit "Ok" +gespeichert werden. + + + +|de-netcomment +Config / Online / Netbeacontext +Als Kommentar geht zB. Name und eine Frequenz auf der man QRV ist. + + + +|de-passcode +Config / Online / Passcode +Der Passcode dient der Sicherheit beim Senden von Daten ins +weltweite Netz. Es ist ein Zahlencode der mit eigenen Call +(SSID egal) verbunden ist und von Digi/Server-SysOps, denen +man bekannt ist, errechnet werden kann. + + + +|de-connect +Config / Online / Connect Server +Die Verbindung zum Netz kann hier, und noch direkter durch klicken +auf den "X" bzw. "N" Knopf ein- und ausgeschaltet werden. Beruehren +des Knopfes zeigt den Verbindungs-Zustand. Hat man Daten wie |de-mycall:Call:, +|de-serverfilter:Server Filter: oder |de-server:Server-Urls: veraendert, kann kurzes Trennen +und wieder Verbinden die aktualisierten Daten uebertragen. + + + +|de-netbeacon +Eine Netzbake ist eine Zeile Text ins APRSIS Netz die +normalerweise eine |de-mypos:Position:, ein |de-symbol:Symbol: und einen +kurzen |de-netcomment:Kommentar: enthaelt aber immer ein |de-mycall:Rufzeichen:. +Die Zeile wird vom System zusammengesetzt aus den +Angaben in Config / Online und mit dem |de-netbeacontime:Netbeacon Timer: +und immer beim einloggen in einen Server gesendet. + + + +|de-netbeacontime +Config / Timers / Net Beacon time ist die Zeit in Sekunden +zwischen 2 Netzbaken. Ueblich: 600s also 10 Minuten + + + +|de-rf +Funkports arbeiten via AXUDP mit |de-modem:Soundmodem: oder +|de-udpflex:KISS-Interface:. +Die Kommunikation findet via UDP und je einem Port +pro Richtung statt. +"Config / Rf-Ports / Rf-Port1" ist der erste Funkport +und enthaelt eine IP-Nummer und 2 beliebige freie +Portnummern wie 127.0.0.1:9001:9002 wobei auf 9001 +gesendet und 9002 empfangen wird. Der Link kann +jederzeit ein und ausgeschaltet werden mit dem +Schalter am Textfeld oder beim Knopf "1" in der +Statusknopfleiste. Beruehrt man den Knopf mit der +Maus, gibt es eine kurze Info ueber die Taetigkeit +des Ports und die Farbe des Knopfs zeigt mit gruen +dass Daten ankommen bis rot wenn sich eine Minute +nichts tut. +An sich spricht nichts dagegen die Ports auch ohne +Funkausruestung dran eingeschaltet zu lassen, nur +senden von Messages mit automatischer Portwahl zeigt +dann "Message gesendet" aber halt ins Nirvana. +AXUDP ermoeglicht auch Rx auf anderen Standorten +und, soweit erlaubt, auch Senden. Es koennen mehrere +Rx auf den selben UDP-Empfangsport Senden zB mit +Soundmodems mit verschiedenen Parameter aus einem +Rx oder mehrere Rx mit Antennen-Diversity +|de-igate:Igate: + + + +|de-igate +Igate-Funktion is auf Systemen mit TCPIP-Flusskontrolle +einschaltbar, aber nur als Behelf, da es mit |de-udpgate:udpgate: +eine Loesung dafuer gibt womit dann auch mehrere APRSmap +via einem Link nach aussen online gehen koennen. + + + +|de-udpgate +udpgate4 ist ein Linux IGate mit WWW-Seite und APRSIS-Server. +Auf Win gibt es die Software nicht, da das TCPIP-System +beim senden vom Daten ans APRSIS-Netz kein Feedback hat +ob Daten verzoegert abgeliefert werden. EIN verzoegernder +Igate von vielen der die gleichen Frames hoert, erzeugt +Verzerrte Tracks auf tausenden Bildschirmen. + + + +|de-map +Um Karten von OSM-Servern zu bekommen muss man +(nebst Internet Verbindung) +Config / Map Parameter / Load Map Program eingetragen, +aktiviert, und das hier aufgerufene externe Programm +konfiguriert haben. +Laeuft das Ladeprogramm, erscheint statt dem "E" im Knopf +der Status Zeile ein "D". Es ist normal, dass sich das +Ladeprogramm nach getaner Arbeit beendet denn es wird +bei Bedarf automatisch neu gestartet. + +Klickt man (je nach |de-nextclick:On Next Click: Einstellung) ein Objekt an, +so wird versucht es in das Fenster einzupassen. Sind die +Karten dafuer aber (noch) nicht komplett vorhanden gibt es +2 Moeglichkeiten mittels |de-havemaps:Zoom as have Maps: nur so weit zu +zoomen als es Karten gibt oder bis sie nachgeladen sind, +schwarze Kacheln zu akzeptieren. + +Mit "Config / Map Moving / Expand Map" eingeschaltet, +was auch direkt mit Klick auf den "E"-Knopf geht, +werden automatisch fehlende Karten-Teile aus der naechst +kleineren Zoom-Stufe gedehnt, durch rotes Leuchten des +"E/D" Knopfes signalisiert, und (wenn enabled) der +Kartenlader gestartet. +|de-view:Start Ansicht: einstellen und speichern +Um sich von Gebieten komplette |de-mapdownload:Kartensammlungen: auf die +Platte zu laden gibt es Tools / Choose Maps / |de-mapdownload:Download:. +Um Karten(Teile) die beschaedigt sind oder wenn man sie +einfach erneuern will hilft Tools / Choose Maps / |de-reload:Reload:. + +|de-havemaps +Sind noch wenig Karten-Teile vorhanden auf der Rechner- +Platte, ist der Schalter +"Config / Map Moving / Zoom as have Maps" besser auf "Aus". +Damit erscheinen zwar, bis Karten geladen sind, schwarze +Teile, aber das Laden startet. Hat man schon viele Karten +oder ist Offline oder will einfach gerade keine neuen +Karten laden, so kann man "Zoom as have Maps" einschalten +womit beim Anklicken von Objekten die Karte nur mehr so +weit gezoomt wird, wie sie noch fuer das ganze Bild +vorhanden ist. +Wegen schneller Berechnung wird hier nur auf +Vorhandensein der Karten-Files untersucht, falls diese +dann nicht ok sind, kann trotzdem Laden starten oder +eine gedehnte oder schwarze Kachel erscheinen. + + + +|de-reload +Tools / Choose Maps / Reload +Wenn man zB. dabei ist, OSM-Karten zu erstellen oder zu +verbessern, kann man die Kartenteile (256x256 Pixel), die +schon auf der Platte sind, fuer den sichtbaren Bildausschnitt +neu Downloaden. Geht der Download schief, erscheinen die +alten Karten wieder. + + + +|de-mapdownload +Man stellt durch |de-zoom:Zoomen: und |de-move:Verschieben: und/oder durch Aendern +der Fenstergroesse den gewuenschten Kartenausschnitt ein, gibt +versuchsweise einen |de-zoomlevel:Zoomlevel: von 1 bis 18 ein, wobei jede +hoehere Zahl doppelte Aufloesung ergibt und damit etwa +vierfaches Datenvolumen, und wenn man damit zufrieden ist, +startet man den Download, der im Hintergrund ablaeuft. +Hinweis: da es sich um ausgeklappte Menues handelt, die sich +beim Beruehren mit der Maus schliessen, sollte man zum +"Start"-Knopf aussen herum fahren. +Die Berechnung kann bei hohen Werten eine Weile dauern, da +alle schon vorhandenen Kartenteile auf korrektes +Bildformat untersucht werden und im Fehlerfall ebenfalls neu +angefordert werden. +Die angezeigten Byte sind als sehr grober Schaetzwert zu sehen +da ein komprimiertes Bildformat je nach Inhalt 400 bis 200000 +Byte haben kann. +Der Download kann je nach Server, Downloadprogramm, +Internetanschluss und Volumen Sekunden bis zu mehreren Tagen +dauern. Um nach einem Abbruch fortzusetzen, kann man sich den +gewaehlten Kartenausschnitt und |de-zoomlevel:Zoomlevel: mittels Shift- +Linksklick auf einen der 4 |de-view:"View":-Tasten im Zoom-Menue speichern +und evtl. mit Config / |de-saveconfig:Save Config: speichern falls ein +leerer Akku droht. + + +|de-saveconfig +Config / Save Config +Speichere die momentane Konfiguration jetzt in +aprsmap.cfg was ansonsten nur beim Beenden des +Programms und eingeschaltetem |de-autosave:"save on quit": +der Fall ist. + + + +|de-autosave +Mit dem Schalter Config / Save Config kann ein- oder +ausgeschaltet werden ob die Configuration beim Beenden +des Programms mit File / Quit oder "q"-Taste oder +Schliessen des Fensters gespeichert werden soll. +Falls nicht, und man auch nicht manuell gespeichert hat, +ist sie am Zustand vom Programm Start. + + + +|de-view +Ein "View" ist eine konfigurierte Kartenansicht bestehend aus +|de-zoomlevel:Zoomlevel: und sichtbarem Kartenausschnitt. Es koennen mit Shift- +Linksklick auf einen View-Knopf im Zoom-Menue 4 Ansichten +gespeichert, mit Klicken (ohne Shift) wieder abgerufen, +und mit den Tasten 1 bis 4 direkt aktiviert werden. + +Besonders empfohlen sei, die Ansicht, die man bei Programm +Start haben will, auf den ersten Knopf (ganz links) zu legen. +|de-zoomframe:Schnell Zoomen: fuer Geuebte. + + +|de-move +Verschieben der Landkarte geht mittels der 4 Cursor-Tasten, +im Zoom-Menue, klicken knapp innerhalb des Fenster-Rahmens +oder Ziehen mit gehaltener Linker oder mittlerer Maus-Taste. +Die Schrittgroesse ist in "Config / Map Moving / Map Move Step" +einstellbar und im laufenden Betrieb mit gehaltener Shift- +Taste auf 1/10 verfeinerbar. +Beim Verfolgen von beweglichen Objekten kann man die Karte +automatisch |de-watch:mitschieben: lassen. +die C-Taste oder Menue " Zoom / Center " stellt die Kartenmitte +auf die zuletzt angeklickte Stelle. Dies ist nuetzlich wenn +man danach |de-zoom:hineinzoomt: um den gewuenschten Ort im Bild zu +behalten. Das geht auch mit auf |de-zoomframe:Bild Ausschnitt zoomen:. +Mittels "Tools / |de-nextclick:On Next Click: / To Map" kann man Zentrieren +auf jeden Linksklick einschalten. +Die Schieberichtung der Richtungstasten kann bei Bedarf in +"Config / Map Moving / Swap map move dir" umgekehrt werden. +|de-mauspos:Maus-Koortinaten: und |de-measure:Wegstrecken Messen: +|de-history:Zurueck wo man war: + +|de-zoomframe +Mit gehaltener Shift- und linker Maustaste und Maus ziehen +spannt man ein Rechteck auf, dessen Inhalt beim auslassen +der Maustaste auf Fenstergroesse gezoomt wird. Retour wie +sonst auch mit |de-history:Zurueck wo man war: + +|de-mauspos +Unter "Config / Map Parameter / Show Loc of Mouse" einschalten +damit werden Laenge/Breite/QTH-Lokator des Mauszeigers sichtbar. +|de-measure:Wegstrecken Messen: +Tipp: bei Akku Betrieb nur verwenden wenn gerade notwendig +da wegen Bildschirm-Update mehr CPU/Strom verbrauch. + + + +|de-measure +Mit Shift-Linksklick auf die Landkarte kann ein Anfangspunkt +markiert werden und bei jedem weiteren Klick auf die leere +Karte wird in einem Popup Fenster die Entfernung zum letzten +Punk gezeigt und die Gesamtstrecke aufsummiert. +Neustart wieder mit Shift-Linksklick. + + + +|de-watch +Calls koennen in die Beobachtungsliste eingetragen +werden unter "Config / Watch Calls" oder von einem +ausgewaehlten Objekt direkt unter "Infos" uebernommen +werden. Eintraege der Liste koennen aktiviert oder +deaktiviert werden, letzteres ist wie nicht vorhanden. +Kommt eine Positionsbake von einem aktivierten Objekt +und befindet man sich nicht im |de-1:Nur 1 Objekt:-Modus, +so verschiebt sich die Landkarte bei gleichbleibendem +|de-zoomlevel:Zoomlevel:, sodass das Objekt sichtbar wird. Wie +nahe das Objekt dabei im |de-center:Zentrum: gehalten werden +soll laesst sich einstellen. Weiters kann ein in +|de-beep:Tonhoehe: und |de-beep:Dauer: einstellbarer |de-watchbeep:Pieps: eingschaltet +werden. Alle Objekte koennen auch auf |de-prox:Annaeherung: +an den eigenen Standort ab einem bestimmten |de-radius:Radius: +einen |de-prox:Annaeherungs Warnton: erzeugen. + + + +|de-1 +Zeige nur 1 Objekt und (wenn vorhanden) dessen Track. +Der Modus wird durch leuchten des "."-Knopfes der Status +Knopfleiste angezeigt und kann durch Anklicken jenes +oder "Zoom / Show All" oder die 0-Taste oder zuerueckgehen +in der |de-history:"History": beendet werden und man sieht +wieder alles. +|de-debug:Debug Infos: +|de-history:Zurueck wo man war: + + +|de-history +Die meisten Karten |de-zoom:Zooms: und |de-move:Verschiebungen: koennen mit der +"b" oder BACKSPACE-Taste, durch Klick auf " Zoom / << " +oder der rechten Maustaste rueckgaengig gemacht werden. +Es werden bis zu 20 Schritte zurueck gespeichert, die +erste Einstellung bleibt immer erhalten wie auch einfach +durch die "1" Taste mit gespeicherter |de-view:Karten Positionen:. + + + + +|de-zoom +Zoomlevel manuell einstellen geht mit + und - Taste oder am +Zoom-Menue, mit dem Maus-Rad oder rechten Rand des Mauspads +sofern aktiviert. Zwichenstufen gehen beim Zoomen mit +gehaltener Shift-Taste wobei die Feinheit der Stufung unter +"Config / Map Moving / Fine Zoom Step" veraendert werden kann. +Die Zwischenstufen werden durch Interpolieren der naechst +groeberen Karte gemacht und es ergibt sich dabei ein unscharfes +Bild. Verkleinern einer hoeheren Aufloesung waere hier zwar +besser, dabei wuerde aber der Text der Karte unleserlich. +Mit |de-zoomframe:Schnellzoom: kann man etliche Zoom-Stufen auf einmal machen. +|de-zoomlevel:Zoomlevel: +|de-autozoom:Automatischer Zoom: +|de-history:Zurueck wo man war: + + + + +|de-zoomlevel +Zoomlevel ist eine Besonderheit der OSM-Karten um Landkarten +mit verschiedenem Massstab als Bild zu Speichern. +Zoomlevel 1 ist die ganze Welt, jeweils die naechste Stufe +doppelte Genauigkeit. Level 13 bis 14 reicht fuer Landstrassen +15 bis 16 im Ortsgebiet und ueber 18 kommt meistens keine +Information mehr hinzu. +|de-zoom:Manuell Zoomen: +|de-autozoom:Automatischer Zoom: +"Config / Map Moving / Max Zoom" dient nur zum Limitieren +des Zoomlevels bei schnellem manuellen hineinzoomen. + + + + + +|de-autozoom +Beim Anklicken von |de-1:Objekten: auf der Karte kann unter +"Tools / |de-nextclick:On Next Click:" konfiguriert werden, dass das +Objekt mit evtl. einem Track in das Bildschirmfenster +eingepasst wird. Damit kleine oder punktfoermige Objekte +(also ohne Track) nicht immer einen Karten Download +starten, kann man unter "Config / Map Moving / Default Zoom" +einen default Zoomlevel (zB. 14) einstellen und bei Bedarf +manuell weiter Zoomen. +|de-zoomlevel:Zoomlevel: +|de-history:Zurueck wo man war: +|de-nextclick +Tools / On Next Click +Hier kann man sich das Verhalten auf einen Links-Klick +auf Karte, Symbol, Text, Track und Wettersymbol einstellen. +Waehlt man nichts mittels "Menu" poppt ein Menue mit den +Auswahlmoeglichkeiten zum angeklickten Objekt auf. + +"Raw+Decoded" liefert die Rohdaten und deren Infos in +lesbarer Darstellung mit Zeitstempel und |de-debug:Debug Infos: + +"Show Rf" zeigt bei sendenden Objekten welcher Igate sie +gehoert hat mittels |de-rfpath:weissen Linien:. + +"Del Waypoint" sei mit Bedacht verwendet und dient zum +reparieren von vielen Ausreissern auf Tracks. Das +Loeschen erfolgt nur im RAM nicht im |de-rawlog:Logfile:. +Einzelne falsche |de-waypoint:Wegpunkte: loescht man +besser mit der DEL-Taste oder im Info-Menue + +Die diversen Statistik-Diagramme sind selbsterklaerend. +Der vertikale Strich ist eine Marke zum zuordnen der +Stelle zum angeklickten |de-waypoint:Wegpunkt:. + +Mittels eingeschaltetem |de-trackfilter:Trackfilter: kann man grobe +Ausreisser aus den Statistiken fern halten. +|de-1:"Zoom to": +"Heard" bei einem Igate zeigt mit |de-rfpath:weissen Linien: +was er gehoert hat. +|de-marker:Marker setzen: + + + + +|de-debug +Debug Infos finden sich in den Raw+Decoded Daten rot markiert. +DUPE mit der Zeitangabe vor wie viel Sekunden die (bis +auf den Funkweg) gleiche Bake schon mal eingetroffen ist +mit dazwischen anderen Positionen. Das kann auch kein Fehler +sein wenn ein bewegtes Objekt den selben Punkt 2 mal angefahren +hat und bis zur letzten Kommastelle gleiche Hoehe/Geschwindigkeit/ +Fahrtrichtung und Position hat was sehr unwahrscheinlich ist. +Folglich ist ein "DUPE" fast immer ein in einem Digi oder IGate +verzoegerter Frame. Tritt dies mehrfach auf, kann man wenn immer +der gleiche Digi im Pfad ist mit gewisser Wahrscheinlichkeit jenen +als Delay-Maschine identifizieren und per |de-callfilter:Callfilter: ausblenden +falls der SysOp nichts verbessert. + +SPIKE ist ein Ausreisser aus einem Track der auch mal echt sein +kann wenn sich das Objekt mit wenig Baken in kurvenreichem +Gebiet bewegt. Es kann auch ein GPS-Fehler sein oder ein Igate +der bei Mic-e Encodierung die Steuerzeichen verwurstelt hat. +Tipp:|de-callfilter:Callfilter: Via Igate + +DIST ist ein als zu lang empfundenes Wegstueck ohne Wegpunkte +gegenueber dem was davor kam. Das ist bei unrealistischem +Reiseweg meist ein Uebertragungsfehler und sonst einfach +zu lang keine Baken empfangen. Der "Fehler" wird nur markiert +damit er mittels eingeschaltetem |de-trackfilter:Trackfilter: die Striche +quer uebers Bild entfernt. + +SEG ist aehnlich wie DIST einfach ein schwer dazustellender Track +der aus 2 entfernten Teilen besteht. 2 Tracks haetten 2 Fahrzeuge +des gleichen Objekts vorn dran daher wird bei eingeschaltetem +|de-trackfilter:Trackfilter: der aeltere Teil nicht dargestellt. + +SPEED ist eine unrealistische Strecke pro Zeit und entsteht +manchmal durch 2 Sender mit selbem Call und SSID an verschiedenen +Standorten. + + + +|de-callfilter +Config / Callfilters +damit kann man unerwuenschte Objekte vom der Karte fernhalten. +das betrifft nur die Daten im RAM nicht im |de-rawlog:Logfile:. +Es kann auf + +"Objekt Name" gefiltert werden dazu gibt man den Namen ein der +beim Symbol steht (keine Wildcards) + +"Via Igate" entfernt alles was dieser Igate liefert + +"Sender of Object" filtert alles was von diesem Call als Object +oder Item verbreitet wird. Wer welche Objects und Items sendet +findet mal durch anklicken eines Symbols im "Infos"-Menue unter +"Objects of ..." + +"Destination Call" ist das AX.25 Zielcall, damit wird oft die +sendende Software erkennbar und kann damit, wenn nachhaltig +Unsinn verbreitend, ausgefiltert werden. + +"Word in Comment" kann ein Teil im Kommentar-Feld sein zB "RNG0" +wenn man sich damit von Karten vermuellende Vielfachsymbol- +schleudern befreien kann. + +Es koennen beliebig viele Filter eingegeben, aktiv/inaktiv +geschaltet und geloescht werden. + + + + +|de-rfpath +Funkwege berechnen. +Hierbei kann manchmal nur ein "kleiner Rest" der +Wirklichkeit gezeigt werden da viele Hf-Digis ihr +Call nicht dazu schreiben und das APRSIS-Netz nur +den Igate zeigt, der es am schnellsten zum Server +geliefert hat. Es fehlen also Igate die serielle +TNC oder langsames Internet haben wenn die gleiche +Bake auch von Soundmodem+Glasfaser-Igates empfangen +wurde. Je breiter die weisse Linie desto mehr Baken +nahmen diesen Weg. + +"Config / Map Parameter / Brightness RfPath" ist die +Helligkeit der weissen Linien in Funkausbreitungs- +Darstellungen. + + + + + +|de-marker +Marker 1, das grosse gelbe "+" zeigt eine markierte +Stelle auf der Karte oder einen |de-waypoint:Wegpunkt:. +Alle weiteren Klicks zeigen dann Entfernung und +Winkel zum Marker, oder bei eingeschaltener "Show +Location of Mouse" ("p"-Taste) schon bei Maus Bewegung. +Einen Marker auf der Karte setzt man an der Maus Position +mit "x" (Marker 1), y (Marker 2) oder auf die Karte +klicken und im Zoom-Menue "1" oder "2" anklicken. +Ein auf ein Objekt eingerasteter Marker entsteht durch +Anklicken eines Symbols (und im siech oeffnenden Menue +gegebenenfalls Auswahl des gewuenschten Objekts) und +anklicken von "Marker 1" oder "Marker 2". Loeschen vom +beiden Markern mit ":" oder einzeln im Zoom Menue "Clr". +Ist noch kein fixer (gelber) Marker 1 gesetzt, reicht +Anklicken eines Objekts oder Wegpunktes zum setzen eines +beweglichen (blauen) Markers, der sich mit der Position +des Objekts mit bewegt und zB bei eigeschaltetem +"Tools/Radiolink" einen aktuellen Gelaendeschnitt +zum Marker 2 zeigt (Hoehendaten Files muessen vorhanden +sein). Steht bei "Tools/Radiolink/Antenna 1" nach der +Hoehe der Antenne noch "A" also zB "10 A", wird nicht +die Bodenhoehe verwendet sondern die Hoehenangabe des +Objekts aus dessen Bake (+- die Antennehoehe). Das +macht nur bei Fliegegenden Objekten Sinn zumal die +GPS-Hoehen meist ungenauer sind als die aus den +srtm-Files. +Sind 2 Marker gesetzt, kann mit "Zoom/Zoom to Markers" +oder "/" die Karte ausgerichtet werden sodass beide +Maker und ein Gelaendeschnitt genau im Bild sind. + + +|de-qth +Tools / |de-find:Find: +und als Suchbegriff ein QTH-Lokator zeigt dessen +Flaeche und Mittelpunkt auf der Karte +zB. JN68PC + +|de-find +Tools / Find +Suchen von Objekten entweder in genauer Schreibweise +-gross/klein ist wichtig- oder mittels ? oder hinten +dran * als Wildcard |de-1:zoomt: zum gefundenen +Objekt oder liefert ein Auswahlmenue wenn es mehrere +gibt die zum Suchbegriff passen. Davon kann dann +eins ausgewaehlt werden. +Ist ein "poi.txt" und/oder "mypoi.txt" File vorhanden +kann auch nach |de-poi:Points of Interest: gesucht werden. +Gibts mehrere zum Suchbegriff passende Namen kann +durch Klick auf die Such-Eingabe der jeweils naechste +Punkt angesteuert werden. +Weiters kann nach "Laenge Breite" in DDMM.MM oder +D.DDD Format gesucht werden. zB. "4812.34N 1243.21E" +"43.9876 -13.8765" + + +|de-poi +Ist ein "poi.txt" und/oder "mypoi.txt" File im Karten +Verzeichnis vorhanden, kann nach "Points of Interest" +|de-qth:gesucht: werden oder bei eingeschaltener "Show Location +of Mouse" ("p"-Taste) und ab dem dort einzugebenden +Zoom Faktor werden die POIs beim Bewegen der Maus +in deren Naehe angezeigt. Setzt man die Maus dann +nahe zum angezeigten Punkt, kann mit "c" auf den Punkt +Zentriert, und sodann mit "+" gezoomt werden. +Derzeit in den Files, Bergnamen der Alpen und SOTA-Punkte. + + + +|de-waypoint +Ein Wegpunkt entspricht einer empfangenen Positionsbake +eines beweglichen Objekts. die weissen Punkte koennen +in "Config / Brightness / Waypoint" in der Helligkeit +eingestellt oder sind bei 0% ganz weg. +ist ein Wegpunkt mit dem |de-marker:Marker 1: ausgewaehlt, +gibt es umfangreiche Darstellungs- und debug-Moeglichkeiten. +|de-rfpath:RfPath: +|de-sendmsg:Message senden: +|de-animate:Animieren: +|de-debug:Debug Infos: + +|de-sendmsg +Hier kann eine Nachricht an ein Call gesendet werden + +|de-animate +Animation am Bilschirm +Pause mit Blank-Taste oder Draufklicken +Geschwindigkeit einstellen mit Draufklicken und dann +im Menue gewuenschtes Verhaeltnis Echtzeit zu +Darstellung einstellen. Die Zeit gilt bei 25Hz +Bildfrequenz und wird bei evtl. nachfolgendem +|de-video:Video erzeugen: weiter verwendet. + +|de-video +Aus der sichtbaren Darstellung kann ein Video-File +erzeugt werden sofern sich Objekte im Bild befinden +die sich bewegt haben. Der Zeitabschnitt wird in +"Config / Brightness / Time |de-fullbright:full Bright:" ausgewaehlt +und die Zeitraffer bei der vorherigen |de-animate:Animation: +einjustiert. +Es wird die Studio-Version des unkomprimierten +y4m-Videoformates in ein File "map.y4m" im +Startverzeichnis geschrieben das sehr lang +werden kann. Auf Linux erzeugt man am besten +mit "mknod map.y4m p" eine named pipe und startet +"x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m" +und erhaelt platzsparend ein H264 Video. +Mit --crf kann die Qualitaet/Filegroesse +optimiert werden. Das y4m-Format wird aber auch +direkt von "vlc" und "mplayer" verstanden. + + +|de-trackfilter +Trackfilter kann mit f-Taste oder dem F-Knopf in der +Statusleiste ein- und ausgeschaltet werden. Die Wirkung +zeigt sich im Bild sofern fehlerhafte oder nicht +sinnvoll darstellbare Track-Teile an und weg gehen. +Es werden dabei keine Daten veraendert, nur die als +falsch markierten Wegpunkte nicht verwendet als +seinen sie nicht empfangen worden. +Wer "sauberen Bildschirm" haben will, kann eingeschaltet +lassen, SysOps sei aber nahegelegt, sich mit den Ursachen +der Pannen zu befassen und dazu gibt es |de-errors:Show Errors: +als debug Tool bei einem angeklickten Objekt im +"Info"-Menue. + +|de-errors +Mit der e-Taste oder "Errors/Waypoints" im "Info"-Menue +werden beim Durchsteppen des Tracks mit den < > -Tasten +oder entsprechendem Knopf alle oder nur die Wegpunkte +die als fehlerhaft markiert sind angesprungen. +im Raw+Decoded-Popup-Fenster sieht man den gesamten +Baken Rohtext mit Funkweg Igate und alles dekodiert +und die |de-debug:Error-Flags:. Mit "Delete Waypoint" +oder der DEL-Taste kann der aktuelle Wegpunkt geloescht +werden und wenn man im "Show Errors"-Modus ist, spring +der Marker dann zum naechstgelegenen Fehlerpunkt. +Bleiben offensichtlich unerkannte falsche Punkte ueber +kann man diese anklicken und dann loeschen oder wenn es +viele sind mit |de-nextclick:Tools / On Next Click: / To Track +"Delete Waypoint" einschalten und jedem Klick auf den +Wegpunkt entfernt diesen. +Hat man zuviel entfernt hilft |de-writelog:Logfile neu einlesen: +Will man als Kletterer/Segler... ein sauberes Hoehenprofil, +kann man zusaetzlich in |de-nextclick:Tools / On Next Click: / To Track +"Altitude" einschalten und mit dem dort sichtbaren Cursor +auf die (meist vom GPS erfundenen) Ausreisser mittels Track +anklicken manoevrieren und dann die Wegpunkte loeschen. +Ein so gesaeuberter Track kann dann per Bildschirmfoto +(mit den Diagrammen) oder per eingebautem |de-screenshot:Screenshot: +oder als Rohdaten im "Info"-Menue mit "Save Info to File" +oder als |de-video:Video: archiviert werden. + + + +|de-writelog +mit "File / Import Log / Reload Writelog" kann +(falls vorhanden) wieder alles ins RAM gelesen +werden was man versehentlich geloescht hat. + + + +|de-screenshot +File / Screenshot oder s-Taste +Speichert das sichtbare Bild ohne Menues in ein Bildfile +(auf Linux ".ppm" oder ".png", auf Win ".bmp") +%t im Filenamen setzt Datum und Uhrzeit ein +%n eine laufende Nummer +sodass ein weiterer klick oder "s" ein neues Bild erzeugt. + + +|de-rawlog +Logfile + + + +|de-center +Call im Zentrum halten + + + +|de-watchbeep +Unter Config / Map Moving / Bell/Sound kann ein +Pieps ein- und ausgeschaltet und in |de-beep:Tonhoehe: und +|de-beep:Dauer: parametriert werden. Beim Anklicken des +Knopfes wird zum Test dieser Pieps ausgeloest. +Tipp: +hier nur kurzen Ton einstellen wenn er oft auftritt. + + + +|de-prox +Unter Config / Map Moving / Proxy Warn km kann ein +Warnton ein- und ausgeschaltet und in |de-beep:Tonhoehe: und +|de-beep:Dauer: Parametriert werden. Das erste Zahlenpaar +bestimmt den Ton bei Eintritt in den |de-radius:Warnradius:, +das zweite bei 0km. Dazwischen wird ein weicher +Uebergang erzeugt. + + + +|de-radius +Unter Config / Map Moving / Proxy Warn km kann ein Radius in km +um den eigenen Standort eingegeben werden ab dem ein +Popup-Fenster ein sich naeherndes Objekt anzeigt. +Ein im Abstand zum Zentrum variirender |de-prox:Ton: kann ebenfalls +zugeschaltet werden. + + + +|de-beep +Config / Map Moving / Bell/Sound +Tonhoehe (in Hz) und Dauer (in Millisekunden) +Zum Testen im eingeschalteten Zustand auf den Knopf klicken + + + +|de-messages +Eine Kurznachricht (Message) einen User oder Query +(Steuer/Anfrage Befehl an eine Maschine) kann durch +anklicken eines Objekts und dann "Message" oder durch +klicken auf den "M"-Knopf in der Statusleiste erzeugt +werden. +Empfangene Messages werden in einem Popup-Fenster +gezeigt, koennen dabei einen |de-beep:Pieps: erzeugen +und mit "Reply" beantwortet werden. +Querys koennen konfigurierbare Aktionen und +|de-queries:automatische Antworten: erzeugen. + +Kommt eine Message an das eigene Call aber mit anderem +SSID, wird sie zwar angezeigt aber nicht bestaetigt. + + +|de-queries +Config / Rf-Ports / Query Keywords +Auf ankommender Querys (Message mit "?" am Anfang und +normal ohne Bestaetigung) koennen verschiedene Funktionen +konfiguriert werden. +"Stichwort:"und der Rest der Zeile wird entweder gesendet +oder mit "\\" ein Befehl ausgefuehrt. + +\\v Programm Version +\\p Funk/Internet Pfad auf dem die Message kam +\\l eigene Laenge/Breite +\\h sendet Systemzeit +\\>test.txt< schreibt die Message ins File "test.txt" + und falls ein Programm das File vorliest, kann man + sprechende Messages basteln. +\\ fuegt den Inhalt den Files "wetter.txt" ein +Achtung: Gesamtlaenge maximal 67 Zeichen. + +?VER:VERSION \\v \\v sendet Programm Version +?APRST:PATH= \\p \\p sendet Pfad der Msg +?APRSP:\\l \\l sendet eigene Position +TALK:\\>filename Time \\h sendet ein File and Time +?HELP:?VER,?APRST,?APRSP,TALK,?WX sendet Hilfetext + + + + +|de-shortcuts +: Marker loeschen +@ reset auf Menu Mode +a Animate (auf Karte klicken zum Werte einstellen) +b oder zurueck in Zoom/Pan History +c Zentriere auf Maus Position +d fehlende Landkarten laden ein/aus +e Nur Errors/Alle Wegpunkte zeigen bei <> +f Track Filter ein/aus +h Zeige gehoerte Stationen von einem angeklickten Igate +i Status Liste +l Labels (Calls) ein/aus +m seit min. 10min stillstehende Stationen dunkel ein/aus +o Zeige Objects/Items ein/aus +p Zeige Geodaten der Mausposition ein/aus +q Quit +r Zeig weisse Funkstrecken Linien von angeklickter Station +s ein/aus nur Stationen mit einem ausgewaehlten Symbol +u Tx/Rx-Monitor Fenster ein/aus +w WX-Stationen (mit l nur Temperatur ohne Calls) +ww grafische Temperaturverteilung +x setze Marker 1 auf Mausposition +y setze Marker 2 und Linie/Gelaendeschnitt zu Marker 1 +B Baken Editor oeffnen/schliessen +D Digi Konfiguration oeffnen/schliessen +F Finde Call (mit Wildcards * ?), Lokator, Breite/Laenge, POI +H Farbdarstellung der Hoehendaten (sofern vorhanden) +M Message Schreiben +R Funkreichweiten Karte ein/aus +S Bildschirmfoto bpm (win), png (linux) +W grafische Regenkarte rot: letzte Stunde, blau: 24h +< > Liste gespeicherte Baken/Wegpunkte der angeklickten Station +( ) Helligkeit der Landkarte +- 5% +/ Zoom auf das von Marker 1-2 aufgespannte Rechteck +\ Shortcut Liste +~ Aendere Track Farbe ++ hineinzoomen - herauszoomen +. zoomen auf angeklickte Station += wie . aber mit Funkstrecken +0 Zeige alle Stationen +1,2,3,4 Zoom/Pan auf vorgespeicherte Views +7,8,9 Benutze Kartentyp 1 2 3 aus der Kartenliste +ESC schliesse Menues +Cursor up/down/left/right Karte bewegen +SHIFT mit up/down/left/right/[zoom+]/[zoom-] kleine Schritte +DEL loesche angeklickte Station oder Wegpunkt +TAB zwischen 2 Zoom/Pan/Focus/Wx Einstellungen hin und her +ctrl-L Setze Bildwerte und Mausverhalten auf Standard +ctrl-V Paste + +|en-shortcuts +: delete markers +@ reset to menu mode +a Animate (Click to Map to set Parameters) +b or go back in position history +c Center map to mouse position +d toggle (missing) map download +e toggle Errors only/All for stepping along a track with <> +f Junk Filter toggle on/off +h Heard (click symbol or text of igate before) +i Internal Status Listing +l toggle Labels on/off +m toggle dimm not moving since 10min +o toggle Objects/Items on/off +p toggle mouse-over Hints +q Quit Program +r toggle Radio tracks on/off +s toggle show only stations with a selected symbol +u toggle tx/rx-Monitor window on/off +w toggle WX stations and Temperature +x set Marker 1 to mouse position +y set Marker 2 and Line to Marker 1 +B Beacon editor open/close +D Digi Config open/close +F Find Call (with wildcards * ?), Locator, Latitude/Longitude +H Altitude Colour Map (if srtm-Data avaliable) +M Compose Message +R toggle Radiorange Map on/off +S Screenshot bpm (win), png (linux) +W Rain map (use topo or dark map) +< > Step along Beacons/Waypoints of a selected User +( ) Map Brightness +- 5% +[ ] View until max. Age of Data on Map +- +/ zoom to Marker 1-2 Square +\ shortcut list +~ change track colour ++ Zoom in - Zoom out +. zoom to track and show only this (clicked before) += same as . but with radio tracks +0 show all (and radio tracks off) +1,2,3,4 Zoom/Pan to stored Views +7,8,9 use map type as configured +ESC close menus +Cursor up/down/left/right move map, same as click near margin +SHIFT with up/down/left/right/[zoom+]/[zoom-] in smaller steps +DEL delete selected (Symbol, Waypoint) +TAB switch between two Views +ctrl-L Reset Image and Mouse parameters to default +ctrl-V Paste + +|en-map +Helptext Map + +|en-rf +Helptext Rfports + +|en-online +Heltext APRSIS Config + diff --git a/aprsmap_common/hints.txt b/aprsmap_common/hints.txt new file mode 100644 index 0000000..7186d87 --- /dev/null +++ b/aprsmap_common/hints.txt @@ -0,0 +1,1689 @@ +|101 If a Click hits more than 1 User, you may +select the desired with this button or +simply click again on the same Position +and the Calls will rotate to the +preselected top position + +|102 If a Click hits more than 1 User, you may +select the desired with this button or +simply click again on the same Position +and the Calls will rotate to the +preselected top position + +|104 Show additional Infos of the selected User + +|106 Zoom the Map to fit this User with Track +into the Window (shortcut .) + +|107 Zoom the Map to fit this User with Track +and the Igates which heared it to the Window. + +|108 Move Map to hold selected moving Object +as near to Center of Screen as configured in +Config > Map Moving > Center Watchcall + +|109 Zoom the Map to fit this User with Track +and the Igates which heared it to the Window. + +|110 If Call is Igate, Zoom Map to fit the +Stations and Tracks heared to the Window. +The thicker the white Lines, the more Beacons +took this way + +|111 Compose a Message to this User +or a Query to a Machine + +|112 Move Map to hold selected Object in View. +In Config > Map Moveing > Center Watchcall +you define how near to Center of Window. + +|113 Go to normal Mode and Show all Users + +|120 Zoom to fit Marker 1 and 2 to Imagesize +same as "/" + +|115 Set Marker 1 to last Clicked Map Position +same as "x" +|116 Delete Marker 1 and QTH Locator Area +|117 Delete Marker 2 +|118 Set Marker 2 to last Clicked Map Position +same as "y" + +|123 Config what to do when Click +on Symbols/Text/Tracks + + +|125 Shift-Leftclick to Store View, Leftclick +or "1" Key to jump to this View +View 1 is used at Start + +|126 Shift-Leftclick to Store View, Leftclick +or "2" Key to jump to this View + +|127 Shift-Leftclick to Store View, Leftclick +or "3" Key to jump to this View + +|128 Shift-Leftclick to Store View, Leftclick +or "4" Key to jump to this View + +|130 Zoom Out, with SHIFT in +configurable Stepwidth + +|131 Move Map, with SHIFT in 1/10 Steps +|133 Move Map, with SHIFT in 1/10 Steps +|135 Move Map, with SHIFT in 1/10 Steps +|137 Move Map, with SHIFT in 1/10 Steps + +|132 Zoom In, with SHIFT in +configurable Stepwidth + +|134 Center before Leftclicked Position on Map + +|136 Step back in Zoom/Pan History, same +as "b" BACKSPACE or Rightlick + +|138 close this menu + + +|200 Log, Screenshot, Video, Quit + +|201 Config Map, Timers, Internet, Rf... + +|202 Move/Zoom Map, You can invert moving directions +and store map positions/zooms to "views" +view 1 is used at start + +|203 Change/Get Maps, Behaviour of Clicks, Send Messages ... + +|204 List Shortcuts + +|300 Quit Program + +|301 Generate a Video file/stream in YUV4MPEG2 format +in File/Pipe map.y4m. Adjust all parameters before +with the "Animate" function. The File/Stream may +be viewed with VLC, Mplayer or packt by x264 +eg. x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m + +|302 Save screen Image (without menues) to File +format .png so use filename with .png +win: use .bmp +%t insert date-time in filename +%n insert counter + +|303 For viewing historical/downloaded data + +|304 Load/Edit/Save Program Parameters + + +|307 Enable/Disable Appending Data to Logfile + +|308 Click and enter a Filename for received +and sent Data. On next program start Data +will be read to RAM and have same state as +at program termination. The logfile may be +deleted, renamed, changed any time even if it +is write enabled. A given File Path is used +for watch-call and manual saved Logs too. +Append %d for daywise logfile. "logs/rawlog%d" + +|309 Days Keep (dayly) Rawdata Logfiles. Purge +starts on Program start and Midnight. +0 Days is forever. Make dayly files +with %d at end of Logfilename like +"logs/rawlog%d" + +|400 List Objects/Items +for highlighting keywords +enter word in Tools / Find +|401 List Objects/Items decoded +entries may be sorted by Call or Time +click on a Line shows position on map + +|405 List Weather Stations +for highlighting keyword +enter word in Tools / Find +|406 List Weather Stations decoded +entries may be sorted by Call or Time +click on a Line shows position on map + +|410 List Moveing Beacons +for highlighting keyword +enter word in Tools / Find +|411 List Moveing Beacons decoded +entries may be sorted by Call or Time +click on a Line shows position on map + +|415 List Stations sending no Position +for highlighting keyword +enter word in Tools / Find +|416 List Stations sending no Position decoded +entries may be sorted by Call or Time + +|420 Toggle Net Data off/raw/decoded +|421 Toggle Rf Port1 Data off/raw/decoded +|422 Toggle Rf Port2 Data off/raw/decoded +|423 Toggle Rf Port3 Data off/raw/decoded +|424 Toggle Rf Port4 Data off/raw/decoded +|425 Open Monitor Window for watching in/out +going Frames. +If a line contains a position, a click on +the line shows position on map. +For highlighting keyword, enter word in +Tools / Find or "F". +Srolling stops if text is not on top or +bottom. +"u" key for quick toggle window on/off. +Clr clears content. +Use cursor keys and copy/paste(out) + +|430 List Messages +|435 List Bulletins +|440 Show program internal infos + + +|500 Find Object/Call and Zoom to or Enter +QTH-Locator to see its Area on Map or +Enter Lat/Long to set a Marker on Map +(Shortcut F) + +|505 Animation start Time is when first Object begins +to move, Stop when last stops, change Speed by +Menu with Leftclick to Map, "no move phases" +are automatic shortened by larger timesteps. +Modify Start time with "Time full Bright" Knob +(Shortcut a) + +|515 Remove Marker 1 and 2, the Measure +Line and QTH Locator Area + +|517 toggle radio link calculation on/off + +|518 Enter antenna 1 and 2 over ground in meters and +frequency and if altitude datafile (srtm) is +avaliable, a radio link will be calculated +between marker 1 and marker 2. Blue is free +sight, green fresnelzone is touched, yellow +half fresnelzone till red for whole fresnelzone +shaped. + +|522 Show Maps with selected Data like Wx-Maps or +choose a Symbol and show Stations with this. +Use TAB-Key to toggle 2 Map Views. + +|535 Manage Sent Messages (Shortcut M) + +|536 Enter Root directory path of Map-Cache +where the Map Downoad Task writes Map +Files into or where You have a set of +downloaded Maps + +|538 Manage Map Types. +The Lines are typnames like "tiles_topo -128" +the optional value is a brightness correction +(range -255 to 255), darker with - values. +The names use subdirectories in "map directory" +and are passed to the map downloader where URLs +to the names are associated. First entry is used +at program start. Sort entries by "Edit" and "Add". +Use first 3 lines by shortcut "7" "8" "9" else +"Tools > Choose Map" + +|540 Choose Maptype, Reload Map You see +or Prepare offline Map Collections + +|545 Listings + +|550 Config what to do when Click +on Symbols/Text/Tracks + +|555 Switch off Static Toolbar and +Open as Popup on Click to Map + +|560 List Shortcuts + +|565 Preferences + +|570 Files Stuff and Quit + +|575 Switch on Static Toolbar + +|700 Define Area and Resolution for Downloading +a Complete OSM Map Collection for Offline usage. +Higher Zoom gives more Details but Storage/Network +consumption is 4x every next Level. +Level 13 for outside Town Streets +15 inside Town, 16 Houses, Oneways.... + +|701 Reload the Map-part You see. +Do if newer maps may be avaliable +or something is wrong. +If download failes, the +old Maps will come back + +|710 Shortcut "7" "8" "9" are last 3 Lines +Last Line will be used at Program Start +Move Lines to bottom in "Add Maptypes" with +"Edit" and "Add" + +|900 What to do on a Click to Map +"Center" if You prefere Map movement + by Centering clicked Point +"Clear Menus" to get rid of this junk + ESC key Clears too + +|901 What to do on a Click to Text +"Heard" for Igates +"Set Marker 2" if Marker 1 +set by Symbol Click for +fast distance measurements + +|902 What to do on a Click to (not WX) Symbol +"Raw+Decoded" for Text Info +"Set Marker 1" for measurements + +|903 You may enable as many WX graphics +as fit into Your Window + +|904 What to do on a Click to Track +"Zoom to" does good job +"Raw+Decoded" for debug + +|905 What to do on Mouse Over middle of Symbol + +|1001 Center Clicked Point of Map +Disables click to Symbols, Text and Tracks + +|1006 On click to (empty) map set marker 1 +with pressed SHIFT set marker 2 and +if enabled do radio link calculations +Disables click to Symbols, Text and Tracks + +|1011 On click to (empty) map set marker 2 +and if enabled do radio link calculations. +With pressed SHIFT set marker 1 +Disables click to Symbols, Text and Tracks + +|1016 On first click to (empty) map set marker 1 +next clicks set marker 2 and if enabled +do radio link calculations. To set marker +1 again clear markers (shortcut ":") +Disables click to Symbols, Text and Tracks + +|1021 On click to (empty) map Open Tools Menu + +|1025 Enable click to Symbols, Text and Tracks + +|1026 On click to (empty) map clear menues +(shortcut Esc) +Enable click to Symbols, Text and Tracks + +|1152 Show Decoded and Raw Data +on Mouse Over Wx Symbol + +|1153 Show Luminosity over Time +on Mouse Over Wx Symbol + +|1154 Show Rain over Time +on Mouse Over Wx Symbol + +|1155 Show Wind Direction over Time +on Mouse Over Wx Symbol + +|1156 Show Wind Speed over Time +on Mouse Over Wx Symbol + +|1157 Show Humidity over Time +on Mouse Over Wx Symbol + +|1158 Show Pressure over Time +on Mouse Over Wx Symbol + +|1159 Show Temperature over Time +on Mouse Over Wx Symbol +|1160 Swith off Mouse Over + + + +|1310 Show driving speed over time as data +avaliable, out of sense values are not shown + +|1311 Show Altitude over km + +|1312 Pop up a Menu for actions with this Object + +|1400 Show info to Waypoint or Beacon and go back in time + +|1401 Toggle show All or Waypoints with Error Flags + +|1402 Show info to Waypoint or Beacon and go forward in time + +|1405 List raw Data of this User +on the Monitor text Window + +|1406 List raw and decoded Data of this User +on the Monitor text Window + +|1407 Set Marker 1 with Objects last Position +|1408 Set Marker 2 with Objects last Position + + +|1410 If info avaliable show a Speed over Time Diagramm +Trackfilter on/off may repair wrong values +or manual delete wrong waypoints before. +The Cursor line shows a marked waypoint. + +|1415 Sum driven Distance and if info avaliable, +show an Altitude over Distance Diagramm. +Trackfilter on/off may repair wrong values +or manual delete wrong waypoints before. +The Cursor line shows a marked waypoint. +If Altitude Data avaliable, the Ground +Level is shown too in brown. + +|1420 Count Beacons and view it in a Histogramm + +|1425 Write (or Append if exists) Track and +all Info to this Call to a file with +name of the Call and so may be viewed +later by Importing the logfile. + +|1430 Switch off watching this Call. +May be enabled again in Configs Watchlist +or another hit to this Button + +|1435 Append this User to Watchlist to get +a Popup Window with a Message if the +User is active. More Actions may be +switched in Config, Watch Calls. +Next Hit to this Button will switch +off watching this Call. + +|1438 Show Objects of this Sender on Map + +|1440 Delete the first Waypoint nearest to Click +continued Hits to this Button deletes +Waypoints with error markers. If clicked +to Symbol or Text the whole User will be +deleted (only in RAM not in Logfile) + +|1445 Cycle through avaliable Track Colours incl Invisable + +|1450 Count Sent Messages, Acks, Rejects in Fullbright Time +If one or more Messages click to view + + + + + +|1501 Brightness of Objects/Items. This are things +not transmitting at this position but set there +from another Station. Dimm to 0 to switch off. + +|1503 Dimm to 1% to show waypoints only + +|1504 Fit image output to Your Monitor, +normal value is 2.2, this does not +affect Screenshot or Video function + +|1506 Text at Symbols on map not in menues +Item/Object Text may be dimmed additional +Toggle on/off with "L" shortcut + +|1507 This are the white dots in tracks with +transmitted position joined by track lines + +|1508 Remove timed out Things from Image, +maximum Time and keep Data in RAM until +"Data im RAM" in Config/Timers + +|1509 Give Objects/Tracks time to dissapear +after "Full Bright Time" + +|1700 AprsIs Connect Status +Leftclick to Start/Stop Connection. +Shift-Leftclick to quick Config. +No Data Flow: red +Data Sent: yellow +Data Received: green +Full Configure in Config, Online +Raw Data in Tools, List, Monitor + +|1701 UDP Port 1 Status +Switch AXUDP Interface to +TNC or Soundmodem on/off. +Shift-Leftclick to Config. +Data sent: yellow +Data received: green +Idle: red +Configure in Config, Rf-Ports +Raw Data in Tools, List, Monitor + +|1702 UDP Port 2 Status +Switch AXUDP Interface to +TNC or Soundmodem on/off +Shift-Leftclick to Config. +Data sent: yellow +Data received: green +Idle: red +Configure in Config, Rf-Ports +Raw Data in Tools, List, Monitor + +|1703 UDP Port 3 Status +Switch AXUDP Interface to +TNC or Soundmodem on/off +Shift-Leftclick to Config. +Data sent: yellow +Data received: green +Idle: red +Configure in Config, Rf-Ports +Raw Data in Tools, List, Monitor + +|1704 UDP Port 4 Status +Switch AXUDP Interface to +TNC or Soundmodem on/off +Shift-Leftclick to Config. +Data sent: yellow +Data received: green +Idle: red +Configure in Config, Rf-Ports +Raw Data in Tools, List, Monitor + +|1705 (End) Viewing data from logfile + +|1706 (View) stored Messages +Shift-Leftclick or "M" to Compose Message + +|1707 Red: Expanded parts of Map on Screen +Green: allow Expand else Expand off +"E" Download enabled, "D" Download Task Runs +"e" or "d" Download off, toggle with "d"-Key +Shift-Leftclick to Config + +|1708 Trackfilter on/off "f" + +|1709 Show Objects on/off "o" + +|1710 Exit this Map Option + +|1800 path and filename, %t inserts time, %n is 000..999 +.bmp at end writes filetype BMP else PPM + + +|1900 Animation Speed, 1 is Realtime if played with 25Hz +This Value is used for Generating a Video File too +|1905 Stop Animation +|1910 Go On Animation with new Speed + + + +|1990 Enter Call (with ? Wildcard and * for rest +"oe?xbl*") or Locator "jn68pc". If no wildcards, +it is case sensitive and needs full word length. +or lat/long ddmm.mm dddmm.mm "4806.09N 01318.67E" +or lat/long ddmm.mmm dddmm.mmm "4806.091N 01318.676E" +or lat/long (-)d.ddddd (-)d.ddddd "48.71 -13.967" +In File "poi.txt" (in osm-directory) Repeat Find +to step through matches "g?iss*". +Cursor up/down steps thru 10 lines of History. + +|2101 Police, Sheriff +|2102 Reserved (Had Been Rain) +|2103 DIGI (White Center) +|2104 Phone +|2105 DX Cluster +|2106 HF Gateway +|2107 Aircraft (Small) +|2109 Available (Was Mic-Rptr Moved to /M) +|2110 Snowmobile +|2111 Red Cross +|2112 Reverse L Shape +|2113 House QTH (VHF) +|2114 X +|2115 Dot +|2116 0 Numbered Circle +|2117 1 Numbered Circle +|2118 2 Numbered Circle +|2119 3 Numbered Circle +|2120 4 Numbered Circle +|2121 5 Numbered Circle +|2122 6 Numbered Circle +|2123 7 Numbered Circle +|2124 8 Numbered Circle +|2125 9 Numbered Circle +|2126 Fire +|2127 Campground +|2128 Motorcycle +|2129 Railroad Engine +|2130 Car +|2131 Server For Files +|2132 HC Future Predict +|2133 Aid Station +|2134 BBS +|2135 Canoe +|2137 Eyeball +|2139 Grid Square (6 Digits) +|2140 Hotel (Blue Bed Symbol) +|2141 TCP-IP +|2143 School +|2144 Available +|2145 MacAPRS +|2146 NTS Station +|2147 Balloon +|2148 Police +|2149 T.B.D. +|2150 Recreational Vehicle +|2151 Shuttle +|2152 SSTV +|2153 Bus +|2154 ATV +|2155 National Weather Service Site +|2156 Helicopter +|2157 Yacht (Sail) +|2158 WinAPRS +|2159 Jogger +|2160 Triangle (DF) +|2161 PBBS +|2162 Large Aircraft +|2163 Weather Station (Blue) +|2164 Dish Antenna +|2165 Ambulance +|2166 Bike +|2167 T.B.D. +|2168 Dual Garage (Fire Department) +|2169 Horse (Equestrian) +|2170 Firetruck +|2171 Glider +|2172 Hospital +|2173 IOTA (Islands On The Air) +|2174 Jeep +|2175 Truck +|2176 Available +|2177 Mic-Repeater +|2178 Node +|2179 EOC +|2180 Rover (Puppy) +|2181 Grid SQ Shown Above 128 Miles +|2182 Antenna +|2183 Ship (Power Boat) +|2184 Truck Stop +|2185 Truck (18 Wheeler) +|2186 Van +|2187 Water Station +|2188 xAPRS (UNIX) +|2189 Yagi At QTH + +|2197 Emergency (!) +|2198 Rain +|2199 Numbered Star (Green) +|2200 Bank or ATM (Green Box) + +|2202 Numbered Diamond +|2203 Crash Site +|2204 Cloudy + +|2206 Snow +|2207 Church +|2220 HAMNET + + + +|2212 Numbered Circle + + + + + + + + +|2221 Gas Station (Blue Pump) +|2222 Hail +|2223 Park/Picnic +|2224 Advisory + +|2226 Numbered Car +|2227 Info Kiosk (Blue Box With ? In It) +|2228 Hurricane +|2229 Numbered Box +|2230 Blowing Snow +|2231 Coast Guard +|2232 Drizzle +|2233 Smoke +|2234 Freezing Rain +|2235 Snow Shower +|2236 Haze +|2237 Rain Shower +|2238 Lightening + +|2240 Lighthouse + +|2242 Navigation Buoy + +|2244 Parking +|2245 Quake +|2246 Restaurant +|2247 Satellite/Pacsat +|2248 Thunderstorm +|2249 Sunny +|2250 Vortac Nav Aid +|2251 Nws Site And W-R DIGI (Green) +|2252 Pharmacy Rx + + +|2255 Wall Cloud + + +|2258 Numbered Aircraft +|2259 WX And W-R DIGI (Green) +|2260 Rain + +|2262 Blowing Dust/Sand + +|2264 DX Spot By Callsign +|2265 Sleet +|2266 Funnel Cloud +|2267 Gale Flags +|2268 Ham Store + +|2270 Construction (Steam Shovel) + +|2272 Area Locations (Box,Circles,Etc) +|2273 Digit Display +|2274 Numbered Triangle +|2275 Small Circle +|2276 Partly Cloudy + +|2278 Restrooms +|2279 Numbered Ship/Boat (Top View) +|2280 Tornado +|2281 Numbered Truck +|2282 Numbered Van +|2283 Flooding + + + +|2287 Fog + +|2289 Diamond (Open With Dot In Center) + + + + + +|2300 Stop map download, download may be continued +later + +|2301 Enter Zoomlevel 1..18 and calculate quantity +of map parts to be downloaded for a complete map with +all zoomlevels for the visable area. Start with lower +levels until testing of having map parts takes a while. +If value fits, press download button by moveing mouse +not over other menus. To stop download press this button +again, download may be continued any time later. + + +|5801 If sound is working and configured in +Config/Map moving/Sound a Bell will +ring on new Data of this Object + +|5802 If not in single Object mode, the Map +will be moved to Focus the Object as +near to Center as configured in +Config/Map moving/Center Watchcall + +|5803 New Data of this Object will be Appended +to a file with Name of this Object + +|5804 Size of Log and Click to Delete +does not work with Wildcards + +|5805 Edit the Call of this Object + +|5806 Remove this Call from Watchlist + +|6700 Importing a "Time Fullbright"-Intervall Logfile +beginning with this Date/Time. Received actual +Data is stored to memory and writelog and is +displayed again on "Exit Logview" + +|6705 Find Call in Logfile, exact match, +and import it. Works only with dayly Log + +|6710 Read data from this path/filename. +The format is Timestamp "yyyymmdd:hhmmss " in utc +followed by AprsIs Line. The data is sorted at +import by Time, indexed and all waypoints compared +to each other for removing dupes and stored in +compressed form in RAM. Append %d to filename +for dayly logs. + +|6715 +|6716 Reload Data from Writelog +|6720 Go to Realtime Mode +|6721 Reload Data from Writelog + +|6730 Go to Start of Logfile +|6731 Go "Time Fullbright" back in Logfile +|6732 Load beginning from Start Date a "Time Fullbright" Intervall +|6733 Go "Time Fullbright" forward in Logfile +|6734 Go to End of Logfile + + +|6800 Send Message with Acknowledge, If +Message arrived Destination, "AckTime" +will get filled. On TCP, the Msg is sent +once and, if not acked, resent as the next +Beacon of the Destination arrives. +Modern Igates, gating msg to Rf, will +take care of efficient resening to mobile +destinations. + +|6801 Send Message with no Acknowledge. +Used for Querys like "?APRSH" "?HELP" +sent to Igates. The Msg is sent one time +and may be resent manual with "Kick" Button +"BLN1" to "BLN9" as [To Call] for sending +Bulletins to everyone + +|6802 Reopen with Shift-Click to "M" button +or "M"-Shortcut or Tools / Send Message + +|6804 A Message Line if Dimmed it is Done +if --:--:-- in Acktime it is not Acked +if Red Acktime, a later Message to same +User will not be sent until this Line +is acked deleted or switched to "Hold" +"Ret" is the retry Counter +"AckTxt" an automatic generated unique +Code to be sent back for ack + + +|6810 Message Text up to 67 Char. +If Beacon Editor "B" is open too, +an "Item Message" line will be +copied to send Item as Message + +|6815 Destination Call with SSID +(most in Capital Letters) +BLN1 to BLN9 for sending +Bulletins (send as Query) + +|6820 Send Message (if connected) to Net and +first for tx enabled Rf Port. If You +have more than 1 open Port, select the +Port to send NEXT Msg. +To change Port for a pending Msg, klick +to Port and then to "Set Port" at the +Stored Msg Line's Pulldown menu + +|6821 Send Message to Net +Messages to Net are sent immediately +1 time and, if not acked, resent again +when a beacon of the destination is +received. +To change Port for a Pending Msg, klick +to Port and then to "Set Port" at the +Stored Msg Line's Pulldown menu + +|6822 Send Message to Radio Port 1 +To change Port for a Pending Msg, klick +to Port and then to "Set Port" at the +Stored Msg Line's Pulldown menu. +Msgs (with ack) on Rf Ports are resent +in increasing interval until ack'ed or +deleted or holded + +|6823 Send Message to Radio Port 2 +To change Port for a Pending Msg, klick +to Port and then to "Set Port" at the +Stored Msg Line's Pulldown menu + +|6824 Send Message to Radio Port 3 +To change Port for a Pending Msg, klick +to Port and then to "Set Port" at the +Stored Msg Line's Pulldown menu + +|6825 Send Message to Radio Port 4 +To change Port for a Pending Msg, klick +to Port and then to "Set Port" at the +Stored Msg Line's Pulldown menu + +|6905 Delete this Message + +|6904 Send this Message once now + +|6903 Reset Send Timer and Counter + +|6902 Do not go on (re)sending Message +until Kick or Restart + +|6901 First set the (blue) Button to a Port +then klick this Button to redirect Msg + +|6900 Edit the Message and requeue + +|7000 Toggle automatic Save of Config at +Program Quit + +|7001 Save Config now + +|7005 Import aprsmap.cfg (Loosing all Entries not Saved before) +empty srtm-cache and reimport poi.txt and mypoi.txt Data + +|7010 Enter Calls You want to be told if +they are active. If new Data arrive +from this user the enabled action will +occur. A * at end is wildcard + + +|7015 Filter out unwanted things +by name, object owner, igate or comment +(no wildcards yet and exact case match) + +|7020 How to Move/Zoom Maps and what to +do if they are not downloaded yet + +|7025 For Things Drawn on the Map + +|7030 except Rf Beacon Times they +are at each Beacon entry + +|7035 Configure Radio Ports + +|7040 Things we need to get Online +and some are usefull for Rf +Beacons too + +|7043 Menus fore/background, Font Size and Colour +Radio-Range and Reliefmap Colours + +|7045 Quick Config Timers/Brightness/Map + +|7300 Filter out Destination Call often +used as sender software identifier + +|7303 Filter out frames with Keyword +anywhere in the raw frame + +|7305 Filter out data with keyword in Comment +from polluteing the Map. Data is stored +in logfile for reimport with filter off + +|7310 Filter out Objects from source + +|7315 Filter out all received from Igate + +|7320 Filter out Object/Call seen on Map +* is wildcard + +|7400 Enter Your Callsign, it is not necessary +to receive data from servers but would +be nice to show the makers of servers +who is online. If You run more active +Aprs tools, each should have a different +SSID at Your Call like -1 -2 ... + + +|7405 If You want overay Symbols Choose the +Symbol and then click to edit and change +the \ to the desired overlay character + +|7406 choose a Symbol on the +Table and click to enter + +|7410 Click to open Editor, Move and Zoom Map +(zoomlevel 15 or more) to Your Position +and Shift-Leftclick to the Map. You get +a Position that may be Edited before Add. +Do not move delete or add characters. + +|7415 Net Beacon needs only the Comment like +Name, QRV on 145.500Mhz + +\\h \\z \\v \\ for inserting time, +program version or a file +\\!wx.csv,,,t,,,,,h,b,r,w,d,,,,,g! + insert wx values from csv file + filename t=temp h=hygro b=baro g=gust(km/h) + w=wind(km/h) d=winddir L=lum r=rain1h(mm) + P=rain24h(mm) p=raintoday(mm) + use ,w3.6, multiplier if given in m/s + + +|7420 Enter a valid Passcode and enable +"Allow Tx to Net" if You want +to send Data to AprsIs Network +(beacons/objects/messages/acks) + +|7425 enter AprsIs-Server-URLs like +"nuremberg.aprs2.net:14580" or +IP-number and if not default +port 14580 append ":port". +IF more Servers are entered and +enabled they will be tried until +one is working. + + +|7430 Enter a filter for receive data from AprsIs Network +m/200 or center/radius or a lot of call filters are possible + +|7435 Enable or Disable Connection to AprsIs Network + +|7440 Sending Net Beacons or Send and Ack Messages +makes only sense with a valid passcode. +With a "m/..." Serverfilter your Position +should be sent to the Server even without +a valid passcode to tell the Server Your +Position. Without a valid Passcode the +Data will not go to the World + +|7445 Enable Igate +In Win version works only with Servers with ping-pong +protocoll extension (udpgate) due to TCP-System +is not able to report DELAY time on transmission +and can not stop a delaying link without trying to +send the timed out Data, known as "sending data into +a hole in wall problem". This would draw disrupted- +and ghost-tracks on Maps. + +|7446 Choose Rf-Ports to be gated to +Internet if gateing is Enabled + +|7500 Enable/Disable Rf Port 1 + +|7501 Enter an UDP-IP-number with Port +Pair to Send and Receive Data from +a (kiss/smack) TNC (with udpflex as +interface) or a Soundmodem. +127.0.0.1:9001:9002 with IP:tx:rx +a 0 port will disable this direction. +If not want to Listen to other IP-numbers +as send to, write tx/rx instead of tx:rx +No ip number for same computer ":9001:9002" +An optional Port Name may be appended + +|7505 Same as Port 1 +|7506 Same as Port 1 +|7510 Same as Port 1 +|7511 Same as Port 1 +|7515 Same as Port 1 +|7516 Same as Port 1 + +|7520 Start/Stop Serial Interface/Soundmodem Task +|7521 Enter Name and Parameters of a Program for interface +UDP ports to Serial Ports or Soundmodem. +example (unix/win): (or use a ".BAT" file for more ports) + +tnc2/tf/smack: + udpflex.exe -U 127.0.0.1:9002:9001 -k -s -t com1:9600 + +tmd710/th-d72/kiss/USB: + udpflex.exe -U :9002:9001 -i kiss.txt -u -t com3:9600 + +dire-wolf soundmodem: + udpflex.exe -U :9002:9001 -T : + +example (unix): + afskmodem -f 22050 -C 0 -p /dev/ttyS0 0 -M 0 -U 127.0.0.1:9002:9001 -m 0 + +try the line before in a dos-terminal with -h or -v option + +|7525 Same as Serial 1 +|7526 Same as Serial 1 +example (win) Your GPS to Map: (see more options gps2aprs -h) + gps2aprs.exe -t com1:4800 -I OE0AAA -D -0 30 -b 2 -r 127.0.0.1:9002 + +|7530 If enabled, all frames with not a valid +"callsign" as sender will be discarded +Also used as not-call-Beacon Send warning. +|7531 If enabled, all frames with not a valid +"callsign" as sender will be discarded +Also used as not-call-Beacon Send warning. + +|7535 Switch On/Off showing a Ticker Headline +of received and sent Callsigns + +|7536 Number of shown Callsigns in Window Title +0 show new Calls only, 1 call with time. + +Linux hint:Some Windowmakers seem to not +free memory of old headline entries so, +if RAM is small, use 0 or option off. + +|7537 Configure Rf to Rf Digipeating + +|7540 Beacon/Object editor + +|7545 If two Beacons (especially with same Text) are +sent in that Time Igate delete dupes (57s), You +will never see the Beacon in AprsIs Network +even if sent on different Frequecys. +To avoid this, the Shift Time is used +to spread Transmissions over the Time. + +|7550 What to do if a Message or Query arrives +and config reply/send message Path + +|7695 Enable/Disable the Line. Disabled lines do +nothing but wait for being reenable later + +|7696 Delete Line, the text is copied to +edit line for changes and Add + +|7706 Enter beacon time in seconds (600 is widely used) +or 0 to send Netbeacon only at start of connection. +Sending 1 Netbeacon makes sense even with no +Passcode to tell the Server Your position +for usage of m/... filters + +|7701 Minutes to Hold Objects and Items in RAM then Purge +except with WX-Data to have fulltime WX-Graphs + +|7700 Minutes hold any Data in RAM then Purge +This is the maximum "Show Fullbright" Time too + +|7705 Minutes Show Symbols and Tracks on Screen + +|7704 Minutes Fading out Symbols and Tracks +after Full Bright Time on Screen + +|7703 Seconds Show km/h after last move + +|7702 Minutes back from now try to detect +double received waypoints and filter +out if Trackfilter is enabled + +|7707 Initial animation speed in multiples +of realtime if played with 25hz +change by click to map + +|7708 delay in animation/video before +speedup if no one moves + +|7709 Shift System Time by up to +-24h in +shown times. Log times are not affected. + +|7745 After moving and zooming the Map, wait this +Time befor starting missing Map Download if +not want to Load fine zoomed strips along a +Map moving way. + +|7860 If enabled show Lat/Long and QTH-Locator of +Mouse Position, Distance and Direction to +Marker 1 and if File "poi.txt" in osm-directory +contains info to this position, it will be shown +Toggle with "p" + +|7861 On Mouse-Over, from this Zoomlevel or higher, +show Point-of-Interest Content from files +poi.txt and mypoi.txt. On/off with "p". +Hint: "Config > Reload Config" (re)reads +this files after changes. +Press "Save Config" before. + +|7855 Enable Trackfilter to remove possibly wrong waypoints +of tracks. This does not affect stored data. + +|7850 If enabled, missing map-parts are tried to be +downloaded by writing "gettiles" file. A task +that reads this file may get the parts of map +from internet in background. What arrives +within 30s will be updated on screen otherwise +updates by next activity in map + +|7851 Program Name and Parameters to be started +if Map Download is requested. The Program +reads "gettiles" file, loads maps and if +done, deletes "gettiles" file. + +|7845 Show a Scaler on the map. A small +Zoomlevel would distort distances +so Scaler will not be shown. + +|7840 If enabled, and data avaliable, +show a driving direction arrow. + +|7835 If enabled, and data avaliable, +show a windvane at WX-Symbols + +|7830 If enabled, and data avaliable, +show Temperature + +|7825 If enabled, and data avaliable, +show driving speed + +|7826 edit text for driving speed "km/h" +or shorter "km" to save place on map + +|7820 if data avaliable and above this +value, show higth in m + +|7815 Brightness of notmovers if dimm notmovers (m) is on + +|7810 Use only if You have missconfigured +Image Parameters and dont find way back +IF cannot read this :-) use shortcut ctrl-L + +|7945 Zoom steps for Shift-Click to +- or mouse-wheel +negative value inverts mouse-wheel or multitouch zoom + +|7940 Map move step width + +|7935 Limit Zoom Level to avoid download +of maps with no more infos on + +|7930 Limit zoomlevel for autozoom to +small objects to avoid download +of maps not really needed + +|7925 % of screen to center hold watched objects in +0: the object moves to margin before map is shifted +100: the object is alway centered + +|7920 window size used on next program start +updated as window size is changed + +|7917 Design and switch on/off event sounds + +|7915 "move Map" or "move Window over Map" +according to Cursor Key Arrows + +|7910 If a part of Map is not in the Map-Cache, allow to +double size of yet avaliable lower resolution part until +the part is loaded from a Map server. You will see a +red Button during this Mode + +|7905 If a selected object gets to be zoomed to +fit in screen, zooming is done as far as +Maps in full resolution are in Cache else +You get a black map and, if enabled, +download starts + +|7900 Enable to get a message if an object +approaches and is in the configured +radius. A file "proxwarn" contains call +an distance for an external program + +|7901 Enter Radius for Approxymation Message +If a Station moves toward You, a File +"proxwarn" will be generated with Call +and Distance for a Speech Program + +|8010 Toggle Approximation Sound On/Off +|8011 Approximation Sound (in Hz and milliseconds) +first value pair at entering configured Warn Radius, +changing to second pair until zero distance to You + +|8015 Toggle Watchcall Sound On/Off +|8016 Watchcall Sound (in Hz and milliseconds) + +|8020 Toggle Message Sound On/Off +|8021 Message Sound (in Hz and milliseconds) +first value pair for receiving new Message +second pair for acknowledged a sent Message + +|8100 Append edited Beacon to the Schedule Table. +Objects/Items with same Name will be deleted. +To start Beaconing by timer, enable the line +with On/Off-button. + +|8101 Draw on local Map for testing. Hold Shift +and click to Map to change Position. Delete +on Map with click to symbol and DEL-Key. + +|8102 Send edited Beacon immediately to Rf or +Net Port as configured. Use for sending +"Delete Objects" one time on Net + +|8103 Cancel edit window to see more Lines +of Schedule Table. + +|8104 Exit Beacon editor + +|8110 Make default (mostly empty) edit Lines +With click to a Symbol on map the Data +will be cloned and may be edited to make +your own beacon out of. +|8111 Close Beacon editor + +|8115 For "Beacons" this should be one of your +Calls + ssid. The Position is fixed as +configured in Config > Online > My Position +For Items an Objects this is the Name +seen by the Symbol on Map. This need not +be a Callsign. + +|8120 Position for Items and Objects in DDMM.MMM +or D.DDDDD or :File containing Position or +simply hold SHIFT Key and click on the Map. +To quick reposit Objects: "B" to open Beacon +Editor, Click to Symbol on Map, "DEL" to remove, +SHIFT-Click to new position, "Draw" or "Send" + +|8122 Text with Macros +\\z insert day of month and time DDHHMMz +\\h insert time HHMMSSz +\\ insert file (with Weather Data) +\\[filename] insert file and delete after tx +\\!wx.csv,,,t,,,,,h,b,r,w,d,,,,,g! + insert wx values from csv file + filename t=temp h=hygro b=baro g=gust(km/h) + w=wind(km/h) d=winddir L=lum r=rain1h(mm) + P=rain24h(mm) p=raintoday(mm) + use ,w3.6, multiplier if given in m/s +\\v insert program version +\\l insert position +\\\ insert \\ + + +|8124 Time between 2 beacons in Seconds. +Additional each Beacon in scheduler is shifted +from each other by +Config > Rf-Ports > Beacon Shift Time +because same beacons will be deleted by Igates +if seen before at less than 27s to 1 minute. +If sending beacons to Net and same time to rf, +you will never see who received it. + +|8126 Radio Path, like WIDE2-2 or, if the Digis +in Your area are configured correct, simpley +use -1 or -2 which will be appended to the +Destination Call to do same es WIDE but with +zero bytes overhead. + +|8128 Enter Altitude in m over NN or negative +for below. Only positive values in +Commpressed Mode. This will take some +Bytes more except in Compressed Mode +with no speed/direction. + +|8130 Speed in km/h + +|8132 Course in 0..359 degrees + +|8134 Choose Symbol and if You know what +You do enter overlay Symbols here. + +|8136 Destination "Call" is generated automatic +in Mic-e Mode else is used as hint to which +hard/software is used. If desired, Append a +SSID in "Via Path" like "-1". + +|8138 Click at a Symbol in the Thumbnail Picture + +|8140 Set Type "Beacon", to send Symbol and Info +with your Position and Call with SSID. The +Symbol has the Call as Label and possibly +Altitute and Speed or Wx Data. + +|8141 Set Type "Object" with HHMMSS Timestamp. +Send Object to set Symbol and object Name +to other as your Position. The Symbol shows +the Object Name (need not be a Callsign) as +label. + +|8142 Set Type "Object" with DDHHMM Timestamp. + +|8143 Set Type "Item". This is like "Object" +but witout Timestamp and needs less bytes +with short Name and compressed position. +On Rf prefer this if no Time info needed. +If Message editor (M) is open, a Copy of +the Item will be ready to transmit as Item +Message. + +|8144 Set Type "Delete Item". This wipes out +Items with This Name on all Maps. +Important: Tx only once on Net or manual +a view times on Rf Ports. + +|8145 Set Type "Delete Object". Depending on +Viewer should delete Items too. + +|8150 Send normal DDMM.MM format, long, only +18m resolution but man-readable. May +be extendet with DAO to 20cm resolution +with "Lat/Long+" and 5 bytes more. + +|8151 Send Mic-e format, this is compressed to +minimal size with 18m resolution and no +extra bytes for speed and course. May +contain not-printable characters so be +carefull by copy/edit raw data. May be +extendet with DAO to 20cm resolution +with "Mic-e+" and 5 Bytes more. + +For Objects and Items enable Multiline Editing +Shift + Leftclick or "x" on Map to Add Lines. +When first Line is entered a "fine configure" +Submenue will Open. Switch to "Lat/Long" to +reposit whole Object with Shift Click or "x" + + +|8152 Send "Compressed" format, this is fixed size +and may contain speed/course OR (positive) +altitude but not both. If needs both, the +long /A=...... extention will be appended. +Resolution is 30cm + +|8153 Same as "Lat/Long" but with DAO extention +if you need finer resolution than 18m. + +|8154 Same as "Mic-e" but with DAO extention +if you need finer resolution than 18m. + +|8160 Sent Beacon to AprsIs on TCPIP Net. +"Via Path" is not needed here. +|8161 Send Beacon to Radio Port 1 as configured +and enabled in "Config > Rf-Ports" +|8162 Send Beacon to Radio Port 2 as configured +and enabled in "Config > Rf-Ports" +|8163 Send Beacon to Radio Port 3 as configured +and enabled in "Config > Rf-Ports" +|8164 Send Beacon to Radio Port 4 as configured +and enabled in "Config > Rf-Ports" + + + +|8170 Port:Time:rawtext +Yellow Field is a "delete object" so if sent +i will wipe out the object/item on all maps. +Red Field contains any error and should not +be transmitted. +Dimmed Text is if line is opened in editor. +Green Dot makes beacon active, toggle with +On/off + +|8180 Move this Beacon to Editor +|8182 Send this Beacon once immediately +|8184 Send this Beacon to local View on Map +Delete on Map with click to symbol and +DEL-Key. +|8186 Raw Line Edit (not implemented now) +|8188 Delete Beacon +|8190 Copy this Beacon to Editor +|8192 Toggle On/Off Switch of this Beacon +Important: Check repeat Time to avoid +too much Tx, 3600s for static Beacons +1200s to 1800s for Wx on Rf Ports. + +|8200 Enter Keywords : and what to reply if a Query arrives +?VER:VERSION \\v \\v inserts Version +?APRST:PATH= \\p \\p inserts Path of Sender +?APRSP:\\l \\l inserts Lat/Long +TALK:\\>filename Time \\h sends a File and Time +?HELP:?VER,?APRST,?APRSP,TALK,?WX + +|8205 if stay on Rf use "RFONLY" or "NOGATE" else the +software-ID "APLM01" or some other valid string. +On Net always software-ID is used. + +|8210 Empty string for direkt +number for SSID-Routing "2" makes -2 to destination call +or some old chunk like "RELAY" "WIDE"... + +|8215 Toggle big/small popup window if a msg arrives +|8220 Show (not ack) Messages to My Call but other SSID too +|8225 Show Messages from/to same Call and +same SSID (Telemetry Headlines) + + + + + +|8305 Make a new Digi. If same Line does not exist +yet, a new Line will be stored. Adjust +in/out-port and behavior at the stored +Line. Every digi Line does digipeating +from one input port (rx) to output port +(tx). This may be same port or another +(crossband digi). More Lines may share +same input and output port, the Dupe +-filter, sitting on output port eliminates +automatic double transmissions of same +content. It is also possible to have more +Rx sending UDP to one input port, eg. +listening soundmodems every 50hz on SW +or more Rx for Antenna-Diversity. + +|8306 Store Digi Line at the place where +clicked "Edit" before (dimmed Line). + +|8310 Enter Words/Calls that should not be +digipeated if in source/destination +or via-Field like "NOCALL". " +in the "done" via path is always +filtert out because it was repeated +by You just before. +"i" excludes from digipeating +in the active path. +"-" switches off the powerfull SSID +-Routing. This should only be done in +a crossband Digi from SW to VHF because +on SW the "NOGATE" and "RFONLY" +-Mechanism is (still) working but not +so on VHF. Some misconfigured igates +may copy Your digipeated SW-data to +Internet. (SSID-Routing is done by +SSID on Destination Call 1..7) + + +|8315 Enter Words for Digipeating with the +N-n Mode, for Example "WIDE". A +"WIDE2-2" in the next active "via" +will be replaced by "*,WIDE2-1". +A "WIDE2-1" migrates to "*". +"WIDE2" will not be digipeated here +but may be part of "Via Alias" Line. +"TRACE", "WIDE" or what else will be +treated same way because +is always appended to (done) Path. + +For gate Net-to-Rf this line contains +max. Bit/s and optional VIA path like +"20 WIDE1-1" negative Bit/s will only +gate Messages to on send-port heard Users. + + +|8320 Enter Words or Calls for Digipeating +which will be replaced by * + is automatic part of this +Line if not switched off with "i" +in Block-Field. Common words are +"RELAY" "WIDE" "ECHO" and for +crossband digipeating from SW use +"GATE" as the only word in Line. + +|8325 Limit Radius of digipeated Data. This +is the Distance of the Beacon-sending +-station to You. A 0 disables this, a +"30000" means the whole earth but makes +sense because all non-position junk will +be filtert out except of messages, +they will always be digipeated. + +|8330 This is a Powerful trafic-reduction mechanism. +If set to eg. 29 Minutes (1740s) it will +filter out all Beacons with same Content for +this Period. (Repeatedly sent) messages pass +(after the internal fixed minimum time of 27s). +Moving- and Weather-Stations will have +different content so pass always. +Values less than 27s will be replaced by 27s, +this is standard to avoid rotating beacons. + +|8335 Toggle On/Off this Line, a not green +dot line does nothing. +Switch on only if Your KISS TNC/Serial +Line never looses Bytes else Your Digi +will spread wrong Positions seen on +whole world. With normal (not USB) +com-port use only with SMACK CRC. + +|8336 Cycle thru possible Input (rx) +"Rf-Ports". "N" is for gate Net to Rf, +"*" listens on All Ports except Net. + +|8337 Cycle thru possible output (tx) "Rf-Ports" + +|8338 If enabled, only "direct heard" (First digi in chain) +Beacons will be digipeated. Since most digi-paths are +discarded or destroyed by other digis, this does not +work any more. It would dramatically reduce traffic +and make a high efficient, low-noise (home) Digi. + +|8339 If enabled the still not active rest of via-path +will be cut off at retransmission. This reduces +own "noise" by shorter frames and a lot of +network noise because the beacon is not further +digipeated (Last digi in chain). +This may be helful to bring things INTO a local area +if no (eg) 70cm Port is avaliable to do this better. + +|8340 Edit this part with "Edit" Function and Restore. + +|8350 Quick On/Off Digi. +Inactive Lines may be preserved for later use + +|8351 Input (Rx) Rf-Port or "N" Net source to Rf Gate + +|8352 Output (Tx) Rf-Port +|8353 Use Direct Heard only (direct heard is not detectable any longer) +|8354 Cut off rest of via path + +|8355 Dupe Time in seconds, 840s (14Min) is good value +In this Time Beacons with always same content will +be digipeated only once. + +|8356 Radius in km around You will be digipeated + +|8360 Copy this Line to editor Field for viewing +or modify and Restore or Add for a New digi Line. + + +|8430 1st Value: Brightness of white Lines showing Rf-Paths +in "Heard" and "+Rf" Mode. +More Values may be applied for Altitude (srtm) Maps: +2nd: default Brightness of Radiorange "R" Image +3rd: Contrast, 0 hard shaped, 30 flat area till 200 +for mountain area. +Set 2 markers above Map and enter "R". More +Contrast with Brightness of OSM-map near 0 + + +|8440 Enter Fontsize, Range 8..18 Pixel + + +|8435 Toggle on/off Transparent Menus +|8436 1..100 black to maximum transparency +or if transparency off then background +luminance. try for best readability + +|8450 click to choose a colour + +|8529 Antenna at Marker 1 Altitude over Ground. +If " A" is appended like "10 A", the +Altitude (if avaliable) from a klicked +Object will be added + +|8527 Antenna at Marker 2 Altitude over Ground. + +|8525 Antenna 3 is used for Radio Range Map +(shortcut R) as receiver for radiation +of Antenna 1 and optional Antenna 2 for +a Reflection Areas Map of optical sight. +Mixed Colour Areas show possible places +for Repeaters. Set to 0m for natural +Reflektors. Where areas Touch, there +might be a Diffraction Line. + +|8520 Frequency for Fresnelzone. +The zone is calculated 3-dimensional +to see obstacles under and beside of +Radiation + +|8518 Refraction Factor of Atmosphere +0.00 in Vacuum +1.00 Vacuum on Flat Earth or refraction equals earthradius +0.25 Typical Value in Atmosphere + +|8515 0 is hard shaped area. More realistic +Image will make values around 5 to 10 +(meters) for soft fading away sight. +Values from 20 to more hundred meters +(in high mountain areas) are usefull +for calculating relief-Maps as overlay +to OSM Maps or with zero-brigthness Map. +Set Marker 1 (and optional 2) as "light +source" to 100 or more 1000 meters high +and nice colours, 100% brightness and +press "R" + + +|8510 Brightness in % of Radiation Map + +|8508 Cache for altitude data in RAM in Megabytes +Set to more for faster work with altitude Maps +or long distance radiation sight graphs + +|8505 Colour of Radiation Area from Antenna 1 + +|8500 Colour of Radiation Area from Antenna 2 +Where both antennas have sight, the two colours will +be mixed to a third colour which shows possible +reflection areas. Where the 2 colours get in touch +there may be a diffraction edge + +|8535 Select Quality +|8536 Redraw if quality changed +|8537 Toggle on/off Relief/Radiation Map (or use "R"-key) + + +|10005 Tipp: Move and Zoom Map to Your Home Area +then open "Zoom" and SHIFT+Leftclick to "P1" +to Store View for next Program Start + +|10006 Tipp: To get Data from Internet Configure "Config>Online>" + +|10007 Tipp: Usage of "m/" Filters needs configured +MyPosition and "Allow Tx to Net" + +|10010 Tipp: If problem with map download +check network and map download program + +|10016 Tipp: Don't like black or expanded Maps? +switch on "Config>Map Moving>Zoom as have Maps" +set "Config>Map Moving>Expand Map" as wanted + +|10015 Tipp: Zoom to Objects even if Maps are not downloaded +yet, switch off "Config>Mapmoving>Zoom as have Maps" + +|8600 Switch off all Selections and show all +(Shortcut "0" or ESC) + +|8605 Show Stations with last Beacon has Wx-Data +(Shortcut w) +Off with "Show All" "0" oder ESC + +|8610 Make a Colour Image out of Temperatures +of WX Stations, Map is converted to B/W, +Topo-Maps are nice here (Shortcut 2 times w). +Off with "Show All" "0" oder ESC + +|8615 Make a Colour Image out of Rain +in 24h (blue) and last hour (red) +(Shortcut W) Map is converted to B/W. +Off with "Show All" "0" oder ESC + +|8620 To see moving stations (Shortcut m) + +|8625 Only Stations with the selected Symbol will +be shown. This may be toggled on/off here or +with "s"-Key. Use TAB-Key to toggle between +2 Map configurations. + +|8626 Select a Symbol, for Overlay Symbols an +additional Character or Number may be choosed + \ No newline at end of file diff --git a/aprsmap_common/poi.txt b/aprsmap_common/poi.txt new file mode 100644 index 0000000..944d2db --- /dev/null +++ b/aprsmap_common/poi.txt @@ -0,0 +1,42336 @@ +# This file is generated from data from +# http://www.viewfinderpanoramas.org/ (Alps) and +# http://www.alpin-koordinaten.de/ (Nepal) +# +# local additions +# +loc_1,PARSEIERSPITZE,,47.174257,10.478691,3036 +# +# Thu Feb 26 12:00:46 CET 2009 +# and is included in the gipfel tarball with the kind permission of +# Jonathan de Ferranti and www.alpin-koordinaten.de +# +alps_1,MONTE CURT,,45.140278,7.420000,1325 +alps_2,TRUC DEL FARO,,45.155833,7.406944,1206 +alps_3,ROCCA DELLA SELLA,,45.139722,7.352222,1508 +alps_4,MONTE SAPEI,,45.153889,7.346389,1615 +alps_5,MONTE ARPON,,45.145833,7.365833,1236 +alps_6,MONTE MUSINE,,45.113889,7.455000,1150 +alps_7,MONTE CIABERGIA,,45.082500,7.341111,1178 +alps_8,MONCUNI,,45.048611,7.413611,641 +alps_9,PIETRABORGA,,45.021667,7.421944,926 +alps_10,MONTAGNAZZA,,45.001111,7.429167,892 +alps_11,TRUC LE CRESTE,,45.006111,7.371111,827 +alps_12,UJA DI MONDRONE,,45.324722,7.221111,2964 +alps_13,TORRE D'OVARDA,,45.258333,7.221944,3075 +alps_14,MONTE SERVIN,,45.264722,7.200000,3108 +alps_15,PUNTA BARALE,,45.265833,7.205833,3005 +alps_16,BEC DEL FAUSET,,45.281667,7.241944,2577 +alps_17,PUNTA LUNELLA,,45.197500,7.217222,2772 +alps_18,PUNTA DELL'ADOIS,,45.191944,7.236944,2507 +alps_19,ROCCA PATANUA,,45.178611,7.220556,2410 +alps_20,PUNTA DELLE LANCE,,45.207222,7.240000,2231 +alps_21,CIMA CHIAVESSO,,45.269167,7.245556,2824 +alps_22,PUNTA GOLAI,,45.265000,7.241944,2819 +alps_23,IL TRUC,,45.205833,7.273611,2263 +alps_24,MONTE CIORNEVA,,45.268333,7.260278,2918 +alps_25,MONTE ROSSO D'ALA,,45.287500,7.268611,2763 +alps_26,CIMA LA ROSSA,,45.270833,7.267778,2793 +alps_27,TORRIONE MAZZUCCHINI,,45.273889,7.281667,2562 +alps_28,CIRIUNDA,,45.270278,7.306667,2244 +alps_29,ROCCA MOROSS,,45.276389,7.335278,2135 +alps_30,TESTA PAIAN,,45.300556,7.339444,1856 +alps_31,TORRETTA DEL PRETE,,45.198056,7.333333,2264 +alps_32,MONTE CIVRARI,,45.191944,7.327500,2302 +alps_33,PUNTA DELLA CROCE,,45.184167,7.332778,2234 +alps_34,CIMA MONTU,,45.252778,7.301389,2248 +alps_35,CIARM DEL PRETE,,45.264167,7.291389,2390 +alps_36,MONTE TURLO,,45.263333,7.270833,2440 +alps_37,MONTE MARMOTTERE,,45.275278,7.316111,2192 +alps_38,UJA DI CALCANTE,,45.259167,7.388056,1614 +alps_39,PUNTA LUNELLE,,45.265833,7.400278,1384 +alps_40,MONTE CRESTA,,45.274722,7.400833,1173 +alps_41,CIMA DEL TORO,,45.263056,7.412222,1108 +alps_42,MONTE CIUCRIN,,45.318889,7.417500,1520 +alps_43,PUNTA CIALMA,,45.331667,7.452778,1508 +alps_44,PUNTA SERENA,,45.291111,7.436111,1160 +alps_45,IL TURU,,45.234444,7.467500,1355 +alps_46,MONTE DRUINA,,45.219444,7.460833,1516 +alps_47,MONTE ROC NEIR,,45.217222,7.456667,1540 +alps_48,MONTE COLOMBANO,,45.199722,7.431667,1658 +alps_49,MONTE CORNO,,45.242222,7.481389,1227 +alps_50,ROCCA RUBAT,,45.321111,7.494167,1442 +alps_51,PUNTA PRAROSSO,,45.330000,7.488056,1497 +alps_52,MONTE ARPONE,,45.176667,7.396667,1600 +alps_53,BECCA DI MONTCHAIR,,45.485000,7.235556,3544 +alps_54,CIARFORON,,45.493333,7.247222,3643 +alps_55,DENTI DEL BREUIL,,45.478889,7.231944,3454 +alps_56,MARE PERTCHAZ,,45.472778,7.209167,3385 +alps_57,PUNTA FOURA,,45.475556,7.207222,3411 +alps_58,CIMA DI COURMAON,,45.458611,7.232778,3162 +alps_59,LA CUCCAGNA,,45.464167,7.229722,3175 +alps_60,CORNO BIANCO,,45.401389,7.234167,2883 +alps_61,BARROUARD,,45.393056,7.223889,2865 +alps_62,CIMA DELLA PICCOLA,,45.400278,7.212500,2870 +alps_63,BEC DI MEZZODI,,45.349722,7.244444,2427 +alps_64,CIMA LEITOSA,,45.336944,7.240000,2826 +alps_65,MONTE MALATRET,,45.355556,7.198611,2718 +alps_66,LA TRESENTA,,45.499444,7.264444,3609 +alps_67,BECCO D'ALPETTO,,45.476667,7.300278,2801 +alps_68,MONTE CASTELLO,,45.473333,7.310556,2612 +alps_69,BLANC GIUIR,,45.493056,7.331944,3222 +alps_70,TRASEN ROSSO,,45.481944,7.344444,3060 +alps_71,GRAN CARRO,,45.471389,7.347500,2988 +alps_72,PUNTA DI CIALMA NOVA,,45.487778,7.385833,2815 +alps_73,PUNTA DI FIONI,,45.474722,7.386389,2384 +alps_74,MONTE DESTRERA,,45.480556,7.405000,2596 +alps_75,PUNTA VIRGINEA,,45.485000,7.419722,2874 +alps_76,MONCIMOUR,,45.494167,7.417778,3167 +alps_77,PUNTA LASIN,,45.492778,7.438333,3085 +alps_78,PIATA DI LASIN,,45.495000,7.434444,3108 +alps_79,COSTA VARGNEI,,45.491944,7.457500,2838 +alps_80,PUNTA DEL VALLONE,,45.477778,7.498333,2479 +alps_81,PUNTA PERRA,,45.475556,7.472500,2683 +alps_82,MONTE COLOMBO,,45.474167,7.464444,2848 +alps_83,CIMA TESTONA,,45.464167,7.454444,2587 +alps_84,PUNTA DELLA ROSSA,,45.473611,7.420000,2656 +alps_85,PIZZO DI PRAGHETTA,,45.463333,7.429167,2384 +alps_86,COLMETTA,,45.456667,7.427778,2183 +alps_87,MONTE TOVO PICCOLO,,45.412222,7.345833,2729 +alps_88,CIMA GIARDONERA,,45.407222,7.350556,2779 +alps_89,MONTE TOVO,,45.406944,7.372500,2673 +alps_90,LA CIALMA,,45.412222,7.398333,2193 +alps_91,LA ROSSA,,45.373611,7.417778,2319 +alps_92,PUNTA MARSE,,45.375000,7.398611,2317 +alps_93,MONTE BELLAVARDA,,45.375278,7.387500,2345 +alps_94,PUNTA PIANSPIGO,,45.395556,7.362778,2520 +alps_95,MONTE UNGHIASSE,,45.416389,7.295278,2939 +alps_96,MONTE BESSUN,,45.414167,7.320556,2908 +alps_97,GRAN BERNARDE,,45.399722,7.317778,2747 +alps_98,MONTE BELLAGARDA,,45.415000,7.282500,2901 +alps_99,CIMA DELLA CROCETTA,,45.411111,7.269444,2824 +alps_100,PUNTA FERTA,,45.403333,7.274722,2780 +alps_101,MONTE MORION,,45.400833,7.250278,2839 +alps_102,MONTE DOUBIA,,45.341667,7.296389,2463 +alps_103,PUNTA CROSET,,45.338333,7.275000,2465 +alps_104,MONTE PLU,,45.335000,7.319167,2195 +alps_105,MONTE PELLERIN,,45.346111,7.338056,1853 +alps_106,PUNTA DELL'AGGIA,,45.370556,7.430000,2253 +alps_107,PUNTA GIAS VEJ,,45.363056,7.424167,2179 +alps_108,CASTEL BALANGER,,45.358333,7.462500,2203 +alps_109,MONTE CROASS,,45.364167,7.454167,2155 +alps_110,MONTE DELL'ANGIOLINO,,45.358611,7.471389,2168 +alps_111,CIMA DELL'UIA,,45.370833,7.495000,2142 +alps_112,ROCCA TURI,,45.340833,7.485000,1718 +alps_113,MONTE ROSSO,,45.336667,7.353333,1777 +alps_114,PUNTA LEISER,,45.559444,7.238056,3116 +alps_115,LA GRIVOLA,,45.595833,7.257500,3969 +alps_116,PUNTA BIANCA,,45.588056,7.258056,3793 +alps_117,COL DE LA NOIRE,,45.588889,7.271111,3491 +alps_118,PUNTA ROSSA,,45.591389,7.278889,3630 +alps_119,COL DE LA ROUSSE,,45.588611,7.283611,3195 +alps_120,COL DES RAYES NOIRES,,45.582500,7.269167,3441 +alps_121,COL LAUSON,,45.577778,7.269167,3296 +alps_122,PUNTA DEL TUF,,45.575556,7.268611,3393 +alps_123,PUNTA DELL'INFERNO,,45.569167,7.277222,3393 +alps_124,COLLE DI LEVIONAZ,,45.566389,7.277778,3325 +alps_125,PUNTA DI LEVIONAZ,,45.563333,7.281944,3420 +alps_126,COLLE GRAN SERRAZ,,45.561667,7.283056,3370 +alps_127,GRAN SERRAZ,,45.556389,7.285278,3552 +alps_128,COLLI DELL'HERBETET,,45.551111,7.278333,3352 +alps_129,HERBETET,,45.544444,7.274167,3778 +alps_130,COL BONNEY,,45.540278,7.271944,3587 +alps_131,PUNTA BUDDEN,,45.538611,7.271667,3683 +alps_132,FINESTRA DI DZASSET,,45.537500,7.271111,3633 +alps_133,BECCA DI MONTANDAYNE,,45.532500,7.269722,3838 +alps_134,COL DI MONTANDAYNE,,45.530833,7.268611,3723 +alps_135,PUNTA VACCARONE,,45.528333,7.266667,3868 +alps_136,PUNTA FARRAR,,45.526944,7.266389,3921 +alps_137,PUNTA FRASSY,,45.524722,7.267778,3923 +alps_138,COLLE DEL TUF,,45.572222,7.275278,3255 +alps_139,PUNTA MONEY,,45.555000,7.250833,3275 +alps_140,COL DEL PICCOLO PARADISO,,45.522500,7.268889,3877 +alps_141,GRAN PARADISO,,45.518056,7.267222,4061 +alps_142,IL ROC,,45.514722,7.270000,4026 +alps_143,COL DI CHAMONIN,,45.513056,7.279444,3698 +alps_144,COL DE L'ABEILLE,,45.514167,7.271667,3873 +alps_145,COSTA GASTALDI,,45.514167,7.275278,3894 +alps_146,PUNTA CERESOLE,,45.513056,7.285278,3777 +alps_147,BECCA DI MONTCORVE,,45.511944,7.266389,3875 +alps_148,COL DEL GRAN PARADISO,,45.505556,7.266667,3345 +alps_149,COL DE LA LUNE,,45.515278,7.291111,3542 +alps_150,DEIR VERT,,45.502778,7.294722,3202 +alps_151,LAGO DI GAY,,45.506944,7.305833,2968 +alps_152,COL MONEY,,45.522222,7.351111,3443 +alps_153,TESTA DI MONEY,,45.521111,7.341667,3572 +alps_154,ROCCIA VIVA,,45.519167,7.330000,3650 +alps_155,PIC DI PAZIENZA,,45.521389,7.336389,3606 +alps_156,MONTE NERO,,45.515556,7.339444,3422 +alps_157,COLLE BARETTI,,45.516667,7.326389,3432 +alps_158,BECCA DI GAY,,45.514444,7.321389,3621 +alps_159,BECCA DELLA LOSA,,45.505833,7.317500,3225 +alps_160,BECCHI DELLA TRIBOLAZIONE,,45.500833,7.333889,3360 +alps_161,COLLE DELLA LOSA,,45.508056,7.329444,3129 +alps_162,PUNTA ONDEZANA,,45.518056,7.370833,3492 +alps_163,BECCA DI NOASCHETTA,,45.512500,7.303056,3525 +alps_164,TESTA DI TRIBOLAZIONE,,45.516389,7.297222,3642 +alps_165,COL DI VALNONTEY,,45.516944,7.301111,3535 +alps_166,TESTA DI VALNONTEY,,45.517778,7.301944,3562 +alps_167,TORRE DEL GRAN SAN PIETRO,,45.525833,7.358889,3692 +alps_168,TORRE DI SAN ANDREA,,45.528333,7.360833,3651 +alps_169,PUNTE PATRY,,45.540556,7.359722,3581 +alps_170,PUNTA TSISSETTA,,45.547500,7.359722,3419 +alps_171,COL VALLETTAZ,,45.550278,7.363056,3280 +alps_172,PUNTE VALLETTAZ,,45.551944,7.363889,3356 +alps_173,PUNTA VALMIANAZ,,45.556944,7.363889,3093 +alps_174,PUNTA DI VALMIANAZ,,45.562222,7.361111,3244 +alps_175,COL DE LA GRANDZETTAZ,,45.567500,7.363056,2933 +alps_176,PUNTA FENILIAZ,,45.574167,7.359444,3053 +alps_177,MONTE HERBAN,,45.593889,7.316111,3004 +alps_178,MONTZEUC,,45.591944,7.361389,2333 +alps_179,GRAND VALLON,,45.565833,7.298056,3121 +alps_180,BEC DU VALLON,,45.566111,7.311944,2837 +alps_181,COLLE PATRY,,45.544444,7.360278,3361 +alps_182,COL COUPE DI MONEY,,45.534167,7.359444,3393 +alps_183,TORRE DI SAN ORSO,,45.531389,7.360556,3618 +alps_184,PUNTA DEL ROSSIN,,45.573056,7.409167,2947 +alps_185,PUNTA DELLA TSESERE,,45.564167,7.415556,3117 +alps_186,PETITE AROLLAZ,,45.548889,7.416944,3232 +alps_187,PUNTA DI FORZO,,45.545278,7.416111,3296 +alps_188,COLLE DI FORZO,,45.539722,7.416667,3169 +alps_189,MONVESO DI FORZO,,45.537778,7.417778,3322 +alps_190,ROCCIA AZZURA,,45.535556,7.412778,3308 +alps_191,PUNTA DI SENGIE,,45.531944,7.396667,3408 +alps_192,AGO DELLA SENGIE,,45.530556,7.396667,3384 +alps_193,POINTE DES EAUX ROUSSE,,45.571111,7.445278,2952 +alps_194,TORRE DI LAVINA,,45.555556,7.448611,3308 +alps_195,COL DI BARDONNEY,,45.547500,7.429444,2833 +alps_196,PUNTA DELLA SCALETTA,,45.577500,7.465000,3018 +alps_197,PUNTA ROSSA,,45.528889,7.438889,2707 +alps_198,PUNTA DI LOIE,,45.580833,7.406389,2676 +alps_199,UJA DI CIARDONEY,,45.516111,7.399167,3325 +alps_200,PUNTA GIALIN,,45.508611,7.421944,3270 +alps_201,BECCO DI VALSOERA,,45.510556,7.375278,3369 +alps_202,MONTE COLOMBINO,,45.505278,7.459444,2473 +alps_203,PUNTA NERA,,45.581111,7.463056,3064 +alps_204,PUNTA TRESSI,,45.542500,7.494722,2865 +alps_205,CIMA DEL CAVALLO,,45.548611,7.483333,2847 +alps_206,TESTA TSAPLANE,,45.588889,7.310556,3013 +alps_207,TETE DE LA NOUVA,,45.582500,7.485000,3032 +alps_208,GEISSHORN,,47.287778,10.175556,2366 +alps_209,LIECHELKOPF,,47.296111,10.180278,2384 +alps_210,ANGERERKOPF,,47.293889,10.185833,2263 +alps_211,KEMPTNER KOPF,,47.297500,10.199722,2191 +alps_212,WILDENGUNDKOPF,,47.288056,10.183889,2197 +alps_213,MUSSKOPF,,47.290833,10.245556,1968 +alps_214,KLEINER RAPPENKOPF,,47.283333,10.244167,2276 +alps_215,HOCHRAPPENKOPF,,47.280278,10.246111,2425 +alps_216,BIBERKOPF,,47.270556,10.232778,2599 +alps_217,HOCHRAPPENKOPF,,47.278611,10.245000,2425 +alps_218,HALDENWANGER KOPF,,47.275000,10.173889,2002 +alps_219,HALDENWANGER ECK,,47.271667,10.174722,1930 +alps_220,GRUENER,,47.275278,10.208056,1916 +alps_221,HALDENWANGER ECK,,47.271111,10.181667,1936 +alps_222,RAPPENSEEKOPF,,47.280833,10.255278,2469 +alps_223,HOCHGUNDSPITZE,,47.284722,10.263333,2460 +alps_224,ROTGUNDSPITZE,,47.288056,10.266111,2485 +alps_225,LINKERSKOPF,,47.291111,10.264167,2459 +alps_226,WILDER MANN,,47.287500,10.280556,2577 +alps_227,BOCKKARKOPF,,47.292222,10.288056,2609 +alps_228,HOCHFROTTSPITZE,,47.296389,10.293611,2649 +alps_229,HOCHGEHRENSPITZE,,47.321389,10.207500,2251 +alps_230,SCHUESSER,,47.326667,10.200000,2169 +alps_231,HAMMERSPITZE,,47.319722,10.210556,2260 +alps_232,ROSSGUNDKOPF,,47.319444,10.233889,2139 +alps_233,ALPGUNDKOPF,,47.321944,10.238056,2177 +alps_234,GRIESGUNDKOPF,,47.323611,10.240000,2164 +alps_235,SCHAFALPENKOEPFE,,47.311111,10.216111,2320 +alps_236,WILDENGUNDKOPF,,47.312778,10.292500,2238 +alps_237,FUERSCHIESSER,,47.328056,10.330278,2271 +alps_238,KRATZER,,47.306389,10.321111,2428 +alps_239,MAEDELEGABEL,,47.300000,10.295833,2645 +alps_240,TROTTACHSPITZE,,47.303611,10.296111,2595 +alps_241,KRATTENSPITZEN,,47.320000,10.345833,2552 +alps_242,OEFNERSPITZE,,47.317500,10.349167,2576 +alps_243,MUTTLERKOPF,,47.314444,10.341389,2368 +alps_244,HOHER IFEN,,47.354722,10.100278,2229 +alps_245,SOELLERKOPF,,47.361944,10.233056,1940 +alps_246,SCHLAPPOLTKOPF,,47.358611,10.224722,1968 +alps_247,FELLHORN,,47.350000,10.217778,2038 +alps_248,WARMALSGUNDKOPF,,47.334722,10.208333,2057 +alps_249,HIMMELSCHROFEN,,47.362778,10.283056,1791 +alps_250,KEGELKOPF,,47.355278,10.326667,1959 +alps_251,VORDERER WILDGUNDKOPF,,47.346389,10.285278,1935 +alps_252,HINTERER WILDGUNDKOPF,,47.339722,10.287778,1955 +alps_253,SCHMALHORN,,47.334167,10.287778,1952 +alps_254,KLEINER WILDER,,47.363333,10.386944,2306 +alps_255,HOELLHOERNER,,47.358611,10.387500,2145 +alps_256,JOCHSPITZE,,47.354444,10.384167,2232 +alps_257,RAUHECK,,47.344722,10.368611,2384 +alps_258,KREUZECK,,47.336944,10.357222,2376 +alps_259,UNTERE GOTTESACKERWAENDE,,47.385278,10.131389,1858 +alps_260,ROSSKOPF,,47.380000,10.103056,1958 +alps_261,TORKOPF,,47.379444,10.129722,1930 +alps_262,OBERE GOTTERSACKERWAENDE,,47.376111,10.117222,2033 +alps_263,GATTERKOPF,,47.388889,10.151111,1659 +alps_264,GATTERKOPF,,47.389167,10.159722,1672 +alps_265,SONNENBERG,,47.376389,10.129167,2016 +alps_266,KACKENKOEPFE,,47.398611,10.186944,1560 +alps_267,ENGENKOPF,,47.393889,10.220833,1282 +alps_268,SOELLERECK,,47.373333,10.237500,1706 +alps_269,RIFFENKOPF,,47.379444,10.317778,1748 +alps_270,HAHNENKOPF,,47.379444,10.325278,1735 +alps_271,SCHOCHEN,,47.394167,10.360833,2100 +alps_272,LACHENKOPF,,47.394722,10.372222,2111 +alps_273,LAUFBACHER ECK,,47.393611,10.381389,2178 +alps_274,SALOBER,,47.397778,10.388611,2088 +alps_275,ROTKOPF,,47.391111,10.381667,2194 +alps_276,SCHNECK,,47.385833,10.382778,2268 +alps_277,HIMMELHORN,,47.381667,10.376667,2111 +alps_278,VORDERER WILDER,,47.378056,10.411667,2241 +alps_279,GROSSER WILDER,,47.370278,10.389722,2379 +alps_280,HINTERER WILDER,,47.367222,10.390000,2360 +alps_281,HOEFATS,,47.367222,10.350000,2258 +alps_282,KLEINER HOEFATS,,47.368056,10.355000,2073 +alps_283,HUETTENKOPF,,47.374167,10.334444,1949 +alps_284,WIEDEMERKOPF,,47.389444,10.418056,2170 +alps_285,KREUZKOPF,,47.384722,10.420278,2287 +alps_286,KREUZSPITZE,,47.383889,10.431389,2367 +alps_287,FUCHSKARSPITZE,,47.391111,10.429722,2314 +alps_288,HOCHVOGEL,,47.380278,10.437222,2592 +alps_289,WEITERWANDECK,,47.398056,10.977500,2698 +alps_290,PLATTSPITZEN,,47.396667,10.993056,2680 +alps_291,PIESENKOPF,,47.416389,10.133056,1630 +alps_292,GAUCHENWAENDE,,47.426667,10.144722,1479 +alps_293,RIESENKOPF,,47.413056,10.118889,1508 +alps_294,SCHAFKOPF,,47.426111,10.176389,1627 +alps_295,BESLER,,47.425000,10.188056,1680 +alps_296,GEISSWIEDENKOPF,,47.427222,10.203056,1544 +alps_297,ROTE WAND,,47.414167,10.177500,1474 +alps_298,GEISSBERG,,47.416389,10.209722,1449 +alps_299,RUBIHORN,,47.424167,10.315556,1957 +alps_300,GAISALPHORN,,47.419444,10.318611,1953 +alps_301,GEISSFUSS,,47.417778,10.326944,1981 +alps_302,SCHATTENBERG,,47.400833,10.319167,1845 +alps_303,NEBELHORN,,47.421944,10.342500,2224 +alps_304,WESTLICHER WENGENKOPF,,47.422778,10.350833,2235 +alps_305,OESTLICHER WENGENKOPF,,47.426389,10.361389,2207 +alps_306,GIEBEL,,47.412778,10.399444,1949 +alps_307,BERGGAECHTLE,,47.407500,10.394722,2007 +alps_308,GROSSER SEEKOPF,,47.405833,10.355000,2085 +alps_309,KLEINER SEEKOPF,,47.401389,10.356667,2096 +alps_310,KESSELSPITZ,,47.400000,10.435000,2284 +alps_311,GLASFELDER KOPF,,47.402778,10.431944,2270 +alps_312,SATTELKOPF,,47.413611,10.439167,2097 +alps_313,SCHAENZLEKOPF,,47.418333,10.454167,2070 +alps_314,SCHAENZLESPITZ,,47.423333,10.456667,2052 +alps_315,LAHNERKOPF,,47.429167,10.463333,2121 +alps_316,KAELBELESSPITZ,,47.431389,10.476111,2135 +alps_317,KASTENKOPF,,47.431944,10.472222,2129 +alps_318,ZUGSPITZE,,47.421111,10.985278,2963 +alps_319,GROSSE RIFFELWANDSPITZE,,47.426667,10.991389,2626 +alps_320,KLEINE RIFFELWANDSPITZE,,47.428611,10.996111,2543 +alps_321,SCHNEEFERNERKOPF,,47.409444,10.970556,2874 +alps_322,WETTERSPITZEN,,47.400833,10.970833,2746 +alps_323,GELBHAUSEKOPF,,47.449722,10.108056,1450 +alps_324,RIEDBERGERHORN,,47.451389,10.159444,1787 +alps_325,DREIFAHNENKOPF,,47.462500,10.154722,1628 +alps_326,HOCHSCHELPEN,,47.434444,10.109722,1552 +alps_327,WANNENKOPF,,47.448333,10.192500,1712 +alps_328,GROSSER OCHSENKOPF,,47.463611,10.181111,1662 +alps_329,WEIHERKOPF,,47.465000,10.201389,1665 +alps_330,BOLSTERLANGER HORN,,47.459722,10.208889,1586 +alps_331,SONNENKOPF,,47.459167,10.330278,1712 +alps_332,HEIDELBEERKOPF,,47.455278,10.330000,1767 +alps_333,SCHNIPPENKOPF,,47.450833,10.327500,1833 +alps_334,ENTSCHENKOPF,,47.436667,10.331667,2043 +alps_335,BURGBERG,,47.452222,10.283889,892 +alps_336,ROTSPITZ,,47.459722,10.369722,2034 +alps_337,HEUBATSPITZE,,47.458889,10.381389,2008 +alps_338,KLEINER DAUMEN,,47.446944,10.386667,2197 +alps_339,GROSSER DAUMEN,,47.441389,10.376111,2280 +alps_340,GRATKOPF,,47.436111,10.373611,2172 +alps_341,PFANNENHOLZER,,47.447222,10.399167,2029 +alps_342,HENGST,,47.440278,10.399722,1989 +alps_343,ENTSCHENRUECKEN,,47.439444,10.338333,1846 +alps_344,RAUHHORN,,47.458611,10.468611,2240 +alps_345,KUGELHORN,,47.448611,10.470833,2125 +alps_346,KNAPPENKOPF,,47.443056,10.473611,2071 +alps_347,KIRCHENDACH,,47.436389,10.474167,2013 +alps_348,FALKEN,,47.443611,10.452500,1906 +alps_349,AELPELEKOPF,,47.438889,10.455278,2024 +alps_350,HOHE RIFFEL,,47.434444,10.999167,2236 +alps_351,HOHER HAEDERICH,,47.481944,10.003611,1565 +alps_352,AUF DEM FALKEN,,47.483611,10.020833,1564 +alps_353,RHONEHOEHE,,47.488889,10.038889,1639 +alps_354,HOHENFLUHALPKOPF,,47.489444,10.050000,1636 +alps_355,SEELEKOPF,,47.490278,10.060278,1663 +alps_356,HOCHGRAT,,47.495278,10.078889,1834 +alps_357,STILLBERG,,47.471111,10.080833,1532 +alps_358,SAMSTENBERG,,47.466944,10.068333,1513 +alps_359,GIRENKOPF,,47.480833,10.104722,1683 +alps_360,HEIDENKOPF,,47.481111,10.112222,1685 +alps_361,SIPLINGERKOPF,,47.480000,10.125833,1746 +alps_362,LEITERBERG,,47.489444,10.088889,1626 +alps_363,TENNENMOOSKOPF,,47.485278,10.142222,1628 +alps_364,BLEICHERHORN,,47.470278,10.140556,1669 +alps_365,HOELLRITZERECK,,47.468056,10.143889,1669 +alps_366,OFIERSCHWANGER HORN,,47.493611,10.212778,1406 +alps_367,RANGISWANNER HORN,,47.478611,10.201111,1616 +alps_368,SIGISWANNER HORN,,47.484722,10.209722,1527 +alps_369,IMBERGER HORN,,47.484167,10.357500,1655 +alps_370,BREITENBERG,,47.470000,10.383056,1893 +alps_371,GERENKOPF,,47.469722,10.343056,1566 +alps_372,B'SCHIESSER,,47.487778,10.440833,2000 +alps_373,PONTEN,,47.485833,10.451944,2044 +alps_374,ZIRLESECK,,47.482778,10.463889,1870 +alps_375,ZERRERKOEPFLE,,47.476944,10.468056,1946 +alps_376,GAISECK,,47.468611,10.470556,2212 +alps_377,STUIBENKOPF,,47.485833,10.428889,1831 +alps_378,SCHELLKOPF,,47.497222,10.888056,1882 +alps_379,OFENBERG,,47.485000,10.958333,1174 +alps_380,RAUHENSTEIN,,47.497222,10.986667,1727 +alps_381,GATTERLKOEPFE,,47.395000,11.000556,2483 +alps_382,HOHER KAMM,,47.393611,11.030278,2376 +alps_383,HOCHWANNER,,47.396111,11.055833,2744 +alps_384,HINTERREINTAL SCHROFEN,,47.396111,11.076944,2669 +alps_385,WANNERGRAT,,47.396111,11.041111,2548 +alps_386,HUNDSSTALLKOEPFE,,47.395833,11.090000,2586 +alps_387,TEUFELSKOPF,,47.394444,11.100833,2440 +alps_388,OBERREINTAL SCHROFEN,,47.395556,11.104444,2523 +alps_389,SCHARNITZSPITZE,,47.395833,11.112222,2463 +alps_390,SCHUESSELKARSPITZE,,47.397500,11.120278,2553 +alps_391,GROSSE ARNSPITZE,,47.397500,11.222778,2196 +alps_392,RIFFELKOEPFE,,47.430000,11.002778,2388 +alps_393,HOELLENTALSPITZEN,,47.420556,11.020000,2743 +alps_394,VOLLKARSPITZE,,47.421667,11.034722,2618 +alps_395,HOCHBLASSEN,,47.423056,11.042500,2707 +alps_396,ALPSPITZE,,47.429722,11.048333,2627 +alps_397,HOHER GAIF,,47.422222,11.063611,2287 +alps_398,STUIBENKOPF,,47.424444,11.079444,1924 +alps_399,FRAUENALPL,,47.416667,11.128056,2351 +alps_400,WETTERSTEINKOPF,,47.421667,11.160000,2433 +alps_401,MUSTERSTEIN,,47.413889,11.140556,2475 +alps_402,TOERLSPITZEN,,47.412778,11.136111,2444 +alps_403,LEUTASCHER DREITORSPITZE,,47.400556,11.124444,2681 +alps_404,PARTENKIRCHNER DREITORSPITZE,,47.408056,11.124722,2627 +alps_405,HUNDSSTALLKOPF,,47.402222,11.083611,2333 +alps_406,WETTERSTEINWAND,,47.422222,11.166667,2482 +alps_407,ROTPLATTENSPITZE,,47.424167,11.176944,2390 +alps_408,OBERE WETTERSTEINSPITZE,,47.426944,11.191667,2297 +alps_409,ACHTERKOEPFE,,47.401667,11.224722,2023 +alps_410,LARCHETFLECKSPITZE,,47.430833,11.314167,2365 +alps_411,KARWENDELSPITZE,,47.429722,11.299444,2385 +alps_412,GERBERKREUZ,,47.426944,11.287500,2307 +alps_413,SULZLEKLAMMSPITZE,,47.418889,11.293611,2323 +alps_414,LINDERSPITZEN,,47.427778,11.293333,2374 +alps_415,KIRCHLSPITZ,,47.415556,11.293333,2303 +alps_416,ROTWANDLSPITZE,,47.406667,11.288889,2192 +alps_417,BRUNNENSTEINSPITZE,,47.405556,11.287778,2179 +alps_418,RIFFELSPITZEN,,47.437222,11.004722,2262 +alps_419,SCHOENANGERSPITZE,,47.442222,11.012500,2264 +alps_420,HINTERER WARENSTEIN,,47.444167,11.019444,2250 +alps_421,GROSSER WARENSTEIN,,47.446111,11.023333,2276 +alps_422,ZWOELFERKOPF,,47.446667,11.026389,2226 +alps_423,VORDERER WARENSTEIN,,47.446667,11.030278,2136 +alps_424,RAUHKOPF,,47.453333,11.062778,1621 +alps_425,KREUZJOCH,,47.452222,11.078889,1719 +alps_426,HOELLENTORKOEPFL,,47.438056,11.047778,2150 +alps_427,STELLWAGELSKOPF,,47.456389,11.155556,1288 +alps_428,SCHOENBERG,,47.439167,11.331389,2296 +alps_429,TIEFKARSPITZE,,47.437778,11.321667,2432 +alps_430,KREUZWAND,,47.436944,11.300833,2132 +alps_431,GROSSKARSPITZE,,47.447222,11.334722,2420 +alps_432,WOERNER,,47.449722,11.338611,2476 +alps_433,HOCHKARSPITZE,,47.447500,11.350556,2483 +alps_434,RAFFELSPITZE,,47.444722,11.365000,2324 +alps_435,BAERALPLKOPF,,47.446667,11.390833,2325 +alps_436,SCHLICHTENKARSPITZEN,,47.446944,11.404444,2476 +alps_437,VOGELKARSPITZE,,47.446389,11.411667,2522 +alps_438,STEINKARSPITZE,,47.454722,11.413611,2015 +alps_439,WECHSELKOPF,,47.459444,11.411944,1835 +alps_440,WECHSELSCHNEID,,47.463889,11.409444,1730 +alps_441,OESTLICHE KARWENDELSPITZE,,47.445000,11.421944,2536 +alps_442,SIGNALKOPF,,47.489444,11.312500,1895 +alps_443,SEINSKOPF,,47.491944,11.318333,1961 +alps_444,SCHOTTELKARSPITZE,,47.494167,11.330278,2049 +alps_445,FELDERNKREUZ,,47.491944,11.329722,2048 +alps_446,SOIERNSCHNEID,,47.481944,11.342500,2174 +alps_447,SOIERNSPITZ,,47.481667,11.357500,2257 +alps_448,KRAPFENKARSPITZE,,47.493611,11.369444,2109 +alps_449,VIEHKOGEL,,47.488056,12.933333,2157 +alps_450,LEDERERKOPF,,47.485833,12.962222,2113 +alps_451,STUHLJOCH,,47.489722,12.967778,2448 +alps_452,SCHOTTMALHORN,,47.478611,12.953889,2232 +alps_453,GRIESKOGEL,,47.474444,12.973611,2543 +alps_454,HOCHSCHEIBE,,47.488611,12.976389,2462 +alps_455,EBENHORN,,47.493333,12.975278,2375 +alps_456,KUHSCHEIBE,,47.493611,12.989167,1967 +alps_457,GEMSSCHEIBE,,47.490278,12.988611,2152 +alps_458,FUNTENSETAUERN,,47.485000,12.977222,2578 +alps_459,GRASKOPF,,47.482222,12.983889,2519 +alps_460,HOCHECK,,47.484167,12.997222,2230 +alps_461,HIRSCH,,47.498056,12.921111,1993 +alps_462,GLUNKERER,,47.497500,12.947500,1932 +alps_463,LEITERKOPF,,47.478889,12.992778,2369 +alps_464,GROSSES TEUFELSHORN,,47.489167,13.036944,2361 +alps_465,KLEINES TEUFELSHORN,,47.486944,13.031667,2283 +alps_466,WILDALMRIEDL,,47.498333,13.048889,2268 +alps_467,LAUBWAND,,47.476667,13.019722,2312 +alps_468,IMBERGKAMM,,47.513056,10.033056,1325 +alps_469,SPITZLERBERG,,47.524722,10.075278,1400 +alps_470,DENNEBERG,,47.527778,10.085278,1427 +alps_471,STUIBEN,,47.517222,10.161667,1749 +alps_472,SEDERERSTUIBEN,,47.514444,10.153333,1737 +alps_473,BURALPKOPF,,47.510833,10.131389,1772 +alps_474,GUENDLESKOPF,,47.506667,10.123611,1748 +alps_475,RINDALPHORN,,47.505000,10.108056,1821 +alps_476,STEINE BERG,,47.525833,10.188889,1682 +alps_477,WITTELSBACHER HOEHE,,47.499722,10.256667,882 +alps_478,TIEFENBACHER ECK,,47.527500,10.356111,1517 +alps_479,SPIESER,,47.526667,10.384167,1649 +alps_480,HIRSCH BERG,,47.518889,10.376389,1500 +alps_481,KUEHGUNDKOPF,,47.503889,10.431944,1907 +alps_482,KUEHGUNDSPITZ,,47.505278,10.433611,1890 +alps_483,ISELER,,47.499722,10.421389,1876 +alps_484,ZUNDERKOPF,,47.529167,10.767500,1726 +alps_485,JOCHBERG,,47.522778,10.762778,1861 +alps_486,DUERRENBERG,,47.519722,10.764444,1799 +alps_487,SAUEREGG,,47.515833,10.776667,1706 +alps_488,ALTENBERG,,47.520556,10.801667,1751 +alps_489,KREUZKOPF,,47.520000,10.813333,1909 +alps_490,OCHSENAELPELESKOPF,,47.526389,10.813056,1905 +alps_491,SCHLAGSTEIN,,47.529722,10.788056,1680 +alps_492,SCHWARZENKOEPFL,,47.528333,10.908333,1897 +alps_493,BRANDJOCH,,47.505000,10.909444,1957 +alps_494,KREUZSPITZ,,47.526667,10.918333,2184 +alps_495,KREUZSPITZL,,47.517778,10.918611,2089 +alps_496,FRIEDERSPITZ,,47.516944,10.959444,2049 +alps_497,FRIEDER,,47.521667,10.960000,2053 +alps_498,SCHELLSCHLICHT,,47.509444,10.916667,2053 +alps_499,STAUFNER BERG,,47.554444,10.036389,1032 +alps_500,DREHERBERG,,47.537778,10.160278,1430 +alps_501,HIMMELECK,,47.536667,10.123333,1487 +alps_502,OBERECK,,47.541944,10.142222,1491 +alps_503,GSCHWENDER HORN,,47.551111,10.169722,1450 +alps_504,IMMENSTAEDTER HORN,,47.553889,10.187222,1489 +alps_505,MITTAGBERG,,47.536389,10.216111,1451 +alps_506,AM ROTEN KOPF,,47.541389,10.176944,1481 +alps_507,KREUZEL SPITZ,,47.546944,10.302222,1496 +alps_508,SIECHEN KOPF,,47.550833,10.308611,1572 +alps_509,GRUENTEN,,47.555000,10.320278,1737 +alps_510,STARZLACH BERG,,47.557222,10.406944,1583 +alps_511,WERTACHER HOERNLE,,47.549722,10.386667,1695 +alps_512,ROSSKOPF,,47.533333,10.370278,1590 +alps_513,SORGSCHROFEN,,47.555833,10.454722,1636 +alps_514,AECHSELE,,47.545833,10.485556,1525 +alps_515,SCHOENKAHLER,,47.540278,10.489167,1690 +alps_516,KIENBERG,,47.560000,10.490556,1493 +alps_517,HOTZEN BERG,,47.540000,10.424722,1232 +alps_518,BREITENBERG,,47.548611,10.552500,1838 +alps_519,AGGENSTEIN,,47.537222,10.558056,1985 +alps_520,VITSER BERG,,47.559444,10.656667,1026 +alps_521,AELPELESKOPF,,47.543889,10.742778,1591 +alps_522,PILGERSCHROFEN,,47.538611,10.741389,1769 +alps_523,SAEULING,,47.535000,10.755833,2047 +alps_524,TORKOPF,,47.561667,10.772222,1525 +alps_525,TEGELBERGKOPF,,47.558333,10.768611,1567 +alps_526,BRANDERSCHROFEN,,47.559444,10.787500,1880 +alps_527,DREIMAENNL,,47.558611,10.796944,1669 +alps_528,AHORNSPITZE,,47.553056,10.798611,1784 +alps_529,STRAUSSBERGKOEPFL,,47.548611,10.798333,1767 +alps_530,HOHER STRAUSSBERG,,47.543611,10.794722,1933 +alps_531,GEISELSTEIN,,47.561667,10.830278,1881 +alps_532,GUMPENKARSPITZE,,47.557222,10.826667,1918 +alps_533,GABELSCHROFEN,,47.553611,10.822222,1989 +alps_534,KRAEHE,,47.552778,10.825278,2010 +alps_535,NIEDERSTRAUSSBERG,,47.548611,10.815556,1877 +alps_536,KENZENKOPF,,47.561111,10.848611,1745 +alps_537,HOCHPLATTE,,47.552222,10.842500,2082 +alps_538,SCHEINBERGSPITZE,,47.554722,10.887778,1926 +alps_539,LOESERTALKOPF,,47.557778,10.875000,1859 +alps_540,HASENTALKOPF,,47.564444,10.876667,1797 +alps_541,VORDERSCHEINBERG,,47.563611,10.868056,1827 +alps_542,WEITALPSPITZ,,47.548333,10.862500,1870 +alps_543,HOCHBLASSE,,47.546111,10.838056,1989 +alps_544,BRUNNENKOEPFL,,47.549444,10.967500,1609 +alps_545,KIENJOCH,,47.540833,10.998889,1953 +alps_546,KUCHELBERGSPITZ,,47.541389,10.942222,2023 +alps_547,KUCHELBERGKOPF,,47.534722,10.926111,2026 +alps_548,KALZHOFNER HOEHE,,47.580278,10.062778,1117 +alps_549,SALMASER HOEHE,,47.571111,10.090556,1254 +alps_550,HUMBACHER BERG,,47.592222,10.294167,1175 +alps_551,KUEH BERG,,47.579444,10.401389,1289 +alps_552,REUTER WANNE,,47.590556,10.460833,1542 +alps_553,EDELS BERG,,47.592222,10.497222,1629 +alps_554,ALP SPITZ,,47.598056,10.496667,1575 +alps_555,PFEIFFERBERG,,47.585556,10.462500,1452 +alps_556,KLOCKNER KIENBERG,,47.566389,10.514444,1536 +alps_557,EINERKOPF,,47.568333,10.601389,1260 +alps_558,FALKENSTEIN,,47.569444,10.591667,1268 +alps_559,ZIEGELBERG,,47.573056,10.694167,835 +alps_560,HINTERTOERLE,,47.580833,10.851111,1674 +alps_561,FIRSTBERG,,47.578611,10.857500,1784 +alps_562,GRUBENKOPF,,47.579167,10.869444,1847 +alps_563,BAUMGARIENKOPF,,47.588056,10.872222,1433 +alps_564,ROSSSTALLKOPF,,47.587222,10.865000,1490 +alps_565,SCHWARZENKOPF,,47.588889,10.883333,1684 +alps_566,FEIGENKOPF,,47.579722,10.890556,1867 +alps_567,KLAMMSPITZGRAT,,47.580278,10.904167,1869 +alps_568,KLAMMSPITZ,,47.580556,10.909722,1924 +alps_569,SEFELWAND,,47.576944,10.914167,1724 +alps_570,KESSELWAND,,47.566389,10.867778,1784 +alps_571,BRUNNENKOPF,,47.582778,10.924444,1718 +alps_572,DREISAEULER KOPF,,47.585000,10.944444,1629 +alps_573,HENNENKOPF,,47.586389,10.960556,1768 +alps_574,LAUBENECK,,47.586944,10.979722,1758 +alps_575,TEUFELSTAETTKOPF,,47.587778,10.987222,1755 +alps_576,LATSCHENKOPF,,47.585833,10.985278,1740 +alps_577,PUERSCHLING,,47.582500,10.992778,1566 +alps_578,LAUBENBERG,,47.624167,10.020278,918 +alps_579,SCHWABENBERG,,47.619167,10.151389,1237 +alps_580,HAUCHENBERG,,47.620556,10.157778,1242 +alps_581,OCHSENBERG,,47.600278,10.098056,1125 +alps_582,KLEINBERG,,47.624444,10.173333,1243 +alps_583,ROTTACH BERG,,47.610278,10.315833,1074 +alps_584,BURGKRANZEGGER HORN,,47.630278,10.407500,1150 +alps_585,BAYERSTETTER KOEPFEL,,47.608611,10.489167,1174 +alps_586,GOERGELECK,,47.620000,10.840000,1429 +alps_587,HOCHRIES KOPF,,47.626389,10.859444,1470 +alps_588,WOLFS KOPF,,47.631111,10.868611,1526 +alps_589,BIRN KOPF,,47.616944,10.876389,1372 +alps_590,MAULKOPF,,47.627222,10.889167,1517 +alps_591,HOHE BLEICK,,47.629444,10.908056,1638 +alps_592,BRAMECK KOEPFE,,47.608611,10.898889,1287 +alps_593,HOCHSCHERGEN,,47.630556,10.992500,1396 +alps_594,HINTERSCHERGEN,,47.627222,10.978611,1307 +alps_595,KLEIN WACHSBICHEL,,47.619722,10.985556,1240 +alps_596,MITTER WACHSBICHEL,,47.613889,10.985833,1316 +alps_597,WACHSBICHEL,,47.604722,10.983333,1364 +alps_598,BREMENECK,,47.601389,10.997500,1410 +alps_599,IBERGERKUGEL,,47.639444,10.077500,1013 +alps_600,RIEDHOLZER KUGEL,,47.637500,10.063889,1065 +alps_601,STAUFEN BERG,,47.634444,10.022500,838 +alps_602,SONNENECK,,47.661944,10.157222,1106 +alps_603,ETTENSBERG,,47.650278,10.214722,996 +alps_604,STOFFEL BERG,,47.636944,10.224167,1063 +alps_605,SCHLOSS BERG,,47.648056,10.559167,921 +alps_606,SULZBERG,,47.653889,10.650278,932 +alps_607,SENKELEKOPF,,47.635833,10.658889,1047 +alps_608,WIESEL BERG,,47.643333,10.691667,1055 +alps_609,NIEDERBLEICK,,47.634722,10.911667,1589 +alps_610,SCHWARZECK,,47.637500,10.901111,1471 +alps_611,TRAUCH BERG,,47.636111,10.885278,1413 +alps_612,HALDEMOOSECK,,47.652222,10.946667,1007 +alps_613,HOCHWILDFEUER BERG,,47.633889,10.939444,1541 +alps_614,KLEINWILDFEUER BERG,,47.635556,10.934444,1500 +alps_615,THOMASBERG,,47.681944,10.069444,778 +alps_616,WOLFBUEHLER BERG,,47.670556,10.069444,787 +alps_617,HASENBERG,,47.672500,10.079444,831 +alps_618,SCHWARZER GRAT,,47.692500,10.125833,1145 +alps_619,SCHWARZER GRAT,,47.692500,10.209167,1145 +alps_620,HOHEN KOPF,,47.690556,10.180000,1122 +alps_621,SCHOEN BERG,,47.670000,10.180278,1049 +alps_622,SCHLECHTENBERG,,47.681944,10.389722,860 +alps_623,RODELSBERG,,47.685000,10.424167,964 +alps_624,ECKBERG,,47.683611,10.938611,962 +alps_625,IMBERGKAMM,,47.513056,10.033056,1325 +alps_626,SPITZLERBERG,,47.524722,10.075278,1400 +alps_627,DENNEBERG,,47.527778,10.085278,1427 +alps_628,STUIBEN,,47.517222,10.161667,1749 +alps_629,SEDERERSTUIBEN,,47.514444,10.153333,1737 +alps_630,BURALPKOPF,,47.510833,10.131389,1772 +alps_631,GUENDLESKOPF,,47.506667,10.123611,1748 +alps_632,RINDALPHORN,,47.505000,10.108056,1821 +alps_633,STEINE BERG,,47.525833,10.188889,1682 +alps_634,WITTELSBACHER HOEHE,,47.499722,10.256667,882 +alps_635,TIEFENBACHER ECK,,47.527500,10.356111,1517 +alps_636,SPIESER,,47.526667,10.384167,1649 +alps_637,HIRSCH BERG,,47.518889,10.376389,1500 +alps_638,KUEHGUNDKOPF,,47.503889,10.431944,1907 +alps_639,KUEHGUNDSPITZ,,47.505278,10.433611,1890 +alps_640,ISELER,,47.499722,10.421389,1876 +alps_641,ZUNDERKOPF,,47.529167,10.767500,1726 +alps_642,JOCHBERG,,47.522778,10.762778,1861 +alps_643,DUERRENBERG,,47.519722,10.764444,1799 +alps_644,SAUEREGG,,47.515833,10.776667,1706 +alps_645,ALTENBERG,,47.520556,10.801667,1751 +alps_646,KREUZKOPF,,47.520000,10.813333,1909 +alps_647,OCHSENAELPELESKOPF,,47.526389,10.813056,1905 +alps_648,SCHLAGSTEIN,,47.529722,10.788056,1680 +alps_649,SCHWARZENKOEPFL,,47.528333,10.908333,1897 +alps_650,BRANDJOCH,,47.505000,10.909444,1957 +alps_651,KREUZSPITZ,,47.526667,10.918333,2184 +alps_652,KREUZSPITZL,,47.517778,10.918611,2089 +alps_653,FRIEDERSPITZ,,47.516944,10.959444,2049 +alps_654,FRIEDER,,47.521667,10.960000,2053 +alps_655,SCHELLSCHLICHT,,47.509444,10.916667,2053 +alps_656,STAUFNER BERG,,47.554444,10.036389,1032 +alps_657,DREHERBERG,,47.537778,10.160278,1430 +alps_658,HIMMELECK,,47.536667,10.123333,1487 +alps_659,OBERECK,,47.541944,10.142222,1491 +alps_660,GSCHWENDER HORN,,47.551111,10.169722,1450 +alps_661,IMMENSTAEDTER HORN,,47.553889,10.187222,1489 +alps_662,MITTAGBERG,,47.536389,10.216111,1451 +alps_663,AM ROTEN KOPF,,47.541389,10.176944,1481 +alps_664,KREUZEL SPITZ,,47.546944,10.302222,1496 +alps_665,SIECHEN KOPF,,47.550833,10.308611,1572 +alps_666,GRUENTEN,,47.555000,10.320278,1737 +alps_667,STARZLACH BERG,,47.557222,10.406944,1583 +alps_668,WERTACHER HOERNLE,,47.549722,10.386667,1695 +alps_669,ROSSKOPF,,47.533333,10.370278,1590 +alps_670,SORGSCHROFEN,,47.555833,10.454722,1636 +alps_671,AECHSELE,,47.545833,10.485556,1525 +alps_672,SCHOENKAHLER,,47.540278,10.489167,1690 +alps_673,KIENBERG,,47.560000,10.490556,1493 +alps_674,HOTZEN BERG,,47.540000,10.424722,1232 +alps_675,BREITENBERG,,47.548611,10.552500,1838 +alps_676,AGGENSTEIN,,47.537222,10.558056,1985 +alps_677,VITSER BERG,,47.559444,10.656667,1026 +alps_678,AELPELESKOPF,,47.543889,10.742778,1591 +alps_679,PILGERSCHROFEN,,47.538611,10.741389,1769 +alps_680,SAEULING,,47.535000,10.755833,2047 +alps_681,TORKOPF,,47.561667,10.772222,1525 +alps_682,TEGELBERGKOPF,,47.558333,10.768611,1567 +alps_683,BRANDERSCHROFEN,,47.559444,10.787500,1880 +alps_684,DREIMAENNL,,47.558611,10.796944,1669 +alps_685,AHORNSPITZE,,47.553056,10.798611,1784 +alps_686,STRAUSSBERGKOEPFL,,47.548611,10.798333,1767 +alps_687,HOHER STRAUSSBERG,,47.543611,10.794722,1933 +alps_688,GEISELSTEIN,,47.561667,10.830278,1881 +alps_689,GUMPENKARSPITZE,,47.557222,10.826667,1918 +alps_690,GABELSCHROFEN,,47.553611,10.822222,1989 +alps_691,KRAEHE,,47.552778,10.825278,2010 +alps_692,NIEDERSTRAUSSBERG,,47.548611,10.815556,1877 +alps_693,KENZENKOPF,,47.561111,10.848611,1745 +alps_694,HOCHPLATTE,,47.552222,10.842500,2082 +alps_695,SCHEINBERGSPITZE,,47.554722,10.887778,1926 +alps_696,LOESERTALKOPF,,47.557778,10.875000,1859 +alps_697,HASENTALKOPF,,47.564444,10.876667,1797 +alps_698,VORDERSCHEINBERG,,47.563611,10.868056,1827 +alps_699,WEITALPSPITZ,,47.548333,10.862500,1870 +alps_700,HOCHBLASSE,,47.546111,10.838056,1989 +alps_701,BRUNNENKOEPFL,,47.549444,10.967500,1609 +alps_702,KIENJOCH,,47.540833,10.998889,1953 +alps_703,KUCHELBERGSPITZ,,47.541389,10.942222,2023 +alps_704,KUCHELBERGKOPF,,47.534722,10.926111,2026 +alps_705,KALZHOFNER HOEHE,,47.580278,10.062778,1117 +alps_706,SALMASER HOEHE,,47.571111,10.090556,1254 +alps_707,HUMBACHER BERG,,47.592222,10.294167,1175 +alps_708,KUEH BERG,,47.579444,10.401389,1289 +alps_709,REUTER WANNE,,47.590556,10.460833,1542 +alps_710,EDELS BERG,,47.592222,10.497222,1629 +alps_711,ALP SPITZ,,47.598056,10.496667,1575 +alps_712,PFEIFFERBERG,,47.585556,10.462500,1452 +alps_713,KLOCKNER KIENBERG,,47.566389,10.514444,1536 +alps_714,EINERKOPF,,47.568333,10.601389,1260 +alps_715,FALKENSTEIN,,47.569444,10.591667,1268 +alps_716,ZIEGELBERG,,47.573056,10.694167,835 +alps_717,HINTERTOERLE,,47.580833,10.851111,1674 +alps_718,FIRSTBERG,,47.578611,10.857500,1784 +alps_719,GRUBENKOPF,,47.579167,10.869444,1847 +alps_720,BAUMGARIENKOPF,,47.588056,10.872222,1433 +alps_721,ROSSSTALLKOPF,,47.587222,10.865000,1490 +alps_722,SCHWARZENKOPF,,47.588889,10.883333,1684 +alps_723,FEIGENKOPF,,47.579722,10.890556,1867 +alps_724,KLAMMSPITZGRAT,,47.580278,10.904167,1869 +alps_725,KLAMMSPITZ,,47.580556,10.909722,1924 +alps_726,SEFELWAND,,47.576944,10.914167,1724 +alps_727,KESSELWAND,,47.566389,10.867778,1784 +alps_728,BRUNNENKOPF,,47.582778,10.924444,1718 +alps_729,DREISAEULER KOPF,,47.585000,10.944444,1629 +alps_730,HENNENKOPF,,47.586389,10.960556,1768 +alps_731,LAUBENECK,,47.586944,10.979722,1758 +alps_732,TEUFELSTAETTKOPF,,47.587778,10.987222,1755 +alps_733,LATSCHENKOPF,,47.585833,10.985278,1740 +alps_734,PUERSCHLING,,47.582500,10.992778,1566 +alps_735,LAUBENBERG,,47.624167,10.020278,918 +alps_736,SCHWABENBERG,,47.619167,10.151389,1237 +alps_737,HAUCHENBERG,,47.620556,10.157778,1242 +alps_738,OCHSENBERG,,47.600278,10.098056,1125 +alps_739,KLEINBERG,,47.624444,10.173333,1243 +alps_740,ROTTACH BERG,,47.610278,10.315833,1074 +alps_741,BURGKRANZEGGER HORN,,47.630278,10.407500,1150 +alps_742,BAYERSTETTER KOEPFEL,,47.608611,10.489167,1174 +alps_743,GOERGELECK,,47.620000,10.840000,1429 +alps_744,HOCHRIES KOPF,,47.626389,10.859444,1470 +alps_745,WOLFS KOPF,,47.631111,10.868611,1526 +alps_746,BIRN KOPF,,47.616944,10.876389,1372 +alps_747,MAULKOPF,,47.627222,10.889167,1517 +alps_748,HOHE BLEICK,,47.629444,10.908056,1638 +alps_749,BRAMECK KOEPFE,,47.608611,10.898889,1287 +alps_750,HOCHSCHERGEN,,47.630556,10.992500,1396 +alps_751,HINTERSCHERGEN,,47.627222,10.978611,1307 +alps_752,KLEIN WACHSBICHEL,,47.619722,10.985556,1240 +alps_753,MITTER WACHSBICHEL,,47.613889,10.985833,1316 +alps_754,WACHSBICHEL,,47.604722,10.983333,1364 +alps_755,BREMENECK,,47.601389,10.997500,1410 +alps_756,IBERGERKUGEL,,47.639444,10.077500,1013 +alps_757,RIEDHOLZER KUGEL,,47.637500,10.063889,1065 +alps_758,STAUFEN BERG,,47.634444,10.022500,838 +alps_759,SONNENECK,,47.661944,10.157222,1106 +alps_760,ETTENSBERG,,47.650278,10.214722,996 +alps_761,STOFFEL BERG,,47.636944,10.224167,1063 +alps_762,SCHLOSS BERG,,47.648056,10.559167,921 +alps_763,SULZBERG,,47.653889,10.650278,932 +alps_764,SENKELEKOPF,,47.635833,10.658889,1047 +alps_765,WIESEL BERG,,47.643333,10.691667,1055 +alps_766,NIEDERBLEICK,,47.634722,10.911667,1589 +alps_767,SCHWARZECK,,47.637500,10.901111,1471 +alps_768,TRAUCH BERG,,47.636111,10.885278,1413 +alps_769,HALDEMOOSECK,,47.652222,10.946667,1007 +alps_770,HOCHWILDFEUER BERG,,47.633889,10.939444,1541 +alps_771,KLEINWILDFEUER BERG,,47.635556,10.934444,1500 +alps_772,THOMASBERG,,47.681944,10.069444,778 +alps_773,WOLFBUEHLER BERG,,47.670556,10.069444,787 +alps_774,HASENBERG,,47.672500,10.079444,831 +alps_775,SCHWARZER GRAT,,47.692500,10.125833,1145 +alps_776,SCHWARZER GRAT,,47.692500,10.209167,1145 +alps_777,HOHEN KOPF,,47.690556,10.180000,1122 +alps_778,SCHOEN BERG,,47.670000,10.180278,1049 +alps_779,SCHLECHTENBERG,,47.681944,10.389722,860 +alps_780,RODELSBERG,,47.685000,10.424167,964 +alps_781,ECKBERG,,47.683611,10.938611,962 +alps_782,WINDSTIERLKOPF,,47.530556,11.007222,1824 +alps_783,FELDERKOPF,,47.530833,11.017778,1818 +alps_784,VORDERER FELDERKOPF,,47.530278,11.029444,1928 +alps_785,HIRSCHBUEHEL,,47.514444,11.012778,1934 +alps_786,VORDERE ZIEGSPITZE,,47.506389,11.011111,1815 +alps_787,HOHER ZIEGSPITZ,,47.501389,11.003611,1864 +alps_788,KRAMERSPITZ,,47.506944,11.047500,1985 +alps_789,HOHER FRICKEN,,47.531944,11.154444,1940 +alps_790,AMIESBERG,,47.508889,11.143333,1780 +alps_791,GRASBERG,,47.521944,11.356389,1783 +alps_792,GALGENSTANGENKOPF,,47.511944,11.404167,1806 +alps_793,FERMERSKOPF,,47.506111,11.396389,1851 +alps_794,BAIERKARSPITZE,,47.502222,11.386667,1909 +alps_795,OCHSENSTAFFEL,,47.510000,11.340278,1871 +alps_796,SCHOETTELKOPF,,47.503333,11.337500,1907 +alps_797,OBERES LICHTECK,,47.514444,11.492222,1980 +alps_798,SCHAFREUTER,,47.509167,11.488333,2101 +alps_799,KOTZEN,,47.529444,11.520000,1771 +alps_800,RHONKOPF,,47.516944,11.537500,1551 +alps_801,TROGENKOEPFL,,47.517222,11.576111,1464 +alps_802,LERCHKOGEL,,47.514167,11.562778,1688 +alps_803,OESTLICHE TORJOCH,,47.509722,11.538611,1826 +alps_804,STIERJOCH,,47.510833,11.519444,1908 +alps_805,WESTLICHER TORJOCH,,47.506944,11.502222,1838 +alps_806,NOTKARSPITZE,,47.553611,11.055556,1889 +alps_807,BRUENSTELSKOPF,,47.538611,11.046389,1814 +alps_808,GROSSER ZUNDERKOPF,,47.533889,11.033333,1895 +alps_809,KIENECKSPITZ,,47.545000,11.004167,1943 +alps_810,GEISSSPRUNGKOPF,,47.539167,11.000833,1934 +alps_811,OCHSENSITZ,,47.556667,11.084722,1515 +alps_812,SCHAFKOPF,,47.544167,11.090833,1380 +alps_813,NEUGLAEGERKOPF,,47.552500,11.259444,1491 +alps_814,ALTLACHER HOCHKOPF,,47.554444,11.357500,1328 +alps_815,MITTERBERG,,47.563611,11.401111,1311 +alps_816,PFETTERKOPF,,47.533333,11.387500,1547 +alps_817,GRASKOEPFL,,47.536944,11.472222,1753 +alps_818,GRAMMERSBERG,,47.550000,11.491944,1476 +alps_819,ROSSKOPF,,47.554722,11.525000,1131 +alps_820,DUERRNBERGJOCH,,47.548611,11.574167,1835 +alps_821,DEMELJOCH,,47.545833,11.586667,1923 +alps_822,SONNENBERGGRAT,,47.583333,11.003056,1556 +alps_823,SONNENBERG,,47.584167,11.016667,1622 +alps_824,BRUNNBERG,,47.583333,11.040556,1529 +alps_825,RAPPENKOPF,,47.582778,11.055278,1408 +alps_826,LABERBERG,,47.585000,11.101389,1686 +alps_827,SIMETSBERG,,47.566667,11.255000,1840 +alps_828,ZWOELFERKOEPFL,,47.584167,11.432222,1437 +alps_829,STAFFEL,,47.585833,11.468333,1532 +alps_830,FALKENWAND,,47.583056,11.503611,1228 +alps_831,BRANDKOPF,,47.594722,11.580000,1258 +alps_832,SCHWARZBERG,,47.576667,11.503889,1293 +alps_833,ACHSELKOPF,,47.589722,11.618056,1189 +alps_834,REITBERG,,47.584444,11.661667,1455 +alps_835,HUEHNERBERG,,47.570556,11.588056,1397 +alps_836,REITSTEIN,,47.584444,11.678889,1516 +alps_837,PLATTENECK,,47.591667,11.711944,1616 +alps_838,SCHILDENSTEIN,,47.595000,11.725556,1613 +alps_839,BLAUBERGSCHNEID,,47.588611,11.751667,1787 +alps_840,BLAUBERGKOPF,,47.590000,11.768056,1787 +alps_841,HALSERSPITZ,,47.591111,11.781667,1862 +alps_842,SCHATTLAHNERKOPF,,47.585278,11.811111,1629 +alps_843,RIESELBERG,,47.594444,11.850278,1574 +alps_844,ROSENGARTEN,,47.601944,11.005000,1423 +alps_845,SCHARTEN KOEPFEL,,47.606944,11.006111,1370 +alps_846,GROSSER AUFACKER,,47.613889,11.098056,1542 +alps_847,KLEINER AUFACKER,,47.613611,11.106389,1533 +alps_848,ILLING,,47.625556,11.270278,1347 +alps_849,HEIMGARTEN,,47.612500,11.281111,1791 +alps_850,HERZOGSTAND,,47.613333,11.308889,1731 +alps_851,JOCHBERG,,47.626111,11.372500,1565 +alps_852,HIRSCHHOERNLKOPF,,47.627500,11.406944,1514 +alps_853,LATSCHENKOPF,,47.631111,11.464167,1488 +alps_854,BRANDKOPF,,47.612500,11.523889,1152 +alps_855,LETTNER BERG,,47.620000,11.542500,1052 +alps_856,TALKOPF,,47.617778,11.563056,1273 +alps_857,MITTERKOPF,,47.611389,11.556667,1275 +alps_858,ANDERLKOPF,,47.610556,11.564167,1231 +alps_859,HOCHBERGSCHNEID,,47.621111,11.568889,1221 +alps_860,HOHER ZWIESLER,,47.600556,11.540556,1374 +alps_861,ROTWAND,,47.599444,11.508611,1104 +alps_862,SAURUESSELKOPF,,47.622778,11.652500,1364 +alps_863,BREITENKOPF,,47.618056,11.633611,1345 +alps_864,ROSSKOPF,,47.613889,11.610556,1403 +alps_865,GERSTENRIEDER KOPF,,47.604722,11.600833,1421 +alps_866,GEISSKOPF,,47.601111,11.596111,1352 +alps_867,SCHERGENWIESER BERG,,47.608889,11.604722,1427 +alps_868,SONNBERG,,47.628889,11.674722,1576 +alps_869,HOHLENSTEIN,,47.620833,11.765556,1230 +alps_870,GROSSER WILDBRENNER,,47.618889,11.766111,1234 +alps_871,WENIGBERG,,47.608611,11.763611,1326 +alps_872,WEISSENBACHKOPF,,47.607500,11.774167,1352 +alps_873,LAPBERG,,47.616111,11.804167,1429 +alps_874,LAPBERGSCHNEID,,47.614167,11.825278,1430 +alps_875,ZWIESELBERG,,47.610278,11.773611,1341 +alps_876,PFAFFENKOPF,,47.614167,11.852222,1619 +alps_877,ROTKOGEL,,47.608333,11.854722,1687 +alps_878,SCHINDER,,47.602778,11.852222,1796 +alps_879,SCHINDER,,47.601111,11.861667,1807 +alps_880,TUSCHBERG,,47.618333,11.911389,1320 +alps_881,KREUZBERG,,47.612778,11.934167,1715 +alps_882,VORDERER GEISSBERG,,47.643611,11.061389,1484 +alps_883,HINTERER GEISSBERG,,47.638889,11.075278,1548 +alps_884,MITTLERER GEISSBERG,,47.640278,11.062778,1496 +alps_885,RABENKOPF,,47.650556,11.413056,1555 +alps_886,BERGELSKOPF,,47.642500,11.401944,1413 +alps_887,GLASWAND,,47.652778,11.437222,1496 +alps_888,BENEDIKTENWAND,,47.653056,11.465833,1799 +alps_889,ACHSELKOEPFE,,47.653056,11.487222,1709 +alps_890,HENNENKOPF,,47.661944,11.482500,1613 +alps_891,LATSCHENKOPF,,47.656667,11.499444,1712 +alps_892,STANGENECK,,47.660556,11.509167,1646 +alps_893,BRAUNECK,,47.664167,11.525278,1554 +alps_894,DUEFTBERG,,47.637778,11.519444,1125 +alps_895,GRASLEITENKOPF,,47.653889,11.630278,1433 +alps_896,AUERKAMP,,47.661111,11.660278,1607 +alps_897,AUERSPITZ,,47.658889,11.655278,1604 +alps_898,BRANDKOPF,,47.656111,11.653333,1569 +alps_899,SEEKARKREUZ,,47.652222,11.643611,1601 +alps_900,SCHOENBERG,,47.638611,11.642778,1620 +alps_901,OCHSENKAMP,,47.666111,11.666389,1594 +alps_902,HIRSCHBERG,,47.660833,11.696667,1668 +alps_903,LEONHARDSTEIN,,47.636944,11.716667,1449 +alps_904,FILZENKOGEL,,47.645833,11.713611,1444 +alps_905,HOCHPLATTE,,47.640556,11.667500,1592 +alps_906,BUCHSTEIN,,47.633056,11.679722,1701 +alps_907,ROSSSTEIN,,47.632778,11.676667,1698 +alps_908,SETZBERG,,47.651389,11.785000,1706 +alps_909,WALLBERG,,47.665833,11.797222,1722 +alps_910,BLANKENSTEIN,,47.640278,11.803333,1768 +alps_911,RISSERKOGEL,,47.636944,11.804167,1825 +alps_912,LAHNERKOPF,,47.638333,11.823889,1621 +alps_913,GRUBERECK,,47.638889,11.786111,1664 +alps_914,ROSSKOPF,,47.655833,11.862500,1580 +alps_915,ROTKOPF,,47.648889,11.866389,1602 +alps_916,STOLZENBERG,,47.642500,11.872778,1609 +alps_917,STUEMPFLING,,47.662222,11.856944,1506 +alps_918,SCHWARZENKOPF,,47.657222,11.901111,1464 +alps_919,ROTWAND,,47.650278,11.935000,1884 +alps_920,RUCHENKOEPFE,,47.648056,11.947778,1805 +alps_921,LAMPERSBERG,,47.652222,11.925833,1817 +alps_922,HOCHMIESING,,47.657778,11.941667,1883 +alps_923,DUERRMIESING,,47.658333,11.947500,1863 +alps_924,TAUBENSTEIN,,47.658611,11.921667,1692 +alps_925,RAUHKOPF,,47.663611,11.921111,1689 +alps_926,GAMSWAND,,47.651111,11.968889,1592 +alps_927,AUERSPITZ,,47.643889,11.945833,1811 +alps_928,MAROLDSCHNEID,,47.643611,11.967222,1688 +alps_929,VOGELKOPF,,47.687500,11.482222,1210 +alps_930,BUCHENAUER KOPF,,47.693333,11.467500,1225 +alps_931,KEILKOPF,,47.695278,11.603056,1125 +alps_932,SCHWEINBERG,,47.696944,11.622222,1278 +alps_933,SCHWARZBERGEL,,47.688056,11.625000,1307 +alps_934,GEIERSTEIN,,47.680000,11.620833,1491 +alps_935,FOCKENSTEIN,,47.684444,11.652778,1564 +alps_936,SCHLAGKOPF,,47.676389,11.636389,1332 +alps_937,REIMERSBERG,,47.697222,11.644444,1230 +alps_938,SATTELKOPF,,47.694167,11.672500,1384 +alps_939,RINGSPITZ,,47.683056,11.733611,1293 +alps_940,RINGBERG,,47.675000,11.720000,1344 +alps_941,RAINERKOPF,,47.685556,11.842778,1465 +alps_942,WASSERSPITZ,,47.680278,11.836389,1552 +alps_943,RINNERSPITZ,,47.674444,11.834444,1611 +alps_944,BODENSCHNEID,,47.671667,11.838611,1667 +alps_945,JAEGERKAMP,,47.673611,11.906667,1746 +alps_946,BENZINGSPITZ,,47.673056,11.912778,1735 +alps_947,WILDE FRAEULEIN,,47.668056,11.903611,1615 +alps_948,NAGELSPITZ,,47.685000,11.908611,1554 +alps_949,BRECHERSPITZ,,47.676667,11.871667,1683 +alps_950,HEISSENPLATTE,,47.683333,11.931389,1593 +alps_951,AIPLSPITZ,,47.673056,11.924444,1759 +alps_952,SIGERETKOPF,,47.529722,12.853889,2066 +alps_953,GROSSES PALFELHORN,,47.528056,12.863611,2222 +alps_954,HUNDSTODKENDELKOPF,,47.518611,12.886111,2396 +alps_955,GROSSER HUNDSTOD,,47.512500,12.886667,2593 +alps_956,ROTLEITENSCHNEID,,47.523056,12.894444,2229 +alps_957,GJAIDKOPF,,47.516389,12.911667,2268 +alps_958,GRASKOPF,,47.520278,12.907500,2094 +alps_959,SCHNEIBERG,,47.510833,12.912222,2329 +alps_960,KLEINES PALFENHORN,,47.532500,12.870833,2073 +alps_961,HACHELKOEPFE,,47.530556,12.934444,2066 +alps_962,HIRSCHWIESE,,47.529722,12.917222,2114 +alps_963,GOTZENBERG,,47.532222,12.993611,1704 +alps_964,KLEINER REGENSBERGL,,47.522778,12.996944,1670 +alps_965,HALSKOPF,,47.510556,12.975000,1719 +alps_966,SIMETSBERG,,47.510833,12.952778,1884 +alps_967,HIRSCHBICHLKOPF,,47.563611,12.793333,1378 +alps_968,KARLKOPF,,47.545833,12.823333,2195 +alps_969,HOCHEISHORNL,,47.555000,12.831389,2252 +alps_970,HINTERBERGHORN,,47.550833,12.839722,2493 +alps_971,HOCHEISSPITZE,,47.546944,12.843333,2523 +alps_972,KAMMERLING,,47.545278,12.836944,2506 +alps_973,HINTERBERGKOPF,,47.551389,12.853056,2247 +alps_974,STEINTALHOERNL,,47.559722,12.855833,2468 +alps_975,OFENTALHOERNL,,47.562500,12.862222,2513 +alps_976,GRIESSPITZE,,47.543889,12.904722,2257 +alps_977,HOCHECK,,47.558333,12.924722,2651 +alps_978,WATZMANNKINDER,,47.553611,12.938611,2247 +alps_979,KLEINER WATZMANN,,47.558889,12.943333,2306 +alps_980,MITTELSPITZE WATZMANN,,47.554444,12.922778,2713 +alps_981,SEEAUKOPF,,47.548333,12.995833,1505 +alps_982,WARTECK,,47.540000,12.993889,1741 +alps_983,SCHOENFELDSCHNEID,,47.541111,12.917500,2310 +alps_984,SUEDSPITZE WATZMANN,,47.548056,12.917778,2712 +alps_985,WAGENDRISCHELHORN,,47.598889,12.792500,2251 +alps_986,STADELHORN,,47.592778,12.795833,2286 +alps_987,GROSSES MUEHLSTURZHORN,,47.590556,12.798611,2234 +alps_988,GRUNDUEBELHOERNER,,47.592778,12.807778,2096 +alps_989,KNITTELHORN,,47.595278,12.810556,2015 +alps_990,SULZERSTEIN,,47.572778,12.783056,1693 +alps_991,GERNHORN,,47.579167,12.779722,1908 +alps_992,AMEISNOCKENKOPFL,,47.585556,12.786389,1924 +alps_993,ROTPALFEN,,47.578611,12.862778,2367 +alps_994,STEINBERG,,47.587222,12.876944,2026 +alps_995,SCHARTENSPITZE,,47.581944,12.875556,2153 +alps_996,STANGLAHNERKOPF,,47.579444,12.890833,1791 +alps_997,KLEINKALTER,,47.572778,12.863333,2513 +alps_998,BLAUEISSPITZE,,47.571944,12.870000,2481 +alps_999,HOCHKALTER,,47.569444,12.866667,2607 +alps_1000,SCHAPBACHRIEDEL,,47.588611,12.956944,1329 +alps_1001,GRUENSTEIN,,47.594444,12.966389,1303 +alps_1002,SOMMERBICHEL,,47.577500,12.974722,1292 +alps_1003,BRUNNERKOEPFE,,47.625278,12.008889,1105 +alps_1004,TRAINSJOCH,,47.615278,12.055000,1706 +alps_1005,WIRTSHOEHE,,47.628611,12.065000,1401 +alps_1006,VORDERER SONNBERG,,47.610000,12.088333,1414 +alps_1007,NATTERSBERG,,47.619722,12.514722,1221 +alps_1008,SONDERSBERG,,47.618611,12.557778,1242 +alps_1009,UNTERER PLATTELKOPF,,47.601667,12.797222,2106 +alps_1010,OBERER PLATTELKOPF,,47.605556,12.803611,2098 +alps_1011,PREDIGLSTUHL,,47.605000,12.811111,2004 +alps_1012,REITER STEINBERG,,47.610278,12.808056,2060 +alps_1013,PRUENZLKOPF,,47.611111,12.816389,2081 +alps_1014,SCHOTTMALHORN,,47.613333,12.830556,2045 +alps_1015,EDELWEISSLAHNERKOPF,,47.618889,12.837778,1953 +alps_1016,EISBERG,,47.625833,12.848056,1799 +alps_1017,GSENGSCHNEID,,47.624167,12.891944,1307 +alps_1018,HALSKOPF,,47.601667,12.834167,1285 +alps_1019,GOETSCHENKOPF,,47.631944,12.935000,1305 +alps_1020,TOTER MANN,,47.631111,12.924167,1390 +alps_1021,VOGELSANG,,47.661389,12.035833,1563 +alps_1022,KLEINE TRAITEN,,47.655000,12.036389,1722 +alps_1023,GROSSE TRAITEN,,47.646667,12.038333,1851 +alps_1024,STEILNER JOCH,,47.645833,12.055278,1747 +alps_1025,BRUENNSTEIN,,47.648333,12.094722,1634 +alps_1026,ROTWANDLSPITZ,,47.648611,12.083611,1587 +alps_1027,SCHWARZENBERG,,47.641667,12.136944,1208 +alps_1028,GROSSER BRUENNBERG,,47.642222,12.102500,1336 +alps_1029,FARMLEITENKOPF,,47.636944,12.491944,1434 +alps_1030,NATTERSBERG,,47.653056,12.514722,1221 +alps_1031,SONDERSBERG,,47.651944,12.557778,1242 +alps_1032,SCHEIBELBERG,,47.632500,12.575556,1465 +alps_1033,ALPHORN,,47.659722,12.826111,1710 +alps_1034,WARTSTEINKOPF,,47.650556,12.804444,1758 +alps_1035,HIRSCHECK,,47.653056,12.811389,1781 +alps_1036,UEBELECK,,47.654722,12.830278,1732 +alps_1037,WEITSCHARTENKOPF,,47.633056,12.787778,1978 +alps_1038,MOOSENKOPF,,47.657778,12.865278,1504 +alps_1039,KARSPITZ,,47.648333,12.879722,1641 +alps_1040,PFAFFENBUEHL,,47.645556,12.895833,1428 +alps_1041,JOCHKOEPFL FEUERSPITZ,,47.643333,12.876667,1575 +alps_1042,WACHTERHORN,,47.645000,12.863889,1475 +alps_1043,BADERLEHENKOPF,,47.636944,12.985833,756 +alps_1044,KAELBERSTEIN,,47.635556,12.993056,786 +alps_1045,TAGWEIDKOPF,,47.699167,12.023611,1724 +alps_1046,BOCKSTEIN,,47.697778,12.008056,1555 +alps_1047,GROSSER MUEHLBERG,,47.679167,12.070278,1222 +alps_1048,WALDKOPF,,47.675000,12.042778,1256 +alps_1049,DUEMPFEL,,47.691667,12.069722,1354 +alps_1050,SCHRECKENKOPF,,47.688056,12.068889,1316 +alps_1051,WILDBARREN,,47.681111,12.138889,1448 +alps_1052,MITTERBERG,,47.689722,12.122500,1214 +alps_1053,MOOSBERG,,47.697778,12.321667,1396 +alps_1054,BREITENSTEIN,,47.696944,12.338611,1661 +alps_1055,RUDERSBURG,,47.683889,12.369444,1430 +alps_1056,KARKOPF,,47.690278,12.340278,1510 +alps_1057,REITBERG,,47.686389,12.523056,1143 +alps_1058,STUHLKOPF,,47.688056,12.543611,1264 +alps_1059,MUEHLPRACHKOPF,,47.669167,12.526667,1331 +alps_1060,WILDALPHORN,,47.675556,12.629167,1689 +alps_1061,DUERRNBACHHORN,,47.673056,12.605833,1767 +alps_1062,FISCHBACHKOPF,,47.681111,12.666667,1694 +alps_1063,REIFELBERG,,47.682222,12.678611,1883 +alps_1064,VORDERLAHNER KOPF,,47.682500,12.684722,1908 +alps_1065,HIRSCHECK,,47.681111,12.686111,1882 +alps_1066,SONNTAGSHORN,,47.682222,12.696667,1961 +alps_1067,AIBLECK,,47.689444,12.708611,1756 +alps_1068,RISTFEUCHTHORN,,47.694444,12.782500,1569 +alps_1069,RABENSTEINHORN,,47.696944,12.824444,1373 +alps_1070,KIENBERG,,47.676667,12.805000,1028 +alps_1071,WENDELBERG,,47.675000,12.774444,959 +alps_1072,GRIMMBERG,,47.676944,12.752778,1035 +alps_1073,KRANZKOGEL,,47.686944,12.763333,1241 +alps_1074,VOGELSPITZ,,47.681667,12.850833,1287 +alps_1075,PRECHLKOPF,,47.666111,12.857500,1435 +alps_1076,PREDIGTSTUHL,,47.696111,12.879167,1613 +alps_1077,HOCHSCHLEGL,,47.691389,12.884444,1688 +alps_1078,KARKOPF,,47.686389,12.893333,1738 +alps_1079,DREISESSELBERG,,47.691389,12.898611,1680 +alps_1080,KEILKOPF,,47.690278,12.905833,1602 +alps_1081,TOERLKOPF,,47.676944,12.893611,1704 +alps_1082,SCHRECK,,47.688889,12.890556,1725 +alps_1083,TOERLSCHNEID,,47.667500,12.887222,1629 +alps_1084,BERCHTESGADENER HOCHTHRON,,47.693611,12.987500,1972 +alps_1085,NIERNTAL KOPF,,47.681111,12.951667,1129 +alps_1086,BANNKOPF,,47.678889,12.974167,1658 +alps_1087,ROTOFEN,,47.694167,12.920000,1396 +alps_1088,HEIDWAND,,47.715278,12.019444,1585 +alps_1089,HOCHSALWAND,,47.716944,12.036389,1625 +alps_1090,LECHNERKOPF,,47.718611,12.037500,1547 +alps_1091,RAMPOLDPLATTE,,47.723889,12.044167,1422 +alps_1092,BREITENBERG,,47.725278,12.065278,1147 +alps_1093,SCHORTENKOPF,,47.701111,12.064167,1322 +alps_1094,MUTTERBERG,,47.708611,12.060556,1262 +alps_1095,WILDALPJOCH,,47.701389,12.036111,1725 +alps_1096,WENDELSTEIN,,47.703611,12.012778,1837 +alps_1097,RIESENKOPF,,47.708333,12.107500,1337 +alps_1098,REHLEITENKOPF,,47.702500,12.104444,1338 +alps_1099,HIRSCHNAGEL,,47.707222,12.101389,1241 +alps_1100,HEUBERG,,47.726111,12.185000,1338 +alps_1101,KITZSTEIN,,47.723333,12.189167,1398 +alps_1102,SPITZSTEIN,,47.710833,12.247500,1596 +alps_1103,KRANZHORN,,47.700833,12.185000,1366 +alps_1104,WASSERWAND,,47.727778,12.185556,1367 +alps_1105,BRANDELBERG,,47.717500,12.254722,1516 +alps_1106,ASCHENTALER WAENDE,,47.720833,12.327222,1738 +alps_1107,MUEHLHORNWAND,,47.706111,12.318056,1658 +alps_1108,ZINNENBERG,,47.732500,12.265278,1565 +alps_1109,ROSSALPENKOPF,,47.713889,12.334167,1762 +alps_1110,GEIGELSTEIN,,47.707500,12.335000,1812 +alps_1111,VOGELWAND,,47.701667,12.457778,1108 +alps_1112,CHENBERG,,47.725556,12.518333,1466 +alps_1113,REHWALDKOPF,,47.719722,12.535000,1395 +alps_1114,GRUNDBERG,,47.725556,12.561944,1225 +alps_1115,GURNWANDKOPF,,47.705833,12.579444,1690 +alps_1116,HOCHSCHARTEN,,47.701944,12.538056,1474 +alps_1117,RACHELSPITZ,,47.709444,12.523056,1415 +alps_1118,SULZGRABENKOPF,,47.717222,12.591944,1521 +alps_1119,EISENBERG,,47.728889,12.621944,1488 +alps_1120,UNTERNBERG,,47.729167,12.640833,1425 +alps_1121,KIENBERG,,47.704722,12.607778,1351 +alps_1122,HOERNDLWAND,,47.706389,12.585000,1684 +alps_1123,AUGENSTEIN,,47.699444,12.717778,1584 +alps_1124,SCHADLOSBERG,,47.718611,12.789444,931 +alps_1125,ALBAUER KOPF,,47.711667,12.803333,933 +alps_1126,GEBERSBERG,,47.700278,12.814167,1051 +alps_1127,GAMSALPKOPF,,47.700278,12.990000,1886 +alps_1128,RAUHECK,,47.705556,12.992500,1846 +alps_1129,MITTERBERG,,47.707778,12.976111,1840 +alps_1130,OCHSENKOPF,,47.709444,12.963333,1780 +alps_1131,HIRSCHANGERKOPF,,47.707778,12.956389,1769 +alps_1132,SULZBERG,,47.746111,12.060556,1117 +alps_1133,FARRENPOINT,,47.743333,12.036389,1272 +alps_1134,MITTERBERG,,47.734444,12.042500,1214 +alps_1135,STEINBERG,,47.761667,12.157222,729 +alps_1136,FEICHLECK,,47.734444,12.231667,1514 +alps_1137,KARKOPF,,47.739722,12.240833,1496 +alps_1138,HOCHRIES,,47.747222,12.249444,1567 +alps_1139,RIESENBERG,,47.759722,12.270278,1449 +alps_1140,SPIELBERG,,47.752778,12.267778,1440 +alps_1141,ABERECK,,47.749722,12.278333,1461 +alps_1142,LAUBENSTEIN,,47.757222,12.288611,1350 +alps_1143,ZELLERWANDL,,47.753333,12.289722,1405 +alps_1144,HEURAFFELKOPF,,47.748056,12.280833,1504 +alps_1145,KLAUSENBERG,,47.738889,12.267222,1554 +alps_1146,KAMPENWAND,,47.755833,12.368056,1668 +alps_1147,SONNWENDWAND,,47.746389,12.335000,1512 +alps_1148,SCHEIBENWAND,,47.751667,12.348889,1598 +alps_1149,HOCHALPENKOPF,,47.753056,12.380000,1494 +alps_1150,HOCHPLATTE,,47.751111,12.405833,1587 +alps_1151,FRIEDENRATH,,47.760000,12.406111,1432 +alps_1152,SCHNAPPENBERG,,47.763056,12.487500,1260 +alps_1153,ZWOELFERSPITZ,,47.751944,12.501111,1633 +alps_1154,HOCHGERN,,47.751111,12.517222,1744 +alps_1155,SILLECK,,47.755000,12.524167,1565 +alps_1156,KOESTELKOPF,,47.760833,12.525278,1349 +alps_1157,HOCHFELLN,,47.761667,12.559722,1671 +alps_1158,WEISSGRABENKOPF,,47.751111,12.558611,1578 +alps_1159,GROHRKOPF,,47.746111,12.560833,1562 +alps_1160,HAARALMSCHNEID,,47.740278,12.567222,1577 +alps_1161,HASENPOINT,,47.745000,12.513889,1587 +alps_1162,HOCHSATTEL,,47.740278,12.515556,1547 +alps_1163,MANSURFER,,47.737500,12.526111,1508 +alps_1164,REITSTEIN,,47.748056,12.592500,1250 +alps_1165,HASSLBERG,,47.753056,12.613889,1117 +alps_1166,ZELLER BERG,,47.765000,12.670833,1065 +alps_1167,KIENBERG,,47.746389,12.742222,1135 +alps_1168,ZENOKOPF,,47.734722,12.720278,1603 +alps_1169,HINTERER RAUSCHBERG,,47.733056,12.697500,1671 +alps_1170,VORDERER RAUSCHBERG,,47.733056,12.686111,1645 +alps_1171,FALKENSTEIN,,47.747222,12.758056,1181 +alps_1172,ZEHNOKOPF,,47.753611,12.819167,1756 +alps_1173,GAMSKOGEL,,47.755278,12.805556,1750 +alps_1174,HINTERSTAUFEN,,47.755833,12.815000,1781 +alps_1175,ANGERSTEIN,,47.754722,12.791111,1482 +alps_1176,GRUBERHOERNDL,,47.752222,12.785278,1493 +alps_1177,SCHARNKOPF,,47.738889,12.771389,1356 +alps_1178,MITTELSTAUFEN,,47.754167,12.838333,1680 +alps_1179,HOCHSTAUFEN,,47.755278,12.849444,1771 +alps_1180,DANDLBERG,,47.766667,12.177500,909 +alps_1181,ASCHAUER KOPF,,47.780278,12.298889,1076 +alps_1182,SCHWARZENBERG,,47.773056,12.273611,1136 +alps_1183,REIFENBERG,,47.789722,12.378333,995 +alps_1184,ERLBERGKOPF,,47.778056,12.376667,1134 +alps_1185,GROSSSTAFFEN,,47.769722,12.411111,1290 +alps_1186,GEDERERWAND,,47.766944,12.382222,1398 +alps_1187,HAINDORFER BERG,,47.780278,12.352500,1123 +alps_1188,GLEICHENBERG,,47.776667,12.572500,1156 +alps_1189,HOCHWURZ,,47.769722,12.523056,1290 +alps_1190,KOBELWAND,,47.767778,12.507222,1214 +alps_1191,BAIRERKOPF,,47.773056,12.527778,1283 +alps_1192,HAARGASSBERG,,47.773889,12.621944,1210 +alps_1193,SCHEICHENBERG,,47.777500,12.599444,1243 +alps_1194,ZINNKOPF,,47.781389,12.678056,1227 +alps_1195,SCHULZBERGSCHNEID,,47.775833,12.702500,1159 +alps_1196,TEISENBERGKOPF,,47.788056,12.774167,1264 +alps_1197,HOCHSAEUL,,47.515278,13.029722,2073 +alps_1198,KAHLERSBERG,,47.531389,13.032778,2350 +alps_1199,KRAGENKOPF,,47.520556,13.046667,2176 +alps_1200,HINTERER KRAGENKOPF,,47.514722,13.047500,2142 +alps_1201,LENGTALSCHNEID,,47.519167,13.063333,2228 +alps_1202,BRAMERSPFENKOPF,,47.505556,13.041667,2147 +alps_1203,FARRENLEITENWAND,,47.560556,13.027500,1716 +alps_1204,SCHNEIBSTEIN,,47.562222,13.058333,2276 +alps_1205,BRENNETECK,,47.552500,13.063333,1960 +alps_1206,ROTHSPIELSCHEIBE,,47.556667,13.034167,1940 +alps_1207,FAGSTEIN,,47.549167,13.031944,2164 +alps_1208,WINDSCHARTENKOPF,,47.550278,13.045278,2211 +alps_1209,HOCHSEELEINKOPF,,47.542222,13.037500,2109 +alps_1210,SCHLUNGHORN,,47.548056,13.045833,2203 +alps_1211,GOTZENTAUERN,,47.539444,13.011389,1858 +alps_1212,MANDLHOEHE,,47.535833,13.062778,2049 +alps_1213,HOHER GOELL,,47.594167,13.067778,2522 +alps_1214,ARCHENKOPF,,47.586111,13.070278,2391 +alps_1215,BRETTRIEDEL,,47.585833,13.058889,2344 +alps_1216,HOHES BRETT,,47.584444,13.050556,2340 +alps_1217,PFAFFENKEGEL,,47.576944,13.041944,1900 +alps_1218,JENNER,,47.575556,13.021111,1874 +alps_1219,KEHLSTEIN,,47.611667,13.042500,1837 +alps_1220,AHORNBUECHKOPF,,47.619722,13.082500,1604 +alps_1221,HOHNENKAMM,,47.622778,13.088611,1566 +alps_1222,KNEIFELSPITZE,,47.658333,13.018056,1188 +alps_1223,BRAENDLBERG,,47.664167,13.047500,934 +alps_1224,LERCHECKER,,47.661944,13.068333,1049 +alps_1225,HAHNRAINWALD,,47.658056,13.081944,1026 +alps_1226,ACHTFORS,,47.636111,13.078611,1307 +alps_1227,ZINKENKOPF,,47.648056,13.087500,1336 +alps_1228,GEISSSTATHOEHE,,47.644444,13.092778,1261 +alps_1229,HOCHZINKEN,,47.694722,13.035278,923 +alps_1230,HOHE GOETSCHEN,,47.695833,13.065000,930 +alps_1231,BARMSTEIN,,47.691389,13.076111,851 +alps_1232,ECKBERG,,47.686111,13.023611,1017 +alps_1233,GROSSER HEUBERGKOPF,,47.715278,13.005000,1836 +alps_1234,SALZBUERGER HOCHTHRON,,47.718056,13.005556,1852 +alps_1235,GEIERECK,,47.722500,13.009444,1805 +alps_1236,GUTER HIRT,,47.720833,13.008333,1810 +alps_1237,KIENBERGKOPF,,47.715833,13.030000,994 +alps_1238,LE CUCHON,,44.636111,6.224444,2002 +alps_1239,L'ECHINE DE L'ANE,,44.628056,6.286667,2155 +alps_1240,SERRE LA GRANGE,,44.623611,6.254167,1680 +alps_1241,POINTE DE LA POURRACHIERE,,44.614722,6.268056,2216 +alps_1242,COL DE LA POURRACHIERE,,44.614167,6.267778,2173 +alps_1243,POINTE DE FLEURENDON,,44.613056,6.289722,2497 +alps_1244,L'AIGUILLE,,44.610000,6.248056,2367 +alps_1245,LA PETITE AIGUILLE,,44.608611,6.252222,2366 +alps_1246,COL DE FLEURENDON,,44.607500,6.290833,2359 +alps_1247,L'ARCHE,,44.607222,6.241667,2256 +alps_1248,LE PIOLIT,,44.603611,6.267778,2464 +alps_1249,LES PARIAS,,44.601944,6.288889,2512 +alps_1250,FAUDON,,44.595833,6.215833,1658 +alps_1251,CLOT DU ROCHER,,44.605000,6.258889,2360 +alps_1252,COL DE CHORGES,,44.602500,6.276944,2249 +alps_1253,LE BARLE,,44.635000,6.324444,2733 +alps_1254,COL DE ROUANETTE,,44.633056,6.298333,2403 +alps_1255,LA COUPA,,44.626111,6.302500,2625 +alps_1256,LE PIARRA,,44.620556,6.360833,2633 +alps_1257,REVIRE SOULEOU,,44.618333,6.374722,2717 +alps_1258,ROCHE MEANE,,44.615833,6.365000,2651 +alps_1259,CASSE D'ESLUCIS,,44.607778,6.383889,2579 +alps_1260,LA GARDETTE,,44.606389,6.304722,2363 +alps_1261,LE PENAS,,44.600833,6.302778,2477 +alps_1262,MOURRE FROID,,44.638611,6.400556,2993 +alps_1263,TETE DE LA CABANE,,44.631111,6.431667,2548 +alps_1264,TETE DE SOLEIL BOEUF,,44.625556,6.457778,2816 +alps_1265,TETE DU TISSAP,,44.624167,6.431111,2688 +alps_1266,COL DE LA REGUE,,44.624167,6.401944,2706 +alps_1267,TETE DE L'HIVERNET,,44.620000,6.453056,2824 +alps_1268,CRETE DE VALLON PION,,44.619444,6.412778,2692 +alps_1269,POINTE DE SERRE NE,,44.619167,6.399167,2909 +alps_1270,COL DE REYSSAS,,44.618889,6.420556,2494 +alps_1271,PIC DE PIED BRUN,,44.617500,6.425556,2690 +alps_1272,POINTE DE SERRE,,44.616667,6.395556,2919 +alps_1273,COL DES CORDELLIAS,,44.613889,6.430000,2520 +alps_1274,LES CORDELLIAS,,44.611389,6.431944,2630 +alps_1275,TETE D'ESLUCIS,,44.609722,6.388333,2764 +alps_1276,CRO DE CONI,,44.603611,6.394444,2555 +alps_1277,LAC BRUN,,44.603056,6.426944,2343 +alps_1278,TETE DE CHANTE-PERDRIX,,44.602778,6.436389,2719 +alps_1279,CLOT L'HERBOUS,,44.601389,6.417222,2201 +alps_1280,LAC DE L'HIVERNET,,44.600833,6.446944,2352 +alps_1281,COL DE CHANTE PERDRIX,,44.600000,6.435833,2628 +alps_1282,CRETE DE L'ARPION,,44.597222,6.440556,2624 +alps_1283,ROCHE AIGUEE,,44.633889,6.518056,1853 +alps_1284,ROCHE ROUSSE,,44.625556,6.523611,1361 +alps_1285,LAC DE SIGURET,,44.615278,6.557222,1058 +alps_1286,LE CUCHON,,44.728056,6.115833,2375 +alps_1287,PIC PIERROUX,,44.759722,5.951667,2377 +alps_1288,LE FARAUT,,44.768056,5.953056,2233 +alps_1289,MONTAGNE DE FARAUT,,44.738333,5.951944,2383 +alps_1290,CRETE DES CUCHES,,44.773333,6.095000,2428 +alps_1291,PIC DES HAUTES MOULINS,,44.772500,6.112500,2559 +alps_1292,PIC DE L'HOMME,,44.771389,6.103333,2683 +alps_1293,LA SELLE,,44.766944,6.073056,2073 +alps_1294,LE CHAPERON,,44.764722,6.094722,2748 +alps_1295,LE BANC DU PEYRON,,44.760278,6.077500,2777 +alps_1296,COL DE LA CLAPETTE,,44.757500,6.098889,2254 +alps_1297,MOUSSIERE,,44.753611,6.078056,2574 +alps_1298,PIC DE LA FESTOULE,,44.753333,6.100833,2128 +alps_1299,COL DE LA TABLE,,44.750833,6.099167,1926 +alps_1300,LE CHATELET,,44.742222,6.071111,1558 +alps_1301,LE PUY,,44.735278,6.049167,1259 +alps_1302,JENABRAN,,44.795556,5.884722,1597 +alps_1303,TETE DE LA GARDE,,44.778611,5.881389,1769 +alps_1304,ROCHE COURBE,,44.818056,5.988889,1938 +alps_1305,TETE DE LA SAMBUT,,44.785278,5.943333,1595 +alps_1306,GRUN DE ST.MAURICE,,44.816111,6.057222,2775 +alps_1307,CHAMOUSSET,,44.813889,6.044444,2320 +alps_1308,CROS DU RATIER,,44.811111,6.069167,2264 +alps_1309,BEC DE L'AIGLE,,44.802778,6.059444,2211 +alps_1310,SOMMET DE POURTALAS,,44.794444,6.060000,1788 +alps_1311,POINTE DU MIDI,,44.787500,6.112500,2191 +alps_1312,TETE DU LAUZAROT,,44.783333,6.113611,2264 +alps_1313,AIGUILLE DES ROUX,,44.777500,6.082778,1735 +alps_1314,LE CHAUVET,,44.851389,5.890833,1705 +alps_1315,GARGAS,,44.865000,5.969167,2208 +alps_1316,COL DE L'ETERPAT,,44.864722,5.979722,1947 +alps_1317,COTE BELLE,,44.864167,5.950833,2027 +alps_1318,COL DE LIERE,,44.861111,5.951389,1917 +alps_1319,COL NODRY,,44.860278,5.939444,1827 +alps_1320,CROIX DE ROUGNY,,44.858889,5.999444,2259 +alps_1321,COTE ROUGE,,44.857222,5.950556,2015 +alps_1322,COL DE PRES CLOS,,44.856944,6.005556,1974 +alps_1323,COL DE L'HOMME,,44.856111,5.965833,1657 +alps_1324,SOMMET DES ROUCHOUX,,44.855833,6.007778,2117 +alps_1325,TETE DE L'HOMME,,44.855000,5.965278,1674 +alps_1326,COL DE LA DONNE,,44.854167,6.013889,1955 +alps_1327,TETE DU GRIS,,44.852500,6.015278,2010 +alps_1328,CHAUVET,,44.844444,5.945556,1629 +alps_1329,LE PETIT CHAPELET,,44.845000,6.028333,2298 +alps_1330,PIC DES SCIES DE STE-ANNE,,44.843611,6.111111,2730 +alps_1331,TETE DE CLOTONNET,,44.842778,6.101111,2835 +alps_1332,LE GRAND CHAPELET,,44.840556,6.031389,2403 +alps_1333,LES COLLETONS,,44.838611,6.098333,2609 +alps_1334,TETE DE ROUYE,,44.836944,6.094167,2656 +alps_1335,COL DE COMBE MEANNE,,44.832778,6.087500,2454 +alps_1336,GRUN DU ROUX,,44.830556,6.082500,2657 +alps_1337,LE BANC DU PREYRE,,44.830000,6.080833,2630 +alps_1338,PEY DE ST MAURICE,,44.828056,6.074167,2661 +alps_1339,LA MOLLAS,,44.825278,6.069444,2621 +alps_1340,MONTAGNE DE ROUSSILLON,,44.907500,5.880556,1604 +alps_1341,BRECHE DE GARY,,44.907778,6.001389,2487 +alps_1342,ROCHE MOUTTE,,44.906111,5.988889,2153 +alps_1343,L'ARCANIER,,44.905278,6.000833,2575 +alps_1344,TETE DU VET,,44.904167,5.980278,2184 +alps_1345,TETE DE LOZE D'AIME,,44.900556,5.996389,2468 +alps_1346,LA GRANDE COCHE,,44.896111,5.992778,2220 +alps_1347,TETE DE COMBE LARGE,,44.895833,5.944722,1150 +alps_1348,SOMMET DE FERRIERE,,44.892500,5.944722,1242 +alps_1349,LE COLOMBIER,,44.874444,5.941111,1948 +alps_1350,PORTE DU VALLON,,44.870556,5.943611,1915 +alps_1351,CRETE DU QUEYRELET,,44.868056,6.008611,1926 +alps_1352,LE CHAMOUX,,44.866944,5.989167,2198 +alps_1353,CROIX DE LA BONNE MERE,,44.865833,5.984722,2081 +alps_1354,POINTE SWAN,,44.908889,6.115278,3294 +alps_1355,POINTES DE COIN CHARNIER,,44.907500,6.113056,3232 +alps_1356,BRECHE D'AILLOT,,44.902778,6.110556,3034 +alps_1357,POINTE D'AILLOT,,44.902222,6.111111,3095 +alps_1358,COL D'AILLOT,,44.900278,6.107778,2868 +alps_1359,AIGUILLE DES MARMES,,44.895278,6.099722,3045 +alps_1360,COTE BELLE,,44.894444,6.081667,2388 +alps_1361,LES ECHARENNES,,44.893889,6.066944,2291 +alps_1362,RACHE,,44.891111,6.045556,2288 +alps_1363,PIC DE VALSENESTRE,,44.886667,6.067500,2752 +alps_1364,POINTE DE LA CHALP,,44.881944,6.065556,2730 +alps_1365,TETE DE LA GREZOUNE,,44.876389,6.048611,1895 +alps_1366,CRETE ROSIERE,,44.955000,5.929722,2689 +alps_1367,LAC DE RIF BRUYANT,,44.950833,5.915556,1955 +alps_1368,ROCHER DU LAC,,44.949722,5.929167,2776 +alps_1369,CHATEAU DES LACS,,44.949444,5.913056,2108 +alps_1370,TETE DE L'ERMITAT,,44.944167,5.927778,2713 +alps_1371,L'ETILLIER,,44.921111,5.934444,2197 +alps_1372,TETE DE RAN,,44.928056,6.024167,2644 +alps_1373,TETE DE L'ANE,,44.919444,6.013889,2585 +alps_1374,PIC VERT,,44.917222,6.011111,2603 +alps_1375,COL DU VALLON,,44.954722,6.081944,2531 +alps_1376,LA ROCHE PERCEE,,44.953333,6.102222,2328 +alps_1377,LAC DE LA MUZELLE,,44.952778,6.098056,2099 +alps_1378,ROCHE DE LA SELLE,,44.948056,6.041944,2834 +alps_1379,TETE DE LA MURAILLETTE,,44.946944,6.080833,3019 +alps_1380,COL DU PETIT ROUX,,44.940556,6.116667,2974 +alps_1381,LE PETIT ROUX,,44.941389,6.117222,3030 +alps_1382,SIGNAL DU LAUVITEL,,44.939722,6.045833,2904 +alps_1383,BRECHE DU LAUVITEL,,44.937500,6.051944,2770 +alps_1384,PIC DU CLAPIER DU PEYRON,,44.937222,6.076944,3169 +alps_1385,BRECHE DE VALSENESTRE,,44.936944,6.062222,2598 +alps_1386,COL JEAN MARTIN,,44.934167,6.109722,3257 +alps_1387,COL DE LA MUZELLE,,44.933056,6.088611,2613 +alps_1388,COL DE LA ROMEIOU,,44.932778,6.036111,2439 +alps_1389,LAC LABARRE,,44.932222,6.038056,2393 +alps_1390,ROCHE DE LA MUZELLE,,44.931111,6.106667,3465 +alps_1391,BRECHE GAILLARD,,44.921389,6.108889,3166 +alps_1392,PYRAMIDE DE LA PIERRE,,44.920278,6.109444,3242 +alps_1393,POINTE HENRIETTE,,44.918889,6.111389,3265 +alps_1394,TETE DES VIRES,,44.916389,6.043611,3117 +alps_1395,POINTE MARGUERITE,,44.916389,6.112500,3262 +alps_1396,COL DU VALLON DE LANCHATRA,,44.914167,6.112222,3100 +alps_1397,POINTE ROYER,,44.913056,6.109722,3190 +alps_1398,POINTE BURSSON,,44.911944,6.112500,3245 +alps_1399,BRECHE SWAN,,44.910833,6.113889,3181 +alps_1400,PEROLLIER,,44.991111,5.846111,2183 +alps_1401,LE BANC,,44.971944,5.847222,2235 +alps_1402,LE PIQUET DE NANTES,,44.962222,5.844444,2214 +alps_1403,PETITE MONTAGNE,,44.998056,5.911111,2098 +alps_1404,ROCHE FRETTE,,44.993333,5.915833,2202 +alps_1405,GRAND ARMET,,44.981944,5.934722,2792 +alps_1406,POINTE DE L'ARMET,,44.975556,5.932222,2780 +alps_1407,PETIT ARMET,,44.971667,5.931944,2717 +alps_1408,LE GRAND VENT,,44.964444,5.926111,2600 +alps_1409,COL DE LA BAISSE,,44.963333,5.928056,2497 +alps_1410,LE GRAND VENT,,44.990000,5.858333,2149 +alps_1411,L'OREILLE DU LOUP,,44.985278,5.856944,2291 +alps_1412,TETE DE BARBOLON,,44.991667,5.919722,2380 +alps_1413,LE TABOR,,44.977222,5.856111,2389 +alps_1414,PLANCOL,,44.995833,5.950278,1872 +alps_1415,PIC DU COL D'ORNAN,,44.995833,6.016389,2872 +alps_1416,CRETE DES ROCHERS DE TERRE ROUGE,,44.989167,6.016389,2851 +alps_1417,COL DU ROCHAIL,,44.984167,6.022500,2756 +alps_1418,LAC DU VALLON,,44.980000,6.015278,2493 +alps_1419,LE NEYRARD,,44.970278,6.021389,2796 +alps_1420,SOMMET DES CLOTTOUS,,44.969722,5.997500,2527 +alps_1421,CREUX DES CHARDONS,,44.962778,6.020556,2504 +alps_1422,LE PALETAS,,44.955278,6.013056,2222 +alps_1423,AIGUILLE DU MIDI,,44.992778,6.043056,2742 +alps_1424,CRETE DE MONVOISIN,,44.983333,6.039167,2915 +alps_1425,L'HERITIERE,,44.983333,6.041389,2906 +alps_1426,LE ROCHAIL,,44.980278,6.031944,2022 +alps_1427,POINTE DE MALHAUBERT,,44.975556,6.033056,3049 +alps_1428,BRECHE DE MALHAUBERT,,44.973056,6.032222,2912 +alps_1429,POINTE DE CONFOLHANT,,44.972500,6.032222,2990 +alps_1430,AIGUILLE DE VENOSC,,44.967778,6.087500,2830 +alps_1431,LE LAUVITEL,,44.967500,6.062222,1499 +alps_1432,LAC DE PLAN VIANNEY,,44.957222,6.042500,2250 +alps_1433,COMBE DES FOURMAYES,,44.956389,6.082500,2559 +alps_1434,BRECHE DU PERIER,,44.955556,6.038056,2491 +alps_1435,FRUSTEL,,44.675833,6.227222,1304 +alps_1436,PETITE AUTANE D'ORCIERES,,44.656944,6.288889,2548 +alps_1437,ROCHER DE CHAFAUD,,44.653056,6.228611,1632 +alps_1438,L'AIGUILLE,,44.650278,6.244722,2092 +alps_1439,GRANDE AUTANE,,44.649167,6.287778,2782 +alps_1440,TETE DE SEIGNEUR,,44.641944,6.263056,2352 +alps_1441,PETITE AUTANE,,44.641111,6.247500,2518 +alps_1442,SERRE DE JEAN RAYMOND,,44.677778,6.363889,2343 +alps_1443,LE GARABRUT,,44.663333,6.361111,2916 +alps_1444,POINTE DE REYNA,,44.661111,6.371944,2908 +alps_1445,LAC REYNA,,44.655278,6.371667,2695 +alps_1446,POINTE DE LA DIABLEE,,44.650000,6.366667,2928 +alps_1447,COL DE CHARGES,,44.649444,6.379722,2678 +alps_1448,L'AIGUILLE,,44.647778,6.336111,2793 +alps_1449,LE PAIN DE SUCRE,,44.647500,6.382500,2788 +alps_1450,LA MOTTE,,44.640556,6.318056,2349 +alps_1451,TETE DE COULEAU,,44.684444,6.455833,3038 +alps_1452,ROC BLANC,,44.683333,6.443611,2897 +alps_1453,TETE DE MEAN,,44.677778,6.458056,2847 +alps_1454,POINTE DES ROUGNEUS,,44.675556,6.433333,2749 +alps_1455,LAC DU DISTROIT,,44.674444,6.438333,2519 +alps_1456,COL DE MEAN,,44.674167,6.461944,2685 +alps_1457,CABANE DE LA BARRE,,44.665556,6.404167,2241 +alps_1458,TETE DES MAITZ,,44.661667,6.446667,2521 +alps_1459,COL DES TOURETTES,,44.659444,6.425000,2582 +alps_1460,CRETE DE LA DENT,,44.652222,6.418056,2630 +alps_1461,CRETE DE CHABREYREL,,44.680833,6.481667,2668 +alps_1462,CRETE DE FOURAN,,44.680556,6.532778,2683 +alps_1463,PINFOL,,44.676944,6.539167,2649 +alps_1464,TETE DE FOURAN,,44.673333,6.551667,2460 +alps_1465,CRETE DE MEAN,,44.667778,6.488056,2413 +alps_1466,LA GUESTE,,44.656389,6.490278,2724 +alps_1467,COSTE NOUNDY,,44.653611,6.505556,2673 +alps_1468,TETE DE CLOTINAILLE,,44.646111,6.516111,2563 +alps_1469,COL DU MOUTAS,,44.723889,6.182222,2525 +alps_1470,LE BARRY,,44.719444,6.135278,2272 +alps_1471,LAC DU COL,,44.716389,6.141944,2055 +alps_1472,PIC DU TOUROND,,44.716389,6.190000,2743 +alps_1473,COL DE LA PISSE,,44.713056,6.179722,2354 +alps_1474,COL DE L'ESCALIER,,44.712778,6.140556,2167 +alps_1475,POINTE NORD DE LA VELASQUE,,44.711389,6.189444,2637 +alps_1476,COL DE CLEMENSE,,44.709444,6.191667,2487 +alps_1477,PIC QUEYREL,,44.708333,6.145556,2440 +alps_1478,POINTS SUD DE LA VENASQUE,,44.706111,6.195556,2620 +alps_1479,PIC DU CLOT LAMIANDE,,44.703889,6.205278,2461 +alps_1480,LAC DE BARBEYROUX,,44.698611,6.118889,1498 +alps_1481,LA LOZIERE,,44.694722,6.148056,1842 +alps_1482,CROIX DE L'ESTANG,,44.711944,6.243056,2209 +alps_1483,ROC D'ALIBRANDES,,44.708889,6.291944,2407 +alps_1484,LA PROUVEYRAT POINTE,,44.706111,6.219444,2467 +alps_1485,LA POUSTERLE POINTE,,44.703611,6.230556,2401 +alps_1486,LE PALASTRE SOMMET,,44.692778,6.209444,2279 +alps_1487,ROC DES HOMMES,,44.727778,6.320833,2775 +alps_1488,LAC DES PISSES,,44.721944,6.380556,2490 +alps_1489,SOMMET DROUVET,,44.721667,6.318333,2655 +alps_1490,LAC DES SIRENES,,44.719722,6.342222,2389 +alps_1491,LES PELISSONS,,44.712778,6.356389,2468 +alps_1492,QUEYRELET,,44.702500,6.351389,2306 +alps_1493,LE PARAVAR,,44.701944,6.359444,2214 +alps_1494,TETE DU SERRE EYRAUT,,44.730000,6.411667,2745 +alps_1495,LAC PALLUE,,44.729167,6.419722,2472 +alps_1496,LE TESTAS,,44.728889,6.474444,2497 +alps_1497,COL DES JALABRES,,44.728611,6.387222,2890 +alps_1498,COL DES ENVERS,,44.723889,6.474167,2417 +alps_1499,GRAND PINIER,,44.723611,6.401667,3117 +alps_1500,LE PIQUET,,44.721667,6.461389,2751 +alps_1501,COL BIDOUR,,44.720278,6.402222,2995 +alps_1502,LAC FARAVEL,,44.716944,6.423333,2386 +alps_1503,POINTE DES UVERNAUS,,44.708611,6.465833,2865 +alps_1504,POINTE PINIER,,44.706389,6.406111,3100 +alps_1505,COL DU FOND DE LA CABANE,,44.702500,6.404167,2928 +alps_1506,CHABRIERE,,44.701944,6.391944,2828 +alps_1507,LE TUBA,,44.698889,6.401944,3007 +alps_1508,PIC DE ROCHELAIRE,,44.696944,6.466944,3108 +alps_1509,COL DE COULEAU,,44.691389,6.460278,2787 +alps_1510,LE CHAPEAU ROUGE,,44.687778,6.404722,2683 +alps_1511,COL DE TERRES BLANCHES,,44.687500,6.433889,2721 +alps_1512,L'AIGUILLAS,,44.726111,6.523889,2823 +alps_1513,GAULENT,,44.718889,6.525556,2867 +alps_1514,TETE DES LAUZIERS,,44.716111,6.495556,2680 +alps_1515,COL DE VAL HAUTE,,44.710833,6.520278,2517 +alps_1516,LE PEYRON,,44.710556,6.532778,2318 +alps_1517,CRETE DE ROUGNOUX,,44.705833,6.501389,3003 +alps_1518,LAC ETOILE,,44.701667,6.504722,2711 +alps_1519,TETE DE VAUTISSE,,44.701389,6.485833,3156 +alps_1520,ROCHE CHARNIERE,,44.700278,6.547778,2420 +alps_1521,LAC TROUBLE,,44.698056,6.529167,2474 +alps_1522,CRETE DES PRENETZ,,44.690278,6.517500,2781 +alps_1523,CIME DES MOUTIERES,,44.774444,6.143611,2674 +alps_1524,COL DE PIAN,,44.774167,6.171944,2452 +alps_1525,POINTE DES MOUTETTES,,44.775278,6.172222,2479 +alps_1526,LE PEVOU,,44.772778,6.132778,2668 +alps_1527,POINTE DES CHAZALETS,,44.770556,6.129444,2556 +alps_1528,COL DES BAISSES,,44.770000,6.118611,2492 +alps_1529,PIC DE PIAN,,44.769167,6.166389,2825 +alps_1530,MONTAIGU,,44.768611,6.121667,2592 +alps_1531,LE BANC DE L'OURS,,44.764167,6.170556,2682 +alps_1532,AIGUILLE DE PEYRON,,44.763611,6.140833,1944 +alps_1533,COL DE FONT FROIDE,,44.761389,6.176667,2612 +alps_1534,PIC DE COLLE BLANCHE,,44.753611,6.173056,2975 +alps_1535,LE CREUX DE L'AIGUE,,44.753333,6.159722,2734 +alps_1536,COL DE COLLE BLANCHE,,44.753056,6.177778,2795 +alps_1537,LES TETONS DE COLLE BLANCHE,,44.751111,6.183611,2758 +alps_1538,COL DE LONDONNIERE,,44.749167,6.187500,2635 +alps_1539,POINTE DES MOUTIERES,,44.743889,6.207222,3052 +alps_1540,PIC DE MAL CROS,,44.740833,6.195833,3116 +alps_1541,COL DE MAL CROS,,44.740833,6.204444,3021 +alps_1542,BRECHE DE L'HOMME ETROIT,,44.739722,6.201944,3057 +alps_1543,VIEUX CHAILLOL,,44.736111,6.190556,3163 +alps_1544,TETES DE MAL CROS,,44.739722,6.200833,3096 +alps_1545,PIC DE L'ARCHE,,44.752778,6.146667,2581 +alps_1546,PIC DE LA SAUME,,44.752500,6.168333,2941 +alps_1547,AIGUILLE DU VEYRE,,44.774722,6.253333,2833 +alps_1548,AIGUILLE DES PEOUS,,44.773333,6.256389,2825 +alps_1549,LACS DE CRUPILLOUSE,,44.772778,6.248889,2665 +alps_1550,AIGUILLE DES ESPERES,,44.772500,6.238889,3059 +alps_1551,COL DE CRUPILLOUSE,,44.770000,6.236667,2940 +alps_1552,TETE VIRANTE,,44.768889,6.219722,2675 +alps_1553,COL DE VAL ESTRECHE,,44.768889,6.221389,2638 +alps_1554,LES CHOUCIERES VERTES,,44.768611,6.233611,3058 +alps_1555,BANC DU PINET,,44.767222,6.216389,2671 +alps_1556,COL DES LAUZIERES,,44.763611,6.233333,2775 +alps_1557,LES BAUSIAS,,44.762222,6.252222,2428 +alps_1558,CROS DE LA CASSE,,44.760556,6.237500,2814 +alps_1559,PUY DES BAUMES,,44.758056,6.236111,2843 +alps_1560,MONTAGNE DE CEDERA,,44.746111,6.292500,2886 +alps_1561,LAC DE CEDERA,,44.741389,6.290833,2658 +alps_1562,AIGUILLE DE CEDERA,,44.738889,6.285556,2910 +alps_1563,PUY DES POURROYS,,44.732778,6.223889,2784 +alps_1564,COL DE L'AUPE MARTIN,,44.774722,6.362222,2761 +alps_1565,COL DE LA VALETTE,,44.773889,6.305833,2668 +alps_1566,PIC DE LA CAVALE,,44.773333,6.353889,2983 +alps_1567,PUY RIVAROL,,44.772778,6.305278,2724 +alps_1568,PUY DE LA CHAUMETTE,,44.771111,6.315833,2563 +alps_1569,PAS DE LA CAVALE,,44.768333,6.354722,2735 +alps_1570,PAS DU LOUP,,44.761667,6.358056,2818 +alps_1571,POINTE DES SERRES,,44.758611,6.378333,3005 +alps_1572,POINTES DE ROUGNOUX,,44.758333,6.360000,3179 +alps_1573,TETE DU PLUMEL,,44.757778,6.386667,3065 +alps_1574,ROUITE,,44.751944,6.325278,2663 +alps_1575,COL DE ROUGNOUX,,44.751667,6.356111,2953 +alps_1576,AIGUILLE DU SELLAR,,44.751389,6.307500,2283 +alps_1577,COL DU CHEVAL DE BOIS,,44.750833,6.329722,2473 +alps_1578,CRETE DU MARTINET,,44.747778,6.351111,3104 +alps_1579,MONTAGNE DE CEDERA,,44.747778,6.298056,2793 +alps_1580,POINTE DES ESTARIS,,44.742500,6.342222,3086 +alps_1581,COL DE MEOLLION,,44.741389,6.315556,2451 +alps_1582,COL DE PRELLES,,44.738056,6.336389,2808 +alps_1583,COL DE FREISSINIER,,44.737500,6.354167,2782 +alps_1584,SOMMET DE PRELLES,,44.736111,6.332778,2953 +alps_1585,COL DE JALABRES,,44.734444,6.366667,2998 +alps_1586,ROC DIOLION,,44.733611,6.363611,3071 +alps_1587,MONTAGNE DU CHAPAN,,44.732778,6.381389,3033 +alps_1588,COL DES PISSES,,44.731667,6.326111,2788 +alps_1589,POINTE DES PISSES,,44.731389,6.322778,2837 +alps_1590,CRETE DE LA SEYTA,,44.774722,6.471944,2739 +alps_1591,TETE DE DORMILLOUSE,,44.768333,6.459167,3085 +alps_1592,TETE DE SOULAURE,,44.762500,6.415000,3243 +alps_1593,TETE DE LA CANONNIERE,,44.762500,6.429444,3219 +alps_1594,COLLET DE SOULAURE,,44.762500,6.423056,3043 +alps_1595,PIC GODEFROY,,44.761667,6.435278,3192 +alps_1596,TETE DE BERTRAND,,44.758611,6.403889,3191 +alps_1597,TETE DE LA BASSE,,44.758056,6.392222,3105 +alps_1598,TETE DES ARINDOUX,,44.733611,6.418333,2573 +alps_1599,POINT DES CASSES,,44.770000,6.508611,2238 +alps_1600,LE SIMOUS,,44.770000,6.529444,2007 +alps_1601,TETE DES RAISINS,,44.769167,6.490000,2655 +alps_1602,MAMELONS DE LA SEA,,44.769167,6.534444,1932 +alps_1603,ROCHER DE LA SEA,,44.767500,6.540833,1932 +alps_1604,ROCHER TOUARD,,44.758889,6.555278,1714 +alps_1605,L'AIGUILLE,,44.745833,6.566667,1503 +alps_1606,SERRE DE LA GARDE,,44.743611,6.542778,1652 +alps_1607,LE GOURENQ,,44.731667,6.518333,2708 +alps_1608,LE TESTASSON,,44.731111,6.483889,2349 +alps_1609,PIERRE DE LA PIE,,44.811944,6.152500,1850 +alps_1610,TETE DU JALON,,44.807500,6.140000,2326 +alps_1611,TETE DES BANCS,,44.802778,6.148333,2513 +alps_1612,LACS DES PETAREL,,44.801944,6.170000,2092 +alps_1613,CRETE DE LA MUANDE,,44.801111,6.151389,2514 +alps_1614,CRETE DE ROMANE,,44.800278,6.177500,2459 +alps_1615,AIGUILLE DE MIDI DES ANDRIEUX,,44.799444,6.159167,2653 +alps_1616,LAC DE SEBEYRAS,,44.794722,6.173333,2305 +alps_1617,TETE DES ROGNONS,,44.791111,6.168611,2472 +alps_1618,COL DE PETAREL,,44.790833,6.170278,2435 +alps_1619,PIC PETAREL,,44.790556,6.175278,2619 +alps_1620,PIC DE DISDIER,,44.781111,6.177500,2561 +alps_1621,TETE DU BANC ROND,,44.780278,6.151111,2112 +alps_1622,LA PLANTA,,44.816667,6.274167,2163 +alps_1623,PIC CAZONNE,,44.816389,6.283056,2416 +alps_1624,PIC DE L'OURS,,44.810833,6.230833,2313 +alps_1625,LE CHAPEAU,,44.806667,6.225000,2372 +alps_1626,CRETE DE LA COTE CRASSE,,44.806389,6.214167,2122 +alps_1627,PIC DE VALLON CLOS,,44.805000,6.272500,2762 +alps_1628,COL DES CHEVRETTES,,44.803056,6.271111,2592 +alps_1629,GRAND SERRE,,44.801667,6.236111,2459 +alps_1630,AIGUILLE DES MORGES,,44.799167,6.258333,2985 +alps_1631,MONTAGNON,,44.799167,6.266944,2895 +alps_1632,LAC DE VALLONPIERRE,,44.798611,6.290833,2271 +alps_1633,COL DES MORGES,,44.796389,6.251667,2766 +alps_1634,COL DU ROUNDEOU,,44.795000,6.275278,2666 +alps_1635,PIC DE VALLONPIERRE,,44.793056,6.279167,2741 +alps_1636,AIGUILLE DE CLAPOUSE,,44.789722,6.250833,2882 +alps_1637,AIGUILLE DE CHATEAU MOREL,,44.788056,6.230556,2554 +alps_1638,COL DE CLAPOUSE,,44.787778,6.246944,2768 +alps_1639,AIGUILLE ROUSSE,,44.786667,6.246111,2844 +alps_1640,COL DE LAUPLAT,,44.785833,6.246111,2737 +alps_1641,COL DE MAUVAISE COMBE,,44.785278,6.230833,2542 +alps_1642,COL DE PARIERES,,44.780278,6.244722,2935 +alps_1643,LES DENTS,,44.780000,6.254167,2757 +alps_1644,PIC DE PARIERES,,44.779444,6.241111,3075 +alps_1645,AIGUILLE FOURCHEE,,44.778611,6.249722,2923 +alps_1646,COL DE GOUIRAN,,44.777778,6.291389,2597 +alps_1647,COL DE CHAMPOLEON,,44.776667,6.239722,3000 +alps_1648,COL DU VEYRE,,44.776389,6.248889,2724 +alps_1649,PUY DES AGNEAUX,,44.775833,6.290000,2718 +alps_1650,PIC DE MALAMORT,,44.819167,6.350556,3335 +alps_1651,COL DU LOUP DE VALGAUDEMAR,,44.817500,6.349167,3145 +alps_1652,PICS DU LOUP,,44.816667,6.344167,3245 +alps_1653,COL DE SIRAC,,44.813056,6.343333,3099 +alps_1654,POINTE DE JARROUX,,44.808333,6.340000,3228 +alps_1655,BRECHE DE JARROUX,,44.807222,6.341944,3084 +alps_1656,POINTE DU QUEYRE,,44.804444,6.341111,3264 +alps_1657,POINTE DE VERDONNE,,44.798889,6.338889,3327 +alps_1658,COL DE VERDONNE,,44.797222,6.334444,3138 +alps_1659,POINTE DE CHABOURNEOU,,44.796944,6.332222,3250 +alps_1660,COL DU LOUP DE CHAMPOLEON,,44.796667,6.342222,3048 +alps_1661,POINTE DE CHANTELOUBE,,44.794444,6.345000,3161 +alps_1662,POINTE DES BOUCHIERS,,44.790556,6.345000,3101 +alps_1663,LE SIRAC,,44.789444,6.307222,3440 +alps_1664,TETE DU CLOT,,44.788889,6.382222,3074 +alps_1665,EPAULE SUD,,44.786944,6.306667,3371 +alps_1666,LES CROS DE SIRAC,,44.782500,6.298333,2924 +alps_1667,POINTE DES ROUSSES,,44.777222,6.346667,2959 +alps_1668,COL DES BOUCHIERS,,44.775556,6.351944,2930 +alps_1669,POINTE DE L'AIGLIERE,,44.810278,6.414722,3308 +alps_1670,CRETE DE LA PENDINE,,44.802222,6.454167,2749 +alps_1671,POINTES DE NEYZETS,,44.800000,6.403611,3247 +alps_1672,COL DU BAL,,44.798611,6.443056,2601 +alps_1673,POINTE DE CLAUSIS,,44.798056,6.397778,3153 +alps_1674,COL DES QUEYRETTES,,44.796667,6.408889,3135 +alps_1675,POINTE DES QUEYRETTES,,44.795833,6.410556,3189 +alps_1676,CRETE DE PLAROL,,44.794722,6.423889,2938 +alps_1677,TETE DE CLAUSIS,,44.786389,6.393889,2779 +alps_1678,TETE DE LA ROCHAILLE,,44.808056,6.508889,1944 +alps_1679,COL DE LA POUSTERIE,,44.807500,6.514722,1763 +alps_1680,TETE D'OREAC,,44.804444,6.496111,2088 +alps_1681,LA BESSEE DU MILIEU,,44.799444,6.560556,1044 +alps_1682,CRETE DE LA SEYTE,,44.776111,6.477500,2637 +alps_1683,SOMMET OUEST DES SOUFFLES,,44.864722,6.133611,3098 +alps_1684,SOMMET CENTRAL DES SOUFFLES,,44.864167,6.136667,3091 +alps_1685,BRECHE DES SOUFFLES,,44.863611,6.131667,2951 +alps_1686,SOMMET EST DES SOUFFLES,,44.863333,6.139167,3060 +alps_1687,LES MOURRES ROUGES,,44.861944,6.128889,3021 +alps_1688,L'OLAN,,44.859444,6.197222,3564 +alps_1689,COL DE LA SEE,,44.859444,6.155556,2773 +alps_1690,BRECHE ESCANA,,44.859167,6.199444,3449 +alps_1691,CIME D'ORGIERES,,44.858889,6.143611,3064 +alps_1692,MONT GARDI,,44.858611,6.159167,2890 +alps_1693,EPAULE SUD,,44.857500,6.195278,3514 +alps_1694,CRETE DE CHAMOUSSET,,44.856111,6.160833,2875 +alps_1695,COL TURBAT,,44.854722,6.180833,2679 +alps_1696,BRECHE DE CHAMOUSSET,,44.854722,6.162778,2815 +alps_1697,PI TURBAT,,44.853333,6.170278,3028 +alps_1698,PAS DE L'OLAN,,44.847778,6.196944,2683 +alps_1699,LE LAUTIE LAC,,44.844167,6.165833,2363 +alps_1700,COL DE COLOMBES,,44.842222,6.169444,2423 +alps_1701,TETE DE COLOMBES,,44.840556,6.174444,2470 +alps_1702,LES ROUIES,,44.864444,6.258611,3589 +alps_1703,TETE DU MILIEU,,44.863056,6.225000,2963 +alps_1704,BANC DES CHEVRETTES,,44.855833,6.211667,2297 +alps_1705,POINTE DE LA MUANDE,,44.855556,6.253611,3315 +alps_1706,COL DES SELLETTES,,44.854444,6.216667,3148 +alps_1707,CIME DU VALLON,,44.854167,6.222778,3406 +alps_1708,COL DE LA MUANDE,,44.852500,6.248611,3103 +alps_1709,BRECHE DE LA MUANDE,,44.852500,6.243611,3036 +alps_1710,COL DE CHALANCE,,44.852500,6.240000,3012 +alps_1711,AIGUILLE DES SAFFRES,,44.852222,6.247222,3135 +alps_1712,COL DU BATON,,44.846389,6.218611,2956 +alps_1713,PIC DU LAUZON,,44.845833,6.254167,2949 +alps_1714,LE LAUZON,,44.845556,6.274167,3008 +alps_1715,LA ROUYE,,44.844444,6.217500,3084 +alps_1716,AIGUILLE DU CHAPEAU,,44.839444,6.255000,2515 +alps_1717,POINTE DE LA CONDAMINE,,44.853333,6.352778,3443 +alps_1718,POINTE DES BOEUFS ROUGES,,44.855278,6.355833,3516 +alps_1719,POINTE HOLMES,,44.856667,6.370833,3365 +alps_1720,POINTES DU RIOU BLANC,,44.862500,6.385000,3404 +alps_1721,MONT GIOBERNEY,,44.862222,6.317500,3352 +alps_1722,POINTE RICHARDSON,,44.857222,6.320833,3312 +alps_1723,POINTE DE CONTE FAVIEL,,44.852778,6.323889,3238 +alps_1724,AIGUILLE DE LA VACHE,,44.856667,6.308333,2602 +alps_1725,TETE DE LA PILATTE,,44.849167,6.340556,3421 +alps_1726,POINTE DE LA PILATTE,,44.849722,6.344444,3476 +alps_1727,LES BANS,,44.848611,6.336667,3669 +alps_1728,PIC DES AUPILLOUS,,44.840833,6.330000,3505 +alps_1729,PIC DE BONVOISIN,,44.823611,6.346944,3481 +alps_1730,PIC JOCELME,,44.828056,6.335833,3458 +alps_1731,POINTE DE CELSE NIERE,,44.863056,6.395278,3429 +alps_1732,POINTE GUVARD,,44.860278,6.391389,3461 +alps_1733,COL DU RIOU BLANC,,44.860833,6.388056,3303 +alps_1734,TOUR POINTUE,,44.863333,6.401944,3242 +alps_1735,POINTE DU RASCROUSET,,44.856111,6.409167,3082 +alps_1736,LA BLANCHE,,44.857778,6.434167,2953 +alps_1737,POINTE DE CLAPOUSE,,44.851667,6.419167,2988 +alps_1738,PIC DE MONTBRISON,,44.861389,6.535278,2818 +alps_1739,PAS DE MONTBRISON,,44.856389,6.534722,2656 +alps_1740,TETE D'ARMONT,,44.852500,6.535556,2815 +alps_1741,PIC DE L'AIGLE,,44.851389,6.540000,698 +alps_1742,CROIX DE LA SALCETTE,,44.844167,6.552222,2331 +alps_1743,CRETE DE ROCHE MOTTE,,44.833333,6.561944,1738 +alps_1744,CRETE DE ROCHE MOTTE,,44.845556,6.619167,2406 +alps_1745,CIME DU MELEZIN,,44.842778,6.640000,2680 +alps_1746,PIC DE ROCHE MOTTE,,44.841389,6.621944,2548 +alps_1747,LE PETIT PUY,,44.837222,6.639167,2757 +alps_1748,ST.HIPPOLYTE CHAPELLE,,44.834722,6.573056,1501 +alps_1749,CRETE DE FONT FROIDE,,44.830833,6.627778,2650 +alps_1750,PIC DE JEAN REY,,44.828611,6.630556,2777 +alps_1751,LE CHATEAU DE QUEYRIERES,,44.825278,6.578889,1283 +alps_1752,PIC DE PEYRE EYRAUTE,,44.822778,6.630556,2903 +alps_1753,LA GRANDE MAYE,,44.865278,6.671111,2417 +alps_1754,LE LASSERON,,44.863056,6.744167,2702 +alps_1755,CRETE DE LA LAUSE,,44.853056,6.691389,2453 +alps_1756,LE PETIT PEYGU,,44.841389,6.707500,2662 +alps_1757,SOMMET DE CRETE DES GRANGES,,44.836389,6.694444,2835 +alps_1758,LE GRAND PEYGU,,44.835278,6.704444,2796 +alps_1759,COL DES PEYGUS,,44.834167,6.700556,2612 +alps_1760,COL DE LA ROYA,,44.831667,6.692222,2694 +alps_1761,CRETE DE BOUGETS,,44.828889,6.691389,2759 +alps_1762,L'ARPELIN,,44.826667,6.742222,2604 +alps_1763,LE COL PERDU,,44.823889,6.742222,2479 +alps_1764,CRETE DES BRUSAS,,44.821944,6.672222,2446 +alps_1765,TURGE DE PEYRON,,44.863333,6.763056,2791 +alps_1766,COL DU LASSERON,,44.855833,6.748611,2428 +alps_1767,CIME DE LA CHARVIE,,44.855833,6.763056,2881 +alps_1768,COL DE PRAFAUCHIER,,44.849722,6.772500,2746 +alps_1769,LAC DE L'ETOILE,,44.848333,6.783056,2532 +alps_1770,LAC DES CORDES,,44.845833,6.788889,2446 +alps_1771,LAC DE LA MADELEINE,,44.848611,6.785833,2468 +alps_1772,PIC DU VALLON CROUZET,,44.841389,6.797500,2728 +alps_1773,LAC DES MAITS,,44.840000,6.793056,2563 +alps_1774,TURGE DA LA SUFFIE,,44.837500,6.777500,3024 +alps_1775,L'ESCALINADE,,44.831389,6.784444,3087 +alps_1776,CLOT DES THURES,,44.828611,6.825833,2603 +alps_1777,PIC DE ROCHEBRUNE,,44.822500,6.787778,3320 +alps_1778,CIME DU MONTAGNON,,44.910278,6.146389,3263 +alps_1779,TETE DU CANETON,,44.908889,6.181944,2958 +alps_1780,COL DES BERCHES,,44.908611,6.133333,2936 +alps_1781,LES BERCHES,,44.908056,6.127222,3050 +alps_1782,CCOL DU CANARD,,44.907778,6.181667,2918 +alps_1783,COL DE LA HAUTE PISSE,,44.906944,6.147222,3038 +alps_1784,LAC DE LA MARIANDE,,44.905556,6.158611,2604 +alps_1785,POINTE DE LA MARIANDE,,44.902500,6.148333,3151 +alps_1786,BEC DU CANARD,,44.901111,6.180000,3268 +alps_1787,COL DE LA MARIANDE,,44.899722,6.153611,2940 +alps_1788,POINTE ROBERT O'GORMAN,,44.898056,6.177778,3243 +alps_1789,POINTE DU GRAND VALLON,,44.897222,6.165833,3121 +alps_1790,LAC DES BECHES,,44.896944,6.194167,2401 +alps_1791,AIGUILLES DES ARIAS,,44.895556,6.174167,3402 +alps_1792,SOMMET OUEST,,44.895278,6.172778,3400 +alps_1793,COL D'ENTRE PIERROUX,,44.892500,6.176111,3168 +alps_1794,AIGUILLE D'ENTRE PIERROUX,,44.890833,6.177222,3290 +alps_1795,COL DES AIGUILLES,,44.885278,6.180000,3082 +alps_1796,AIGUILLE ROUSSE,,44.883333,6.180278,3156 +alps_1797,POINTE DU VALLONNET,,44.881944,6.178333,3043 +alps_1798,ARETE DES MUROIS,,44.880000,6.173611,2757 +alps_1799,POINTE MAXIMIN,,44.877778,6.187500,3306 +alps_1800,AIGUILLE DE L'OLAN,,44.877500,6.200556,3373 +alps_1801,BRECHE DE L'OLAN,,44.867222,6.198611,2970 +alps_1802,TETE DE FERRAND,,44.889444,6.124167,2359 +alps_1803,POINTE JEANNE,,44.908611,6.236667,3244 +alps_1804,COL DES FETOULES,,44.906944,6.238333,3147 +alps_1805,CIME DE L'ENCOULA,,44.905556,6.283889,3536 +alps_1806,COL DE L'ENCOULA DE PETIT PIERRE,,44.902222,6.282222,3390 +alps_1807,TETE DES FETOULES,,44.900000,6.237778,3459 +alps_1808,CIME DE CLOT CHATEL,,44.897500,6.280278,3563 +alps_1809,COL NORD DE L'ETRET,,44.897222,6.241389,3335 +alps_1810,POINTE D'ENTRE LES COLS,,44.893333,6.244167,3407 +alps_1811,COL SUD DE L'ETRET,,44.892500,6.244167,3342 +alps_1812,CLOCHE DE L'ETRET,,44.890833,6.244444,3534 +alps_1813,TETE DE L'ETRET,,44.890000,6.245278,3559 +alps_1814,POINTE DU VALLON DES ETAGES,,44.885556,6.268611,3564 +alps_1815,COL DU VALLON DES ETAGES,,44.884722,6.260000,3249 +alps_1816,LAC DES ROUIES,,44.876389,6.243333,2722 +alps_1817,PIC EST DU VACCIVIER,,44.874167,6.296667,3266 +alps_1818,COL DU VACCIVIER,,44.874167,6.288056,3170 +alps_1819,COL DES ROUIES,,44.871667,6.263056,2364 +alps_1820,POINTE OUEST DU VACCIVIER,,44.871111,6.273611,3296 +alps_1821,PIC CENTRAL DU VACCIVIER,,44.870278,6.282500,3312 +alps_1822,TOURS DE BOVERIAT,,44.881667,6.312222,3096 +alps_1823,AIGUILLE DE COSTE ROUGE,,44.895000,6.358056,3252 +alps_1824,PIC DE LA TEMPLE,,44.897222,6.353611,3389 +alps_1825,PIC SANS NOM,,44.893333,6.383889,3913 +alps_1826,AIGUILLE DE SIALOUZE,,44.888333,6.385556,3576 +alps_1827,PIC DU COUP DE SABRE,,44.891667,6.378333,3699 +alps_1828,TOUR POINTUE,,44.892222,6.359167,3431 +alps_1829,TOUR DU GEANT,,44.890556,6.358889,3618 +alps_1830,DENTS DE COSTE ROUGE,,44.893056,6.358611,3373 +alps_1831,L'AILEFROIDE ORIENTALE,,44.888333,6.368889,3847 +alps_1832,L'AILEFROIDE CENTRALE,,44.888056,6.360000,3927 +alps_1833,TOUR TATRA,,44.880833,6.351111,3624 +alps_1834,POINTE DES FRERES CHAMOIS,,44.879167,6.351389,3570 +alps_1835,CIME DU COIN,,44.874444,6.351389,3527 +alps_1836,TETE DU CHERET,,44.888611,6.311944,3161 +alps_1837,POINTE DU SELE,,44.865556,6.355000,3556 +alps_1838,L'AILEFROIDE,,44.885000,6.356389,3954 +alps_1839,POINTE DURAND,,44.898889,6.401111,3932 +alps_1840,MONT PELVOUX,,44.897500,6.396667,3943 +alps_1841,AIGUILLE DU PELVOUX,,44.896111,6.391944,3684 +alps_1842,BOSSE DE SIALOUZE,,44.887500,6.396667,3229 +alps_1843,LE PETIT PELVOUX,,44.894722,6.410000,3753 +alps_1844,LES TROIS DENTS,,44.898611,6.411111,3683 +alps_1845,AIGUILLE FRERES ESTIENNE,,44.908889,6.463611,3081 +alps_1846,CIME DU PAILLON,,44.901944,6.464167,2790 +alps_1847,COL DU PAILLON,,44.903611,6.464444,2765 +alps_1848,COL DE LA RIELLE,,44.907778,6.556944,2371 +alps_1849,SOMMET DE L'EYCHAUDE,,44.907222,6.529444,2659 +alps_1850,COL DE LA PISSE,,44.903889,6.528611,2501 +alps_1851,CIME DES CROUSAGNES,,44.902778,6.511111,2485 +alps_1852,CRETE DE COSTE GROSELIERE,,44.898889,6.520556,2715 +alps_1853,BAS MORAND,,44.894722,6.511111,2731 +alps_1854,CIME DE LA CONDAMINE,,44.892778,6.520000,2940 +alps_1855,CRETE DE LA BRESSIERE,,44.891667,6.542500,2578 +alps_1856,LA ROCHE JAUNE,,44.891389,6.553611,2421 +alps_1857,ROCHER BOUCHARD,,44.890833,6.533333,2900 +alps_1858,COL DE LA TRANCOULETTE,,44.890278,6.551667,2293 +alps_1859,LA CROIX D'AQUILA,,44.883889,6.561667,2466 +alps_1860,CRETE DES BLANCHETS,,44.877222,6.563333,2296 +alps_1861,TETE DES LAUZIERES,,44.874444,6.528889,2928 +alps_1862,SOMMET DU PROREL,,44.905556,6.581667,2566 +alps_1863,ROCHER BLANC,,44.903056,6.570556,2503 +alps_1864,LA CROIX DE LA NORE,,44.902222,6.587778,2404 +alps_1865,FORT DU CHATEAU,,44.899444,6.645833,1290 +alps_1866,ANCIEN FORT,,44.889167,6.654167,1604 +alps_1867,ANCIEN FORT DE LA CROIX DE BRETAGNE,,44.873889,6.655278,2011 +alps_1868,SOMMET DE CHATEAU JOUAN,,44.910000,6.709167,2565 +alps_1869,LE CHENAILLET,,44.902778,6.740833,2650 +alps_1870,ANCIEN FORT DE L'INFERNET,,44.894722,6.685833,2377 +alps_1871,SOMMET DES ANGES,,44.894167,6.714444,2459 +alps_1872,L'OMBILIC,,44.893611,6.700278,2410 +alps_1873,LAC DES SARAILLES,,44.891667,6.730833,2236 +alps_1874,ROCHE MOUTTE,,44.879444,6.723056,2114 +alps_1875,COLLET VERT,,44.909444,6.751111,2519 +alps_1876,GRAND CHARVIA,,44.905833,6.752222,2648 +alps_1877,CIME DE SAUREL,,44.903611,6.771667,2449 +alps_1878,COL DE GIMONT,,44.902778,6.767500,2394 +alps_1879,LAC GIGNOUX,,44.900278,6.766667,3329 +alps_1880,LE LAC NOIR,,44.893333,6.751944,2226 +alps_1881,COL DE BOUSSON,,44.891944,6.784167,2154 +alps_1882,CIME DE FOURNIER,,44.891389,6.801944,2424 +alps_1883,ROCHER RENARD,,44.890556,6.776111,2186 +alps_1884,CIMA DORLIER,,44.879167,6.827500,2757 +alps_1885,ROCHE RUINEE,,44.952778,6.150833,2570 +alps_1886,COL DE LA GRANDE HOCHE,,44.950556,6.151111,2541 +alps_1887,ROCHE NOIRE,,44.948333,6.149444,2667 +alps_1888,LE PEIGNE DU PIERROUX,,44.942778,6.150278,2733 +alps_1889,COL DU PIERROUX,,44.941667,6.150833,2664 +alps_1890,LE PIERROUX,,44.937778,6.149167,2869 +alps_1891,SOMMET EST,,44.927222,6.157500,3292 +alps_1892,TETE DE LAURANOURE,,44.926389,6.151944,3325 +alps_1893,SOMMET SUD,,44.925556,6.151389,3313 +alps_1894,CRETE DU MONTAGNON,,44.920000,6.151111,3141 +alps_1895,TETE DU POUYET,,44.919167,6.187222,2834 +alps_1896,BRECHE DU SALUDE,,44.918056,6.150000,3089 +alps_1897,LA TOUR ROUGE,,44.916389,6.156111,2920 +alps_1898,TETE DU SALUDE,,44.916111,6.149167,3221 +alps_1899,COL DU SALUDE,,44.915556,6.147222,3118 +alps_1900,COL DE LA GRANDE COTE,,44.915278,6.185556,2775 +alps_1901,TETE DES LICHES,,44.914167,6.148056,3216 +alps_1902,TETE DE LA CABORNE,,44.913056,6.186667,2847 +alps_1903,COL DU GRAOU,,44.954722,6.213611,2987 +alps_1904,PASSAGE DU GRAOU,,44.952500,6.212222,3014 +alps_1905,TETE DE LA MARSARE,,44.950833,6.214722,3118 +alps_1906,ROCHE BLANCHE,,44.950278,6.279722,2849 +alps_1907,TETE DE L'AURE,,44.946389,6.287500,2512 +alps_1908,TETE DE LA MAYE,,44.945000,6.288889,2518 +alps_1909,TETE DU GRAND BOIS,,44.925833,6.237500,2773 +alps_1910,AIGUILLE DES ETAGES,,44.925000,6.246389,2772 +alps_1911,TETE DE L'OURS,,44.919722,6.234444,3047 +alps_1912,COL DE L'OURS,,44.918056,6.235278,2988 +alps_1913,GRANDE AIGUILLE DE LA BERARDE,,44.916389,6.278056,3421 +alps_1914,PASSAGE DE L'OURS,,44.916111,6.236944,3031 +alps_1915,TETE DE MALACOMBE,,44.915000,6.239722,3124 +alps_1916,POINTE LEMERCIER,,44.911944,6.236111,3170 +alps_1917,COL DE L'ENCOULA,,44.910833,6.279722,3192 +alps_1918,COL DU CROUZET,,44.910833,6.236111,3128 +alps_1919,LE FIFRE,,44.916667,6.356667,3699 +alps_1920,POINTE DES AVALANCHES,,44.913333,6.358056,3585 +alps_1921,PIC COOLIDGE,,44.910278,6.357500,3775 +alps_1922,COL DU FIFRE,,44.914167,6.357500,3523 +alps_1923,POINTE DE PIE PERARDE,,44.926389,6.328889,3192 +alps_1924,POINTE DE BALME ROUSSE,,44.915833,6.330556,3284 +alps_1925,CRETE DE LA VERA PERVOZ,,44.919722,6.335000,3407 +alps_1926,BARRE NOIRE,,44.928333,6.369167,3751 +alps_1927,BARRE DES ECRINS,,44.922500,6.360000,4102 +alps_1928,PIC LORY,,44.922500,6.358333,4088 +alps_1929,JUMEAUX DES ECRINS,,44.927778,6.354444,3730 +alps_1930,TOUR DE BONNE PIERRE,,44.928889,6.356111,3692 +alps_1931,FLAMBEAU DES ECRINS,,44.922222,6.340278,3551 +alps_1932,LA ROCHAILLE,,44.934167,6.312500,2740 +alps_1933,DOME DE NEIGE DES ECRINS,,44.924444,6.353889,4015 +alps_1934,POINTE METTRIER,,44.931389,6.377778,3620 +alps_1935,POINTE DE LA GRANDE SAGNE,,44.932778,6.383333,3660 +alps_1936,BARRE BLANCHE,,44.928611,6.373056,3698 +alps_1937,CLOCHETONS DE BONNE PIERRE,,44.933056,6.356667,3535 +alps_1938,POINTE XAVIER BLANC,,44.942500,6.362222,3677 +alps_1939,ROCHE FAURIO,,44.941944,6.358056,3730 +alps_1940,POINTE LOUISE,,44.944444,6.367222,3668 +alps_1941,ROCHE D'ALVAU,,44.944444,6.344167,3628 +alps_1942,TETE SUD DE LA SOMME,,44.947222,6.330556,3389 +alps_1943,ROCHE EMILE PIC,,44.955000,6.384444,3586 +alps_1944,ROCHE HIPPOLYTE PIC,,44.948889,6.375556,3586 +alps_1945,ROCHE PAILLON,,44.951944,6.380000,3636 +alps_1946,TETE NORD DE LA SOMME,,44.952500,6.324722,3352 +alps_1947,TETE DE CHARRIERE,,44.955278,6.323333,3448 +alps_1948,CLOCHER DE CLOUZIS,,44.915833,6.461111,3338 +alps_1949,TETE NOIRE,,44.912500,6.471667,2985 +alps_1950,PIC DE L'EYCHAUDA,,44.927222,6.465556,3216 +alps_1951,PIC GARDINER,,44.926111,6.460556,3440 +alps_1952,PIC DE SEGURET,,44.923889,6.456389,3438 +alps_1953,PIC DE CLOUZIS,,44.920556,6.460833,3465 +alps_1954,PIC DE DORMILLOUSE,,44.933889,6.440278,3410 +alps_1955,PIC DU RIF,,44.928333,6.446944,3478 +alps_1956,POINTE DES ARCAS,,44.926667,6.448333,3479 +alps_1957,POINTE LONGIS,,44.932778,6.421389,2834 +alps_1958,DOME DE MONETIER,,44.930833,6.452778,3404 +alps_1959,POINTE SERRE SOUBEYRAN,,44.937500,6.389722,3472 +alps_1960,MONTAGNE DES AGNEAUX,,44.950278,6.430556,3664 +alps_1961,PIC DES PAVEOUS,,44.938611,6.433611,3384 +alps_1962,PIC JEAN GAUTHIER,,44.941389,6.435000,3389 +alps_1963,POINTE DES CINEASTES,,44.945833,6.420833,3203 +alps_1964,PIC TUCKETT,,44.948333,6.430556,3568 +alps_1965,ROCHE DE JABEL,,44.951389,6.437500,3570 +alps_1966,ROCHE DES AGNEAUX,,44.953056,6.461111,2925 +alps_1967,PIC DES PRES LES FONTS,,44.954444,6.448056,3358 +alps_1968,LA PYRAMIDE,,44.951111,6.418333,3292 +alps_1969,PIC GLACIER BLANC,,44.954722,6.393056,3527 +alps_1970,PIC DU GLACIER ARSINE,,44.952222,6.404722,3364 +alps_1971,POINTE CEZANNE,,44.950556,6.411944,3355 +alps_1972,ROCHES CORNEILLE,,44.946389,6.518611,2484 +alps_1973,CROIX DE CIBOUIT,,44.946111,6.487222,2611 +alps_1974,COL DE L'ANE,,44.942222,6.486944,2494 +alps_1975,TETE DU GRAND PRE,,44.940833,6.516389,2599 +alps_1976,COL DU GRAND PRE,,44.940556,6.514444,2544 +alps_1977,POINTE DES NEYZETS,,44.938333,6.496667,2736 +alps_1978,LE CUCUMELLE,,44.938333,6.509444,2698 +alps_1979,CROIX DU TEA,,44.938333,6.529167,2399 +alps_1980,ROC DE LA MONTAGNOLLE,,44.935556,6.483056,3825 +alps_1981,COL DE LA MONTAGBOLLE,,44.934444,6.487778,2721 +alps_1982,ROCHER DE L'YRET,,44.934444,6.490833,2830 +alps_1983,CRETE DES NEYZETS,,44.933889,6.499722,2624 +alps_1984,COL DE LA CUCUMELLE,,44.931389,6.510556,2501 +alps_1985,COL DE FREJUS,,44.926944,6.511944,2493 +alps_1986,ROCHE GAUTHIER,,44.923056,6.515278,2625 +alps_1987,COL DE MEA,,44.916667,6.517222,2457 +alps_1988,SERRE CHEVALIER,,44.911111,6.550556,2491 +alps_1989,CROIX DE LA CIME,,44.949444,6.633889,2606 +alps_1990,ROCHER DES CHAUMES,,44.949167,6.652500,2326 +alps_1991,CRETE DE LA CHARMETTE,,44.948611,6.649444,2395 +alps_1992,LA GRANDE PEYROLLE,,44.942500,6.644167,2645 +alps_1993,LA PETITE PEYROLLE,,44.937500,6.648333,2616 +alps_1994,SERRE DES AIGLES,,44.930000,6.647778,2567 +alps_1995,L'ENROUYE,,44.922222,6.649167,2313 +alps_1996,CROIX DE TOULOUSE,,44.911389,6.647500,1998 +alps_1997,SERRE THIBAUD,,44.952500,6.726111,2550 +alps_1998,ROCHER DESEUR,,44.931944,6.701389,2063 +alps_1999,COL DE MONTGENEVRE,,44.931389,6.725833,1849 +alps_2000,CRETE DE CHATEAU JOUAN,,44.916111,6.718056,2369 +alps_2001,SOMMET DE LA LOUBATIERE,,44.920556,6.749722,2545 +alps_2002,COLLET GUIGNARD,,44.917500,6.751944,2440 +alps_2003,MONTAGNE DE RACHAS,,44.995000,6.157500,2748 +alps_2004,COL D'ENTRE LES TETES,,44.993611,6.157778,2696 +alps_2005,LAC DE SERRE PALAS,,44.993333,6.185833,2784 +alps_2006,LE JANDRI,,44.993333,6.205000,3288 +alps_2007,TETE MOUTE,,44.991667,6.159722,2814 +alps_2008,PIC DU DIABLE,,44.990000,6.165000,2868 +alps_2009,CRETE DU DIABLE,,44.988056,6.169444,2837 +alps_2010,LAC NOIR,,44.987222,6.182222,2776 +alps_2011,TETE DE LA TOURA,,44.984444,6.183333,2914 +alps_2012,SOMMET DU SOREILLER,,44.968056,6.135833,2264 +alps_2013,LA COCHE,,44.966389,6.136389,2328 +alps_2014,COL DE LA COCHE,,44.963056,6.133333,2179 +alps_2015,CRETE DE PUY SALIE,,44.998889,6.240833,3532 +alps_2016,COL DE LA GIROSE,,44.998889,6.269722,3514 +alps_2017,POINTE DOSIA,,44.998611,6.267500,3609 +alps_2018,COL DE PUY SALIE,,44.998333,6.227222,3396 +alps_2019,POINTE MARIE LOUISE,,44.998056,6.260278,3593 +alps_2020,COL MADELEINE,,44.998056,6.261111,3542 +alps_2021,DOME DE PUY SALIE,,44.997500,6.222222,3417 +alps_2022,POINTE MADELEINE,,44.997500,6.263889,3627 +alps_2023,DOME DE LA LAUZE,,44.996944,6.246944,3568 +alps_2024,COL DE LA LAUZE,,44.996389,6.251944,3512 +alps_2025,POINTE THORANT,,44.996111,6.263611,3583 +alps_2026,PIC DE LA GRAVE,,44.995556,6.254444,3667 +alps_2027,BRECHE DE LA JASSIRE,,44.994444,6.208889,3253 +alps_2028,BRECHE DU RATEAU,,44.990556,6.284167,3235 +alps_2029,BRECHE DU REPLAT,,44.989444,6.284444,3286 +alps_2030,TETE NORD DU REPLAT,,44.987500,6.283611,3442 +alps_2031,COL DU REPLAT,,44.986111,6.282222,3335 +alps_2032,TETE SUD DU REPLAT,,44.984444,6.279722,3428 +alps_2033,COL DE LA SELLE,,44.982778,6.278333,3201 +alps_2034,POINTES DE LA SELLE,,44.979444,6.273056,3297 +alps_2035,COL DE LA GANDOLIERE,,44.978611,6.272778,3233 +alps_2036,TETE DE LA GANDOLIERE,,44.974444,6.271111,3542 +alps_2037,DOME DE LA GANDOLIERE,,44.973889,6.268333,3495 +alps_2038,AIGUILLE DE LA GANDOLIERE,,44.971667,6.278611,3324 +alps_2039,POINTES DE BURLAN,,44.968611,6.234722,3299 +alps_2040,LE PLARET,,44.968611,6.260000,3563 +alps_2041,COL CENTRAL,,44.968611,6.246389,3268 +alps_2042,POINTE D'AMONT,,44.968333,6.243889,3338 +alps_2043,AIGUILLE ORIENTALE DU SOREILLER,,44.968056,6.248889,3380 +alps_2044,BRECHE DU SOREILLER,,44.967778,6.236667,3173 +alps_2045,AIGUILLE CENTRALE DU SOREILLER,,44.967500,6.242500,3338 +alps_2046,COL DE BURIAN,,44.966944,6.230556,3207 +alps_2047,AIGUILLE OCCIDENTALE DU SOREILLER,,44.966667,6.238889,3280 +alps_2048,TOUR ROUGE,,44.965833,6.250000,3167 +alps_2049,AIGUILLE DU PLAT DE LA SELLE,,44.964444,6.223333,3596 +alps_2050,AIGUILLE DIBONA,,44.963333,6.243611,3131 +alps_2051,COL NORD DU PLARET,,44.962500,6.261944,3296 +alps_2052,COL SUD DU PLARET,,44.959444,6.263056,3321 +alps_2053,PIC GENY,,44.957778,6.263889,3435 +alps_2054,COL DU PLAT,,44.957222,6.216667,3085 +alps_2055,TETE DU GRAOU,,44.956944,6.215556,3168 +alps_2056,BRECHE DU ROUGET,,44.956111,6.263333,3321 +alps_2057,TETE DU ROUGET,,44.955278,6.263889,3418 +alps_2058,PIC DE CHAMOISSIERE,,44.973611,6.385556,3207 +alps_2059,TETE DE CHARRIERE,,44.955278,6.323333,3448 +alps_2060,TOUR CHOISY,,44.964167,6.327222,3671 +alps_2061,PIC BOURCET,,44.963056,6.325000,3715 +alps_2062,LES ROCHERS ROUGES,,44.960556,6.314444,3245 +alps_2063,COL DES NEIGES,,44.965000,6.335000,3348 +alps_2064,ROCHE MEANE,,44.970556,6.335833,3712 +alps_2065,PIC MAITRE,,44.969722,6.330556,3728 +alps_2066,LA GRANDE RUINE,,44.967778,6.329722,3765 +alps_2067,PIC NORD DES CAVALES,,44.980556,6.315556,3362 +alps_2068,PIC SUD DES CAVALES,,44.974722,6.322778,3360 +alps_2069,POINTE DE L'ALPE,,44.975278,6.353889,3031 +alps_2070,LES CLOCHETONS,,44.975278,6.346944,3288 +alps_2071,CLOCHETS DE L'ALPE,,44.972500,6.344444,3504 +alps_2072,CLOT DU PAVE,,44.988889,6.334167,3176 +alps_2073,POINTE CHAVELOTTE,,44.997222,6.358056,3387 +alps_2074,POINTE NEROT,,45.000000,6.353333,3538 +alps_2075,POINTE DES PICHETTES,,44.999722,6.348889,3534 +alps_2076,POINTE PIAGET,,44.998889,6.344444,3569 +alps_2077,COL CLAIRE,,44.998611,6.341389,3408 +alps_2078,PIC GASPARD,,44.998333,6.331111,3881 +alps_2079,LE PAVE,,44.998889,6.324444,3823 +alps_2080,POINTE DES AIGLES,,44.990556,6.316389,3336 +alps_2081,POINTE DES CHAMOIS,,44.988333,6.317500,3315 +alps_2082,POINTE EMMA,,44.985833,6.317500,3344 +alps_2083,POINTE CLAIRE,,44.993889,6.345833,3368 +alps_2084,TETE DE PRADIEU,,44.997500,6.403611,2880 +alps_2085,PIC DU LAC DE COMBEYNOT,,44.997222,6.416667,3088 +alps_2086,POINTE DE L'ETENDARD,,44.992500,6.431944,2981 +alps_2087,POINTE DU REOU D'ARSINE,,44.971944,6.433611,2764 +alps_2088,PIC D'ARSINE,,44.965278,6.388333,3272 +alps_2089,PIC DU DRAGON,,44.968056,6.387778,3229 +alps_2090,PIC DE NEIGE CORDIER,,44.956389,6.389722,3614 +alps_2091,PICS DU CASSET,,44.958056,6.447778,3257 +alps_2092,TETES DE SAINTE MARGUERITE,,44.966111,6.460556,2796 +alps_2093,POINTE DE BUFFERE,,44.997222,6.551389,2742 +alps_2094,TETE NOIRE,,44.996389,6.546111,2922 +alps_2095,LAC DE CRISTOL,,44.995278,6.590833,2245 +alps_2096,ROCHER DU RAISIN,,44.994167,6.623889,2646 +alps_2097,PIC DU LONGET,,44.993611,6.606389,2573 +alps_2098,CRETE DDE L'ECHAILLON,,44.993611,6.581944,2606 +alps_2099,LE LAC ROND,,44.989167,6.589167,2339 +alps_2100,CRETE DE LENLON,,44.986389,6.638889,2508 +alps_2101,LAC LA BARRE,,44.986111,6.613611,2403 +alps_2102,GRAND LAC DE L'OULE,,44.986111,6.611111,2425 +alps_2103,ROCHE GAUTHIER,,44.983889,6.625556,2748 +alps_2104,PORTE DE CRISTOL,,44.982222,6.587778,2483 +alps_2105,LA GARDIOLE,,44.981389,6.598611,2753 +alps_2106,COL DE L'OULE,,44.981111,6.606111,2546 +alps_2107,LE GRAND AREA,,44.980000,6.573333,2868 +alps_2108,ROCHER DU LOUP,,44.979444,6.611111,2654 +alps_2109,COL DES CIBIERES,,44.973889,6.600278,2525 +alps_2110,LE PETIT AREA,,44.968056,6.577222,2487 +alps_2111,COL DE GRANON,,44.963056,6.611389,2404 +alps_2112,LE GRAND MEYRET,,44.963056,6.617222,2516 +alps_2113,LE PETIT MEYRET,,44.961389,6.624167,2473 +alps_2114,COL DE BARTEAUX,,44.958333,6.626389,2382 +alps_2115,POINTE DE PECE,,44.996667,6.693889,2733 +alps_2116,LE ROCHER QUI EPOND,,44.994444,6.666944,1552 +alps_2117,POINTE DES GRANDS BECS,,44.993611,6.737500,3042 +alps_2118,PAS DU CURE,,44.992500,6.728056,2774 +alps_2119,ROCHERS DE MARAPA,,44.992500,6.725278,2911 +alps_2120,POINTE DES ROCHERS CHARNIERS,,44.987778,6.735556,3056 +alps_2121,COL DES TROIS FRERES MINEURS,,44.981944,6.721944,2586 +alps_2122,PIC DU LAUZIN,,44.978056,6.716667,2773 +alps_2123,COL DE DORMILLOUSE,,44.976111,6.706944,2445 +alps_2124,GROTTE DES CINQUANTE ANES,,44.975278,6.680556,1728 +alps_2125,COL DU CHABERTON,,44.973333,6.742500,2674 +alps_2126,LE GRAND PIERRON,,44.970833,6.701944,2667 +alps_2127,COL DE LA LAUZE,,44.968333,6.716389,2529 +alps_2128,POINTE DORMILLOUSE,,44.965833,6.713611,2588 +alps_2129,LE GRAND CHALVET,,44.961111,6.714444,2632 +alps_2130,LA TETE NOIRE,,44.959722,6.702500,2630 +alps_2131,PAS DE LA FANFARE,,44.957500,6.705278,2560 +alps_2132,TETE DES FOURNEOUS,,44.957222,6.711389,2682 +alps_2133,COL DES DESERTES,,44.999444,6.751111,2549 +alps_2134,PAS DE CHALANCHE RONDE,,44.995833,6.749722,2699 +alps_2135,MONT CHABERTON,,44.964722,6.751667,3131 +alps_2136,LE PORTON,,44.960556,6.751667,2853 +alps_2137,POINTE DE LA PORTIALA,,44.957222,6.751389,2815 +alps_2138,CIME CHALVINE,,45.084722,5.947778,2285 +alps_2139,L'INFERNET,,45.086111,5.961667,2470 +alps_2140,LA SEA,,45.080556,5.960833,2345 +alps_2141,CRETE DE LA BRECHE,,45.064167,5.983889,1730 +alps_2142,PREGENTIL,,45.046111,6.008611,1941 +alps_2143,GRANDES BUFFES,,45.071111,6.114722,2164 +alps_2144,SIGNAL DE L'HOMME,,45.066389,6.086111,2176 +alps_2145,LES SURES,,45.056111,6.067778,1875 +alps_2146,PIC DE LA FARE,,45.126667,5.959167,2138 +alps_2147,LE GRAND GALBERT,,45.090556,5.959722,2561 +alps_2148,CIME DE CORNILLON,,45.098056,5.975278,2475 +alps_2149,DOME DES PETITES ROUSSES,,45.126667,6.105556,2810 +alps_2150,PIX DE L'HERPIE,,45.109722,6.116111,3012 +alps_2151,LA GRANDE SURE,,45.099722,6.059722,2114 +alps_2152,GRANDE LANCE DE DOMENE,,45.171667,5.959444,2790 +alps_2153,DENTS DU LOUP,,45.170556,5.943611,2375 +alps_2154,PIC COUTTET,,45.170833,5.975833,2764 +alps_2155,GRAND PIC DE BELLEDONNE,,45.170833,5.991667,2977 +alps_2156,LA CROIX DE BELLEDONNE,,45.168611,5.988333,2926 +alps_2157,PETITE LANCE DE DOMENE,,45.175556,5.957500,2596 +alps_2158,PETITE LANCE DU CROZET,,45.176389,5.943333,2355 +alps_2159,PIC LAMARTINE,,45.176667,5.988889,2752 +alps_2160,ROCHE ROUSSE,,45.179444,5.989444,2753 +alps_2161,BARRE DES ECUS,,45.155000,6.006389,2323 +alps_2162,LA GRANDE ROCHE,,45.146944,6.008611,2484 +alps_2163,GRANDE LANCE D'ALLEMONT,,45.151667,5.995000,2842 +alps_2164,LE GRAND CHARNIER,,45.155278,5.996667,2777 +alps_2165,PIC DU GRAND DOMENON,,45.162222,5.971667,2802 +alps_2166,LA GRANDE LAUZIERE,,45.157222,5.959167,2741 +alps_2167,TETE NOIRE,,45.154722,5.963889,2727 +alps_2168,PIC DE MIREBEL,,45.143611,5.956111,2602 +alps_2169,POINTES DE JASSE BRALARD,,45.141667,5.940278,2525 +alps_2170,ROCHE MOUTAS,,45.146111,5.984444,2646 +alps_2171,PIC DE L'HOMME,,45.134722,5.958333,2400 +alps_2172,LE GROS TREU,,45.178056,6.074444,2366 +alps_2173,PETITES ROUSSES,,45.146944,6.109167,2475 +alps_2174,POINTE DU SIFFLET,,45.213889,6.016111,2286 +alps_2175,POINTE DU SCIALLET,,45.212222,6.013611,2312 +alps_2176,COL DE LA SCIA,,45.211111,6.009444,2261 +alps_2177,ORIONDE,,45.210278,5.974444,2041 +alps_2178,POINTE CENTRALE NORD,,45.205278,5.998333,2571 +alps_2179,POINTE CENTRALE SUD,,45.203056,5.999167,2587 +alps_2180,LE FEROUILLE,,45.198889,5.998889,2622 +alps_2181,ROC DE LA MINE DE FER,,45.198611,5.984444,2496 +alps_2182,JAS MOUTON,,45.198056,5.971667,2319 +alps_2183,PIC DE LA PIERRE,,45.193889,5.993889,2675 +alps_2184,LES TROIS OFFICIERS,,45.192500,5.993889,2702 +alps_2185,ROCHE NOIRE,,45.189444,6.003056,2398 +alps_2186,ROCHER BOULON,,45.180833,5.952778,2214 +alps_2187,LAC DE LA GRANDE SITRE,,45.180556,5.946667,1952 +alps_2188,SOMMET COLOMB,,45.196944,5.995833,2601 +alps_2189,ROCHER DE L'HOMME,,45.188333,5.987500,2755 +alps_2190,MONT DE LA SCIA,,45.207778,6.006667,2475 +alps_2191,LE GRAND REPLOMB,,45.201944,5.981667,2513 +alps_2192,ROCHE NOIRE,,45.181944,5.988889,2726 +alps_2193,COL DE L'AGNELIN,,45.225000,6.100556,2638 +alps_2194,LAC DE L'ANE,,45.223333,6.112500,2417 +alps_2195,COL DES EUSTACHES,,45.220833,6.095278,2620 +alps_2196,PIC DES EUSTACHES,,45.220000,6.091667,2728 +alps_2197,LAC DE LA SAGNE,,45.219722,6.074722,2065 +alps_2198,COL DU BUNARD,,45.216389,6.083333,2438 +alps_2199,PIC BUNARD,,45.214444,6.082500,2560 +alps_2200,TETE DE CHALVET,,45.188889,6.065833,2530 +alps_2201,COTE MOUTON,,45.188056,6.108611,2166 +alps_2202,ROCHERS RISSIOU,,45.185000,6.079444,2607 +alps_2203,COTE BELLE,,45.183889,6.113056,2395 +alps_2204,LE RISSIOU,,45.183611,6.068056,2622 +alps_2205,TETE DE L'HOMME,,45.221944,6.066944,2323 +alps_2206,ROCHERS MOTAS,,45.194444,6.098889,2389 +alps_2207,BUTTE DE PIPAY,,45.267500,6.021944,1759 +alps_2208,MONTREGARD,,45.253333,5.981111,1089 +alps_2209,LAC DE LA JASSE,,45.243889,6.018889,1861 +alps_2210,DENT DE BEDINA,,45.236667,6.024167,2430 +alps_2211,LE JAS DES LIEVRES,,45.231944,6.017222,3325 +alps_2212,ROCHE NOIRE,,45.263056,6.035278,2129 +alps_2213,POINTES DU MOUCHILLON,,45.261389,6.088333,2350 +alps_2214,COL DE PIPAY,,45.258889,6.033333,2056 +alps_2215,DOME DES OUDIS,,45.256944,6.030833,2124 +alps_2216,COL DE L'ILE,,45.256944,6.093333,2273 +alps_2217,COL DES OUDIS,,45.256111,6.031667,2096 +alps_2218,ROC DE PENDET,,45.253611,6.071389,2342 +alps_2219,POINTE BADON,,45.250833,6.113889,2715 +alps_2220,LAC CARRE,,45.250833,6.077778,2135 +alps_2221,LAC DE LA MOTTE,,45.250556,6.085278,2135 +alps_2222,ROCHER BADON,,45.247500,6.109167,2912 +alps_2223,LAC COTTEPENS,,45.245000,6.081389,2135 +alps_2224,COL DU ROCHER BLANC,,45.244444,6.109722,2809 +alps_2225,PIC DES CABOTTES,,45.241944,6.063889,2732 +alps_2226,CIME DE LA JASSE,,45.241667,6.033333,2478 +alps_2227,LE ROCHER BLANC,,45.241389,6.107500,2928 +alps_2228,LAC BLANC,,45.240556,6.091111,2256 +alps_2229,PIC DE L'APPARENCE,,45.240000,6.058611,2714 +alps_2230,COL DE L'AMIANTE,,45.238889,6.108056,2810 +alps_2231,DENT DU PRA,,45.238611,6.040833,2623 +alps_2232,PIC DE LA BELLE ETOILE,,45.236944,6.054167,2718 +alps_2233,LAC DU COS,,45.236389,6.081944,2179 +alps_2234,LA PYRAMIDE,,45.236389,6.103056,2912 +alps_2235,LE TOIT,,45.231944,6.099167,2832 +alps_2236,COL DES SEPT LAUX,,45.230833,6.076667,2184 +alps_2237,COL DE L'AIGLETON,,45.230833,6.036944,2266 +alps_2238,COL DE LA VACHE,,45.230278,6.060278,2556 +alps_2239,PIC DU PIN,,45.229722,6.037222,2342 +alps_2240,CRETE DU CHEVAL,,45.229722,6.059722,2601 +alps_2241,LAC JEPLAN,,45.228056,6.074167,2152 +alps_2242,PIC DE L'AGNELIN,,45.226667,6.100278,2740 +alps_2243,LAC DE LA CORNE,,45.225556,6.079722,2096 +alps_2244,LAC DE L'AGNELIN,,45.225556,6.090000,2322 +alps_2245,LA PETITE AIGUILLE,,45.022778,6.137500,1993 +alps_2246,LAC DE MANTEL,,45.021111,6.195278,2561 +alps_2247,LA GRANDE SURE,,45.020833,6.175278,2485 +alps_2248,LA ROCHE POURRIE,,45.014722,6.195278,2891 +alps_2249,LAC DU PLAN,,45.005000,6.156944,2281 +alps_2250,ROCHE MANTEL,,45.010000,6.196389,3040 +alps_2251,LAC DE PUY VACHIER,,45.025556,6.276111,2382 +alps_2252,POINTE DE MURETOUSE,,45.010000,6.233889,3257 +alps_2253,LA POINTE TRIFIDE,,45.006111,6.272222,3450 +alps_2254,LE RATEAU PIC OUEST,,45.000556,6.276667,3769 +alps_2255,LE RATEAU,,45.000833,6.283056,3809 +alps_2256,TETE DE LA MARTELAT,,45.002778,6.364444,2985 +alps_2257,LE CATHEDRALE,,45.006111,6.358611,2931 +alps_2258,PYRAMIDE DUHAMEL,,45.001667,6.304444,3460 +alps_2259,PIC DU GLACIER CARRE,,45.004167,6.306111,3862 +alps_2260,LA MEIJE,,45.004722,6.308611,3982 +alps_2261,DOIGT DE DIEU,,45.003889,6.314722,3973 +alps_2262,PIC ORIENTAL,,45.003611,6.319167,3891 +alps_2263,TETE DES CORRIDORS,,45.006667,6.317778,3734 +alps_2264,ARETE DE LA MEIJETTE,,45.015556,6.312222,3249 +alps_2265,CRETE DU CLOT,,45.002778,6.356389,3194 +alps_2266,LE PEIGNE,,45.007500,6.363611,2733 +alps_2267,BEC DE L'HOMME,,45.016111,6.330278,3454 +alps_2268,PIC DE L'HOMME,,45.027500,6.328611,2884 +alps_2269,BEC DE L'AIGLE,,45.013611,6.326944,3411 +alps_2270,REFUGE DE L'AIGLE,,45.011111,6.324444,3450 +alps_2271,PIC DE LA PONSONNIERE,,45.042500,6.455556,2871 +alps_2272,ROCHE COLOMBE,,45.041111,6.464167,2832 +alps_2273,LE GRAND LAC,,45.040000,6.473889,2282 +alps_2274,COL DE LAUTARET,,45.035278,6.405278,2057 +alps_2275,SERRE OREL,,45.031667,6.406667,2136 +alps_2276,ROHE ROBERT,,45.030000,6.462500,2399 +alps_2277,LES CLOCHETTES,,45.026944,6.423611,2569 +alps_2278,LE GROS ANE,,45.024167,6.416389,2505 +alps_2279,PYRAMIDE DE LAURICHARD,,45.019167,6.392222,2772 +alps_2280,PIC EST DE COMBEYNOT,,45.015556,6.421111,3145 +alps_2281,COL DE LAURICHARD,,45.015278,6.390556,2654 +alps_2282,PIC OUEST DE COMBEYNOT,,45.012222,6.411111,3155 +alps_2283,ROCHE NOIR DE COMBEYNOT,,45.011111,6.401111,3112 +alps_2284,LES JUMELLES NORD,,45.010000,6.412222,3021 +alps_2285,COL DU FONTENIL,,45.009167,6.413333,2965 +alps_2286,LAC DE COMBEYNOT,,45.007778,6.426944,2545 +alps_2287,TETE DU VALLON,,45.007778,6.413889,3059 +alps_2288,BRECHE DU VALLON DE LA ROUTE,,45.004722,6.412778,2913 +alps_2289,LES JUMELLES SUD,,45.003333,6.412222,2893 +alps_2290,TETE DE LA CASSILLE,,45.043611,6.499444,3069 +alps_2291,CRETE DE LA CASSE BLANCHE,,45.043611,6.507222,2914 +alps_2292,LACS DE LA CASSE BLANCHE,,45.037778,6.505000,2681 +alps_2293,ARETES DE LA BRUYERE,,45.036389,6.478611,2611 +alps_2294,CRETE DU QUEYRELLIN,,45.035278,6.515556,2935 +alps_2295,LA CEE HAUTE,,45.033333,6.503056,2808 +alps_2296,LA CEE BASSE,,45.029722,6.504167,2691 +alps_2297,LAC DE LA MINE,,45.028889,6.497778,2638 +alps_2298,SAUME LONGUE,,45.028333,6.531944,2246 +alps_2299,COL DU CHARDONNET,,45.028056,6.495000,2638 +alps_2300,LAC DU CHARDONNET,,45.026667,6.528611,2212 +alps_2301,COL DE L'AIGUILLETTE,,45.022222,6.488889,2534 +alps_2302,AIGUILLETTE DU LAUZET,,45.021389,6.483333,2717 +alps_2303,CRETE DU CHARDONNET,,45.017778,6.500833,2785 +alps_2304,CRETE DE BAUDE,,45.012500,6.552778,2571 +alps_2305,COL DU RAISIN,,45.011111,6.515833,2691 +alps_2306,ROCHE DU MONETIER,,45.008611,6.527778,2693 +alps_2307,CRETE DU RAISIN,,45.011389,6.531111,2818 +alps_2308,CRETE DU DIABLE,,45.012222,6.540278,2869 +alps_2309,ROCHERS DE PRIVE,,45.001111,6.540278,2843 +alps_2310,LA COLETTE,,45.041111,6.590000,2597 +alps_2311,CRETE DE LA GUEYTA,,45.040556,6.594722,2645 +alps_2312,LA GRANDE CHALLANCE,,45.036111,6.616944,2557 +alps_2313,LA TETE NOIRE,,45.031111,6.645833,2192 +alps_2314,TARROCHE,,45.020556,6.607500,1682 +alps_2315,CRETE DE LA CHARMETTE,,45.041111,6.616111,2620 +alps_2316,ROCHER DE BARABBAS,,45.021944,6.685000,2618 +alps_2317,COL DE LA GRANDE HOCHE,,45.021667,6.720000,2642 +alps_2318,PAS DES ROUSSES,,45.021389,6.681111,2517 +alps_2319,COL DES ACLES,,45.020833,6.691389,2212 +alps_2320,PAS DE L'AIGUILLE,,45.020556,6.727500,2667 +alps_2321,PITON JAUNE,,45.020278,6.697778,2292 +alps_2322,AIGUILLE D'ARBOUR,,45.019722,6.731389,2801 +alps_2323,SOMMET DU GUIAU,,45.019722,6.674444,2654 +alps_2324,ROCHE DES PRES,,45.001389,6.726111,2888 +alps_2325,SOMMET DU CHARRA,,45.021111,6.710278,2844 +alps_2326,LA CROIX DE CASSINI,,45.073056,6.134722,2373 +alps_2327,SERRE BERNARD,,45.060000,6.258889,2363 +alps_2328,LAC CRISTALLIN,,45.057222,6.223056,2354 +alps_2329,LAC NOIR,,45.049722,6.228056,2438 +alps_2330,LAC LERIE,,45.047778,6.234722,2375 +alps_2331,LE GROS TET,,45.074722,6.240278,2613 +alps_2332,PAS DU GOLEON,,45.088889,6.371667,2896 +alps_2333,ROCHE DU VALLON,,45.088056,6.340278,2812 +alps_2334,ROCHERS DU GOLEON,,45.087778,6.371944,2920 +alps_2335,ROCHE DE CASSE,,45.083611,6.345000,2772 +alps_2336,POINTE DES LAUZETTES,,45.083333,6.375278,3053 +alps_2337,LAC DU GOLEON,,45.081389,6.360000,2438 +alps_2338,COL DE LA CHARRA,,45.075000,6.369167,2884 +alps_2339,LE SIGNAL DE LA GRAVE,,45.070556,6.312222,2446 +alps_2340,PIC DES TROIS EVECHEES,,45.070000,6.365556,3116 +alps_2341,LA PARE,,45.064722,6.362222,2971 +alps_2342,PIC BLANC DU GALIBIER,,45.063889,6.384444,2955 +alps_2343,LA COTE ROUGE,,45.062500,6.302500,2277 +alps_2344,COL DE LA PARE,,45.058056,6.336944,2148 +alps_2345,L'AIGUILLON,,45.054167,6.328889,2095 +alps_2346,COL DE COTE PLAINE,,45.053333,6.374167,2739 +alps_2347,LAC DU PONTET,,45.051389,6.350833,1982 +alps_2348,LES ANROUCHORES,,45.047500,6.382222,2740 +alps_2349,COL DE LA PARE,,45.087500,6.464722,2427 +alps_2350,COL DES ROCHILLES,,45.085278,6.471111,2496 +alps_2351,LAC DE GRAND BAN,,45.085000,6.475833,2465 +alps_2352,LE RABEL,,45.082500,6.413889,2539 +alps_2353,TOURS DE NOTRE DAME,,45.081667,6.465000,2648 +alps_2354,POINTE DE LA FOURCHE,,45.079167,6.472778,2838 +alps_2355,COLLET DE LA FOURCHE,,45.078333,6.470000,2678 +alps_2356,PIC DE LA CEINTURE,,45.078333,6.468056,2779 +alps_2357,POINTE DU VALLON,,45.075833,6.434444,2726 +alps_2358,COL DU VALLON,,45.074444,6.432500,2666 +alps_2359,LAC DES CERCES,,45.070833,6.473333,2410 +alps_2360,COL DE GALIBIER,,45.064167,6.408056,2642 +alps_2361,LE GRAND GALIBIER,,45.063889,6.434167,3228 +alps_2362,LE PETIT GALIBIER,,45.063056,6.415000,2768 +alps_2363,SOMMET EST,,45.062778,6.438889,3219 +alps_2364,COL DU CLOT JULIEN,,45.060833,6.425278,2783 +alps_2365,POINTE DE LA TETE NOIRE,,45.060000,6.423333,2842 +alps_2366,COLLET DE LA PONSONNIERE,,45.055833,6.471389,2682 +alps_2367,LAC BLANC,,45.055278,6.457500,2643 +alps_2368,COL DE LA PONSONNIERE,,45.054444,6.465556,2613 +alps_2369,CRETE DE LA PONSONNIERE,,45.053611,6.457500,2711 +alps_2370,ROC TERMIER,,45.053333,6.446667,3075 +alps_2371,LAC DE LA PONSONNIERE,,45.052778,6.472778,2565 +alps_2372,COLLET DU CLOT JULIEN,,45.050556,6.448333,2927 +alps_2373,TETE DU COLOMB,,45.047778,6.449444,3022 +alps_2374,LAC DES MUANDES,,45.088056,6.545278,2580 +alps_2375,LAC ROND,,45.084722,6.527778,2446 +alps_2376,LAC DE CLAREE,,45.084167,6.487500,2433 +alps_2377,POINTE DES BANCHETS,,45.078889,6.484444,2953 +alps_2378,LAC LONG,,45.078889,6.521111,2387 +alps_2379,POINTE DU RIOU BLANC,,45.076944,6.492500,2799 +alps_2380,CRETE DES ROCHERS MARIONS,,45.071111,6.488889,2969 +alps_2381,ROCHES DE CREPIN,,45.068333,6.499444,2942 +alps_2382,POINTE DES CERCES,,45.065556,6.489167,3097 +alps_2383,ROCHER DE LA SAUMA,,45.065000,6.486389,3073 +alps_2384,CRETE DE MOUTOUZE,,45.060833,6.496111,2862 +alps_2385,LAC DE BERAUDES,,45.058611,6.504722,2504 +alps_2386,PIC DE MOULINIERE,,45.056389,6.486389,3073 +alps_2387,CRETE DE LA PONSONNIERE,,45.055833,6.478889,2824 +alps_2388,CRETE DES BERAUDES,,45.055000,6.504444,2837 +alps_2389,PAS DU LAC ROUGE,,45.054167,6.502500,2751 +alps_2390,CHANDELLE DU LAC ROUGE,,45.053611,6.507778,2757 +alps_2391,LAC DU SERPENT,,45.053056,6.561944,2448 +alps_2392,LAC ROUGE,,45.052222,6.506111,2585 +alps_2393,LAC LARAMON,,45.047778,6.556389,2359 +alps_2394,ROCHE DES BERAUDES,,45.052222,6.497778,2895 +alps_2395,POINTE MELCHIOR,,45.086667,6.641944,2948 +alps_2396,COL DE VALLON FROID,,45.081389,6.646111,2658 +alps_2397,ROCHERS DU TRU,,45.081111,6.584167,2483 +alps_2398,LAC VERT,,45.080278,6.615000,1834 +alps_2399,LAC DE LA PETITE TEMPETE,,45.079444,6.569167,2631 +alps_2400,POINTE GASPARD,,45.075000,6.643056,2808 +alps_2401,LE ROCHER BLANC,,45.073333,6.583889,2856 +alps_2402,POINTE DES QUATRE SOEURS,,45.072222,6.653333,2696 +alps_2403,COL DU VALLON,,45.071667,6.589167,2645 +alps_2404,TOUR DU VALLON,,45.070556,6.593611,2809 +alps_2405,LAC BLANC,,45.068889,6.581111,2695 +alps_2406,PIC DU LAC BLANC,,45.068056,6.571111,2980 +alps_2407,TETE RONDE,,45.058611,6.629444,2208 +alps_2408,POINTE MURATIERE,,45.058056,6.617500,2379 +alps_2409,LAC LONG,,45.057222,6.578333,2648 +alps_2410,LE SOMMET ROND,,45.056389,6.604444,2743 +alps_2411,LAC DU CHATELARD,,45.055556,6.588333,2455 +alps_2412,LAC CHAVILLON,,45.055000,6.629722,2194 +alps_2413,COL DES THURES,,45.054167,6.630833,2194 +alps_2414,COL DE L'ETROIT DU VALLON,,45.051667,6.609167,2489 +alps_2415,L'AIGUILLE ROUGE,,45.045833,6.644722,2545 +alps_2416,LAC NOIR,,45.045556,6.592778,2391 +alps_2417,POINTE DE L'ENFOURANT,,45.076944,6.596389,2700 +alps_2418,MONT SAVOYANT,,45.132778,6.140556,3345 +alps_2419,PIC DE LA PYRAMIDE,,45.133611,6.130833,3382 +alps_2420,PIC DU LAC BLANC,,45.125278,6.127778,3323 +alps_2421,COTE SEVERAIL,,45.126944,6.148333,2959 +alps_2422,SOMMET NORE DE SARENNE,,45.117778,6.136111,3129 +alps_2423,SOMMET SUD DE SARENNE,,45.111667,6.133611,3063 +alps_2424,LE CHATEAU NOIR,,45.105278,6.134167,2882 +alps_2425,SOMMET DE LA QUARLIE,,45.099444,6.197500,2322 +alps_2426,ROCHE COURBE,,45.134444,6.265000,2905 +alps_2427,BASSE NORD DE LA RECOUDE,,45.131111,6.261389,2777 +alps_2428,CIME DE LA RECOUDE,,45.122500,6.257778,2882 +alps_2429,BASSE SUD DE LA RECOUDE,,45.120833,6.253333,2782 +alps_2430,PIC DU MAS DE LA GRAVE,,45.120556,6.246389,3020 +alps_2431,COL DE L'INFERNET,,45.120000,6.270000,2658 +alps_2432,TETE DES TRAVERS,,45.118611,6.286667,2869 +alps_2433,SOMMET NORD DE LA BUFFE,,45.114444,6.283333,2933 +alps_2434,COL DE TRENTE COMBES,,45.111944,6.230278,2455 +alps_2435,SOMMET SUD DE LA BUFFE,,45.110278,6.286389,2878 +alps_2436,COL DE MARTIGNARE,,45.109722,6.290833,2763 +alps_2437,TETE DU VALLON,,45.107222,6.217778,2591 +alps_2438,LA PETITE BUFFE,,45.090556,6.292222,2683 +alps_2439,COL DE PETIT JEAN,,45.133611,6.346944,3065 +alps_2440,COL DES SARRASINS,,45.133056,6.352500,3126 +alps_2441,AIGUILLE DE L'EPAISSEUR,,45.132500,6.356111,3230 +alps_2442,TETE DE CHAT,,45.132500,6.341667,3364 +alps_2443,BEC SUD,,45.131667,6.340556,3358 +alps_2444,COL DES AIGUILLES D'ARVES,,45.130000,6.339444,3163 +alps_2445,AIGUILLE CENTRALE D'ARVES,,45.127222,6.336944,3513 +alps_2446,COL DE GROS JEAN,,45.124722,6.335000,3265 +alps_2447,AIGUILLE MERIDIONALE D'ARVES,,45.123056,6.334722,3514 +alps_2448,BRECHE BRULLE,,45.120833,6.338611,3261 +alps_2449,COL LOMBARD,,45.118056,6.330833,3092 +alps_2450,POINTE SALVADOR,,45.116389,6.340000,3202 +alps_2451,AIGUILLE ORIENTALE,,45.115833,6.327222,3323 +alps_2452,COL DES TROIS POINTES,,45.115278,6.345278,3043 +alps_2453,AIGUILLE CENTRALE DE LA SAUSSAZ,,45.113333,6.319167,3361 +alps_2454,AIGUILLE OCCIDENTALE,,45.111667,6.314444,3340 +alps_2455,BEC DE GRENIER,,45.106944,6.315556,3298 +alps_2456,AIGUILLE D'ARGENTIERE,,45.106389,6.360833,3237 +alps_2457,AIGUILLE DU GOLEON,,45.103333,6.326667,3427 +alps_2458,ROCHERS DU VALLON,,45.097222,6.336944,3058 +alps_2459,COL DU GOLEON,,45.096111,6.367778,3873 +alps_2460,LA SETAZ DES PRES,,45.132500,6.443889,2548 +alps_2461,COL DES SETAZ,,45.129167,6.442500,2456 +alps_2462,LA MITRE,,45.125278,6.444722,2720 +alps_2463,LE GROS PERRON,,45.119722,6.449167,2771 +alps_2464,LA SETAZ VIEILLE,,45.118333,6.450833,2773 +alps_2465,PAS DE LA SETAZ VIEILLE,,45.113889,6.451667,2660 +alps_2466,LA HAUTE PARE,,45.110278,6.411944,2373 +alps_2467,LE RATEAU VIEUX,,45.108889,6.456389,2797 +alps_2468,POINTE DE LA PLAGNETTE,,45.090556,6.471667,2717 +alps_2469,ROCHE OLVERA,,45.090556,6.418056,2662 +alps_2470,PIC DE L'AIGLE,,45.090278,6.467500,2776 +alps_2471,POINTES D'ORIENT,,45.105000,6.453333,2949 +alps_2472,ROCHE DE LA PELLE,,45.131944,6.551944,2993 +alps_2473,PAS DES GRIFFES,,45.130833,6.481944,2554 +alps_2474,LES GRANDS LACS,,45.126111,6.534722,2508 +alps_2475,POINTE DE TERRE ROUGE,,45.124722,6.551944,3080 +alps_2476,MONT TOUVET,,45.121944,6.497500,2687 +alps_2477,PIC DU THABOR,,45.118611,6.562222,3207 +alps_2478,PASSAGE DE LA PISSINE,,45.118056,6.500833,2699 +alps_2479,LAC LATAZ,,45.115833,6.513611,2517 +alps_2480,COL DU THABOR,,45.115278,6.563333,3109 +alps_2481,LAC SOURCE,,45.115000,6.552778,2726 +alps_2482,POINTE DE LA PISSINE,,45.115000,6.499444,2844 +alps_2483,MONT THABOR,,45.114167,6.563889,3178 +alps_2484,LAC IZI,,45.113889,6.508333,2558 +alps_2485,PAS DE LA BORGETTE,,45.111667,6.506389,2742 +alps_2486,POINTE DES ANGELIERES,,45.111389,6.561389,3093 +alps_2487,LAC CURTALES,,45.110833,6.521667,2441 +alps_2488,LAC CORNU,,45.110000,6.525000,2429 +alps_2489,LAC ROND,,45.110000,6.523889,2441 +alps_2490,ROCHE CHATEAU,,45.109167,6.510556,2898 +alps_2491,COL DE LA CHAPELLE,,45.109167,6.561944,2943 +alps_2492,LACS DES GLACIERS,,45.107222,6.546111,2663 +alps_2493,LAC BRI,,45.106389,6.527778,2514 +alps_2494,COL DE LA MADELEINE,,45.106111,6.515833,2781 +alps_2495,ROC DE VALMEINIER,,45.105278,6.561667,3025 +alps_2496,ROCHE DU CHARDONNET,,45.101944,6.549167,2950 +alps_2497,COL DE LA BAUME NOIRE,,45.101111,6.496389,2699 +alps_2498,POINTE DE ROCHACHILLE,,45.099444,6.493056,2799 +alps_2499,POINTE DE NEVACHE,,45.098889,6.530000,2892 +alps_2500,LAC CHARDONNET,,45.097500,6.560278,2599 +alps_2501,COL DES MUANDES,,45.096389,6.550556,2828 +alps_2502,L'AIGUILLE NOIRE,,45.095000,6.480278,2869 +alps_2503,LAC BIRON,,45.095000,6.495000,2651 +alps_2504,COL DE L'AIGUILLE NOIRE,,45.094722,6.484722,2665 +alps_2505,LACS DE LA MADELEINE,,45.093889,6.533333,2629 +alps_2506,ROCHERS DE L'AIGLI,,45.091111,6.554444,2843 +alps_2507,LAC LONG,,45.126111,6.592778,2513 +alps_2508,LE GRAND ARGENTIER,,45.125833,6.654444,3042 +alps_2509,LAC ROND DE ST MARGUERITE,,45.123056,6.596667,2508 +alps_2510,LE CHEVAL BLANC,,45.121944,6.575556,3020 +alps_2511,LE GRINGOIL,,45.121667,6.615833,2838 +alps_2512,COL DE LA VALLEE ETROITE,,45.119444,6.617222,2526 +alps_2513,COL DE FONTAINE FROIDE,,45.116667,6.621111,2509 +alps_2514,COL DE LA ROUE,,45.116111,6.642778,2541 +alps_2515,PETIT COL DE LA ROUE,,45.115278,6.650278,2626 +alps_2516,GRAN BAGNA,,45.111944,6.633056,3080 +alps_2517,COL DE LA GRAND BAGNA,,45.110278,6.631667,2990 +alps_2518,CIME DE LA PLANETTE,,45.109444,6.630000,3104 +alps_2519,LAC DU PEYRON,,45.108333,6.591389,2435 +alps_2520,LE GRAND SERU,,45.101389,6.590278,2868 +alps_2521,ROCHE BERNAUDE,,45.101389,6.627500,3222 +alps_2522,COL DU LAC BLANC,,45.098611,6.572778,2628 +alps_2523,COL DES SERU,,45.098611,6.595833,2544 +alps_2524,LAC BLANC,,45.098056,6.568056,2614 +alps_2525,LE GRAND ADRET,,45.096389,6.575278,2750 +alps_2526,POINTE BALTHAZAR,,45.092778,6.630000,3153 +alps_2527,L'ARGENTIER,,45.122222,6.658611,3046 +alps_2528,DOME DE LA COCHETTE,,45.179722,6.159167,3041 +alps_2529,CIMES DE LA COCHETTE,,45.168333,6.149444,3241 +alps_2530,CIMES DE LA BARBARATE,,45.163056,6.147222,3291 +alps_2531,CIME DE LA VALETTE,,45.164444,6.180556,2858 +alps_2532,COMES DU GRAND SAUVAGE,,45.154444,6.166111,3216 +alps_2533,MONT PEAIAUX,,45.161944,6.175278,2958 +alps_2534,CIME DU PETIT SAUVAGE,,45.150833,6.157778,3163 +alps_2535,PIC DE L'ETENDARD,,45.154444,6.143889,3464 +alps_2536,PIC BAYLE,,45.137778,6.135833,3465 +alps_2537,LE PETIT AGNELIN,,45.160278,6.248611,2717 +alps_2538,COL DE LA VALETTE,,45.156944,6.208056,2291 +alps_2539,MONTAGNE DE LA LAUZE,,45.152778,6.216111,2470 +alps_2540,CIME DES TORCHES,,45.151111,6.250556,2958 +alps_2541,COL DE L'ANGELIN,,45.147778,6.254722,2769 +alps_2542,COL DES PRES NOUVEAU,,45.143611,6.221667,2292 +alps_2543,PAS DE PERTUITE,,45.177778,6.385833,2527 +alps_2544,COL DES MASSES,,45.175278,6.370000,2711 +alps_2545,TETE DES MASSES,,45.168611,6.365833,2812 +alps_2546,ROCHE DU BONHOMME,,45.164722,6.366389,2891 +alps_2547,PAS DU GROS GRENIER,,45.155556,6.361111,2856 +alps_2548,LE GROS CREY,,45.155000,6.318611,2575 +alps_2549,LE GROS GRENIER,,45.154444,6.361389,2911 +alps_2550,LE CREY ROND,,45.152500,6.383333,2589 +alps_2551,LE COIN DU BOEUF,,45.151389,6.328889,2352 +alps_2552,MONT POLLARD,,45.147778,6.356944,2882 +alps_2553,POINTE DE PIERRE FONDUE,,45.142222,6.359722,3037 +alps_2554,CRETE DES MOSSIERES,,45.138333,6.369722,2948 +alps_2555,MONT FALCON,,45.161667,6.308056,2625 +alps_2556,POINTE DES RATISSIERES,,45.135278,6.378333,2865 +alps_2557,CREY DU MEIGNO,,45.176111,6.389722,2546 +alps_2558,ROCHER ST-PIERRE,,45.161944,6.424444,1582 +alps_2559,LAC DE LA VIEILLE,,45.159722,6.461389,2297 +alps_2560,CREY DU QUART,,45.159167,6.471111,2534 +alps_2561,PAS DE COTERIEUX,,45.153333,6.473889,2444 +alps_2562,POINTE DES ADRETS,,45.138611,6.393333,2486 +alps_2563,LONGEFAN,,45.176389,6.554167,2761 +alps_2564,POINTE DE LA SANDONIERE,,45.170000,6.537778,2925 +alps_2565,COL DES MARCHES,,45.163333,6.540556,2725 +alps_2566,LAC DE ROCHE NOIRE,,45.159444,6.535000,2525 +alps_2567,LE PETIT FOURCHON,,45.157222,6.524167,2568 +alps_2568,ROCHE DES MARCHES,,45.149167,6.540278,2919 +alps_2569,ROCHE NOIRE,,45.145556,6.539167,3067 +alps_2570,LAC PEPIN,,45.143611,6.552500,2728 +alps_2571,ROCHE DU LAC,,45.156111,6.539722,2789 +alps_2572,PIC NOIR,,45.171111,6.599167,2874 +alps_2573,ROCHER DE BONNENUIT,,45.170833,6.619167,2590 +alps_2574,PAS DU GRAND FILON,,45.168889,6.598889,2783 +alps_2575,ROCHER GRIS,,45.165000,6.618889,2737 +alps_2576,LE GRAND COL DE ROC ROUGE,,45.161111,6.614722,2714 +alps_2577,COL DES SARRASINS,,45.156111,6.594167,2844 +alps_2578,CRETE DES SARRASINS,,45.147778,6.593333,3014 +alps_2579,COL DES ROCHES,,45.142500,6.585000,2836 +alps_2580,LAC DES BATAILLES,,45.139722,6.568333,2424 +alps_2581,LE PETIT ARGENTIER,,45.138333,6.646944,2577 +alps_2582,LE MOUNIOZ,,45.138056,6.606111,2745 +alps_2583,POINTE DES SARRASINS,,45.162222,6.607778,2963 +alps_2584,CRETE DES SARRASINS,,45.158333,6.593889,2938 +alps_2585,COL DE MONT ROND,,45.177500,6.674444,2064 +alps_2586,LA NORMA,,45.176944,6.719444,2918 +alps_2587,ROCHE DE LA DAME,,45.173333,6.692222,2620 +alps_2588,LAC DE PELOUSE,,45.172500,6.744167,2459 +alps_2589,PASSAGE DE LA BELLE PLINIER,,45.172222,6.721667,2832 +alps_2590,MONT ROND,,45.171667,6.698056,2772 +alps_2591,LA BELLE PLINIER,,45.162500,6.714722,3086 +alps_2592,PASSAGE DU VALLON,,45.158889,6.710000,2987 +alps_2593,POINTE D'ARRONDAZ,,45.152778,6.679722,2753 +alps_2594,COL DES SABLES,,45.151111,6.708889,2902 +alps_2595,COL D'ARRONDAZ,,45.145278,6.659722,2509 +alps_2596,CIME DU GRAND VALLON,,45.145000,6.711389,3129 +alps_2597,PUNTA BAGNA,,45.143611,6.680278,2847 +alps_2598,POINTE DU FREJUS,,45.140278,6.680556,2934 +alps_2599,POINTE DE PAUMONT,,45.139167,6.728611,3171 +alps_2600,CIME GARDORIA,,45.138333,6.736111,3137 +alps_2601,LE MAN,,45.220000,6.192778,2422 +alps_2602,MONTFROID,,45.219167,6.156667,2292 +alps_2603,LE GRAND PERRON,,45.216667,6.191389,2521 +alps_2604,LE BARRIOZ,,45.212500,6.189167,2537 +alps_2605,LE TEVAROZ,,45.208333,6.188333,2477 +alps_2606,LAC DE GRAND MAISON,,45.207222,6.118056,1660 +alps_2607,COL NORD DES LACS,,45.204722,6.180556,2533 +alps_2608,LAC BRAMANT,,45.202500,6.177222,2448 +alps_2609,AIGUILLE ROUSSE,,45.197500,6.180833,2680 +alps_2610,LAC BLANC,,45.195556,6.174722,2473 +alps_2611,LE MOLLARD,,45.195278,6.188889,2403 +alps_2612,AIGUILLE DE LAISSE,,45.186667,6.160278,2879 +alps_2613,LAC TOURNANT,,45.186389,6.172222,2502 +alps_2614,LES AIGUILLETTES,,45.183611,6.125556,2547 +alps_2615,AIGUILLE NOIRE,,45.181667,6.161389,2997 +alps_2616,COL DE LA CHAL,,45.222778,6.260000,1813 +alps_2617,CRET DE PRALUD,,45.221389,6.263889,1857 +alps_2618,MONT CHARVIN,,45.217500,6.285000,2207 +alps_2619,CRET D'ORNON,,45.201667,6.240000,2063 +alps_2620,LES CONTAMINES,,45.223333,6.338056,1565 +alps_2621,CASSE MASSION,,45.220000,6.380000,2433 +alps_2622,COL DES TETES,,45.215000,6.382222,1384 +alps_2623,TETE D'ALBIEZ LE VIEUX,,45.213333,6.384167,2470 +alps_2624,CROIX DU CHATEL,,45.210833,6.332500,1754 +alps_2625,COL DU MOLLARD,,45.210278,6.336944,1630 +alps_2626,POINTE DES CHAUDANNES,,45.205833,6.386111,2519 +alps_2627,CRET DE LA FEISSE,,45.190556,6.322222,1812 +alps_2628,COL D'EMY,,45.186389,6.369722,2694 +alps_2629,LA GRANDE CHIBLE,,45.180833,6.374167,2932 +alps_2630,LA CROIX DE PRALOGNAN,,45.220556,6.428056,1719 +alps_2631,PAROI DU MIDI,,45.183333,6.389722,2564 +alps_2632,GROS CREY,,45.185556,6.516944,2594 +alps_2633,MONT COBURNE,,45.183333,6.568056,2568 +alps_2634,ROCHE FLEURIE,,45.181111,6.595000,2573 +alps_2635,POINTE DE LONGE COTE,,45.188333,6.776111,3104 +alps_2636,POINTE DU CLOT,,45.191944,6.805833,2941 +alps_2637,BEC D'ARGUILLE,,45.269167,6.134444,2891 +alps_2638,CIME DU SAMBUIS,,45.263611,6.161667,2734 +alps_2639,LAC DU SAMBUIS,,45.260556,6.154722,2432 +alps_2640,LAC DE LA CROIX,,45.258333,6.144444,2415 +alps_2641,COL DE LA CROIX,,45.257778,6.139167,2529 +alps_2642,CRETE DE LA MARMOTTANE,,45.253056,6.135278,2657 +alps_2643,BRECHE DE LA MARMOTTANE,,45.251667,6.133611,2568 +alps_2644,AIGUILLE REYNIER,,45.248611,6.145000,2716 +alps_2645,AIGUILLE DE LA COMBE,,45.247500,6.145278,2747 +alps_2646,BRECHE DE L'ARGENTIERE,,45.246944,6.130278,2699 +alps_2647,COL DE LA COMBE,,45.246667,6.143611,2656 +alps_2648,AIGUILLE DE CAPDEPON,,45.246944,6.151389,2582 +alps_2649,TETES DES COS,,45.246389,6.156667,2531 +alps_2650,AIGUILLE D'OLLE,,45.245000,6.138333,2885 +alps_2651,AIGUILLE DE MARCIE,,45.244722,6.129444,2906 +alps_2652,AIGUILLE ST-PHALLE,,45.244444,6.136389,2897 +alps_2653,AIGUILLE MICHEL,,45.244444,6.133333,2914 +alps_2654,COL DE LA COMBE MADAME,,45.244167,6.125833,2641 +alps_2655,COL DE BUYANT,,45.243611,6.120278,2719 +alps_2656,COL DU GLANDON,,45.239722,6.175556,1924 +alps_2657,LE CARRELET,,45.237778,6.162778,2151 +alps_2658,LA GROSSE PIERRE,,45.233611,6.132222,2453 +alps_2659,CRETE DU PINDON,,45.239167,6.130278,2646 +alps_2660,COL DU CROIX DE FER,,45.226667,6.201111,2067 +alps_2661,COL DU CHAPUT,,45.268333,6.247222,2004 +alps_2662,LE CHAPUT,,45.266111,6.243889,2039 +alps_2663,MONT DES GRANGES,,45.265000,6.208611,1729 +alps_2664,LE MAROLAY,,45.261667,6.237778,2041 +alps_2665,LES TROIS CROIX,,45.259167,6.296667,1550 +alps_2666,MONT DE CUINAT,,45.258333,6.213056,2078 +alps_2667,TETE DE BELLARD,,45.255833,6.231389,2225 +alps_2668,PIERRE DU TURC,,45.247778,6.218611,2305 +alps_2669,COL DE BELLARD,,45.246389,6.210833,2233 +alps_2670,L'OUILLAN,,45.239444,6.215278,2431 +alps_2671,POINTE DE CORBIER,,45.234167,6.243611,2265 +alps_2672,MOLLARD PINGON,,45.230556,6.278056,1452 +alps_2673,CREUX DU CHARMET,,45.253056,6.349722,1438 +alps_2674,CROIX DES TETES,,45.266667,6.442778,2492 +alps_2675,MONT DU CHAT,,45.263056,6.519444,2836 +alps_2676,CIME DE CARON,,45.263333,6.561389,3195 +alps_2677,AIGUILLE DE BARIN,,45.245556,6.543611,2814 +alps_2678,GROSSE TETE,,45.241389,6.552778,2569 +alps_2679,MONT BREQUIN,,45.251944,6.533889,3130 +alps_2680,POINTE DE THOREN,,45.265000,6.610000,3266 +alps_2681,AIGUILLE DU BOUCHET,,45.258611,6.610278,3257 +alps_2682,POINTE DU BOUCHET,,45.253889,6.604444,3420 +alps_2683,POINTE RENOD,,45.245833,6.605833,3384 +alps_2684,ROCHER RENOD,,45.235833,6.582778,2872 +alps_2685,ROCHER DE DENTS,,45.236111,6.616944,3079 +alps_2686,GRAND ROC,,45.265556,6.688611,3316 +alps_2687,POINTE DE L'ECHELLE,,45.269167,6.685278,3422 +alps_2688,LE RATEAU D'AUSSOIS,,45.246389,6.694167,3131 +alps_2689,AIGUILLE DORAN,,45.251667,6.678889,3041 +alps_2690,TETE NOIRE,,45.243889,6.660278,2673 +alps_2691,ROC DES CORNEILLES,,45.262778,6.756389,2679 +alps_2692,LE GRAND CHATELARD,,45.301944,6.300000,2143 +alps_2693,CIME DE LANCHETON,,45.307222,6.409444,2419 +alps_2694,CIME NOIRE,,45.313611,6.446944,2626 +alps_2695,GRAND PERRON DES ENCOMBRES,,45.297500,6.450556,2825 +alps_2696,LE PETIT PERRON,,45.291944,6.449722,2699 +alps_2697,LE CHATEAU D'AUBERT,,45.289444,6.450278,2652 +alps_2698,LE PERRONNET,,45.292778,6.466667,2417 +alps_2699,PIC DU GENIE,,45.274167,6.442778,2510 +alps_2700,LE SIGNAL DU GENIE,,45.278056,6.445278,2525 +alps_2701,MONTAGNE DU FRUIT COMMUN,,45.309722,6.503056,2611 +alps_2702,POINTE DE LA MASSE,,45.297500,6.508333,2804 +alps_2703,POINTE DU COLLET BLANC,,45.292500,6.504444,2706 +alps_2704,ROCHE JAILLE,,45.271111,6.508611,2689 +alps_2705,MONT DE PECLET,,45.311667,6.595278,3012 +alps_2706,AIGUILLES DU BORGNE,,45.313889,6.613333,3138 +alps_2707,MONT DU BORGNE,,45.304167,6.613611,3153 +alps_2708,ROC DES EAUX NOIRES,,45.310833,6.651944,2996 +alps_2709,POINTE DES FONDS,,45.307500,6.646667,3024 +alps_2710,GRAND MONT½COUA,,45.310278,6.645000,3014 +alps_2711,ROC DU SOUFRE,,45.302778,6.638333,2940 +alps_2712,TETE RONDE,,45.286111,6.597222,2741 +alps_2713,AIGUILLE DE ST PERES,,45.276111,6.615000,3360 +alps_2714,ROC DES ST PERES,,45.278889,6.616667,3470 +alps_2715,AIGUILLE DE PECLET,,45.281389,6.624444,3561 +alps_2716,DOME DE POLSET,,45.278611,6.643889,3326 +alps_2717,AIGUILLE DE POLSET,,45.275833,6.639722,3501 +alps_2718,MONT DE GEBROULAZ,,45.275000,6.629444,3511 +alps_2719,POINTE DE ROSOIRE,,45.298611,6.687500,2774 +alps_2720,CRETE DE L'ARGENTINE,,45.308611,6.711667,2951 +alps_2721,DOME NORD DU GENEPY,,45.315000,6.743333,3576 +alps_2722,DOME SUD DU GENEPY,,45.310833,6.738611,3569 +alps_2723,POINTE DU GENEPY,,45.303333,6.735000,3551 +alps_2724,POINTE DE LABBY,,45.298889,6.732778,3521 +alps_2725,ROCHE CHEVRIERE,,45.293333,6.722222,3281 +alps_2726,POINTE CHEVRIERE,,45.293611,6.712222,3057 +alps_2727,LA TETE D'AUSSOIS,,45.291389,6.701389,3126 +alps_2728,POINTE DE L'OBSERVATOIRE,,45.290833,6.685556,3015 +alps_2729,POINTE DE LA GERMA,,45.288611,6.739444,3391 +alps_2730,CIME DES PLANETTES,,45.284722,6.681667,2976 +alps_2731,LA DENT PARRACHEE,,45.289167,6.756389,3697 +alps_2732,POINTE DE LA FOURNACHE,,45.287222,6.752778,3639 +alps_2733,POINTE DE PAS ROSSET,,45.280833,6.753889,3295 +alps_2734,POINTE DE BELLECOTE,,45.273889,6.751667,3139 +alps_2735,CRET LOGNAN,,45.350556,6.396111,2696 +alps_2736,LE GRAND COIN,,45.345833,6.402500,2730 +alps_2737,POINTE DE LA LEVRIERE,,45.357222,6.439167,2571 +alps_2738,AIGUILLES DE LA GRANDE MOENDAZ,,45.346111,6.435000,2696 +alps_2739,LA ROCHE VIOLETTE,,45.341667,6.421111,2631 +alps_2740,POINTE DE LA PALLAZ,,45.342778,6.407222,2709 +alps_2741,LE COIN DU CHATEL,,45.334444,6.388889,2367 +alps_2742,POINTE DU VALLON,,45.320278,6.426944,2768 +alps_2743,POINTE DE LA FENETRE,,45.354167,6.484722,2268 +alps_2744,ROC DE TOUGNE,,45.356944,6.563333,2537 +alps_2745,GEFFRIAND,,45.335556,6.487222,2396 +alps_2746,LA GRATTE,,45.317500,6.496944,2638 +alps_2747,LE CHATEAU PHILIBERT,,45.325000,6.508889,2389 +alps_2748,LE TEURRE,,45.327222,6.512778,2364 +alps_2749,MONT DE LA CHALLE,,45.353056,6.567778,2573 +alps_2750,AIGUILLE DU FRUIT,,45.355556,6.631389,3051 +alps_2751,LA GROSSE TETE,,45.343333,6.643333,2728 +alps_2752,ROC DES TROIS MARCHES,,45.341944,6.573056,2679 +alps_2753,MONT DE LA CHAMBRE,,45.318333,6.580278,2850 +alps_2754,LE PETIT BORGNE,,45.325833,6.593056,2486 +alps_2755,MONT DU VALLON,,45.329167,6.608056,2952 +alps_2756,MONT COUA,,45.318889,6.643611,2871 +alps_2757,PETIT MONT BLANC,,45.355833,6.686667,2677 +alps_2758,ROC DU MONTET,,45.348611,6.681389,2759 +alps_2759,PIC DE LA VIEILLE FEMME,,45.348889,6.727500,2738 +alps_2760,ROCHE NUE,,45.333611,6.673056,2982 +alps_2761,AIGUILLE DU RATEAU,,45.340000,6.666111,2890 +alps_2762,AIGUILLE DE CHANROSSA,,45.329167,6.666667,3045 +alps_2763,AIGUILLE DES CORNEILLETS,,45.322500,6.661944,3055 +alps_2764,DOME DE L'ARPONT,,45.318611,6.743333,3599 +alps_2765,DOME DES NANTS,,45.326111,6.741667,3570 +alps_2766,POINTE OUSET DU MONT PELVE,,45.357500,6.765833,3254 +alps_2767,MONT PELVE,,45.356944,6.781944,3261 +alps_2768,DOME DE CHASSEFORET,,45.330556,6.761111,3586 +alps_2769,DENTS D'AMBIN,,45.169167,6.893611,3372 +alps_2770,ROCHERS CLERY,,45.176667,6.893889,3143 +alps_2771,MONT D'AMBIN,,45.156667,6.884444,3378 +alps_2772,POINTE NIBLE,,45.143056,6.897778,3345 +alps_2773,POINTE FERRAND,,45.138889,6.896111,3365 +alps_2774,LE GRAND CORDONNIER,,45.140833,6.862778,3086 +alps_2775,LE PETIT VALLON,,45.163611,6.845278,3236 +alps_2776,POINTE DE BELLECOMBE,,45.217500,6.848056,2755 +alps_2777,COL DE BELLECOTE,,45.222778,6.853333,2475 +alps_2778,LACS PERRIN,,45.205556,6.879444,2317 +alps_2779,POINTE DROSET,,45.201111,6.909444,2917 +alps_2780,LE LAC BLANC,,45.196944,6.920000,2638 +alps_2781,LACS GIASET,,45.194444,6.913056,2664 +alps_2782,ROCHE D'ETACHE,,45.185833,6.857778,3083 +alps_2783,POINTE DU FOND VERT,,45.183889,6.891389,2859 +alps_2784,CORNE ROUSSE,,45.209167,6.930278,2582 +alps_2785,CIME DU BARD,,45.191667,6.932500,3168 +alps_2786,MONT GIUSALET,,45.180556,6.930000,3312 +alps_2787,OUILLON DES ARCELLINS,,45.263889,6.919722,2665 +alps_2788,LA PETITE TURRA,,45.263611,6.887778,2529 +alps_2789,LAC DES SOLLIERES,,45.259167,6.854444,2421 +alps_2790,LE GRAND COIN,,45.258056,6.869722,2796 +alps_2791,LA GRANDE TURRA,,45.256667,6.868611,2780 +alps_2792,COL DES RONDOUILLARDES,,45.255556,6.867500,2747 +alps_2793,LAC MARTIN,,45.255000,6.843889,2313 +alps_2794,POINTE DE CUGNE,,45.251667,6.868056,2984 +alps_2795,CIME DU LARO,,45.246944,6.889444,2881 +alps_2796,PAS DE LA BECCIA,,45.243889,6.884722,2717 +alps_2797,MONTFROID,,45.237222,6.843333,2822 +alps_2798,LAC DE L'ETOILE,,45.235556,6.846389,2612 +alps_2799,SIGNAL DU PETIT MONT CENIS,,45.244167,6.873056,3162 +alps_2800,POINTE DE RONCE,,45.264444,6.978611,3612 +alps_2801,SIGNAL DU GRAND MONT CENIS,,45.264444,6.955556,3377 +alps_2802,SOMMET DE LA NUNDA,,45.261667,6.939722,3023 +alps_2803,COL DU LOUP,,45.261111,6.945278,3042 +alps_2804,POINTE DU VIEUX,,45.256944,6.988333,3464 +alps_2805,POINTE DU CHAPEAU,,45.255000,6.993056,3419 +alps_2806,PAS DU CHAPEAU,,45.251667,6.996944,3283 +alps_2807,LE LAC CLAIR,,45.246944,6.985000,2755 +alps_2808,POINTE DE LA HAIE,,45.246389,7.001389,3452 +alps_2809,POINTE DES FALLETS,,45.244444,7.014444,3226 +alps_2810,ANCIEN FORT DE RONCE,,45.243889,6.956667,2294 +alps_2811,POINTE DU LAMET,,45.239444,6.999167,3504 +alps_2812,ROCHE MICHEL,,45.238611,7.015556,3429 +alps_2813,TOURNETALON,,45.396111,6.136111,1920 +alps_2814,DENT DE LA FRECHE,,45.396389,6.200278,2268 +alps_2815,TETE DE LA PERRIERE,,45.394444,6.203611,2355 +alps_2816,LA GRANDE MOUTONNIERE,,45.377500,6.205000,2415 +alps_2817,LE GRAND MICEAU,,45.371389,6.206667,2620 +alps_2818,LA GROSSE TETE,,45.385556,6.201944,2301 +alps_2819,LES PLAGNES,,45.383333,6.149444,2096 +alps_2820,LE PETIT CHARNIER,,45.373056,6.159444,2181 +alps_2821,LE GRAND CHARNIER,,45.364167,6.166944,2561 +alps_2822,PRE CHARVIN,,45.393056,6.208889,2328 +alps_2823,PIC DE ST REMY,,45.375000,6.234722,2105 +alps_2824,POINTE D'AIGUE,,45.403056,6.396111,2588 +alps_2825,POINTE DE LA GRANDE COMBE,,45.397222,6.392778,2678 +alps_2826,POINTE DE DAILLAIT,,45.396111,6.475000,2045 +alps_2827,TETE DE FER,,45.384722,6.457500,2337 +alps_2828,LE BELLACHAT,,45.379167,6.397222,2824 +alps_2829,LE MOLLARD DES BOEUFS,,45.370556,6.405833,2761 +alps_2830,POINTE DE VALBUCHE,,45.365278,6.402222,2629 +alps_2831,MONT DU FUT,,45.379167,6.407778,2636 +alps_2832,ROCHERS DE PRAZ BEGNAY,,45.361389,6.440000,2541 +alps_2833,POINTE DE PRAZ BEGNAY,,45.368333,6.438056,2421 +alps_2834,LE VERDET,,45.391944,6.536667,2294 +alps_2835,TOUGNETE,,45.363333,6.558889,2434 +alps_2836,ROCHER DE LA LOZE,,45.401111,6.605556,2526 +alps_2837,CROIX DE VERDON,,45.389167,6.606389,2739 +alps_2838,ROCHER DE L'OMBRE,,45.392222,6.611667,2377 +alps_2839,SOMMET DE LA SAULIRE,,45.382500,6.609722,2738 +alps_2840,SOMMET DE LA VISELLE,,45.382222,6.615556,2659 +alps_2841,ARETE DE LA SAULIRE,,45.370556,6.611389,2705 +alps_2842,ROC MERLET,,45.366944,6.647500,2734 +alps_2843,CRETE DU PLAN MUGNIER,,45.372778,6.646389,2626 +alps_2844,POINTE EMILIENNE,,45.361944,6.622500,2598 +alps_2845,MONT BELAIR,,45.395833,6.658056,2050 +alps_2846,CRETE DU MONT CHARVET,,45.390278,6.683056,2361 +alps_2847,POINTE DE LESCHAUX,,45.404167,6.738889,2655 +alps_2848,DENTS DE LA PORTETTA,,45.376111,6.690000,2845 +alps_2849,ROCHER DE PLASSA,,45.372778,6.689444,2867 +alps_2850,LE PETIT MARCHET,,45.365000,6.737222,2565 +alps_2851,AIGUILLE DU BOCHOR,,45.400833,6.748333,2885 +alps_2852,AIGUILLE DE LA VANOISE,,45.395000,6.779722,2796 +alps_2853,POINTE MATHEWS,,45.399444,6.821944,3786 +alps_2854,LA GRANDE CASSE,,45.405278,6.827778,3855 +alps_2855,LE MORIOND,,45.386944,6.758333,2297 +alps_2856,AIGUILLES DE L'ARCELIN,,45.375833,6.768889,2759 +alps_2857,LE GRAND MARCHET,,45.372778,6.751111,2651 +alps_2858,POINTE DU DARD,,45.363889,6.766389,3206 +alps_2859,ROCHE FERRAN,,45.365278,6.794167,3099 +alps_2860,POINTE DE LA RECHASSE,,45.373333,6.802500,3212 +alps_2861,ROCHE DE LA QUEUA,,45.367778,6.819444,2843 +alps_2862,LES GRANDS MOULINS,,45.406667,6.198889,2495 +alps_2863,LES TROIS DAMES,,45.407778,6.205556,2475 +alps_2864,LES TROIS MOLLARDS,,45.442222,6.218056,1956 +alps_2865,POINTE DE ROGNIER,,45.423333,6.218611,2341 +alps_2866,LE FORT,,45.408889,6.208611,2457 +alps_2867,LE GROS VILLAN,,45.449167,6.356667,2746 +alps_2868,ROCHER DE SARVATAN,,45.441667,6.346667,2510 +alps_2869,LA LOUCHE PERCEE,,45.437500,6.341944,2434 +alps_2870,ROC ROUGE,,45.434722,6.340556,2375 +alps_2871,ROCHE BENITE,,45.431944,6.331944,2297 +alps_2872,ROCHER DU VIEUX,,45.428056,6.328611,2252 +alps_2873,LE GRAND MAS,,45.424444,6.322500,2237 +alps_2874,L'HOMME DE BEURRE,,45.438611,6.367500,2268 +alps_2875,POINTE DU GRAND NIELARD,,45.432222,6.447500,2543 +alps_2876,POINTE DU NIELARD,,45.428333,6.438611,2559 +alps_2877,POINTE DE MOTTET,,45.429167,6.415000,2592 +alps_2878,LE CHEVAL NOIR,,45.421944,6.413889,2832 +alps_2879,LE MERBELAY,,45.406111,6.400278,2636 +alps_2880,DOS DE CRET VOLAND,,45.420278,6.523333,2092 +alps_2881,POINTE DE MERIBEL,,45.435278,6.734444,2833 +alps_2882,DENT DU VILLARD,,45.420000,6.676389,2284 +alps_2883,ROCHER DE VILLENEUVE,,45.408333,6.695000,2197 +alps_2884,POINTE DE LA VUZELLE,,45.416389,6.729722,2564 +alps_2885,TOUR DE MERLE,,45.439722,6.708056,1973 +alps_2886,BECCA MOTTA,,45.433056,6.749444,3045 +alps_2887,ROCHE DU TOUGNE,,45.428056,6.789444,2475 +alps_2888,LE GRAND BEC,,45.423611,6.753056,3398 +alps_2889,LA BECQUETTA,,45.432500,6.759167,2896 +alps_2890,POINTE DU VALLONNET,,45.417222,6.761389,3373 +alps_2891,POINTE DU CREUX NOIR,,45.405556,6.755556,3155 +alps_2892,POINTE DES VOLNETS,,45.416111,6.777222,3247 +alps_2893,POINTE DE LA GRANDE GLIERE,,45.412500,6.792222,3392 +alps_2894,POINTE DE LA PETITE GLIERE,,45.410556,6.796389,3322 +alps_2895,POINTES DE L'EPENA,,45.415000,6.806944,3307 +alps_2896,AIGUILLE DE L'EPENA,,45.414444,6.817500,3421 +alps_2897,POINTE ST¾JACQUES,,45.493056,6.373611,2531 +alps_2898,PIC DU ROGNOLET,,45.487500,6.377500,2659 +alps_2899,ROCHE NOIRE,,45.477222,6.368333,2581 +alps_2900,AIGUILLES DE LA BALME,,45.470833,6.370000,2696 +alps_2901,LA FORTRESSE,,45.467222,6.350000,2442 +alps_2902,GRAND PIC DE LA LAUZIERE,,45.459167,6.366667,2829 +alps_2903,TOUR DE LA FLACHERE,,45.455833,6.363611,2776 +alps_2904,POINTE DU ROZET,,45.452778,6.372778,2580 +alps_2905,LA BIETTAZ,,45.456389,6.380000,2555 +alps_2906,ROCHER DU GRAND JET,,45.452778,6.358611,2678 +alps_2907,LA ROCHE NOIRE,,45.480556,6.390833,2315 +alps_2908,CREVE TETE,,45.450833,6.468056,2341 +alps_2909,DOU DE MOUTIERS,,45.490556,6.625556,2489 +alps_2910,DOU DU SUBLET,,45.481389,6.622500,2301 +alps_2911,MONT JOVET,,45.494722,6.639444,2558 +alps_2912,ROC DU BECOIN,,45.492500,6.664167,2594 +alps_2913,ROC DES VERDONS,,45.488611,6.673611,2502 +alps_2914,LA GRANDE ROCHETTE,,45.491944,6.685278,2508 +alps_2915,ROCDU DIABLE,,45.492500,6.703889,2426 +alps_2916,POINTE DU TOUGNE,,45.485833,6.726389,2709 +alps_2917,ROC DU SERAC,,45.485278,6.718889,2659 +alps_2918,ROCHE DE MIO,,45.492500,6.737222,2739 +alps_2919,POINTE DE LA VELIERE,,45.470278,6.721389,2467 +alps_2920,MONT DE LA GUERRE,,45.473056,6.674444,2293 +alps_2921,SOMMET DE BELLECOTE,,45.492500,6.782500,3417 +alps_2922,POINTE DES PICHERES,,45.491667,6.792500,3309 +alps_2923,DOME DES PICHERES,,45.491944,6.798611,3319 +alps_2924,MONT BLANC DE PELSEY,,45.486111,6.829722,2866 +alps_2925,AIGUILLE DU VAL DE GENET,,45.473889,6.811944,2813 +alps_2926,POINTE DES CHARDES,,45.469167,6.782222,2919 +alps_2927,BECQUI ROUGE,,45.477222,6.776389,3102 +alps_2928,POINTE DE LA VALLAISONNAY,,45.457778,6.818056,3020 +alps_2929,ROCHE NOIRE,,45.453333,6.811667,2931 +alps_2930,TUF DE LA GRASSAZ,,45.460556,6.822500,2996 +alps_2931,LA GRANDE MURAILLE,,45.510556,6.383056,2462 +alps_2932,POINTE DE FREYDON,,45.505833,6.381944,2442 +alps_2933,LES FRETTES,,45.497500,6.377778,2528 +alps_2934,POINTE DES MARMOTTES NOIRES,,45.528056,6.398333,2339 +alps_2935,POINTE DE COMBE BRONSIN,,45.518889,6.395833,2499 +alps_2936,POINTE DE COLOMBAN,,45.512500,6.387778,2455 +alps_2937,POINTE DE L'ARBENNE,,45.518056,6.391667,2446 +alps_2938,MONT DE LA PERRIERE,,45.538056,6.404722,2436 +alps_2939,POINTE DES ARANGLES,,45.531667,6.415833,2344 +alps_2940,LA ROCHE BRISEE,,45.526111,6.423611,2086 +alps_2941,POINTE DES GLAIS ROUGES,,45.532222,6.426667,2163 +alps_2942,PIC DE LACHAT,,45.498889,6.387778,2436 +alps_2943,MONT DES ARCHETS,,45.500556,6.627500,2437 +alps_2944,MONT JOVET,,45.494722,6.639444,2558 +alps_2945,MONT ST JACQUES,,45.522222,6.701667,2407 +alps_2946,TETE DES ARPETTES,,45.523333,6.714444,2385 +alps_2947,CRETE DES BOURTES,,45.498056,6.719722,2598 +alps_2948,ROCHER DE GRAND LOGNAN,,45.506667,6.717222,2487 +alps_2949,INVERSANS,,45.497778,6.733056,2687 +alps_2950,CRETE DES LANCHETTES,,45.531389,6.818333,2617 +alps_2951,POINTE DE FRIOLIN,,45.512778,6.759444,2678 +alps_2952,L'ALIET,,45.497222,6.818056,3109 +alps_2953,LE TUILE,,45.581944,6.376111,2294 +alps_2954,LE GRAND ARC,,45.566667,6.364722,2484 +alps_2955,LE PETIT ARC,,45.565000,6.357500,2365 +alps_2956,CHAR DE LA TURCHE,,45.550556,6.353889,2010 +alps_2957,MONT BELLACHA,,45.541389,6.405556,2484 +alps_2958,PLAN DU COL,,45.555833,6.423889,1961 +alps_2959,LE QUERMOZ,,45.561111,6.562500,2296 +alps_2960,POINTE DU COL,,45.575833,6.585000,2319 +alps_2961,POINTE DU DZONFIE,,45.585000,6.571667,2455 +alps_2962,ROCHE DU JANATAN,,45.570000,6.595278,2158 +alps_2963,POINTE DU FOUR,,45.580556,6.820000,2469 +alps_2964,POINTE DU FOND BLANC,,45.581944,6.816111,2480 +alps_2965,POINTE DU PETIT FOND BLANC,,45.575833,6.813889,2497 +alps_2966,DENT DU PEIGNE,,45.558889,6.805278,2476 +alps_2967,AIGUILLE ROUSSE,,45.542778,6.796944,2488 +alps_2968,AIGUILLE GRIVE,,45.549722,6.804444,2732 +alps_2969,ROC DU GRAND RENARD,,45.553333,6.804444,2589 +alps_2970,DENT DE CORBEAU,,45.593056,6.386667,2286 +alps_2971,LA GRANDE LANCHE,,45.603056,6.390556,2110 +alps_2972,POINTE DE COMBORSIER,,45.610000,6.515833,2534 +alps_2973,POINTE DE RIONDET,,45.620000,6.562500,2357 +alps_2974,GRANDE POINTE DE BIZARD,,45.607222,6.506389,2507 +alps_2975,CROIX DE SECHERON,,45.593611,6.501389,2306 +alps_2976,LE GRAND CRETET,,45.590833,6.561111,2292 +alps_2977,GRANDE PAREI,,45.627500,6.642778,2725 +alps_2978,POINTE DE CERDOSSE,,45.625833,6.651111,2595 +alps_2979,ROCHER DE ST¾LAURENT,,45.622778,6.655556,2444 +alps_2980,POINTE DE LA PORTETTE,,45.615556,6.637222,2607 +alps_2981,ROCHEBOC,,45.608889,6.647500,2367 +alps_2982,CRETE DU FAILLE,,45.611667,6.614444,2303 +alps_2983,CRETE DE LA RAISSE,,45.603056,6.608611,2414 +alps_2984,CRET DU REY,,45.601389,6.599444,2633 +alps_2985,CRET DU BOEUF,,45.609167,6.590000,2384 +alps_2986,PIERRE PERCEE,,45.601667,6.591944,2457 +alps_2987,POINTE DE COMBE BENITE,,45.594722,6.615278,2575 +alps_2988,ROCHE DE CORNE NOIRE,,45.597778,6.607778,2461 +alps_2989,MONT ROSSET,,45.621667,6.661389,2449 +alps_2990,LE GRAND CHATELET,,45.628056,6.693889,2529 +alps_2991,CHAR DE LA CROIX,,45.633889,6.403333,1491 +alps_2992,POINTE DE LA GRANDE JOURNEE,,45.667500,6.501111,2460 +alps_2993,POINTE DE LAVOUET,,45.661111,6.506111,2410 +alps_2994,TETE DE CUVY,,45.659167,6.563056,1991 +alps_2995,POINTE DE LA GRANDE COMBE,,45.650833,6.523611,2175 +alps_2996,LA LEGETTE DE GRAND MORT,,45.645833,6.527778,2366 +alps_2997,POINTE DU DARD,,45.635000,6.524167,2489 +alps_2998,LE GRAND ROGNOUX,,45.640000,6.554722,2364 +alps_2999,LE GRAND MONT,,45.631944,6.537222,2686 +alps_3000,MONT DES ACRAYS,,45.652778,6.596667,2173 +alps_3001,MONT COIN,,45.631667,6.621111,2539 +alps_3002,LA PIERRA MENTA,,45.638056,6.651389,2714 +alps_3003,ROC DE LA CHARBONNIERE,,45.630278,6.645556,2738 +alps_3004,AIGUILLE DU GRAND FOND,,45.666389,6.671111,2920 +alps_3005,POINTE MOTTE,,45.661944,6.696944,2718 +alps_3006,POINTE NOIRE,,45.666667,6.707778,2630 +alps_3007,POINTE DE PRALOGNAN,,45.671667,6.713889,2663 +alps_3008,POINTE DE LA TERRASSE,,45.670556,6.724722,2881 +alps_3009,AIGUILLE DE TERRASIN,,45.666389,6.727778,2836 +alps_3010,POINTE DE LA COMBE NEUVE,,45.651667,6.688611,2961 +alps_3011,POINTE DE LEISETTE,,45.649444,6.697778,2910 +alps_3012,LE ROC DE L'ENFER,,45.649167,6.711111,2527 +alps_3013,AIGUILLE DE LA NOVA,,45.650833,6.676111,2893 +alps_3014,POINTE DE GARGAN,,45.644444,6.670278,2767 +alps_3015,POINTE DE PRESSET,,45.656667,6.664444,2858 +alps_3016,AIGUILLE DU LAC,,45.652500,6.661111,2749 +alps_3017,LE ROIGNAIS,,45.643056,6.688889,2995 +alps_3018,AIGUILLE DE PRAINA,,45.659722,6.753889,2607 +alps_3019,AIGUILLE DU CLAPET,,45.663333,6.821667,2615 +alps_3020,POINTE DE LA DEUVA,,45.708333,6.339444,1710 +alps_3021,LA BELLE ETOILE,,45.695278,6.330833,1843 +alps_3022,LA ROCHE POURRIE,,45.684167,6.460556,2037 +alps_3023,ROCHE PLANE,,45.694444,6.520278,2166 +alps_3024,MONT MIRANTIN,,45.684167,6.499444,2460 +alps_3025,PAS DE L'ANE,,45.680556,6.492500,2371 +alps_3026,LE NID D'AIGLE,,45.686944,6.508056,2343 +alps_3027,LA LEGETTE DU MIRANTIN,,45.687222,6.512222,2353 +alps_3028,PIC DE VACHE ROUGE,,45.675556,6.498056,2379 +alps_3029,POINTE ST½JEAN,,45.683333,6.480278,2254 +alps_3030,LE BERSEN,,45.695278,6.598611,1841 +alps_3031,ROCHE PARSTIRE,,45.675833,6.601111,2108 +alps_3032,ROCHES MERLES,,45.715833,6.692222,2497 +alps_3033,ROCHER DU VENT,,45.705000,6.670556,2360 +alps_3034,CRETE DES GITTES,,45.712500,6.708611,2538 +alps_3035,POINTE DE MYA,,45.713889,6.737222,2513 +alps_3036,ROC DU BIOLLEY,,45.694444,6.661944,1964 +alps_3037,DENT D'ARPIRE,,45.680000,6.691944,2467 +alps_3038,LES GRADES AIGUILLES,,45.705556,6.785556,2905 +alps_3039,MONT MIRAVIDI,,45.711389,6.823056,3066 +alps_3040,AIGUILLE DES VEIS,,45.701944,6.831944,3024 +alps_3041,AIGUILLE DE BEAUPRE,,45.693611,6.830556,2823 +alps_3042,LES ROCHERS NOIRS,,45.698333,6.785278,2884 +alps_3043,PLATTE DU CHEVAL,,45.691944,6.785556,2740 +alps_3044,LA CLAVETTAZ,,45.694167,6.761667,2643 +alps_3045,LANCHE CLOSE,,45.728056,6.204444,1791 +alps_3046,POINTE DE BANC PLAT,,45.729444,6.194722,1907 +alps_3047,DENT DE CONS,,45.729722,6.351667,2062 +alps_3048,MONT BISANNE,,45.746944,6.506111,1941 +alps_3049,LA CROIX DE COSTE,,45.737222,6.486667,1814 +alps_3050,ROCHERS DES ENCLAVES,,45.732778,6.646111,2465 +alps_3051,MONTAGNE D'OUTRAY,,45.731389,6.616389,2346 +alps_3052,TETE DE LA CICLE,,45.755000,6.686944,2552 +alps_3053,ROCHES FRANCHES,,45.750833,6.694444,2498 +alps_3054,AIGUILLES DE LA PENNAZ,,45.744722,6.699722,2688 +alps_3055,TETE D'ENCLAVES,,45.751111,6.742500,2852 +alps_3056,TETES DE BELLAVAL,,45.748611,6.742500,2892 +alps_3057,TETE NORD DES FOURS,,45.735556,6.726389,2756 +alps_3058,MONT TONDU,,45.763889,6.755556,3196 +alps_3059,AIGUILLE DE BELLAVAL,,45.760278,6.758056,3035 +alps_3060,LES PYRAMIDES CALCAIRES,,45.761944,6.820000,2726 +alps_3061,MONT LECHAUD,,45.745833,6.832500,2805 +alps_3062,POINTE DES OUILLONS,,45.725278,6.808889,3110 +alps_3063,POINTE LECHAUD,,45.733611,6.814167,3128 +alps_3064,ROC DES BOEUFS SUD,,45.767500,6.169444,1742 +alps_3065,ROC DES BOEUFS CENTRALE,,45.781111,6.173889,1565 +alps_3066,ROC DES BOEUFS NORD,,45.792778,6.177778,1455 +alps_3067,POINTE DE CHENEVIER,,45.798056,6.250000,1303 +alps_3068,POINTE DE LA BECCAZ,,45.806667,6.287222,2041 +alps_3069,CRET DES MOUCHES,,45.795556,6.288333,2033 +alps_3070,POINTE DE BANC FLEURY,,45.794444,6.285000,2009 +alps_3071,POINTE DE CHAURIANDE,,45.781944,6.286667,1801 +alps_3072,MONT CHARVIN,,45.802500,6.420556,2409 +alps_3073,LES AIGUILLES DU MONT,,45.795833,6.413056,2133 +alps_3074,LACHAT,,45.786944,6.522778,1591 +alps_3075,CHARD DU BEURRE,,45.770000,6.547778,1889 +alps_3076,BAN ROUGE,,45.803056,6.583056,1983 +alps_3077,MONT DE VORES,,45.792500,6.599444,2067 +alps_3078,MONT CLOCHER,,45.771667,6.590833,1976 +alps_3079,AIGUILLE CROCHE,,45.800556,6.659444,2487 +alps_3080,AIGUILLE DE ROSELETTE,,45.770833,6.690833,2384 +alps_3081,POINTE NORD,,45.769722,6.734167,2468 +alps_3082,AIGUILLE DE LA BERANGERE,,45.802778,6.779167,3425 +alps_3083,TETE BLANCHE,,45.798056,6.811389,3892 +alps_3084,AIGUILLES DE TRE LA TETE,,45.794722,6.815000,3930 +alps_3085,AIGUILLE DE L'AIGLE,,45.794722,6.830278,3517 +alps_3086,PETIT MONT BLANC,,45.791667,6.833333,3424 +alps_3087,TETE CARREE,,45.806667,6.813056,3732 +alps_3088,AIGUILLE DE LA LEE BLANCHE,,45.786389,6.803611,3697 +alps_3089,AIGUILLE DES GLACIERS,,45.778611,6.802778,3816 +alps_3090,LE PAIN DE SUCRE,,45.766111,6.755833,3169 +alps_3091,AIGUILLE DES LANCHETTES,,45.770556,6.769722,3073 +alps_3092,POINTE DES LANCHETTES,,45.769722,6.780278,3085 +alps_3093,POINTE DE LA PALLISADE,,45.775556,6.750000,2729 +alps_3094,PETITE AIGUILLE DES GLACIERS,,45.771389,6.804167,3468 +alps_3095,AIGUILLE D'ESTELETTE,,45.773611,6.821944,2933 +alps_3096,CRET DU BOURG,,45.815000,6.200000,765 +alps_3097,LANFONNET,,45.850000,6.254722,1795 +alps_3098,ROC LANCRENAZ,,45.846389,6.261944,1694 +alps_3099,PIERRE CHATELARD,,45.833056,6.280278,2176 +alps_3100,LA TOURNETTE,,45.827222,6.286389,2351 +alps_3101,ROCHER DU ROUX,,45.825833,6.256667,1561 +alps_3102,POINTE DE LA ROCHETTE,,45.814444,6.251944,1491 +alps_3103,POINTE DE LA BAJULAZ,,45.820833,6.286944,2254 +alps_3104,ROCHER DE BELCHAMP,,45.853611,6.299722,1860 +alps_3105,SULENS,,45.829167,6.371667,1839 +alps_3106,L'ETALE,,45.850000,6.447778,2483 +alps_3107,POINTE DE MANDALLAZ,,45.831389,6.444444,227 +alps_3108,AIGUILLE DE MANIGOD,,45.830000,6.430278,2024 +alps_3109,LA RIONDAZ,,45.823056,6.404444,1746 +alps_3110,LA TULLE,,45.813611,6.409167,2014 +alps_3111,TETE DE L'AULP,,45.820278,6.431111,2129 +alps_3112,LA ROUELLE,,45.816667,6.429444,2082 +alps_3113,LA GOENNE,,45.810833,6.425556,2174 +alps_3114,LE TREU,,45.820278,6.465556,1835 +alps_3115,ORSIERE,,45.828333,6.405833,1750 +alps_3116,LA CROIX CARTIER,,45.838333,6.483889,1834 +alps_3117,SIGNAL DU SAC,,45.839722,6.533889,1681 +alps_3118,ROCHEBRUNE,,45.833333,6.612778,1754 +alps_3119,CRET DU MIDI,,45.811944,6.581944,1890 +alps_3120,L'ALPETTE,,45.823889,6.617222,1871 +alps_3121,MONT JOUX,,45.846667,6.676389,1958 +alps_3122,LA CROIX DU CHRIST,,45.844167,6.686111,1942 +alps_3123,MONT JOLY,,45.826111,6.693056,2525 +alps_3124,TETE DU VELERAY,,45.810556,6.674444,2452 +alps_3125,TETE DE LA COMBAZ,,45.817222,6.686111,2445 +alps_3126,MONT VARASSAY,,45.852778,6.766667,2299 +alps_3127,POINTE INFERIEUR,,45.846111,6.782500,2830 +alps_3128,ARETE DE TRICOT,,45.842778,6.792222,3061 +alps_3129,POINTE CHAPELLAND,,45.840556,6.798889,3222 +alps_3130,AIGUILLE DE TRICOT,,45.837222,6.808056,3665 +alps_3131,AIGUILLE DE BIONNASSAY,,45.835833,6.818611,4052 +alps_3132,TOUR DES AIGUILLES GRISES,,45.831389,6.828333,3836 +alps_3133,AIGUILLE DU GOUTER,,45.850833,6.831389,3863 +alps_3134,DOMES DE MIAGE,,45.815556,6.800278,3673 +alps_3135,DENT DU CRUET,,45.870833,6.170556,1834 +alps_3136,DENTS DE LANFON,,45.860833,6.151944,1824 +alps_3137,POINTE DE TALAMARCHE,,45.859722,6.166944,1850 +alps_3138,MONT BARET,,45.887222,6.196667,1243 +alps_3139,DENT DU CRUET,,45.870833,6.260556,1834 +alps_3140,DENTS DE LANFON,,45.860833,6.241944,1824 +alps_3141,POINTE DE TALAMARCHE,,45.859722,6.256944,1850 +alps_3142,AIGUILLE DES CALVAIRES,,45.889722,6.471111,2322 +alps_3143,POINTE DE MERDASSIER,,45.865000,6.443889,2313 +alps_3144,SOMMET DES SALES,,45.879444,6.498611,1757 +alps_3145,LE CHRISTOMET,,45.862500,6.478611,1853 +alps_3146,LA GRANDE BALMAZ,,45.893056,6.496667,2616 +alps_3147,POINTE DES VERRER,,45.889722,6.495278,2532 +alps_3148,LES PARROSSAZ,,45.888333,6.485278,2556 +alps_3149,AIGUILLE DE BORDERAN,,45.886111,6.477500,2492 +alps_3150,LE PETIT CROISE BAULET,,45.886389,6.559444,2009 +alps_3151,CROISE BAULET,,45.898333,6.552500,2236 +alps_3152,TETE DU TORRAZ,,45.861944,6.532778,1930 +alps_3153,TETE DU PETIT TORRAZ,,45.862778,6.539722,1872 +alps_3154,TETE DE CHRISTOMET,,45.862500,6.550556,1844 +alps_3155,TETE DES CHARMOTS,,45.860278,6.553889,1833 +alps_3156,TETE DE BONJOURNAL,,45.863611,6.561667,1754 +alps_3157,SOMMET DES SALES,,45.879444,6.588611,1757 +alps_3158,LE CHRISTOMET,,45.862500,6.568611,1853 +alps_3159,MONT D'ARBOIS,,45.855000,6.669167,1833 +alps_3160,LE PRARION,,45.894167,6.750556,1969 +alps_3161,MONT LACHAT,,45.870833,6.793611,2115 +alps_3162,LES ROGNES,,45.861667,6.803611,2685 +alps_3163,LA ROUALLE,,45.900833,6.502778,2589 +alps_3164,TETE DE PACCALY,,45.919167,6.520000,2467 +alps_3165,TARDEVANT,,45.926389,6.526389,2501 +alps_3166,L'AMBREVETTA,,45.924444,6.531111,2463 +alps_3167,PASSAGE DE LA GRANDE FORCLAZ,,45.925000,6.534722,2311 +alps_3168,MONT CHARVET,,45.942500,6.538889,2538 +alps_3169,LA PETITE MIAZ,,45.939167,6.534722,2359 +alps_3170,LA MAMUL,,45.935833,6.528889,2404 +alps_3171,TETE DU GREPPON,,45.935833,6.553889,2044 +alps_3172,MONT FLEURI,,45.932778,6.534167,2511 +alps_3173,LES AIGUILLES NOIRES,,45.932222,6.520833,2232 +alps_3174,ARETE DE LA BESSE,,45.928056,6.546111,2205 +alps_3175,COL DE PORTETTE,,45.926389,6.543056,2128 +alps_3176,LA MIAZ,,45.920278,6.538889,2336 +alps_3177,MONT RACHAIS,,45.911944,6.500278,2311 +alps_3178,COL DE NIARD,,45.911944,6.544167,1801 +alps_3179,LA GRANDE TORCHE,,45.905556,6.508056,2505 +alps_3180,TETE PELOUSE,,45.909167,6.509722,2537 +alps_3181,ROCHE PERFIA,,45.914722,6.514167,2499 +alps_3182,ROCHERS DE LA SALLA,,45.925556,6.511667,2217 +alps_3183,POINTE DE LAPAZ,,45.919444,6.813611,2313 +alps_3184,AIGUILLETTE DU BREVENT,,45.919722,6.817500,2310 +alps_3185,AIGUILLETTE DES HOUCHES,,45.921389,6.805556,2285 +alps_3186,FRETE DE LA VOGEALLE,,45.925000,6.805000,2232 +alps_3187,COL DE BEL LACHAT,,45.923056,6.823889,2130 +alps_3188,TETE DE BEL LACHAT,,45.925000,6.830278,2276 +alps_3189,TETE DE LA FONTAINE,,45.935000,6.779444,1206 +alps_3190,POINTE DE LA BOTTE,,45.989444,6.479167,1807 +alps_3191,CIME DE FEVRIER,,45.985278,6.529722,2056 +alps_3192,POINTE D'ALMET,,45.981389,6.521944,2232 +alps_3193,POINTE DE DEUX HEURES,,45.981111,6.493333,2018 +alps_3194,POINTE DE GRANDE COMBE,,45.979167,6.513611,2210 +alps_3195,POINTE DE BELLA CHA,,45.971667,6.563611,2511 +alps_3196,COL DES ANNES,,45.970556,6.523611,1721 +alps_3197,TETE DES ANNES,,45.964722,6.527222,1869 +alps_3198,POINTE DES DELEVRETS,,45.964444,6.536111,1966 +alps_3199,COL DE L'OULETTAZ,,45.963611,6.538056,1925 +alps_3200,POINTE DE ROUELETTAZ,,45.963333,6.541389,2071 +alps_3201,MONT LACHAT DE CHATILLON,,45.958611,6.477500,2050 +alps_3202,POINTE PERCEE,,45.955556,6.556111,2750 +alps_3203,COL DE DORAN,,45.953889,6.566111,2178 +alps_3204,POINTE DE VERTES,,45.950278,6.550278,2555 +alps_3205,POINTE DE CHAMBAS,,45.947778,6.544444,2468 +alps_3206,TETE D'AUFERRAND,,45.983889,6.484444,1981 +alps_3207,COL DE LA FORCLAZ,,45.981389,6.574167,2324 +alps_3208,TETE DE LA FORCLAZ,,45.980556,6.573056,2434 +alps_3209,POINTE D'AREU,,45.981667,6.576667,2478 +alps_3210,LES QUATRE TETES,,45.953889,6.572778,2364 +alps_3211,LE SAUTET,,45.966111,6.688611,2622 +alps_3212,TETE DE COLONNEY,,45.971389,6.691111,2692 +alps_3213,AIGUILLE DE VARAN,,45.958333,6.683056,2544 +alps_3214,AIGUILLE ROUGE,,45.962222,6.684722,2636 +alps_3215,COL DE TRE L'EPAULE,,45.973889,6.696667,2532 +alps_3216,TETE DE LINDARS,,45.975000,6.698333,2560 +alps_3217,TETE DE MONTHIEU,,45.978056,6.705278,2479 +alps_3218,LA TOMBTA,,45.948889,6.691389,1856 +alps_3219,POINTE DE PLATEE,,45.965556,6.730833,2554 +alps_3220,CHATEAUX DE CRAN,,45.976389,6.727222,2475 +alps_3221,COL DE LA PORTETTE,,45.969444,6.729167,2354 +alps_3222,LE MOTET,,45.961111,6.727222,2296 +alps_3223,POINTE DE DEROCHOIR,,45.966111,6.741944,2411 +alps_3224,POINTE DU VAROCHET,,45.964167,6.672500,1854 +alps_3225,TETE DE LA TRAILLE,,45.968333,6.669722,1863 +alps_3226,TETE DE LASSY,,45.982778,6.659167,1653 +alps_3227,LE FIZ,,45.984722,6.688611,2411 +alps_3228,AUP DE VERAN,,45.983056,6.692500,2437 +alps_3229,COL DE MONTHIEU,,45.982222,6.702778,2251 +alps_3230,AIGUILLE D'AUJON,,45.985833,6.679167,2389 +alps_3231,CHAPEAU GASPARD,,45.984722,6.684167,2330 +alps_3232,LES GRANDS PLATIERES,,45.984444,6.722778,2475 +alps_3233,CROIX DE FER,,45.985556,6.673889,2337 +alps_3234,POINTE NOIRE DE PORMENAZ,,45.958333,6.801389,2323 +alps_3235,POINTES D'AYERES SUD,,45.969722,6.772778,2610 +alps_3236,POINTES D'AYERES NORD,,45.971667,6.776111,2644 +alps_3237,POINTE DE LA RATELIERE,,45.976944,6.783056,2708 +alps_3238,POINTE D'ANTERNE,,45.981667,6.784167,2741 +alps_3239,TETE A L'ANE,,45.987222,6.779722,2804 +alps_3240,TETE DE MOEDE,,45.982222,6.807222,2459 +alps_3241,FRETES DE MOEDE,,45.988611,6.812778,2472 +alps_3242,LE PETIT BARGY,,46.022500,6.513056,2098 +alps_3243,COL D'ENCRENAZ,,46.021667,6.510000,1984 +alps_3244,LA TOUR,,46.013056,6.490000,2267 +alps_3245,POINTE DZERAT,,46.004167,6.478889,2278 +alps_3246,POINTE DU CHATEAU,,45.996389,6.566389,2104 +alps_3247,LE GRAND BARGY,,46.015833,6.493611,2301 +alps_3248,TETE DE LA SALLAZ,,46.010000,6.578889,2026 +alps_3249,TETE DES MULETS,,46.002500,6.568333,2075 +alps_3250,COL DE LA FRETE,,45.999444,6.649167,1347 +alps_3251,TETE DE LOUIS PHILIPPE,,45.998333,6.644167,1389 +alps_3252,TETE DES VERDS,,45.994722,6.713333,2128 +alps_3253,POINTE DE BORNAND,,45.993056,6.667500,2034 +alps_3254,POINTES DE LA FRETE,,45.996944,6.662222,1913 +alps_3255,COL DE PLATEE,,45.995278,6.731667,2356 +alps_3256,TETE PELOUSE,,46.000000,6.733611,2475 +alps_3257,LES VERDETS,,46.003889,6.735278,2375 +alps_3258,POINTE DU GRIFFON,,46.008056,6.739444,2311 +alps_3259,TETE DE BALACHA,,46.006944,6.718889,2309 +alps_3260,TETE DE VERET,,46.009722,6.714444,2309 +alps_3261,POINTE DE L'ARBARON,,46.006667,6.664722,1953 +alps_3262,COL DE PIERRE CARREE,,46.011389,6.679167,1844 +alps_3263,POINTE DE VERE,,46.013611,6.695556,2122 +alps_3264,LES GRANDS VANS,,46.019167,6.710556,2208 +alps_3265,COL DES GRANDS VANS,,46.016944,6.713056,2173 +alps_3266,TETE DU PRE DES SAIX,,46.031111,6.697500,2118 +alps_3267,COL DE VERNANT,,46.026389,6.707500,1967 +alps_3268,PASSAGE DES VANS,,46.026111,6.717500,2014 +alps_3269,POINTE DE CUPOIRE,,46.034167,6.677500,1882 +alps_3270,LE BRION,,46.026944,6.762778,1609 +alps_3271,POINTE PERFIA,,46.020833,6.751389,1973 +alps_3272,TETE DE VILLY,,46.001667,6.821389,2481 +alps_3273,POINTE DE SALES,,46.007500,6.774444,2497 +alps_3274,POINTE DE CHARDONNIERE,,45.996944,6.775556,2723 +alps_3275,FRETES DE VILLY,,45.997500,6.818056,2494 +alps_3276,TETE DE MUSSEL,,46.058611,6.563889,513 +alps_3277,MONT SAXONNEX,,46.055000,6.483611,996 +alps_3278,ARETE DE LA TENAZ,,46.035278,6.725278,1969 +alps_3279,POINTE DU TRAPECHET,,46.041111,6.733333,1903 +alps_3280,TETE DE PORTE,,46.046389,6.752222,1526 +alps_3281,CROIX DE LA FRETE,,46.057778,6.831111,1969 +alps_3282,DENT DE VERREU,,46.072222,6.778611,1901 +alps_3283,FRETES DU GRENIER,,46.037778,6.813056,2456 +alps_3284,LA CATHEDRALE,,46.040833,6.822222,2531 +alps_3285,LE GRENIER DE COMMUNE,,46.045556,6.833056,2775 +alps_3286,AIGUILLES ROUGES DU BROUILLARD,,45.803056,6.867222,3368 +alps_3287,MONT ROUGE DE PEUTEREY,,45.804167,6.897778,2941 +alps_3288,DOME DU GOUTER,,45.842778,6.843611,4304 +alps_3289,MONT MAUDIT,,45.847500,6.875833,4465 +alps_3290,AIGUILLETTES DU TACUL,,45.852500,6.895833,3913 +alps_3291,LE PETIT CAPUCIN,,45.853889,6.900556,3693 +alps_3292,AIGUILLE DE TOULE,,45.847778,6.921667,3534 +alps_3293,AIGUILLE D'ENTREVES,,45.843611,6.916111,3600 +alps_3294,LA TOUR RONDE,,45.843611,6.907500,3792 +alps_3295,AIGUILLE DE LA BRENVA,,45.833611,6.918333,3269 +alps_3296,MONT BLANC DU COURMAYEUR,,45.828611,6.869722,4748 +alps_3297,MONT BLANC,,45.832500,6.864444,4808 +alps_3298,AIGUILLE BLANCHE DE PEUTEREY,,45.823611,6.881389,4112 +alps_3299,AIGUILLE NOIRE DE PEUTEREY,,45.815000,6.893333,3772 +alps_3300,GRAND PILIER D'ANGLE,,45.828056,6.879444,4243 +alps_3301,POINTE LOUIS AMADEE,,45.821944,6.865278,4460 +alps_3302,MONT BROUILLARD,,45.817500,6.865278,4069 +alps_3303,POINTE BARETTI,,45.814444,6.863611,4013 +alps_3304,POINTE PFANN,,45.830556,6.848056,3983 +alps_3305,ROCHER DE MONT BLANC,,45.824722,6.847778,3883 +alps_3306,PUNTA INNOMONATA,,45.816389,6.876667,3729 +alps_3307,LES BOSSES,,45.835278,6.856111,4547 +alps_3308,AIGUILLES MARBREES,,45.851389,6.941389,3535 +alps_3309,LE GRAND FLAMBEAU,,45.847778,6.927778,3559 +alps_3310,DENT DE JETOULA,,45.845000,6.946111,3306 +alps_3311,MONTE CORBEAU,,45.881667,6.854444,2334 +alps_3312,AIGUILLE DE BLAITIERE,,45.899167,6.913056,3522 +alps_3313,AIGUILLE DU FOU,,45.896944,6.912222,3501 +alps_3314,DENT DU CAIMON,,45.894444,6.909167,3554 +alps_3315,AIGUILLE DU PLAN,,45.891389,6.907222,3673 +alps_3316,DENT DU CROCODILE,,45.892778,6.907778,3640 +alps_3317,ROGNON DU PLAN,,45.887778,6.905556,3601 +alps_3318,DENT DU REQUIN,,45.887778,6.918056,3422 +alps_3319,AIGUILLE DU MIDI,,45.878611,6.887500,3842 +alps_3320,LE GROS BECHAR,,45.874167,6.840278,2562 +alps_3321,MONTE BLANC DU TACUL,,45.856667,6.888056,4248 +alps_3322,POINTE LACHENAL,,45.864722,6.895278,3613 +alps_3323,AIGUILLE DU TACUL,,45.885000,6.961111,3444 +alps_3324,AIGUILLE DE L'EBOULEMENT,,45.893611,7.003611,3599 +alps_3325,AIGUILLE DE LESCHAUX,,45.887500,7.006944,3759 +alps_3326,PETITES JORASSES,,45.881667,7.002222,3650 +alps_3327,POINTES DE FREBOUZE,,45.878889,6.998889,3530 +alps_3328,POINTES DES HIRONDELLES,,45.874167,6.999444,3524 +alps_3329,GRANDES JORASSES,,45.869167,6.988333,4208 +alps_3330,POINTE WHYMPER,,45.869167,6.985556,4184 +alps_3331,POINTE MARGUERITE,,45.868889,6.978056,4065 +alps_3332,DOME DE ROCHEFORT,,45.864722,6.968056,4015 +alps_3333,AIGUILLE DE ROCHEFORT,,45.862222,6.960556,4001 +alps_3334,DENT DU GEANT,,45.861944,6.952222,4013 +alps_3335,POINTE DES PERIADES,,45.880833,6.962500,3503 +alps_3336,POINTE CUPELIN,,45.872778,6.961111,3549 +alps_3337,MONT MALLET,,45.865556,6.961389,3989 +alps_3338,AIGUILLE DE L'EVEQUE,,45.861667,7.004722,3258 +alps_3339,MONTE GRUETTA,,45.884722,7.021389,3684 +alps_3340,POINTE DE COMBETTE,,45.876111,7.095556,2762 +alps_3341,TETE DE FERRET,,45.895278,7.076944,2713 +alps_3342,LE CLOCHER DU BREVENT,,45.936944,6.838889,2498 +alps_3343,LE BREVENT,,45.934167,6.838056,2525 +alps_3344,FRERES DES CHARMOZ,,45.920278,6.911111,2504 +alps_3345,AIGUILLE DE L'M,,45.912222,6.913056,2844 +alps_3346,AIGUILLE DES PETITS CHARMOZ,,45.911111,6.913333,2867 +alps_3347,AIGUILLE DU GREPON,,45.903056,6.919444,3482 +alps_3348,AIGUILLE DES GRANDS CHARMOZ,,45.904444,6.919167,3445 +alps_3349,AIGUILLE DE LA REPUBLIQUE,,45.905000,6.918333,3444 +alps_3350,BEC D'OISEAU,,45.901111,6.918889,3417 +alps_3351,AIGUILLE DE ROC,,45.901944,6.920000,3409 +alps_3352,LES DRUS,,45.932778,6.956667,3754 +alps_3353,AIGUILLE VERTE,,45.934722,6.970278,4122 +alps_3354,AIGUILLE DU JARDIN,,45.934167,6.975833,4035 +alps_3355,LES DROITES,,45.930833,6.989167,4000 +alps_3356,LES DROITES SOMMET OUEST,,45.931111,6.985000,3984 +alps_3357,LES DROITES SOMMET EST,,45.930556,6.992222,3956 +alps_3358,AIGUILLE CARREE,,45.939722,6.967500,3716 +alps_3359,POINTES DE SEGOGNE,,45.938333,6.968889,3797 +alps_3360,LES COURTES,,45.927500,7.003611,3856 +alps_3361,AIGUILLE MUMMERY,,45.922222,7.011667,3700 +alps_3362,AIGUILLE DU MOINE,,45.916667,6.961667,3412 +alps_3363,LA NONNE,,45.920278,6.960833,3340 +alps_3364,L'EVEQUE,,45.924444,6.962222,3469 +alps_3365,L'ENFANT DE CHOEUR,,45.925000,6.962778,3477 +alps_3366,LE CARDINAL,,45.928333,6.965556,3647 +alps_3367,ARETE DES FLAMES DE PIERRE,,45.927500,6.946944,3071 +alps_3368,AIGUILLE SAVOIE,,45.906944,7.014722,3603 +alps_3369,POINTES DES PAPILLONS,,45.910833,7.015556,3644 +alps_3370,AIGUILLE DE TALEFRE,,45.900000,7.004167,3726 +alps_3371,MONTS ROUGES DE TRIOLET,,45.905278,7.038056,3327 +alps_3372,POINTE MORIN,,45.943611,7.036944,3592 +alps_3373,POINTE KURZ,,45.938333,7.035833,3680 +alps_3374,AIGUILLES ROUGES DU DOLENT,,45.933611,7.039167,3611 +alps_3375,MONT DOLENT,,45.922222,7.046111,3823 +alps_3376,AIGUILLE DE L'AMONE,,45.929444,7.042500,3505 +alps_3377,POINTE DU DOMINO,,45.920556,7.031389,3648 +alps_3378,AIGUILLE DE TRIOLET,,45.916667,7.024722,3870 +alps_3379,POINTE ISABELLE,,45.914444,7.018611,3761 +alps_3380,MONT GREPILLON,,45.916111,7.053333,3534 +alps_3381,POINTE ALLOBROGIA,,45.909444,7.064722,3177 +alps_3382,AIGUILLE DU BELVEDERE,,45.987778,6.873611,2965 +alps_3383,AIGUILLE CROCHUES,,45.981667,6.874167,2837 +alps_3384,AIGUILLE DE LA FLORIA,,45.976111,6.868889,2888 +alps_3385,AIGUILLE DU POUCE,,45.972778,6.857778,2874 +alps_3386,AIGUILLES DE LA GLIERE,,45.970000,6.863611,2852 +alps_3387,AIGUILLE DE CHAILANON,,45.954167,6.850556,2550 +alps_3388,POINTE DES VIOZ,,45.946111,6.843889,2461 +alps_3389,AIGUILLE POURRIE,,45.958056,6.858333,2561 +alps_3390,AIGUILLE DU COL DU TOUR,,45.986944,7.014167,3359 +alps_3391,BEC ROUGE SUPERIEUR,,45.976667,6.980556,3050 +alps_3392,AIGUILLE DU PASSON,,45.974167,6.991944,3389 +alps_3393,AIGUILLE ADAMS REILLY,,45.970000,6.995833,3506 +alps_3394,AIGUILLE DU CHARDONNET,,45.968889,7.001111,3824 +alps_3395,AIGUILLE FORBES,,45.973056,7.010000,3490 +alps_3396,AIGUILLE A BOCHARD,,45.946944,6.935278,2669 +alps_3397,AIGUILLE DES GRANDS MONTETS,,45.948333,6.960278,3295 +alps_3398,LE YATAGAN,,45.953889,7.013056,3510 +alps_3399,LE CASQUE,,45.955278,7.015278,3668 +alps_3400,TETE BLANCHE,,45.983333,7.019444,3429 +alps_3401,GRANDE FOURCHE,,45.976389,7.021111,3619 +alps_3402,AIGUILLE D'ARGENTIERE,,45.960000,7.020000,3900 +alps_3403,AIGUILLES DE L'A NEUVE,,45.952778,7.036667,3753 +alps_3404,LE TOUR NOIR,,45.948889,7.037500,3837 +alps_3405,MONT BUET,,46.024722,6.852778,3096 +alps_3406,CORNES DE LORIAZ,,46.031111,6.893056,2726 +alps_3407,LE GROS NOL,,46.028611,6.870556,2459 +alps_3408,AIGUILLE DE LORIAZ,,46.033333,6.892222,2752 +alps_3409,AIGUILLE DE PRAZ TORRENT,,46.006111,6.899167,2573 +alps_3410,AIGUILLE DE MESURE,,46.003056,6.895556,2812 +alps_3411,AIGUILLE MORRIS,,46.000278,6.893889,2781 +alps_3412,AIGUILLE DE L'ENCRINAZ,,45.995556,6.897222,2863 +alps_3413,AIGUILLE DE LA PRESEVERANCE,,45.994444,6.893611,2901 +alps_3414,AIGUILLE DES CHAMOIS,,45.993889,6.891667,2880 +alps_3415,AIGUILLE DES CHAMOIS,,45.994167,6.892222,2902 +alps_3416,AIGUILLE DE LA TETE PLATTE,,45.990556,6.882500,2944 +alps_3417,AIGUILLE DU LAC BLANC,,45.990278,6.877222,2921 +alps_3418,AIGUILLE MARTIN,,45.995833,6.895556,2887 +alps_3419,AIGUILLE DE SALENTON,,46.008889,6.854167,2671 +alps_3420,AIGUILLE DE BERARD,,45.994167,6.853611,2663 +alps_3421,AIGUILLES DU TOUR,,45.995278,7.011111,3544 +alps_3422,AIGUILLE DU PISSOIR,,45.996944,7.010556,3441 +alps_3423,AIGUILLE DU MIDI DES GRANDS,,45.999444,7.006667,3302 +alps_3424,AIGUILLE DU GENEPI,,45.999444,7.002222,3265 +alps_3425,POINTES DES GRANDS,,46.003056,6.990000,3102 +alps_3426,POINTE DE BRON,,46.005833,6.984167,2954 +alps_3427,LES GRANDES AUTANNES,,46.019444,6.981389,2680 +alps_3428,L'AIGUILLETTE DES POSETTES,,46.018056,6.940000,2201 +alps_3429,LE PORTALET,,45.991667,7.056111,3344 +alps_3430,POINTE DU GENEVRIER,,46.037222,6.855278,2870 +alps_3431,POINTE ROUSSE,,46.097222,6.792500,2577 +alps_3432,POINTE DU TUET,,46.111667,6.767222,2037 +alps_3433,DENTS D'ODDAZ,,46.120556,6.784167,2111 +alps_3434,POINTE ROUSSE DES CHAMBRES,,46.112778,6.820278,2660 +alps_3435,POINTE DE BELLEGARDE,,46.104444,6.828056,2514 +alps_3436,LES AVOUDRUES,,46.101111,6.813056,2666 +alps_3437,POINTE ROUSSE,,46.097778,6.798611,2566 +alps_3438,POINTE DES CHARDONNIERES,,46.097222,6.783056,2442 +alps_3439,TETE DU FER A CHEVAL,,46.096944,6.777500,2404 +alps_3440,LA TENDRAICHE,,46.096389,6.771389,2338 +alps_3441,POINTE DE RESSASSAT,,46.080556,6.788611,2220 +alps_3442,TETE DU GRENIER,,46.083056,6.789722,2231 +alps_3443,POINTE DE L'ECORCHOIR,,46.090833,6.795556,2409 +alps_3444,POINTE DE SANS BET,,46.088333,6.825278,2240 +alps_3445,DENTS D'ODDAZ,,46.124722,6.800556,2391 +alps_3446,LES HAUTS FORTS,,46.168611,6.777500,2466 +alps_3447,POINTE DE FORNET,,46.163056,6.791944,2299 +alps_3448,POINTE DE LA LECHERE,,46.156667,6.791389,2175 +alps_3449,TETE DE BOSTAN,,46.135556,6.800278,2406 +alps_3450,LA CHAILLA,,46.137500,6.757778,1805 +alps_3451,POINTE DE LA GOLAISE,,46.131389,6.758056,1835 +alps_3452,POINTE BOURDILLON,,46.131667,6.826111,2711 +alps_3453,DENT DES SEX VERNAYS,,46.132500,6.831111,2660 +alps_3454,POINTE DE LA GOLETTE,,46.129167,6.815000,2638 +alps_3455,CORNE AU TAUREAU,,46.127222,6.809722,2630 +alps_3456,TETE DES VERDETS,,46.136111,6.808056,2389 +alps_3457,POINTE DE BOCCOR,,46.214722,6.811111,2203 +alps_3458,CORNEBOIS,,46.211944,6.810000,2200 +alps_3459,POINTE DE CHESERY,,46.203333,6.803611,2251 +alps_3460,POINTE DE CHAVANETTE,,46.177778,6.806944,2219 +alps_3461,TETE DE LINGA,,46.230278,6.820556,2156 +alps_3462,TETE DU GEANT,,46.220278,6.817222,2228 +alps_3463,LA CANCOINETTE,,46.233056,6.816667,2008 +alps_3464,POINTE DE RECON,,46.299722,6.835000,1962 +alps_3465,MONT DE GRANGE,,46.262500,6.780833,2432 +alps_3466,POINTE DES MATTES,,46.263333,6.796667,2010 +alps_3467,TETE DES TRECHES,,46.345000,6.658056,1423 +alps_3468,COL DE LA CASE D'OCHE,,46.343611,6.727500,1812 +alps_3469,AIGUILLES DE DARBON,,46.342778,6.739444,2030 +alps_3470,POINTE DE PELLUAZ,,46.338333,6.717222,1908 +alps_3471,TETE D'UBINE,,46.311111,6.723333,1522 +alps_3472,DENT DU LOUP,,46.341944,6.780000,2151 +alps_3473,TETE DE LANCHE NAIRE,,46.336667,6.784167,2350 +alps_3474,LES CORNETTES DE BISE,,46.332500,6.784722,2432 +alps_3475,ROCHERS DE CHAUDIN,,46.333056,6.796389,2276 +alps_3476,SAIX DE BISE,,46.345833,6.755556,2075 +alps_3477,MONT CHAUFFE,,46.309167,6.760556,2093 +alps_3478,POINTE LE BENEVANT,,46.334722,6.752222,2069 +alps_3479,POINTE DE LACHAU,,46.317222,6.756667,1962 +alps_3480,DENT DU CHAT,,46.321944,6.761389,1936 +alps_3481,LA TRUCHE,,46.306111,6.830278,1828 +alps_3482,AIGUILLE DE BRAITAZ,,46.312222,6.824167,1910 +alps_3483,LE LINLEU,,46.315833,6.817222,2093 +alps_3484,POINTE D'ARVOUIN,,46.320278,6.806389,2021 +alps_3485,PIC DES MEMISES,,46.378611,6.713056,1674 +alps_3486,LE GRAND MOTTAY,,46.373889,6.726111,1736 +alps_3487,MONT BENAND,,46.372500,6.682222,1284 +alps_3488,COL DE PERTUIS,,46.370833,6.705000,1512 +alps_3489,PIC BOREE,,46.370278,6.742500,1974 +alps_3490,LA COLOMBIERE,,46.369722,6.702222,1574 +alps_3491,MONT CESAR,,46.368611,6.698333,1548 +alps_3492,COL DE NEUVA,,46.363889,6.738889,1775 +alps_3493,ROC DE RIANDA,,46.359444,6.738333,1951 +alps_3494,DENT D'OCHE,,46.353056,6.731389,2221 +alps_3495,COL DE REBOLLION,,46.351667,6.723611,1925 +alps_3496,PIC DE BLANCHARD,,46.381944,6.783611,1472 +alps_3497,POINTE DE L'ARITTE,,46.375278,6.778889,1626 +alps_3498,POINTE DE PETALOUSE,,46.371944,6.753056,1878 +alps_3499,MUR DE ROSSES,,46.106389,6.893333,2929 +alps_3500,POINTE DES ROSSES,,46.097222,6.886389,2962 +alps_3501,PIC DE TENNEVERGE,,46.094167,6.879444,2989 +alps_3502,TETE DE PERUA,,46.118056,6.846667,2296 +alps_3503,TOUR DE SAINT HUBERT,,46.116667,6.874444,2430 +alps_3504,TOUR DES ROUSSES,,46.100556,6.888056,2921 +alps_3505,CORNES DU CHAMOIS,,46.087500,6.866389,2562 +alps_3506,LES TAUREAUX,,46.085000,6.891944,2596 +alps_3507,DENT DE ROSSETAN,,46.150278,6.893333,2616 +alps_3508,TOUR D'ANTEME,,46.156944,6.898333,2617 +alps_3509,DENT DE BARME,,46.131944,6.841944,2759 +alps_3510,MONT SAGEROUX,,46.126944,6.849444,2676 +alps_3511,DENT DE BONAVAU,,46.141389,6.856944,2503 +alps_3512,PETIT MONT RUAN,,46.125278,6.891944,2845 +alps_3513,LE PETIT CORDEIL,,44.068056,6.509722,1780 +alps_3514,MONTAGNE DE CORDEIL,,44.068333,6.530000,2114 +alps_3515,LE COURRADOUR,,44.086111,6.640000,2157 +alps_3516,PLAN DU RIEU,,44.092222,6.646944,2091 +alps_3517,MONTAGNE DE MAUREL,,44.011944,6.529722,1770 +alps_3518,PUY DE RENT,,44.021389,6.590833,1996 +alps_3519,ROCHER DU CARTON,,44.096389,6.705833,2598 +alps_3520,POINTE DE SANGARIS,,44.086667,6.750000,2426 +alps_3521,CIME FOURCHIAS,,44.079722,6.756944,2504 +alps_3522,MONT SAINT HONORAT,,44.076389,6.765000,2520 +alps_3523,PIERRE GROSSE,,44.074722,6.753611,2466 +alps_3524,MONT PINET,,44.091667,6.783056,2011 +alps_3525,ROCCIA D'ARIEL,,44.088611,6.824167,1619 +alps_3526,MONTAGNE DE BEAUSSEBERARD,,44.058333,6.708889,2088 +alps_3527,TETE DE TRAVERS,,44.043333,6.746111,2161 +alps_3528,MOURRE FREY,,44.032500,6.733333,2027 +alps_3529,TETE DU RUCH,,44.043889,6.674722,2099 +alps_3530,XMONTAGNE D'ARGENTON,,44.042500,6.693611,1916 +alps_3531,L'ESCLAYE,,44.176667,6.181111,1385 +alps_3532,LE MOURAS,,44.170833,6.188333,1475 +alps_3533,CRETE DE LIMAN,,44.161111,6.261944,1313 +alps_3534,LA BIGUE,,44.145000,6.189722,1645 +alps_3535,LA GOMBERGE,,44.132778,6.194167,1490 +alps_3536,MARTIGNON,,44.125000,6.201667,1430 +alps_3537,CLAU CHASTEL,,44.143611,6.200833,1452 +alps_3538,SOMMET DE TRIEY,,44.179444,6.397222,1493 +alps_3539,SOMMET DE LA COLLE,,44.171944,6.443056,1608 +alps_3540,MONTAGNE DU CARTON,,44.181389,6.460833,2122 +alps_3541,SOMMET DE LA MULATIERE,,44.133889,6.433333,2283 +alps_3542,SOMMET DU CHEVAL BLANC,,44.127222,6.424167,2323 +alps_3543,SOMMET DES CROQUETS,,44.120278,6.422222,2270 +alps_3544,BARRE DES CHAMOIS,,44.111111,6.421389,2285 +alps_3545,SOMMET DE PALUET,,44.133611,6.450556,2305 +alps_3546,CRETE DE LA BLACHE,,44.155556,6.340278,1261 +alps_3547,SOMMET DE COUARD,,44.101111,6.350556,1988 +alps_3548,SOMMET DE CUCUYON,,44.110833,6.362778,1886 +alps_3549,SOMMET DE CLUCHEMET,,44.108056,6.392778,1764 +alps_3550,MONTAGNE DE BOULES,,44.173889,6.500556,2391 +alps_3551,SOMMET DE DENJUAN,,44.179167,6.527222,2401 +alps_3552,LA GRANDE CROIX,,44.168889,6.546111,2368 +alps_3553,MONTAGNE DE CHALUFY,,44.172778,6.530833,2385 +alps_3554,MONTAGNE DE MICHARD,,44.189444,6.545833,2358 +alps_3555,CRETE DU PUY,,44.170000,6.561667,2322 +alps_3556,LE LAUPON,,44.145000,6.636389,2432 +alps_3557,ROCHER DE L'AIGLE,,44.134444,6.651944,2396 +alps_3558,MONTAGNE DE CHAMATTE,,44.125833,6.531944,2001 +alps_3559,PLAINE DE JASSAUD,,44.142778,6.549444,2081 +alps_3560,MONTAGNE DE COSTE LONGUE,,44.133889,6.485278,2286 +alps_3561,LA FEMME COUCHEE,,44.113611,6.623056,2057 +alps_3562,SOMMET DE NONCIERE,,44.172778,6.674167,2579 +alps_3563,LA PELONNIERE DE LA FREMA,,44.160556,6.695556,2697 +alps_3564,SOMMET DE LA FREMA,,44.151944,6.698611,2747 +alps_3565,AIGUILLES DE PELENS,,44.142778,6.717222,2523 +alps_3566,LE CAIRAS,,44.141111,6.706111,2681 +alps_3567,LA COUGNASSE,,44.124444,6.708333,2482 +alps_3568,PUY DU PAS ROUBINOUS,,44.118611,6.719722,2516 +alps_3569,CIME DE L'ASPRE,,44.175556,6.809722,2471 +alps_3570,CIME DE CHAMOUSSILLON,,44.157778,6.815556,2158 +alps_3571,TETE DE MOURIES,,44.136389,6.668056,2540 +alps_3572,TETE DU LANCONET,,44.130000,6.664722,2514 +alps_3573,SOMMET DE LA MOLE,,44.125000,6.683056,2534 +alps_3574,SOMMET DU CARTON,,44.114167,6.682222,2614 +alps_3575,LE PETIT COYER,,44.118889,6.667778,2580 +alps_3576,LE GRAND COYER,,44.100556,6.690278,2693 +alps_3577,ROCHERS DE LA MAIRE,,44.143611,6.801944,2006 +alps_3578,CRETE DU CLOT DES MARTRES,,44.267778,6.139722,1803 +alps_3579,CHAUVET,,44.255278,6.144444,1578 +alps_3580,SOMMET DE COSTE BELLE,,44.265833,6.194722,2111 +alps_3581,LES MONGES,,44.263056,6.194722,2110 +alps_3582,SOMMET DE CHINE,,44.260000,6.212778,1952 +alps_3583,LE BARRI,,44.233333,6.285833,1642 +alps_3584,CLOCHE DE BARLES,,44.235833,6.230833,1887 +alps_3585,SOMMET DE NIBLES,,44.240556,6.219722,1907 +alps_3586,CRETE DE GERUEN,,44.220278,6.176389,1880 +alps_3587,MONTAGNE DE MELAN,,44.211111,6.133333,1728 +alps_3588,LES CHANES HAUTES,,44.228056,6.226667,1693 +alps_3589,LA COLLE,,44.217222,6.239167,1567 +alps_3590,BLAYEUL SOMMET,,44.247222,6.312222,2189 +alps_3591,MONTAGNE DE L'UBAC,,44.261111,6.413889,2010 +alps_3592,MONTAGNE DU PUY,,44.251944,6.399167,2002 +alps_3593,SOMMET DE LA CROIX,,44.247500,6.452222,1770 +alps_3594,TETE DU ROCHER TROUE,,44.240833,6.441667,1775 +alps_3595,L'ISOARD,,44.235833,6.438333,1783 +alps_3596,SOMMET DE BELLE VALETTE,,44.228333,6.435000,1734 +alps_3597,TETE DES FUMEIS,,44.222222,6.420556,1670 +alps_3598,SOMMET DE CHAPPE,,44.200000,6.401667,1670 +alps_3599,LE PIROU,,44.234722,6.313611,2115 +alps_3600,SOMMET DES AJUSTATS,,44.218056,6.308889,1963 +alps_3601,SOMMET DU TROMAS,,44.262500,6.482778,2502 +alps_3602,CRETE DE CHABRIERE,,44.268611,6.509722,2603 +alps_3603,LES MEES DE L'ESTROP,,44.264722,6.516667,2502 +alps_3604,LA TETE NOIRE,,44.265000,6.547500,2560 +alps_3605,MOURRE GROS,,44.249167,6.540833,2652 +alps_3606,SOMMET DU GADUC,,44.232500,6.535556,2650 +alps_3607,BAISSE DE CHANABAJA,,44.224444,6.538333,2534 +alps_3608,GRANDE TETE DES COUESSES DE JOYEUX,,44.220000,6.537500,2508 +alps_3609,CRETE DE CHABAUD,,44.210556,6.537222,2559 +alps_3610,LE MOURRE DE SIMANCE,,44.201389,6.533611,2511 +alps_3611,TETE DE L'AURIAC,,44.279444,6.538889,2639 +alps_3612,ROCHEGRAND,,44.266944,6.613333,2409 +alps_3613,LE GROS TAPI,,44.230556,6.594444,2371 +alps_3614,L'AUTAPIE,,44.213889,6.598333,2435 +alps_3615,SOMMET DE VALCIBIERE,,44.234167,6.578611,2375 +alps_3616,TETE DE PRA BERTRAND,,44.234722,6.571667,2364 +alps_3617,COSTE DE SANGRAURE,,44.231667,6.558056,2552 +alps_3618,SOMMET DE VALDEMARS,,44.238333,6.542222,2559 +alps_3619,CRETE DU CADIN,,44.233611,6.505278,2202 +alps_3620,MOURRE GROS,,44.200833,6.494444,2099 +alps_3621,TETE DU VALLONET,,44.273056,6.680000,2710 +alps_3622,LE TETON,,44.273333,6.701111,2968 +alps_3623,MONT PELAT,,44.265278,6.706111,3050 +alps_3624,LE TROU DE L'AIGLE,,44.264167,6.723889,2961 +alps_3625,SOMMET DES GARRETS,,44.253056,6.728611,2822 +alps_3626,SOMMET DU LAUSSON,,44.242778,6.726111,2645 +alps_3627,MONTAGNE DE L'AVALANCHE,,44.232778,6.724722,2729 +alps_3628,TETE DU LAC,,44.225833,6.725556,2676 +alps_3629,LA GRANDE TOUR,,44.218889,6.714167,2745 +alps_3630,LA PETITE TOUR,,44.219444,6.707500,2693 +alps_3631,CIME DE L'ESCHILLON,,44.268889,6.757778,2709 +alps_3632,GRANDE CLOT DE LA BOUCHARDE,,44.278056,6.772778,2660 +alps_3633,TETE DU COLOMBIER,,44.273333,6.787778,2789 +alps_3634,TETE DE SANGUINIERE,,44.270833,6.793611,2856 +alps_3635,LA TETE RONDE,,44.271111,6.802500,2826 +alps_3636,SERRE DE LA BRAISSA,,44.277222,6.814722,2743 +alps_3637,CRETE DE JALLATIER,,44.269722,6.815278,2691 +alps_3638,CIME DU GIAS VIEUX,,44.261389,6.795556,2748 +alps_3639,LE SANGUINEIRETTE,,44.257500,6.802222,2855 +alps_3640,POINTE DU TROU DE L'ANE,,44.248056,6.797778,2874 +alps_3641,POINTE COTE DE L'ANE,,44.244722,6.805278,2916 +alps_3642,BEC DU CHATEAU,,44.247222,6.811667,2780 +alps_3643,SOMMET DE GIALORGUES,,44.232500,6.806111,2761 +alps_3644,ROCHER DU PIGEON,,44.216944,6.815833,2743 +alps_3645,POINTE DEL'ESCAILLON,,44.215833,6.823333,2740 +alps_3646,CIME DE PAL,,44.206389,6.828611,2818 +alps_3647,CIME DE BOLOFRE,,44.223056,6.835278,2827 +alps_3648,MONTAGNE DE L'ESTROP,,44.229444,6.793611,2764 +alps_3649,TETE DE GORGIAS,,44.239444,6.773056,2621 +alps_3650,TETE DE VALPLANE,,44.221389,6.690278,2624 +alps_3651,ROCHE CLINE,,44.220278,6.665000,2492 +alps_3652,MONTAGNE DES GRAUS,,44.228056,6.670556,2458 +alps_3653,LA TETE RONDE,,44.247778,6.702500,2349 +alps_3654,TETE DE MONIER,,44.235556,6.693611,2544 +alps_3655,TETE DE L'ENCOMBRETTE,,44.202778,6.709722,2681 +alps_3656,ROCHE GRANDE,,44.214444,6.779167,2752 +alps_3657,TETE DE LA BOULIEREL,,44.211944,6.810278,2708 +alps_3658,CRETE DES RAYETTES,,44.211389,6.801944,2658 +alps_3659,LES BLACHES,,43.989444,7.049722,1524 +alps_3660,MONT FRACHA,,44.005000,7.065833,1776 +alps_3661,POINTE DE CHAVANETTE,,43.995556,7.074722,1753 +alps_3662,POINTE DE QUATRE CANTONS,,43.992222,7.093333,1804 +alps_3663,MONT MANGIARDE,,43.987778,7.193333,1623 +alps_3664,POINTE DE LA'ADRET,,43.964444,7.112778,1305 +alps_3665,MONT FALOURDE,,43.961389,7.129167,1306 +alps_3666,POINTE DE LA GARDETTE,,43.963333,7.076389,1231 +alps_3667,LES ROCCHAUDES,,43.963611,7.033889,1433 +alps_3668,LE PELLA,,43.922500,7.035000,1383 +alps_3669,TETE DU SAPET,,44.083333,6.931111,1852 +alps_3670,LES ANGUILLERS,,44.069444,6.933889,1926 +alps_3671,L'ADRECH DE FORCHE,,44.064167,6.938333,2011 +alps_3672,CIME DU CONTAN,,44.051389,6.943889,2066 +alps_3673,TETE DES GIARONS,,44.057500,7.008333,2027 +alps_3674,LES CLOTS,,44.046944,7.004722,2106 +alps_3675,TETE DE L'ABRIC,,44.051667,7.011944,2037 +alps_3676,TETE DE LA COLOMBIERE,,44.060556,6.905833,2060 +alps_3677,CIME DU PRA,,44.048889,6.917222,2075 +alps_3678,DOME DE BARROT,,44.036944,6.917222,2136 +alps_3679,TETE DE RIGAUD,,44.028889,6.950000,1907 +alps_3680,LA MELEA,,44.017222,6.914722,1715 +alps_3681,TETE DE POMMIER,,44.066944,7.023056,1913 +alps_3682,LAUVET D'ILONSE,,44.060000,7.058611,1992 +alps_3683,MONT VIROULET,,44.049722,7.175556,1864 +alps_3684,MONT DE LIEUCHE,,44.021667,7.051111,1756 +alps_3685,LE MONT,,44.035000,7.074167,1792 +alps_3686,POINTE DE SERENTON,,44.025833,7.190000,1836 +alps_3687,MONT ROUGNOUS,,44.184722,6.874167,2673 +alps_3688,PEYRE DE VIC,,44.172222,6.882500,2581 +alps_3689,ROQUEMAIRE,,44.166667,6.895556,2502 +alps_3690,CIME NEGRE,,44.158333,6.922500,2553 +alps_3691,CRETE DE LA MONTAGNE DE L'ALP,,44.153056,6.938611,2553 +alps_3692,LE PETIT MOUNIER,,44.150000,6.962222,2727 +alps_3693,MONT MOUNIER,,44.154722,6.972500,2817 +alps_3694,MOLARET,,44.178333,6.875278,2623 +alps_3695,CRETE DE LA FAYSSE,,44.169167,6.911667,2382 +alps_3696,BARRE NORD DU MOUNIER,,44.162222,6.962500,2552 +alps_3697,TETE DE VARELIOS,,44.160556,6.989722,2450 +alps_3698,TETES DE SADDOUR,,44.158333,7.014167,2305 +alps_3699,MONTAGNE DE L'ESTROP,,44.134722,6.938889,2246 +alps_3700,TETE DE CHARNAJE,,44.115556,6.953056,1972 +alps_3701,TETE DU GARNIER,,44.107500,6.963611,1906 +alps_3702,TETE DE MERIE,,44.131389,6.882222,2048 +alps_3703,MONT DES MOULINES,,44.130556,6.988889,2083 +alps_3704,CIME DE LAS MENAS,,44.189722,7.113611,2477 +alps_3705,CIME DE MERLIER,,44.181111,7.119722,2575 +alps_3706,CIME DE SISTRON,,44.173611,7.125000,2605 +alps_3707,MONT SAINT SAUVEUR,,44.164722,7.135556,2711 +alps_3708,TETE DES PIGNALS,,44.169444,7.138056,2690 +alps_3709,TETE DE LA ROUBINE,,44.170000,7.166944,2423 +alps_3710,TETE MERCIERE,,44.172778,7.175833,2491 +alps_3711,CIME DE TAVELS,,44.187500,7.194167,2795 +alps_3712,MONT COMBOUILLON,,44.130000,7.172778,2532 +alps_3713,CIME DES LAUSES,,44.123333,7.175833,2650 +alps_3714,TETE ROL,,44.110000,7.172778,2525 +alps_3715,MONT GIRAUD,,44.110556,7.159722,2606 +alps_3716,TETE DES GOURRES,,44.113333,7.150000,2471 +alps_3717,POINTE BARNON,,44.132222,7.189722,2379 +alps_3718,TETE DES MARGES,,44.122222,7.191944,2550 +alps_3719,MONT GRAVIERES,,44.149722,7.058056,2331 +alps_3720,MONT AUTCELLIER,,44.130556,7.043056,2204 +alps_3721,CIME SAINT ROBERT,,44.120000,7.376111,2919 +alps_3722,CIME DE LA LAUSE,,44.188056,7.201667,2805 +alps_3723,TETE DU CLAUS,,44.182778,7.205278,2897 +alps_3724,TETE DES PORTETTES,,44.173333,7.215278,2823 +alps_3725,TETE MARGIOLE,,44.168889,7.220278,2852 +alps_3726,POINTE GIEGN,,44.163889,7.224167,2888 +alps_3727,TETE DES TABLASSES,,44.175833,7.236111,2855 +alps_3728,ROCCA SAN GIOVANNI,,44.189722,7.253056,2627 +alps_3729,CIMA VALCUCA,,44.186944,7.245833,2605 +alps_3730,TETE DES BRESSES,,44.171944,7.244167,2824 +alps_3731,CIME DE FREMAMORTE,,44.157222,7.251389,2730 +alps_3732,CIME DE PAGARI DE SALESE,,44.148611,7.263056,2678 +alps_3733,CIME DE ROGUE,,44.144444,7.257778,2705 +alps_3734,CIME DES NAUCETTES,,44.145000,7.275833,2706 +alps_3735,CIME DE LA LECHE,,44.141389,7.282500,2678 +alps_3736,CIME DU MERCANTOUR,,44.144722,7.295833,2772 +alps_3737,CAYRE NEGRE DU MERCANTOUR,,44.138889,7.295556,2708 +alps_3738,CIME DE BAISSETTE,,44.136667,7.311111,2822 +alps_3739,CAYRE DES ERPS,,44.132778,7.308333,2745 +alps_3740,CAYRES NEGRE DU PELAGO,,44.130556,7.309722,2730 +alps_3741,MONT PELAGO,,44.125278,7.312778,2768 +alps_3742,LA MADRE DE DIO,,44.170278,7.290000,2800 +alps_3743,PUNTA DE CASSOLE,,44.171667,7.296944,2916 +alps_3744,CIMA DI NASTA,,44.165556,7.306389,3108 +alps_3745,CIMA DEL BAUS,,44.161667,7.312500,3067 +alps_3746,CIMA PAGANINI,,44.168889,7.307500,3051 +alps_3747,CIMA ARGENTERA NORD,,44.179167,7.306111,3286 +alps_3748,CIMA ARGENTERA,,44.178056,7.305833,3297 +alps_3749,PUNTA DEL GELAS LOUROUSA,,44.182778,7.307500,3262 +alps_3750,CIMA DEL CHIAPOUS,,44.189722,7.322222,2805 +alps_3751,ROCCA BARBIS,,44.180833,7.328333,2684 +alps_3752,MONTE BARRA,,44.185556,7.368611,2071 +alps_3753,CIMA CANDLEA,,44.178333,7.364167,2470 +alps_3754,PUNTA LAURA,,44.171111,7.358889,2601 +alps_3755,PUNTA CIAMBERLINE,,44.165556,7.358056,2792 +alps_3756,PUNTA GELAS FENESTRELLE,,44.154722,7.348056,2760 +alps_3757,PUNTA FENESTRELLE,,44.158611,7.356944,2701 +alps_3758,CIMA DELLA VALLETTA,,44.175833,7.364167,2549 +alps_3759,CIME DE BROCAN,,44.152222,7.308056,3054 +alps_3760,CIME GUILIE,,44.148056,7.311111,2999 +alps_3761,TETE DE LA RUINE,,44.143611,7.317778,2984 +alps_3762,CAYRE DE L'AGNEL,,44.144444,7.332778,2935 +alps_3763,CIME DE L'AGNEL,,44.145833,7.341389,2927 +alps_3764,CAYRES DE COUGOURDE,,44.136944,7.346111,2921 +alps_3765,CIME DES GAISSES,,44.133056,7.349167,2885 +alps_3766,CIME DU LOMBARD,,44.127500,7.351944,2842 +alps_3767,BAUS DE LA SERENTEE,,44.135833,7.201944,2247 +alps_3768,CRETE DES GAROUS,,44.131389,7.213611,2436 +alps_3769,CAYRES ARCHAS,,44.126667,7.225000,2632 +alps_3770,CIME DU BELLETZ,,44.117778,7.220278,2610 +alps_3771,MONT PEPOIRI,,44.110833,7.202778,2674 +alps_3772,MONT PETOUMIER,,44.102222,7.207500,2604 +alps_3773,MONT ARCHAS,,44.116667,7.240833,2526 +alps_3774,CIME DE LA VALLETTE,,44.121667,7.234722,2449 +alps_3775,CAYRE NICOLAU,,44.118611,7.259722,2253 +alps_3776,CIME DE JUISSE,,44.108611,7.336111,2580 +alps_3777,CIME DE LA'AGNELLIERE,,44.107778,7.343056,2699 +alps_3778,TETE DES TRECOUPES,,44.123889,7.351111,2760 +alps_3779,MONTE AIERA,,44.188611,7.412500,2713 +alps_3780,PUNTA SAVINA,,44.166389,7.423889,2821 +alps_3781,PUNTA FRASSINETTO,,44.175000,7.425000,2749 +alps_3782,PUNTA DEL BAUS,,44.178333,7.425000,2779 +alps_3783,PUNTA DELLA RUA,,44.182222,7.420833,2779 +alps_3784,ROCCE GERBIN,,44.168889,7.445833,2315 +alps_3785,CIMA DEL LAGO DI MONTE CARBONE,,44.157500,7.435556,2807 +alps_3786,MONTE CARBONE,,44.160278,7.430556,2873 +alps_3787,CIMA DELLA VALLETTA PICCOLA,,44.150278,7.440278,2787 +alps_3788,CIMA DELLA VALLETTA,,44.144444,7.446389,2808 +alps_3789,CIMA PLISSE,,44.163056,7.467500,2318 +alps_3790,MONTE D'ISCHIETTO,,44.150556,7.463611,2379 +alps_3791,MONTE GARBELLA,,44.184167,7.476667,2306 +alps_3792,MONTE COLOMBO,,44.174167,7.486389,2261 +alps_3793,BEC BARAL,,44.181944,7.531389,2130 +alps_3794,BEC MATLAS,,44.179167,7.528889,2148 +alps_3795,MONTE CIOTTO MIEN,,44.166111,7.512500,2372 +alps_3796,MONTE DEL FRISSON,,44.154444,7.500278,2637 +alps_3797,ROCHE DE L'ABISSE,,44.143611,7.505000,2755 +alps_3798,CIMA BALMASCA,,44.151944,7.489444,2318 +alps_3799,POINTE DE PEYRFIQUE,,44.137222,7.491389,2663 +alps_3800,CIME DU SABION,,44.133889,7.483889,2610 +alps_3801,MONTE DEL CHIAMOSSERO,,44.158333,7.509167,2482 +alps_3802,CIMA DI PONTECREUS,,44.142500,7.393889,2393 +alps_3803,PUNTA DELLA SIULA,,44.137222,7.390278,2672 +alps_3804,MONT GELAS,,44.123056,7.384722,3143 +alps_3805,CIME CHAFRION,,44.125278,7.389444,3070 +alps_3806,CIME DE LA MALEDIE,,44.122222,7.399444,3059 +alps_3807,CIME CABRET,,44.113056,7.388611,2938 +alps_3808,MONT CLAPIER,,44.115000,7.420278,3045 +alps_3809,MONT ROND,,44.113611,7.401111,2810 +alps_3810,CIME MONTOLIVO,,44.101667,7.431667,2794 +alps_3811,CIME CHAMINEYE,,44.104444,7.430833,2915 +alps_3812,CIME DE LA CHARNASSERE,,44.115556,7.446111,2745 +alps_3813,CIMES DE L'AGNEL,,44.129167,7.438889,2852 +alps_3814,CIMES DE VERNASQUE,,44.129444,7.448889,2849 +alps_3815,CIME SCANDALLIERE,,44.126389,7.459444,2705 +alps_3816,CIME DE LA GARDE,,44.122778,7.478889,2277 +alps_3817,MONTE PARACOUERTE,,44.107500,7.481944,2385 +alps_3818,MONT COLOMB,,44.107778,7.389167,2816 +alps_3819,CIME LUSIERE,,44.109444,7.430278,2910 +alps_3820,CIME PEYREBROC,,44.119167,7.412778,2940 +alps_3821,CIME COSSATO,,44.119167,7.426944,2876 +alps_3822,CIME DE BARSENZANE,,44.127222,7.498889,2410 +alps_3823,MONT CHAJOL,,44.103056,7.528889,2293 +alps_3824,CIME DE GRATIN,,44.119167,7.513611,2139 +alps_3825,BEC DE MARSEILLE,,44.256389,6.850000,2744 +alps_3826,MONT PIERRE CHATEL,,44.251944,6.843611,2772 +alps_3827,POINTE DES TROIS HOMMES,,44.239722,6.843889,2774 +alps_3828,MONT GARNET,,44.274167,6.964722,2779 +alps_3829,CIME D'ISCHIATOR,,44.271944,6.997222,2929 +alps_3830,CORBORANT,,44.266667,6.996944,3007 +alps_3831,CIME DE MALATERRE,,44.252500,6.997222,2871 +alps_3832,BECS DU CORBORANT,,44.247222,7.001667,2840 +alps_3833,TETE CIMON,,44.235556,7.014167,2701 +alps_3834,POINTE DE JASSINE,,44.258056,6.975833,2645 +alps_3835,MONT TRIBOULET,,44.206111,6.865833,2578 +alps_3836,MONT RIOUNET,,44.213333,6.880833,2537 +alps_3837,LAS DONNAS,,44.204444,6.909722,2475 +alps_3838,CIME DU CHAVALET,,44.213333,6.899167,2452 +alps_3839,CIME DE LA BERCHA,,44.236111,6.903333,2274 +alps_3840,MONTE SALETTA,,44.273611,7.032222,2700 +alps_3841,MONTE LAROUSSA,,44.267500,7.019444,2905 +alps_3842,CHIOT DEL PICIAL,,44.266389,7.081111,2250 +alps_3843,MONTE FOVRIA,,44.270000,7.105556,2566 +alps_3844,MONTE LE STELIERE,,44.265833,7.107222,2612 +alps_3845,LAUSA BRUNA,,44.277778,7.118611,2417 +alps_3846,CIMA RESDOUR,,44.261389,7.146944,2474 +alps_3847,PUNTA CIARNIER,,44.258333,7.151111,2573 +alps_3848,TESTA CAIRILIERA,,44.245000,7.150556,2638 +alps_3849,TESTA GIAS DEI LAGHI,,44.235278,7.141389,2739 +alps_3850,PUNTA MALADECIA,,44.244722,7.131389,2745 +alps_3851,TESTA BADAU,,44.227222,7.174167,2278 +alps_3852,MONTE DELLA VALLETTA,,44.219444,7.157500,2750 +alps_3853,CIMA D'ORGIALS,,44.212500,7.155556,2647 +alps_3854,CIME DE LA LOMBARDE,,44.208889,7.163611,2800 +alps_3855,MONTE AVER,,44.225000,7.148333,2745 +alps_3856,CIME DE MORAVACHERE,,44.216944,7.118056,2383 +alps_3857,CIMES DU LAUSFER,,44.224722,7.091111,2547 +alps_3858,TETE HAUTE DU LAUSFER,,44.229444,7.086944,2583 +alps_3859,TETE ROUGNOUSE DE LA GUERCHA,,44.227222,7.061944,2694 +alps_3860,ROCHE DU SABOULE,,44.233333,7.071667,2594 +alps_3861,TETE DE L'AUTARET,,44.225833,7.042778,2761 +alps_3862,CIME DELLE LONGUE,,44.232778,7.019722,2759 +alps_3863,ROCCA DI SAN BERNOLFO,,44.241111,7.033611,2681 +alps_3864,CIME DE SESPOUL,,44.217222,7.088611,2485 +alps_3865,CIME DE LAS CROUSILLAS,,44.195278,7.108333,2458 +alps_3866,TETE DE L'ADRECH D'EN BARRIS,,44.200556,7.148333,2474 +alps_3867,CIME DE VERMEIL,,44.205556,7.167222,2778 +alps_3868,MONT MALINVERN,,44.198889,7.189444,2938 +alps_3869,TETE DE LA COMBE GROSSE,,44.197500,7.178333,2795 +alps_3870,MONTE ALIVE,,44.274444,7.206944,2420 +alps_3871,CIMA GORGIA CAGNA,,44.258889,7.238611,2718 +alps_3872,ROCCA DEL CIAMP,,44.253056,7.199722,2562 +alps_3873,ROCCA PAN PERDU,,44.234444,7.213333,2956 +alps_3874,ROCCA LA PAUR,,44.231667,7.220278,2972 +alps_3875,ROCCA DI VALMIANA,,44.223611,7.233611,3006 +alps_3876,MONTE MATTO,,44.225000,7.256389,3097 +alps_3877,MONTE MATTO CIMA EST,,44.226667,7.256667,3088 +alps_3878,ROCCA ARCOULON,,44.236944,7.280000,2620 +alps_3879,CIMA DEL LATOUS,,44.231389,7.268889,2744 +alps_3880,ROCCA DEL CIAPOUS,,44.254722,7.225000,2667 +alps_3881,ROCCA PERTUSA,,44.240833,7.208056,2714 +alps_3882,TESTA DELLE NOVELLE,,44.244444,7.201667,2742 +alps_3883,MONTE VENTABREN,,44.261944,7.256667,2611 +alps_3884,MONTE BOUREL,,44.265000,7.278611,2468 +alps_3885,MONTE RAY,,44.229722,7.360833,2318 +alps_3886,CIMA DEL LAUSETTO,,44.221111,7.348333,2687 +alps_3887,PUNTA MORIONERA,,44.240833,7.299444,2059 +alps_3888,PUNTA GRAVEIRETTA,,44.215278,7.241389,2675 +alps_3889,COSTA MIANA,,44.219722,7.230278,2865 +alps_3890,CIMA CENTRALE DI VALROSSA,,44.219444,7.215833,2880 +alps_3891,CIMA VALROSSA NORD,,44.223333,7.213611,2909 +alps_3892,CIMA VALROSSA SUD,,44.207500,7.208333,2797 +alps_3893,PUNTA STELLA,,44.193333,7.290833,2567 +alps_3894,ASTA SOTTANA,,44.209167,7.314722,2850 +alps_3895,ASTA SOPRANA,,44.205278,7.311667,2948 +alps_3896,ASTA SOPRANA,,44.203333,7.313333,2950 +alps_3897,CIMA MONDINI,,44.198889,7.317500,2915 +alps_3898,CIMA SACILLOTTO,,44.198889,7.330000,2906 +alps_3899,ORIOL,,44.198333,7.326944,2943 +alps_3900,CIMA DEL DRAGONET,,44.206667,7.304167,2781 +alps_3901,CIMA DELLA VAGLIOTTA,,44.212222,7.343611,2548 +alps_3902,PUNTA DEL LIMBO,,44.208889,7.344444,2485 +alps_3903,ROCCA GARNER,,44.191111,7.371944,1998 +alps_3904,ROCCE DELLA SCREGNA,,44.258056,7.429444,1849 +alps_3905,ROCCA VANCIARAMPI,,44.266667,7.423611,1712 +alps_3906,PUNTA BALMAROSSA,,44.250556,7.422222,1667 +alps_3907,SERRA SARIUNDO,,44.258333,7.485833,1453 +alps_3908,ROCCA ALTA,,44.271111,7.550000,1487 +alps_3909,ROCCIA DEL PINO,,44.222500,7.546111,1603 +alps_3910,MONTE VECCHIO,,44.206111,7.548611,1920 +alps_3911,MONTE BALUR,,44.242500,7.463333,1830 +alps_3912,PUNTA DEL VAN,,44.246667,7.440556,1974 +alps_3913,MONTE SERVATUN,,44.225000,7.460556,2277 +alps_3914,PUNTA DEL AIERA,,44.219444,7.463611,2302 +alps_3915,MONTE BUSSAIA,,44.218056,7.468333,2451 +alps_3916,MONTE PIANARD,,44.207778,7.465556,2306 +alps_3917,CIME DEL ROC,,44.193333,7.410000,2469 +alps_3918,MONTE COSTASSA,,44.197778,7.415833,2225 +alps_3919,ROCCA D'OREL,,44.211389,7.469444,2450 +alps_3920,ROCHER ROUX,,44.343056,6.048611,1202 +alps_3921,LA BLACHERE,,44.333056,6.052500,1282 +alps_3922,JALINIER,,44.358056,6.068056,1465 +alps_3923,SOMMET DE BRANEFAN,,44.357778,6.098889,1658 +alps_3924,PIC DE VALENTIN,,44.365833,6.113889,1581 +alps_3925,PARUSTRE,,44.350556,6.108056,1601 +alps_3926,ROCHER CHABRIER,,44.336389,6.107222,1498 +alps_3927,TETE DES MONGES,,44.311111,6.000278,1055 +alps_3928,PAIN DU MIEL,,44.303056,5.954444,818 +alps_3929,MONTAGNE DE REYNIER,,44.310833,6.093056,1291 +alps_3930,MONTAGNE D'AUJOUR,,44.438333,5.849167,1834 +alps_3931,MONTAGNE DE ROCHEFORT,,44.451111,5.879444,1661 +alps_3932,PIE GROS,,44.459722,5.926944,1369 +alps_3933,LES BLACHES,,44.452222,5.932500,1153 +alps_3934,MONTAGNE DE PEYSSIER,,44.428611,5.894722,1565 +alps_3935,ROCHE COURBE,,44.419167,5.877778,1312 +alps_3936,SOMMET DU BEYNON,,44.427500,5.846389,1473 +alps_3937,CHAMPBEAU,,44.434167,5.831667,1530 +alps_3938,CHALMEL,,44.411111,5.920000,1366 +alps_3939,MONTAGNE DE SAINT GENIS,,44.373611,5.831389,1270 +alps_3940,REVUAIRE,,44.397778,5.778056,1302 +alps_3941,ROC DE L'ESCULIER,,44.391944,5.838611,1432 +alps_3942,CRETE DES SELLES,,44.406944,5.905000,1316 +alps_3943,SERRE SOLEILLE,,44.441389,5.991944,1192 +alps_3944,SOMMET DES PLUIS,,44.428611,6.106667,1493 +alps_3945,SOMMET DE SERRE BROUCHON,,44.428333,6.094722,1476 +alps_3946,SERRE DE MALAMORT,,44.418056,6.077222,1416 +alps_3947,PEYNIER,,44.404444,6.054444,1367 +alps_3948,LES CROIX,,44.372500,6.003056,1425 +alps_3949,LE COLOMBIER,,44.375833,6.021111,1478 +alps_3950,MALAUP,,44.383889,6.038056,1561 +alps_3951,LES CHANDERETTES,,44.376111,6.038333,1551 +alps_3952,PIEFOURCHE,,44.389722,6.068611,1437 +alps_3953,LE SAPET,,44.381667,6.115000,1665 +alps_3954,LA MANCHE,,44.521944,5.923333,1840 +alps_3955,LE MIAS,,44.527222,5.901944,1612 +alps_3956,TETE DE COMBE NOIRE,,44.533611,5.921667,1794 +alps_3957,MONTAGNE D'OULE,,44.512500,5.833333,1608 +alps_3958,COTE BELLE,,44.493889,5.871389,1591 +alps_3959,TETE DES QUARANTE,,44.481944,5.866111,1567 +alps_3960,LES PLAINES,,44.471389,5.877500,1445 +alps_3961,ROC DE LA LAUZE,,44.461111,5.875000,1567 +alps_3962,LA PLANE,,44.460833,5.845278,1577 +alps_3963,ROCHER DE SAINT PIERRE,,44.477222,5.908333,1454 +alps_3964,CORNICHE DE CEUSE,,44.508889,5.962222,2016 +alps_3965,LA PETITE CEUSE,,44.472222,5.943056,1681 +alps_3966,TETE DU RIF DE LAUZE,,44.630556,5.807778,1861 +alps_3967,TETE DU RID DE L'ARE,,44.626111,5.815278,1869 +alps_3968,TETE DE LA GRANGETTE,,44.626111,5.787500,1834 +alps_3969,TETE DES USCLAS,,44.624444,5.780000,1849 +alps_3970,MONTAGNE DURBONAS,,44.611944,5.759722,2086 +alps_3971,PIC TESSON,,44.617778,5.813333,1790 +alps_3972,HAUTE LUCE,,44.621667,5.845556,1586 +alps_3973,LA REMONDIERE,,44.629722,5.834167,1723 +alps_3974,LA FESTOURE,,44.631389,5.843889,1535 +alps_3975,TETE DE LA CLUSE,,44.631111,5.890833,2682 +alps_3976,TETE DES PRAS ARNAUD,,44.622500,5.897778,2617 +alps_3977,PLATEAU DE BURE,,44.633056,5.910278,2563 +alps_3978,PIC DE BURE,,44.626944,5.935556,2709 +alps_3979,DENT D'AUROUSE,,44.621389,5.932500,2679 +alps_3980,PIC CHAUVE,,44.586389,5.912778,1771 +alps_3981,TETE DE VENE,,44.577778,5.904444,1714 +alps_3982,TRESAUBENG,,44.595278,5.885278,1622 +alps_3983,LA CUCULIERE,,44.597500,5.918889,1723 +alps_3984,SOMMET DES CASSES,,44.614722,5.934167,2495 +alps_3985,TETE DE JARRET,,44.601389,5.805556,1815 +alps_3986,CHARAJAILLE,,44.587500,5.810833,1813 +alps_3987,L'AUP,,44.586667,5.766667,1622 +alps_3988,LA PLATE,,44.553333,5.794722,1411 +alps_3989,LA GRESIERE,,44.561944,5.806111,1509 +alps_3990,SERRE ORIOL,,44.568611,5.841667,1428 +alps_3991,TETE DE COMBE RAU,,44.578611,5.838333,1520 +alps_3992,MONTAGENE DES BARGES,,44.636667,5.960556,2340 +alps_3993,SOMMET DE LA PLANE,,44.634444,5.951667,2316 +alps_3994,PIC MELETTE,,44.626944,6.014722,2062 +alps_3995,PIC DE GLEIZE,,44.634167,6.044167,2160 +alps_3996,LA CUQUERE,,44.610278,6.049722,1921 +alps_3997,MONTAGNE DE CHARANCE,,44.580833,6.029167,1903 +alps_3998,COTE PLAINE,,44.589444,6.042778,1738 +alps_3999,TETE DE CLAPPE,,44.602500,5.956389,2021 +alps_4000,LE PUY,,44.613889,6.014167,1834 +alps_4001,LES TEYSSONNIERES,,44.586111,5.944722,1726 +alps_4002,GRANDE GAUTIERE,,44.368611,6.135000,1825 +alps_4003,POINTE D'EYROLLE,,44.358056,6.138056,1754 +alps_4004,LE RASCLE,,44.363889,6.187222,1547 +alps_4005,LA MONTAGNETTE,,44.368333,6.211111,1488 +alps_4006,TETE DE CHARBONNIER,,44.362778,6.235000,1681 +alps_4007,LE BRESSA,,44.331667,6.292778,1992 +alps_4008,TETE GROSSE,,44.331389,6.273889,2032 +alps_4009,LES TOMPLES,,44.322778,6.270278,1955 +alps_4010,CUGURET,,44.311944,6.292222,1845 +alps_4011,SOMMET DE LA CHANAU,,44.325833,6.252778,1885 +alps_4012,L'ORATOIRE,,44.307222,6.214167,2071 +alps_4013,SOMMET DE CLOS GINOUX,,44.296389,6.212778,2112 +alps_4014,SOMMET DE LA LAUPIE,,44.288333,6.223889,2025 +alps_4015,CRETE DE LA COLLE,,44.313056,6.190556,1864 +alps_4016,LE PUY,,44.289444,6.125278,1367 +alps_4017,LES CLOTS,,44.304167,6.264444,1930 +alps_4018,LE MARZENC,,44.298889,6.270833,1930 +alps_4019,PIC DE BERNARDEZ,,44.367500,6.411944,2430 +alps_4020,NEILLERE,,44.361111,6.428611,2460 +alps_4021,CRETE DES GLIERETTES,,44.348889,6.437778,2401 +alps_4022,L'AIGUILLETTE,,44.335556,6.452778,2610 +alps_4023,LA MOUTIERE,,44.330556,6.456944,2596 +alps_4024,ROCHE CLOSE,,44.315833,6.461667,2739 +alps_4025,PIC DES TETES,,44.301667,6.467500,2661 +alps_4026,TOURTOUREL,,44.313611,6.430000,2035 +alps_4027,LE GRAND PUY,,44.314167,6.381667,1761 +alps_4028,SERRE BERARD,,44.304444,6.380556,1634 +alps_4029,LE MOURE BOUCHARD,,44.319444,6.304722,1788 +alps_4030,CLOT DE BOUC,,44.307500,6.305278,1962 +alps_4031,CHARCHE,,44.291111,6.340000,1713 +alps_4032,LE FAYENC,,44.295278,6.332778,1692 +alps_4033,CUGURET,,44.286111,6.375833,1662 +alps_4034,PELOUSSIER,,44.301389,6.432222,2010 +alps_4035,ROCHE BENITE,,44.363333,6.508611,2415 +alps_4036,PETITE SEOLANE,,44.357500,6.530000,2854 +alps_4037,L'AILETTE,,44.368611,6.525556,2560 +alps_4038,GRANDE SEOLANE,,44.337778,6.546389,2909 +alps_4039,TETE DE LA SESTRIERE,,44.323611,6.545833,2572 +alps_4040,CRETE DES COURTIENS,,44.299444,6.536667,2714 +alps_4041,LES TROIS EVECHES,,44.289722,6.534444,2819 +alps_4042,TETE DE L'ESTROP,,44.286389,6.505278,2961 +alps_4043,TETE DES CHABRIERES,,44.283889,6.497778,2927 +alps_4044,OUY DE LA SECHE,,44.289444,6.485000,2820 +alps_4045,CRETE DE COSTEBELLE,,44.348611,6.565833,2502 +alps_4046,LE PEGUIEOU,,44.348889,6.578056,2479 +alps_4047,LA RIQUISTA,,44.345556,6.539722,2569 +alps_4048,LE PAIN DE SUCRE,,44.335000,6.646389,2560 +alps_4049,TETE DE VESCAL,,44.314722,6.570556,2516 +alps_4050,PIC DE L'AUPILLON,,44.333056,6.497500,2507 +alps_4051,TETE DE BALAOUR,,44.325556,6.495833,2530 +alps_4052,TETE DE CHABRIERE,,44.313889,6.492222,2745 +alps_4053,LE SIGNAL,,44.292778,6.591944,2367 +alps_4054,LE PETIT CHEVAL DE BOIS,,44.298333,6.623889,2754 +alps_4055,LE GRAND CHEVAL DE BOIS,,44.292500,6.633889,2839 +alps_4056,CROIX DE L'ALPE,,44.365556,6.740278,2591 +alps_4057,TETE DURE D'ENCHASTRAYES,,44.353611,6.739722,2653 +alps_4058,LA ROUCHINIERE,,44.335556,6.727778,2718 +alps_4059,MONTAGNE DE L'ALPE,,44.341944,6.737778,2775 +alps_4060,LE CHEVALIER,,44.330556,6.759167,2886 +alps_4061,TETE DURE,,44.348333,6.766389,2694 +alps_4062,LA PELOUNIERE,,44.357500,6.769167,2562 +alps_4063,TETE DE L'EMPELOUTIER,,44.366389,6.808611,2820 +alps_4064,LE JAS DU CHAMOIS,,44.358611,6.806111,2811 +alps_4065,LE MOURRE HAUT,,44.345556,6.807778,2872 +alps_4066,LE RESTEFOND,,44.339167,6.806667,2794 +alps_4067,CIME DES TROIS SERRIERES,,44.333056,6.813056,2753 +alps_4068,CIME DE LA BONETTE,,44.321944,6.807222,2860 +alps_4069,POINTE DE CHAUFREDE,,44.315833,6.821667,2731 +alps_4070,CRETE DE ROUGNE,,44.305000,6.828889,2676 +alps_4071,TETE RONDE,,44.310833,6.795556,2590 +alps_4072,SOMMET DE CAIRE BRUN,,44.327500,6.780833,2823 +alps_4073,TETE DE GLAUDON,,44.309722,6.767222,2630 +alps_4074,CIME DE LA PLATE,,44.290278,6.783611,2770 +alps_4075,COL DE CIME PLATE,,44.290000,6.786944,2790 +alps_4076,TETE DE CRISTEL,,44.298889,6.796667,2726 +alps_4077,VENTEBRUN,,44.326944,6.743333,2872 +alps_4078,BREC PREMIER,,44.334444,6.690278,2560 +alps_4079,BREC SECOND,,44.336944,6.682222,2596 +alps_4080,LE CHAPEAU DE GENDARME,,44.338333,6.665833,2685 +alps_4081,LE CIMET,,44.290833,6.704722,3020 +alps_4082,CRETE DE LA PIERRE ECLATEE,,44.294167,6.729444,2723 +alps_4083,TETE DE PEYNIER,,44.287222,6.758611,2607 +alps_4084,TETE DU GRAND CLOT,,44.282222,6.760556,2658 +alps_4085,CRETE DE MALADRECH,,44.442778,6.143333,1437 +alps_4086,SOMMET DE MONTSERIEUX,,44.430278,6.120556,1596 +alps_4087,TETE DU PAPE,,44.427222,6.162778,1251 +alps_4088,MOUISSET,,44.436944,6.191944,1278 +alps_4089,LE PIN DE CANDRE,,44.444167,6.227500,1351 +alps_4090,MONTAGNE DE LA SCIE,,44.438889,6.233333,1374 +alps_4091,MONTAGNE DE SEYMUIT,,44.422222,6.233611,1578 +alps_4092,CLOT LA CIME,,44.444444,6.278611,1594 +alps_4093,CRETE DE CLABOUREOU,,44.430833,6.274444,1402 +alps_4094,SOMMET DES PLAUTS,,44.406111,6.135000,1592 +alps_4095,TETE DE LA PLANE,,44.410833,6.144167,1541 +alps_4096,ROCHE CLINE,,44.391389,6.123611,1718 +alps_4097,CRETE DE PICOUSE,,44.377222,6.136389,1667 +alps_4098,SOMMET DE TETE GROSSE,,44.381389,6.220000,1598 +alps_4099,CHABAUD,,44.397500,6.251667,1448 +alps_4100,LE CHATEAU,,44.374444,6.296389,1403 +alps_4101,LA PIERRE DE L'AIGLE,,44.446667,6.311944,1197 +alps_4102,TETE DE LA GIPIERE,,44.451667,6.468611,2443 +alps_4103,DORMILLOUSE,,44.409722,6.386944,2505 +alps_4104,SOMMET DU COL BAS,,44.395278,6.391111,2310 +alps_4105,TETE DU VALLON DU LOUP,,44.388611,6.397222,2239 +alps_4106,PIC DE SAVERNES,,44.380000,6.404444,2343 +alps_4107,CRETE DES GRISONNIERES,,44.381389,6.433333,2338 +alps_4108,LE PEYRON,,44.385833,6.439167,2289 +alps_4109,CRETE DU LAVEYRET,,44.387778,6.413333,2211 +alps_4110,JOUG DE L'AIGLE,,44.454444,6.481944,2494 +alps_4111,CIME DU COL HAUT,,44.451389,6.495556,2506 +alps_4112,LA MONTAGNETTE,,44.451111,6.505833,2811 +alps_4113,LE POUZENC,,44.459167,6.516944,2898 +alps_4114,PIC SILHOURAIS,,44.450556,6.530833,2819 +alps_4115,COSTA BOUENDA,,44.451111,6.541389,2752 +alps_4116,LA CLOCHUILLE,,44.435556,6.488056,2257 +alps_4117,LE PESSIEOU,,44.426111,6.490833,2406 +alps_4118,TETE DE LOUIS XVI,,44.417778,6.488333,2408 +alps_4119,L'AUTA,,44.449722,6.514722,2770 +alps_4120,L'AUPILLON,,44.448889,6.578611,2917 +alps_4121,TETE DE L'AUPET,,44.446389,6.587222,2870 +alps_4122,ROCHER DES CAILLES,,44.437500,6.585833,2817 +alps_4123,LES PLASTRES,,44.430278,6.578611,2686 +alps_4124,PETITE EPERVIERE,,44.447778,6.624722,2770 +alps_4125,GRANDE EPERVIERE,,44.447222,6.632778,2884 +alps_4126,SEOLANE DES BESSES,,44.377778,6.526667,2408 +alps_4127,LE GRAND BERARD,,44.449722,6.660278,3048 +alps_4128,LA CHALANCHE,,44.438333,6.659167,2984 +alps_4129,TETE DE FRUSTA,,44.436944,6.673889,2926 +alps_4130,TETE DE CROUES,,44.443611,6.683056,2928 +alps_4131,LES PLASTRES,,44.450278,6.682500,2871 +alps_4132,LES MASTRETTES,,44.457778,6.688333,2778 +alps_4133,COSTEBELLE,,44.438056,6.699722,2557 +alps_4134,POINTE FINE,,44.437778,6.707222,2581 +alps_4135,LE PETIT CLAUSIS,,44.448611,6.704722,2475 +alps_4136,TETE DE CUGURET,,44.442500,6.779167,2912 +alps_4137,TETE DE SIGURET,,44.441667,6.788889,3032 +alps_4138,TETE DU COIN DE L'OURS,,44.434722,6.805833,2863 +alps_4139,TETE DE PLATE LONGE,,44.430000,6.813889,2790 +alps_4140,BEC DE L'AIGLE,,44.423056,6.824167,2815 +alps_4141,LE GERMAS,,44.420000,6.831667,2741 +alps_4142,POINTE DE VERMEILLE,,44.413611,6.835278,2732 +alps_4143,LE GERBIER,,44.375556,6.806111,2772 +alps_4144,LA TOUR DES SAGNES,,44.373889,6.836111,2364 +alps_4145,SERRE BOUREOU,,44.388333,6.807222,2645 +alps_4146,PUY MAUREL,,44.522500,6.135000,1317 +alps_4147,MONT COLOMBIS,,44.495833,6.219167,1733 +alps_4148,PUY CERVIER,,44.505833,6.134444,1244 +alps_4149,MONTAGNE DE SAINT MAURICE,,44.479444,6.148333,1412 +alps_4150,SOMMET DE LA VISTE,,44.486111,6.249444,1451 +alps_4151,PIC DE MORGON,,44.491944,6.398056,2324 +alps_4152,TETE DE LA VIEILLE,,44.469444,6.416111,2379 +alps_4153,LE MEALE,,44.530833,6.568056,2426 +alps_4154,LE PIC HAUT,,44.528056,6.588056,2515 +alps_4155,LE RATEL,,44.523889,6.605278,2460 +alps_4156,MONTAGNE PELLAT,,44.514722,6.637778,2675 +alps_4157,LE GRAND PARPAILLON,,44.494167,6.652222,2990 +alps_4158,LE PETIT PARPAILLON,,44.475833,6.637778,2888 +alps_4159,ROCHER MARCELINAS,,44.473611,6.529722,2572 +alps_4160,MONTAGNE DE SIGURET,,44.471111,6.507778,2609 +alps_4161,PIC DE BOUSSOLENC,,44.486667,6.589167,2832 +alps_4162,PIC DE CREVOUX,,44.546944,6.678611,2837 +alps_4163,COL DE VARS,,44.540556,6.708333,2240 +alps_4164,LA SOUVAGEA,,44.539444,6.825278,3018 +alps_4165,TETE DE L'EYSSILLOUN,,44.505556,6.810000,2896 +alps_4166,TETE DES ADRECHOUNS,,44.504444,6.816667,2950 +alps_4167,TETE DE LA COURBE,,44.498056,6.823889,3089 +alps_4168,TETE DES BREGUETS,,44.494167,6.828889,3079 +alps_4169,PLATEAU DE BOUCHIERS,,44.497778,6.780833,2566 +alps_4170,TETE DE L'HOMME,,44.490556,6.775278,2504 +alps_4171,TETE DE CASSOUN,,44.505556,6.720278,2565 +alps_4172,TETE DE VALLON CLAOUS,,44.499722,6.698611,2945 +alps_4173,TETE DE L'INFERNET,,44.496667,6.695833,2892 +alps_4174,MONTAGNE DE PARPAILLON,,44.500556,6.669167,2937 +alps_4175,BARRE DE LA PISSE,,44.517500,6.675000,2925 +alps_4176,PUY DE MANSE,,44.615000,6.156111,1630 +alps_4177,L'AIGUILLE,,44.610000,6.248056,2366 +alps_4178,L'ARCHE,,44.607500,6.241667,2253 +alps_4179,LE PIOLIT,,44.603611,6.267778,2463 +alps_4180,LES PARIAS,,44.602222,6.288889,2514 +alps_4181,POINTE DE FLEURENDON,,44.613056,6.290000,2497 +alps_4182,CHAPEAU DE NAPOLEON,,44.597222,6.155278,1426 +alps_4183,LA COUPA,,44.626111,6.302500,2628 +alps_4184,CRETE DE MALAMORTE,,44.628333,6.310833,2664 +alps_4185,LE BARLE,,44.635000,6.324722,2732 +alps_4186,MONT GUILLAUME,,44.585833,6.438056,2541 +alps_4187,AIGUILLES DE CHABRIERES,,44.579167,6.331667,2403 +alps_4188,LA POUSTE,,44.598611,6.300278,2506 +alps_4189,PIC DU CLOCHER,,44.610000,6.595000,2473 +alps_4190,BELVEDERE DE L'HOMME DE PIERRE,,44.611111,6.613056,2374 +alps_4191,CRETE DE RAZIS,,44.599444,6.652222,2575 +alps_4192,PIC SAINT ANDRE,,44.568611,6.609444,2863 +alps_4193,PIC DE CHABRIERES,,44.570556,6.623611,2938 +alps_4194,CRETE DE CHABRIERES,,44.571667,6.643056,2746 +alps_4195,MONT OREL,,44.575278,6.578056,2565 +alps_4196,PIC DE CREVOUX,,44.555000,6.654722,2649 +alps_4197,CRETE DE VARS,,44.610833,6.713333,2600 +alps_4198,DENT DE ROCHER,,44.633333,6.735278,2817 +alps_4199,POINTE DE LA SAUME,,44.639444,6.763333,3043 +alps_4200,LE MAIN DE DIEU,,44.630278,6.752222,2934 +alps_4201,CRETE DES VEYRES,,44.623889,6.777500,3057 +alps_4202,PIC DES HEUVIERES,,44.613056,6.793611,3271 +alps_4203,PICS DE LA FONT SANCTE,,44.605000,6.800278,3385 +alps_4204,TETE DE LA PETITE PART,,44.603056,6.811944,3144 +alps_4205,TETE DE COSTE BELLE,,44.628056,6.810278,2552 +alps_4206,PIC DE PANESTREL,,44.592500,6.792778,3254 +alps_4207,TETE DU SANGLIER,,44.579167,6.808056,2653 +alps_4208,POINTE D'ESCREINS,,44.595000,6.782500,3038 +alps_4209,PIC DES HOUETS,,44.587778,6.767222,3235 +alps_4210,LA MORTICE,,44.574167,6.769722,3169 +alps_4211,CRETE DU VALLON LAUGIER,,44.593611,6.756389,3090 +alps_4212,POINTE DE PASTOURLET,,44.591389,6.733056,2657 +alps_4213,CRETE DES COUNIETS,,44.566389,6.749444,2821 +alps_4214,TETE DE PANEYRON,,44.553611,6.729167,2785 +alps_4215,LE GRAND CAIRE,,44.565556,6.775000,2923 +alps_4216,LA GRANDE ROCHE,,44.570000,6.785278,3027 +alps_4217,LE SOMMET ROUGE,,44.574167,6.796111,2845 +alps_4218,TETE DE PELOUSE,,44.359167,6.862778,2922 +alps_4219,TETE CARREE,,44.354722,6.871111,2865 +alps_4220,CIME DE PELOUSETTE,,44.343333,6.856111,2757 +alps_4221,BONNET CARRE,,44.346389,6.861111,2750 +alps_4222,LE CASTEL DE LA TOUR,,44.349444,6.866111,2778 +alps_4223,TETE DE L'ENCHASTRAYE,,44.367500,6.888333,2954 +alps_4224,ROCHERS DES TROIS EVEQUES,,44.362222,6.887778,2830 +alps_4225,MONTE AIGA,,44.345833,6.921111,2832 +alps_4226,MONT BAL,,44.337778,6.926111,2830 +alps_4227,MONTE BASSURA,,44.340556,6.980278,2663 +alps_4228,MONTE ARPETTO,,44.325000,7.002500,2550 +alps_4229,COSTABELLA DEL PIZ,,44.319167,6.998333,2599 +alps_4230,MONTE PEIRON,,44.326111,6.956944,2796 +alps_4231,MONT VALLONNET,,44.311667,6.960556,2942 +alps_4232,CIME DE VENS,,44.305833,6.958611,2913 +alps_4233,CIME DES BLANCHES,,44.319722,6.953056,2762 +alps_4234,CIMA DEL ROUSS,,44.321111,7.000000,2604 +alps_4235,CIME DE LA BLANCHE,,44.302500,6.853889,2534 +alps_4236,TETE DE VINAIGRE,,44.307222,6.881111,2394 +alps_4237,CLAI INFERIEUR,,44.299167,6.925556,2590 +alps_4238,CLAI SUPERIEUR,,44.300000,6.950278,2982 +alps_4239,TETE DE L'UBAC,,44.293611,6.971944,2991 +alps_4240,MONT TENIBRE,,44.283889,6.972222,3031 +alps_4241,BECO ALTO DEL PIZ,,44.298889,6.980833,2912 +alps_4242,GRAND CIMON DE RABUONS,,44.280556,6.996111,2995 +alps_4243,MONTAGNETTE DE RABUONS,,44.283889,6.990000,2949 +alps_4244,TESTA DELLA COSTABELLA DEL PIZ,,44.292778,7.013056,2760 +alps_4245,ROCHE NEGRE,,44.290000,6.953056,2764 +alps_4246,CIMA DEL GIAS,,44.365833,7.041111,2556 +alps_4247,MONTE BERSAIO,,44.353333,7.078333,2386 +alps_4248,CIMA PICONIERA,,44.368611,7.083889,2565 +alps_4249,MONTE NEBIUS,,44.346111,7.114722,2600 +alps_4250,MONTE SALE,,44.358056,7.119722,2630 +alps_4251,MONTE OMO,,44.370000,7.122500,2615 +alps_4252,ROCCA TIPUREO,,44.349444,7.142222,2427 +alps_4253,MONTE DI VINADEO,,44.347222,7.146111,2423 +alps_4254,MONTE SAVI,,44.353889,7.130833,2615 +alps_4255,MONTE GORFI,,44.361667,7.187778,2203 +alps_4256,MONTE CORSO DEL CAVALLO,,44.335556,7.174444,2170 +alps_4257,MONTE AUTES,,44.321111,7.123333,2286 +alps_4258,MONTE CIAVAL,,44.298333,7.021389,2641 +alps_4259,MONTE SCHIATAN,,44.301667,7.033889,2598 +alps_4260,TESTA DI CAVIAS,,44.305556,7.041389,2594 +alps_4261,MONTE VACCIA,,44.311111,7.057500,2472 +alps_4262,MONTE CIASTELLA,,44.283333,7.123611,2314 +alps_4263,TETE DURE,,44.455556,6.879722,2630 +alps_4264,BEC DU LIEVRE,,44.445000,6.897222,2770 +alps_4265,POINTE DE LA SIGNORA,,44.428056,6.918056,2773 +alps_4266,TETE DE VILLADEL,,44.452778,6.911667,2725 +alps_4267,TETE DE PLATASSE,,44.451389,6.908333,2706 +alps_4268,AIGUILLE OCCIDENTALE DE L'ORRENAYE,,44.448611,6.918333,2811 +alps_4269,AIGUILLE JEAN COSTE,,44.445833,6.923056,2832 +alps_4270,AIGUILLE ORIENTALE DE L'ORRENAYE,,44.444167,6.927500,2825 +alps_4271,TETE DE MOISE,,44.440556,6.935000,3104 +alps_4272,TETE DES FEUILLAS,,44.433889,6.940278,2864 +alps_4273,TETE DE VAUCLAVE,,44.430278,6.948333,2878 +alps_4274,MONTE FREID,,44.449167,6.958056,2750 +alps_4275,CIMA CIARBONET,,44.445000,6.964167,2605 +alps_4276,AUTO VALLONASSO,,44.451111,6.938056,2885 +alps_4277,BRIC CASSIN,,44.423333,6.996111,2625 +alps_4278,MONTE SCALETTA,,44.422778,6.950833,2840 +alps_4279,IL BRIC,,44.407778,6.958889,2664 +alps_4280,BRIC DELLA SABBIERA,,44.411667,6.931389,2607 +alps_4281,TETE DE FER,,44.407500,6.845833,2883 +alps_4282,CRETE DE PARASSAC,,44.400556,6.849444,2890 +alps_4283,TETE DE PARRASSAC,,44.385278,6.855833,2777 +alps_4284,BOSSE DU LAUZANIER,,44.372778,6.859444,2793 +alps_4285,TESTA DU PEI DE JUNI,,44.375833,6.897222,2717 +alps_4286,L'ENCLAUSE,,44.394722,6.897222,2712 +alps_4287,LE ROUET,,44.405000,6.897778,2507 +alps_4288,CIMA DELLE LOSE,,44.372222,6.925000,2813 +alps_4289,MONTE OSEROT,,44.392222,6.993056,2781 +alps_4290,ROCCA DI CAIRI,,44.451111,7.045833,2573 +alps_4291,MONTE CROS,,44.447778,7.023333,2240 +alps_4292,MONTE PIUTAS,,44.438056,7.026944,2412 +alps_4293,MONTE PIEGU,,44.438333,7.085278,2306 +alps_4294,PUNTA LA PIOVOSA,,44.428333,7.130556,2601 +alps_4295,MONTE CIALME,,44.447222,7.163056,2308 +alps_4296,MONTE TIBERT,,44.418056,7.151667,2647 +alps_4297,PUNTA TEMPESTA,,44.422222,7.139444,2679 +alps_4298,CIMA REINA,,44.403056,7.145556,2510 +alps_4299,PUNTA SIBOLET,,44.411111,7.133889,2582 +alps_4300,MONTE PELVO,,44.405556,7.126944,2555 +alps_4301,ROCCA CIARMETTA,,44.393333,7.120000,2553 +alps_4302,CIMA DI TEST,,44.386944,7.103333,2621 +alps_4303,BRIC DELL'OLIVETTO,,44.417500,7.123889,2415 +alps_4304,MONTE LA BIANCA,,44.407778,7.090556,2746 +alps_4305,MONTE GIOBERT,,44.426111,7.083889,2435 +alps_4306,ROCCA DEL'AQUILA,,44.420000,7.082778,2445 +alps_4307,MONTE BARET,,44.418333,7.062778,2307 +alps_4308,MONTE BERT,,44.414444,7.059167,2393 +alps_4309,ROCCA MEIA,,44.398333,7.068889,2831 +alps_4310,BECCO GRANDE,,44.391389,7.083889,2775 +alps_4311,MONTE CASSORSO,,44.417778,7.018056,2776 +alps_4312,BRIC BOSCASSO,,44.426944,7.020000,2589 +alps_4313,PUNTA CIALME,,44.425556,7.034444,2462 +alps_4314,MONTE GIORDANO,,44.378056,7.031389,2766 +alps_4315,MONTE BODOIRA,,44.374722,7.046389,2747 +alps_4316,COSTIGLIONI,,44.384444,7.021667,2752 +alps_4317,MONTE RUISSAS,,44.379444,7.102222,2508 +alps_4318,PUNTA PARVO,,44.383889,7.140000,2523 +alps_4319,MONTE VIRIDIO,,44.383611,7.153611,2498 +alps_4320,CIMA VIRIBIANC,,44.381667,7.165000,2477 +alps_4321,CIMA FAUNIERA,,44.386389,7.127778,2515 +alps_4322,BECCO NERO,,44.387778,7.079444,2629 +alps_4323,POINTE D'AVAL,,44.545000,6.846944,3325 +alps_4324,AIGUILLE DE CHAMBEYRON,,44.547778,6.856667,3412 +alps_4325,POINTE DES CIRQUES,,44.547500,6.866111,3234 +alps_4326,POINTE DU FOND DE CHAMBEYRON,,44.541667,6.871389,3137 +alps_4327,TETE DE LA FREMA,,44.537500,6.870278,3151 +alps_4328,BREC DE CHAMBEYRON,,44.528333,6.853889,3389 +alps_4329,AIGUILLE FOCH,,44.525556,6.856389,3275 +alps_4330,TETE DE CIBIROLES,,44.522222,6.858056,3267 +alps_4331,LE PARRIAS COUPA,,44.517500,6.856667,3240 +alps_4332,LE MASSOUR,,44.507500,6.858611,3024 +alps_4333,ROCCA BLANCA,,44.499167,6.864722,3193 +alps_4334,MONTE PERTUSA,,44.533056,6.897500,2781 +alps_4335,MONTE LAUSA,,44.544722,6.910556,2883 +alps_4336,MONTE ALBRAGE,,44.536944,6.937778,2999 +alps_4337,MONTE BELLINO,,44.546667,6.939167,2942 +alps_4338,MONTE FARAUT,,44.546111,6.965833,3046 +alps_4339,MONTE REGHETTA,,44.541111,6.975000,2965 +alps_4340,CIMA SEBOLET,,44.535833,6.984722,3023 +alps_4341,ROCCA LA MARCHISA,,44.539167,6.998611,3071 +alps_4342,MONTE FREIDE,,44.527778,6.936111,2967 +alps_4343,MONTE CERVET,,44.513889,6.947778,2985 +alps_4344,MONTE BOULLIAGNA,,44.501667,6.950556,2908 +alps_4345,MONTE EIGHIER,,44.518611,6.927222,2574 +alps_4346,ROCCA BIANCA,,44.500556,6.894444,3021 +alps_4347,LA MEYNA,,44.481667,6.858889,3067 +alps_4348,TETE DE VIRAYSSE,,44.472778,6.858889,2772 +alps_4349,TETE PEYMIAN,,44.470278,6.884444,2790 +alps_4350,TETE DE L'ALP,,44.468056,6.906944,2700 +alps_4351,POINTE DE LA RECULAYE,,44.471944,6.894444,2783 +alps_4352,TETE DE SAUTRON,,44.488056,6.877500,3155 +alps_4353,PUNTA LE TESTE,,44.468889,6.918611,2594 +alps_4354,ROCCA ROSSA,,44.487778,6.910833,2345 +alps_4355,MONTE ARPET,,44.460278,6.945833,2455 +alps_4356,MONTE CAMOSCERE,,44.549444,7.022222,2984 +alps_4357,MONTE CHERSOGNO,,44.526944,7.020000,3026 +alps_4358,CUGN DI GORIA,,44.545833,7.128333,2384 +alps_4359,MONTE NEBIN,,44.543333,7.145833,2510 +alps_4360,MONTE CUGULET,,44.537778,7.161389,2494 +alps_4361,CIMA LUBIN,,44.542222,7.169167,2410 +alps_4362,MONTE RASTCIAS,,44.542500,7.191111,2404 +alps_4363,ROCCIA AGNELLIERA,,44.530833,7.189722,2124 +alps_4364,PUNTA MELEZE,,44.472778,7.083611,1751 +alps_4365,MONTE BUCH,,44.476389,7.126944,2112 +alps_4366,COSTA CHIGGIA,,44.466667,7.126111,2156 +alps_4367,CRETE DU RISSACE,,44.636944,6.852222,2931 +alps_4368,TETE DU RISSACE,,44.630000,6.858889,2965 +alps_4369,LE PEOUVOU,,44.630278,6.883611,3232 +alps_4370,LA ROCHE NOIRE,,44.637222,6.892222,3134 +alps_4371,ROCHER DE L'EISSASSA,,44.620556,6.853889,3048 +alps_4372,TETE DE GIRANDIN,,44.608889,6.839444,2876 +alps_4373,POINTE DE CORNASCLE,,44.624444,6.936667,3141 +alps_4374,BRIC DE RUBREN,,44.619722,6.950000,3340 +alps_4375,LE PEYRON,,44.637222,6.910000,2760 +alps_4376,MONT DE SALSA,,44.619167,6.964444,3315 +alps_4377,CIME DU LOUP,,44.626111,6.969444,3135 +alps_4378,CIMA DI BARDIA,,44.629444,6.989167,2870 +alps_4379,CIMA DI PIENASEA,,44.627500,6.976111,3132 +alps_4380,MONTE GUIEP,,44.610278,6.950833,3103 +alps_4381,MONTE FERRA,,44.602500,6.985556,3094 +alps_4382,MONTE LA VIGNA,,44.595833,6.976667,2935 +alps_4383,MONTE LA PERTIA,,44.587222,6.966944,2774 +alps_4384,MONTE PIETALUNGA,,44.603056,7.015833,2731 +alps_4385,CRETE DE MONGIOIA,,44.605833,6.943611,3090 +alps_4386,TETE DE MALACOSTE,,44.600556,6.937500,3216 +alps_4387,TETE DE GANDIN,,44.593056,6.933333,3155 +alps_4388,PIC DU PELVA,,44.589167,6.919167,3220 +alps_4389,PELVET DE CHABRIERE,,44.579722,6.933056,3157 +alps_4390,TETE DE L'AUTARET,,44.573333,6.933333,3021 +alps_4391,DENTS DE MANIGLIA,,44.568889,6.913056,3166 +alps_4392,POINTE DU FOND DU ROURE,,44.565000,6.914167,3181 +alps_4393,MONT DE MANIGLIA,,44.562222,6.916111,3183 +alps_4394,TETE DU ROURE,,44.556944,6.905833,2973 +alps_4395,TETE DE CIALANCIOUN,,44.553611,6.903611,3023 +alps_4396,LA ROCHE NOIRE,,44.554722,6.879167,2820 +alps_4397,POINTE BASSE DE MARY,,44.583333,6.890000,3126 +alps_4398,POINTE HAUTE DE MARY,,44.575556,6.894722,3206 +alps_4399,L'ALPET,,44.592778,6.884444,2865 +alps_4400,AIGUILLE PIERRE ANDRE,,44.574444,6.850000,2853 +alps_4401,AIGUILLE LARGE,,44.570000,6.857222,2857 +alps_4402,AIGUILLE GRANDE,,44.555278,6.838056,3064 +alps_4403,AIGUILLE DE CHILLOL,,44.551111,6.853333,3303 +alps_4404,TOUR DE CHILLOL,,44.568056,6.839167,2720 +alps_4405,MONTE PENCE,,44.561944,6.962778,2832 +alps_4406,MONTE GABEL,,44.557222,6.964167,2873 +alps_4407,BRIC FARAUT,,44.553889,6.947500,2888 +alps_4408,MONTE MAUREL,,44.564444,6.990556,2604 +alps_4409,LE CONCE,,44.633611,7.055000,2429 +alps_4410,PUNTA MALTA,,44.636667,7.104722,2995 +alps_4411,CIMA DELLE LOBBIE,,44.628333,7.115278,3015 +alps_4412,PUNTA DELLE GUGLIE,,44.625556,7.127500,2748 +alps_4413,PUNTA RASCIASSA,,44.629444,7.154444,2664 +alps_4414,PELVO D'ELVA,,44.557500,7.023611,3064 +alps_4415,MONTE MORFRIED,,44.565833,7.081667,2480 +alps_4416,CIMA DELLE SERRE,,44.556944,7.106389,2385 +alps_4417,CIMA DI CROSA,,44.616389,7.176667,2571 +alps_4418,GRAND FERRAND,,44.721944,5.815556,2758 +alps_4419,TETE DE VACHERES,,44.674444,5.799444,2402 +alps_4420,ROC DE GARNESIER,,44.660556,5.792500,2383 +alps_4421,TETE DE GARNESIER,,44.653889,5.791111,2367 +alps_4422,ROC ROUX,,44.722500,5.961111,2566 +alps_4423,TETE DE CLAUDEL,,44.714167,5.967222,2563 +alps_4424,TETE DU COLLIER,,44.717500,5.964167,2568 +alps_4425,BEC DE L'AIGLE,,44.672500,5.986389,2367 +alps_4426,TETE DE LA MADELEINE,,44.676667,5.982778,2366 +alps_4427,PIC PONSIN,,44.683889,5.977222,2335 +alps_4428,SOMMET DES BANARDS,,44.648333,5.989167,2227 +alps_4429,LE BONNET DE CALVIN,,44.813611,5.812500,1937 +alps_4430,GRANDE TETE DE L'OBIOU,,44.775556,5.840000,2789 +alps_4431,LES AGARDS,,44.766667,5.838056,2556 +alps_4432,TETE DE LAPRAS,,44.756944,5.841944,2584 +alps_4433,LE BONNET DE L'EVEQUE,,44.772222,5.830833,2663 +alps_4434,TETE DE LA CAVALE,,44.767778,5.828889,2697 +alps_4435,TETE DE L'AUPE,,44.743889,5.830278,2627 +alps_4436,CRETE DES CROUZAS,,44.723056,6.660556,2645 +alps_4437,PIC DES CHALANCHES,,44.728611,6.683056,2670 +alps_4438,LE TESTAS,,44.723333,6.681111,2579 +alps_4439,GARNIER,,44.713333,6.684722,2432 +alps_4440,PIC DE FURFANDE,,44.715556,6.699167,2489 +alps_4441,CRETE DE CROSERAS,,44.726667,6.722222,2622 +alps_4442,CRETE DE LA COMBE ARNAUDE,,44.711389,6.823333,2801 +alps_4443,CRETE DE LA ROUSSE,,44.703889,6.826667,2827 +alps_4444,POINTE DE RASIS,,44.692778,6.822500,2844 +alps_4445,TETE DE JACQUETTE,,44.683611,6.831389,2757 +alps_4446,POINTE DE LA SELLE,,44.701667,6.815556,2745 +alps_4447,CRETE DES CHAMBRETTES,,44.688333,6.792500,2582 +alps_4448,CRETE D'ASSAN,,44.682222,6.749167,2596 +alps_4449,LA MAYT,,44.708889,6.661667,2617 +alps_4450,PRACHAVAL,,44.700556,6.661667,2463 +alps_4451,LES OURGIERES,,44.689167,6.669167,2257 +alps_4452,SOMMET DE CUGULET,,44.651111,6.706667,2520 +alps_4453,PIC D'ESCREINS,,44.643056,6.721667,2734 +alps_4454,CORNES DE CHANCEL,,44.642222,6.735000,2661 +alps_4455,LE MARCOUS,,44.650556,6.825278,2685 +alps_4456,CRETE DE L'AUP,,44.657778,6.815278,2543 +alps_4457,PIC DE GUILLESTRE,,44.685556,6.736111,2609 +alps_4458,ROC DE SERRE CHAPELLE,,44.812778,6.631944,2771 +alps_4459,AIGUILLE DES PENITENTS,,44.808333,6.634167,2743 +alps_4460,PIC DU HAUT MOURIARE,,44.795833,6.644444,2808 +alps_4461,ROCHE DE LA MOUTIERE,,44.796389,6.616111,2754 +alps_4462,TETE DU PUY,,44.788611,6.590278,2532 +alps_4463,CRETE DE MOURIARE,,44.783056,6.640000,2608 +alps_4464,TETE DU PEYRON,,44.781944,6.629444,2591 +alps_4465,CRETE DU PEYRON,,44.775556,6.621667,2642 +alps_4466,PIC DE GRAND VALLON,,44.760556,6.646389,2581 +alps_4467,LA TOME,,44.809167,6.612500,2744 +alps_4468,PIC DE MARAVOISE,,44.795556,6.665000,2704 +alps_4469,PIC DE ROCHE NOIRE,,44.799444,6.674444,2707 +alps_4470,PIC DES CHALANCHES,,44.805556,6.680000,2779 +alps_4471,PIC DE BEAUDOUIS,,44.816389,6.698611,2843 +alps_4472,CLOT DE LA CIME,,44.816667,6.721944,2729 +alps_4473,PIC OUEST,,44.812222,6.748889,2844 +alps_4474,CRETE DES OULES,,44.814167,6.764167,2914 +alps_4475,CRETE DU TRONCHET,,44.803333,6.758333,2590 +alps_4476,PIC DE L'AGRENIER,,44.795556,6.817222,2793 +alps_4477,SOMMET DU GRAND VALLON,,44.814444,6.816111,2867 +alps_4478,PIC DU CROS,,44.786944,6.703611,2685 +alps_4479,PIC DE LA ROUSSE,,44.786667,6.694167,2641 +alps_4480,PIC DE BALART,,44.782500,6.686667,2736 +alps_4481,PIC DES ESPARGES FINES,,44.772500,6.682222,2706 +alps_4482,PIC DE CLAPOUSE,,44.766389,6.692778,2753 +alps_4483,PIC DU JAILLON,,44.768056,6.701389,2720 +alps_4484,PIC DE BEAL TRAVERSIER,,44.757500,6.689444,2910 +alps_4485,CRETE DES CHALANCHES,,44.741111,6.686389,2719 +alps_4486,ROC DE CHABRILLER,,44.780556,6.658889,2561 +alps_4487,CROIX DE RATIER,,44.765000,6.667500,2613 +alps_4488,PIC DU GAZON,,44.744444,6.703056,2744 +alps_4489,DENT DE RATIER,,44.740000,6.723889,2660 +alps_4490,SOMMET BUCHER,,44.738611,6.814167,2254 +alps_4491,PIC DE CHATEAU RENARD,,44.698889,6.906944,2989 +alps_4492,CRETE DE CARAMAGNE,,44.728611,6.934167,2881 +alps_4493,LE GRAND QUEYRAS,,44.715556,6.951944,3114 +alps_4494,CRETE DES FONZES,,44.711944,6.963611,3062 +alps_4495,PIC DE FOREANT,,44.706944,6.969444,3081 +alps_4496,CRETE DE L'EYCHASSIER,,44.698333,6.980000,2968 +alps_4497,CRETE DE LA TAILLANTE,,44.710833,6.994722,3197 +alps_4498,LA SPARVEYRE,,44.729444,6.971667,3002 +alps_4499,LE PAIN DE SUCRE,,44.690833,6.996389,3208 +alps_4500,PIC D'ASTI,,44.688056,7.001944,3220 +alps_4501,POINTE DES SAGNES LONGUES,,44.687778,6.946944,3032 +alps_4502,PIC DE CARAMANTRAN,,44.677778,6.962778,3021 +alps_4503,PIC TRAVERSIER,,44.689722,6.927500,2882 +alps_4504,POINTE DES MARCELETTES,,44.676389,6.859167,2900 +alps_4505,LE ROCHER BLANC,,44.667500,6.873056,2898 +alps_4506,POINTE DES AVERS,,44.661389,6.888611,3089 +alps_4507,TETE DE LA CULA,,44.656944,6.907500,3121 +alps_4508,TETE DE LONGET,,44.660278,6.916111,3146 +alps_4509,PIC DE LA FARNEIRETA,,44.653611,6.933611,3134 +alps_4510,LA PETITE TETE NOIRE,,44.652222,6.940833,3039 +alps_4511,TETE DES TOILLIERS,,44.655000,6.948889,3175 +alps_4512,ROCCA BIANCA,,44.665000,6.959444,3059 +alps_4513,LE QUEYRELLET,,44.645278,6.844722,2776 +alps_4514,MONTAGNE DU CRISTILLAN,,44.645833,6.901111,3056 +alps_4515,SOMMET D'OLIVE,,44.730000,7.030556,2869 +alps_4516,PIC TRAVERSE,,44.720000,7.041389,2991 +alps_4517,MONTE GRANERO,,44.717222,7.067778,3166 +alps_4518,POINTE DE MARTE,,44.707778,7.066389,3152 +alps_4519,POINTE DE VENISE,,44.700556,7.071111,3096 +alps_4520,POINTE DE ROME,,44.689444,7.075833,3069 +alps_4521,POINTE GASTALDI,,44.680833,7.078056,3210 +alps_4522,VISOLOTTO,,44.676389,7.084444,3348 +alps_4523,MONTE VISO,,44.667500,7.090833,3841 +alps_4524,AIGUILLED DE LA TRAVERSETTE,,44.713889,7.066389,3023 +alps_4525,MONTE MEIDASSA,,44.717778,7.073611,3105 +alps_4526,ROCCA NERA,,44.727500,7.094722,2706 +alps_4527,PUNTA SEA BIANCA,,44.724444,7.115278,2721 +alps_4528,VISO MOZZO,,44.675278,7.110278,3019 +alps_4529,VISO DI VALLANTA,,44.665278,7.087222,3781 +alps_4530,PUNTA CAPRERA,,44.656667,7.080556,3387 +alps_4531,PUNTA SERAS,,44.671667,7.055833,2993 +alps_4532,PUNTA TRE CHIOSIS,,44.661667,7.048611,3080 +alps_4533,L'ASTI,,44.691389,7.026667,3287 +alps_4534,CRETE DE MOTTE,,44.689444,7.037778,3130 +alps_4535,POINTE JEANNE,,44.680556,7.063333,3052 +alps_4536,CRESTA SAVARESCH,,44.648611,7.049722,2819 +alps_4537,PUNTA MICHEL,,44.650000,7.103056,3154 +alps_4538,ROCCE MEANO,,44.642222,7.089722,3039 +alps_4539,PUNTA MUREL,,44.651389,7.135833,2445 +alps_4540,ROCCE SHIASERE,,44.663056,7.120278,2560 +alps_4541,ROCCE ALTE,,44.698333,7.080556,2837 +alps_4542,POINTE UDINE,,44.693889,7.073611,2980 +alps_4543,CRETE DU SERRE DEE L'AIGLE,,44.818611,6.867222,2733 +alps_4544,GILLY,,44.799167,6.959444,2467 +alps_4545,LE MAIT D'AMUNT,,44.798611,7.010000,2804 +alps_4546,TETE DU PELVAS,,44.790278,7.000000,2929 +alps_4547,LA LAUZE,,44.763611,6.916944,2910 +alps_4548,PIC CONI BORNI,,44.754722,6.923611,2884 +alps_4549,PIC DU FOND DE PEYNIN,,44.738889,6.925556,2912 +alps_4550,CRETE DE BATAILLER,,44.742222,6.879722,2805 +alps_4551,LA GARDIOLE DE L'ALP,,44.745833,6.875000,2786 +alps_4552,PIC SEGURE,,44.739444,6.968889,2990 +alps_4553,POINTE GIORNIVETTA,,44.808889,7.014722,2622 +alps_4554,TETE DE CLOS LAPIERRE,,44.783889,7.012222,2730 +alps_4555,PIC DE CHABRIERE,,44.745833,6.971667,2835 +alps_4556,PUNTA RESIASSIA,,44.817500,7.036111,2615 +alps_4557,MONTE CAVALLO,,44.761944,7.159722,2153 +alps_4558,PRAROUSSIN,,44.755278,7.022500,2675 +alps_4559,MONT ARBONCIE,,44.749167,7.023889,2718 +alps_4560,PIC DU RONDET,,44.740278,7.023889,2828 +alps_4561,PUNTA PLENG,,44.755278,7.063611,2656 +alps_4562,L'AGUGLIASSA,,44.740833,7.060833,2791 +alps_4563,MONTE MANZOL,,44.731111,7.064444,2933 +alps_4564,BRIC PLATTA SOGLIA,,44.737778,7.128333,2667 +alps_4565,MONTE FRIOLAND,,44.743611,7.149722,2720 +alps_4566,MONTE GRAN ROC,,44.905278,6.863889,3050 +alps_4567,ROC DEL BOUCHER,,44.894722,6.874722,3285 +alps_4568,PUNTA CIATAGNERA,,44.888889,6.883889,3294 +alps_4569,PUNTA CLAPIERA,,44.881667,6.894444,3266 +alps_4570,CIMA DEL PELVO,,44.876667,6.903611,3265 +alps_4571,PUNTA MARIN,,44.871944,6.915556,3254 +alps_4572,ROCCE PLATASSE,,44.908056,6.940278,2760 +alps_4573,MONTE APPENNA,,44.901111,6.971667,2979 +alps_4574,MONTE BARIFREDDO,,44.898333,6.988889,3028 +alps_4575,PUNTA VERGIA,,44.883056,7.013889,2990 +alps_4576,PUNTA DEL GRAN MIOL,,44.865556,6.997500,2995 +alps_4577,CIMA ROUDEL,,44.859722,7.004444,2993 +alps_4578,ROCHER CHARCHEYME,,44.851389,6.961111,2830 +alps_4579,PIC CHARBONNEL,,44.847222,6.970000,2889 +alps_4580,TETE DE FRAPPIER,,44.844167,6.991389,2997 +alps_4581,GRAND QUEYRON,,44.842778,7.001944,3060 +alps_4582,POINTE RASIN,,44.840278,7.006944,2970 +alps_4583,CIMA DI FRAPPIER,,44.852500,7.008333,3003 +alps_4584,BRIC FROID,,44.864167,6.931667,3302 +alps_4585,ROCHER FROID,,44.862500,6.935833,3216 +alps_4586,COL DE LA FIONIERE,,44.856667,6.949722,2921 +alps_4587,GRAND GLAIZA,,44.850000,6.881944,3293 +alps_4588,CIME DE CHABRIERES,,44.850278,6.870833,3246 +alps_4589,PIC DE TERRE NOIRE,,44.858333,6.855000,3110 +alps_4590,PETIT ROCHEBRUNE,,44.825556,6.846944,3078 +alps_4591,PIC LOMBARD,,44.832778,6.838611,2975 +alps_4592,PIC DU MALRIF,,44.831389,6.871944,2906 +alps_4593,PIC DE CLAUSIS,,44.835833,6.911111,2915 +alps_4594,MONTE SELLETTA,,44.892222,7.028611,2570 +alps_4595,PUNTA GARDETTA,,44.879722,7.094444,2737 +alps_4596,ROCCA BIANCA,,44.903889,7.092500,2360 +alps_4597,GRAND TRUC,,44.892222,7.141944,2360 +alps_4598,MONTE FREIDOUR,,44.874444,7.126944,2560 +alps_4599,PUNTA CIALANCIA,,44.862222,7.101389,2855 +alps_4600,PUNTA CORNOUR,,44.850556,7.093056,2867 +alps_4601,CAPPELLO D'ENVIE,,44.870833,7.075556,2618 +alps_4602,BRIC BOUCHET,,44.821944,7.023889,2997 +alps_4603,MONTE GIULIAN,,44.844167,7.059722,2547 +alps_4604,PUNTA FIUNIRA,,44.828889,7.041111,2822 +alps_4605,PUNTA VERGIA,,44.842500,7.141389,2327 +alps_4606,MONTE COSTIGLIOLE,,44.849167,7.126944,2385 +alps_4607,MONTE VANDALINO,,44.838333,7.161944,2130 +alps_4608,MONTE TRIPLEZ,,44.995278,6.875556,2507 +alps_4609,MONTE FRAITEVE,,44.977222,6.861389,2701 +alps_4610,PITRE DE L'AIGLE,,44.984722,6.884722,2535 +alps_4611,MONTE GRAN MUILS,,44.996944,6.989444,2970 +alps_4612,FEG NERA,,44.990000,6.999722,2950 +alps_4613,MONTE RUETAS,,44.970556,6.976111,2910 +alps_4614,BRIC DE MEZZOGIORNA,,44.961389,6.981111,2986 +alps_4615,BRIC GHINIVERT,,44.951944,6.991389,3037 +alps_4616,MONTE PEOLOSIO,,44.941389,6.992500,2886 +alps_4617,MONTE PELATO,,44.939444,6.976944,2741 +alps_4618,MONTE BANCHETTA,,44.955833,6.923333,2822 +alps_4619,MONTE FURGON,,44.912222,6.863611,2815 +alps_4620,MONTE LUCRELLET,,44.939722,6.902500,2726 +alps_4621,PUNTA ROGNOSA,,44.934444,6.931389,3280 +alps_4622,ROCCE DEL ROUIT,,44.928056,6.937500,3134 +alps_4623,MONTE PLATASSE,,44.924444,6.945556,3159 +alps_4624,MONTE PINEZOL,,44.918889,6.992500,2876 +alps_4625,BECCO DE L'AGUILA,,44.990278,7.054167,2820 +alps_4626,TRUC CIALABRIE,,44.988056,7.039167,2936 +alps_4627,BRIC ROSSO,,44.991389,7.019444,3030 +alps_4628,PUNTA MURET,,44.969444,7.108889,2220 +alps_4629,POINTE DE L'AIGUILLE,,45.079167,5.928611,2284 +alps_4630,PIC DE L'OEILLY,,45.087500,5.837778,1547 +alps_4631,LE TAILLEFER,,45.039444,5.924167,2857 +alps_4632,LE PETIT TAILLEFER,,45.039444,5.914167,2696 +alps_4633,ARETE DE BROUFFIER,,45.030556,5.897778,2414 +alps_4634,LE GRAND SERRE,,45.005556,5.826389,2141 +alps_4635,CRETE DU GRAND SERRE,,45.009722,5.856667,1947 +alps_4636,PIED MOUTET,,45.007222,6.096111,2339 +alps_4637,GRAND RENAUD,,45.000000,6.010833,2776 +alps_4638,PETIT RENAUD,,45.002778,6.004167,2606 +alps_4639,LES MAYES,,45.026111,5.943333,2695 +alps_4640,CLOT BEAUMONT,,45.019722,5.948889,2447 +alps_4641,LA BAISSE,,45.002500,5.951667,2223 +alps_4642,LA PYRAMIDE,,45.039722,5.940556,2839 +alps_4643,LE GRAND COLON,,45.163333,5.926667,2394 +alps_4644,PIC CHAUVIN,,45.154444,5.923333,2230 +alps_4645,LE GRAND SORBIER,,45.134167,5.933889,2526 +alps_4646,LE GRAND VAN,,45.131111,5.931111,2448 +alps_4647,LE PETIT VAN,,45.127778,5.930556,2439 +alps_4648,LA BOTTE,,45.123056,5.914722,2248 +alps_4649,ROCHER DE L'HOMME,,45.101667,5.893889,1803 +alps_4650,CIME DES FRACHES,,45.107222,5.900833,1942 +alps_4651,CROIX DE CHAMROUSSE,,45.126111,5.902778,2253 +alps_4652,MONT SAINT EYNARD,,45.249444,5.787778,1370 +alps_4653,ARETE DE BERARD,,45.330278,5.776111,1604 +alps_4654,CHARMANT SOM,,45.325278,5.764444,1867 +alps_4655,LA SCIA,,45.348889,5.851111,1791 +alps_4656,LANCES DE MALISSARD,,45.346944,5.873333,2045 +alps_4657,CRETE DE L'ALPETTE,,45.355833,5.895000,1859 +alps_4658,ROCHERS DE BELLEFOND,,45.342222,5.881389,1975 +alps_4659,DENT DE CROLLES,,45.308056,5.855556,2062 +alps_4660,CRETE DU SANS BEC,,45.340278,5.920278,1045 +alps_4661,ROC D'ARGUILLE,,45.317222,5.837778,1768 +alps_4662,CHAMECHAUDE,,45.287500,5.788333,2082 +alps_4663,BEC CHARVET,,45.296667,5.828056,1738 +alps_4664,SOMMET DE BARLEY,,45.334167,6.020000,1285 +alps_4665,LE GRAND CRET,,45.344444,6.071111,1606 +alps_4666,CRET DU POULEY,,45.330000,6.060000,1726 +alps_4667,LE GRAND ROCHER,,45.303611,6.050278,1926 +alps_4668,CRET DE CHAZAY,,45.277222,5.960556,954 +alps_4669,LA SCIA,,45.279444,5.979167,1040 +alps_4670,CRET DU CHIEN,,45.285278,6.107222,2345 +alps_4671,MONTE JAFFERAU,,45.084722,6.768889,2820 +alps_4672,MONTE VIN VERT,,45.081667,6.808056,2711 +alps_4673,POINTE DE CLOUTZAU,,45.006944,6.747778,2878 +alps_4674,AIGUILLE DE SCOLETTE,,45.160000,6.768611,3506 +alps_4675,POINTE SAINT MICHEL,,45.153333,6.797222,3252 +alps_4676,PIERRE MINIEU,,45.153611,6.789722,3249 +alps_4677,GROS PEYRON,,45.144444,6.819444,3046 +alps_4678,ROGNOSA D'ETACHE,,45.135278,6.836389,3373 +alps_4679,POINTE DE BRAMANETTE,,45.179722,6.786111,3269 +alps_4680,PUNTA VALFREDDA,,45.112500,6.820556,3040 +alps_4681,PUNTA VALFREDDA,,45.110833,6.813889,3051 +alps_4682,TESTA DEL COIN,,45.105833,6.803333,3003 +alps_4683,TETE PIERRE MURET,,45.110556,6.784444,3035 +alps_4684,PIC NORD DE BERLANCHE,,45.344167,6.143056,2161 +alps_4685,PIC SUD DE BERLANCHE,,45.338333,6.144722,2245 +alps_4686,LE VAY,,45.322778,6.147500,2439 +alps_4687,PIC DES GRANDES LANCHES,,45.318056,6.148333,2591 +alps_4688,LE MOULIN LAMBERT,,45.313333,6.166944,2747 +alps_4689,LE GRAND MORETAN,,45.312778,6.163056,2775 +alps_4690,POINTE DU GLEYZIN,,45.311667,6.154444,2692 +alps_4691,LE CHARMET DE L'AIGUILLE,,45.303889,6.153889,2826 +alps_4692,POINTES DE LA BOURBIERE,,45.356667,6.174444,2607 +alps_4693,PETIT CROZET,,45.353611,6.188333,2749 +alps_4694,PIC DU FRENE,,45.352500,6.198333,2807 +alps_4695,CLOCHER DU FRENE,,45.352222,6.195278,2789 +alps_4696,POINTE DE LA PIERRE,,45.356667,6.201944,2621 +alps_4697,POINTE DU BACHEUX,,45.345556,6.191389,2739 +alps_4698,PIC NORD DU MERLET,,45.338056,6.193056,2563 +alps_4699,LE GROS ROCHER,,45.337222,6.200278,2458 +alps_4700,POINTE DE LA LAVOIRE,,45.334167,6.211944,2471 +alps_4701,PIC SUD DU MERLET,,45.328333,6.184444,2469 +alps_4702,ROCHERS DES PATRES,,45.320556,6.187500,2635 +alps_4703,POINTE DE L'AUP DU PONT,,45.318056,6.184444,2713 +alps_4704,POINTE DU VILLONET,,45.316389,6.186667,2727 +alps_4705,CLOCHERS DES PERES,,45.348889,6.239722,2418 +alps_4706,LE GRAND JARNALET,,45.317222,6.211111,2426 +alps_4707,ROCHERS DE VALLORIN,,45.318889,6.199167,2593 +alps_4708,PUY GRIS,,45.295556,6.146389,2908 +alps_4709,ROCHER ROUX,,45.295000,6.152222,2759 +alps_4710,ROC DE PELLEGRIN,,45.292778,6.160000,2763 +alps_4711,POINTE DE COMBEROUSSE,,45.298889,6.141111,2866 +alps_4712,LA PETITE VALLOIRE,,45.303333,6.127222,2559 +alps_4713,POINTES DE LA PORTE D'EGLISE,,45.299722,6.133056,2812 +alps_4714,ROCHERS GRIS,,45.288056,6.131944,2767 +alps_4715,PIC DE LA GRANDE VALLOIRE,,45.280833,6.130833,2887 +alps_4716,ROCHER D'AIGUILLE,,45.277500,6.125000,2885 +alps_4717,LE GRAND TRUC,,45.274167,6.256667,2209 +alps_4718,PLATEAU DE CHAMOSSIERE,,45.298611,6.293611,2135 +alps_4719,MONTE SEGURET,,45.083889,6.839167,2910 +alps_4720,CIMA CIANTIPLAGNA,,45.072222,7.013333,2849 +alps_4721,GRAND PELA,,45.067778,6.982500,2692 +alps_4722,MONTE BLEGIER,,45.040833,6.924444,2585 +alps_4723,MONTE GENEVRIS,,45.031111,6.902222,2536 +alps_4724,PUNTA DI MOUCRONS,,45.016944,6.903889,2507 +alps_4725,TESTA DI MOTTAS,,45.060278,6.935278,2547 +alps_4726,TESTA DELL'ASSIETTA,,45.063611,6.952500,2566 +alps_4727,MONTE ALBERGIAN,,45.007500,6.993056,3041 +alps_4728,MONTE CIABERTAS,,45.023333,7.007222,2740 +alps_4729,MONTE PINTAS,,45.076111,7.032222,2725 +alps_4730,MONTE PELVO,,45.065000,7.070833,2770 +alps_4731,MONTE ORSIERA,,45.063889,7.107222,2890 +alps_4732,PUNTA ROCCA NERA,,45.067778,7.118889,2852 +alps_4733,MONTE MURETTO,,45.068889,7.178333,2277 +alps_4734,MONTE PIAN REAL,,45.054167,7.181389,2617 +alps_4735,MONTE ROBINET,,45.043056,7.166111,2680 +alps_4736,PUNTA DEL LAGO,,45.028333,7.173611,2527 +alps_4737,MONTE BOCCIARDA,,45.007500,7.182222,2213 +alps_4738,PUNTA PIAN PARIS,,45.062778,7.146111,2720 +alps_4739,PUNTA CRISTALLIERA,,45.054167,7.148056,2801 +alps_4740,MONTE ROCCIAVRE,,45.048611,7.159722,2778 +alps_4741,CIMA DEL VALLONETTO,,45.107222,6.848056,3230 +alps_4742,POINTES DU GRAND FOND,,45.257500,7.064444,3528 +alps_4743,POINTES DE LA GRAND FELOUSE,,45.246944,7.069444,3473 +alps_4744,POINTE DE DERRIERE LE CLAPIER,,45.240000,7.079444,3435 +alps_4745,POINTE DE L'AUTARET,,45.246667,7.110556,3352 +alps_4746,POINTE DE LA VALETTE,,45.244167,7.125000,3384 +alps_4747,LA CROIX ROUSSE,,45.260556,7.135556,3565 +alps_4748,OUILLE DU FAVRE,,45.256389,7.102222,3415 +alps_4749,POINTE COSTANS,,45.237222,7.106389,3287 +alps_4750,POINTE AVRIL,,45.230833,7.095833,3214 +alps_4751,POINTE DU FORT,,45.226111,7.088056,3385 +alps_4752,POINTE DU RIBON,,45.228611,7.077778,3527 +alps_4753,POINTE DES CAVALES,,45.222222,7.082778,3394 +alps_4754,CIMA AUTOUR,,45.267500,7.190833,3021 +alps_4755,MONTE LERA,,45.233333,7.152500,3355 +alps_4756,PUNTA DEL SOLE,,45.231111,7.137778,3384 +alps_4757,MONT TOUR,,45.225278,7.051389,3385 +alps_4758,POINTE DE NOVALESA,,45.210000,7.067500,3356 +alps_4759,ROCCIAMELONE,,45.203333,7.077222,3538 +alps_4760,MONTE PALON,,45.189722,7.121667,2970 +alps_4761,CRESTA FENERA,,45.190278,7.150556,2620 +alps_4762,GRAND UJA,,45.194444,7.182222,2666 +alps_4763,POINTE DE LANSERLIA,,45.339444,6.851111,2909 +alps_4764,POINTE DU VALLONNET,,45.335278,6.894722,3539 +alps_4765,GRAND ROC NOIR,,45.330278,6.891944,3582 +alps_4766,POINTE DU GRAND VALLON,,45.320833,6.871111,3136 +alps_4767,LE TURC,,45.349167,6.874444,2797 +alps_4768,POINTE DES BROES,,45.342222,6.911111,3405 +alps_4769,POINTED DE LA FRECHE,,45.326389,6.912500,3467 +alps_4770,POINTE DU VALLONBRUN,,45.331111,6.932222,3420 +alps_4771,POINTES DU CHATELARD,,45.331944,6.955000,3479 +alps_4772,POINTE DU GEFRET,,45.345000,6.942778,3210 +alps_4773,POINTE DE LECHOURS,,45.348333,6.968889,3250 +alps_4774,CROIX DE DOM JEAN MAURICE,,45.345556,6.996667,3146 +alps_4775,AIGUILLE DE MEAN MARTIN,,45.357222,6.978333,3278 +alps_4776,POINTE DES PIGNES,,45.279167,6.977222,3370 +alps_4777,OUILLE ALLEGRA,,45.335833,7.055833,3130 +alps_4778,POINTE D'ANDAGNE,,45.347778,7.060556,3217 +alps_4779,POINTES GRAND FOND,,45.339167,7.084444,3460 +alps_4780,L'ALBARON,,45.332222,7.102778,3640 +alps_4781,PIC REGAUD,,45.348056,7.103056,3232 +alps_4782,LA PETITE CIAMARELLA,,45.329167,7.130556,3537 +alps_4783,GRAN CIAMARELLA,,45.328611,7.145278,3676 +alps_4784,PUNTA ALBARON DI SEA,,45.335000,7.164722,3262 +alps_4785,POINTE TONINI,,45.336389,7.133611,3327 +alps_4786,POINTE DE BONNEVAL,,45.350278,7.137778,3320 +alps_4787,POINTE FRANCESETTI,,45.358333,7.158056,3425 +alps_4788,POINTE DU COLERIN,,45.324167,7.111944,3475 +alps_4789,DENTS DU COLERIN,,45.312778,7.116111,3333 +alps_4790,LA BESSANESE,,45.301944,7.119722,3592 +alps_4791,POINTES DE L'OUILLARSE,,45.326111,7.084722,3435 +alps_4792,POINTE DE CHARBONNEL,,45.280278,7.055000,3752 +alps_4793,OUILLE MOUTTA,,45.271944,7.060833,3565 +alps_4794,OUILLE DE LA VALLETTAZ,,45.275556,7.106667,3145 +alps_4795,OUILLE D'ARBERON,,45.271667,7.128333,3554 +alps_4796,POINTE DES PAREIS,,45.288611,7.129167,3301 +alps_4797,MONTE DI BESSANETTO,,45.283056,7.167778,2939 +alps_4798,PUNTA LUCELLINA,,45.271667,7.180278,2996 +alps_4799,ROCCA TOVO,,45.295833,7.186389,2299 +alps_4800,PUNTA DELLE SERENE,,45.285556,7.185000,2643 +alps_4801,FORT DE MONTGILBERT,,45.519167,6.273889,1469 +alps_4802,PIC DE L'HUILE,,45.470000,6.162222,926 +alps_4803,CHAINE DES HURTIERES,,45.501944,6.257778,1282 +alps_4804,PIC DE LA LOZE,,45.469444,6.229722,1685 +alps_4805,MONT D'ARMENAZ,,45.628056,6.238056,2158 +alps_4806,POINTE DES ARCES,,45.615000,6.225278,2076 +alps_4807,POINTE DES ARLICOTS,,45.607500,6.206944,2060 +alps_4808,LE GRAND PARRA,,45.603611,6.199444,2012 +alps_4809,LA CHA,,45.600833,6.197222,1974 +alps_4810,DENT D'ARCLUZAS,,45.600556,6.173889,2041 +alps_4811,LA COMBE AUX CHEVAUX,,45.612222,6.176111,1880 +alps_4812,MONT DE LA VIERGE,,45.614444,6.125833,1386 +alps_4813,MONT CHABERT,,45.709444,6.146111,1475 +alps_4814,MONT JULIOZ,,45.705278,6.160000,1670 +alps_4815,MONT TRELOD,,45.692778,6.196389,2181 +alps_4816,DENT DE PLEUVEN,,45.677778,6.188333,1771 +alps_4817,DENT DES PORTES,,45.710833,6.190556,1932 +alps_4818,POINTE D'ARCALOD,,45.681667,6.228333,2217 +alps_4819,MONT DE LA COCHE,,45.666944,6.225833,2070 +alps_4820,BANC FERRAND,,45.675556,6.233056,1919 +alps_4821,POINTE DE LA SAMBUY,,45.691667,6.265556,2198 +alps_4822,POINTE DE CHAURIONDE,,45.683889,6.258333,2173 +alps_4823,MONT D'ORISON,,45.660000,6.264444,1762 +alps_4824,LE GRAND ROC,,45.648889,6.260556,1814 +alps_4825,MONT COLOMBIER,,45.644167,6.119722,2045 +alps_4826,ROC DE POYEZ,,45.649722,6.122500,1954 +alps_4827,MONT PECLOZ,,45.631944,6.230556,2197 +alps_4828,POINTE DE VELAN,,45.717222,6.239444,1783 +alps_4829,AIGUILLE NOIRE DE PRAMECOU,,45.447778,6.866111,2977 +alps_4830,POINTE DE PRAMECOU,,45.437778,6.868333,3009 +alps_4831,DOME DE PRAMECOU,,45.434167,6.879167,3081 +alps_4832,ROCHERS DE LA PETITE BALME,,45.437778,6.902500,2779 +alps_4833,POINTE DE ROSELIN,,45.423889,6.848333,2712 +alps_4834,POINTE DU GRAND PRE,,45.421111,6.921944,3059 +alps_4835,POINTE BOUSSAC,,45.413333,6.916944,3118 +alps_4836,POINTE DE LA SANA,,45.385000,6.918056,3436 +alps_4837,POINTE DU CHARBONNIER,,45.380556,6.901389,3317 +alps_4838,ROCHER DE BELLEVARDE,,45.446389,6.950833,2827 +alps_4839,ROCHER DU CHARVET,,45.425278,6.955833,2856 +alps_4840,PELAOU BLANC,,45.398889,7.008056,3135 +alps_4841,POINTE DE L'ARSELLE,,45.403056,7.012222,3110 +alps_4842,POINTE SUD DES LORES,,45.389722,6.970000,2955 +alps_4843,POINTE NORD DES LORES,,45.396944,6.972222,2903 +alps_4844,POINTE DES FOURS,,45.389722,7.005833,3072 +alps_4845,POINTE DE LA MET,,45.381389,7.016389,3041 +alps_4846,POINTE SUD DE BEZIN,,45.381111,7.008056,3061 +alps_4847,POINTE NORD DE BEZIN,,45.386944,7.009167,3030 +alps_4848,LA CROIX DU PISSET,,45.402500,6.941667,2777 +alps_4849,ROCHERS DU GENEPY,,45.399444,6.917778,3130 +alps_4850,LA GRANDE MOTTE,,45.410833,6.870556,3653 +alps_4851,POINTES DE PIERRE BRUNE,,45.377500,6.857222,3196 +alps_4852,ROCHERS DES BALMES DE L'OURS,,45.384722,6.935833,3147 +alps_4853,POINTE DU PISSET,,45.376111,6.973056,3033 +alps_4854,POINTE DE MEAN MARTIN,,45.367222,6.990278,3330 +alps_4855,POINTE DES BUFETTES,,45.365556,7.007500,3233 +alps_4856,AIGUILLE PERS,,45.426389,7.070833,3386 +alps_4857,POINTE DU MONTET,,45.422500,7.070556,3428 +alps_4858,GRANDE AIGUILLE ROUSSE,,45.433056,7.109722,3482 +alps_4859,OETITE AIGUILLE ROUSSE,,45.431111,7.102778,3432 +alps_4860,POINTE DU GROS CAVAL,,45.433611,7.098333,3343 +alps_4861,CIME DE LA VACHE,,45.446944,7.110833,3185 +alps_4862,CIME D'OIN,,45.441389,7.114722,3280 +alps_4863,SIGNAL DE L'ISERAN,,45.432500,7.041389,3237 +alps_4864,L'UJA,,45.423056,7.152500,3382 +alps_4865,AIGUILLE PERCEE,,45.418333,7.155278,3437 +alps_4866,LEVANNA OCCIDENTALE,,45.414167,7.162500,3593 +alps_4867,LEVANNA CENTRALE,,45.410556,7.171944,3619 +alps_4868,LEVANNA ORIENTALE,,45.402778,7.184722,3555 +alps_4869,POINTE GIRARD,,45.390833,7.179722,3259 +alps_4870,POINTE CLAVARINI,,45.385833,7.170833,3261 +alps_4871,ROC DU MULINET,,45.380556,7.163056,3452 +alps_4872,POINTE DE GROSCAVALLO,,45.377222,7.162778,3423 +alps_4873,POINTE MEZZENILE,,45.371111,7.159167,3429 +alps_4874,CIME MONFRET,,45.360556,7.164167,3374 +alps_4875,OUILLE DES PARIOTES,,45.411667,7.139167,3123 +alps_4876,OUILLE DES REYS,,45.402222,7.090278,3081 +alps_4877,OUILLE NOIRE,,45.406111,7.072222,3357 +alps_4878,POINTE DES ARSES,,45.398056,7.062778,3187 +alps_4879,COL DE L'ISERAN,,45.415000,7.023611,3043 +alps_4880,OUILLE DES TRETETES,,45.392500,7.022500,2948 +alps_4881,OUILLE DE LA JAVE,,45.398611,7.028333,2867 +alps_4882,OUILLE DU MIDI,,45.361111,7.093611,3042 +alps_4883,MONT SETI,,45.363889,7.126944,3153 +alps_4884,OUILLES DE TRIEVES,,45.387778,7.135833,3061 +alps_4885,AIGUILLE DU SAINT ESPRIT,,45.535833,6.846944,3419 +alps_4886,MONT TURIA,,45.532778,6.860556,3650 +alps_4887,MONT POURRI,,45.528056,6.860278,3779 +alps_4888,DOME DE LA SACHE,,45.510833,6.870833,3601 +alps_4889,GRANDE PAREI,,45.510000,6.880278,3365 +alps_4890,DOME DES PLATIERES,,45.507222,6.863889,3473 +alps_4891,POINTE DES PLATES DES CHAMOIS,,45.530556,6.991389,3567 +alps_4892,POINTE DU NANT CRUET,,45.527500,6.996667,3605 +alps_4893,AIGUILLE DE LA PETTITE SASSIERE,,45.512222,7.001667,3672 +alps_4894,AIGUILLE DE LA GRANDE SASSIERE,,45.505000,7.000000,3747 +alps_4895,ROCHER DE LA DAVIE,,45.509722,6.965556,3156 +alps_4896,ROCHERS ROUGES,,45.481111,6.869167,3002 +alps_4897,AIGUILLE NOIRE,,45.452500,6.842500,2885 +alps_4898,POINTE DU CHARDONNET,,45.463611,6.870833,2870 +alps_4899,AIGUILLE DE BACQUE,,45.472222,6.842222,2651 +alps_4900,POINTE DU LAVACHET,,45.463056,6.922222,2652 +alps_4901,LA TOVIERE,,45.455833,6.920833,2696 +alps_4902,ROCHERS DU FRANCHET,,45.470278,6.984722,2873 +alps_4903,POINTE DE PICHERU,,45.476111,6.987222,2953 +alps_4904,POINTE DU FRONT,,45.462222,6.993056,2960 +alps_4905,AIGUILLE DU DOME,,45.466944,6.995833,3017 +alps_4906,POINTE DE LA BAILLETTA,,45.469167,7.015556,3071 +alps_4907,PUNTA BASSAC NORD,,45.537222,7.060000,3387 +alps_4908,GRANDE TRAVERSIERE,,45.522778,7.056111,3496 +alps_4909,PUNTA BASSAC SUD,,45.519444,7.049444,3461 +alps_4910,PUNTA BASSAC DERE,,45.510833,7.046111,3352 +alps_4911,POINTE DE LA TRAVERSIERE,,45.497500,7.045000,3338 +alps_4912,GRANTA PEREI,,45.493611,7.065278,3387 +alps_4913,POINTE DE LA GOLETTE,,45.487778,7.055556,3291 +alps_4914,LA TSANTELEINA,,45.479444,7.046111,3602 +alps_4915,POINTE DU COUART DESSUS,,45.474722,7.047222,3490 +alps_4916,BEC DE L'AIGLE,,45.472222,7.050000,3470 +alps_4917,POINTE DE BAZEL,,45.471111,7.060278,3440 +alps_4918,POINTE DE CALABRE,,45.473056,7.073889,3350 +alps_4919,ROC DE BASSAGNE,,45.470833,7.088889,3220 +alps_4920,POINTE DE LA GALISE,,45.466667,7.104722,3343 +alps_4921,PUNTA BASEI,,45.475000,7.114722,3338 +alps_4922,CIMA DI ENTRELOR,,45.529444,7.150833,3430 +alps_4923,MONT TOUT BLANC,,45.521944,7.148333,3438 +alps_4924,L'OUILLE DE MONT TOUT BLANC,,45.526944,7.147500,3440 +alps_4925,PUNTA DEL LEYNIR,,45.516389,7.137778,3235 +alps_4926,CIMA DELLA ROLEY,,45.509722,7.191111,2996 +alps_4927,PUNTA VIOLETTA,,45.482500,7.170000,3031 +alps_4928,GRAN VAUDALA,,45.492500,7.118333,3250 +alps_4929,GRAND COCOR,,45.454444,7.100556,3034 +alps_4930,POINTE DU SANTEL,,45.476944,7.040278,3465 +alps_4931,BECCA DU LAC,,45.630000,6.996389,3405 +alps_4932,BEC DE L'ANE,,45.615278,6.984167,3213 +alps_4933,MONT ARP VIEILLE,,45.611944,7.011389,2963 +alps_4934,POINTE D'AVERNE,,45.623333,6.902500,2554 +alps_4935,ARETE DE MONTSETI,,45.614722,6.955278,2585 +alps_4936,POINTE D'ARCHEBOC,,45.583333,6.980833,3272 +alps_4937,POINTE DE SERRU,,45.575556,6.995556,3227 +alps_4938,POINTE DU ROCHER BLANC,,45.565556,6.994444,3023 +alps_4939,POINTE DE L'ARGENTIERE,,45.579444,6.961667,3053 +alps_4940,POINTE DES LACS VERDET,,45.580000,6.951389,2967 +alps_4941,POINTE DE LA FOGLIETTA,,45.580278,6.939444,2930 +alps_4942,ROCHER DE PIERRE D'ARBINE,,45.570278,6.920556,2647 +alps_4943,AIGUILLE ROUGE,,45.551944,6.848889,3227 +alps_4944,POINTE DES ARANDELIERES,,45.547500,6.845000,3178 +alps_4945,ROCHERS DE PIERRE POINTE,,45.541944,6.956944,3273 +alps_4946,POINTE DES MINES,,45.546389,6.995000,3420 +alps_4947,TESTA DEL RUTOR,,45.630556,7.015278,3481 +alps_4948,PUNTA BIANCA,,45.586667,7.166667,3427 +alps_4949,MONTE ROLETTA,,45.572222,7.166667,3384 +alps_4950,BECCA DI TEI,,45.586111,7.095000,3186 +alps_4951,BECCA DI GIASSON,,45.553611,7.054167,3215 +alps_4952,TRUC BLANC,,45.546111,7.066944,3445 +alps_4953,GRANDE ROUSSE SUD,,45.557222,7.079444,3577 +alps_4954,GRANDE ROUSSE,,45.563333,7.084444,3607 +alps_4955,CIMA DI GOLLIEN,,45.551944,7.160000,3116 +alps_4956,AIGUILLES DE L'ERMITE,,45.700556,6.841667,3011 +alps_4957,SOMMET DES ROUSSES,,45.690556,6.846111,2978 +alps_4958,LANCEBRANLETTE,,45.685556,6.856389,2936 +alps_4959,POINTE DU LAC SANS FOND,,45.678333,6.840278,2884 +alps_4960,BECCA PUGNENTA,,45.718611,7.014722,2827 +alps_4961,COLLE DELLA SERRE,,45.708611,7.010556,2770 +alps_4962,MONTE COLMET,,45.699167,6.988889,3024 +alps_4963,MONTE LUSSE,,45.689167,6.995278,3055 +alps_4964,MONTE MONCHETTE,,45.686111,7.012222,3043 +alps_4965,MONT BELVEDERE,,45.681111,6.902500,2641 +alps_4966,MONT VALEZAN,,45.663611,6.902500,2891 +alps_4967,POINTE DE LA LOUIS BLANCHE,,45.661111,6.915556,2939 +alps_4968,POINTE ROUSSE,,45.651667,6.915556,2806 +alps_4969,LES DENTS ROUGES,,45.648056,6.940278,2924 +alps_4970,POINTE DES COULOUREUSE,,45.641111,6.901389,2678 +alps_4971,POINTE DE LA ROCHE JAILLE,,45.632500,6.904167,2573 +alps_4972,LES VEDETTES,,45.641944,7.002500,3329 +alps_4973,GRAND ASSALY,,45.654167,6.970278,3173 +alps_4974,PETIT ASSALY,,45.648611,6.972500,3147 +alps_4975,POINTE DU TACHUY,,45.655000,6.960833,2858 +alps_4976,MONTE CHETIF,,45.799444,6.948611,2343 +alps_4977,GUGLIA DI CHAMBAVE,,45.805278,7.038333,3089 +alps_4978,TESTA DEL CURRU,,45.811111,7.031389,2990 +alps_4979,GRANDE ROCHERE,,45.813611,7.061389,3326 +alps_4980,PUNTA VALLETTA,,45.801944,7.137222,2801 +alps_4981,BECCA NOAIL,,45.810833,7.375833,2587 +alps_4982,BECCA CONGE,,45.808333,7.405000,2914 +alps_4983,TSAAT A L'ETSENA,,45.801389,7.399722,2971 +alps_4984,BECCA D'AVER,,45.800556,7.535833,2469 +alps_4985,MONTE TANTANE,,45.816944,7.647222,2734 +alps_4986,TETE ENTRE DEUX SAUTS,,45.831111,7.040000,2729 +alps_4987,TESTA DELLA TRONCHE,,45.821944,7.020000,2584 +alps_4988,MONTE BERRIO,,45.864167,7.338333,3075 +alps_4989,PUNTA FIORIO,,45.868611,7.352500,3332 +alps_4990,BECCA DI NONA,,45.840000,7.415833,2898 +alps_4991,POINTE DE VAMEA,,45.829444,7.421944,2685 +alps_4992,LA GRAN COUTA,,45.823056,7.420278,2864 +alps_4993,BEC MORION,,45.825278,7.396667,2719 +alps_4994,MONTE FACEBELLA,,45.850278,7.331111,2516 +alps_4995,BEC BOVET,,45.919167,7.471944,3443 +alps_4996,BECCA CHATELE,,45.908333,7.461667,3208 +alps_4997,MONTE DRAGONE,,45.911944,7.561944,3354 +alps_4998,PUNTA DI FONTANELLA,,45.905833,7.555833,3384 +alps_4999,MONTE TSARVIN,,45.903056,7.531944,2887 +alps_5000,MONTE ARPETTA,,45.893333,7.526111,3093 +alps_5001,POINTE CHANOUX,,45.882500,7.524722,3250 +alps_5002,MONT REDESSAU,,45.879444,7.527222,3253 +alps_5003,CIME DE BALANSELMO,,45.888889,7.553889,3316 +alps_5004,DOME DE CIAN,,45.882500,7.551667,3351 +alps_5005,PUNTA CIAN,,45.876389,7.551111,3320 +alps_5006,POINTE CHAVACOUR,,45.872500,7.536667,3191 +alps_5007,MONT DZALOU,,45.886111,7.492778,3007 +alps_5008,DOME DE PRA DE DIEU,,45.880000,7.495833,3242 +alps_5009,BECCA DE LUSSENEY,,45.870556,7.491111,3504 +alps_5010,BECCA D'ARBIERE,,45.861389,7.491667,3319 +alps_5011,BEC BOVARD,,45.865000,7.470833,2923 +alps_5012,BEC D'INVERGNAOU,,45.858056,7.445278,3035 +alps_5013,BEC DE L'AQUELOU,,45.845556,7.448889,3130 +alps_5014,MONTE PISONET,,45.838056,7.468333,3205 +alps_5015,BECCA DEL MERLO,,45.843889,7.470556,3234 +alps_5016,CIMA BIANCA,,45.853056,7.532222,3009 +alps_5017,MONT MEABE,,45.828333,7.546667,2617 +alps_5018,MONTE FAROMA,,45.819167,7.447500,3073 +alps_5019,CHATEAU DES DAMES,,45.916111,7.577222,3488 +alps_5020,MONT BLANC DU CRETON,,45.918333,7.585556,3406 +alps_5021,MONT ROUS,,45.906111,7.586111,3224 +alps_5022,MOTTA DI PLETE OUEST,,45.912222,7.647778,2836 +alps_5023,GRAN SOMETTA,,45.914167,7.676944,3166 +alps_5024,CIME BIANCHE,,45.903333,7.678889,2973 +alps_5025,MONTE ROISETTA,,45.887222,7.681111,3334 +alps_5026,GRAND TOURNALIN,,45.871667,7.688056,3379 +alps_5027,MONT PANCHEROT,,45.885556,7.599722,2630 +alps_5028,BECCA DI SALE,,45.880000,7.570556,3107 +alps_5029,PUNTA FALINERE,,45.851667,7.657500,2762 +alps_5030,BECCA TRECARE,,45.857778,7.676389,3033 +alps_5031,BEC DE NANA,,45.849167,7.684722,3010 +alps_5032,LE GRAND DENT,,45.838056,7.671944,2832 +alps_5033,CORNO BUSSOLA,,45.795556,7.736944,3024 +alps_5034,PUNTA PIURE,,45.805000,7.731944,2902 +alps_5035,CORNO VITELLO,,45.804444,7.788056,3057 +alps_5036,CRESTA ROSSA,,45.801944,7.866389,2986 +alps_5037,CIMA DEL IANZO,,45.802222,7.946667,2449 +alps_5038,LA BRUCCIATA,,45.808611,7.958889,2418 +alps_5039,LA CONA,,45.805833,7.984722,2212 +alps_5040,CIMA DELLE BALME,,45.791667,8.063333,1930 +alps_5041,CIMA D'OMETTO,,45.740833,8.059722,1912 +alps_5042,MONTE BO DI VALSESTA,,45.746944,8.022500,2071 +alps_5043,TESTONE DEI TRE ALPI,,45.738056,8.022222,2081 +alps_5044,GOBBA DI ROLLIN,,45.923889,7.735278,3899 +alps_5045,PUNTA DI ROLLIN,,45.915000,7.707778,3296 +alps_5046,CASTOR,,45.920833,7.793333,4228 +alps_5047,MONTE ROSSO,,45.882778,7.765833,3021 +alps_5048,ROCCA DI VERRA,,45.898056,7.734444,3129 +alps_5049,MONTE CROCE,,45.868611,7.704444,2894 +alps_5050,MONTE FACCIABELLA,,45.843333,7.700000,2621 +alps_5051,MONTE BETTAFORCA,,45.864167,7.780000,2971 +alps_5052,PALON DI RESY,,45.875833,7.752222,2675 +alps_5053,MONTE ROTHORN,,45.844167,7.785278,3152 +alps_5054,TESTA GRIGIA,,45.830833,7.786667,3315 +alps_5055,MONTE PINTER,,45.823333,7.791111,3132 +alps_5056,MONTE SAREZZA,,45.840000,7.763889,2820 +alps_5057,LISKAMM,,45.922222,7.835556,4527 +alps_5058,PYRAMIDE VINCENT,,45.907778,7.861667,4215 +alps_5059,CORNO NERO,,45.915000,7.862222,4321 +alps_5060,LUDWIGSHOEHE,,45.916667,7.863611,4341 +alps_5061,PARROT SPITZE,,45.919722,7.871389,4432 +alps_5062,PUNTA VITTORIA,,45.896667,7.879444,3435 +alps_5063,PUNTA GROBER,,45.921389,7.923611,3497 +alps_5064,CORNO DI FALLER,,45.906944,7.942500,3128 +alps_5065,PUNTA RIZZETTI,,45.912500,7.938611,3196 +alps_5066,CORNO D'OLEN,,45.874444,7.910833,2556 +alps_5067,STOLEMBERG,,45.882222,7.865556,3202 +alps_5068,CORNO DEL CAMOSCIO,,45.873333,7.868333,3028 +alps_5069,CORNO ROSSO,,45.867222,7.868889,3023 +alps_5070,PUNTA STRALING,,45.853611,7.873889,3115 +alps_5071,CORNO GROSSO,,45.844444,7.865833,3042 +alps_5072,PUNTA DEL UOMO STORTO,,45.831389,7.872222,3014 +alps_5073,CORNO BIANCO,,45.822778,7.878889,3320 +alps_5074,PUNTA DI CIAMPONO,,45.820000,7.861944,3233 +alps_5075,LA MALFATTA,,45.887778,7.886944,2912 +alps_5076,ALTA LUCE,,45.883333,7.835000,3185 +alps_5077,CORNO PIGLIMO,,45.897500,7.961667,2894 +alps_5078,CIMA CARNERA,,45.855000,7.970278,2741 +alps_5079,MONTE TAGLIAFERRO,,45.872500,7.970833,2964 +alps_5080,CORNO MUD,,45.884444,7.963889,2802 +alps_5081,LA MEZZANA,,45.852222,7.979722,2611 +alps_5082,CROCE DEL CAVALLO,,46.024444,8.161111,1904 +alps_5083,MONTE MASSONE,,45.946944,8.338056,2161 +alps_5084,PIZZO PROMAN,,46.024722,8.395278,2098 +alps_5085,CIMA CORTE LORENZO,,45.999444,8.427778,1574 +alps_5086,PIZZO DEL LASINO,,46.021667,8.406944,1990 +alps_5087,CIMA DELLA TRE CROCI,,45.957778,8.355000,1872 +alps_5088,MONTE CERANO,,45.932778,8.385833,1702 +alps_5089,POGGIO CROCE,,45.935000,8.376389,1765 +alps_5090,CIMA TUSS,,46.025000,8.460833,1735 +alps_5091,MONT'ORFANO,,45.945833,8.452778,794 +alps_5092,PIZZO PERNICE,,46.000556,8.519444,1506 +alps_5093,MONTE TODANO,,46.016111,8.540000,1667 +alps_5094,CIMA CUGNACORTA,,46.026111,8.532500,1894 +alps_5095,MONCUCCO,,46.089722,8.229444,1896 +alps_5096,PIZZO DELLE PECORE,,46.035000,8.325556,2018 +alps_5097,PIZZO CASTELLO,,46.038056,8.224167,1607 +alps_5098,PIZZO RAGNO,,46.101111,8.421944,2289 +alps_5099,PIZZO NONA,,46.096944,8.412778,2271 +alps_5100,MONTE TOGANO,,46.092222,8.397500,2299 +alps_5101,MONCUCCO,,46.086389,8.457778,1968 +alps_5102,PIZZO STAGNO,,46.077222,8.459167,2183 +alps_5103,PIZZO DEI DIOSI,,46.074444,8.444444,2161 +alps_5104,PIZZO TIGNOLINO,,46.084722,8.373333,2246 +alps_5105,TESTA DI MENTA,,46.075833,8.373333,2204 +alps_5106,TESTA DEL PARISE,,46.068333,8.357500,2092 +alps_5107,PUNTA POZZOLO,,46.065833,8.352222,2081 +alps_5108,PIZZO MOTTAC,,46.063056,8.402222,1802 +alps_5109,MOTTA DI CAMPO,,46.056667,8.447778,1720 +alps_5110,CIMA PEDUM,,46.044444,8.448333,2111 +alps_5111,CIMA SASSO,,46.030000,8.466111,1916 +alps_5112,PIZZO DELLA ROSSOLA,,46.038056,8.351389,2087 +alps_5113,CIMA SALER,,46.032500,8.346667,2020 +alps_5114,MONTE TORRIGGIA,,46.111667,8.578333,1703 +alps_5115,MONTE RIGA,,46.080000,8.582222,1292 +alps_5116,MONTE COLMINE,,46.087500,8.558056,1212 +alps_5117,TESTA DEL MATER,,46.098056,8.493333,1846 +alps_5118,CIMA MARSICCE,,46.059722,8.491944,2135 +alps_5119,MONTE ZEDA,,46.045000,8.535833,2156 +alps_5120,PIZZO MARONA,,46.032500,8.531944,2051 +alps_5121,MONTE TORRIONE,,46.068611,8.511667,1984 +alps_5122,CIMA FORNALETTI,,46.075278,8.489167,1903 +alps_5123,MONTE BAVARIONE,,46.039167,8.590000,1505 +alps_5124,MONTE VADA,,46.046944,8.565833,1814 +alps_5125,LA PIOTA,,46.060278,8.530556,1925 +alps_5126,CIMA DELLA LAURASCA,,46.058056,8.476111,2195 +alps_5127,MONTE TRE CROCI,,45.788056,9.101111,469 +alps_5128,MONTORFANO,,45.788333,9.145278,554 +alps_5129,SASSO GORDONA,,45.911944,9.080833,1410 +alps_5130,MONTE SAN BERNARDO,,45.896389,9.106944,1351 +alps_5131,MONTE BISBINO,,45.873611,9.066389,1325 +alps_5132,PONCIONE DELLA COSTA,,45.878889,9.093056,1253 +alps_5133,COLMIGNONE,,45.892222,9.118333,1383 +alps_5134,MONTE PREAOLA,,45.880000,9.184167,1417 +alps_5135,BRAGA DI CAVALLO,,45.876667,9.211944,1354 +alps_5136,MONTE PALANZONE,,45.861944,9.201667,1436 +alps_5137,MONTE DI PALANZO,,45.876389,9.180278,1391 +alps_5138,MONTE BOLETTO,,45.833333,9.142500,1236 +alps_5139,MONTE BOLETTONE,,45.836944,9.179167,1317 +alps_5140,MONTE BARZAGHINO,,45.846667,9.236111,1069 +alps_5141,MONTE MAIANO,,45.839722,9.204722,1155 +alps_5142,MONTE ORIOLO,,45.895000,9.274444,1110 +alps_5143,MONTE CORNET,,45.904167,9.249167,1330 +alps_5144,MONTE MORIGALLO,,45.866111,9.340000,1276 +alps_5145,CORNI DI CANZO,,45.862500,9.323056,1373 +alps_5146,MONTE PRASANTO,,45.847778,9.317778,1251 +alps_5147,MONTE RAI,,45.843056,9.320833,1261 +alps_5148,MONTE CORNIZOLO,,45.836944,9.301667,1241 +alps_5149,MONTE PIANCOMPRA,,46.006944,8.624722,1307 +alps_5150,MONTE MORISSOLINO,,46.016667,8.628611,1410 +alps_5151,CIMA DI MORISSOLO,,46.021389,8.645556,1311 +alps_5152,PIZZO D'OMO,,45.983333,8.615556,1070 +alps_5153,MONTE PIAN NAVE,,45.947778,8.720278,1058 +alps_5154,MONTE NUDO,,45.922500,8.689444,1235 +alps_5155,MONTE DELLA COLONNA,,45.928889,8.722500,1203 +alps_5156,MONTE LA TEGIA,,45.927500,8.669167,1110 +alps_5157,MOTTO CROCE,,46.022500,8.820833,1183 +alps_5158,MONTE BEDEA,,46.010833,8.776667,667 +alps_5159,MONTE CLIVIO,,46.013611,8.794722,739 +alps_5160,MONTE LA NAVE,,45.962778,8.810833,988 +alps_5161,MONTE MEZZANO,,45.971111,8.822778,932 +alps_5162,I BEDELONI,,45.971667,8.799722,972 +alps_5163,MONTE MONDINI,,45.991389,8.855278,813 +alps_5164,MONTE PIAMBELLO,,45.921944,8.852500,1129 +alps_5165,MONTE SCERRE,,45.917500,8.806111,796 +alps_5166,MONTACCIO,,46.018889,8.880000,931 +alps_5167,CIMA PESCIA,,45.945833,8.923611,835 +alps_5168,MONTE ARBOSTORA,,45.940000,8.912778,822 +alps_5169,MONTE PINZERNONE,,46.001667,9.052500,1175 +alps_5170,DOSSO DI PRAI,,45.996389,9.110556,1189 +alps_5171,MONTE LURIO,,45.972500,9.095278,1293 +alps_5172,MONTE SERTORE,,45.970833,9.113611,1397 +alps_5173,MONTE PASQUELLA,,45.965278,9.113333,1367 +alps_5174,SIGHIGNOLA,,45.968333,8.993333,1314 +alps_5175,CIMA CROCETTA,,45.943889,9.011944,1391 +alps_5176,MONTE D'ORIMENTO,,45.950278,9.038611,1391 +alps_5177,PIZZO DELLA CROCE,,45.936111,9.055833,1491 +alps_5178,SAN ZENO,,45.932222,9.088056,1025 +alps_5179,MONTE GENEROSO,,45.931111,9.020000,1701 +alps_5180,MONTE CALBIGA,,46.011667,9.161111,1698 +alps_5181,MONTE DI TREMEZZO,,46.001944,9.185278,1700 +alps_5182,MONTE DI LENNO,,46.000833,9.148056,1589 +alps_5183,MONTE CROCIONE,,46.006111,9.195278,1641 +alps_5184,CIMA DELLA DUARIA,,45.984444,9.146667,1447 +alps_5185,COSTONE,,45.977778,9.121111,1441 +alps_5186,MONTE NUVOLONE,,45.950000,9.232500,1093 +alps_5187,CEPPO DEL MUCCHIO,,45.939722,9.224167,1086 +alps_5188,MONTE FOPA,,45.931667,9.220000,1118 +alps_5189,MONTE PONCIO,,45.915000,9.240278,1456 +alps_5190,CIMA DEL COSTONE,,45.912500,9.220833,1616 +alps_5191,MONTE SAN PRIMO,,45.915556,9.209722,1686 +alps_5192,COSTA DEL SAN PRIMO,,45.925833,9.187500,1495 +alps_5193,MONTE COLMENACCO,,45.926667,9.175278,1281 +alps_5194,MONTE FORCELLA,,45.924444,9.236944,1331 +alps_5195,MONTE COMANA,,45.918889,9.115833,1215 +alps_5196,MONTE FOPP,,45.988056,9.310278,1092 +alps_5197,SASSO DI SAN DEFEDENTE,,46.009722,9.319722,1321 +alps_5198,PIZZO DI PARLASCO,,46.008611,9.342500,1511 +alps_5199,MONTE PAROL,,45.978056,9.322222,1203 +alps_5200,ZUC DI VALBONA,,46.007222,9.487222,2134 +alps_5201,ZUC DI CAMM,,46.000556,9.485833,2192 +alps_5202,ROCCE DEL GRIDONE,,46.121667,8.618056,2110 +alps_5203,MONTE LIMIDARIO,,46.123611,8.648056,2188 +alps_5204,MONTE FAIERONE,,46.098889,8.657222,1715 +alps_5205,MONTE ZUCCARO,,46.100833,8.620556,1683 +alps_5206,MONTE GIOVE,,46.078333,8.666389,1298 +alps_5207,MONTE PIAN BELLO,,46.045278,8.648611,1325 +alps_5208,MONTE SPALAVERA,,46.031944,8.618611,1534 +alps_5209,SASSO CORBARO,,46.096389,8.799167,1594 +alps_5210,MONTE GAMBOROGNO,,46.112222,8.830556,1734 +alps_5211,MONTE CADRIGNA,,46.071389,8.769167,1300 +alps_5212,PONCIONE DI BRENO,,46.048611,8.847500,1653 +alps_5213,MONTE LEMA,,46.040556,8.832500,1621 +alps_5214,MONTE GRADISEA,,46.046389,8.795000,1057 +alps_5215,MONTE TAMARO,,46.103889,8.866111,1961 +alps_5216,MONTE GRADICCIOLI,,46.084444,8.865833,1936 +alps_5217,MONTE FERRARO,,46.065278,8.892222,1494 +alps_5218,MONTE MAGNO,,46.064167,8.860556,1636 +alps_5219,TORRI,,46.047778,8.868056,1341 +alps_5220,CAVAL DROSSA,,46.102222,8.993056,1632 +alps_5221,MONTE BAR,,46.107778,9.011667,1816 +alps_5222,CIMA MONCUCCO,,46.111944,9.036111,1725 +alps_5223,GAZZIROLA,,46.118056,9.072500,2116 +alps_5224,MONTE SEGOR,,46.121111,9.078889,2097 +alps_5225,MONTE STABBIELLO,,46.126389,9.100000,2116 +alps_5226,MONTE LUNGO,,46.122778,9.085278,2135 +alps_5227,MONTE CUCCO,,46.075833,9.079167,1624 +alps_5228,CIMA DI FOJORINA,,46.062500,9.072778,1810 +alps_5229,MONTE PRADE,,46.052222,9.069722,1607 +alps_5230,DENTI DELLA VECCHIA,,46.052778,9.022778,1491 +alps_5231,MONTE DEL MUGETTO,,46.059722,9.105000,1355 +alps_5232,MONTE DEI PIZZONI,,46.034167,9.083889,1303 +alps_5233,MONTE BRONZONE,,46.041667,9.085833,1434 +alps_5234,MONTE BOGLIA,,46.029722,9.007500,1516 +alps_5235,PIZZO DI GINO,,46.123611,9.145000,2245 +alps_5236,CIMA PIANCHETTE,,46.118333,9.158056,2158 +alps_5237,MONTE TABOR,,46.112222,9.185278,2079 +alps_5238,MONTE MARNOTTO,,46.103889,9.201944,2088 +alps_5239,MONTE BREGAGNO,,46.097222,9.221111,2107 +alps_5240,MONTE PIDAGGIA,,46.063333,9.165278,1528 +alps_5241,MONTE GRONA,,46.062222,9.211389,1741 +alps_5242,MONTE LEGNONCINO,,46.091111,9.355556,1714 +alps_5243,MONTE CROCE DI MUGGIO,,46.050833,9.357500,1799 +alps_5244,MONTE COLOMBANO,,46.105000,9.422500,2005 +alps_5245,MONTE LEGNONE,,46.094722,9.414722,2609 +alps_5246,MCIMA DI MONCALE,,46.085556,9.434167,2306 +alps_5247,PIZZO ALTO,,46.077222,9.456944,2512 +alps_5248,PIZZO OLANO,,46.094722,9.502222,2267 +alps_5249,MONTE COMBANA,,46.088611,9.504722,2327 +alps_5250,MONTE ROSETTA,,46.083611,9.501111,2360 +alps_5251,MONTE STAVELLO,,46.078056,9.498611,2416 +alps_5252,PIZZO ROTONDO,,46.070556,9.492500,2495 +alps_5253,PIZZO CORNAGIERA,,46.020833,9.457778,2049 +alps_5254,CIMONE DI MAGNO,,46.023611,9.412778,1801 +alps_5255,TEGGIOLO,,46.231111,8.185278,2385 +alps_5256,PIZZO DEL ROVALE,,46.185000,8.214722,2456 +alps_5257,PIZZO GIEZZA,,46.179167,8.196667,2658 +alps_5258,IL DOSSO,,46.181389,8.185278,2562 +alps_5259,COLMINE,,46.206389,8.290556,1742 +alps_5260,PIZZO DEL MEZZODI,,46.182222,8.234444,2383 +alps_5261,PIZZO ALBIONA,,46.174444,8.246667,2431 +alps_5262,CIMA LARIE,,46.149444,8.236944,2144 +alps_5263,MONTE RONDO,,46.158889,8.229444,2179 +alps_5264,MONTE LARONE,,46.218889,8.362778,2237 +alps_5265,CIMA D'AGARO,,46.213333,8.401111,2160 +alps_5266,SASSO CAMPEDELLO,,46.231111,9.350278,2310 +alps_5267,PIZZO SASSO CANALE,,46.224722,9.350833,2411 +alps_5268,PIZZO LEDU,,46.232500,9.321389,2503 +alps_5269,MONTE BERLINGERA,,46.210556,9.389722,1930 +alps_5270,CIMA DI PROVINACCIO,,46.210556,9.489444,1636 +alps_5271,PUNTA REDESCALA,,46.225833,9.511667,2495 +alps_5272,MONTE BRUSADA,,46.182500,9.496111,2142 +alps_5273,MONTE BASSETTA,,46.178889,9.476389,1746 +alps_5274,PIZZO CAMPANIN,,46.338333,9.293611,2653 +alps_5275,MONTE MATER,,46.324722,9.321667,2415 +alps_5276,PIZZO ANNA MARIA,,46.235000,9.331667,2397 +alps_5277,MOTTO ROTONDO,,46.236944,9.309722,2452 +alps_5278,MONTE GRUF,,46.286111,9.505833,2936 +alps_5279,CIMA DI DROSO,,46.300000,9.498056,2418 +alps_5280,SASS BECCHE,,46.282778,9.487778,2728 +alps_5281,MONTE BELENIGA,,46.285278,9.471667,2639 +alps_5282,PIZZO DI PRATA,,46.277500,9.455556,2727 +alps_5283,CORONA DI GARZONE,,46.293889,9.461111,2430 +alps_5284,PIZZO GRILLO,,46.301944,9.462500,2190 +alps_5285,MONTE MATRA,,46.280833,9.441667,2206 +alps_5286,MOTTO DI MAZZO,,46.246389,9.464167,1682 +alps_5287,I ZUC,,46.265278,9.463611,2145 +alps_5288,CIMA DI LAVRINA,,46.249167,9.504444,2307 +alps_5289,SASSO MANDUINO,,46.226944,9.522500,2888 +alps_5290,CIME DEL CALVO,,46.225556,9.560556,2967 +alps_5291,CIMA DI CAVISLONE,,46.218611,9.602222,2541 +alps_5292,MONTE SPLUGA,,46.201667,9.561944,2845 +alps_5293,CORNO DEL COLINO,,46.191111,9.578889,2504 +alps_5294,CIMA DI MALVIDELO,,46.190556,9.541667,2640 +alps_5295,CIMA VIGNONE,,46.218889,9.730556,2608 +alps_5296,MONTE PIZZO BELLO,,46.221111,9.742222,2743 +alps_5297,MONTE CALDENNO,,46.220556,9.769167,2669 +alps_5298,MONTE CANALE,,46.210000,9.819167,2522 +alps_5299,MONTE ARCOGLIO,,46.215278,9.802222,2459 +alps_5300,SASSO BIANCO,,46.218611,9.790556,2490 +alps_5301,DOSSO TORRIOLA,,46.195556,10.312500,1838 +alps_5302,PIZZO PORCELLIZZO,,46.285278,9.573056,3076 +alps_5303,CIMA DEL BARBACAN,,46.262500,9.566667,2738 +alps_5304,PIZZI DELL'ORO,,46.255833,9.556944,2703 +alps_5305,CIMA DEL CAVALCORTO,,46.258889,9.613056,2763 +alps_5306,PUNTA CAMEROZZO,,46.273333,9.613889,2876 +alps_5307,PUNTA MEDACCIO,,46.235278,9.587500,2350 +alps_5308,PIZZO LIGONCIO,,46.239167,9.547222,3033 +alps_5309,CIME DI GAIAZZO,,46.238056,9.530833,2920 +alps_5310,PUNTA MAGNAGI,,46.234167,9.528611,2871 +alps_5311,PUNTA COMO,,46.230833,9.527500,2846 +alps_5312,PIZZO DELLA VADRETTA,,46.233611,9.554167,2907 +alps_5313,PIZZO VENTINA,,46.280278,9.758889,3261 +alps_5314,MONTE DISGRAZIA,,46.269167,9.749444,3678 +alps_5315,MONTE PIODA,,46.271389,9.740000,3431 +alps_5316,CORNI BRUCIATI,,46.237500,9.736111,3114 +alps_5317,CIMA DI CORNA ROSSA,,46.255556,9.746389,3180 +alps_5318,PIZZO DELLA REMOLUZZA,,46.254444,9.718056,2814 +alps_5319,PIZZO BASSET,,46.250833,9.710556,2840 +alps_5320,PIZZO DELL'AVERTA,,46.244444,9.702500,2853 +alps_5321,CIMA D'ARCANZO,,46.237222,9.670000,2714 +alps_5322,MONTE DELLE FORBICI,,46.325556,9.895833,2910 +alps_5323,MONTE ROGGIONE,,46.298056,9.883056,2361 +alps_5324,MONTE MOTTA,,46.287500,9.884444,2336 +alps_5325,MONTE BRACCIA,,46.283611,9.811111,2909 +alps_5326,CIMA DEL DUCA,,46.287500,9.796111,2968 +alps_5327,PUNTA ROSALBA,,46.293889,9.802500,2803 +alps_5328,PIZZO RACHELE,,46.273611,9.790278,2998 +alps_5329,CIMA SASSERSA,,46.268056,9.782500,2977 +alps_5330,PIZZO GIUMELLINO,,46.264722,9.781389,3094 +alps_5331,PIZZO CASSANDRA,,46.261667,9.775278,3226 +alps_5332,CORNI D'AIRALE,,46.247500,9.775833,2845 +alps_5333,MONTE PALINO,,46.245278,9.896667,2686 +alps_5334,MONTE JOPPA,,46.229722,9.889722,2444 +alps_5335,SASSO MORO,,46.318333,9.928333,3108 +alps_5336,MONTE SPONDASCIA,,46.309167,9.959444,2867 +alps_5337,PIZZO SCALINO,,46.278611,9.973611,3323 +alps_5338,MONTE ACQUANERA,,46.268056,9.945000,2806 +alps_5339,MONTE CAVAGLIA,,46.256667,9.915833,2728 +alps_5340,PIZZO PAINALE,,46.256667,9.973889,3248 +alps_5341,CIMA VICIMA,,46.247500,9.971389,3122 +alps_5342,VETTA DI RON,,46.238056,9.961111,3137 +alps_5343,CIME DI ROGNEDO,,46.232222,9.946667,2926 +alps_5344,CIMA DI FORAME,,46.251111,9.987500,3058 +alps_5345,CIMA D'AIADA,,46.254444,10.003333,2753 +alps_5346,PIZZO CALINO,,46.246389,9.995000,3022 +alps_5347,IL ROVINADONE,,46.230278,9.979722,2773 +alps_5348,CORNO MARA,,46.227500,9.930556,2807 +alps_5349,DOSSO CORNIN,,46.291667,10.201667,2775 +alps_5350,CAMPIANO,,46.284167,10.191944,2768 +alps_5351,MONTE MASUCCIO,,46.261389,10.187222,2816 +alps_5352,MONTE VARADEGA,,46.281944,10.321389,2634 +alps_5353,MONTE RESVERDE,,46.262500,10.315833,2347 +alps_5354,PIZZO DI DOSDE,,46.410000,10.225556,3280 +alps_5355,CIMA DE PIAZZI,,46.416667,10.285000,3439 +alps_5356,PIZZO CAMPACCIO,,46.403333,10.281389,3143 +alps_5357,SASSO MAURIGNO,,46.400556,10.272500,3062 +alps_5358,CORNO SINIGAGLIA,,46.416667,10.276111,3315 +alps_5359,CORNI DI VERVA,,46.421389,10.269167,3135 +alps_5360,PIZZO COPPETTO,,46.389722,10.291944,3066 +alps_5361,DOSSO DELL'OCA,,46.363889,10.291389,2880 +alps_5362,MONTE FO,,46.344722,10.278333,2462 +alps_5363,MONTE STORILE,,46.328889,10.274167,2471 +alps_5364,DOSSO SABBIONE,,46.366111,10.177778,2980 +alps_5365,SASSO CAMPANA,,46.349167,10.201944,2913 +alps_5366,MONTE ALPISELLA,,46.347222,10.214444,2756 +alps_5367,MONTE RINALPI,,46.423333,10.303333,3009 +alps_5368,SASSO TERRACCIO,,46.385833,10.303333,2950 +alps_5369,MONTE ZANDILA,,46.380556,10.311944,2936 +alps_5370,CIME REDASCO,,46.369444,10.307778,3139 +alps_5371,MONTE PETTINI,,46.536111,10.227500,2932 +alps_5372,CIME DI PLATOR,,46.511944,10.284444,2910 +alps_5373,DOSSO RESACCIO,,46.500278,10.235000,2719 +alps_5374,MONTE CORNO,,46.478611,10.199722,2987 +alps_5375,MONTE FORCELLINA,,46.466389,10.198611,3087 +alps_5376,MONTE FOSCAGNO,,46.466389,10.205556,3058 +alps_5377,PUNTA BORRON,,46.446389,10.293889,2713 +alps_5378,CORNI SAN COLOMBANO,,46.431667,10.305278,3022 +alps_5379,BELLA COMBA,,45.856111,7.064444,2701 +alps_5380,GRAND GOLLIAT,,45.859167,7.101667,3238 +alps_5381,PETIT GOLLIAT,,45.855556,7.100556,3225 +alps_5382,BELLA COMBA,,45.849167,7.095833,3086 +alps_5383,MONT TAPIE,,45.843056,7.083056,3014 +alps_5384,MONT CHEARFIERE,,45.846389,7.058056,2827 +alps_5385,MONT CHICHET,,45.838056,7.073611,3043 +alps_5386,GUGLIA DI MALATRA,,45.827222,7.073889,3142 +alps_5387,GUGLIA DI BONALE,,45.823056,7.071111,3201 +alps_5388,GUGLIA D'ARTEREVA,,45.833333,7.078611,3071 +alps_5389,GRAN CRETO,,45.828056,7.089722,3071 +alps_5390,COSTONE DI MEZZODI,,45.820556,7.099444,2945 +alps_5391,TESTA DI FACE,,45.825833,7.107778,2683 +alps_5392,POINTE D'ENTREMONT,,45.832222,7.110278,2650 +alps_5393,MONT FOURCHON,,45.868333,7.133056,2902 +alps_5394,AIGUILLE DES SASSES,,45.859444,7.118056,3014 +alps_5395,PAIN DE SUCRE,,45.866944,7.139444,2900 +alps_5396,TOUR DES FOUS,,45.868056,7.149167,2579 +alps_5397,COMBA,,45.863889,7.149722,2561 +alps_5398,MONT MORT,,45.863611,7.178611,2866 +alps_5399,MONTE ROTZO,,45.849167,7.135556,2632 +alps_5400,TESTA CREVACOL,,45.843056,7.140833,2610 +alps_5401,MONTE BORZALET,,45.840833,7.150000,2513 +alps_5402,POINTE DE BARASSON,,45.863056,7.200833,2962 +alps_5403,TETE DE BARASSON,,45.858611,7.190556,2730 +alps_5404,TETE DE FERRET,,45.895278,7.076667,2713 +alps_5405,LA DOTSE,,45.899444,7.101944,2492 +alps_5406,SIX BLANC,,45.880278,7.107222,2795 +alps_5407,MONT FERRET,,45.915556,7.129444,2977 +alps_5408,POINTES DES GROS SIX,,45.913889,7.137500,2873 +alps_5409,POINTE DES PLANARDS,,45.910000,7.140278,2866 +alps_5410,LE PARRON,,45.922500,7.138889,2608 +alps_5411,GROS SIX,,45.918889,7.148056,2854 +alps_5412,POINTE DE GODEGOTTE,,45.901111,7.167500,2749 +alps_5413,POINTE DE TENOU,,45.901667,7.164722,2785 +alps_5414,DENTS DU GRAND LE,,45.900833,7.158056,2884 +alps_5415,MONTS TELLIERS,,45.898333,7.145278,2951 +alps_5416,POINTE DES TROIS LACS,,45.885278,7.151111,2797 +alps_5417,POINTE DE DRONE,,45.878889,7.157500,2950 +alps_5418,GRANDE CHENALATTE,,45.875556,7.164444,2888 +alps_5419,POINTE DES LACERANDES,,45.884167,7.173056,2776 +alps_5420,CROIX DE TSOUSSE,,45.916667,7.221667,2830 +alps_5421,PETIT VELAN,,45.906111,7.236667,3222 +alps_5422,DENTS DE PROZ,,45.901389,7.242222,3488 +alps_5423,AIGUILLE DU VELAN,,45.898056,7.243889,3634 +alps_5424,TESTA GRISA,,45.891944,7.228333,3060 +alps_5425,POINTES DE MOLENNE,,45.889722,7.225833,3033 +alps_5426,POINTE DE CRETE SECHE,,45.888889,7.216389,2953 +alps_5427,LES RAYONS DE LA MADELEINE,,45.883889,7.215556,3051 +alps_5428,TETE ROUGE,,45.875556,7.200000,2805 +alps_5429,TETES DE FAUDERY,,45.881111,7.254444,3320 +alps_5430,MONT VELAN,,45.891667,7.251667,3731 +alps_5431,GRANDE TETE DE BY,,45.919444,7.298333,3587 +alps_5432,LE SONADON,,45.921944,7.294444,3578 +alps_5433,AIGUILLE D'AMIANTE,,45.921111,7.293056,3563 +alps_5434,AIGUILLE VERTE,,45.917500,7.289444,3489 +alps_5435,AIGUILLES DE VALSOREY,,45.915833,7.285556,3443 +alps_5436,MONT PERCE,,45.913333,7.284722,3353 +alps_5437,GRAND CARRE,,45.911944,7.283611,3335 +alps_5438,LES MOLEIRES DU VALSOREY,,45.905556,7.279167,3230 +alps_5439,LES TROIS FRERES,,45.900833,7.276667,3259 +alps_5440,MONT CORDINE,,45.897222,7.268333,3329 +alps_5441,POINTE DU CAPUCIN,,45.893611,7.264722,3396 +alps_5442,TESTA DA RIONDET,,45.890556,7.261389,3487 +alps_5443,DENTS DU VELAN,,45.888889,7.258333,3597 +alps_5444,MONT DE LA GOUILLE,,45.906944,7.259444,3212 +alps_5445,PUNTA GARRONE,,45.913611,7.300000,3290 +alps_5446,PUNTA RATTI,,45.905000,7.309722,2856 +alps_5447,TETE BLANCHE,,45.916667,7.315278,3418 +alps_5448,TESTA DEL FILONE,,45.910278,7.324167,3306 +alps_5449,TETE DE BALME,,45.910556,7.330556,3313 +alps_5450,MONT AVRIL,,45.915278,7.344167,3346 +alps_5451,MONT GELE,,45.904167,7.366111,3518 +alps_5452,PUNTA DELLA BONAMORTE,,45.895278,7.323056,2702 +alps_5453,BEC CREVAYE,,45.890556,7.373056,3320 +alps_5454,TRIDENT DE FAUDERY,,45.887500,7.371111,3384 +alps_5455,MONT MORION,,45.880000,7.368056,3487 +alps_5456,MONT MORION SUD,,45.878056,7.365278,3497 +alps_5457,MONT MORION NORD,,45.882500,7.368611,3484 +alps_5458,MONT CLAPIER,,45.874167,7.360000,3437 +alps_5459,POINTE D'AYACE,,45.917222,7.377778,3019 +alps_5460,GRAND EPICOUNE,,45.920556,7.434167,3346 +alps_5461,BECCA PICION,,45.915556,7.427222,3392 +alps_5462,BEC D'EPICOUNE,,45.914722,7.422222,3529 +alps_5463,MONTE CERVO,,45.906667,7.420278,3441 +alps_5464,BEC DU CHARDONEY,,45.909167,7.412222,3447 +alps_5465,TSOUME DES BOUCS,,45.912222,7.401667,3263 +alps_5466,MONT BERLON,,45.900000,7.399444,3128 +alps_5467,POINTE DE L'AROLETTE,,45.892222,7.383889,3117 +alps_5468,VIERGE DE L'AROLETTE,,45.886111,7.386667,2903 +alps_5469,MONT DE CRETE SECHE,,45.889444,7.399722,2941 +alps_5470,GRANDE LUI,,45.958333,7.048056,3509 +alps_5471,TOUR DE BAVON,,45.969167,7.151944,2476 +alps_5472,CRETA DE VELLA,,45.959722,7.173611,2519 +alps_5473,BEC ROND,,45.958333,7.146111,2562 +alps_5474,ROC DE L'OISEAU,,45.950278,7.138333,2523 +alps_5475,POINTE DE REVEDIN,,45.944722,7.141389,2761 +alps_5476,LA GLAND,,45.939167,7.141667,2794 +alps_5477,MONT DE LA FOULY,,45.934167,7.129444,2871 +alps_5478,LE MOURIN,,45.940278,7.179444,2766 +alps_5479,BECCA COLINTE,,45.926667,7.166389,2814 +alps_5480,LE PEY,,45.927500,7.177222,2592 +alps_5481,CLOCHER DE VOUASSE,,45.934167,7.138611,2821 +alps_5482,TETE DE VARE,,45.940000,7.134444,2769 +alps_5483,BONHOMME DU TSAPI,,45.963333,7.234167,2803 +alps_5484,GRAND COMBIN DE GRAFENEIRE,,45.937500,7.299167,4314 +alps_5485,GRAND COMBIN DE VALSOREY,,45.938056,7.290278,4184 +alps_5486,COMBIN DE BOVEIRE,,45.964722,7.270833,3663 +alps_5487,GRANDE AIGUILLE,,45.950278,7.265000,3682 +alps_5488,LE MOINE,,45.945556,7.271111,3566 +alps_5489,PETITE AIGUILLE,,45.942778,7.274167,3517 +alps_5490,LES BOTSERESSES,,45.934444,7.265278,3260 +alps_5491,AIGUILLES DU MEITIN,,45.955556,7.263333,3642 +alps_5492,POINTE DE CHALLAND,,45.957778,7.262778,3625 +alps_5493,LE RITORD,,45.962778,7.256389,3556 +alps_5494,COMBIN DE CORBASSIERE,,45.977222,7.280556,3715 +alps_5495,L'EPEE,,45.953889,7.265556,3605 +alps_5496,LES GENDARMES,,45.935833,7.340278,3260 +alps_5497,TOUR DE BOUSSINE,,45.936111,7.324167,3833 +alps_5498,LA TSESSETTE,,45.943056,7.311111,4141 +alps_5499,MULETS DE LA TSASSETTE,,45.952778,7.312222,3695 +alps_5500,TOURNELON BLANC,,45.970000,7.322222,3707 +alps_5501,PORTON NORD,,45.963333,7.430556,3503 +alps_5502,POINTE DES PORTONS,,45.958333,7.430278,3512 +alps_5503,POINTE DE LA PETITE LIRE,,45.953333,7.421667,3443 +alps_5504,PETITE AOUILLE,,45.931389,7.433611,3336 +alps_5505,LA RUINETTE,,45.979167,7.400278,3875 +alps_5506,POINTE D'OTEMMA,,45.943611,7.397778,3403 +alps_5507,MONT DURAND,,45.937222,7.374167,2459 +alps_5508,MONT ROUGE DE GIETRO,,45.978889,7.383056,3439 +alps_5509,POINTE DE LA GRANDE LIRE,,45.947778,7.407222,3360 +alps_5510,LA SINGLA,,45.945833,7.471944,3714 +alps_5511,PETIT MONT COLLON,,45.967778,7.481111,3555 +alps_5512,GRAND BLANCHEN,,45.936667,7.475000,3679 +alps_5513,BECCA DES LACS,,45.928611,7.481111,3470 +alps_5514,L'EVEQUE,,45.964444,7.502778,3716 +alps_5515,L'AIGUILLETTE,,45.941944,7.453889,3199 +alps_5516,BECQUE LABIE,,45.932500,7.456389,3463 +alps_5517,BEC DE LA SASSE,,45.935556,7.458611,3496 +alps_5518,POINTE DE BOETTE,,45.935556,7.464444,3541 +alps_5519,AOUILLE TSEUQUE,,45.930278,7.442778,3554 +alps_5520,POINTE SUD DE BRENAY,,45.970000,7.445000,3672 +alps_5521,POINTES DU BRENAY,,45.974167,7.447778,3711 +alps_5522,POINTES D'OREN,,45.955833,7.493333,3525 +alps_5523,AIGUILLE ROUGE,,45.927222,7.485278,3460 +alps_5524,AIGUILLE BLANCHE,,45.926111,7.491667,3440 +alps_5525,MONT COLLON,,45.977222,7.507500,3637 +alps_5526,BECCA VANNETTA,,45.942778,7.515278,3361 +alps_5527,GRAN VANNA,,45.936389,7.524444,3301 +alps_5528,MONT BRULE,,45.955000,7.538333,3585 +alps_5529,MITRE DE L'EVEQUE,,45.968889,7.506389,3654 +alps_5530,POINTE BARNES,,45.976111,7.541389,3612 +alps_5531,AIGUILLE DE LANCIEN,,45.947222,7.537222,3485 +alps_5532,PUNTA BUDDEN,,45.934167,7.586111,3630 +alps_5533,LES JUMEAUX,,45.945833,7.597222,3872 +alps_5534,PUNTA MARGHERITA,,45.957222,7.600556,3903 +alps_5535,TETE DE VALPELLINE,,45.975278,7.581111,3802 +alps_5536,PUNTA CARREL,,45.971389,7.616111,3841 +alps_5537,TOUR DU CRETON,,45.926111,7.585556,3579 +alps_5538,DENT D'HERENS,,45.970000,7.605278,4171 +alps_5539,TESTA DEL LEONE,,45.971389,7.643611,3715 +alps_5540,FURGGGRAT,,45.956667,7.681389,3491 +alps_5541,MATTERHORN,,45.976389,7.658611,4477 +alps_5542,TETE DE BALME,,46.031111,6.966667,2321 +alps_5543,LES GRANDES OTANES,,46.019444,6.981389,2679 +alps_5544,POINTE DES BERRONS,,46.005833,6.984444,2954 +alps_5545,POINTE DE PROSOM,,46.031667,7.032222,2762 +alps_5546,LE GENEPI,,46.024444,7.044444,2884 +alps_5547,PETITE POINTE D'ORNY,,46.006111,7.037500,3187 +alps_5548,POINTE D'ORNY,,46.002222,7.042500,3269 +alps_5549,POINTE DES ECANDIES,,46.015278,7.039444,2873 +alps_5550,POINTE DES RAVINES ROUSSES,,45.991944,7.047500,3258 +alps_5551,ROC DES PLINES,,45.988611,7.044722,3294 +alps_5552,LE TRIDENT,,45.985278,7.041389,3436 +alps_5553,TETE BISELX,,45.984167,7.038333,3509 +alps_5554,AIGUILLE DE LA VARAPPE,,45.982778,7.033611,3519 +alps_5555,CLOCHERS D'ARPETTE,,46.030556,7.061944,2814 +alps_5556,LA BREYA,,46.018889,7.097778,2374 +alps_5557,AIGUILLES D'ARPETTES,,46.005556,7.062222,3059 +alps_5558,AIGUILLE D'ORNY,,46.003056,7.054444,3150 +alps_5559,POINTE DES CHEVRETTES,,46.000556,7.082778,2642 +alps_5560,LE CHATELET,,45.998611,7.100000,2537 +alps_5561,POINTE DES PLINES,,45.980278,7.055556,3052 +alps_5562,CLOCHERS DU PORTALET,,45.991944,7.066667,2983 +alps_5563,AIGUILLE DE LA CABANE,,46.006667,7.068333,2999 +alps_5564,BECCA MIEDZO,,46.019722,7.238333,2785 +alps_5565,MONT ROGNEUX,,46.009444,7.230833,3084 +alps_5566,GRAND LAGET,,46.003889,7.236667,3133 +alps_5567,MONT BRULE,,46.017778,7.200833,2577 +alps_5568,POINTE DE BOVEIRE,,45.994444,7.239722,3212 +alps_5569,POINTE DE TOULES,,45.985000,7.226944,2727 +alps_5570,BECCA DE SERY,,46.012222,7.281667,2828 +alps_5571,BECCA DE SERY,,46.010556,7.280833,2863 +alps_5572,PETIT COMBIN,,45.984167,7.267500,3672 +alps_5573,LA SALE,,46.023611,7.371944,3646 +alps_5574,POINTE DU VASEVAY,,46.031389,7.365833,3356 +alps_5575,LE PLEUREUR,,46.016389,7.369167,3703 +alps_5576,MULETS DE LA LIA,,45.990000,7.333889,2839 +alps_5577,BECCA DE LA LIA,,45.980000,7.318889,3457 +alps_5578,AIGUILLE DE BOCHERESSE,,45.982222,7.323889,3345 +alps_5579,GRAND TAVE,,45.993333,7.314444,3158 +alps_5580,TAVE DES CHASSEURS,,45.989444,7.316944,3165 +alps_5581,SEX QUINAUDOZ,,46.018889,7.403056,3209 +alps_5582,LA LUETTE,,46.010278,7.387500,3548 +alps_5583,MONT BLANC DE CHEILON,,45.993333,7.417222,3870 +alps_5584,LA SERPENTINE,,45.984444,7.433333,3795 +alps_5585,POINTE DU PAS DE CHEVRES,,46.014167,7.432222,2991 +alps_5586,TETE NOIRE,,46.012778,7.416389,2979 +alps_5587,POINTE DES VIGNETTES,,45.990556,7.476111,3194 +alps_5588,MONT DOLIN,,46.025556,7.454444,2974 +alps_5589,LOUETTES ECONDOUE,,46.003056,7.463056,2989 +alps_5590,PIGNE D'AROLLA,,45.991111,7.455278,3796 +alps_5591,PETIT MONT ROUGE,,46.018889,7.440278,2928 +alps_5592,MONT GITSA,,46.031944,7.452222,3114 +alps_5593,LA MAYA,,46.015278,7.502778,3040 +alps_5594,POINTES DE TSENA REFIEN,,46.000278,7.442500,3500 +alps_5595,BOUQUETINS,,45.982222,7.545278,3838 +alps_5596,AIGUILLE DE LA TSA,,46.021389,7.522222,3668 +alps_5597,POINTE DE BERTOL,,46.009722,7.528056,3499 +alps_5598,DENTS DE BERTOL,,45.997222,7.538611,3547 +alps_5599,MONT MINE,,46.015278,7.557500,3333 +alps_5600,POINTES DES DOUVES BLANCHES,,46.015278,7.520833,3641 +alps_5601,POINTE DE TSALION,,46.028611,7.522500,3512 +alps_5602,CRETE DU PLAN,,46.003889,7.527222,3374 +alps_5603,TETE DE CHAVANNES,,45.986389,7.564722,3671 +alps_5604,BOUQUETINS,,45.982778,7.545833,3823 +alps_5605,TETE BLANCHE,,45.987222,7.575278,3724 +alps_5606,POINTE DE ZINAL,,46.027222,7.630556,3789 +alps_5607,SCHOENBIELHORN,,46.013889,7.631111,3472 +alps_5608,WANDFLUEHORN,,46.001944,7.601667,3589 +alps_5609,HOHWAENGHORN,,46.028889,7.650000,3672 +alps_5610,AEBIHORN,,46.020833,7.653611,3472 +alps_5611,MITTLER GABELHORN,,46.033333,7.676389,3685 +alps_5612,POINTE DE LA FINIVE,,46.073611,6.891944,2837 +alps_5613,POINTE DES CAVALES,,46.070278,6.882778,2780 +alps_5614,BAS DE BALLAVAUX,,46.085000,6.891944,2596 +alps_5615,LE CHEVAL BLANC,,46.051944,6.872778,2831 +alps_5616,POINTE A CORBEAUX,,46.046667,6.877778,2687 +alps_5617,AIGUILLE DU CHARMO,,46.048056,6.895000,2655 +alps_5618,POINTE DE L'IFALA,,46.054167,6.911111,2651 +alps_5619,GRAND PERRON,,46.056667,6.914444,2674 +alps_5620,AIGUILLE DE LORIA,,46.033333,6.892222,2752 +alps_5621,POINTE DE LA TERRASSE,,46.041667,6.892222,2734 +alps_5622,TETE DE GRENAIRON,,46.065278,6.878889,2720 +alps_5623,BEL OISEAU,,46.078889,6.937222,2628 +alps_5624,SIX JEUR,,46.067222,6.940000,2062 +alps_5625,POINTE DU VAN,,46.040556,6.975833,2278 +alps_5626,CROIX DE FER,,46.036389,6.976111,2343 +alps_5627,L'AROLETTE,,46.033889,6.969722,2330 +alps_5628,LE CATOG,,46.054167,7.110833,2597 +alps_5629,SIX BLANC,,46.037500,7.185278,2445 +alps_5630,BEC TERMIN,,46.063333,7.300000,3045 +alps_5631,BEC DES ROSSES,,46.071944,7.300000,3223 +alps_5632,POINTE DES CHAMOIS,,46.035556,7.366944,3384 +alps_5633,LUI DES CHAMOIS,,46.051111,7.354722,3199 +alps_5634,LA TORBESSE,,46.041111,7.339722,3052 +alps_5635,LE PARRAIN,,46.045833,7.351389,3259 +alps_5636,PETIT MONT CALME,,46.067222,7.351944,3215 +alps_5637,LE MIROIR,,46.069444,7.366389,3163 +alps_5638,GRAND MONT CALME,,46.075278,7.355000,3205 +alps_5639,TETE DU SARCLAU,,46.036389,7.326389,2639 +alps_5640,PETIT MONT FORT,,46.075278,7.325833,3135 +alps_5641,MONT FORT,,46.080278,7.318889,3328 +alps_5642,ROCHERS DU BOUC,,46.043333,7.373333,3314 +alps_5643,POINTE DU CRET,,46.038889,7.365278,3323 +alps_5644,ROSABLANCHE,,46.060556,7.354167,3336 +alps_5645,MONTS ROUGES,,46.033611,7.435278,3314 +alps_5646,AIGUILLES ROUGES D'AROLLA,,46.055278,7.433611,3646 +alps_5647,POINTE DE DARBONNEIRE,,46.065556,7.433889,3422 +alps_5648,POINTE DE VOUASSON,,46.071389,7.425278,3490 +alps_5649,MONT BLAVA,,46.074722,7.388056,2932 +alps_5650,POINTE D'ALLEVES,,46.084444,7.377778,3025 +alps_5651,LA CASSORTE,,46.035278,7.435278,3301 +alps_5652,MONT DE L'ETOILE,,46.076389,7.453333,3330 +alps_5653,MONT DE L'ETOILE,,46.073889,7.450278,3370 +alps_5654,LA ROUSSETTE,,46.036944,7.446944,3262 +alps_5655,POINTE DES GENEVOIS,,46.036944,7.525833,3677 +alps_5656,DENT DE PERROC,,46.039444,7.523056,3675 +alps_5657,GRANDE DENT DE VEISIVI,,46.050833,7.528056,3418 +alps_5658,PETITE DENT DE VEISIVI,,46.058056,7.518056,3184 +alps_5659,DENT BLANCHE,,46.034167,7.611944,4357 +alps_5660,GRAND CORNIER,,46.052222,7.611667,3962 +alps_5661,PIGNE DA LA LE,,46.083056,7.610833,3396 +alps_5662,POINTE DE MOIRY,,46.084167,7.576667,3303 +alps_5663,POINTE DE BRICOLA,,46.062500,7.591944,3658 +alps_5664,DENT DES ROSSES,,46.068056,7.590556,3618 +alps_5665,TSA DE L'ANO,,46.078056,7.573056,3367 +alps_5666,POINTES DE MOURTI,,46.073333,7.581111,3529 +alps_5667,POINTES DE MOURTI,,46.072500,7.586111,3564 +alps_5668,ZINALROTHORN,,46.065000,7.690278,4221 +alps_5669,WELLENKUPPE,,46.041944,7.678056,3903 +alps_5670,TRIFTHORN,,46.051667,7.678333,3728 +alps_5671,BLANC DE MOMING,,46.071667,7.666944,3657 +alps_5672,BESSO,,46.077778,7.658611,3668 +alps_5673,ARBENHORN,,46.033611,7.650556,3713 +alps_5674,POINTE DU MOUNTET,,46.059444,7.685278,3877 +alps_5675,OBER GABELHORN,,46.038611,7.668056,4063 +alps_5676,MONT RUAN,,46.124444,6.904722,3065 +alps_5677,TETE DES OTTANS,,46.125833,6.873333,2548 +alps_5678,MUR DES ROSSES,,46.108056,6.895000,2931 +alps_5679,TETE DES ROSSES,,46.101944,6.890278,2934 +alps_5680,POINTE DES ROSSES,,46.097222,6.886111,2965 +alps_5681,PIC DE TENNEVERGE,,46.094167,6.878333,2885 +alps_5682,TOUR SALLIERE,,46.126944,6.924722,3219 +alps_5683,FONTANABRAN,,46.099722,6.938611,2702 +alps_5684,DENT DE FENESTRAL,,46.096389,6.952778,2579 +alps_5685,DENT D'EMANEY,,46.102222,6.956944,2568 +alps_5686,LE LUISIN,,46.120833,6.970000,2785 +alps_5687,PETITS PERRONS,,46.128056,6.977778,2627 +alps_5688,LE DOME,,46.131667,6.922778,3138 +alps_5689,POINTES D'ABOILLON,,46.110278,6.930833,2819 +alps_5690,LE CREVASSE,,46.092778,7.136389,1807 +alps_5691,PIERRE AVOI,,46.118056,7.200000,2473 +alps_5692,MONT GOND,,46.127778,7.291389,2670 +alps_5693,DENTS ROUSSES,,46.119722,7.287500,2619 +alps_5694,POINTE DES CHAMPS FERRET,,46.116944,7.275556,2725 +alps_5695,POINTE DES CHAMPS FERRET,,46.115278,7.276944,2742 +alps_5696,MONT GELE,,46.096944,7.278889,3022 +alps_5697,MONT ROGNEUX,,46.105833,7.264167,2694 +alps_5698,TETE DES ETABLONS,,46.118889,7.245000,2416 +alps_5699,MONTS DE CION,,46.087222,7.295000,3040 +alps_5700,LE METAILLER,,46.104167,7.360278,3213 +alps_5701,LES LOUERETTES,,46.115556,7.355556,3068 +alps_5702,POINTE DE LA ROSETTE,,46.121667,7.352778,2965 +alps_5703,LE PERRON,,46.113056,7.339444,2885 +alps_5704,BEC DES ETAGNES,,46.089167,7.316389,3232 +alps_5705,LE FERRET,,46.094444,7.312778,2965 +alps_5706,BEC DE LA MONTAU,,46.128889,7.347500,2922 +alps_5707,PIC D'ARTSINOL,,46.115278,7.426944,2998 +alps_5708,LA TOUENO,,46.112778,7.376389,2618 +alps_5709,RIONDE DE VENDES,,46.128889,7.428333,2742 +alps_5710,PALANCHE DE LA CRETTA,,46.094444,7.464444,2927 +alps_5711,MEL DE LA NIVA,,46.100833,7.464722,2760 +alps_5712,POINTE DU BANDON,,46.104167,7.558056,3074 +alps_5713,POINTE DU TSATE,,46.109444,7.548889,3078 +alps_5714,POINTE DU PRELET,,46.118611,7.543889,2999 +alps_5715,SASSENEIRE,,46.138611,7.525278,3254 +alps_5716,GARDE DE BORDON,,46.121111,7.597500,3310 +alps_5717,COURONNE DE BREONA,,46.091667,7.570556,3159 +alps_5718,AIGUILLES DE LA LE,,46.088611,7.605000,3190 +alps_5719,POINTE D'AR PITETTA,,46.110833,7.666389,3132 +alps_5720,TETE DE MILON,,46.118611,7.691389,3693 +alps_5721,STIERBERG,,46.135000,7.696667,3507 +alps_5722,DIABLON DES DAMES,,46.137222,7.671944,3538 +alps_5723,KLEIN MATTERHORN,,45.938333,7.730000,3883 +alps_5724,FURGGHORN,,45.954167,7.699722,3457 +alps_5725,THEODULHORN,,45.949167,7.708333,3469 +alps_5726,TESTA GRIGIA,,45.935278,7.707500,3479 +alps_5727,BREITHON,,45.940833,7.748056,4164 +alps_5728,POLLUX,,45.927778,7.785278,4092 +alps_5729,ROCCIA NERA,,45.932778,7.775000,4075 +alps_5730,MONTE ROSA DUFOURSPITZE,,45.936944,7.866944,4634 +alps_5731,NORDEND,,45.941944,7.870000,4609 +alps_5732,JAEGERHORN,,45.951944,7.877500,3960 +alps_5733,ZUMSTEINSPITZE,,45.932222,7.871389,4563 +alps_5734,SIGNALKUPPE,,45.927222,7.876944,4554 +alps_5735,PIZZO BIANCO,,45.937222,7.939444,3215 +alps_5736,PIZZO NERO,,45.947778,7.954722,2738 +alps_5737,PIZZO DEI VITTINI,,45.939722,8.008056,2455 +alps_5738,PALLONE DEL BADILE,,45.929444,8.014722,2675 +alps_5739,PIZZO DELLA CACCIA,,45.946667,8.039444,2405 +alps_5740,PIZZO TIGNAGA,,45.935556,8.065000,2653 +alps_5741,PIZZO DELLA MORIANA,,45.936389,8.044167,2631 +alps_5742,RIFFELHORN,,45.981389,7.758056,2927 +alps_5743,OBERROTHORN,,46.027500,7.812778,3415 +alps_5744,UNTER ROTHORN,,46.020833,7.797778,3103 +alps_5745,HOHTAELLI,,45.989167,7.802778,3286 +alps_5746,GORNERGRAT,,45.983333,7.784722,3135 +alps_5747,RIMPFISCHHORN,,46.023333,7.884167,4199 +alps_5748,ADLERHORN,,46.009167,7.889167,3988 +alps_5749,STOCKHORN,,45.985556,7.837778,3532 +alps_5750,FLUEHORN,,46.023333,7.828333,3317 +alps_5751,PFULWE,,46.016667,7.847778,3314 +alps_5752,SPITZI FLUE,,46.017778,7.840833,3260 +alps_5753,STRAHLHORN,,46.013333,7.901944,4190 +alps_5754,CIMA DI JAZZI,,45.980833,7.894444,3803 +alps_5755,FLUCHTHORN,,46.021667,7.914444,3790 +alps_5756,SCHWARZBERGHORN,,45.996944,7.908611,3609 +alps_5757,NEUE WEISSTORSPITZE,,45.988889,7.903611,3639 +alps_5758,GRUENBERGHORN,,46.009722,7.944722,3074 +alps_5759,ROTHORN,,45.997222,7.951111,3230 +alps_5760,PIZZO CINGINO,,46.025278,8.016944,3104 +alps_5761,SPECHHORN,,46.012222,8.001111,3189 +alps_5762,MONTE MORO,,45.999167,7.975000,2984 +alps_5763,JODERHORN,,45.995833,7.989167,3036 +alps_5764,BATTEL,,45.985278,7.999167,2928 +alps_5765,PIZZO LAME,,46.002500,8.059444,2792 +alps_5766,PUNTA GIAPIN,,46.007778,8.021944,2973 +alps_5767,PUNTA LAUGERA,,46.003056,8.032500,2995 +alps_5768,MARIGAL,,45.994444,8.071111,2601 +alps_5769,PIZZO DEL TON,,46.028333,8.108333,2675 +alps_5770,MONTE CIGINA,,46.026667,8.120278,2429 +alps_5771,PUNTA DELLE CINQUEGNA,,46.025278,8.141667,2275 +alps_5772,PIZZO SAN MARTINO,,46.012778,8.090833,2733 +alps_5773,PIZZO VALLAR,,46.006389,8.111111,2275 +alps_5774,UNTER AESCHHORN,,46.056389,7.716667,3554 +alps_5775,OBER AESCHHORN,,46.060556,7.707500,3669 +alps_5776,METTELHORN,,46.055556,7.741389,3406 +alps_5777,PLATTHORN,,46.053611,7.736389,3345 +alps_5778,SCHALIHORN,,46.084444,7.705000,3974 +alps_5779,BOESENTRIFT,,46.042500,7.802778,3248 +alps_5780,LEITERSPITZEN,,46.073333,7.820556,3409 +alps_5781,TASCHHORN,,46.083611,7.857222,4491 +alps_5782,ALPHUBEL,,46.063056,7.863889,4206 +alps_5783,KINHORN,,46.077222,7.833889,3752 +alps_5784,FEECHOPF,,46.048611,7.883333,3888 +alps_5785,ALLALINHORN,,46.045833,7.895556,4020 +alps_5786,MITTAGHORN,,46.084444,7.937778,3143 +alps_5787,EGGINER,,46.075278,7.930000,3367 +alps_5788,KLEIN ALLALIN,,46.059722,7.937222,3069 +alps_5789,LAENGFLUE,,46.084444,7.895833,2867 +alps_5790,HINTER ALLALIN,,46.063333,7.919722,3332 +alps_5791,FELSKINN,,46.068889,7.915556,2991 +alps_5792,STELLIHORN,,46.036389,8.000833,3436 +alps_5793,NOLLENHORN,,46.051111,7.988889,3185 +alps_5794,PLATTENHORN,,46.080833,8.007222,3324 +alps_5795,LATELHORN,,46.044444,8.034722,3204 +alps_5796,PUNTA DELLA ROSSA,,46.038889,8.046111,2911 +alps_5797,PUNTA LORACCIO,,46.052500,8.030556,3242 +alps_5798,PUNTA SCARONE,,46.058889,8.026111,3342 +alps_5799,CIMA DELLO SPIGOLO,,46.063611,8.023611,3361 +alps_5800,AUGSTKUMMENHORN,,46.069722,8.021667,3419 +alps_5801,SONNIGHORN,,46.074167,8.022222,3487 +alps_5802,PUNTA TURIGGIA,,46.066111,8.061944,2811 +alps_5803,WEISSHORN,,46.101389,7.715833,4506 +alps_5804,BISHORN,,46.118056,7.715000,4153 +alps_5805,BRUNEGGHORN,,46.125833,7.745833,3833 +alps_5806,GRAND GENDARME,,46.107222,7.711667,4331 +alps_5807,WISSE SCHIJEN,,46.093889,7.743056,3368 +alps_5808,SCHOELLIHORN,,46.138333,7.737778,3500 +alps_5809,GRABENHORN,,46.093611,7.820278,3371 +alps_5810,DOM,,46.093889,7.858889,4545 +alps_5811,NADELHORN,,46.108889,7.863889,4327 +alps_5812,LENZSPITZE,,46.104444,7.868611,4294 +alps_5813,GUGLA,,46.133889,7.831667,3377 +alps_5814,BALFRIN,,46.135278,7.880278,3796 +alps_5815,ULRICHSHORN,,46.117778,7.876389,3925 +alps_5816,DIRRUHORN,,46.119722,7.848056,4035 +alps_5817,HOHBAERGHORN,,46.112500,7.853889,4219 +alps_5818,HOHGWAECHTE,,46.103611,7.840833,3740 +alps_5819,UNTERS HORN,,46.092222,7.977778,2811 +alps_5820,SCHWARZMIES,,46.125278,7.983611,3194 +alps_5821,DRI HORLINI,,46.113056,8.009444,3209 +alps_5822,TRIFTHORN,,46.118611,7.984167,3395 +alps_5823,WEISSMIES,,46.127778,8.012222,4023 +alps_5824,ALMAGELLHORN,,46.086944,7.994167,3327 +alps_5825,SCHIJENHORN,,46.128333,8.069444,2980 +alps_5826,BALMAHORN,,46.137778,8.076111,2870 +alps_5827,MITTELRUCK,,46.087222,8.030000,3363 +alps_5828,PIZ D'ANDOLLA,,46.100833,8.034722,3653 +alps_5829,TAELLIHORN,,46.123611,8.037500,3448 +alps_5830,TOSSENHORN,,46.125556,8.048056,3225 +alps_5831,PORTJENHORN,,46.106111,8.028333,3567 +alps_5832,CIMA D'AZOGLIO,,46.135833,8.138333,2611 +alps_5833,PIZZO STRACIUGO,,46.132222,8.120833,2713 +alps_5834,PIZZO MONTALTO,,46.097778,8.132778,2705 +alps_5835,CIMA DE ROSSO,,46.115000,8.110000,2624 +alps_5836,MONTE DELLA PREJA,,46.103889,8.116111,2514 +alps_5837,POINTE DE VORLAZ,,46.181667,6.800278,2347 +alps_5838,POINTE DE RIPAILLE,,46.169444,6.821389,1927 +alps_5839,LA PATENAILLE,,46.177778,6.806944,2217 +alps_5840,POINTE DES FORNETS,,46.162778,6.791667,2298 +alps_5841,LA BERTHE,,46.147778,6.794444,1989 +alps_5842,CROIX DE CULET,,46.175833,6.845278,1963 +alps_5843,POINTE DES MOSSETTES,,46.190556,6.816111,2276 +alps_5844,CROIX DE L'HIVER,,46.192778,6.823056,2155 +alps_5845,DENT DE LA CHAUX,,46.154167,6.901389,2767 +alps_5846,DENT DE ROSSETAN,,46.150278,6.893333,2616 +alps_5847,SIGNAL DE SOI,,46.187222,6.916111,2054 +alps_5848,DENT DE BONAVAU,,46.141667,6.856667,2503 +alps_5849,HAUTE CIME DENTS DU MIDI,,46.161111,6.923333,3257 +alps_5850,DENT JAUNE,,46.166111,6.929167,3186 +alps_5851,L'EPERON,,46.167778,6.932222,3114 +alps_5852,LA CATHEDRALE,,46.169722,6.936389,3160 +alps_5853,LA FORTERESSE,,46.171111,6.938889,3164 +alps_5854,CIME DE L'EST,,46.173056,6.948056,3177 +alps_5855,TETE MOTTE,,46.172500,6.958056,2626 +alps_5856,TETE DE CHALIN,,46.179167,6.947778,2595 +alps_5857,LA VERGE,,46.158889,6.968611,2641 +alps_5858,ROCHERS DE GAGNERIE,,46.162222,6.963889,2735 +alps_5859,POINTE FORNET,,46.181944,6.969167,2214 +alps_5860,DENT DU SALENTIN,,46.151111,6.995833,2482 +alps_5861,SIX DU DOE,,46.187778,7.106667,2722 +alps_5862,GRAND CHAVALARD,,46.178611,7.113056,2899 +alps_5863,TETE DU PORTAIL,,46.158889,7.088333,2336 +alps_5864,LE DIABLEY,,46.170556,7.080278,2469 +alps_5865,LUI CREVE,,46.179722,7.084722,2496 +alps_5866,SIX TREMBLE,,46.185278,7.083889,2701 +alps_5867,POINTE DU GRAND COR,,46.194722,7.077500,2836 +alps_5868,SEX CARRO,,46.147222,7.078333,2091 +alps_5869,GRAND CHATEAU,,46.190278,7.121389,2497 +alps_5870,LA SEYA,,46.195000,7.144722,2181 +alps_5871,TETE DU BETSON,,46.180000,7.163056,1766 +alps_5872,GRAND GARDE,,46.177778,7.147778,2145 +alps_5873,DENT DE NENDAZ,,46.156111,7.291389,2463 +alps_5874,POINTE DE BALAVAUX,,46.150833,7.293889,2456 +alps_5875,GREPPON BLANC,,46.143056,7.354167,2713 +alps_5876,LA MAYA,,46.171667,7.491667,2915 +alps_5877,POINTE DE MASSEREY,,46.183333,7.491667,2841 +alps_5878,BECCA DI LOVEGNO,,46.179167,7.489167,2821 +alps_5879,POINTES DE TSAVOLIRE,,46.162500,7.508611,3026 +alps_5880,BEC DE BOSSON,,46.168056,7.518056,3149 +alps_5881,ROC DE LA TSA,,46.188333,7.524444,2911 +alps_5882,ROC D'ORSIVAL,,46.195278,7.538056,2852 +alps_5883,POINTE DE LOIRA,,46.164444,7.539167,2930 +alps_5884,SEX DE MARINDA,,46.149722,7.551389,2906 +alps_5885,CORNE DE SOREBOIS,,46.150833,7.586667,2896 +alps_5886,LES DIABLONS,,46.142500,7.671111,3609 +alps_5887,WAENGERHORN,,46.161389,7.673333,3096 +alps_5888,FRILIHORN,,46.165833,7.673056,3124 +alps_5889,L'OMEN ROSO,,46.176667,7.661944,3041 +alps_5890,HIRSIHORN,,46.186667,7.658611,3076 +alps_5891,BURGIHORN,,46.191944,7.659444,3070 +alps_5892,VELAR DU PETUIS,,46.239167,6.835000,1895 +alps_5893,CRETE DE LINGE,,46.229722,6.820833,2158 +alps_5894,TETE DU GEANT,,46.220556,6.817222,2232 +alps_5895,BECOR,,46.214722,6.811111,2206 +alps_5896,POINTE DE CHESERY,,46.203333,6.803333,2249 +alps_5897,POINTE DE L'AU,,46.200000,6.841111,2152 +alps_5898,LA FOILLEUSE,,46.227778,6.866944,1819 +alps_5899,LA TRUCHE,,46.223056,6.856111,1901 +alps_5900,DENT DE VALERETTE,,46.207222,6.952222,2059 +alps_5901,DENT DE VALERE,,46.195000,6.940278,2267 +alps_5902,TOUR DE DUIN,,46.241111,7.020833,559 +alps_5903,LES PLANAUX,,46.218611,7.041389,1514 +alps_5904,CROIX DE JAVERNE,,46.225000,7.056111,2097 +alps_5905,DENT DE MORCLES,,46.199444,7.075278,2969 +alps_5906,POINTE DES SAVOLAIRES,,46.235278,7.086111,2294 +alps_5907,TETE NOIRE,,46.201667,7.088611,2876 +alps_5908,TITA SERI,,46.198611,7.093889,2850 +alps_5909,DENT FAVRE,,46.210278,7.103611,2917 +alps_5910,POINTE DES MARTINETS,,46.209722,7.071111,2653 +alps_5911,SEX PERCE,,46.247222,7.138333,2514 +alps_5912,TETE AUX VEILLON,,46.241111,7.144722,2846 +alps_5913,POINTE DES ENCRENNES,,46.241389,7.121667,2642 +alps_5914,GRAND MUVERAN,,46.237222,7.126111,3051 +alps_5915,POINTES DE TSERIE,,46.235833,7.176667,2745 +alps_5916,DENT DE CHAMOSENTSE,,46.234444,7.153333,2712 +alps_5917,PETIT MUVERAN,,46.223333,7.122500,2810 +alps_5918,SIX NOIR,,46.215556,7.121111,2673 +alps_5919,POINTE DE CHEMO,,46.223611,7.146111,2626 +alps_5920,SIX ARMAILLE,,46.203333,7.128056,2427 +alps_5921,LE PACHEU,,46.244444,7.151111,2802 +alps_5922,TITA NAIRE,,46.245278,7.160000,2701 +alps_5923,L'ARDEVE,,46.197500,7.198889,1501 +alps_5924,HAUT DE CRY,,46.240278,7.195000,2969 +alps_5925,MONT D'ORGE,,46.230000,7.333333,786 +alps_5926,MONT NOBLE,,46.207500,7.490278,2673 +alps_5927,TOUR DE BONVIN,,46.215833,7.487222,2444 +alps_5928,MONT GAUTIER,,46.197500,7.492500,2696 +alps_5929,ROC D'ORZIVAL,,46.195278,7.538056,2852 +alps_5930,LA BRINTA,,46.215833,7.531944,2660 +alps_5931,ROTHORN,,46.244167,7.643333,2998 +alps_5932,BELLA TOLA,,46.239167,7.653611,3025 +alps_5933,BORTERHORN,,46.246667,7.661111,2971 +alps_5934,ROTIGHORN,,46.229722,7.670833,2959 +alps_5935,MEIDSPITZ,,46.227778,7.660833,2935 +alps_5936,PLETSCHUHORN,,46.239167,7.686667,2751 +alps_5937,PIGNE DE COMBAVERT,,46.217222,7.660278,2871 +alps_5938,POINTE DE TOURTEMAGNE,,46.204444,7.661944,3080 +alps_5939,LE TOUNA,,46.207500,7.650000,3017 +alps_5940,MEIDHORN,,46.206667,7.678333,2874 +alps_5941,HAUT SEX,,46.299722,6.834722,1961 +alps_5942,LE MOUET,,46.294167,6.843889,1937 +alps_5943,TETE DU TRONCHEY,,46.290278,6.851111,1916 +alps_5944,TOUR DE DON,,46.289722,6.861944,1998 +alps_5945,POINTE DES OMBRIEUX,,46.280000,6.864722,1981 +alps_5946,MORCLAN,,46.276944,6.857778,1970 +alps_5947,POINTE DE BELLEVUE,,46.257778,6.887500,2042 +alps_5948,POINTE DE DREVENEUSE,,46.262222,6.894722,2008 +alps_5949,BEC DU CORVEAU,,46.253889,6.862778,1991 +alps_5950,CHARPIGNY,,46.284722,6.978056,508 +alps_5951,TETE A BOSSET,,46.266667,7.096667,1761 +alps_5952,LE COIN,,46.297222,7.132500,2227 +alps_5953,TETE D'ENFER,,46.301667,7.159444,2762 +alps_5954,TETE A PIERRE GREPT,,46.252778,7.155278,2903 +alps_5955,PIERRE QU'ABOTSE,,46.259722,7.153611,2735 +alps_5956,L'ARGENTINE,,46.273611,7.132778,2421 +alps_5957,TOUR D'ANZEINDE,,46.283889,7.153889,2169 +alps_5958,CHAUX RONDE,,46.293889,7.116944,2013 +alps_5959,POINTES DE CHATILLON,,46.301667,7.143333,2368 +alps_5960,TETE TSERNOU,,46.261111,7.171389,2733 +alps_5961,ROC DE LA VACHE,,46.282500,7.166667,2051 +alps_5962,MONT A PERRON,,46.250278,7.205000,2667 +alps_5963,MONT A CAVOUAIRE,,46.258611,7.214722,2613 +alps_5964,TETE PEGNAT,,46.271667,7.188889,2587 +alps_5965,TETE DE BARME,,46.302222,7.195000,3185 +alps_5966,TETE A GROSJEAN,,46.271389,7.180000,2606 +alps_5967,LA FAVA,,46.302222,7.280000,2612 +alps_5968,MONT GOND,,46.285556,7.263333,2710 +alps_5969,PRABE,,46.284167,7.349722,2042 +alps_5970,GERONDE,,46.284444,7.545833,608 +alps_5971,GORWETSCHGRAT,,46.278056,7.593333,2025 +alps_5972,ILLHORN,,46.263056,7.616111,2716 +alps_5973,SCHWARZHORN,,46.252500,7.638333,2788 +alps_5974,MERETSCHIHORN,,46.266667,7.645556,2567 +alps_5975,EMSHORN,,46.264444,7.672778,2633 +alps_5976,BRUNETTHORN,,46.254444,7.666111,2952 +alps_5977,MONT GARDY,,46.350278,6.799722,2198 +alps_5978,MONT VALEUR,,46.353611,6.802222,2147 +alps_5979,LES JUMELLES,,46.352222,6.814167,2215 +alps_5980,LE TACHE,,46.344722,6.848056,1693 +alps_5981,CHAMBAIRY,,46.338889,6.816944,2206 +alps_5982,LA BRAYE,,46.318889,6.840000,1688 +alps_5983,LA SUCHE,,46.349167,6.860833,1539 +alps_5984,LA RIONDAZ,,46.352500,6.999444,1980 +alps_5985,LE CHAMOSSAIRE,,46.326944,7.061111,2112 +alps_5986,CHAUX RONDE,,46.323333,7.093056,2027 +alps_5987,TETE RONDE,,46.303611,7.177778,3037 +alps_5988,TETE DE MEILLERET,,46.337222,7.121944,1939 +alps_5989,CULAN,,46.304722,7.156389,2789 +alps_5990,OLDENHORN,,46.329167,7.221389,3122 +alps_5991,SEX ROUGE,,46.327222,7.202500,2971 +alps_5992,LES DIABLERETS,,46.303889,7.188889,3210 +alps_5993,GSTELLIHORN,,46.344444,7.260278,2818 +alps_5994,ARPELIHORN,,46.351667,7.308056,2921 +alps_5995,LES MONTONS,,46.353611,7.279722,2564 +alps_5996,SANETSCHHORN,,46.337500,7.261944,2924 +alps_5997,WILDHORN,,46.355833,7.362222,3246 +alps_5998,GELTENHORN,,46.346389,7.334444,3065 +alps_5999,ARPELISTOCK,,46.343889,7.315278,3035 +alps_6000,SEX NOIR,,46.317778,7.357500,2731 +alps_6001,HUENERHOERNLI,,46.353611,7.318333,2744 +alps_6002,MONT PUCEL,,46.347778,7.361389,3176 +alps_6003,LE SERAC,,46.326111,7.329444,2817 +alps_6004,LE SUBLAGE,,46.324444,7.314167,2735 +alps_6005,POINTE DES TSARMETTES,,46.310833,7.355000,2704 +alps_6006,SEX ROUGE,,46.333056,7.375833,2893 +alps_6007,CHAMOSSAIRE,,46.318889,7.385278,2616 +alps_6008,SIX DES EAUX FROIDES,,46.346944,7.403056,2905 +alps_6009,POINTE D'HEREMENCE,,46.329167,7.393889,2731 +alps_6010,BELLA LUI,,46.349167,7.488333,2548 +alps_6011,HORLINI,,46.351389,7.669167,2452 +alps_6012,LE GRAMMONT,,46.357500,6.821111,2172 +alps_6013,POINTE DE LA CHAUMENY,,46.361667,6.821111,2067 +alps_6014,SEX DES NOMBRIEUX,,46.365000,6.965000,1805 +alps_6015,SEX DES PACCOTS,,46.368333,6.971944,1806 +alps_6016,SEX DU PARC AUX FAYES,,46.373889,6.978333,1866 +alps_6017,MALATRAIX,,46.393889,6.963889,1767 +alps_6018,POINTE A L'AIGUILLE,,46.409722,6.994722,1932 +alps_6019,TOUR DE FAMELON,,46.383333,7.023611,2138 +alps_6020,TOUR DE MAYEN,,46.374722,7.008333,2326 +alps_6021,TOUR D'AI,,46.372222,7.001944,2331 +alps_6022,BERNEUSE,,46.359722,7.001944,2048 +alps_6023,GROS VAN,,46.396389,7.069167,2189 +alps_6024,MONT D'OR,,46.388333,7.060000,2175 +alps_6025,PIC CHAUSSY,,46.377222,7.112778,2351 +alps_6026,TETE A JOSUE,,46.404722,7.169167,2133 +alps_6027,POINTE DES SEMELEYS,,46.377778,7.123611,2328 +alps_6028,CHATILLON,,46.380556,7.137778,2478 +alps_6029,LE TARENT,,46.382222,7.147500,2548 +alps_6030,LA PARA,,46.383056,7.152500,2540 +alps_6031,CAPE AU MOINE,,46.380556,7.171111,2352 +alps_6032,WALIGHUERLI,,46.393333,7.241111,2050 +alps_6033,BLATTISTAND,,46.382222,7.232222,2019 +alps_6034,STUEDELISTAND,,46.378333,7.226944,2028 +alps_6035,SEEBERGHORN,,46.372500,7.219722,2070 +alps_6036,LA PALETTE,,46.367222,7.199167,2170 +alps_6037,ARNENHORN,,46.380833,7.193889,2211 +alps_6038,LA CHAUX,,46.376389,7.183889,2261 +alps_6039,ARNATSCHISTAND,,46.402778,7.207778,2097 +alps_6040,TETE DE CLE,,46.393611,7.201389,2015 +alps_6041,SCHLUCHHORN,,46.358333,7.262222,2579 +alps_6042,MITTAGHORN,,46.363056,7.270833,2334 +alps_6043,ROTHORN,,46.399722,7.373056,2277 +alps_6044,SPITZHORN,,46.375278,7.310278,2806 +alps_6045,HAHNEN SCHRITTHORN,,46.371111,7.355000,2834 +alps_6046,CHLYS HUERI,,46.383056,7.310000,2213 +alps_6047,SCHAFHORN,,46.365833,7.312500,2697 +alps_6048,MUTTHORE,,46.382778,7.324444,2312 +alps_6049,FOLLHORE,,46.382500,7.347222,2195 +alps_6050,WETZSTEINHORN,,46.365278,7.437222,2798 +alps_6051,SCHNIDEHORN,,46.373056,7.392778,2937 +alps_6052,NIESEHORN,,46.382222,7.373611,2776 +alps_6053,IFFIGHORE,,46.393333,7.402500,2378 +alps_6054,GLETSCHERHORN,,46.389722,7.489722,2943 +alps_6055,WEISSHORN,,46.383611,7.473056,2947 +alps_6056,TOTHORN,,46.370000,7.499167,2934 +alps_6057,TUBANG,,46.358611,7.495556,2826 +alps_6058,FLUESEEHORN,,46.408611,7.492500,2134 +alps_6059,ROHRBACHSTEIN,,46.376389,7.462222,2950 +alps_6060,MITTAGHORN,,46.386111,7.438611,2686 +alps_6061,TIERBERGGRAT,,46.389722,7.466667,2718 +alps_6062,POINTE DE LA PLAINE MORTE,,46.370833,7.486944,2927 +alps_6063,LAUFBODENHORN,,46.399444,7.473889,2701 +alps_6064,LES FAVERGES,,46.374722,7.526944,2968 +alps_6065,ROTHORN,,46.381111,7.567778,3102 +alps_6066,SCHNEEHORN,,46.388889,7.555278,3177 +alps_6067,WILDSTRUBEL,,46.400278,7.528611,3243 +alps_6068,NUSEYHORN,,46.367500,7.561667,2839 +alps_6069,MONT BONVIN,,46.364722,7.507778,2995 +alps_6070,DAUBENHORN,,46.388333,7.602778,2941 +alps_6071,TSCHAJETUHORN,,46.360278,7.582500,2777 +alps_6072,TRUBELSTOCK,,46.370000,7.571944,2998 +alps_6073,SCHWARZHORN,,46.384167,7.580000,3104 +alps_6074,LAEMMERINHORN,,46.406111,7.571944,2861 +alps_6075,ALTE GEMMI,,46.404722,7.640278,2830 +alps_6076,MAJINGHORN,,46.391389,7.688889,3054 +alps_6077,TORRENTHORN,,46.377500,7.678889,2998 +alps_6078,PLATTENHOERNER,,46.403056,7.633611,2855 +alps_6079,DENT DE JAMAN,,46.445000,6.974722,1875 +alps_6080,LE MERDASSON,,46.437500,6.973056,1858 +alps_6081,ROCHERS DE NAYE,,46.431944,6.976111,2042 +alps_6082,DENT DE CORJON,,46.450000,7.035833,1967 +alps_6083,DENT DE HAUTAUDON,,46.445000,6.988889,1871 +alps_6084,POINTE D'AVENEYRE,,46.417500,7.004722,2026 +alps_6085,PLANACHAUX,,46.444167,7.054722,1925 +alps_6086,MONTS CHEVREUILS,,46.434444,7.084167,1749 +alps_6087,ROCHER DU MIDI,,46.443889,7.153333,2097 +alps_6088,LES SALAIRES,,46.435000,7.170000,2171 +alps_6089,LA DOUVE,,46.434722,7.164444,2170 +alps_6090,COUMATTA,,46.436111,7.154167,2048 +alps_6091,CORNE DES BRENLAIRES,,46.412778,7.137778,1879 +alps_6092,CORNE DU SOERE,,46.410833,7.125833,1789 +alps_6093,ROCHER PLAT,,46.456111,7.195556,2255 +alps_6094,LE RUBLI,,46.463056,7.211111,2284 +alps_6095,GUMMFLUH,,46.440556,7.195000,2458 +alps_6096,POINTES DE SUR COMBE,,46.441389,7.200833,2391 +alps_6097,BRECACA,,46.439444,7.189444,2320 +alps_6098,LE BIOLET,,46.437500,7.179167,2293 +alps_6099,POINTE DE LA VIDEMAN,,46.447222,7.196111,2165 +alps_6100,GUMMESEL,,46.442222,7.223056,1893 +alps_6101,FURGGENSPITZ,,46.422778,7.230278,2296 +alps_6102,WITTENBERGHORN,,46.416111,7.209722,2350 +alps_6103,VORDER EGGLI,,46.456111,7.256944,1672 +alps_6104,HINDER EGGLI,,46.451111,7.248889,1596 +alps_6105,STAND,,46.437500,7.293056,1939 +alps_6106,STALDEHORE,,46.431389,7.255000,1922 +alps_6107,SAEFENEFLUE,,46.420278,7.244444,2015 +alps_6108,GIFERSPITZ,,46.451111,7.353333,2541 +alps_6109,LAUENEHORE,,46.440278,7.354444,2477 +alps_6110,STAND,,46.449444,7.329444,2191 +alps_6111,BACHBERGGRAT,,46.457222,7.347500,2218 +alps_6112,WASSERNGRAT,,46.453056,7.326667,2098 +alps_6113,WANDELIFLUE,,46.446389,7.331111,2203 +alps_6114,BRUESCHEGRAT,,46.442778,7.334722,2164 +alps_6115,RUEMLISHORE,,46.464722,7.380556,2227 +alps_6116,FLOESCHHORE,,46.463333,7.406111,2079 +alps_6117,WISTAETTHORN,,46.454167,7.386111,2362 +alps_6118,WALLRITZGRAT,,46.454167,7.396111,2082 +alps_6119,MUELKERBAATTE,,46.435000,7.414167,1935 +alps_6120,AEBEHUESLI,,46.431667,7.434444,1350 +alps_6121,TUBE,,46.428333,7.374722,2109 +alps_6122,LEITERLI,,46.425556,7.406111,2001 +alps_6123,STUEBLENI,,46.417222,7.384167,2109 +alps_6124,OBERLAUBHORN,,46.418056,7.456389,1999 +alps_6125,BUELLBERG,,46.453889,7.469167,1661 +alps_6126,BURGBUEL,,46.448889,7.451389,1098 +alps_6127,REGEN BOLDSHORN,,46.442222,7.504444,2193 +alps_6128,GROSSSTRUBEL,,46.412500,7.562500,3242 +alps_6129,AMMERTENSPITZ,,46.433333,7.524722,2613 +alps_6130,ROTSTOCK,,46.443333,7.537778,2623 +alps_6131,AMMERTENHORN,,46.417222,7.517222,2666 +alps_6132,VORDER LOHNER,,46.461944,7.600000,3049 +alps_6133,TSCHINGEL LOCHTIGHORN,,46.445556,7.592778,2735 +alps_6134,TIERHOERNLI,,46.426111,7.589722,2894 +alps_6135,STEGHORN,,46.416667,7.584167,3146 +alps_6136,ROTER TOTZ,,46.416111,7.600000,2840 +alps_6137,FELSENHORN,,46.428611,7.610278,2782 +alps_6138,WYSSI FLUE,,46.439167,7.620556,2472 +alps_6139,CHLI RINDERHORN,,46.425833,7.643056,3003 +alps_6140,BALMHORN,,46.425000,7.693611,3699 +alps_6141,RINDERHORN,,46.413611,7.654167,3453 +alps_6142,ALTELS,,46.428889,7.678333,3629 +alps_6143,TATELISHORN,,46.442222,7.671667,2962 +alps_6144,GAELLIHORN,,46.463889,7.646944,2284 +alps_6145,CORBETTA,,46.512222,6.935000,1399 +alps_6146,PRALET,,46.507500,6.971667,1568 +alps_6147,LE BARLATTEY,,46.504444,6.973333,1630 +alps_6148,LE MOLARD,,46.483889,6.960000,1753 +alps_6149,LE FOLLY,,46.479167,6.950833,1730 +alps_6150,CAPE AU MOINE,,46.470278,6.978889,1944 +alps_6151,DENT DE LYS,,46.507500,7.003056,2015 +alps_6152,GRAND SEX,,46.511667,7.012778,1908 +alps_6153,VANIL BLANC,,46.517778,7.018056,1828 +alps_6154,FOLLIU BORNA,,46.491944,6.992222,1849 +alps_6155,VANIL DES ARTSES,,46.482222,6.987222,1993 +alps_6156,LES MILLETS,,46.505278,7.094444,1886 +alps_6157,POINTE DE CRAY,,46.486944,7.100278,2070 +alps_6158,POINTE DE PARAY,,46.513333,7.137222,2375 +alps_6159,GROS PERRE,,46.503056,7.126389,2208 +alps_6160,VANIL CARRE,,46.497222,7.117778,2195 +alps_6161,PRA DE CRAY,,46.496111,7.114444,2198 +alps_6162,LA LAITEMAIRE,,46.490556,7.162778,1678 +alps_6163,RELLERLIGRAT,,46.510833,7.262778,1831 +alps_6164,CHOLIS GRIND,,46.482778,7.257500,1280 +alps_6165,GRICHTSFLUE,,46.481389,7.252778,1366 +alps_6166,GANDLOUENEGRAT,,46.505278,7.356944,2079 +alps_6167,HASELOCH,,46.504722,7.322778,1558 +alps_6168,SAANERSLOCH FLUE,,46.499722,7.331389,1960 +alps_6169,HORNFLUE,,46.488889,7.315000,1949 +alps_6170,HUENERSPIL,,46.490833,7.326944,1926 +alps_6171,HORNTUBE,,46.491389,7.337500,1993 +alps_6172,ALBRISTHORN,,46.498056,7.487778,2763 +alps_6173,TIERBERG,,46.473333,7.491111,2371 +alps_6174,LUEGLE,,46.506111,7.480278,2232 +alps_6175,ALBRIST HUBEL,,46.512222,7.463056,2139 +alps_6176,HEMPLIGER,,46.498056,7.499444,2483 +alps_6177,GALM,,46.496389,7.470833,2187 +alps_6178,SCHATTHORE,,46.478333,7.463889,2070 +alps_6179,SEEMLIHORE,,46.479444,7.488611,2467 +alps_6180,SCHURTERITZE,,46.505278,7.515000,2460 +alps_6181,GSUER,,46.510556,7.519167,2709 +alps_6182,TUERMLIHORE,,46.518056,7.512778,2490 +alps_6183,LANDVOGTIHORE,,46.514722,7.524722,2614 +alps_6184,SCHWANDFAELL SPITZ,,46.497222,7.542500,2025 +alps_6185,HOECHSTHORN,,46.467778,7.546944,1912 +alps_6186,CHLYNE LOHNER,,46.486389,7.626111,2587 +alps_6187,MITTLERE LOHNER,,46.469444,7.609444,3002 +alps_6188,NUENIHORN,,46.478056,7.611389,2717 +alps_6189,SCHRYBER SCHRECK,,46.483056,7.603056,2005 +alps_6190,HINDERE LOHNER,,46.476389,7.616389,2778 +alps_6191,BUNDERSPITZ,,46.492500,7.620556,2546 +alps_6192,METSCHHORE,,46.505000,7.624722,2229 +alps_6193,WIDERHUBEL,,46.510000,7.626389,2142 +alps_6194,MITTAGHORN,,46.467778,7.588889,2678 +alps_6195,STAND,,46.515556,7.644722,2320 +alps_6196,HELLHORE,,46.488889,7.654722,1792 +alps_6197,FIRST,,46.504722,7.643056,2548 +alps_6198,HOMANG,,46.509167,7.644444,2519 +alps_6199,BIRE,,46.510833,7.698333,2502 +alps_6200,BUETSCHI,,46.517222,7.676389,1053 +alps_6201,ALPSCHELE HUBEL,,46.486944,7.644444,2278 +alps_6202,INNER FISISTOCK,,46.469444,7.690556,2787 +alps_6203,JAEGERTOSSE,,46.470833,7.672222,2154 +alps_6204,LE MOLESON,,46.548889,7.017222,2002 +alps_6205,TEYSACHAUX,,46.534167,6.996389,1909 +alps_6206,LA VUDALLA,,46.552500,7.050278,1670 +alps_6207,PLAN DE TISSINEVA,,46.565556,7.170000,1884 +alps_6208,DENT DE BRENLEIRE,,46.550833,7.174722,2353 +alps_6209,DENT DE FOLLIERAN,,46.546944,7.168611,2340 +alps_6210,VANIL NOIR,,46.528611,7.148333,2389 +alps_6211,VANIL DE L'ECRI,,46.522222,7.143611,2375 +alps_6212,LES MERLAS,,46.546389,7.125833,1908 +alps_6213,LE VAN,,46.543333,7.129722,1966 +alps_6214,TSERMON,,46.537778,7.140000,2140 +alps_6215,DENT DES BIMIS,,46.533333,7.173056,2161 +alps_6216,TOUR DE DORENA,,46.526944,7.158889,2260 +alps_6217,DENT DE RUTH,,46.553889,7.237222,2236 +alps_6218,DENT DE SAVIGNY,,46.549722,7.226667,2252 +alps_6219,CORNE AUBERT,,46.537500,7.213889,2038 +alps_6220,HAUTE COMBE,,46.534167,7.220833,2039 +alps_6221,DENT DE COMBETTE,,46.527778,7.203889,2082 +alps_6222,BIREFLUE,,46.571944,7.267222,2076 +alps_6223,WANDFLUE,,46.563333,7.259722,2133 +alps_6224,ZUCKER SPITZE,,46.556667,7.247500,2132 +alps_6225,VENNERS CHOEPFLI,,46.566667,7.273611,1754 +alps_6226,HUSEGG,,46.553333,7.251111,1998 +alps_6227,HUENDSRUGG,,46.556667,7.305278,2047 +alps_6228,AMELIER,,46.549444,7.244444,2002 +alps_6229,BIREHUBEL,,46.540833,7.288333,1937 +alps_6230,SCHNEITGRAT,,46.538889,7.265000,1960 +alps_6231,WANNEHOERLI,,46.536667,7.294167,1942 +alps_6232,PLANIHUBEL,,46.529167,7.271389,1879 +alps_6233,HUGELIGRAT,,46.519444,7.265833,1897 +alps_6234,GOLDE,,46.540278,7.341111,1626 +alps_6235,SCHAUEN EGG,,46.535278,7.336667,1533 +alps_6236,CHOERBELIHORE,,46.529722,7.436389,2239 +alps_6237,MIESCHFLUE,,46.523889,7.432778,2155 +alps_6238,BRUNNIHORE,,46.528333,7.433611,2221 +alps_6239,GANDHORE,,46.526389,7.422500,2112 +alps_6240,VORDERI SPILLGERTE,,46.539167,7.435556,2252 +alps_6241,MANNEBERG,,46.571667,7.381944,1017 +alps_6242,CHUMIGALM,,46.563889,7.429167,2125 +alps_6243,LERCHFLUE,,46.533611,7.422500,1888 +alps_6244,GYRSHUBEL,,46.525000,7.411944,1966 +alps_6245,HINDERI SPILLGERTE,,46.536667,7.446667,2475 +alps_6246,ROTHORN,,46.535278,7.461111,2410 +alps_6247,RAUFLIHORN,,46.532778,7.482778,2322 +alps_6248,ARBITHORE,,46.542500,7.488611,2099 +alps_6249,ANKESTOCK,,46.547500,7.456389,2033 +alps_6250,CHALBERHORI,,46.544444,7.468889,2095 +alps_6251,FROMATTGRAT,,46.558056,7.444167,2170 +alps_6252,SEEHORE,,46.566944,7.461389,2281 +alps_6253,MUNTIGGALM,,46.573333,7.441111,2077 +alps_6254,CHEIBEHORN,,46.561944,7.542778,2460 +alps_6255,CHIRGELISCHIBE,,46.555833,7.523333,2287 +alps_6256,SCHATTIGI SCHIBE,,46.552222,7.541944,2597 +alps_6257,MAENNLIFLUE,,46.551389,7.546389,2652 +alps_6258,WINTERHORE,,46.548056,7.552778,2608 +alps_6259,LADHOLZHORE,,46.552500,7.561667,2487 +alps_6260,ERBITHORE,,46.543333,7.548611,2508 +alps_6261,WYSSI FLUE,,46.534722,7.542500,2435 +alps_6262,DRUMANNLER,,46.531111,7.538611,2436 +alps_6263,UNDERE WANNERSPITZ,,46.531944,7.528611,2207 +alps_6264,GALMSCHIBE,,46.546389,7.529167,2425 +alps_6265,BODEZEHORE,,46.526667,7.538889,2354 +alps_6266,WYSSI FLUE,,46.566111,7.577500,2354 +alps_6267,LINTERHORE,,46.555556,7.570833,2325 +alps_6268,CHILCHHORE,,46.521667,7.648333,2162 +alps_6269,RUEDERIGSGRAT,,46.570833,7.692778,2127 +alps_6270,GIESIGRAT,,46.555833,7.695278,2245 +alps_6271,SATTELHORN,,46.550556,7.695278,2376 +alps_6272,ELSIGHORN,,46.534722,7.639722,2341 +alps_6273,INNERS BARRHORN,,46.149722,7.737222,3583 +alps_6274,UESSERS BARRHORN,,46.155833,7.733889,3610 +alps_6275,GASSISPITZ,,46.161667,7.735556,3411 +alps_6276,BRAENDJIHORN,,46.172222,7.739722,3308 +alps_6277,WASUHORN,,46.173333,7.749167,3343 +alps_6278,ROTHORN,,46.181111,7.732778,3278 +alps_6279,FURGG WANGHORN,,46.193889,7.735278,3162 +alps_6280,HUNGERLIHORLI,,46.183611,7.724167,3007 +alps_6281,BRAENDJISPITZ,,46.182500,7.716667,2850 +alps_6282,MITTELBERG,,46.155278,7.825833,2712 +alps_6283,FESTIHORN,,46.176944,7.765833,3092 +alps_6284,SPARRUHORN,,46.183611,7.769167,2988 +alps_6285,BIGERHORN,,46.145278,7.870278,3626 +alps_6286,FAERICHHORN,,46.155556,7.858611,3290 +alps_6287,PLATTHORN,,46.166389,7.861389,3246 +alps_6288,GABELHORN,,46.171111,7.858611,3136 +alps_6289,DISTELHORN,,46.186111,7.870556,2830 +alps_6290,BREITHORN,,46.143611,7.830000,3178 +alps_6291,AUSSER ROTHORN,,46.175278,7.956667,3147 +alps_6292,LAMMENLIHORN,,46.154444,7.894444,3190 +alps_6293,LAGGINHORN,,46.157222,8.003056,4010 +alps_6294,JEGIHORN,,46.151667,7.970278,3206 +alps_6295,INNER ROTHORN,,46.163611,7.981389,3455 +alps_6296,FLETSCHHORN,,46.168056,8.003333,3993 +alps_6297,SENGGCHUPPA,,46.179167,7.995556,3606 +alps_6298,JEGIGRAT,,46.162222,7.984444,3451 +alps_6299,WENGHORN,,46.178611,8.050278,2587 +alps_6300,GRAUHORN,,46.145000,8.061667,2636 +alps_6301,ROTHORN,,46.170278,8.030556,3108 +alps_6302,SEEHORN,,46.182500,8.116111,2439 +alps_6303,GUGGILIHORN,,46.165000,8.088056,2351 +alps_6304,GALIHORN,,46.148333,8.086667,2577 +alps_6305,IRGILIHORN,,46.146389,8.127222,2458 +alps_6306,CAMOSCELLAHORN,,46.175000,8.159722,2612 +alps_6307,CIMA VEROSSO,,46.146944,8.156389,2444 +alps_6308,MONTE LOCCIA DI PEVE,,46.165000,8.406389,2127 +alps_6309,PIZZO LA SCHEGGIA,,46.184167,8.415278,2466 +alps_6310,LOCCIABELLA,,46.181111,8.411111,2340 +alps_6311,MONTE MATER,,46.161389,8.426667,2026 +alps_6312,MONTE MARGINETA,,46.160278,8.414167,2017 +alps_6313,SCHEGGE DI MUINO,,46.181667,8.484444,2163 +alps_6314,CIMA DEL SASSONE,,46.175278,8.517500,2085 +alps_6315,CIMA TRUBBIO,,46.173056,8.493056,2062 +alps_6316,MONTE ZICCHER,,46.163333,8.534167,1967 +alps_6317,PIZZO RUSCADA,,46.177500,8.592778,2004 +alps_6318,PUNTA DELLA FORCOLETTA,,46.173889,8.568056,1785 +alps_6319,STEIFALHORN,,46.203889,7.760278,3164 +alps_6320,SCHWARZHORN,,46.216667,7.756667,3201 +alps_6321,DREIZEHNTENHORN,,46.221944,7.762222,3052 +alps_6322,SCHWARZI BLATTE,,46.230556,7.751667,2975 +alps_6323,GINALSHORN,,46.236944,7.740278,3026 +alps_6324,WYSSEGGA,,46.198889,7.748333,3168 +alps_6325,VIOLENHORN,,46.243056,7.791944,2876 +alps_6326,AUGSTBORDHORN,,46.235000,7.795278,2972 +alps_6327,AUGSTBORDGRAT,,46.220833,7.781389,2960 +alps_6328,OCHSEHORN,,46.220556,7.940833,2912 +alps_6329,MATTWALDHORN,,46.198611,7.955556,3245 +alps_6330,SIMELIHORN,,46.199167,7.942222,3124 +alps_6331,MAGEHORN,,46.233611,7.980556,2621 +alps_6332,GALEHORN,,46.222222,7.982778,2797 +alps_6333,SIRWOLTEHORN,,46.210278,7.984444,2845 +alps_6334,SCHILTHORN,,46.208333,8.006111,2795 +alps_6335,RAUTHORN,,46.198889,7.993056,3268 +alps_6336,HUEBSCHHORN,,46.238056,8.057222,3192 +alps_6337,BREITHORN,,46.233889,8.081111,3366 +alps_6338,CHESSELHORN,,46.218333,8.081389,2981 +alps_6339,CHELLIHORN,,46.211667,8.085556,2923 +alps_6340,PIZZO VALGRANDE,,46.246944,8.150000,2529 +alps_6341,PUNTA VALGRANDE,,46.226111,8.138889,2856 +alps_6342,PIZZO FNE,,46.231389,8.124167,2933 +alps_6343,PIZZO DI LOCCIASTESA,,46.235278,8.391111,2203 +alps_6344,PIZZO D'APTEGIA,,46.238333,8.434167,2548 +alps_6345,PIZZO LOCCIATENERA,,46.243889,8.436111,2580 +alps_6346,PIZZO DI PORCARESE,,46.244722,8.463889,2467 +alps_6347,PIZZO DI MADEI,,46.233056,8.468611,2551 +alps_6348,PIZZO DEL FORNALE,,46.229167,8.466667,2490 +alps_6349,PUNTA DI PEZZA COMUNE,,46.223333,8.459167,2429 +alps_6350,CIMA DI CANOGIA,,46.207778,8.413889,2350 +alps_6351,PIZZO DI CAMPOLATE,,46.213889,8.449167,2306 +alps_6352,PIZZO DELLA FONTANALBA,,46.205833,8.450833,2265 +alps_6353,PIZZO DI FONTANALBA,,46.199722,8.466389,2200 +alps_6354,PIODA DI CRANA,,46.195556,8.448056,2430 +alps_6355,CIMA DEI CASALETI,,46.193056,8.421389,2417 +alps_6356,PIZZO RUGGIA,,46.192778,8.482778,2289 +alps_6357,PONCIONE DEL ROSSO,,46.221389,8.519444,2207 +alps_6358,PILONE,,46.218333,8.532500,2192 +alps_6359,MONTE CASTELLO,,46.219167,8.486667,2141 +alps_6360,PIZZO ZUCCHERO,,46.219722,8.578056,1899 +alps_6361,MOTTO DEI CIAPITT,,46.221944,8.542778,2152 +alps_6362,MUNZELUM,,46.218056,8.550000,2061 +alps_6363,CRESTE,,46.223333,8.550278,2060 +alps_6364,MOTTONE,,46.213611,8.597222,1769 +alps_6365,ERGISCHALPHORN,,46.261944,7.739444,2849 +alps_6366,SIGNALHORN,,46.255556,7.746389,2911 +alps_6367,GOLDBIEL,,46.257222,7.843611,2125 +alps_6368,CHRIZER HORLINI,,46.261944,7.944444,2297 +alps_6369,GLISHORN,,46.283889,7.991667,2525 +alps_6370,FUELHORN,,46.276944,7.984722,2678 +alps_6371,SPITZHORLI,,46.264722,7.980556,2737 +alps_6372,AREZHORN,,46.263889,7.988333,2680 +alps_6373,TOCHUHORN,,46.256667,8.000833,2661 +alps_6374,STALDHORN,,46.262500,8.020556,2462 +alps_6375,WASENHORN,,46.266389,8.085556,3246 +alps_6376,ISENMEGG,,46.275556,8.084722,2713 +alps_6377,MADERLICKE,,46.258889,8.070833,2887 +alps_6378,MAEDERHORN,,46.258333,8.070556,2895 +alps_6379,HOHTURE,,46.277500,8.070000,2409 +alps_6380,BAERUFALLE,,46.279167,8.055556,2101 +alps_6381,CHASTELEGGA,,46.274167,8.059444,2269 +alps_6382,MONTE LEONE,,46.249444,8.110000,3553 +alps_6383,TUNNELSPITZ,,46.270556,8.094444,2903 +alps_6384,FURGGUBAEUM HORN,,46.279722,8.105278,2985 +alps_6385,CIMA VALLAPERTA,,46.285278,8.116944,2858 +alps_6386,BORTELHORN,,46.294722,8.125556,3193 +alps_6387,PUNTA TARAMONA,,46.289444,8.130833,2772 +alps_6388,SPITZHOERNLI,,46.285278,8.101111,2601 +alps_6389,CIMA DELLE PIODELLE,,46.297778,8.180000,3080 +alps_6390,PUNTA DI BOCCARECCHIO,,46.300278,8.199444,3207 +alps_6391,PIZZO DI BOCCARECCIO,,46.297778,8.202500,3027 +alps_6392,PIZZO MORO,,46.284444,8.194722,2948 +alps_6393,CIMA DI VALTENDRA,,46.273056,8.195556,2693 +alps_6394,PUNTA SALARIOLI,,46.270556,8.185278,2666 +alps_6395,PUNTA MAROR,,46.264722,8.168056,2323 +alps_6396,PIZZO DELLA SELLA,,46.268889,8.212222,2464 +alps_6397,PUNTA D'OROGNA,,46.285278,8.217222,2447 +alps_6398,MONTE CAZZOLA,,46.295000,8.237500,2330 +alps_6399,PIZZO DIEI,,46.264722,8.238056,2906 +alps_6400,CORNO CISTELLA,,46.255000,8.266389,2688 +alps_6401,MONTE CISTELLA,,46.258333,8.253611,2880 +alps_6402,PIZZO DEL BALZO,,46.255833,8.232222,2573 +alps_6403,MONTE FORNO,,46.295000,8.323889,2593 +alps_6404,LOCCIA DEL ROBBI,,46.288889,8.320556,2450 +alps_6405,PIZZO DEI CROSELLI,,46.284167,8.402500,2709 +alps_6406,PIZZO DI PIODA,,46.270278,8.391111,2678 +alps_6407,PIZZO DEL FORNO,,46.258333,8.388611,2695 +alps_6408,PIZZO DI BRONZO,,46.251111,8.385000,2502 +alps_6409,PIZZO QUADRO,,46.298333,8.427778,2792 +alps_6410,CORONA DI GROPPO,,46.298611,8.418056,2792 +alps_6411,TRAMALITT,,46.261389,8.448611,2395 +alps_6412,PIZZO DELLA CAVEGNA,,46.250000,8.474444,2280 +alps_6413,PIZZO DEL ALPE GELATO,,46.251667,8.443056,2613 +alps_6414,OM CUPIGN,,46.271389,8.500000,2219 +alps_6415,CIMA DI CREGNELL,,46.258611,8.518333,2528 +alps_6416,ROSSO DI RIBIA,,46.261111,8.529722,2541 +alps_6417,PIANCA,,46.253056,8.494444,2376 +alps_6418,PIZZO SASCOLA,,46.291389,8.565556,2057 +alps_6419,PIZZO ALZASCA,,46.277500,8.576111,2262 +alps_6420,PIZZO MEZZODI,,46.281667,8.562500,2223 +alps_6421,CIMA DI CATOEGN,,46.268333,8.555278,2398 +alps_6422,PIZZO MOLINERA,,46.267222,8.569167,2292 +alps_6423,CRAMALINA,,46.260833,8.599444,2168 +alps_6424,SALARIEL,,46.254444,8.554444,2316 +alps_6425,CHISTEHORN,,46.348056,7.784722,2785 +alps_6426,SCHWARZHORN,,46.348333,7.815556,2680 +alps_6427,WIWANNIHORN,,46.355000,7.856111,3001 +alps_6428,OEUGSTCHUMMUHORN,,46.348611,7.851389,2881 +alps_6429,GAERSTHORN,,46.346944,7.916667,2964 +alps_6430,FOGGENHORN,,46.352778,7.949444,2569 +alps_6431,GROSSE HUMETZ,,46.326389,8.086667,2923 +alps_6432,TUNNETSCH HORN,,46.333333,8.076944,2606 +alps_6433,FUELHORN,,46.322778,8.070556,2738 +alps_6434,FOLLUHORN,,46.320833,8.066389,2656 +alps_6435,HILLEHORN,,46.303056,8.140556,3181 +alps_6436,ROTHORN,,46.311667,8.130278,2813 +alps_6437,GIBELHORN,,46.317778,8.136667,2698 +alps_6438,CHRIESIHORN,,46.343333,8.090278,2535 +alps_6439,BAETTLIHORN,,46.332500,8.093889,2992 +alps_6440,MILIHORN,,46.338056,8.098889,2802 +alps_6441,LETIHORN,,46.342500,8.108333,2647 +alps_6442,WITENTIR,,46.323889,8.145833,2451 +alps_6443,BREITHORN,,46.355278,8.131667,2573 +alps_6444,GRAUS HORLI,,46.320833,8.094444,2613 +alps_6445,OBER BLATTHORN,,46.314722,8.113889,2756 +alps_6446,SEEMJIHORN,,46.314167,8.103056,2733 +alps_6447,STOCKHORN,,46.345833,8.214167,2612 +alps_6448,WANNIHORN,,46.329167,8.204722,2866 +alps_6449,FLESCHHORN,,46.333056,8.217222,3004 +alps_6450,VORDER HELSE,,46.314722,8.181944,3106 +alps_6451,GISCHIHORN,,46.316389,8.215000,3080 +alps_6452,PUNTA DEVERO,,46.320278,8.215278,3037 +alps_6453,HELSENHORN,,46.304722,8.191667,3272 +alps_6454,GUGLIE DI CORNERA,,46.301944,8.213333,2714 +alps_6455,ROTHORN,,46.340278,8.248611,2888 +alps_6456,GRAMPIELHORN,,46.345833,8.262778,2764 +alps_6457,PIZZO CRAMPIOLO,,46.339722,8.268611,2766 +alps_6458,PIZZO STANGE,,46.332500,8.269167,2415 +alps_6459,PUNTA MARANI,,46.334444,8.224167,3108 +alps_6460,PUNTA GERLA,,46.332778,8.225278,3087 +alps_6461,PUNTA CERVANDONE,,46.324167,8.223056,3210 +alps_6462,PIZZI DEL BUSIN,,46.350000,8.339167,2727 +alps_6463,PUNTA DELLA VALLE,,46.331111,8.326389,2667 +alps_6464,PUNTA DI TANZONIA,,46.332778,8.341944,2668 +alps_6465,PIZZO POJALA,,46.326111,8.343889,2773 +alps_6466,MONTE DEL SANGIATO,,46.314722,8.298889,2387 +alps_6467,MONTE CORBERNAS,,46.323611,8.308889,2578 +alps_6468,PIZZO TOPERA,,46.310556,8.331667,2480 +alps_6469,PIZZO MARTELLO,,46.348611,8.388333,2682 +alps_6470,PIZZO BIELA,,46.343889,8.464444,2856 +alps_6471,PIZZO STELLA,,46.328333,8.460000,2688 +alps_6472,RITZBERG,,46.319444,8.443611,2591 +alps_6473,BATNALL,,46.304167,8.440556,2748 +alps_6474,CORNO DI CRAMEC,,46.303333,8.415278,2729 +alps_6475,PIZZO D'ORSALIA,,46.339167,8.506667,2664 +alps_6476,STRAHLBANN,,46.341111,8.479722,2781 +alps_6477,CAMINO,,46.336111,8.522500,2489 +alps_6478,PIZZO D'ORSALIETTA,,46.343611,8.536111,2476 +alps_6479,PIZZO BOMBOGN,,46.304722,8.497222,2331 +alps_6480,MADONINO,,46.343056,8.570000,2121 +alps_6481,MADONE DI CAMEDO,,46.330556,8.563611,2445 +alps_6482,PIZZO DELLA ROSSA,,46.336667,8.550833,2482 +alps_6483,MADONINO,,46.333333,8.554722,2483 +alps_6484,ALPLIGHORN,,46.387500,7.736111,2329 +alps_6485,SCHWARZHORN,,46.391111,7.710556,2931 +alps_6486,RESTIROTHORN,,46.382500,7.702778,2969 +alps_6487,EINIGS ALICHJI,,46.361111,7.712500,2769 +alps_6488,FALDUMROTHORN,,46.365556,7.707222,2832 +alps_6489,LOICHERSPITZA,,46.373333,7.705000,2843 +alps_6490,FERDENROTHORN,,46.408333,7.707222,3180 +alps_6491,DRILLINGE,,46.364722,7.791111,3161 +alps_6492,STRAHLHORN,,46.367500,7.793056,3194 +alps_6493,HOGLEIFA,,46.370833,7.793333,3278 +alps_6494,CHASTLERHORN,,46.375556,7.796111,3185 +alps_6495,WILERHORN,,46.378611,7.810556,3307 +alps_6496,GLETSCHERHORN,,46.373889,7.814444,3222 +alps_6497,JOLIHORN,,46.370556,7.814167,3202 +alps_6498,JEGIHORN,,46.365278,7.817778,3077 +alps_6499,GROSSHORN,,46.358333,7.816111,2996 +alps_6500,WILERCHNUBEL,,46.390833,7.791944,2225 +alps_6501,GATTUNMANDLI,,46.379722,7.776944,2450 +alps_6502,SCHWARZHORN,,46.383333,7.813889,3126 +alps_6503,WANNIHORN,,46.363056,7.791667,3115 +alps_6504,JAEGIHORN,,46.400833,7.884167,3406 +alps_6505,AELWE RIGG,,46.405278,7.860000,3381 +alps_6506,BIETSCHHORN,,46.391667,7.850833,3934 +alps_6507,STOCKHORN,,46.382500,7.876944,3211 +alps_6508,TIEREGGHORN,,46.373056,7.859167,3075 +alps_6509,DUEBIHORN,,46.367500,7.856667,2983 +alps_6510,CHRUETIGHORN,,46.357778,7.853889,3020 +alps_6511,SCHAFBAERG,,46.390833,7.829444,3240 +alps_6512,KLEIN NESTHORN,,46.396667,7.840556,3336 +alps_6513,GRUEEBHORN,,46.393333,7.909167,3192 +alps_6514,HERDHORN,,46.389167,7.908611,3145 +alps_6515,STRAHLHORN,,46.386111,7.908056,3200 +alps_6516,ALPJUHORN,,46.367222,7.908611,3144 +alps_6517,SCHILTHORN,,46.360556,7.911944,3122 +alps_6518,UNTERBAECHHORN,,46.405556,7.939444,3554 +alps_6519,GAENDERHORN,,46.395833,7.937500,3293 +alps_6520,GRISIGHORN,,46.387500,7.939444,3177 +alps_6521,HOFATHORN,,46.374167,7.940000,2845 +alps_6522,HOHSTOCK,,46.406667,7.963333,3226 +alps_6523,SPARRHORN,,46.404444,7.983889,3021 +alps_6524,RIEDERHORN,,46.371389,8.016111,2230 +alps_6525,BREITHORN,,46.356667,8.138611,2599 +alps_6526,EGGERHORN,,46.383333,8.183611,2503 +alps_6527,GROSSES FULHORN,,46.388333,8.211111,2678 +alps_6528,HOLZJIHORN,,46.403889,8.248333,2986 +alps_6529,TURBECHEPF,,46.402500,8.265833,3007 +alps_6530,HOLZERSPITZ,,46.392222,8.252222,2656 +alps_6531,BOCHTEHORN,,46.366944,8.272778,2770 +alps_6532,GROSSES SCHINHORN,,46.361111,8.261111,2939 +alps_6533,KLEINES SCHINHORN,,46.363056,8.263056,2917 +alps_6534,TURBHORN,,46.408056,8.280278,3245 +alps_6535,ALBRUNHORN,,46.363611,8.283333,2885 +alps_6536,STRAHLGRAT,,46.407222,8.291389,3204 +alps_6537,HOHSANDHORN,,46.403889,8.309722,3182 +alps_6538,PUNTA LEBENDUN,,46.398056,8.342778,2935 +alps_6539,TORRI DEL VANNINO,,46.389444,8.337778,2840 +alps_6540,OFENHORN,,46.386389,8.318611,3235 +alps_6541,CIMA CUST,,46.381389,8.321389,3045 +alps_6542,PUNTE DEL FORNO,,46.375278,8.329444,2903 +alps_6543,PUNTA DI CURZALMA,,46.372500,8.335556,2720 +alps_6544,PUNTA DELLA SCATTA,,46.369167,8.340833,2720 +alps_6545,MONTE MINOIA,,46.362778,8.341111,2800 +alps_6546,PIZZI DELLA SATTA,,46.357500,8.346667,2830 +alps_6547,PIZZO DEL COSTONE,,46.401111,8.351111,2950 +alps_6548,PUNTA DEL GHIACCIO DEL BAN,,46.400000,8.357778,2975 +alps_6549,CORNI DI NEFELGIU,,46.395556,8.379444,2951 +alps_6550,CIMA DELLA FREGHERA,,46.388611,8.393333,2726 +alps_6551,PUNTA CLOGSTAFEL,,46.367222,8.379444,2967 +alps_6552,MONTE GIOVE,,46.361389,8.388056,3009 +alps_6553,TAMIERHORN,,46.404444,8.463611,3087 +alps_6554,PIZZO MEDOLA,,46.395833,8.471111,2957 +alps_6555,KALBERHORN,,46.386389,8.460833,2805 +alps_6556,PIZZO FIORERA,,46.377500,8.466667,2921 +alps_6557,PIZZO CAZZOLA,,46.358333,8.464722,2756 +alps_6558,PIZZO SOLOEGNA,,46.380556,8.496667,2697 +alps_6559,PIZZO MALORA,,46.383611,8.588056,2640 +alps_6560,PIZZO ROSSO,,46.386111,8.607222,2498 +alps_6561,PIZZO D'OGLIE,,46.390556,8.574167,2604 +alps_6562,PIZZO DELLA CAZZANA,,46.353056,8.545833,2349 +alps_6563,HOCKENHORN,,46.428333,7.744167,3293 +alps_6564,BIRGHORN,,46.453056,7.789167,3243 +alps_6565,ELWERTAETSCH,,46.447222,7.780556,3211 +alps_6566,TELLSPITZA,,46.451389,7.816667,3082 +alps_6567,SACKHORN,,46.440000,7.766111,3212 +alps_6568,TENNBACHHORN,,46.435278,7.786667,3013 +alps_6569,BREITHORN,,46.418889,7.893889,3785 +alps_6570,TYFELSGRAT,,46.415000,7.884722,3624 +alps_6571,BREITLAUIHORN,,46.412778,7.881389,3655 +alps_6572,CHRINDELSPITZA,,46.453056,7.844167,3017 +alps_6573,NESTHORN,,46.413333,7.926111,3824 +alps_6574,SCHINHORN,,46.451667,7.946667,3797 +alps_6575,WYSSHORN,,46.446111,7.953611,3625 +alps_6576,TORBERG,,46.428889,7.956389,3023 +alps_6577,DISTLIGHORN,,46.455556,7.949167,3716 +alps_6578,BEICHGRAT,,46.440556,7.928611,3292 +alps_6579,WYSSHORN,,46.443333,7.954444,3542 +alps_6580,LONZAHOERNER,,46.423889,7.904167,3560 +alps_6581,BREITHORN,,46.418889,7.893889,3785 +alps_6582,GEISSHORN,,46.441111,8.005556,3740 +alps_6583,SATTELHORN,,46.443611,8.007778,3724 +alps_6584,ROTSTOCK,,46.435278,8.001667,3701 +alps_6585,GROSS FUSSHORN,,46.430556,7.997778,3627 +alps_6586,DISTELBERG,,46.441111,7.968611,3127 +alps_6587,OLMENHORN,,46.453889,8.052222,3314 +alps_6588,ZENBAECHENHORN,,46.439444,8.028056,3386 +alps_6589,BETTMERHORN,,46.414444,8.080278,2857 +alps_6590,RISIHORN,,46.463056,8.154167,2875 +alps_6591,EGGISHORN,,46.431389,8.094167,2927 +alps_6592,STRAHLHORN,,46.451111,8.095000,3026 +alps_6593,CHUMMEHORN,,46.424167,8.252500,2774 +alps_6594,RAPPEHORN,,46.415000,8.267500,3158 +alps_6595,OBER RAPPEHORN,,46.410556,8.269722,3176 +alps_6596,STOCKJI,,46.456389,8.291389,2602 +alps_6597,RITZBERGE,,46.454722,8.318889,2863 +alps_6598,RITZHOERNER,,46.450556,8.329722,3047 +alps_6599,MEREZEBACHSCHIJE,,46.439167,8.309167,3182 +alps_6600,BLINNENHORN,,46.425833,8.307778,3374 +alps_6601,ROTHORN,,46.428333,8.328056,3287 +alps_6602,FUELHORN,,46.459167,8.352778,2864 +alps_6603,KLEINES GRIESHORN,,46.452222,8.384722,2929 +alps_6604,GRIESHORN,,46.451389,8.393056,2969 +alps_6605,ROTENTALHORN,,46.454722,8.402222,2968 +alps_6606,CORNO MUTT,,46.446667,8.408611,2782 +alps_6607,CORNO BRUNNI,,46.445833,8.398333,2862 +alps_6608,PUNTA DELLA SABBIA,,46.420556,8.362222,2957 +alps_6609,PUNTA DI MORASCO,,46.415000,8.374722,2831 +alps_6610,GEMELLI DI BAN,,46.411389,8.361944,2949 +alps_6611,PIZZO DEL VALLONE,,46.414444,8.360278,2914 +alps_6612,BAETTELMATTHORN,,46.441389,8.351111,3044 +alps_6613,HELGENHORN,,46.458611,8.415000,2837 +alps_6614,PIZZO SAN GIACOMO,,46.455556,8.467778,2924 +alps_6615,MARCHHORN,,46.448611,8.462500,2962 +alps_6616,PIZZO FIORINA,,46.443889,8.465556,2925 +alps_6617,KASTELHORN,,46.422222,8.457500,3128 +alps_6618,PIZZO CAVERGNO,,46.415556,8.465556,3223 +alps_6619,BASODINO,,46.411389,8.468611,3274 +alps_6620,PIZZO CAVAGNOEOE,,46.459444,8.484722,2836 +alps_6621,PONCIONE DI BRAGA,,46.434444,8.543056,2864 +alps_6622,PIZZO DELL'ARZO,,46.446111,8.493056,2755 +alps_6623,CAVALLO DEL TORO,,46.451389,8.557222,2710 +alps_6624,MOTTONE,,46.442222,8.546667,2812 +alps_6625,PULPITO,,46.423611,8.547500,2616 +alps_6626,PIZZO CASTELLO,,46.415556,8.565278,2808 +alps_6627,PIZZO DEI FOIOI,,46.410000,8.563333,2628 +alps_6628,FRUENDENHORN,,46.476667,7.757500,3368 +alps_6629,BUNDSTOCK,,46.517222,7.749167,2756 +alps_6630,SCHWARZHORN,,46.515833,7.762500,2786 +alps_6631,DOLDENHORN,,46.468889,7.734722,3643 +alps_6632,ZALLERSHORN,,46.515833,7.709444,2743 +alps_6633,BLUEMLISALP ROTHORN,,46.495000,7.763056,3297 +alps_6634,FISISTOCK,,46.473611,7.704167,2946 +alps_6635,MUTTHORN,,46.488889,7.823056,3034 +alps_6636,GSPALTENHORN,,46.511667,7.827500,3436 +alps_6637,WYSSI FRAU,,46.492778,7.783889,3650 +alps_6638,WILDI FRAU,,46.503889,7.780000,3274 +alps_6639,UFEM STOCK,,46.500556,7.771944,3221 +alps_6640,OESCHINENHORN,,46.483889,7.767222,3486 +alps_6641,BLUEMLISALP,,46.488889,7.772500,3663 +alps_6642,MORGENHORN,,46.495278,7.792222,3627 +alps_6643,BUETLASSE,,46.518611,7.820000,3192 +alps_6644,ZUCKERSTOCK,,46.483333,7.891111,3386 +alps_6645,BREITHORN,,46.478611,7.876667,3785 +alps_6646,WAERMIETEHOREN,,46.488889,7.883889,2849 +alps_6647,ELLSTABHORN,,46.517500,7.863333,2883 +alps_6648,TSCHINGELHORN,,46.478889,7.848056,3576 +alps_6649,TSCHINGELSPITZ,,46.511111,7.839722,3323 +alps_6650,ANUCHNUBEL,,46.479722,7.949444,3591 +alps_6651,AEBENI FLUE,,46.508056,7.953333,3962 +alps_6652,MITTAGHORN,,46.498333,7.932500,3897 +alps_6653,JEGICHNUBEL,,46.468889,7.911389,3124 +alps_6654,GROSSHORN,,46.486944,7.910000,3754 +alps_6655,ANUNGRAT,,46.486667,7.939444,3714 +alps_6656,SATTELHORN,,46.467500,7.964167,3741 +alps_6657,KLEINES ALETSCHHORN,,46.467500,7.976944,3755 +alps_6658,GLETSCHERHORN,,46.512778,7.967778,3983 +alps_6659,ALETSCHHORN,,46.465000,7.993889,4195 +alps_6660,DREIECKHORN,,46.478056,8.020000,3811 +alps_6661,KLEINES DREIECKHORN,,46.468889,8.034167,3639 +alps_6662,FULBAERG,,46.501111,8.059722,3243 +alps_6663,CHAMM,,46.501944,8.078889,3866 +alps_6664,WYSSNOLLEN,,46.509444,8.088333,3595 +alps_6665,FIESCHER GABELHORN,,46.502500,8.084167,3876 +alps_6666,SCHOENBUEHLHORN,,46.498333,8.091111,3854 +alps_6667,SENFSPITZE,,46.473611,8.100556,3354 +alps_6668,KLEIN WANNENHORN,,46.483611,8.104722,3707 +alps_6669,GROSS WANNENHORN,,46.493889,8.096944,3906 +alps_6670,VORDER GALMIHORN,,46.506667,8.184444,3517 +alps_6671,WASENHORN,,46.497778,8.165556,3447 +alps_6672,SETZEHORN,,46.476111,8.160556,3061 +alps_6673,HINTER GALMIHORN,,46.512778,8.188611,3486 +alps_6674,GRAUHORN,,46.511111,8.218611,2894 +alps_6675,FIREHORN,,46.506111,8.203611,3182 +alps_6676,UNNERE STOCK,,46.515833,8.249722,2671 +alps_6677,FURGG ELTI,,46.500278,8.230556,2552 +alps_6678,CHLY CHASTELHORN,,46.493333,8.221667,2683 +alps_6679,MOSSMATTE STOCK,,46.480833,8.318333,2475 +alps_6680,UNNER CHIETALNOLLE,,46.490000,8.338889,2257 +alps_6681,MURMETEBAERGE,,46.487222,8.340556,2347 +alps_6682,CHIETALSTOCK,,46.485278,8.325000,2328 +alps_6683,CHIETALNOLLEN,,46.482500,8.341667,2467 +alps_6684,TELTSCHEHORN,,46.473611,8.328611,2743 +alps_6685,BRUDELHORN,,46.467778,8.311111,2791 +alps_6686,PIZZO GALLINA,,46.494722,8.391944,3061 +alps_6687,BLASHORN,,46.500000,8.366944,2777 +alps_6688,HAMMER,,46.489444,8.379167,2747 +alps_6689,CHILCHHORN,,46.485278,8.394722,2789 +alps_6690,METTLIHORN,,46.502222,8.411111,2759 +alps_6691,NUFENENSTOCK,,46.466944,8.388056,2866 +alps_6692,BALMENRITZ,,46.508611,8.388611,2433 +alps_6693,HOLLECHT,,46.507500,8.360556,2355 +alps_6694,HOREBODE,,46.501111,8.360000,2570 +alps_6695,MITTAGHORN,,46.496389,8.385278,3015 +alps_6696,PIZZO NERO,,46.492500,8.411111,2904 +alps_6697,RAEMINISTAFEL,,46.477778,8.351111,2474 +alps_6698,ALTSTAFEL,,46.470833,8.373333,2147 +alps_6699,SCAGLIA DI CORNO,,46.469444,8.403611,2641 +alps_6700,CASSINA BAGGIO,,46.500278,8.452500,2860 +alps_6701,FORCELLA,,46.491944,8.419444,2840 +alps_6702,PUNTE DI MANIO,,46.496944,8.436111,2925 +alps_6703,CHUEBODENHORN,,46.508056,8.453056,3070 +alps_6704,PONCIONE DI RUINO,,46.512778,8.468611,2965 +alps_6705,PASSO DI ROTONDO,,46.511944,8.461111,2764 +alps_6706,ALL'UOMO,,46.469167,8.461944,2241 +alps_6707,PIZZO FOLCRA,,46.485556,8.535000,2662 +alps_6708,PIZZO GARARESC,,46.479167,8.526667,2729 +alps_6709,CRISTALLINA,,46.464722,8.536667,2911 +alps_6710,CRESTA DEL CORO,,46.460556,8.531389,2814 +alps_6711,PIZZO GRANDINAGIA,,46.463333,8.484444,2774 +alps_6712,PONCIONE CAVAGNOLO,,46.466667,8.497500,2821 +alps_6713,PONCIONE DI VALLEGGIA,,46.465000,8.499167,2873 +alps_6714,CIMA DI LAGO,,46.466389,8.509167,2832 +alps_6715,PONCIONE VAL PIANA,,46.473056,8.501111,2660 +alps_6716,CROSINO,,46.482500,8.500556,2252 +alps_6717,PUNCIONE DELLA FORCA DI CRISTALLINA,,46.470278,8.533611,2792 +alps_6718,IL MADONE,,46.491944,8.558889,2756 +alps_6719,PUNTE DELLA BOLLA,,46.466667,8.594722,2616 +alps_6720,SASSO NERO,,46.467222,8.560278,2486 +alps_6721,L'UOMO,,46.510556,8.591667,1979 +alps_6722,MOTTONE,,46.510278,8.600833,1939 +alps_6723,MOTTONE DI COMASNE,,46.506667,8.592222,2090 +alps_6724,MOTTO DEL TORO,,46.509167,8.576667,2049 +alps_6725,MOTTO DI PIAN PIZZO,,46.506667,8.578056,2170 +alps_6726,SELLA DI SOPRA,,46.500833,8.554444,2248 +alps_6727,PUNTE DI VESPERO,,46.499722,8.581111,2717 +alps_6728,PIZZO DI MEZZODI,,46.500000,8.602222,2653 +alps_6729,PIZZO SELLA,,46.497222,8.555556,2516 +alps_6730,IL FORNO,,46.499444,8.554167,2320 +alps_6731,CAMPANILE,,46.491944,8.566944,2768 +alps_6732,PIZZO DEL NARET,,46.476944,8.553611,2585 +alps_6733,PIZZO DEL LAGO SCURO,,46.470000,8.575556,2648 +alps_6734,ZOTTA,,46.463056,8.570556,2119 +alps_6735,GOLDEREHORN,,46.568889,7.749167,1918 +alps_6736,DUENDENHORN,,46.520278,7.729444,2862 +alps_6737,SALZHORN,,46.528889,7.721667,2570 +alps_6738,AERMIGHORN,,46.541667,7.713333,2742 +alps_6739,NOLLE,,46.567778,7.712500,2059 +alps_6740,AERMIGCHNUBEL,,46.548889,7.705278,2412 +alps_6741,VORDERI BUETLASSE,,46.525278,7.819722,3063 +alps_6742,CHILCHFLUE,,46.561667,7.818611,2833 +alps_6743,WILD ANDRIST,,46.547778,7.797222,2849 +alps_6744,HUNDSHORN,,46.542778,7.806111,2929 +alps_6745,HUNDSFLUE,,46.538889,7.810833,2860 +alps_6746,ZAHM ANDRIST,,46.553333,7.787778,2681 +alps_6747,SCHWARZBIRG,,46.563889,7.846389,2790 +alps_6748,SCHILTHORN,,46.557222,7.835278,2970 +alps_6749,BIRG,,46.561667,7.857500,2677 +alps_6750,SPITZHORN,,46.526111,7.885278,2210 +alps_6751,GHUDELHOREN,,46.523333,7.863611,2425 +alps_6752,GOLDENHORN,,46.540833,7.945278,3643 +alps_6753,SILBERHORN,,46.542222,7.948889,3695 +alps_6754,ROTBRATTHOREN,,46.549722,7.932222,2720 +alps_6755,FELLENBERGFLIELI,,46.542778,7.938889,3386 +alps_6756,SCHWARZMOENCH,,46.552778,7.924444,2648 +alps_6757,TRUGBERG,,46.546667,8.015278,3933 +alps_6758,KLEIN EIGER,,46.571389,7.995833,3472 +alps_6759,MOENCH,,46.558333,7.997222,4099 +alps_6760,SPHINX,,46.547500,7.985000,3569 +alps_6761,SCHNEEHORN,,46.549167,7.961944,3406 +alps_6762,JUNGFRAU,,46.536667,7.962500,4158 +alps_6763,ROTTALHORN,,46.531944,7.967222,3975 +alps_6764,LOUWIHORN,,46.527222,7.968889,3770 +alps_6765,KRANZBERG,,46.522222,7.980556,3742 +alps_6766,GRUNHORNLI,,46.518056,8.081667,3594 +alps_6767,GRUNEGGHORN,,46.526389,8.073889,3860 +alps_6768,KLEIN GRUNHORN,,46.536667,8.074167,3913 +alps_6769,GROSS GRUNHORN,,46.531944,8.077778,4043 +alps_6770,KLEIN FIESCHERHORN,,46.555556,8.075833,3899 +alps_6771,GROSS FIESCHERHORN,,46.551389,8.061389,4043 +alps_6772,WALCHERHORN,,46.560000,8.035000,3692 +alps_6773,HINTER FIESCHERHORN,,46.546389,8.067500,4025 +alps_6774,FINSTERAARROTHORN,,46.517778,8.148333,3530 +alps_6775,STUDERHORN,,46.532778,8.147778,3638 +alps_6776,LAUTERAAR ROTHORNER,,46.567222,8.153611,3473 +alps_6777,NASSE STRAHLEGG,,46.554167,8.131667,3482 +alps_6778,FINSTERAARHORN,,46.537222,8.126111,4274 +alps_6779,AGASSIZHORN,,46.546667,8.114444,3953 +alps_6780,ALTMANN,,46.531944,8.163889,3468 +alps_6781,OBERAARHORN,,46.531389,8.174167,3637 +alps_6782,SCHEUCHZERHORN,,46.543889,8.190278,3462 +alps_6783,ESCHERHORN,,46.557778,8.196944,3078 +alps_6784,OBERAARROTHORN,,46.520278,8.180556,3477 +alps_6785,HINTER TIERBERG,,46.547222,8.213333,3205 +alps_6786,ROOSSEHOERNER,,46.525833,8.215278,3111 +alps_6787,TALSCHIEN,,46.526389,8.227778,3040 +alps_6788,LOEFFELHORN,,46.526944,8.236944,3095 +alps_6789,GROSS SIDELHORN,,46.541111,8.285556,2879 +alps_6790,VORDER TIERBERG,,46.550000,8.228611,3111 +alps_6791,BAREGG,,46.550833,8.282500,2498 +alps_6792,HINTERER ZINGGENSTOCK,,46.552778,8.240556,3041 +alps_6793,VORDERER ZINGGENSTOCK,,46.554444,8.258056,2915 +alps_6794,UELISTOCK,,46.535000,8.270000,2886 +alps_6795,SIDELHORN,,46.552500,8.312778,2764 +alps_6796,TAELLISTOCK,,46.551389,8.403889,2875 +alps_6797,TAELLIGRAT,,46.547500,8.392778,2628 +alps_6798,STOTZIG MUTTERHORN,,46.537500,8.443611,3062 +alps_6799,GROSS MUTTERHORN,,46.546667,8.427222,3099 +alps_6800,GROSS LECKINHORN,,46.535833,8.464167,3065 +alps_6801,CHLI LECKINHORN,,46.533611,8.467222,3023 +alps_6802,PIZZO ROTONDO,,46.517500,8.466111,3192 +alps_6803,SAASHOERNER,,46.526111,8.431944,3036 +alps_6804,GRIEGUFER GRAT,,46.563056,8.420000,2838 +alps_6805,MUTTENSTOECK,,46.549444,8.438056,2611 +alps_6806,ROTAELLIHORN,,46.542222,8.466111,2913 +alps_6807,CHLI MUTTENHORN,,46.541944,8.434167,3024 +alps_6808,STELLI BODENHORN,,46.540000,8.462500,2988 +alps_6809,WITEN WASSEREN STOCK,,46.528611,8.473611,3082 +alps_6810,PIZZO PESCIORA,,46.524722,8.477500,3122 +alps_6811,GERENHORN,,46.523333,8.472778,3078 +alps_6812,ABENDWEIDLI,,46.565278,8.485556,2167 +alps_6813,OBER CHAESEREN,,46.567222,8.496111,2003 +alps_6814,PIZZO DELL UOMO,,46.566944,8.521111,2685 +alps_6815,SUNNSBIEL,,46.562222,8.497778,2078 +alps_6816,SIWERBEN HORN,,46.559167,8.513611,2764 +alps_6817,TAELLIGRAT,,46.548611,8.481944,2748 +alps_6818,STEGENHORN,,46.548611,8.515833,2821 +alps_6819,PIZZO DELLA VALLETTA,,46.547500,8.538333,2720 +alps_6820,PIZZO LUCENDRO,,46.538889,8.519444,2963 +alps_6821,CRESTA DEL PONCIONETTO,,46.538056,8.529444,2662 +alps_6822,RONGGERGRAT,,46.535000,8.500833,2765 +alps_6823,HUENERSTOCK,,46.532222,8.483056,2889 +alps_6824,PONCIONETTO,,46.525278,8.501944,2472 +alps_6825,MONTE PROSA,,46.561944,8.582500,2723 +alps_6826,PIZZO CANARISCCIO,,46.551389,8.606111,2523 +alps_6827,FIBBIA,,46.542778,8.547500,2739 +alps_6828,AULA,,46.180556,8.650833,1417 +alps_6829,PIZZO LEONE,,46.140833,8.676944,1660 +alps_6830,MATRO,,46.135833,8.978611,1198 +alps_6831,PIZZO DI CORGELLA,,46.147500,9.031389,1703 +alps_6832,CIMA CALESCIO,,46.134722,9.051111,2034 +alps_6833,SCRIGNO DI POLTRINONE,,46.150000,9.101111,1956 +alps_6834,MOTTONE DELLA TAPPA,,46.131944,9.105278,2130 +alps_6835,CAMOGHE,,46.135000,9.064167,2227 +alps_6836,CIMA DELLE CICOGNE,,46.178611,9.139444,2201 +alps_6837,CIMA DI CUGN,,46.170833,9.161111,2237 +alps_6838,MARMONTANA,,46.171944,9.170556,2316 +alps_6839,MONTE ALBANO,,46.153611,9.135278,2027 +alps_6840,CIMA VERTA,,46.134722,9.121389,2078 +alps_6841,MOTTO DI PARAONE,,46.151944,9.185833,1809 +alps_6842,TORESELLA,,46.178611,9.193889,2245 +alps_6843,MONTE CORTAFON,,46.147778,9.216389,1668 +alps_6844,PIZZO PELOSO,,46.231111,8.649444,2064 +alps_6845,SALMONE,,46.209444,8.706944,1560 +alps_6846,PIZZO DI CORBE,,46.238889,8.797500,2066 +alps_6847,CIMA DELLA TROSA,,46.210278,8.790556,1869 +alps_6848,MADONE,,46.222500,8.800278,2039 +alps_6849,PIZZO DI VOGORNO,,46.239722,8.893056,2442 +alps_6850,MADONE,,46.238611,8.916944,2395 +alps_6851,CIMA DI SASSELLO,,46.207500,8.905833,1891 +alps_6852,CIMA DELL'UOMO,,46.233056,8.938333,2390 +alps_6853,GAGGIO,,46.231667,8.964167,2267 +alps_6854,MOTTO D'ARBINO,,46.188611,9.072222,1695 +alps_6855,SASSO DELLA GUARDIA,,46.219722,9.183056,2093 +alps_6856,CORNO DI GESERO,,46.185556,9.131389,2227 +alps_6857,SASS MOGN,,46.233889,9.209167,2440 +alps_6858,PIZZO PAGLIA,,46.231667,9.219167,2593 +alps_6859,MATER DI PAIA,,46.223889,9.222778,2482 +alps_6860,PIZZO MARTEL,,46.233056,9.237778,2450 +alps_6861,PIZZO CAMPANILE,,46.232222,9.245833,2458 +alps_6862,CRESTA GRATELLA,,46.221667,9.249722,2165 +alps_6863,CARDINELLO,,46.210833,9.214167,2520 +alps_6864,CIMA DELLO STAGN,,46.208611,9.201944,2382 +alps_6865,PIZZO SAN PIO,,46.232778,9.262778,2304 +alps_6866,MONTE L'USCIOLO,,46.206944,9.274722,2146 +alps_6867,MONTE DURIA,,46.202778,9.259167,2264 +alps_6868,PIZZO CRAMALINA,,46.255278,8.623889,2322 +alps_6869,PIZZO MORISCIOEI,,46.283889,8.715556,2065 +alps_6870,PIZZO COSTISC,,46.281944,8.753333,2244 +alps_6871,CIMA DEL MASNEE,,46.278333,8.765556,2203 +alps_6872,PIZZO DROMEGIO,,46.292500,8.740278,2231 +alps_6873,MADOM DA SGIOF,,46.268056,8.776111,2265 +alps_6874,CIMA DI NIMI,,46.259167,8.772778,2191 +alps_6875,PIZZO D'ORGNANA,,46.245556,8.790556,2218 +alps_6876,PONCIONE D'ALNASCA,,46.292222,8.823611,2301 +alps_6877,FOEPIA,,46.279167,8.832778,2106 +alps_6878,MATARELLO,,46.292778,8.866389,2173 +alps_6879,CIMA DI PRECASTELLO,,46.285833,8.906111,2359 +alps_6880,PONCIONE DEI LAGHETTI,,46.272500,8.911667,2445 +alps_6881,CIMA DEL PICOLL,,46.269444,8.913333,2440 +alps_6882,PONCIONE DEL VENN,,46.274444,8.906944,2477 +alps_6883,CIMA PIANCA,,46.269722,8.891667,2245 +alps_6884,PIZZO D'EUS,,46.266667,8.866944,1729 +alps_6885,CIMA DEL SCENGIO DELLE PECORE,,46.262778,8.911944,2394 +alps_6886,PONCIONE DI PIOTTA,,46.253889,8.924444,2439 +alps_6887,CIMA DI VISGHED,,46.274444,8.960556,1923 +alps_6888,FILO DELLE LETTERE,,46.256111,8.935556,2115 +alps_6889,PIZ DE MOLINERA,,46.269167,9.069722,2288 +alps_6890,PIZ DI RENTEN,,46.282500,9.134444,2000 +alps_6891,PIZ CROCH,,46.278611,9.213611,2377 +alps_6892,SASS CASTEL,,46.280833,9.222778,2516 +alps_6893,PIZ DE CRESSIM,,46.266389,9.250556,2575 +alps_6894,IL PIZZET,,46.252500,9.210000,2216 +alps_6895,FIL DE SAMBROG,,46.262778,9.253056,2416 +alps_6896,PIZ DE SAMBROG,,46.255833,9.248889,2312 +alps_6897,PIZ D'URIA,,46.247222,9.248333,2287 +alps_6898,PIZZO D'AGNON,,46.243056,9.217778,2208 +alps_6899,TORRION,,46.241389,9.197500,2029 +alps_6900,PIZZO DI SAGGIOLO DI DENTRO,,46.278333,9.258889,2565 +alps_6901,PIZZO DE LA PIODELLA,,46.283889,9.269167,2397 +alps_6902,PIZZO DELLA PIAZZA,,46.280000,9.283333,2238 +alps_6903,MOTTI PELATI,,46.251389,9.283889,2122 +alps_6904,PIZZO CAVREGASCO,,46.239444,9.276111,2535 +alps_6905,SASSO BELLO,,46.324722,8.663611,2295 +alps_6906,PUNTA DI SPLUGA,,46.320833,8.663889,2251 +alps_6907,PONCIONE PIANCASCIA,,46.298611,8.733611,2360 +alps_6908,PIZZO DEI CHENT,,46.346944,8.693889,2444 +alps_6909,PIZZO DELL COCCO,,46.333889,8.690833,2339 +alps_6910,CIMA DI BROGLIO,,46.330278,8.683611,2385 +alps_6911,PIZZO DELLE PECORE,,46.324722,8.681389,2381 +alps_6912,RASIVA,,46.335556,8.730556,2684 +alps_6913,PIZZO MURETTO,,46.311111,8.705556,2257 +alps_6914,PIZZO COCA,,46.307500,8.698333,2222 +alps_6915,CIMA DI CARDED,,46.340833,8.751389,2230 +alps_6916,SGEMOEGNA,,46.335278,8.741111,2544 +alps_6917,CIMA DI CAZZAI,,46.326389,8.763889,2435 +alps_6918,SASSO ROSSO,,46.327500,8.750833,2448 +alps_6919,PONCIONE DELLA MARCIA,,46.319444,8.766111,2454 +alps_6920,CIMA D'EFRA,,46.345833,8.862500,2577 +alps_6921,CIMA DI GAGNONE,,46.326944,8.846944,2518 +alps_6922,SCAIEE,,46.330000,8.837222,2457 +alps_6923,PIZZO DEL MOTTO,,46.312778,8.836944,2373 +alps_6924,PIZZO DEL RABBIOSO,,46.304722,8.828611,2267 +alps_6925,PIZZO RICUCA,,46.329722,8.919722,2279 +alps_6926,CIMA DI PIATTO,,46.325278,8.915833,2262 +alps_6927,CIMA DI RIERNA,,46.320278,8.871667,2461 +alps_6928,CIMA DI STUELL,,46.301667,8.926389,2311 +alps_6929,PONCIONE ROSSO,,46.299167,8.911667,2505 +alps_6930,CIMA LUNGA,,46.307500,8.898889,2488 +alps_6931,CIMA DI BRI,,46.305000,8.884167,2520 +alps_6932,CIMA DI NEGROES,,46.303611,8.938889,2182 +alps_6933,CIMA DI BIASCA,,46.346111,9.022500,2574 +alps_6934,MASNAN,,46.342222,9.011389,2505 +alps_6935,CIMA DI MUESCIOI,,46.343056,9.036111,2503 +alps_6936,TORRONE DELLA MOTTA,,46.345556,9.052222,2820 +alps_6937,CIMA DI PIANCRA BELLA,,46.324167,9.049167,2383 +alps_6938,MOTTALE,,46.320000,9.031667,2169 +alps_6939,STEGNONE,,46.314722,9.024444,2027 +alps_6940,PIZZO DI CLARO,,46.296111,9.055556,2727 +alps_6941,CIMA CIOLTRO,,46.310000,9.015556,1847 +alps_6942,TORRONE ALTO,,46.343611,9.071111,2950 +alps_6943,CIMA D'OERZ,,46.336389,9.066389,2706 +alps_6944,PIZZO DI CAMPEDELL,,46.324167,9.065833,2724 +alps_6945,FORCEL,,46.316667,9.083611,2578 +alps_6946,MOTTONE,,46.313056,9.074722,2692 +alps_6947,TORRONE ROSSO,,46.300833,9.063056,2670 +alps_6948,CIMA DI NOMNOM,,46.340278,9.157778,2633 +alps_6949,PIZ DE GROVEN,,46.318333,9.159167,2694 +alps_6950,PIZZO DELLA MOLERA,,46.311111,9.148611,2603 +alps_6951,PIZ DI RUESS,,46.296111,9.146111,2247 +alps_6952,PIZ STABIUCH,,46.337500,9.250000,2177 +alps_6953,SCIMA DI LAGHIT,,46.296944,9.251944,2308 +alps_6954,PIZZO DE CAMPEL,,46.331944,9.261944,2376 +alps_6955,PIZZO CAMPANIN,,46.338333,9.293611,2653 +alps_6956,PIZASC,,46.327222,9.299167,2591 +alps_6957,PIZZO DELLA FORCOLA,,46.316389,9.293611,2675 +alps_6958,PIZZO PADION,,46.314444,9.285000,2631 +alps_6959,PIZ DE SETAG,,46.296944,9.284722,2459 +alps_6960,PIZZO DI SETAGGIOLO,,46.289167,9.271944,2393 +alps_6961,PIZ DE SETAG,,46.295278,9.280833,2476 +alps_6962,PIZZO DELLA VENNA NUOVA,,46.393611,8.611389,2245 +alps_6963,PIZZO DI BRUENESC,,46.379167,8.617500,2429 +alps_6964,PIZZO PARAULA,,46.368611,8.608889,2282 +alps_6965,SASSO DI LARECC,,46.394167,8.715556,2322 +alps_6966,MADAS,,46.385000,8.732222,2739 +alps_6967,CORONA DI REDORTA,,46.375556,8.732222,2804 +alps_6968,MONTE ZUCCHERO,,46.354167,8.714167,2735 +alps_6969,TRIANGOLINO,,46.359167,8.711667,2591 +alps_6970,PIZZO VAL MALA,,46.356111,8.685000,2271 +alps_6971,SCINGHIGN,,46.401389,8.739167,2801 +alps_6972,PIZZO DI PIANCOI,,46.398333,8.760833,2769 +alps_6973,PIZZO DELLA BEDEIA,,46.395833,8.770000,2666 +alps_6974,PIZZO DEI LAGHETTI,,46.393611,8.787500,2443 +alps_6975,CIMA DI CAGNOI,,46.368611,8.766111,2545 +alps_6976,PONCIONE CROARA,,46.393611,8.815000,2574 +alps_6977,CIMA BIANCA,,46.387778,8.812222,2612 +alps_6978,CIMA DI PIATEGN,,46.383611,8.842778,2476 +alps_6979,PIZZO DI MEZZODI,,46.378333,8.829444,2708 +alps_6980,MADOM GROESS,,46.366667,8.831111,2741 +alps_6981,PIZZO CRAMOSINO,,46.363056,8.843056,2718 +alps_6982,CIMA DI PARTEUS,,46.365000,8.857500,2459 +alps_6983,CIMA DI NEDRO,,46.355000,8.850833,2620 +alps_6984,CIMA DI NEDRO,,46.352778,8.851667,2622 +alps_6985,FOPP,,46.371111,8.868333,2254 +alps_6986,PIZZO PIAN FORNO,,46.351389,8.885556,2303 +alps_6987,BIASAGN,,46.400000,9.030278,2417 +alps_6988,PIZZO MAGN,,46.361389,9.008611,2329 +alps_6989,PIZ DI STREGA,,46.388889,9.087222,2911 +alps_6990,PIZZO BEDENSC,,46.367222,9.070000,2265 +alps_6991,PIZ RED,,46.367500,9.092778,2445 +alps_6992,PIZ DA TERMIN,,46.348889,9.081944,2899 +alps_6993,FIL DE CIAR,,46.385000,9.145556,2453 +alps_6994,PIZ DEL ROMONTON,,46.380833,9.141111,2214 +alps_6995,PIZ DEL LARGE,,46.387500,9.156111,2619 +alps_6996,CIMA DI GAGELA,,46.384167,9.174722,2805 +alps_6997,FIL DE DRAGIVA,,46.373333,9.171667,2786 +alps_6998,PIZ DE L'ARDION,,46.359722,9.171111,2507 +alps_6999,I CORN DI GOLIN,,46.350833,9.160833,2349 +alps_7000,PIZ DE FRONT,,46.397500,9.195000,2233 +alps_7001,CIMA DE VERCHENCA,,46.395000,9.275556,2856 +alps_7002,PIZZO QUADRO,,46.386111,9.284444,3015 +alps_7003,PIZ CORBET,,46.379722,9.280278,3025 +alps_7004,PIZZO TRUZZO,,46.377778,9.310556,2723 +alps_7005,PIZ POMBI,,46.367778,9.276111,2967 +alps_7006,PIZZO DEL TORTO,,46.355556,9.296111,2723 +alps_7007,CIMA DE LUGHEZZASCA,,46.349167,9.295833,2716 +alps_7008,PIZ PAPALIN,,46.346389,9.298611,2714 +alps_7009,MOTASC,,46.348333,9.284444,2549 +alps_7010,PIZZO CAMOSCIE,,46.364167,9.326667,2467 +alps_7011,PIZZO STELLA,,46.381667,9.421389,3163 +alps_7012,PIZZO SOMMA VALLE,,46.367222,9.424444,2813 +alps_7013,PIZ ALTO,,46.356111,9.412500,2479 +alps_7014,CIMA DA LA SOVRAENA,,46.388889,9.468889,3016 +alps_7015,PIZZO ROSSO,,46.380278,9.463333,3052 +alps_7016,CIMA DA LAEGH,,46.375556,9.461389,3060 +alps_7017,PIZZUN,,46.369722,9.513889,2966 +alps_7018,PIZZ GALLAGIUN,,46.366944,9.487778,3107 +alps_7019,PIZZO DELLO SCUDO,,46.354167,9.473889,2538 +alps_7020,MONTE SARAGIOLO,,46.347778,9.469167,2305 +alps_7021,PIZZO DI ROED,,46.452222,8.613611,2699 +alps_7022,PIZZO DEI TIRZ,,46.451389,8.630278,2536 +alps_7023,PIZZO DELLA VALLETTA,,46.444444,8.616944,2580 +alps_7024,PIZZO DEL PIATTO DI ROED,,46.435000,8.618333,2616 +alps_7025,PIZZO MASCARPINO,,46.425833,8.625833,2450 +alps_7026,CIMA DI SASSALTO,,46.447500,8.691667,2427 +alps_7027,MOGNOI,,46.451667,8.707222,2650 +alps_7028,PIZZO CAMPO TENCIA,,46.429722,8.726111,3071 +alps_7029,PIZZO CROSLINA,,46.435556,8.721111,3012 +alps_7030,PIZZO CANA,,46.440000,8.712778,2953 +alps_7031,PIZZO PENCA,,46.427222,8.738056,3038 +alps_7032,PIZZO RUESCADA,,46.411389,8.681944,2556 +alps_7033,PIZZO FORNO,,46.433056,8.776944,2907 +alps_7034,PONCIONE DEL LAGHETTO,,46.430278,8.759722,2767 +alps_7035,PIZZO BARONE,,46.405833,8.742222,2864 +alps_7036,PIZZO DEI PIODISC,,46.410278,8.741389,2849 +alps_7037,PIZZO DI SOVELTRA,,46.418333,8.740000,2857 +alps_7038,PIZZO ALTO,,46.445000,8.884722,2356 +alps_7039,PIANCA BELLA,,46.421667,8.911111,2163 +alps_7040,COGN,,46.416111,8.917500,2166 +alps_7041,MATRO,,46.410278,8.924444,2172 +alps_7042,CIMA DI PIANCABELLA,,46.448056,9.000556,2671 +alps_7043,PIZ PIOTTA,,46.448889,9.091944,3121 +alps_7044,CIMA ROSSA,,46.443611,9.086944,3160 +alps_7045,CIMA DEI COGN,,46.432222,9.088889,3062 +alps_7046,PIZZO PIANACCIO,,46.411667,9.103056,2832 +alps_7047,PIZZO DEL RAMULAZZ,,46.399722,9.096111,2914 +alps_7048,PIZZO CALDOEZZ,,46.406944,9.083333,2682 +alps_7049,I RODOND,,46.447500,9.136111,2830 +alps_7050,CIMA DE LA FOPELA,,46.436389,9.170000,2377 +alps_7051,PIZ D'ARBEOLA,,46.427778,9.164722,2600 +alps_7052,PIZ PIAN GRAND,,46.417500,9.155556,2689 +alps_7053,CIMA DE LA BEDOLETA,,46.410278,9.159444,2626 +alps_7054,ALTA BURASCA,,46.411389,9.176667,2633 +alps_7055,PIZ DE TRESCOLMEN,,46.406944,9.185000,2581 +alps_7056,PIZ DE CORNEIRA,,46.407222,9.156944,2465 +alps_7057,PIZ CURCIUSA,,46.446944,9.240278,2871 +alps_7058,PIZ BIANCH,,46.450000,9.258056,3036 +alps_7059,CIMA DI BALNISCIO,,46.426111,9.258611,2851 +alps_7060,PIZ DI ROSS,,46.450556,9.263333,3018 +alps_7061,CIMA DI BARNA,,46.420556,9.263611,2862 +alps_7062,MONTE BARDAN,,46.419444,9.275278,2812 +alps_7063,MONTE TIGNOSO,,46.416111,9.308333,2376 +alps_7064,PIZ DE MONTAGNIA,,46.401667,9.281944,2718 +alps_7065,LA COLMENETTA,,46.420000,9.381944,2344 +alps_7066,MONTE MATER,,46.447222,9.399167,3025 +alps_7067,PIZZO GROPPERA,,46.414167,9.399722,2948 +alps_7068,PIZZO PELOSO,,46.397222,9.421111,2780 +alps_7069,CHLIN HORN,,46.435278,9.497778,2868 +alps_7070,CIMA DI CAMUTSCH,,46.436944,9.506111,2903 +alps_7071,TSCHIESCHHORN,,46.427778,9.517222,3019 +alps_7072,SCHWARZSEEHORN,,46.409167,9.461667,2877 +alps_7073,PIZ BLES,,46.398056,9.466667,3045 +alps_7074,PIZZO SCIRESA,,46.469722,8.619722,2326 +alps_7075,PIZZO DI CORNO,,46.492222,8.625556,2501 +alps_7076,PIZZO DI SASSELLO,,46.490833,8.633889,2479 +alps_7077,PIZZO SCHEGGIA,,46.481111,8.654167,2559 +alps_7078,PONCIONE SAMBUCO,,46.482778,8.667222,2581 +alps_7079,PIZZO MASSARI,,46.476111,8.683056,2760 +alps_7080,PIZZO DELLA SASSADA,,46.474444,8.689444,2710 +alps_7081,PONCIONE DI TREMORGIO,,46.482778,8.700278,2669 +alps_7082,PIZZO MEDA,,46.473889,8.702778,2614 +alps_7083,PIZZO DI FILO,,46.476111,8.729444,2265 +alps_7084,PIZZO CAMPOLUNGO,,46.459444,8.719444,2714 +alps_7085,PIZZO LEI DI CIMA,,46.458611,8.724444,2680 +alps_7086,PIZZO VAROZZERA,,46.463056,8.728611,2496 +alps_7087,PIZZO DEL PREVAT,,46.463889,8.708333,2558 +alps_7088,CIMA DEL LAMBRO,,46.458611,8.741111,2273 +alps_7089,PONCIONE DI MEZZO,,46.503056,8.850556,2471 +alps_7090,PUNTA DI STOU,,46.496667,8.865000,2567 +alps_7091,PIZZO MOLARE,,46.488611,8.865000,2585 +alps_7092,PONCIONE DI NARA,,46.483611,8.862222,2433 +alps_7093,MOTTO CROSTEL,,46.465278,8.866944,2302 +alps_7094,PUNTA DI LARESCIA,,46.505833,8.897778,2194 +alps_7095,CIMA DI BRESCIANA,,46.505556,8.983611,2390 +alps_7096,CIMA DEI TOROI,,46.471944,8.983889,2667 +alps_7097,CIMA DI GANA BIANCA,,46.471111,8.992222,2842 +alps_7098,CIMA DI GANA ROSSA,,46.455833,8.998333,2787 +alps_7099,CIMA DEL SIMANO,,46.462500,8.971944,2580 +alps_7100,GRAUHORN,,46.505000,9.028056,3260 +alps_7101,CIMA DELLA NEGRA,,46.502778,9.017778,2999 +alps_7102,RHEINWALD HORN,,46.493611,9.040278,3402 +alps_7103,PIZZO FORCA,,46.480556,9.002778,2582 +alps_7104,PASSO DEI CADABI,,46.484167,9.048056,2938 +alps_7105,UOMO DI SASSO,,46.486111,9.018333,2674 +alps_7106,LOGIA,,46.481389,9.045278,3079 +alps_7107,VOGELBERG,,46.478333,9.065278,3218 +alps_7108,PIZZO CRAMORINO,,46.476389,9.060556,3130 +alps_7109,PIZZO BARATIN,,46.476944,9.053611,3037 +alps_7110,PIZZO NASS,,46.471944,9.058611,2994 +alps_7111,PIZZO DI SCERU,,46.458056,9.011389,2628 +alps_7112,BREITSTOCK,,46.485278,9.127500,3030 +alps_7113,RHEINQUELL HORN,,46.480278,9.073611,3200 +alps_7114,ZAPPORT HORN,,46.479722,9.113056,3152 +alps_7115,PIZ DE STABI,,46.476667,9.090000,3136 +alps_7116,PUNTONE DEI FRACION,,46.470833,9.085000,3202 +alps_7117,PUNTONE DELLA PARETE,,46.460278,9.095000,2984 +alps_7118,MARSCHOL HORN,,46.492778,9.138056,2962 +alps_7119,PIZ DE MUCIA,,46.465833,9.137500,2967 +alps_7120,MOTTON,,46.454444,9.170833,2155 +alps_7121,PIZ CAVRIOLA,,46.504722,9.210000,2873 +alps_7122,LA MOTTA,,46.502500,9.258889,1935 +alps_7123,PIZ UCCELLO,,46.500000,9.198611,2724 +alps_7124,MOTTA DE CASLASC,,46.493056,9.218889,2299 +alps_7125,PIZ VIGNUN,,46.488889,9.238056,2859 +alps_7126,PIZ DE LA LUMBREIDA,,46.481111,9.225278,2983 +alps_7127,PIZ DE VAL ROSSA,,46.472500,9.236111,2872 +alps_7128,PIZ MOTTON,,46.466667,9.225278,2853 +alps_7129,LATTENHORN,,46.501111,9.301389,2858 +alps_7130,PIZZO TAMBO,,46.496944,9.283333,3279 +alps_7131,MOTTO DEL BELVEDERE,,46.493611,9.304444,2690 +alps_7132,PIZZO ZOCCONE,,46.489722,9.279444,3092 +alps_7133,CIMA DE VAL LOGA,,46.474722,9.276111,3004 +alps_7134,PIZZO FERRE,,46.461667,9.280000,3103 +alps_7135,PIZ DI PIAN,,46.455000,9.271944,3158 +alps_7136,PIZ URSAREGLS,,46.500000,9.373611,2835 +alps_7137,PUNTA LEVIS,,46.494167,9.368333,2690 +alps_7138,PIZZO DELLA CASA,,46.498056,9.339722,2522 +alps_7139,PIZZO SPADOLAZZO,,46.487778,9.375000,2721 +alps_7140,MONTE CARDINE,,46.475278,9.329722,2467 +alps_7141,PIZ MIEZ,,46.498056,9.434167,2835 +alps_7142,PIZ DIL CROT,,46.491944,9.428333,2848 +alps_7143,PIZ DELLA PALU,,46.475278,9.422778,3172 +alps_7144,PIZ TIMUN,,46.466944,9.409444,3209 +alps_7145,PIZZO DI STERLA,,46.455000,9.401111,2948 +alps_7146,USSER WISSBERG,,46.493889,9.520000,3053 +alps_7147,GROSSHORN,,46.449167,9.497778,2781 +alps_7148,CIMA DEI ROSSI,,46.448333,9.459444,2726 +alps_7149,SCHIAHORN,,46.459722,9.459444,2636 +alps_7150,GIUEBIN,,46.564444,8.634722,2776 +alps_7151,PASSO POSMEDA,,46.559167,8.625278,2569 +alps_7152,POSMEDA,,46.555278,8.616944,2616 +alps_7153,CAMOGHE,,46.543333,8.673333,2356 +alps_7154,PIZZO TOM,,46.547778,8.673889,2361 +alps_7155,PIAN ALTO,,46.538333,8.666667,2261 +alps_7156,FOEISC,,46.533056,8.668333,2208 +alps_7157,CAP ALTO,,46.530278,8.654167,1913 +alps_7158,COSTA DI GIOF,,46.513889,8.651667,1428 +alps_7159,COSTONE,,46.513333,8.628056,1619 +alps_7160,GRASSO,,46.513889,8.615556,1765 +alps_7161,PUNTA NEGRA,,46.564722,8.690833,2714 +alps_7162,PIZZO TANEDA,,46.558333,8.702222,2667 +alps_7163,PIZ CORANDONI,,46.554722,8.728056,2659 +alps_7164,PIZZO STABBIELLO,,46.551944,8.678889,2442 +alps_7165,UOMO D'ARBIONE,,46.530833,8.721944,2414 +alps_7166,SCHENADUEI,,46.552500,8.748611,2747 +alps_7167,PIZZO DELL'UOMO,,46.544444,8.777222,2663 +alps_7168,PIZZO COLOMBE,,46.536111,8.772778,2545 +alps_7169,PARE DI SCUT,,46.525833,8.790000,2542 +alps_7170,PIZZO DEL SOLE,,46.525000,8.767778,2773 +alps_7171,PECIANETT,,46.525000,8.753889,2764 +alps_7172,PECIAN,,46.521389,8.753889,2662 +alps_7173,LE PIPE,,46.522222,8.771667,2666 +alps_7174,PIZZO PREDELP,,46.520556,8.805833,2595 +alps_7175,CIMA DEL MURO,,46.561111,8.822500,2567 +alps_7176,PIZZO DEL CORVO,,46.563333,8.833333,3015 +alps_7177,PIZZO DI CADREIGH,,46.547778,8.842222,2516 +alps_7178,PIZZO DEI TOROI,,46.521111,8.818333,2528 +alps_7179,CIMA DI GANA ROSSA,,46.511944,8.837778,2565 +alps_7180,PIZZO DI CAMPELLO,,46.515833,8.826944,2660 +alps_7181,PIZZO D'ERA,,46.518611,8.811944,2618 +alps_7182,PIZZO ROSSETTO,,46.544167,8.919722,2099 +alps_7183,FORCADONA,,46.555833,8.968056,2084 +alps_7184,STANGA,,46.549722,8.980000,2425 +alps_7185,SOSTO,,46.547778,8.951944,2221 +alps_7186,TORRONE DI NAV,,46.547222,8.993611,2832 +alps_7187,PIZZO SORDA,,46.537778,8.999722,2884 +alps_7188,CIMA SGIU,,46.527500,8.970556,2375 +alps_7189,CIMA DI PINADEE,,46.513333,8.976944,2486 +alps_7190,PLATTEN BERG,,46.558333,9.023333,3041 +alps_7191,GAREN STOCK,,46.556389,9.029167,2953 +alps_7192,ZERVREILA HORN,,46.550556,9.061389,2898 +alps_7193,FURGGELTI HORN,,46.534167,9.064167,3043 +alps_7194,PIZZO CASSINELLO,,46.537778,9.022778,3102 +alps_7195,GUEFER LUECKE,,46.530833,9.058889,2863 +alps_7196,PIZZO DI CASSIMOI,,46.528889,9.018333,3129 +alps_7197,SCHWARZ HORN,,46.524167,9.057222,3117 +alps_7198,CIMA DI FORNEE,,46.523056,9.020833,3056 +alps_7199,PIZ JUT,,46.515556,9.022500,3129 +alps_7200,LAENTA HORN,,46.517500,9.053889,3238 +alps_7201,GUEFERHORN,,46.512500,9.063056,3383 +alps_7202,WISSGRAETLI,,46.553889,9.120556,2866 +alps_7203,FANELLHORN,,46.547778,9.130556,3124 +alps_7204,ROT GRAETLI,,46.534722,9.125556,3012 +alps_7205,BROCHEN HORN,,46.539722,9.119167,2838 +alps_7206,LORENZ HORN,,46.526944,9.128056,3048 +alps_7207,ROESTI HORN,,46.521111,9.118889,3024 +alps_7208,SCHWARZ HORN,,46.519722,9.114444,3025 +alps_7209,GUGGERI,,46.507778,9.108889,2922 +alps_7210,SALAHORN,,46.509167,9.087222,2984 +alps_7211,WENGLI SPITZ,,46.545278,9.165833,2841 +alps_7212,SCHWARZ TURRA,,46.531944,9.168333,2519 +alps_7213,CHILCHALP HORN,,46.533333,9.154167,3040 +alps_7214,MITTAG HORN,,46.519444,9.200833,2363 +alps_7215,EINSHORN,,46.516111,9.230278,2944 +alps_7216,TEMPAHORN,,46.512500,9.199444,2618 +alps_7217,GUGGERNUELL,,46.523611,9.271389,2886 +alps_7218,ALPETLI STOCK,,46.515556,9.313333,2393 +alps_7219,MITTAG HORN,,46.543611,9.373333,2561 +alps_7220,SEEHORN,,46.533889,9.365833,2762 +alps_7221,ROTGRIND,,46.523333,9.382222,2287 +alps_7222,AEUSSER SCHWARZHOERNER,,46.520278,9.361389,2890 +alps_7223,MITTLER SCHWARZ HORN,,46.514167,9.354167,2838 +alps_7224,INNER SCHWARZ HORN,,46.507222,9.358611,2984 +alps_7225,PIZ POR,,46.509444,9.384167,3028 +alps_7226,SURETTA HORN,,46.509444,9.362500,3027 +alps_7227,CREST OLT,,46.547500,9.440833,1631 +alps_7228,PIZ LA MAZZA,,46.531944,9.457222,2815 +alps_7229,HUERELI,,46.526944,9.400833,2855 +alps_7230,PIZ MUTTALA,,46.513889,9.394722,2961 +alps_7231,PIZ SETTEMBRE,,46.548333,9.499167,2727 +alps_7232,PIZ GRISCH,,46.531111,9.472778,3062 +alps_7233,PIZ ALV,,46.526111,9.492778,2854 +alps_7234,PIZ STARLERA,,46.524444,9.465833,2735 +alps_7235,CORN DI MARSC,,46.269722,10.045833,2805 +alps_7236,PIZZO MURASCIO,,46.265000,10.055833,2761 +alps_7237,PIZ SAREGGIO,,46.256944,10.056111,2779 +alps_7238,PIZ MUERASC,,46.259444,10.064444,2666 +alps_7239,CORN DAL SOLCUN,,46.255833,10.083889,2514 +alps_7240,GANDA ROSSA,,46.244444,10.043611,2741 +alps_7241,PIZ MALAGINA,,46.243056,10.055833,2877 +alps_7242,CIMA BUZZI,,46.226389,10.083333,2345 +alps_7243,PIZ COMBUL,,46.229722,10.043889,2901 +alps_7244,MONTE CALIGHE,,46.219722,10.042222,2698 +alps_7245,VETTA SALARSA,,46.227778,10.101389,2278 +alps_7246,CIME DEL VALLON,,46.297778,9.534444,2677 +alps_7247,PIZZI DEI VANNI,,46.306111,9.560000,2774 +alps_7248,PIZZO TRUBINASCA,,46.298333,9.574167,2918 +alps_7249,PIZZO PORCELLIZZO,,46.285278,9.573056,3076 +alps_7250,CIMA DI CODERA,,46.295000,9.517222,2757 +alps_7251,PIZ GRAND,,46.326667,9.605833,2459 +alps_7252,PIZ CACCIABELLA,,46.324167,9.629167,2980 +alps_7253,PIZZO ERAVEDAR,,46.316389,9.630833,2934 +alps_7254,SCIORA DAFORA,,46.305278,9.627500,3169 +alps_7255,PUNTA PIODA,,46.303333,9.627500,3238 +alps_7256,AGO DI SCIORA,,46.301667,9.626111,3205 +alps_7257,SCIORA DADENT,,46.297222,9.624444,3275 +alps_7258,CIMA DELLA BONDASCA,,46.287778,9.627778,3234 +alps_7259,PIZZI GEMELLI,,46.293611,9.611111,3262 +alps_7260,PIZZO CENGALO,,46.295000,9.601944,3369 +alps_7261,PUNTA SERTORI,,46.293611,9.592778,3195 +alps_7262,PIZZO BADILE,,46.295278,9.586389,3305 +alps_7263,PIZZO BADILET,,46.294444,9.583056,3171 +alps_7264,PUNTA TORELLI,,46.291667,9.580556,3137 +alps_7265,PIZ DAL PAEL,,46.332500,9.660833,2618 +alps_7266,PUNTA DA L'ALBIGNA,,46.320556,9.661111,2825 +alps_7267,CACIADUR,,46.322500,9.686111,3040 +alps_7268,SCAELIN,,46.316944,9.686667,3164 +alps_7269,CIMA DAL CANTUN,,46.310833,9.678333,3354 +alps_7270,CASTEL,,46.306944,9.656111,2924 +alps_7271,PUNTA ALLIEVI,,46.296389,9.669444,3121 +alps_7272,CIMA DI CASTELLO,,46.303056,9.676944,3375 +alps_7273,PUNTA RASICA,,46.297222,9.681667,3306 +alps_7274,TORRONE OCCIDENTALE,,46.294167,9.687222,3351 +alps_7275,TORRONE CENTRALE,,46.293056,9.696111,3290 +alps_7276,TORRONE ORIENTALE,,46.290833,9.701667,3333 +alps_7277,PUNTA FERRARIO,,46.291111,9.695278,3258 +alps_7278,PIZZO DI ZOCCA,,46.289722,9.650000,3174 +alps_7279,MONTE ROSSO,,46.323056,9.718056,3088 +alps_7280,CIMA DI VAL BONA,,46.319722,9.725833,3033 +alps_7281,CIMA DI VAZZEDA,,46.309444,9.723611,3301 +alps_7282,CIMA DI ROSSO,,46.306389,9.718333,3366 +alps_7283,MONTE SISSONE,,46.292778,9.714444,3330 +alps_7284,PUNTA BARONI,,46.288056,9.721111,3204 +alps_7285,CIME DI CHIAREGGIA,,46.283611,9.726389,3107 +alps_7286,PIZ CANFINAL,,46.320556,9.985833,2812 +alps_7287,CORNO CAMPASCIO,,46.313056,10.000000,2808 +alps_7288,CRESTI DA VARTEGNA,,46.278333,10.022778,2741 +alps_7289,PIZ CANCIAN,,46.283333,9.999722,3103 +alps_7290,CIMA FONTANA,,46.277500,9.984167,3202 +alps_7291,PIZZO SCALINO,,46.278611,9.973611,3323 +alps_7292,PIZ DI SASSIGLION,,46.322778,10.112778,2855 +alps_7293,L'OM,,46.314167,10.116667,2789 +alps_7294,MONTE PEDRUNA,,46.318333,10.146389,2539 +alps_7295,PIZ TREVISINA,,46.301111,10.137778,2823 +alps_7296,CIMA DA LI GANDI ROSSI,,46.286389,10.153889,2831 +alps_7297,BANDEROLA,,46.271944,10.163056,2795 +alps_7298,PIZZO PREDAROSSA,,46.390278,9.563889,3083 +alps_7299,GLETSCHERHORN,,46.387500,9.560556,3107 +alps_7300,PIZ DUAN,,46.375278,9.583333,3131 +alps_7301,PIZ DAL MAERC,,46.370833,9.545556,2948 +alps_7302,PIZZI DI MAROZ,,46.383333,9.623056,2599 +alps_7303,PIZ LIZUN,,46.386389,9.638611,2518 +alps_7304,PIZ CAM,,46.370000,9.610833,2634 +alps_7305,SPAZZACALDEIRA,,46.338611,9.638333,2487 +alps_7306,PIZ SALACINA,,46.377500,9.687778,2599 +alps_7307,PIZ MURTAIRA,,46.367778,9.688889,2774 +alps_7308,CIMA DA MURTAIRA,,46.364444,9.692222,2858 +alps_7309,PIZ BREGAGLIA,,46.357500,9.687500,2961 +alps_7310,PIZ CASACCIA,,46.352500,9.689167,3036 +alps_7311,CIMA DA SPLUEGA,,46.350556,9.687500,3046 +alps_7312,CIMA DAL LAGH,,46.346944,9.681944,3188 +alps_7313,PIZ BACUN,,46.342222,9.682222,3244 +alps_7314,PIZ CASNIL,,46.336111,9.683889,3189 +alps_7315,PIZ BALZET,,46.336944,9.664444,2869 +alps_7316,PIZ DA LA MARGNA,,46.381944,9.730000,3158 +alps_7317,PIZ SALATSCHINA,,46.371111,9.766944,2824 +alps_7318,PIZ LED,,46.361111,9.772500,3087 +alps_7319,PIZ GUEZ,,46.356111,9.773333,3168 +alps_7320,PIZ FEDOZ,,46.359722,9.740833,3190 +alps_7321,PIZZO DEL MURETTO,,46.351944,9.743333,3104 +alps_7322,MONTE DELL'ORO,,46.339444,9.762222,3155 +alps_7323,MONTE DEL FORNO,,46.338333,9.724722,3214 +alps_7324,PIZZI DEI ROSSI,,46.346667,9.718333,3027 +alps_7325,IL CHAPUETSCHIN,,46.374722,9.819167,3386 +alps_7326,PIZ GLUESCHAINT,,46.362500,9.840000,3594 +alps_7327,LA MUONGIA,,46.367222,9.825833,3415 +alps_7328,PIZ TREMOGGIA,,46.351944,9.821667,3441 +alps_7329,PIZZO MALENCO,,46.348056,9.829444,3438 +alps_7330,SASSO D'ENTOVA,,46.342222,9.836389,3331 +alps_7331,PIZ FORA,,46.340833,9.784722,3363 +alps_7332,PIZ SELLA,,46.362500,9.868333,3511 +alps_7333,PIZ BERNINA,,46.382222,9.908056,4049 +alps_7334,PIZ ROSEG,,46.373611,9.883056,3937 +alps_7335,DSCHIMELS,,46.363611,9.859722,3501 +alps_7336,LA SELLA,,46.363611,9.848611,3584 +alps_7337,PIZ SCERSCEN,,46.378333,9.900833,3971 +alps_7338,PUNTA MARINELLI,,46.344444,9.919722,3182 +alps_7339,PIZ ARGIENT,,46.366111,9.925278,3945 +alps_7340,PIZ ZUPO,,46.368333,9.931389,3996 +alps_7341,PIZ PALUE,,46.378611,9.959722,3920 +alps_7342,CRAST AGUEZZA,,46.370278,9.916944,3854 +alps_7343,SASSO ROSA,,46.355556,9.958611,3482 +alps_7344,CIME DI MUSELLA,,46.334444,9.919722,3136 +alps_7345,CURNASEL,,46.357222,10.018611,2809 +alps_7346,PIZ CANTON,,46.361111,9.999444,3111 +alps_7347,SASSO ROSSO,,46.354167,9.981944,3416 +alps_7348,PIZ VARUNA,,46.352500,9.993611,3453 +alps_7349,CIMA VAL FONTANA,,46.338611,9.979167,3070 +alps_7350,SASSALB,,46.333611,10.099167,2862 +alps_7351,PIZ DAL TEO,,46.369722,10.126111,3049 +alps_7352,PIZZO RICOLDA,,46.376667,10.162778,2962 +alps_7353,PIZ SENA,,46.353056,10.110000,3075 +alps_7354,CRESTA DELLA SPERELLA,,46.357500,10.119722,2893 +alps_7355,SASSA NERA,,46.341111,10.106667,2858 +alps_7356,SASSO FARINACCIO,,46.345556,10.160833,2780 +alps_7357,PUNTA LAVINALE,,46.326389,10.123889,2680 +alps_7358,SCHINETALHOERNER,,46.429444,9.566389,2883 +alps_7359,WENGAHORN,,46.433056,9.567500,2848 +alps_7360,JUFER HORN,,46.420556,9.575833,2967 +alps_7361,MINGALUNHORN,,46.419167,9.579167,2967 +alps_7362,GRAUHOERNER,,46.415000,9.578056,3012 +alps_7363,PIZ MUNGIROI,,46.393611,9.567500,3046 +alps_7364,WISSBERG,,46.393056,9.528611,2980 +alps_7365,BOEDENGRAT,,46.407222,9.522500,2952 +alps_7366,UF DA FLUE,,46.436944,9.603611,2774 +alps_7367,PIZ FORCELLINA,,46.416111,9.613611,2939 +alps_7368,PIZ TURBA,,46.410278,9.605556,3018 +alps_7369,PIZ MAEDER,,46.404167,9.606944,3001 +alps_7370,MOTTA DA SETT,,46.413333,9.648333,2637 +alps_7371,PIZ PIOT,,46.402778,9.586944,3053 +alps_7372,PIZ MATERDELL,,46.435556,9.693611,2967 +alps_7373,PIZ D'EMMAT DADAINT,,46.440833,9.703889,2927 +alps_7374,PIZ GREVASALVAS,,46.422778,9.674444,2932 +alps_7375,PIZ LUNGHIN,,46.410556,9.670278,2780 +alps_7376,PIZ DAL SASC,,46.410000,9.660833,2733 +alps_7377,LA MARGNETA,,46.390833,9.723056,2785 +alps_7378,FURTSCHELLAS,,46.411667,9.804444,2937 +alps_7379,PIZ CORVATSCH,,46.408333,9.816111,3451 +alps_7380,PIZ MURTEL,,46.412778,9.820000,3433 +alps_7381,CRASTA DAL LEJ SCRISCHUS,,46.396389,9.817500,3304 +alps_7382,PIZ DEL LEJ ALV,,46.386944,9.815000,3197 +alps_7383,PIZ CHUERN,,46.396389,9.794444,2689 +alps_7384,PIZ PRIEVLUS,,46.396667,9.907778,3610 +alps_7385,PIZ MORTERATSCH,,46.402500,9.901667,3751 +alps_7386,PIZ MISAUN,,46.426389,9.894167,3249 +alps_7387,PIZ MANDRA,,46.437500,9.900278,3091 +alps_7388,PIZ BOVAL,,46.417500,9.902500,3353 +alps_7389,PIZ TSCHIERVA,,46.414444,9.886111,3546 +alps_7390,PIZ ALB,,46.384722,9.906667,3995 +alps_7391,PIZ TROVAT,,46.405833,9.970556,3146 +alps_7392,MUNT PERS,,46.421389,9.953611,3207 +alps_7393,SASS QUEDER,,46.410833,9.972778,3066 +alps_7394,PIZ LAGALB,,46.431667,10.023611,2959 +alps_7395,PIZ D'ARLAS,,46.396389,9.983333,3350 +alps_7396,SASSAL MASON,,46.390000,10.013889,3031 +alps_7397,PIZ CARAL,,46.385556,9.991389,3421 +alps_7398,PIZ CAMBRENA,,46.387500,9.981389,3604 +alps_7399,PIZ URSERA,,46.425278,10.080278,3032 +alps_7400,PIZ CAMPASC,,46.396667,10.044444,2599 +alps_7401,CORN DA MURASCIOLA,,46.404444,10.097500,2819 +alps_7402,PIZ VAL NERA,,46.433333,10.131944,3188 +alps_7403,CIMA VALETA,,46.428889,10.118611,3294 +alps_7404,PIZ PARADISIN,,46.426111,10.117222,3302 +alps_7405,LA PALA,,46.421667,10.116111,3169 +alps_7406,CORN DA CAMP,,46.417500,10.107778,3232 +alps_7407,PIZ CUNFIN,,46.428333,10.143056,2904 +alps_7408,PIZZO BIANCO,,46.431111,10.168056,2827 +alps_7409,CORNO DI DOSDE,,46.407778,10.169722,3232 +alps_7410,MOTON,,46.412778,10.149444,2528 +alps_7411,PUNTA DAL DUGURAL,,46.396111,10.163889,3099 +alps_7412,SCIMA DA SAOSEO,,46.385556,10.158056,3264 +alps_7413,CIMA DA RUGIUL,,46.380278,10.132500,2987 +alps_7414,TAELLIGRAT,,46.488333,9.546944,3043 +alps_7415,PIZ PLATTA,,46.487222,9.561667,3392 +alps_7416,MITTLER WISSBERG,,46.485833,9.529167,3002 +alps_7417,INNER WISSBERG,,46.480833,9.533889,2948 +alps_7418,TAELLIHORN,,46.478333,9.561389,3164 +alps_7419,JUPPER HORN,,46.467222,9.567500,3155 +alps_7420,MAZZASPITZ,,46.465000,9.573889,3164 +alps_7421,PIZ SCALOTTA,,46.465278,9.595278,3078 +alps_7422,PIZ CAMPAGNUNG,,46.495278,9.694167,2825 +alps_7423,CORN ALV,,46.494444,9.716944,2980 +alps_7424,PIZ NEIR,,46.484444,9.680000,2909 +alps_7425,PIZ BARDELLA,,46.482222,9.702778,2839 +alps_7426,PIZ D'EMMET DADORA,,46.446111,9.699444,2851 +alps_7427,ROCCABELLA,,46.447778,9.681389,2731 +alps_7428,PIZ GUEGLIET,,46.494722,9.760556,3158 +alps_7429,PIZ ALBANA,,46.481111,9.773611,3099 +alps_7430,PIZ JULIER,,46.491111,9.759722,3380 +alps_7431,PIZ VALLETTA,,46.483611,9.731944,2918 +alps_7432,CHUEERN NAIR,,46.478611,9.728333,2809 +alps_7433,SPEDLA,,46.463889,9.741111,2687 +alps_7434,PIZ DA LAS COLUONNAS,,46.461667,9.723889,2808 +alps_7435,PIZ POLASCHIN,,46.460833,9.753056,3013 +alps_7436,PIZ LAGREV,,46.445833,9.722778,3164 +alps_7437,PIZ MEZ,,46.445000,9.735833,2974 +alps_7438,PIZ DA L'OVA COTSCHNA,,46.468889,9.846389,2716 +alps_7439,PIZ SURLEJ,,46.453333,9.843056,3188 +alps_7440,MUNT ARLAS,,46.443333,9.842778,3127 +alps_7441,PIZ DA STAZ,,46.473056,9.870000,2847 +alps_7442,PIZ MEZDI,,46.470278,9.863333,2992 +alps_7443,PIZ ROSATSCH,,46.460278,9.853611,3123 +alps_7444,PIZ SAN GIAN,,46.457778,9.848056,3134 +alps_7445,PIZ CHALCHAGN,,46.451389,9.905833,3154 +alps_7446,MUOT DA CRASTA,,46.442222,9.869444,2101 +alps_7447,PIZ LANGUARD,,46.488333,9.956389,3262 +alps_7448,MUOT DA LA PISCHA,,46.478333,9.966389,3027 +alps_7449,PAUN DA ZUECHER,,46.467222,9.954444,2998 +alps_7450,PIZ ALBRIS,,46.463889,9.963611,3166 +alps_7451,CRASTA D'ALBRIS,,46.460000,9.969167,3032 +alps_7452,PIZ PRUENA,,46.487222,9.987222,3153 +alps_7453,PIZ PRUENELLA,,46.489167,10.011944,2990 +alps_7454,PIZ SAGLIAINT,,46.475000,10.000278,2945 +alps_7455,PIZ PISCHA,,46.477222,9.983889,3138 +alps_7456,PIZ CHATSCHEDERS,,46.478056,10.016667,2986 +alps_7457,PIZ DAL FAIN,,46.470278,9.989167,2908 +alps_7458,MUOT ARDUOND,,46.458333,10.029722,2878 +alps_7459,PIZ MINOR,,46.451111,10.028333,3049 +alps_7460,PIZ DALS LEJS,,46.448333,10.037222,3042 +alps_7461,PIZ ALV,,46.449444,9.999444,2975 +alps_7462,MONTE GARONE,,46.488056,10.048056,3030 +alps_7463,MONTE BREVA,,46.476667,10.044722,3104 +alps_7464,MONTE GANDA,,46.473056,10.075278,2791 +alps_7465,MONTE VAGO,,46.440833,10.078889,3059 +alps_7466,COSTA DELLE MINE,,46.479444,10.153056,2954 +alps_7467,MONTE DEL BUON CURATO,,46.473611,10.119444,2768 +alps_7468,PIZZO FILONE,,46.457500,10.163056,3133 +alps_7469,PIZZO ZEMBRASCA,,46.446111,10.158611,3089 +alps_7470,PIZZO DELLA VALLE,,46.441944,10.169167,2988 +alps_7471,PIX VAL NERA,,46.433333,10.131944,3188 +alps_7472,DAVOS MOTS,,46.547500,9.584167,2454 +alps_7473,PIZ ARBATSCH,,46.535556,9.576944,3203 +alps_7474,PIZ FORBESCH,,46.520278,9.559167,3262 +alps_7475,PIZ CAGNIEL,,46.506667,9.538333,2970 +alps_7476,PIZ JENATSCH,,46.542500,9.716389,3251 +alps_7477,PIZ D'ERR,,46.545278,9.691389,3378 +alps_7478,PIZ CALDERAS,,46.536389,9.695833,3397 +alps_7479,PIZ CUCARNEGL,,46.531944,9.684167,3051 +alps_7480,PIZ PICUOGL,,46.523889,9.708056,3333 +alps_7481,TSCHIMA DA FLIX,,46.521667,9.699722,3302 +alps_7482,FUORCLA DA FLIX,,46.514722,9.697500,3065 +alps_7483,PIZ D'ANGEL,,46.511389,9.702222,3205 +alps_7484,PIZ CUGNETS,,46.506111,9.681389,2739 +alps_7485,PIZ CHEMBELS,,46.546389,9.739722,2981 +alps_7486,CRASTA JENATSCH,,46.536667,9.729444,3029 +alps_7487,PIZ BEVER,,46.522500,9.759167,3230 +alps_7488,PIZ TRAUNTER OVAS,,46.515000,9.729722,3151 +alps_7489,PIZ SUVRETTA,,46.514722,9.758611,3144 +alps_7490,IL NES,,46.496944,9.748056,2951 +alps_7491,CORN CHAMUOTSCH,,46.499444,9.753889,3017 +alps_7492,FUORCLA SUVRETTA,,46.510556,9.755278,2966 +alps_7493,PIZ SURGONDA,,46.510278,9.725000,3197 +alps_7494,CORN SUVRETTA,,46.504722,9.749167,3072 +alps_7495,CORN MARGUN,,46.505278,9.738333,3035 +alps_7496,CRAP ALV,,46.498889,9.735000,2832 +alps_7497,PIZ SPINAS,,46.547778,9.826944,2883 +alps_7498,LAS SET ROESAS,,46.543056,9.819444,3044 +alps_7499,PIZ OT,,46.543333,9.810278,3246 +alps_7500,CHO D'SUVRETTA,,46.540833,9.787778,2966 +alps_7501,PIZ MARSCH,,46.534444,9.792778,3120 +alps_7502,PIZ DE LA FUNTAUNA,,46.537500,9.811667,3092 +alps_7503,PIZ PADELLA,,46.531389,9.831111,2884 +alps_7504,PIZ DAL BUEZ,,46.531944,9.816667,2955 +alps_7505,PIZ SALUVER,,46.530556,9.795278,3159 +alps_7506,SASS NAIR,,46.526389,9.813889,2762 +alps_7507,PIZ GLUENA,,46.526667,9.788333,3102 +alps_7508,PIZ CORVIGLIA,,46.521389,9.788333,3060 +alps_7509,PIZ GRISCH,,46.517500,9.785278,3098 +alps_7510,SAAS CORVIGLIA,,46.516111,9.799444,2862 +alps_7511,PIZ SCHLATTAIN,,46.515000,9.791111,3004 +alps_7512,SASS RUNZOEL,,46.509722,9.826389,2448 +alps_7513,SASS DA MUOTTAS,,46.512222,9.833333,2364 +alps_7514,PIZ NAIR PITSCHEN,,46.507778,9.800278,2877 +alps_7515,PIZ NAIR,,46.506389,9.787222,3056 +alps_7516,FUORCLA MUESELLA,,46.533889,9.933889,2764 +alps_7517,PIZ MALAT,,46.529722,9.949444,2993 +alps_7518,PIZ UTER,,46.530278,9.931944,2967 +alps_7519,CRESTA BURDUN,,46.523333,9.945556,3134 +alps_7520,FUORCLA BURDUN,,46.519167,9.950000,2976 +alps_7521,IL CORN,,46.516111,9.947500,3138 +alps_7522,PIZ VADRET,,46.508889,9.950833,3199 +alps_7523,PIZ DE LAS STERLAS,,46.511389,9.952500,3175 +alps_7524,LAS SOURS,,46.501111,9.928056,3008 +alps_7525,PIZ MURAGL,,46.497778,9.937222,3157 +alps_7526,PIZ CLUEX,,46.495556,9.943611,3131 +alps_7527,MUNT COTSCHEN,,46.510000,10.042222,3104 +alps_7528,VETTA BLESACCIA,,46.526111,10.090833,2796 +alps_7529,PIZ LAVIRUN,,46.526944,10.051667,3058 +alps_7530,MORTEIR,,46.510556,10.094444,2705 +alps_7531,PIZZO CANTONE,,46.503333,10.081389,2904 +alps_7532,MONTE CAMPACCI,,46.498889,10.072500,3007 +alps_7533,MONTE DELLE REZZE,,46.497222,10.095000,2858 +alps_7534,IL MOTTOLINO,,46.531944,10.162222,2349 +alps_7535,MONTE SPONDA,,46.515556,10.157778,2576 +alps_7536,MONTE DELLA NEVE,,46.508889,10.149444,2785 +alps_7537,MONTE DELLE MINE,,46.493889,10.144722,2883 +alps_7538,VANIL DE LA MONSE,,46.602222,7.167500,1462 +alps_7539,DENT DE BROC,,46.588611,7.127778,1829 +alps_7540,DENT DU CHAMOIS,,46.584167,7.135278,1830 +alps_7541,DENT DU BOURGO,,46.575556,7.139722,1909 +alps_7542,LES DENTS VERTES,,46.623056,7.217500,1806 +alps_7543,VOUNETSE,,46.626111,7.207778,1626 +alps_7544,VANIL D'ARPILLE,,46.617778,7.240833,2084 +alps_7545,VANILS DE RAVEIRES,,46.608611,7.225278,1803 +alps_7546,HOCHMATT,,46.576389,7.221667,2152 +alps_7547,LE VERDY,,46.582778,7.211111,1771 +alps_7548,SCHOPFENSPITZ,,46.622500,7.250556,2104 +alps_7549,GASTLOSEN,,46.584167,7.281389,1996 +alps_7550,RUDIGENSPITZE,,46.573333,7.268056,2123 +alps_7551,BAEDERHORN,,46.613333,7.327500,2008 +alps_7552,HORNGUGER,,46.600556,7.410000,1824 +alps_7553,NIDERHORN,,46.593056,7.430000,2078 +alps_7554,PUNTELGABEL,,46.613056,7.462778,1949 +alps_7555,MENIGGRAT,,46.591667,7.482222,1949 +alps_7556,MUNTIGGALM,,46.573333,7.441111,2077 +alps_7557,ABENDBERG,,46.622222,7.524722,1851 +alps_7558,SCHWARZENBERG,,46.605556,7.551667,1710 +alps_7559,HOMAD,,46.592778,7.515278,1886 +alps_7560,WIRIEHORN,,46.580278,7.529722,2304 +alps_7561,TIERLAUFHORN,,46.573611,7.521667,2242 +alps_7562,STANDHORE,,46.618889,7.613889,2339 +alps_7563,DRUNENGALM,,46.625833,7.619167,2408 +alps_7564,STEISCHLAGHORE,,46.608333,7.609444,2321 +alps_7565,TSCHIPPERAELLENHORE,,46.604167,7.605000,2398 +alps_7566,SCHMELIHORE,,46.590556,7.591389,2311 +alps_7567,MAEGGISSEREHORE,,46.596667,7.599722,2347 +alps_7568,HOHNIESEN,,46.577500,7.583056,2454 +alps_7569,GEHRIHORN,,46.573889,7.691944,2130 +alps_7570,VANIL DES COURS,,46.639167,7.138333,1562 +alps_7571,LA BERRA,,46.675833,7.183889,1719 +alps_7572,LA PATTA,,46.668611,7.239167,1616 +alps_7573,PATRAFLON,,46.639444,7.241667,1916 +alps_7574,SPITZFLUE,,46.640000,7.276667,1951 +alps_7575,CHOERBLISPITZ,,46.629722,7.268889,2102 +alps_7576,FOCHSENFLUE,,46.636389,7.274167,1975 +alps_7577,POINTE DE BALACHAUX,,46.632222,7.243611,1976 +alps_7578,SCHAFARNISCH,,46.655278,7.368889,2107 +alps_7579,STIERENGRAT,,46.655278,7.331389,2160 +alps_7580,KAISEREGG,,46.652500,7.318889,2185 +alps_7581,WIDDERGALM,,46.651667,7.350556,2174 +alps_7582,HOLZERHORN,,46.639722,7.366389,1946 +alps_7583,TRUEMELHORN,,46.638056,7.359167,1981 +alps_7584,MITTAGFLUE,,46.635833,7.367500,1866 +alps_7585,CHIENHORN,,46.631667,7.362778,1665 +alps_7586,CHLUSHORN,,46.632222,7.356667,1691 +alps_7587,CHEMIFLUE,,46.635556,7.358889,1878 +alps_7588,SCHAFBERG,,46.636944,7.315833,2234 +alps_7589,MAERE,,46.674722,7.376111,2087 +alps_7590,SCHIBE,,46.672500,7.392778,2151 +alps_7591,WIDDERSGRIND,,46.677500,7.406944,2104 +alps_7592,HOMAEDLI,,46.678611,7.426111,2021 +alps_7593,LOOHERENHUERLI,,46.677222,7.498333,1847 +alps_7594,TURNEN,,46.628333,7.492778,2079 +alps_7595,STOCKENFLUE,,46.679444,7.515556,1948 +alps_7596,PFAFFEN,,46.630833,7.506944,1956 +alps_7597,FROMBERGHORE,,46.632778,7.629444,2394 +alps_7598,NIESEN,,46.646389,7.652500,2362 +alps_7599,GROSS SCHWYBERG,,46.700556,7.270556,1665 +alps_7600,AETTENBERG,,46.687778,7.327500,1612 +alps_7601,BIREHUBEL,,46.711944,7.431667,1850 +alps_7602,BUERGLEN,,46.703056,7.432500,2165 +alps_7603,OCHSEN,,46.698889,7.418611,2188 +alps_7604,STAECKHUETTENGHOERN,,46.697222,7.380000,1706 +alps_7605,ALPIGLEGALM,,46.693056,7.418889,2114 +alps_7606,HANEN,,46.683333,7.410278,2019 +alps_7607,HOHMAD,,46.705278,7.494444,2076 +alps_7608,GANTRISCH,,46.705000,7.450278,2175 +alps_7609,SCHIBENSPITZ,,46.699167,7.446389,2060 +alps_7610,GUSTISPITZ,,46.706667,7.472500,2074 +alps_7611,SCHITERWANG,,46.704722,7.478889,2079 +alps_7612,SCHWIDENEGG,,46.686667,7.460556,2007 +alps_7613,HAAGGEN,,46.688889,7.481111,1666 +alps_7614,WALALPGRAT,,46.701944,7.526111,1919 +alps_7615,STOCKHORN,,46.693889,7.537222,2190 +alps_7616,SOLHORN,,46.692222,7.551667,2016 +alps_7617,SATTELSPITZ,,46.687222,7.508333,1957 +alps_7618,CHEIBENHORN,,46.684444,7.528333,1952 +alps_7619,LASENBERG,,46.690278,7.558333,2019 +alps_7620,MIESCHFLUE,,46.682222,7.537778,1840 +alps_7621,SCHWENDELBERG,,46.770278,7.345000,1296 +alps_7622,GUGGERSHORN,,46.770000,7.334167,1283 +alps_7623,SCHUPFENFLUE,,46.735833,7.413333,1720 +alps_7624,OBER GURNIGEL,,46.748889,7.462222,1548 +alps_7625,RIEDHUBEL,,46.770278,7.525278,753 +alps_7626,GEISTHUBEL,,46.764167,7.535000,707 +alps_7627,RAEBERG,,46.755833,7.579167,603 +alps_7628,WAETTERLATTE,,46.608056,7.743333,2007 +alps_7629,DREISPITZ,,46.592778,7.759722,2520 +alps_7630,MORGENBERGHORN,,46.622222,7.793611,2249 +alps_7631,FIRST,,46.599444,7.769444,2440 +alps_7632,LATREJESPITZ,,46.595833,7.769167,2421 +alps_7633,SCHWALMERE,,46.593056,7.816944,2777 +alps_7634,HOGANTHORN,,46.588889,7.822222,2777 +alps_7635,DRAETTEHORN,,46.582500,7.823889,2794 +alps_7636,GLUETSCHHOERELI,,46.588611,7.802500,2521 +alps_7637,CHIENEGG,,46.574167,7.825833,2590 +alps_7638,GLUETSCHSTOCK,,46.576389,7.790000,2119 +alps_7639,SULEGG,,46.621389,7.851667,2413 +alps_7640,LOEBHOERNER,,46.602222,7.843333,2566 +alps_7641,SPALTENHORN,,46.590278,7.842778,2526 +alps_7642,MARA,,46.582222,7.833056,2607 +alps_7643,BIETENHORN,,46.576944,7.864722,2756 +alps_7644,MAENNLICHEN,,46.618333,7.938056,2342 +alps_7645,TSCHUGGEN,,46.600278,7.949722,2520 +alps_7646,LAUBERHORN,,46.592500,7.948056,2472 +alps_7647,EIGER,,46.577500,8.005278,3970 +alps_7648,ROTSTOCK,,46.577222,7.983611,2663 +alps_7649,FALLBODENHUBEL,,46.579722,7.966111,2172 +alps_7650,GROAECHTA,,46.604722,8.091111,3164 +alps_7651,ANKENBAELLI,,46.604722,8.085278,3164 +alps_7652,MAETTENBERG,,46.608611,8.078889,3104 +alps_7653,KLEIN LAUTERAARHORN,,46.578889,8.139167,3737 +alps_7654,LAUTERAARHORN,,46.583333,8.128333,4042 +alps_7655,SCHRECKHORN,,46.590000,8.118056,4078 +alps_7656,NAESSIHORN,,46.594722,8.111389,3741 +alps_7657,KLEIN SCHRECKHORN,,46.601667,8.102222,3494 +alps_7658,BAERGLISTOCK,,46.615000,8.140833,3656 +alps_7659,STRAHLEGGHORN,,46.575556,8.118056,3461 +alps_7660,EWIGSCHNEEHORN,,46.597222,8.168611,3329 +alps_7661,GRIENBAERGLI,,46.605000,8.185556,2686 +alps_7662,TRIFTHORN,,46.591944,8.178056,3230 +alps_7663,HUBELHORN,,46.585833,8.206389,3244 +alps_7664,HIENDERSTOCK,,46.586667,8.218333,3307 +alps_7665,ROTHOREN,,46.576389,8.219722,3003 +alps_7666,GUMMEN,,46.622222,8.228056,2038 +alps_7667,GRAUGRAT,,46.624167,8.257500,3137 +alps_7668,STEINLAUIHORN,,46.617778,8.254722,3162 +alps_7669,GOLEGGHORN,,46.615556,8.250000,3077 +alps_7670,HIENDER TELLIHORN,,46.600278,8.236944,3179 +alps_7671,GROSS DIAMANTSTOCK,,46.592500,8.243333,3162 +alps_7672,CHLYNE DIAMANTSTOCK,,46.596389,8.266944,2839 +alps_7673,ALPLISTOCK,,46.595000,8.281944,2878 +alps_7674,BAECHLISTOCK,,46.586667,8.239444,3247 +alps_7675,BRANDLAMMHORN,,46.581667,8.257500,3108 +alps_7676,BRUNBERG,,46.575833,8.277222,2982 +alps_7677,OCHSENWANG,,46.615000,8.320833,1893 +alps_7678,SCHOIBHOREN,,46.607778,8.338611,2684 +alps_7679,ARLENHOREN,,46.605556,8.290833,2453 +alps_7680,STOCK,,46.602778,8.320000,1727 +alps_7681,BRUENGRAT,,46.577778,8.299444,2742 +alps_7682,JUCHLISTOCK,,46.580556,8.308333,2590 +alps_7683,HOHHOREN,,46.581389,8.353611,2771 +alps_7684,TAELLISTOCK,,46.622778,8.385833,3185 +alps_7685,GALENSTOCK,,46.612778,8.416667,3583 +alps_7686,SIDELENHORN,,46.599444,8.407778,3217 +alps_7687,GROSS FURKAHORN,,46.596667,8.410278,3169 +alps_7688,SIDELENGRAT,,46.592222,8.408333,3115 +alps_7689,FURKAHORN,,46.585833,8.406389,3026 +alps_7690,GALENGRAT,,46.606944,8.416111,3363 +alps_7691,FURKASTOCK,,46.575556,8.412500,2665 +alps_7692,SATTELEGG,,46.570833,8.362222,2177 +alps_7693,TIEFENSATTEL,,46.618611,8.420556,3438 +alps_7694,WINTERSTOCK,,46.620278,8.454167,3203 +alps_7695,BLAUBERG STOCK,,46.618611,8.482778,2865 +alps_7696,GROSS BIELERHORN,,46.603889,8.428056,3207 +alps_7697,SAASEGG,,46.611667,8.476389,2305 +alps_7698,CHLI BIELENHORN,,46.598889,8.434722,2940 +alps_7699,BLAUBERG,,46.621389,8.490000,2955 +alps_7700,WINTERHORN,,46.586944,8.539167,2660 +alps_7701,PIZZO D'ORSIRORA,,46.577778,8.525278,2603 +alps_7702,OVI D'ORSINO,,46.573611,8.538889,2426 +alps_7703,OVI D'ORSIRORA,,46.569167,8.536389,2445 +alps_7704,VALLETTA,,46.569167,8.532500,2475 +alps_7705,LAGHI DELLA VALLETTA,,46.568889,8.529444,2432 +alps_7706,GATSCHOLAEGG,,46.569444,8.508056,2389 +alps_7707,HOEHENBIEL,,46.571667,8.494167,1984 +alps_7708,FIRNSTOCK,,46.605833,8.594722,2454 +alps_7709,GAMSSTOCK,,46.605278,8.587778,2542 +alps_7710,GEMSSTOCK,,46.602222,8.611389,2961 +alps_7711,CHASTELHORN,,46.595000,8.597778,2973 +alps_7712,ROTHORN,,46.594444,8.611667,2933 +alps_7713,ROTSTOCK,,46.582778,8.611667,2951 +alps_7714,BLAUBERG,,46.580833,8.577778,2729 +alps_7715,GAMSSPITZ,,46.575000,8.611389,2925 +alps_7716,SELLABOEDELI,,46.574167,8.603333,2828 +alps_7717,SCHWARZ LOCHHORN,,46.577222,8.581389,2745 +alps_7718,GLOGGEN TUERMLI,,46.574722,8.588056,2811 +alps_7719,SCHIFFLI,,46.631944,7.805000,2035 +alps_7720,BAELLEHOECHST,,46.631111,7.858056,2095 +alps_7721,SCHILT,,46.649444,7.937500,1813 +alps_7722,STELLIHORN,,46.656944,7.944444,2077 +alps_7723,USSRI SAEGISSA,,46.666111,7.955556,2423 +alps_7724,LOUCHERHORN,,46.666667,7.934722,2230 +alps_7725,SCHYNIGE PLATTE,,46.655278,7.908056,2100 +alps_7726,OBERBERGHORN,,46.658889,7.914444,2069 +alps_7727,BURG,,46.653611,7.981111,2207 +alps_7728,REETI,,46.665000,8.011667,2757 +alps_7729,SIMELIHORN,,46.667778,8.007500,2751 +alps_7730,FAULHORN,,46.674722,7.999167,2681 +alps_7731,GASSENHORN,,46.677222,8.015000,2617 +alps_7732,WINTEREGG,,46.666389,7.973889,2572 +alps_7733,BYHORN,,46.635556,8.091389,2167 +alps_7734,NATERWENGLI,,46.657222,8.029444,2381 +alps_7735,GROSSENEGG,,46.673333,8.041667,2623 +alps_7736,GEMSCHBERG,,46.677222,8.077222,2658 +alps_7737,ROSENHORN,,46.631944,8.137222,3689 +alps_7738,WELLHORN,,46.655833,8.141944,3192 +alps_7739,MITTELHORN,,46.635278,8.124722,3704 +alps_7740,SCHAFHUBEL,,46.654722,8.103889,2035 +alps_7741,CHRINNENHORN,,46.632778,8.096944,2736 +alps_7742,WETTERHORN,,46.638611,8.115556,3701 +alps_7743,SATTELSPITZEN,,46.678611,8.173611,2337 +alps_7744,KINGSPITZ,,46.675556,8.176389,2621 +alps_7745,GROSSES ENGELHORN,,46.672222,8.180000,2782 +alps_7746,CHLYS ENGELHORN,,46.677500,8.185000,2643 +alps_7747,URBACHS ENGELHORN,,46.672500,8.183333,2767 +alps_7748,AEBNISGRAT,,46.667222,8.176389,2736 +alps_7749,GSTELLIHORN,,46.661944,8.174722,2855 +alps_7750,DOSSENGRAT,,46.652778,8.165278,2879 +alps_7751,DOSSEN,,46.648611,8.163056,3138 +alps_7752,DOSSEN,,46.645000,8.162500,3144 +alps_7753,RAENFENHORN,,46.633611,8.165000,3259 +alps_7754,HANGEND GLETSCHERHORN,,46.629444,8.182500,3292 +alps_7755,GLETSCHER HUBEL,,46.673333,8.163611,1759 +alps_7756,SCHWARZE DOSSEN,,46.648333,8.183056,2379 +alps_7757,LEIMIGER,,46.641389,8.215000,1677 +alps_7758,CHIPFESTOCK,,46.626944,8.204167,2689 +alps_7759,GLOGGHUES,,46.671111,8.230833,2135 +alps_7760,BAETTLERHORN,,46.662500,8.229444,2535 +alps_7761,GALLAUISTOECK,,46.651944,8.234722,2869 +alps_7762,SCHAFLAEGER STOECK,,46.647222,8.242778,2855 +alps_7763,RITZLIHORN,,46.633333,8.258611,3263 +alps_7764,RITZLIHORN,,46.631944,8.258889,3282 +alps_7765,STAMPFHOREN,,46.624444,8.283056,2552 +alps_7766,WACHTLAMM STOCK,,46.637778,8.279167,2401 +alps_7767,SUMPF,,46.668889,8.283889,1575 +alps_7768,FURGGISEGG,,46.666667,8.251667,1279 +alps_7769,BIRGLISTOCK,,46.654167,8.255833,2194 +alps_7770,UFEM BUGLI,,46.650556,8.251667,2250 +alps_7771,GWAECHTENHORN,,46.656944,8.347222,3214 +alps_7772,CHILCHLISTOCK,,46.663889,8.337222,3114 +alps_7773,STEINHUESHORN,,46.667778,8.332222,3121 +alps_7774,OFENHOREN,,46.648889,8.333611,2943 +alps_7775,GELMERHORN,,46.628611,8.329167,2631 +alps_7776,TRIFTSTOECK,,46.662222,8.362222,3035 +alps_7777,DIECHTERHORN,,46.648056,8.360000,3389 +alps_7778,TIERALPLISTOCK,,46.633889,8.371667,3383 +alps_7779,MAASPLANGG STOCK,,46.672222,8.400556,3401 +alps_7780,WYSSE NOLLEN,,46.654167,8.398889,3398 +alps_7781,LIMISTOCK,,46.640556,8.386667,3189 +alps_7782,HOCH HOREFELLISTOCK,,46.670833,8.471944,3175 +alps_7783,SCHIJENSTOCK,,46.669444,8.475278,3161 +alps_7784,EGGSTOCK,,46.651944,8.418333,3556 +alps_7785,SCHNEESTOCK,,46.647778,8.421944,3608 +alps_7786,DAMMASTOCK,,46.643333,8.421111,3630 +alps_7787,RHONESTOCK,,46.634444,8.419444,3596 +alps_7788,TIEFENSTOCK,,46.627222,8.422222,3515 +alps_7789,MOOSSTOCK,,46.646389,8.455556,2582 +alps_7790,DAMMASTAFEL,,46.640833,8.457222,2232 +alps_7791,GEMSCHI STOECKLI,,46.635000,8.450000,2373 +alps_7792,LOCHBERG,,46.625278,8.468056,3074 +alps_7793,PLANGGEN STOCK,,46.630556,8.473333,2823 +alps_7794,HOREFELLISTOCK,,46.674444,8.485556,2689 +alps_7795,OBER HOHENBERG,,46.672500,8.535000,2303 +alps_7796,BERGSEE SCHIJEN,,46.663611,8.485556,2815 +alps_7797,HOCH SCHIJEN,,46.663333,8.494722,2634 +alps_7798,GAND SCHIJEN,,46.662222,8.510278,2388 +alps_7799,VORDER LOCHSTOCK,,46.643056,8.536944,2490 +alps_7800,ROSSMETTLEN GRAT,,46.637778,8.539444,2804 +alps_7801,SPITZBERG,,46.631944,8.527222,2934 +alps_7802,HINTER LOCHSTOCK,,46.640278,8.532222,2557 +alps_7803,MITTAGSTOCK,,46.632500,8.512222,2989 +alps_7804,MUETERLISHORN,,46.624722,8.498056,3066 +alps_7805,SCHWARZ STOECKLI,,46.637778,8.517222,2534 +alps_7806,VORDER FELDSCHIJEN,,46.631389,8.493611,2828 +alps_7807,HINTER FELDSCHIJEN,,46.627778,8.500000,3021 +alps_7808,OBER GUETSCH,,46.654722,8.611667,2325 +alps_7809,CHALBERBIEL,,46.638333,8.557500,2288 +alps_7810,FLIESGADEN,,46.633056,8.603056,1550 +alps_7811,MERRA,,46.728056,7.762222,1954 +alps_7812,SIGRISWILER ROTHORN,,46.730556,7.770278,2049 +alps_7813,GEMMENALPHORN,,46.731667,7.806667,2061 +alps_7814,BURGFELDSTAND,,46.722500,7.795000,2062 +alps_7815,NIEDERHORN,,46.710833,7.773333,1950 +alps_7816,ROTEFLUE,,46.716389,7.879444,1731 +alps_7817,WANNICHNUBEL,,46.704167,7.860833,1585 +alps_7818,HORETEGG,,46.724167,7.904722,1808 +alps_7819,ROTEFLUE,,46.681389,7.957778,2295 +alps_7820,LITSCHGIBURG,,46.699444,7.992778,2068 +alps_7821,BAETTENALPBURG,,46.697778,7.987222,2134 +alps_7822,SCHWABHORN,,46.683611,7.989444,2373 +alps_7823,FURGGENHORN,,46.685556,7.965556,2167 +alps_7824,OLTSCHIBURG,,46.716389,8.079167,2233 +alps_7825,AXALPHORN,,46.710278,8.060833,2321 +alps_7826,TSCHINGEL,,46.706667,8.047500,2244 +alps_7827,GAERSTENHORN,,46.692778,8.059444,2798 +alps_7828,WILDGAERST,,46.692778,8.074444,2891 +alps_7829,SCHWARZHORN,,46.686111,8.075556,2928 +alps_7830,WANDELHORN,,46.712500,8.113056,2304 +alps_7831,GARZEN,,46.701389,8.098889,2709 +alps_7832,TSCHINGEL,,46.703889,8.140833,2326 +alps_7833,HOHBALM,,46.706944,8.182778,1365 +alps_7834,HOHJEGIBURG,,46.680833,8.186111,2639 +alps_7835,TENNHORN,,46.684167,8.188333,2519 +alps_7836,MITTAGHIRI,,46.688333,8.191667,2293 +alps_7837,ROTEFLUE,,46.698611,8.158611,1811 +alps_7838,GEISSHELL HUBEL,,46.693889,8.167500,1337 +alps_7839,GIRMSCHENEGG,,46.683611,8.161944,1432 +alps_7840,GROSS RYCHENBACH,,46.693333,8.178611,1575 +alps_7841,BIM SIGNAL,,46.691667,8.199167,2061 +alps_7842,SIMELISTOCK,,46.681944,8.180833,2482 +alps_7843,ROSENLAUISTOCK,,46.679167,8.171667,2255 +alps_7844,GROIGGI,,46.728056,8.228889,1384 +alps_7845,ORTFLUE,,46.724167,8.274444,1510 +alps_7846,OBERARNI,,46.724444,8.251389,1568 +alps_7847,CHRAEJEREN,,46.725556,8.245833,1691 +alps_7848,RIEBGARTI,,46.715556,8.227222,1039 +alps_7849,ALAUENEN,,46.686944,8.245833,886 +alps_7850,RIGLISFLIE,,46.711944,8.238056,836 +alps_7851,AEBNET,,46.710000,8.262778,990 +alps_7852,WILERDUEMEN,,46.701667,8.254444,1642 +alps_7853,BAENZLAUISTOCK,,46.692500,8.278056,2530 +alps_7854,STIERGRIND,,46.696111,8.265278,2159 +alps_7855,PFAFFENCHOPF,,46.698889,8.254722,1849 +alps_7856,BLATTENSTOCK,,46.697500,8.249722,1362 +alps_7857,BOTTIGER DUEMEN,,46.699444,8.250278,1540 +alps_7858,UNDERSTOCK,,46.693611,8.232222,872 +alps_7859,SOLEGG,,46.690556,8.235000,905 +alps_7860,SCHONHUBEL,,46.692778,8.241944,744 +alps_7861,SEEFLUE,,46.687222,8.285833,2144 +alps_7862,BAENZLAUISEE,,46.692778,8.286111,2216 +alps_7863,BLATTEN,,46.692500,8.256667,1614 +alps_7864,GEISS GADMER,,46.689167,8.226111,938 +alps_7865,LOIBSTOCK,,46.680278,8.230278,1688 +alps_7866,HOHBIEL,,46.684444,8.250833,1034 +alps_7867,WANNIS BORDSEE,,46.681667,8.298056,2103 +alps_7868,SOLEGG,,46.727500,8.325833,1386 +alps_7869,ROSSWEIDLI HUBEL,,46.723611,8.315000,1102 +alps_7870,SUNNINGHORN,,46.712500,8.346667,2412 +alps_7871,ERGGELI HUBEL,,46.713889,8.325278,1301 +alps_7872,FLESCHEN HUBEL,,46.703056,8.312222,2191 +alps_7873,FLESCHHOREN,,46.702778,8.316944,2328 +alps_7874,MAEHRENHORN,,46.691944,8.310833,2922 +alps_7875,FURTWANG STOCK,,46.685000,8.313056,2825 +alps_7876,WYSSE SCHIJEN,,46.685278,8.315278,2823 +alps_7877,MALCHSTEINEN,,46.702222,8.349444,2001 +alps_7878,GRAUSTOCK,,46.693333,8.298056,2689 +alps_7879,BRUNNENSTOCK,,46.694722,8.291389,2519 +alps_7880,HOMADGRAT,,46.686667,8.295000,2406 +alps_7881,WINDEGG HORN,,46.688889,8.329722,2766 +alps_7882,STOTZIGE GRAT,,46.690000,8.323611,2777 +alps_7883,TAELLISEELI,,46.682500,8.330000,2269 +alps_7884,GLAECK BLATTEN,,46.684722,8.346944,2166 +alps_7885,CHUEBERGLI,,46.722778,8.399167,2195 +alps_7886,GADEN LAUISEE,,46.720833,8.356944,2155 +alps_7887,RADLEFSHORN,,46.714444,8.355278,2603 +alps_7888,GRAUI STOECKLI,,46.712500,8.370278,2776 +alps_7889,DROSISTOCK,,46.708333,8.376667,2822 +alps_7890,WANGHORN,,46.721944,8.371111,2353 +alps_7891,GIGLISTOCK,,46.709722,8.386667,2900 +alps_7892,SANDHUEBEL,,46.711111,8.356667,2444 +alps_7893,MURWETE STOCK,,46.708056,8.362222,2609 +alps_7894,BRUNNEN STOCK,,46.710556,8.395833,2763 +alps_7895,VORDER TIERBERG,,46.698333,8.397222,3091 +alps_7896,GWAECHTENHORN,,46.690833,8.413333,3420 +alps_7897,MITTLER TIERBERG,,46.691667,8.398611,3311 +alps_7898,HINTER TIERBERG,,46.681667,8.398889,3447 +alps_7899,TELLTISTOCK,,46.679722,8.375000,2592 +alps_7900,SEEBODEN,,46.724167,8.423889,2099 +alps_7901,CHLI GRIESSENHORN,,46.727222,8.476944,2851 +alps_7902,SUSTENSPITZ,,46.717778,8.447222,2931 +alps_7903,CHUEBERGLI,,46.718056,8.430000,2134 +alps_7904,SUSTENJOCH,,46.716111,8.465556,2656 +alps_7905,CHLI SUSTENHORN,,46.710833,8.453889,3318 +alps_7906,SUSTENHORN,,46.698889,8.455278,3503 +alps_7907,VORDER SUSTENLIMIHORN,,46.691389,8.453056,3331 +alps_7908,ROT STOCK,,46.686667,8.434722,3183 +alps_7909,HINTER SUSTENLIMIHORN,,46.686389,8.454722,3216 +alps_7910,CHELEN ALPLUECKE,,46.683889,8.456111,3092 +alps_7911,BRUNNENSTOCK,,46.682222,8.457500,3211 +alps_7912,VORALPHORN,,46.679444,8.463611,3203 +alps_7913,CHELEN ALPHORN,,46.676944,8.464722,3202 +alps_7914,DRIESTOCK,,46.726944,8.499167,2520 +alps_7915,LITZIGSTOCK,,46.719722,8.523889,2532 +alps_7916,FEDISTOCK,,46.715833,8.517778,2840 +alps_7917,FLECKISTOCK,,46.707500,8.497500,3416 +alps_7918,WINTERBERG,,46.695833,8.508889,3207 +alps_7919,ROTHORN,,46.691389,8.520278,3193 +alps_7920,RORSPITZLI,,46.690556,8.522778,3220 +alps_7921,SALBIT SCHIJEN,,46.680556,8.529444,2981 +alps_7922,SUCKLISTOCK,,46.716944,8.486944,3308 +alps_7923,SCHWARZ STOCK,,46.702778,8.548889,2635 +alps_7924,SPITZLI,,46.697500,8.531111,3011 +alps_7925,MUTSCHEN,,46.726667,8.587778,2144 +alps_7926,MITTAGSTOCK,,46.706111,8.561667,2506 +alps_7927,OBER RISCHI,,46.684444,8.580556,1735 +alps_7928,ZUESSENEGGHUBEL,,46.750000,7.749167,1427 +alps_7929,SCHWENDIBLUME,,46.747222,7.710556,1396 +alps_7930,SIEBEN HENGSTE,,46.758889,7.819444,1952 +alps_7931,SCHIBE,,46.749444,7.807778,1954 +alps_7932,BURST,,46.753611,7.801389,1969 +alps_7933,MITTAGHORN,,46.738333,7.778889,2014 +alps_7934,TROGENHORN,,46.778889,7.859444,1972 +alps_7935,BOLBERG,,46.753056,7.883611,1799 +alps_7936,FURGGENGUETSCH,,46.788056,7.901667,2197 +alps_7937,BLASENHUBEL,,46.751389,7.945278,1965 +alps_7938,GUMMHORN,,46.758611,7.955278,2040 +alps_7939,AUGSTMATTHORN,,46.742222,7.928611,2137 +alps_7940,SUGGITURE,,46.734722,7.920833,2085 +alps_7941,TANNHORN,,46.775000,7.984444,2221 +alps_7942,AELLGAEUHORN,,46.768333,7.972500,2047 +alps_7943,SCHNIERENHORN,,46.764444,7.965000,2069 +alps_7944,BRIEFENHORN,,46.783056,8.004722,2165 +alps_7945,BRIENZER ROTHORN,,46.787222,8.046944,2350 +alps_7946,DIRRENGRIND,,46.779167,8.036389,1957 +alps_7947,WILERHORN,,46.773611,8.109167,2005 +alps_7948,HORN,,46.781667,8.193889,1858 +alps_7949,SCHILD,,46.777778,8.178889,1581 +alps_7950,GIBEL,,46.770278,8.189722,2035 +alps_7951,ERZBIEL,,46.773889,8.201111,1711 +alps_7952,CHINGSTUEL,,46.769444,8.206667,2118 +alps_7953,HOHBIEL,,46.761389,8.220556,2037 +alps_7954,SCHLOSS HUBEL,,46.757222,8.160000,1353 +alps_7955,RISETLI,,46.756667,8.188611,1466 +alps_7956,BURG,,46.749167,8.170000,1099 +alps_7957,GMEINDI,,46.741111,8.196389,1149 +alps_7958,SEEFELDSTOCK,,46.783611,8.228056,2129 +alps_7959,MURMELCHOPF,,46.785278,8.250833,2254 +alps_7960,HOCHSTOLLEN,,46.773333,8.238333,2481 +alps_7961,FULENBERG,,46.767500,8.246944,2381 +alps_7962,GLOGGHUS,,46.760556,8.262500,2534 +alps_7963,ROTHORN,,46.755278,8.268611,2525 +alps_7964,NOLLEN,,46.778611,8.276667,2026 +alps_7965,ABGSCHUETZ,,46.780000,8.233889,2263 +alps_7966,SCHAFLECHI,,46.776944,8.228611,2107 +alps_7967,SPAETBUEL,,46.772778,8.248611,1989 +alps_7968,VOGELBIEL,,46.768333,8.265000,2026 +alps_7969,HOHSTRAESS,,46.763889,8.241111,2221 +alps_7970,MELCHSEE STOCK,,46.759444,8.284722,2227 +alps_7971,LEITISTOECK,,46.755000,8.234167,1973 +alps_7972,LAEUBER,,46.751111,8.269722,2491 +alps_7973,HOEHI EGG,,46.749167,8.269444,2439 +alps_7974,TALISTOCK,,46.755833,8.278333,2297 +alps_7975,NOLLEN,,46.746389,8.267222,2329 +alps_7976,BALMER EGGHORN,,46.753056,8.283333,2255 +alps_7977,RINDERMAD,,46.741111,8.271667,1947 +alps_7978,GUMMENHUBEL,,46.733056,8.251944,2195 +alps_7979,BONISTOCK,,46.777222,8.291667,2169 +alps_7980,TANNENSCHILD,,46.778611,8.296944,2185 +alps_7981,VOGELBUEL,,46.782500,8.329722,2073 +alps_7982,ERZEGG,,46.758056,8.291111,2199 +alps_7983,TAELLISTOCK,,46.745556,8.325000,2580 +alps_7984,CHLINE TAELLI,,46.750556,8.327778,2434 +alps_7985,REISSEND NOLLEN,,46.766389,8.400833,3003 +alps_7986,WENDENSTOECKER,,46.761667,8.380278,3042 +alps_7987,PFAFFENHUET,,46.758611,8.373889,3009 +alps_7988,MAEHREN,,46.757500,8.369167,2970 +alps_7989,MERLEN,,46.756389,8.359722,2778 +alps_7990,SCHAFBERG,,46.784444,8.378889,2522 +alps_7991,ROT NOLLEN,,46.780278,8.382222,2309 +alps_7992,OCHSENHORN,,46.779444,8.391389,2343 +alps_7993,JOCHSTOCK,,46.771667,8.395278,2563 +alps_7994,HIENSTOCK,,46.765278,8.373333,2539 +alps_7995,PFRIENDLER,,46.739167,8.418056,2495 +alps_7996,URATHUBEL,,46.753056,8.413333,2111 +alps_7997,GRAETLI,,46.743889,8.396667,2065 +alps_7998,FELDMOOS HUBEL,,46.736667,8.391389,1630 +alps_7999,TITLIS,,46.771944,8.437778,3238 +alps_8000,RUCHBERG,,46.781389,8.464722,2214 +alps_8001,ROTSTOECKLI,,46.777778,8.425833,2901 +alps_8002,KLEIN TITLIS,,46.770556,8.425278,3065 +alps_8003,TIERBERG,,46.770278,8.446667,2647 +alps_8004,STROESSEN STOCK,,46.767778,8.473056,2940 +alps_8005,GRASSENGRAT,,46.769444,8.483056,2906 +alps_8006,WICHELPLANGG STOECK,,46.765556,8.472778,2974 +alps_8007,MURMETS PLANGG STOECK,,46.761111,8.475833,2864 +alps_8008,GRASSEN,,46.763333,8.448333,2946 +alps_8009,WASENHORN,,46.758056,8.447222,2932 +alps_8010,HEUBERG,,46.742778,8.440278,2785 +alps_8011,URATSTOCK,,46.754722,8.435000,2911 +alps_8012,FUNF FINGER STOCK,,46.752222,8.436111,2994 +alps_8013,UNTERTAL STOCK,,46.747222,8.424444,2739 +alps_8014,WENDENDORN,,46.753889,8.443611,3023 +alps_8015,SUSTLI HUETTE,,46.751667,8.470833,2257 +alps_8016,SUSTENLOCH SPITZ,,46.748056,8.443333,2916 +alps_8017,GUFERSTOCK,,46.743889,8.456389,2487 +alps_8018,OBERTAL STOCK,,46.747778,8.436389,2833 +alps_8019,SCHATTMIGE STOCK,,46.752778,8.427222,2698 +alps_8020,BAERFALLEN,,46.738333,8.507222,1648 +alps_8021,CHLI SPANNORT,,46.780278,8.516944,3140 +alps_8022,JAZFADSTOCK,,46.770278,8.516389,2770 +alps_8023,GLATT STOCK,,46.779167,8.523611,3048 +alps_8024,ZWAECHTEN,,46.776389,8.536667,3079 +alps_8025,SCHNEE HUEENERSTOCK,,46.782778,8.551389,2860 +alps_8026,CHUEEFAD STOCK,,46.771944,8.503333,2796 +alps_8027,BAEREN GRUEBEN CHOEPFLI,,46.772500,8.491389,2857 +alps_8028,SPITZ PLANGGEN STOCK,,46.760000,8.544167,2822 +alps_8029,MIES PLANGGEN STOCK,,46.756389,8.545278,2874 +alps_8030,SCHAF SCHIJEN,,46.751944,8.545833,2840 +alps_8031,HELGENFLUEE,,46.748056,8.540833,2510 +alps_8032,BAECHENSTOCK,,46.768056,8.536667,3008 +alps_8033,HOH SEWEN,,46.763333,8.531944,2965 +alps_8034,HOHBERG STOECKLI,,46.753333,8.493611,2460 +alps_8035,WITENSTOCK,,46.751111,8.601111,2392 +alps_8036,SCHNUERSTOCK,,46.743611,8.603889,2131 +alps_8037,SCHWARZ BERG,,46.739167,8.607778,1868 +alps_8038,ERZSTOCK,,46.760000,8.587500,2414 +alps_8039,SCHROTEN STOCK,,46.766667,8.574444,2773 +alps_8040,GRUEEN PLAENGGI STOCK,,46.772778,8.573889,2764 +alps_8041,WICHELHORN,,46.773889,8.587222,2767 +alps_8042,MITTELSTOCK,,46.774722,8.603056,2584 +alps_8043,FURTSTOCK,,46.776111,8.608889,2413 +alps_8044,SCHNEE HUEENER STOECKLI,,46.776111,8.573611,2829 +alps_8045,KROENTEN,,46.782222,8.569444,3107 +alps_8046,SCHNEE HUEENER STOCK,,46.781111,8.556389,2945 +alps_8047,SAAS SEELI,,46.773889,8.562778,2455 +alps_8048,SUNNIG,,46.782778,8.582778,2839 +alps_8049,LAUCHERSTOCK,,46.744444,8.558056,2553 +alps_8050,APRIGEN STOCK,,46.740556,8.572222,2591 +alps_8051,ROTE GRATE,,46.736111,8.576111,2441 +alps_8052,SCHROTISTOCK,,46.733889,8.578611,2432 +alps_8053,LEID STOCK,,46.731389,8.582222,2418 +alps_8054,RINISTOCK,,46.741389,8.561389,2480 +alps_8055,HONEGG,,46.803333,7.804722,1546 +alps_8056,HENGST,,46.834167,7.957500,2092 +alps_8057,SCHIBENGUETSCH,,46.813889,7.948056,2037 +alps_8058,JURTENFLUE,,46.789167,7.915000,1950 +alps_8059,BRUENNELIGRIND,,46.793889,7.933333,1790 +alps_8060,HIRSWAENGI,,46.836667,8.042500,1948 +alps_8061,NUENALPSTOCK,,46.830556,8.055833,1901 +alps_8062,ROTSPITZ,,46.823611,8.069444,1788 +alps_8063,ARNITRISTE,,46.797778,8.078056,2005 +alps_8064,ARNIHAAGGEN,,46.790833,8.073056,2219 +alps_8065,HOECH GUMME,,46.787778,8.090000,2205 +alps_8066,NESSLENSTOCK,,46.798611,8.055000,1820 +alps_8067,BRAETTERSTOCK,,46.792778,8.040278,2114 +alps_8068,SCHONGUETSCH,,46.788889,8.036389,2320 +alps_8069,SCHAFNASE,,46.812222,8.106944,2011 +alps_8070,ROSSFLUE,,46.805556,8.106944,2073 +alps_8071,ANKENHUBEL,,46.809444,8.143611,1549 +alps_8072,TURREN,,46.789722,8.131667,1562 +alps_8073,MAENDLI,,46.797500,8.105833,2060 +alps_8074,ENET STOCKEN,,46.837222,8.202222,881 +alps_8075,IFANG,,46.815278,8.168056,746 +alps_8076,GUEPFI,,46.796111,8.195278,2043 +alps_8077,HOEH GRAT,,46.808333,8.195556,1922 +alps_8078,WANDELEN,,46.822778,8.247778,2104 +alps_8079,BOCKI,,46.806389,8.245000,2073 +alps_8080,HANEN,,46.824167,8.234167,2015 +alps_8081,WENGENHORN,,46.823611,8.244167,2099 +alps_8082,HEITLISTOCK,,46.810833,8.250556,2146 +alps_8083,CHNEBELHORN,,46.819167,8.272222,1717 +alps_8084,RAEMISGUETSCH,,46.816667,8.270000,1862 +alps_8085,HAUPT,,46.787222,8.252778,2311 +alps_8086,HOHLIECHT,,46.835833,8.344722,2102 +alps_8087,WIDDERFELD STOCK,,46.833889,8.332500,2351 +alps_8088,BOCKIGGRAT,,46.828333,8.341944,2206 +alps_8089,SCHEIDEGG STOCK,,46.827222,8.353611,2078 +alps_8090,NUENALPHORN,,46.823889,8.325556,2384 +alps_8091,HUETSTOCK,,46.811667,8.331667,2676 +alps_8092,HANGHORN,,46.804444,8.343333,2679 +alps_8093,ROTSAND NOLLEN,,46.800556,8.343889,2699 +alps_8094,HENGLIHORN,,46.795278,8.353889,2638 +alps_8095,BARGLEN,,46.796667,8.331944,2669 +alps_8096,HOHMAD,,46.791111,8.320556,2491 +alps_8097,GROSS SCHINDER,,46.796667,8.317500,2197 +alps_8098,SCHILD,,46.793889,8.310000,2085 +alps_8099,CHRUEZ HUBEL,,46.798333,8.385278,1845 +alps_8100,BITZI STOCK,,46.800556,8.390556,1895 +alps_8101,BURGHUBEL,,46.794722,8.395556,1829 +alps_8102,GRAUSTOCK,,46.788056,8.368889,2661 +alps_8103,GROSS GEMSISPIL,,46.835833,8.463056,2518 +alps_8104,STOTZIG BERG GRAT,,46.826944,8.483333,2645 +alps_8105,STOTZIG BERG,,46.818611,8.482500,2739 +alps_8106,WISSBERG,,46.813889,8.478056,2627 +alps_8107,FULEN WASSER GRAT,,46.827500,8.474444,2514 +alps_8108,HAHNEN,,46.823889,8.455556,2606 +alps_8109,LEIST,,46.837500,8.493056,2727 +alps_8110,ROT SCHUTZ,,46.834444,8.505833,2351 +alps_8111,TURM,,46.834167,8.529444,2367 +alps_8112,BREIT STOCK,,46.827778,8.551389,2464 +alps_8113,VORDER SCHLOSS,,46.816389,8.546944,2871 +alps_8114,VORDER SCHLOSS,,46.813889,8.541944,2931 +alps_8115,HINTER SCHLOSS,,46.802500,8.526944,3132 +alps_8116,EGGEN MANDLI,,46.831944,8.551944,2448 +alps_8117,GRUEEN BIEL,,46.828889,8.495000,2127 +alps_8118,BLACKEN KAPPELI,,46.825278,8.513056,1773 +alps_8119,GROSS SPANNORT,,46.786667,8.524444,3198 +alps_8120,CHLI KROENTEN,,46.784167,8.575556,2910 +alps_8121,ROT STOCK,,46.787500,8.579167,2718 +alps_8122,MAENTLISER,,46.786944,8.588056,2876 +alps_8123,HINTER PAEUGGER STOECKLI,,46.793889,8.585000,2508 +alps_8124,VORDER PAEUGGEN STOECKLI,,46.798611,8.585556,2359 +alps_8125,RUND STOCK,,46.788889,8.570000,2484 +alps_8126,OBER NAGELDACH,,46.832778,8.556667,2291 +alps_8127,AELPLISTOCK,,46.820000,8.566944,2713 +alps_8128,FLAEUGENFAD HORN,,46.821389,8.575556,2710 +alps_8129,RUND STOCK,,46.825556,8.590278,2459 +alps_8130,HOCH GEISSBERG,,46.826111,8.596389,2395 +alps_8131,WANNELI HORN,,46.828611,8.613056,1848 +alps_8132,RUNS STOECKLI,,46.829444,8.580556,2027 +alps_8133,FRUTTEGG,,46.810556,8.579722,1518 +alps_8134,RUND HORN,,46.803333,8.616111,1779 +alps_8135,OBERSEE MANDLI,,46.800278,8.561389,2227 +alps_8136,RUCHEN,,46.791389,8.599167,2623 +alps_8137,GWASMET,,46.797500,8.611111,2265 +alps_8138,JAKOBIGER,,46.793056,8.612500,2505 +alps_8139,PFYFFER,,46.870833,7.857778,1315 +alps_8140,OBER MEISENEGG,,46.863611,7.869444,1274 +alps_8141,WACHTHUBEL,,46.847222,7.869722,1415 +alps_8142,HUERNLIEGG,,46.847778,7.939722,1597 +alps_8143,STRICK,,46.854444,7.985556,1946 +alps_8144,HAECHLEN,,46.845556,7.971111,2091 +alps_8145,SCHWAENDILIFLUE,,46.887778,8.037222,1797 +alps_8146,CHLI FURSTEIN,,46.890833,8.069722,1994 +alps_8147,RICKHUBEL,,46.895000,8.090000,1943 +alps_8148,TROGENEGG,,46.876111,8.090000,1821 +alps_8149,SATTELSTOCK,,46.869167,8.073889,1769 +alps_8150,BLEIKENCHOPF,,46.856667,8.044444,1681 +alps_8151,BAERENTURM,,46.861667,8.072222,1799 +alps_8152,HALDIMATTSTOCK,,46.843611,8.071944,1793 +alps_8153,GLAUBENSTOCK,,46.892222,8.111111,1690 +alps_8154,RIEDMATTSTOCK,,46.875000,8.116111,1787 +alps_8155,MIESENSTOCK,,46.871944,8.096389,1891 +alps_8156,RIEDMATTSTOECKLI,,46.862778,8.102778,1757 +alps_8157,RISEGG,,46.881667,8.207778,850 +alps_8158,OBSTOCKEN,,46.845000,8.214722,841 +alps_8159,IFANG,,46.869722,8.262222,740 +alps_8160,HOHMAD,,46.840833,8.264722,1934 +alps_8161,HOCH DOSSEN,,46.845833,8.271944,1877 +alps_8162,GRAEFIMATT STAND,,46.873056,8.328056,2050 +alps_8163,LAUCHEREN STOCK,,46.872222,8.336389,2005 +alps_8164,PLATTENEGG,,46.883056,8.353611,1659 +alps_8165,GRAEFIMATT NOLLEN,,46.878056,8.328333,2034 +alps_8166,WINTERHALTEN GRAT,,46.883889,8.347778,1756 +alps_8167,HOECHGRAT,,46.872778,8.318611,2019 +alps_8168,SCHLUCK BERG,,46.866944,8.333611,2106 +alps_8169,WAGENLEIS,,46.864722,8.334444,2055 +alps_8170,STOREGG HORN,,46.846944,8.327778,1872 +alps_8171,SALISTOCK,,46.840278,8.355000,1896 +alps_8172,HOERNLI,,46.888889,8.359167,1576 +alps_8173,VORDER WALENSTOCK,,46.858889,8.408333,2341 +alps_8174,RIGIDAL STOCK,,46.852222,8.419444,2593 +alps_8175,RINDERBALM,,46.891111,8.447778,1825 +alps_8176,SCHONEGRAT,,46.887500,8.476667,1924 +alps_8177,CHAISERSTUEL,,46.877222,8.467778,2401 +alps_8178,WILDALPELI,,46.875833,8.453333,2039 +alps_8179,HASENSTOCK,,46.859444,8.468889,2720 +alps_8180,RUCHSTOCK,,46.856389,8.470833,2814 +alps_8181,SCHINBERG,,46.859722,8.448889,2372 +alps_8182,SPITZ MANN,,46.851111,8.426389,2578 +alps_8183,SCHYEGG STOCK,,46.850278,8.430278,2568 +alps_8184,GROSS SAETTELISTOCK,,46.853056,8.437222,2636 +alps_8185,LAUCHEREN STOCK,,46.855000,8.459167,2638 +alps_8186,OBERBERG,,46.857222,8.480000,2782 +alps_8187,HASENSTOCK,,46.855000,8.485000,2729 +alps_8188,FIRLEGGI,,46.860278,8.458889,2302 +alps_8189,SATTELI TEUFI,,46.855833,8.431111,2294 +alps_8190,RINDERBUEEL,,46.838889,8.460833,2135 +alps_8191,BAERENSTOCK,,46.886389,8.503611,2107 +alps_8192,FULEN,,46.891111,8.536389,2057 +alps_8193,CHLI SCHLIEREN,,46.878611,8.535833,2155 +alps_8194,SCHLIEREN,,46.867500,8.533889,2830 +alps_8195,URI ROTSTOCK,,46.861667,8.535278,2928 +alps_8196,CHLI RIMISTOCK,,46.867778,8.498889,2197 +alps_8197,ENGELBERGER ROTSTOCK,,46.853889,8.497778,2818 +alps_8198,WISSIG STOCK,,46.845556,8.506944,2887 +alps_8199,SCHLOSS STOCK,,46.852500,8.514444,2662 +alps_8200,BRUNNISTOCK,,46.847778,8.550000,2952 +alps_8201,BLACKEN STOCK,,46.840833,8.537778,2930 +alps_8202,SCHUFLEN,,46.840278,8.502500,2822 +alps_8203,HINTER WANG,,46.890556,8.566111,1579 +alps_8204,GITSCHEN,,46.877222,8.575278,2511 +alps_8205,HINTER GAEMSCHFELD,,46.870556,8.566389,2519 +alps_8206,ROT GITSCHEN,,46.860833,8.558611,2673 +alps_8207,HINTER HOHNAETSCH,,46.850278,8.587500,1875 +alps_8208,ANGISTOCK,,46.841389,8.562500,2070 +alps_8209,NUSSFRUTTLI,,46.843611,8.566389,1953 +alps_8210,CHRAEIEN HOERELI,,46.843333,8.594167,1703 +alps_8211,BRANDSEGG,,46.945833,7.948889,1147 +alps_8212,BOCKSHORN,,46.930000,7.923333,1253 +alps_8213,TURNER,,46.933333,7.912500,1215 +alps_8214,BEICHLEN,,46.897778,7.973333,1769 +alps_8215,OBER FARNEREN,,46.934167,8.041667,1572 +alps_8216,SCHAFMATT,,46.912222,8.063611,1979 +alps_8217,FURSTEIN,,46.895833,8.070000,2039 +alps_8218,GRONFLUE,,46.899167,8.048056,1946 +alps_8219,SCHINBRIG,,46.939722,8.113889,1815 +alps_8220,SCHLIERENGRAT,,46.922500,8.134722,1748 +alps_8221,WIELESCHIEGG,,46.896389,8.142222,1726 +alps_8222,FALHOERNLI,,46.930833,8.216944,1028 +alps_8223,ETTLISMATT GRAT,,46.940833,8.208056,1515 +alps_8224,MEIEN GRAETLI,,46.941389,8.185833,1671 +alps_8225,BUCK,,46.915000,8.201111,1626 +alps_8226,HOHFLUE,,46.915278,8.192222,1702 +alps_8227,CHAESEREN GUETSCH,,46.912500,8.182500,1663 +alps_8228,JANZI,,46.912222,8.171389,1737 +alps_8229,HUEENER GUETSCH,,46.908333,8.164444,1728 +alps_8230,BRANDI GUETSCH,,46.920278,8.288889,614 +alps_8231,BURGFLUE,,46.899444,8.285000,683 +alps_8232,STANZERHORN,,46.929722,8.340278,1898 +alps_8233,CHLI HORN,,46.926111,8.341111,1786 +alps_8234,OBER EI,,46.908889,8.306111,829 +alps_8235,BLATTI,,46.935000,8.367222,1583 +alps_8236,VORDER GUMMEN,,46.902778,8.365833,1614 +alps_8237,BUOCHSER HORN,,46.945556,8.428611,1807 +alps_8238,STOLLEN,,46.939444,8.488889,1677 +alps_8239,KLEMENSTOCK,,46.933611,8.478333,1748 +alps_8240,GUGGEREGG,,46.940278,8.473056,1593 +alps_8241,MUSENALPER GRAT,,46.930556,8.441389,1785 +alps_8242,BOES EGG,,46.934167,8.450556,1488 +alps_8243,BACH SCHEITI STOCK,,46.933611,8.464722,1595 +alps_8244,SCHEIDEGG,,46.920278,8.467778,1781 +alps_8245,BRAENDLIS BODEN,,46.920556,8.449444,1474 +alps_8246,SCHINBERG,,46.913056,8.476389,2145 +alps_8247,GIRI,,46.903889,8.432500,1923 +alps_8248,GIGICHRUEZ,,46.905833,8.428611,1875 +alps_8249,DRAECKGADEN,,46.906111,8.446389,1794 +alps_8250,RISETEN STOCK,,46.908611,8.481389,2290 +alps_8251,BRISEN,,46.898889,8.458333,2404 +alps_8252,MAISANDER,,46.893333,8.474167,2145 +alps_8253,HOH BRISEN,,46.897500,8.465556,2413 +alps_8254,FAERLIBODEN,,46.945833,8.496944,1273 +alps_8255,HOHBERG BUEEL,,46.942222,8.525556,1464 +alps_8256,SCHOENEN BUEEL,,46.941944,8.531389,1508 +alps_8257,SEELIBODEN,,46.941667,8.538611,1528 +alps_8258,ROSSGRABEN EGG,,46.935278,8.527222,1393 +alps_8259,FULBERG,,46.935278,8.539722,1687 +alps_8260,OBER BAUENSTOCK,,46.927778,8.544444,2116 +alps_8261,SCHWALMIS,,46.918611,8.493611,2246 +alps_8262,HEITLIBERG,,46.928889,8.490833,1778 +alps_8263,ALPELER,,46.896389,8.490556,1854 +alps_8264,SCHRINDI,,46.903333,8.505556,1603 +alps_8265,SCHEIDEGG,,46.917222,8.565278,1407 +alps_8266,SCHARTI HOERELI,,46.898611,8.568333,1693 +alps_8267,GEISSGRATFLUE,,46.998056,7.871667,1345 +alps_8268,HOCHSUREBODEN,,46.996111,7.905278,1316 +alps_8269,GRUEBLI,,46.998333,7.931667,1310 +alps_8270,CHAMPECHNUBEL,,46.972778,7.943889,1261 +alps_8271,BREITAEBNIT,,46.998611,7.984444,1209 +alps_8272,BACHEGG,,46.958611,7.973889,1163 +alps_8273,OBER HEUBODEN,,46.969167,8.137778,1395 +alps_8274,RISETENSTOCK,,46.957778,8.150278,1759 +alps_8275,STAEFELIEGG,,46.976944,8.164444,1388 +alps_8276,REGENFLUEELI,,46.990833,8.204167,1582 +alps_8277,STUDBERG,,46.986389,8.201944,1603 +alps_8278,OCHS,,46.984722,8.189722,1594 +alps_8279,HUEENER HUBEL,,46.983611,8.183056,1577 +alps_8280,FELDI MOOSEGG,,46.983333,8.164444,1297 +alps_8281,GNEPFSTEIN,,46.971667,8.187500,1916 +alps_8282,NAETSCH,,46.968611,8.195000,1827 +alps_8283,STAEFELI FLUE,,46.964722,8.164444,1922 +alps_8284,FIRST,,46.951944,8.166111,1682 +alps_8285,LAENGEN SCHWAND GRAT,,46.955278,8.190000,1442 +alps_8286,ROT DOSSEN,,46.967222,8.201667,1776 +alps_8287,KLIMSEN HORN,,46.983333,8.250000,1907 +alps_8288,ESEL,,46.979167,8.256111,2120 +alps_8289,STEIGLIHORN,,46.978056,8.262500,1968 +alps_8290,WIDDERFELD,,46.970000,8.228889,2075 +alps_8291,TOMLISHORN,,46.973889,8.241111,2128 +alps_8292,MATTHORN,,46.970556,8.252778,2042 +alps_8293,HASLIHORN,,46.975833,8.307222,961 +alps_8294,ROTZBERG,,46.964167,8.336389,672 +alps_8295,DRACHENFLUE,,46.954444,8.319167,859 +alps_8296,BURGENSTOCK,,46.996111,8.376944,894 +alps_8297,HAMMETSCHWAND,,47.000278,8.398333,1128 +alps_8298,GIGEREGG,,46.993056,8.396944,929 +alps_8299,CHAPPELMATT,,46.993889,8.371111,926 +alps_8300,AETSCHEN RIEDGRAT,,46.985833,8.384167,999 +alps_8301,SEEMLIGGRAT,,46.977222,8.365278,1003 +alps_8302,VORDER ENNERBERG,,46.962500,8.390278,523 +alps_8303,SCHLUSSEL HORN,,46.999167,8.428611,805 +alps_8304,RAPPERSFLUE,,46.998889,8.437500,800 +alps_8305,SCHARTIGRAT,,46.999167,8.447222,779 +alps_8306,UNTER LINDEN,,46.996389,8.481667,630 +alps_8307,GUBEREN TOSSEN,,46.953611,8.436111,1553 +alps_8308,GROSS HORNZUG,,46.955833,8.438611,1522 +alps_8309,OBER RAENGG,,46.994444,8.496111,741 +alps_8310,SEELI,,46.958889,8.572222,738 +alps_8311,BRANDEGG,,46.971389,8.576111,1108 +alps_8312,SCHEIDEGG,,46.963889,8.567778,1005 +alps_8313,NIEDERBAUEN CHULM,,46.947778,8.556944,1923 +alps_8314,GLOGGESPITZ,,46.612222,8.661944,2393 +alps_8315,SCHWARZBERG,,46.609444,8.677778,2763 +alps_8316,PIZ TAGLIOLA,,46.620000,8.676667,2708 +alps_8317,AELPETLI GRAT,,46.609167,8.626389,2585 +alps_8318,PORTGEREN STOCK,,46.601667,8.677222,2752 +alps_8319,GAFALLEN GRAT,,46.602778,8.629722,2719 +alps_8320,GURSCHEN STOCK,,46.606944,8.617500,2865 +alps_8321,PIZZO CENTRALE,,46.578056,8.615000,2999 +alps_8322,LA ROSSA,,46.576667,8.666944,2792 +alps_8323,PIZZO PREVAT,,46.573889,8.629444,2876 +alps_8324,ROTSTOCK,,46.575000,8.632222,2858 +alps_8325,PIZZO BARBERERA,,46.570556,8.658611,2808 +alps_8326,BASSA DELLA ROSSA,,46.574444,8.664167,2690 +alps_8327,TUORS PARADIS,,46.616944,8.729444,2859 +alps_8328,TGIERN TUMA,,46.618056,8.744167,2765 +alps_8329,PIZ PARADIS,,46.611389,8.735556,2884 +alps_8330,PIZ PIOGN CRAP,,46.612778,8.701111,2725 +alps_8331,PIZ PLAUNCA COTSCHNA,,46.608056,8.699444,2766 +alps_8332,PIZ FUORCLA,,46.602500,8.734722,2912 +alps_8333,PIZ ALPETTA,,46.602500,8.703611,2845 +alps_8334,PIZ SERENGIA,,46.596111,8.733611,2986 +alps_8335,TGIERN RAVETSCH,,46.591667,8.703611,2944 +alps_8336,PIZ GIT,,46.589444,8.731389,2968 +alps_8337,PIZ UFFIERN,,46.584167,8.731111,3013 +alps_8338,PIZ RAVETSCH,,46.584444,8.703056,3007 +alps_8339,PIZ BOREL,,46.582222,8.699444,2952 +alps_8340,FIL CURNERA,,46.578889,8.702778,2907 +alps_8341,PIZ ALV,,46.579167,8.678611,2769 +alps_8342,PIZ TANELIN,,46.571389,8.718056,2847 +alps_8343,PIZ BLAS,,46.577222,8.728056,3019 +alps_8344,PIZ DENTER,,46.573889,8.723056,2956 +alps_8345,PIZ CURNERA,,46.573889,8.705278,2796 +alps_8346,TGIERN SOGN GIONS,,46.618611,8.801667,2677 +alps_8347,PIZ GANNARETSCH,,46.611944,8.786667,3039 +alps_8348,PIZ VATGIRA,,46.606111,8.770833,2983 +alps_8349,PIZ LAI BLAU,,46.597778,8.765278,2961 +alps_8350,PIZ DALLA VAL,,46.590278,8.756111,2819 +alps_8351,FIL RONDADURA,,46.585000,8.753056,2780 +alps_8352,FUORCLA RONDADURA,,46.582222,8.751389,2707 +alps_8353,SCALA DA MARMEL,,46.580556,8.756667,2767 +alps_8354,PIZ RONDADURA,,46.576111,8.750833,3016 +alps_8355,PIZ SCALA,,46.574444,8.762778,2741 +alps_8356,PIZ CURVET,,46.616667,8.833889,2247 +alps_8357,PIZ STARLERA,,46.615833,8.863611,2711 +alps_8358,FIL DA GARVIEL,,46.605278,8.834444,2492 +alps_8359,PIZ GARVIEL,,46.593611,8.832222,2736 +alps_8360,PIZ VALLATSCHA,,46.581667,8.831944,3109 +alps_8361,FUORN DIL VIGELI,,46.583611,8.826111,2805 +alps_8362,CIMA DELLA BIANCA,,46.573056,8.863056,2893 +alps_8363,PIZ MIEZ,,46.576389,8.831944,3119 +alps_8364,SCOPI,,46.571667,8.830000,3189 +alps_8365,PIZ DALLA SIALA,,46.616389,8.880556,3023 +alps_8366,PIZ CRISTALLINA,,46.609722,8.881944,3128 +alps_8367,CIMA DI CAMADRA,,46.610000,8.906111,3172 +alps_8368,PIZ UFFIERN,,46.610000,8.893611,3151 +alps_8369,PIZ A SPESCHA,,46.612222,8.879722,3109 +alps_8370,CIMA DI GARINA,,46.584167,8.903611,2780 +alps_8371,PIZZO COROI,,46.602500,8.973056,2785 +alps_8372,LUNGADERA,,46.591667,8.994722,2356 +alps_8373,PIZZO MARUMO,,46.598611,8.959722,2790 +alps_8374,CIMA DI SASSINA,,46.590833,8.959167,2515 +alps_8375,TOROI,,46.592500,8.976111,2520 +alps_8376,FILO DI STANGA,,46.587778,8.978889,2439 +alps_8377,PIZZO PIANCA,,46.576389,8.961944,2376 +alps_8378,PIZ CANAL,,46.611389,9.024722,2846 +alps_8379,PIZ NER,,46.607222,9.011667,2766 +alps_8380,PIXXO DI GUIDA,,46.603333,9.016111,2845 +alps_8381,PIZ TERRI,,46.600000,9.034167,3149 +alps_8382,PIZ ALPETTAS,,46.589722,9.041667,2979 +alps_8383,PIZ SCHARBODA,,46.580278,9.050000,3122 +alps_8384,PIZ TREIS FUORCLAS,,46.583333,9.043889,2988 +alps_8385,PIZ VAL NOVA,,46.577222,9.054444,3051 +alps_8386,PIZ LA CAPIALA,,46.578056,9.063889,2780 +alps_8387,TORRONE DI GARZORA,,46.571389,9.030000,3017 +alps_8388,TORNO,,46.571389,9.010833,2556 +alps_8389,VERNOK HOERNER,,46.562500,9.026667,3043 +alps_8390,SCHWARZHORN,,46.607500,9.106667,2944 +alps_8391,FALTSCHEN HORN,,46.612500,9.115000,3022 +alps_8392,FRUNTHORN,,46.586111,9.088889,3030 +alps_8393,PIZ CONTESCHA,,46.577500,9.071111,2795 +alps_8394,HOHBUEEL,,46.581944,9.171111,2462 +alps_8395,AMPERVREIL HORN,,46.569444,9.158333,2802 +alps_8396,HENNEN SAEDEL,,46.569167,9.145278,2668 +alps_8397,GURALETSCH HORN,,46.564444,9.150833,2908 +alps_8398,STRAETCHER HORN,,46.598889,9.249722,2558 +alps_8399,TEISCHER,,46.591111,9.216944,2688 +alps_8400,BAERENHORN,,46.575556,9.231944,2929 +alps_8401,TAELLIHORN,,46.566667,9.228611,2820 +alps_8402,VALSERHORN,,46.560278,9.208333,2886 +alps_8403,PIZZAS D'ANAROSA,,46.598889,9.315833,3000 +alps_8404,BODENHORN,,46.594167,9.297222,2698 +alps_8405,WISSHORN,,46.584167,9.293333,2988 +alps_8406,STEILER HORN,,46.583889,9.316111,2980 +alps_8407,ALPER SCHAELLIHORN,,46.586944,9.306944,3039 +alps_8408,TEURIHORN,,46.576111,9.318611,2973 +alps_8409,SCHOLLEN HORN,,46.564167,9.274167,2732 +alps_8410,PIZ VIZAN,,46.601944,9.382222,2471 +alps_8411,VIZAN PINTG,,46.598889,9.373056,2512 +alps_8412,CUFERCAL HORN,,46.595000,9.333889,2799 +alps_8413,VERSANGGA,,46.590000,9.343333,2548 +alps_8414,PIZ CALANDARI,,46.596667,9.360556,2556 +alps_8415,TSCHAINGEL MELLEN,,46.592778,9.376944,2370 +alps_8416,STUTZHORN,,46.576389,9.351111,2131 +alps_8417,RUNDHORN,,46.575833,9.334722,2548 +alps_8418,SCHWARZWALD CHOPF,,46.563611,9.392500,1650 +alps_8419,MUTTANS,,46.575556,9.402222,1997 +alps_8420,CURVER PINTG DA NEAZA,,46.607222,9.487500,2721 +alps_8421,PIZ CURVER,,46.603333,9.497222,2972 +alps_8422,PIZ BOVS,,46.573889,9.521944,2631 +alps_8423,PIZ CARTAS,,46.569167,9.514167,2711 +alps_8424,NOLLA,,46.565556,9.479444,2641 +alps_8425,PIZ DIGL GURSCHUS,,46.558611,9.488889,2844 +alps_8426,PIZ DIGL GURSCHUS,,46.560000,9.492500,2880 +alps_8427,SUR CARUNGAS,,46.564167,9.501667,2829 +alps_8428,BRUNNEN STOCK,,46.674167,8.641944,2888 +alps_8429,UNGHUER STOECKLI,,46.671944,8.655556,2773 +alps_8430,GROSS SCHIJEN,,46.668056,8.638333,2785 +alps_8431,CHLI SCHIJEN,,46.663889,8.628611,2606 +alps_8432,PAZOLA STOCK,,46.647778,8.658056,2740 +alps_8433,TUEMSLI,,46.641667,8.657500,2743 +alps_8434,ROSSBODEN STOCK,,46.635278,8.651111,2835 +alps_8435,PARLET,,46.631111,8.656389,2767 +alps_8436,PIZ TUMA,,46.628333,8.657778,2784 +alps_8437,SIX MADUN,,46.622500,8.663611,2928 +alps_8438,CALMUT,,46.659167,8.684167,2309 +alps_8439,PIZ VAL RUINATSCH,,46.643889,8.731111,2489 +alps_8440,UMCRAP,,46.639722,8.743056,2585 +alps_8441,PIZ CAVRADI,,46.631111,8.693889,2612 +alps_8442,PIZ MALER,,46.633611,8.732222,2790 +alps_8443,PIZ NER,,46.620556,8.730833,2762 +alps_8444,GARVERS DIL TGOM,,46.646111,8.747778,2492 +alps_8445,PIZ VAL AULTA,,46.631667,8.804444,2665 +alps_8446,PIZ GIERM,,46.620833,8.787222,2940 +alps_8447,ILS COTSCHENS,,46.630833,8.786667,2689 +alps_8448,MUSCHANERAS,,46.640000,8.813333,2602 +alps_8449,PIZ PAZZOLA,,46.645000,8.814722,2581 +alps_8450,PIZ AULT,,46.648611,8.873333,2471 +alps_8451,PIZ AULT,,46.650556,8.815000,2455 +alps_8452,PIZ MURAUN,,46.671944,8.906111,2897 +alps_8453,PIZ CAZIRAUNS,,46.658611,8.908889,2935 +alps_8454,PIZ SANTERI,,46.655278,8.925278,2881 +alps_8455,PIZ CORNS,,46.654722,8.916667,2956 +alps_8456,DENTER CORNS,,46.656111,8.910833,2905 +alps_8457,PIZ CASCHLEGLIA,,46.651389,8.904444,2935 +alps_8458,FIL LIUNG,,46.631389,8.916389,3062 +alps_8459,PIZ LA BUORA,,46.631389,8.886389,2678 +alps_8460,REFUGI DA CAMUTSCHS,,46.625556,8.905556,2950 +alps_8461,DAVOS LA BUORA,,46.622222,8.893611,2924 +alps_8462,PIZ MEDEL,,46.618333,8.911111,3211 +alps_8463,PIZ RENTIERT,,46.659444,8.953056,2614 +alps_8464,PIZ STAVELATSCH,,46.657222,8.943056,2754 +alps_8465,PIZ MIEZDI,,46.638611,8.987222,2791 +alps_8466,PIZ VIGLIUTS,,46.640833,8.965278,2639 +alps_8467,PIZ VALDRAUS,,46.632500,8.952778,3096 +alps_8468,PIZ GAGLIANERA,,46.630000,8.957778,3121 +alps_8469,PIZ VIAL,,46.631944,8.969167,3168 +alps_8470,PIZ DA STIARLS,,46.634167,8.981944,2992 +alps_8471,PIZ CUGN,,46.666389,9.015278,2672 +alps_8472,PIZ DA VRIN,,46.658333,9.060000,2563 +alps_8473,LA CAPIALA,,46.657222,9.028611,2710 +alps_8474,PIZ CAVEL,,46.655833,9.019722,2945 +alps_8475,PIZ TGIETSCHEN,,46.646111,9.020833,2858 +alps_8476,PIZ LAS PALAS,,46.642778,9.015278,2799 +alps_8477,PIZ NER,,46.640833,9.025278,2691 +alps_8478,FUORCLA COTSCHNA,,46.641944,9.023889,2586 +alps_8479,ARTG DIESRUT,,46.638056,9.042222,2468 +alps_8480,PIZ STGIR,,46.631667,9.026389,2712 +alps_8481,PIZ ZAMUOR,,46.621944,9.021389,2734 +alps_8482,MUTAUN,,46.622222,9.059167,2545 +alps_8483,FIL BLENGIAS,,46.620833,9.042500,2477 +alps_8484,TGIERN DA VANESCHA,,46.618056,9.066111,2469 +alps_8485,PIZ REGINA,,46.650833,9.136667,2524 +alps_8486,PIZ MIEZDI,,46.644444,9.114444,2370 +alps_8487,PIZ DA RUINAS NERAS,,46.638889,9.116667,2591 +alps_8488,PIZ AUL,,46.622778,9.125000,3121 +alps_8489,WANNEN SPITZ,,46.651111,9.154444,2444 +alps_8490,PIZ NER,,46.645000,9.143056,2622 +alps_8491,BRANDER SPITZLI,,46.641667,9.144722,2738 +alps_8492,SATTELTI CHOPF,,46.628611,9.143333,2864 +alps_8493,PIZ SERENASTGA,,46.633333,9.146389,2874 +alps_8494,CRAP GRISCH,,46.655000,9.232778,2861 +alps_8495,TAELLIHORN,,46.646667,9.238333,2855 +alps_8496,PIZ TOMUEL,,46.623333,9.228333,2946 +alps_8497,VERDUSHORN,,46.653333,9.320278,2634 +alps_8498,CARNUSAHORN,,46.644722,9.315833,2777 +alps_8499,BRUSCHG SPITZ,,46.640000,9.301389,2624 +alps_8500,PIZ TUF,,46.633889,9.328611,2834 +alps_8501,BRUSCHG HORN,,46.631111,9.306667,3058 +alps_8502,GELBHORN,,46.621389,9.306389,3036 +alps_8503,SCHWARZHORN,,46.617778,9.302500,3032 +alps_8504,ZWOELFIHORN,,46.660833,9.397500,2292 +alps_8505,PIZ BEVERIN,,46.652500,9.357778,2997 +alps_8506,BEVERIN PINTG,,46.644167,9.368333,2587 +alps_8507,RUNAL,,46.638611,9.350556,2705 +alps_8508,PIZ TARANTSCHUN,,46.634722,9.341389,2769 +alps_8509,CHRAEJEN CHOEPF,,46.660833,9.353611,2483 +alps_8510,CORN L'ARSO,,46.659722,9.432778,1798 +alps_8511,MUTTNER HORN,,46.650000,9.486389,2401 +alps_8512,BOT SCHISCHLET,,46.642222,9.515278,2170 +alps_8513,CURVER PINTG,,46.624722,9.498889,2731 +alps_8514,PIZ TOISSA,,46.618611,9.525000,2657 +alps_8515,PIZ NEAZA,,46.615556,9.477500,2626 +alps_8516,POERTLISTOECK,,46.724444,8.663611,2283 +alps_8517,RUCHEN,,46.724167,8.678889,2812 +alps_8518,MAETTENBERG,,46.711389,8.672778,2734 +alps_8519,SCHWARZ BERG,,46.712778,8.636944,2313 +alps_8520,BRICH PLANGGEN STOCK,,46.695000,8.680556,2971 +alps_8521,FEDENSTOCK,,46.688333,8.673611,2985 +alps_8522,FEDENAELPLER,,46.683889,8.675000,2969 +alps_8523,TIARMS,,46.676667,8.673611,2918 +alps_8524,STANDEL STOCK,,46.681667,8.625833,2624 +alps_8525,RIENZEN STOCK,,46.683056,8.635000,2957 +alps_8526,BAECHEN STOCK,,46.678889,8.640278,2944 +alps_8527,TRISTEL STOCK,,46.679444,8.622778,2576 +alps_8528,TAGHORN,,46.721667,8.639444,2125 +alps_8529,DIEDERBERGE,,46.700000,8.634444,2658 +alps_8530,SONNIG WICHEL,,46.712778,8.683333,2911 +alps_8531,SCHATTIG WICHEL,,46.701944,8.692500,3096 +alps_8532,ROT WICHEL,,46.698333,8.690556,3084 +alps_8533,STEINSTOCK,,46.725000,8.696111,2639 +alps_8534,STEINGRAT,,46.723611,8.705000,2410 +alps_8535,ROSSBODEN STOCK,,46.723611,8.708889,2461 +alps_8536,SCHAFSTOECKLI,,46.723056,8.740000,2505 +alps_8537,CHRUEZLI STOCK,,46.714722,8.740833,2707 +alps_8538,PIZ PALI,,46.711944,8.733333,2602 +alps_8539,CHLI MUTSCH,,46.708611,8.715556,2593 +alps_8540,HAELS,,46.702222,8.704167,2996 +alps_8541,MUTSCH,,46.704167,8.717500,2791 +alps_8542,CRISPALT PIGN,,46.676111,8.698056,2787 +alps_8543,CULMATSCH,,46.691111,8.714167,2897 +alps_8544,PIZ NAIR,,46.699167,8.708889,3059 +alps_8545,CRISPALT,,46.688889,8.689167,3076 +alps_8546,GIUV STOECKLI,,46.694444,8.686389,3061 +alps_8547,PIZ GENDUSAS,,46.720556,8.777500,2980 +alps_8548,CRAP BOSELGIA,,46.723611,8.783611,2770 +alps_8549,BOSTG,,46.690556,8.801111,1995 +alps_8550,MOTTA DIL TIR,,46.721667,8.822778,2304 +alps_8551,PIZ MURAUN,,46.671944,8.906111,2897 +alps_8552,TGIERN GROND,,46.721111,8.981944,1885 +alps_8553,TGIERN PIGN,,46.724444,8.989167,1775 +alps_8554,CUOLMS DA NADELS,,46.704444,8.973056,1878 +alps_8555,MUTTA,,46.705278,8.999722,2304 +alps_8556,CUVERS,,46.701389,8.995000,2424 +alps_8557,PIZ NADELS,,46.690000,8.998889,2789 +alps_8558,PIZ MIEZDI,,46.694167,9.003611,2741 +alps_8559,RENTIERT DAVON,,46.674167,8.948056,2198 +alps_8560,ROSSBODEN,,46.720000,9.040556,2157 +alps_8561,PIZ TITSCHAL,,46.708056,9.030000,2550 +alps_8562,PIZ LAD,,46.701944,9.028611,2665 +alps_8563,PIZ VAL GRONDA,,46.693889,9.026667,2819 +alps_8564,SCHAFCHOPF,,46.692222,9.034722,2763 +alps_8565,PIZ ZAVRAGIA,,46.682778,9.010278,2815 +alps_8566,BIM HIRT,,46.683333,9.032500,2542 +alps_8567,HIRELI,,46.676667,9.017778,2852 +alps_8568,PIZ GREN,,46.677500,9.022778,2890 +alps_8569,PIZ SEZNER,,46.707778,9.105556,2310 +alps_8570,GRENER BERG,,46.693056,9.074722,2446 +alps_8571,CREST LENTGAS,,46.695000,9.097778,2181 +alps_8572,PALA DA TGIERN,,46.688333,9.219444,2279 +alps_8573,CALASAGRAT,,46.676944,9.218333,2440 +alps_8574,GUENER HORN,,46.719167,9.284167,2849 +alps_8575,PIZ RADUN,,46.691944,9.277778,2581 +alps_8576,LUESCHGRAT,,46.701667,9.345000,2180 +alps_8577,GLASER GRAT,,46.686111,9.338056,2123 +alps_8578,RUINE HOHENRAETIEN,,46.691667,9.444167,946 +alps_8579,SCHERENKOPF,,46.668611,9.418333,2114 +alps_8580,RAPPAKOPF,,46.664444,9.412222,2197 +alps_8581,CRAP LA PALA,,46.711667,9.516389,2151 +alps_8582,MUTTNER HOEHI,,46.679167,9.479167,2003 +alps_8583,UNTER AXELI,,46.770833,8.655278,1097 +alps_8584,BRISTEN,,46.736944,8.681111,3072 +alps_8585,HINTERBALM,,46.780556,8.796944,1915 +alps_8586,HOCH RINDERBIEL,,46.776111,8.800278,2009 +alps_8587,HOCHBOCKI,,46.767778,8.794444,2604 +alps_8588,FRUTTSTOCK,,46.763611,8.787778,2838 +alps_8589,BAENDER STOCK,,46.760833,8.781667,2808 +alps_8590,STALDEN HOERELI,,46.757778,8.778611,2841 +alps_8591,OBER ALPSTOCK,,46.742778,8.769444,3328 +alps_8592,PIZ TGIETSCHEN,,46.736389,8.775000,3096 +alps_8593,STERMHOERNER,,46.732222,8.777222,2944 +alps_8594,SCHWARZ STOECKLI,,46.755833,8.769167,2573 +alps_8595,CHLI OBERAELPLER,,46.750556,8.777778,3085 +alps_8596,SCHWARZ STOECKLI,,46.741944,8.789722,2806 +alps_8597,PIZ AULT,,46.728333,8.781944,3027 +alps_8598,PIZ ACLETTA,,46.731389,8.799444,2911 +alps_8599,WITEN ALPSTOCK,,46.735833,8.747500,3016 +alps_8600,STRALIGEN STOECKLI,,46.775833,8.829444,2928 +alps_8601,PIZ CUOLMET,,46.776389,8.861944,2728 +alps_8602,TSCHINGEL STOECK,,46.763889,8.831667,2873 +alps_8603,STOTZIG GRAT,,46.761667,8.818056,2990 +alps_8604,HINTER STOTZIG GRAT,,46.759167,8.818889,2985 +alps_8605,PIZ ALPETTA,,46.747500,8.870833,2764 +alps_8606,PIZ RUN,,46.739444,8.828611,2914 +alps_8607,CAMONA DA CAVADIRAS,,46.742500,8.814167,2649 +alps_8608,BRICHLIG,,46.737222,8.813056,2964 +alps_8609,PIZ CAVADIRAS,,46.736667,8.814722,2948 +alps_8610,PIZ LUMPEGNA,,46.748056,8.854722,2823 +alps_8611,PIZ POSTA BIALA,,46.779167,8.933611,3073 +alps_8612,PIZ CURTIN,,46.776667,8.941944,2974 +alps_8613,PIZ SCHIGELS,,46.754444,8.911944,2565 +alps_8614,PIZ AVAT,,46.767500,8.906111,2910 +alps_8615,PIZ SCANTSCHALA,,46.772500,8.946111,2924 +alps_8616,PIZ NER,,46.768889,8.948056,2859 +alps_8617,MUOT DA MUNT,,46.762222,8.957222,2385 +alps_8618,CREP AULT,,46.740833,9.000278,903 +alps_8619,CREP DA PLAIDS,,46.763611,9.027500,1602 +alps_8620,STEIN,,46.725556,9.126389,2170 +alps_8621,PIZ MUNDAUN,,46.742778,9.160278,2064 +alps_8622,HITZEGGER KOPF,,46.735556,9.143611,2112 +alps_8623,ROT FLUE,,46.756667,9.321389,2254 +alps_8624,SCHLUEECHTLI,,46.758889,9.323611,2283 +alps_8625,NOLLA,,46.746667,9.313333,2384 +alps_8626,PIZ MIEZGI,,46.750000,9.279167,2401 +alps_8627,DUTJER HORN,,46.751944,9.278333,2399 +alps_8628,RISCH BOEDERA,,46.753056,9.317222,2277 +alps_8629,TAELLISTOCK,,46.746111,9.289167,2605 +alps_8630,PIZ RIEIN,,46.742500,9.290556,2752 +alps_8631,OBERHORN,,46.734444,9.300278,2796 +alps_8632,UNTERHORN,,46.735556,9.309722,2554 +alps_8633,PIZ SIGNINA,,46.724444,9.283889,2848 +alps_8634,PIZ FESS,,46.727500,9.288611,2880 +alps_8635,CREST AULT,,46.766667,9.379722,1941 +alps_8636,CREST DIL CUT,,46.759722,9.382222,2015 +alps_8637,PRAEZER HOEHI,,46.739444,9.373611,2120 +alps_8638,SOGN LUREGN,,46.756667,9.436944,843 +alps_8639,ALT SINS,,46.749444,9.439167,784 +alps_8640,NEU SINS,,46.744167,9.447778,825 +alps_8641,FULENBERG,,46.762778,9.508611,2572 +alps_8642,STAETZER HORN,,46.755833,9.512222,2574 +alps_8643,PIZ DANIS,,46.737778,9.507222,2497 +alps_8644,PIZ SCALOTTAS,,46.721944,9.511111,2322 +alps_8645,SCHWARZGRAT,,46.836111,8.665000,2021 +alps_8646,BAELMETEN,,46.831111,8.680556,2414 +alps_8647,RUCHAELPLI STOCK,,46.790833,8.619722,2476 +alps_8648,HOCH FULEN,,46.830833,8.706389,2506 +alps_8649,RINDERSTOCK,,46.829167,8.735278,2219 +alps_8650,ROT GRAT,,46.820833,8.711111,2440 +alps_8651,RINDERSTOCK,,46.820556,8.699444,2463 +alps_8652,WISS STOCK,,46.817778,8.742222,2406 +alps_8653,SCHWARZ STOECKLI,,46.818056,8.732778,2568 +alps_8654,HOELLEN STOCK,,46.808889,8.746667,2903 +alps_8655,STAEFEL STOCK,,46.811667,8.740278,2918 +alps_8656,GROSS WINDGAELLEN,,46.807222,8.732222,3187 +alps_8657,ROTHORN,,46.801944,8.718056,2822 +alps_8658,FURGGELIHORN,,46.801944,8.734167,2765 +alps_8659,PFAFFEN,,46.801111,8.693056,1832 +alps_8660,CHLI WINDGAELLEN,,46.795556,8.715833,2985 +alps_8661,SCHWARZ STOECKLI,,46.795278,8.736944,2614 +alps_8662,HINTER GRIESSSTOCK,,46.831667,8.804444,2734 +alps_8663,CHALCH SCHIJEN,,46.815556,8.805833,2830 +alps_8664,CHLI RUCHEN,,46.821389,8.797778,2944 +alps_8665,HUET STOECKLI,,46.821111,8.813333,2706 +alps_8666,GROSS RUCHEN,,46.810278,8.774722,3138 +alps_8667,RUCHEN NADEL,,46.808611,8.775278,3024 +alps_8668,CHANZELI,,46.815833,8.786389,2825 +alps_8669,ALPGNOFER STOCK,,46.805556,8.785556,2767 +alps_8670,SCHWARZ BERG,,46.802778,8.749167,2589 +alps_8671,CHAMMLI HOREN,,46.831667,8.847778,3026 +alps_8672,BOCK TSCHINGEL GRAT,,46.821944,8.831389,3207 +alps_8673,CHLI SCHAERHORN,,46.828611,8.823889,3234 +alps_8674,GROSS SCHAERHORN,,46.827222,8.829167,3294 +alps_8675,PIZ CAZARAULS,,46.813056,8.876944,3063 +alps_8676,PIZ HEIMSTOCK,,46.806667,8.869444,3102 +alps_8677,CUOLM TGIETSCHEN,,46.796111,8.875556,2798 +alps_8678,PIZ VAL PINTGA,,46.801389,8.854722,2957 +alps_8679,PIZ CAMBRIALAS,,46.789722,8.851944,3208 +alps_8680,GROSS DUESSI,,46.791667,8.827500,3256 +alps_8681,HAGSTAECKEN,,46.781944,8.829167,2918 +alps_8682,BIFERTEN GRAT,,46.824167,8.937778,2520 +alps_8683,CRAP GLARUNA,,46.813889,8.899444,3076 +alps_8684,PIZ DADO,,46.803333,8.914444,3432 +alps_8685,TOEDI,,46.811111,8.914722,3614 +alps_8686,STOC GRAND,,46.800278,8.914167,3422 +alps_8687,GLARNER TOEDI,,46.810556,8.921944,3586 +alps_8688,PIZ URLAUN,,46.796389,8.928056,3359 +alps_8689,FUORCLA DA PUNTEGLIAS,,46.786944,8.931667,2814 +alps_8690,PIZ GLIEMS,,46.783889,8.906111,2865 +alps_8691,STOC PIGN,,46.785833,8.906944,2914 +alps_8692,PIZ POSTA BIALA,,46.780000,8.934167,3074 +alps_8693,HINTER SELBSANFT,,46.831667,8.978056,3029 +alps_8694,VORDER SCHIBEN,,46.823333,8.976389,2987 +alps_8695,HINTER SCHIBEN,,46.818889,8.971944,3084 +alps_8696,BIFERTEN STOCK,,46.804444,8.957500,3420 +alps_8697,BUENDNER TOEDI,,46.802222,8.947500,3124 +alps_8698,PIZ FRISAL,,46.798889,8.958333,3292 +alps_8699,CRAP GROND,,46.786111,8.968056,3196 +alps_8700,CAVISTRAU GROND,,46.784444,8.973889,3252 +alps_8701,CAVISTRAU PIGN,,46.784722,8.981944,3220 +alps_8702,PIZ TUMPIV,,46.786389,8.987222,3101 +alps_8703,PIZ DADENS,,46.788056,9.006667,2773 +alps_8704,PIZ D'ARTGAS,,46.822778,9.040833,2787 +alps_8705,KISTEN STOECKLI,,46.817222,9.020000,2746 +alps_8706,PIZ DADO,,46.790833,9.015278,2699 +alps_8707,MUOTA,,46.798889,9.236389,1257 +alps_8708,MUTTA SUT,,46.818889,9.276389,1190 +alps_8709,LA MUTTA,,46.815833,9.286111,1236 +alps_8710,BOT FIENA,,46.825556,9.350556,933 +alps_8711,BOT DAGATG,,46.821389,9.397500,687 +alps_8712,BOT ARS,,46.819722,9.385000,699 +alps_8713,BOT DANISCH,,46.817500,9.386667,735 +alps_8714,BOT TSCHAVIR,,46.817778,9.371944,782 +alps_8715,CRESTA SCHETGA,,46.806389,9.367500,834 +alps_8716,RIEVENTUIS,,46.804722,9.346667,1015 +alps_8717,CREST AULTA,,46.805833,9.361389,987 +alps_8718,ILS AULTS,,46.818056,9.418056,768 +alps_8719,TUM ARSA,,46.825000,9.440000,654 +alps_8720,PLAZZAS,,46.810556,9.413333,681 +alps_8721,PLANIGN,,46.796667,9.429444,1509 +alps_8722,SUR IL GUAULT,,46.782500,9.440000,1579 +alps_8723,SPUNDISKOEPF,,46.822778,9.507778,1847 +alps_8724,TGOM AULTA,,46.798056,9.474722,2085 +alps_8725,FULBERGEGG,,46.776667,9.491111,2449 +alps_8726,FULHORN,,46.773611,9.494167,2529 +alps_8727,DREI BUENDEN STEIN,,46.801389,9.496667,2160 +alps_8728,FURGGABUEEL,,46.804444,9.495278,2174 +alps_8729,GRUEENEN BUEEL,,46.789444,9.510833,2043 +alps_8730,BLINZI,,46.842222,8.730000,2473 +alps_8731,GROSS SPITZEN,,46.850833,8.740000,2404 +alps_8732,WAENGIHORN,,46.853611,8.715000,2149 +alps_8733,BURG,,46.845000,8.713889,2286 +alps_8734,CHLI SPITZEN,,46.851111,8.747778,2296 +alps_8735,CHLI GEISSBERG,,46.874722,8.815278,1974 +alps_8736,SCHAECHENTALER WINDGAELLEN,,46.888056,8.791667,2763 +alps_8737,MORENGSPUR,,46.852500,8.755278,1958 +alps_8738,CHULM,,46.847778,8.793889,2162 +alps_8739,WAESPEN,,46.840000,8.791667,2345 +alps_8740,VORDER GRIESSSTOCK,,46.839167,8.800000,2662 +alps_8741,OBER SAEDEL,,46.881111,8.801667,2254 +alps_8742,RAU STOCK,,46.885000,8.827778,2290 +alps_8743,CHLI GLATTEN,,46.884167,8.840000,2314 +alps_8744,GLATTEN,,46.881389,8.859444,2504 +alps_8745,KLAUSENPASS,,46.868056,8.855556,1948 +alps_8746,CHAMMLI BERG,,46.837222,8.845000,3214 +alps_8747,CLARIDEN,,46.841944,8.871389,3267 +alps_8748,TUFELS FRIDHOF,,46.865556,8.893333,2125 +alps_8749,ROTSTOCK,,46.870000,8.940556,2471 +alps_8750,GEMSFAIREN STOCK,,46.860556,8.917778,2972 +alps_8751,SPEICHSTOCK,,46.856944,8.903611,2967 +alps_8752,RITEN NOSSEN,,46.857500,8.894444,2664 +alps_8753,ROTEN PFAFFEN,,46.854722,8.883889,2479 +alps_8754,HINTER GEISSBUETZI STOCK,,46.849444,8.920278,2720 +alps_8755,OBER GEMSALPELI,,46.857778,8.942500,2394 +alps_8756,ALTENOREN STOCK,,46.860278,8.941111,2458 +alps_8757,ZUETRIBI STOCK,,46.851944,8.943889,2644 +alps_8758,BEGGISTOCK,,46.849167,8.936389,2635 +alps_8759,TUEFELS STOECK,,46.853889,8.900000,2961 +alps_8760,BOCK TSCHINGEL,,46.849167,8.893611,3079 +alps_8761,VORDER GEISSBUETZI STOCK,,46.846389,8.924167,2662 +alps_8762,VORDER SPITZALPELI STOCK,,46.840556,8.899444,2929 +alps_8763,TOR,,46.876667,9.002778,2059 +alps_8764,LUEGBODEN,,46.860556,8.985278,1840 +alps_8765,GEMSISTOCK,,46.861389,8.950000,2430 +alps_8766,VORDER SELBSANFT,,46.851667,8.983333,2751 +alps_8767,VORSTEG STOCK,,46.883889,9.026944,2678 +alps_8768,HAUS STOCK,,46.874444,9.065556,3158 +alps_8769,SCHEID STOECKLI,,46.877500,9.026111,2810 +alps_8770,RUECHI,,46.872778,9.018056,2849 +alps_8771,NUESCHEN STOCK,,46.868611,9.018333,2893 +alps_8772,HINTER SULZHORN,,46.870833,9.032500,2738 +alps_8773,RUCHI,,46.865000,9.045000,3107 +alps_8774,CHLI RUCHI,,46.867500,9.050833,3039 +alps_8775,MUTTENCHOPF,,46.851389,9.015000,2482 +alps_8776,PASTAGET LENN,,46.845556,9.059167,2555 +alps_8777,MUTTEN STOCK,,46.850000,9.045833,3089 +alps_8778,CRAP NER,,46.839444,9.058056,2878 +alps_8779,LA MUOTA,,46.839444,9.068611,2506 +alps_8780,PIZ CAVIROLAS,,46.845278,9.050278,3025 +alps_8781,MUTTENBERG,,46.843889,9.036944,2956 +alps_8782,CRAP TGIETSCHEN,,46.833611,9.070278,2580 +alps_8783,FUORCLA DA GAVIROLAS,,46.834444,9.068611,2528 +alps_8784,OBER CHAEMMLER,,46.875278,9.101944,2432 +alps_8785,CHLI CHALCHHORN,,46.868611,9.108889,2684 +alps_8786,JEGERBRUNNEN,,46.861944,9.114722,2425 +alps_8787,GROSS CHALCHHORN,,46.865833,9.111389,2626 +alps_8788,PIZ FLUAZ,,46.853333,9.080833,2814 +alps_8789,CRAP NER,,46.852222,9.133333,2614 +alps_8790,CRAP TGIETSCHEN,,46.850278,9.111389,2624 +alps_8791,GLARNER VORAB,,46.880000,9.152778,3018 +alps_8792,VORAB PIGN,,46.872500,9.165278,2897 +alps_8793,LAAXER STOECKLI,,46.883056,9.204167,2898 +alps_8794,BUENDNER VORAB,,46.873889,9.156667,3028 +alps_8795,CRAP MASEGN,,46.850278,9.171111,2516 +alps_8796,STN CRAP MASEGN,,46.842500,9.180000,2472 +alps_8797,CREST DA TIARMS,,46.833056,9.183611,2412 +alps_8798,CRAP NER,,46.876111,9.212500,2781 +alps_8799,CRAP SOGN GION,,46.838333,9.210278,2264 +alps_8800,SCHLUOCHA,,46.848333,9.330278,1442 +alps_8801,RUINA BELMONT,,46.845278,9.334167,1420 +alps_8802,RUINE HOHENTRINS,,46.827778,9.366389,941 +alps_8803,CRAP SAN BARCAZI,,46.829167,9.350000,1009 +alps_8804,JILLIS SGAI,,46.836667,9.401389,996 +alps_8805,VOGELSTEIN WALD,,46.841667,9.391111,1397 +alps_8806,VOGELSTEIN,,46.844444,9.391944,1525 +alps_8807,RUND CHOPF,,46.853889,9.383889,1806 +alps_8808,MUTTA SUT,,46.849167,9.374167,2017 +alps_8809,MUTTA SURA,,46.854444,9.370556,2198 +alps_8810,SAESAGIT,,46.856944,9.386667,1999 +alps_8811,TURM,,46.855556,9.386667,1907 +alps_8812,TSCHEP SUT,,46.870833,9.340833,2666 +alps_8813,BALDACHOPF,,46.868056,9.380000,2106 +alps_8814,CRAP MATS,,46.878333,9.357500,2946 +alps_8815,SPITZIG STEIN,,46.877778,9.376944,2289 +alps_8816,TUMA MARCHESA,,46.829722,9.448333,607 +alps_8817,TUMA FALVENG,,46.831111,9.453333,622 +alps_8818,TUMA TSCHELLI,,46.832222,9.448333,654 +alps_8819,TUMA CASTI,,46.835000,9.447778,638 +alps_8820,TUMA PADRUSA,,46.833333,9.439722,631 +alps_8821,ASELLA,,46.833611,9.420556,714 +alps_8822,CARTSCHITSCHA,,46.833611,9.414167,774 +alps_8823,GARSCHLI CHOPF,,46.853056,9.410000,1493 +alps_8824,FOPPACHOPF,,46.853056,9.426667,1890 +alps_8825,STUDENBUEHEL,,46.859444,9.413889,1409 +alps_8826,TAMINSER CALANDA,,46.871111,9.445833,2408 +alps_8827,GUELLENCHOPF,,46.876944,9.454444,2556 +alps_8828,UNTER ALTENS,,46.836111,9.503056,815 +alps_8829,UNTER GAMSENBODEN,,46.865833,9.481389,1506 +alps_8830,OBER GAMSENBODEN,,46.867500,9.476111,1679 +alps_8831,ROSSBODEN,,46.874167,9.474722,2040 +alps_8832,HUBEL,,46.894722,8.658056,1713 +alps_8833,HOECH EGG,,46.896111,8.667500,1785 +alps_8834,HUEENDEREGG,,46.902222,8.674167,1873 +alps_8835,OBER HUETTENBODEN,,46.911389,8.664444,1668 +alps_8836,OBER OCHSENBIEL,,46.912778,8.675833,1868 +alps_8837,HAGEL STOCK,,46.917222,8.681667,2181 +alps_8838,DIEPEN,,46.924444,8.665833,2222 +alps_8839,HUNDSTOCK,,46.924444,8.682500,2213 +alps_8840,AEBNETER STOECKLI,,46.926389,8.657778,2087 +alps_8841,ROPHAIEN,,46.928056,8.646389,2078 +alps_8842,OBER AXEN,,46.926111,8.623889,1008 +alps_8843,BLUTT STOECKLI,,46.931389,8.640833,1884 +alps_8844,DIBISTOCK,,46.929722,8.667500,2024 +alps_8845,BUTZEN STOCK,,46.936944,8.641389,1757 +alps_8846,HOLZER STOCK,,46.935833,8.649444,1771 +alps_8847,GEISGRAT,,46.903333,8.727778,2151 +alps_8848,GAMPERSTOCK,,46.898611,8.741944,2274 +alps_8849,VORDER MAETTENTAL,,46.907778,8.692500,1938 +alps_8850,LANG EGG,,46.908611,8.723611,2107 +alps_8851,MITTST CHINZER,,46.916389,8.742500,2085 +alps_8852,HINTER CHINZER,,46.913889,8.736667,2138 +alps_8853,SPILAUER STOCK,,46.915556,8.697500,2270 +alps_8854,ROSS STOCK,,46.917222,8.707500,2461 +alps_8855,FULEN,,46.918333,8.715000,2491 +alps_8856,HOCH BIEL,,46.920556,8.731111,1938 +alps_8857,GROSS TISCH,,46.923889,8.707222,2256 +alps_8858,ROSS STOECKLI,,46.931667,8.696111,1879 +alps_8859,SCHMAL STOECKLI,,46.933056,8.701389,2012 +alps_8860,HOECH EGG,,46.928056,8.704444,2018 +alps_8861,CHAISER TOR,,46.930556,8.723611,2360 +alps_8862,CHAISER STOCK,,46.928333,8.728611,2515 +alps_8863,CHRONEN STOCK,,46.930556,8.736389,2451 +alps_8864,BLUEEMBERG,,46.935556,8.735000,2383 +alps_8865,RUPPERSLAUI STOECKLI,,46.937500,8.740833,2232 +alps_8866,VORDER CHINZERBERG,,46.918333,8.753333,1986 +alps_8867,SIRTEN STOCK,,46.895556,8.753889,2299 +alps_8868,ALPLER TOR,,46.892222,8.783889,2448 +alps_8869,SCHWARZ STOCK,,46.899444,8.779722,2527 +alps_8870,HOCH PFAFFEN,,46.895278,8.765278,2459 +alps_8871,SEESTOCK,,46.906389,8.788889,2429 +alps_8872,BERGLI CHOPF,,46.901389,8.773333,2238 +alps_8873,BAENDER HOECHI,,46.910833,8.771389,2072 +alps_8874,SANGIGRAT,,46.914722,8.813333,2279 +alps_8875,ALPLER HORN,,46.910556,8.808056,2380 +alps_8876,GROSS BODEN,,46.915833,8.801667,1992 +alps_8877,MATTNER STOCK,,46.918889,8.772222,2020 +alps_8878,ROSSBODEN EGG,,46.920278,8.800556,1953 +alps_8879,FIRST HOERELI,,46.927222,8.790556,2129 +alps_8880,TRAESMEREN HOERELI,,46.932222,8.791944,2137 +alps_8881,GEISSMATT,,46.938056,8.754167,2124 +alps_8882,WASSERBERG FIRST,,46.939444,8.788889,2341 +alps_8883,LAUIBERG,,46.940556,8.781111,2138 +alps_8884,OBEREN GITSCHEN,,46.898056,8.841389,1739 +alps_8885,MAEREN SPITZ,,46.900278,8.859444,2280 +alps_8886,ALPLEN STOCK,,46.908056,8.824167,2093 +alps_8887,MUETSCHEN,,46.913889,8.878056,1942 +alps_8888,SANGI GRAT,,46.917222,8.818056,2274 +alps_8889,PFAFF,,46.923611,8.868889,2109 +alps_8890,HAENGST,,46.922778,8.858333,2002 +alps_8891,GEISS STOCK,,46.927500,8.822222,1961 +alps_8892,STAFELI STOECKLI,,46.933056,8.824722,1676 +alps_8893,CHUPFER BERG,,46.938889,8.862778,2009 +alps_8894,LAECKI STOCK,,46.897222,8.885278,2486 +alps_8895,SIGNAL STOCK,,46.907500,8.907500,2573 +alps_8896,JEGER STOECK,,46.911111,8.915000,2584 +alps_8897,GUBEL,,46.904167,8.942500,1373 +alps_8898,ROT NOSSEN,,46.902778,8.895278,2502 +alps_8899,SCHIJEN,,46.919722,8.935278,2610 +alps_8900,ORT STOCK,,46.925278,8.948056,2716 +alps_8901,HOECH TURM,,46.932222,8.935833,2666 +alps_8902,CHLI CHILCHBERG,,46.928889,8.902500,2269 +alps_8903,GROSS CHILCHBERG,,46.930556,8.911111,2426 +alps_8904,CHAMER STOCK,,46.890833,8.958611,2162 +alps_8905,GROSS AU,,46.906389,8.955000,1244 +alps_8906,HOECH HORN,,46.915278,8.952222,1842 +alps_8907,RIET STOECKLI,,46.919722,8.968056,1848 +alps_8908,RIETER ORTSTAFEL,,46.925833,8.973056,1754 +alps_8909,NUSS BUEEL,,46.923889,8.985556,1263 +alps_8910,TUEFELS CHILCHLI,,46.928889,8.970556,1829 +alps_8911,SCHOEN BUEEL,,46.933611,8.955000,2077 +alps_8912,LEITER BERG,,46.893056,9.069722,2669 +alps_8913,MAETTLEN STOCK,,46.887500,9.065833,2808 +alps_8914,CHALCH STOECKLI,,46.903333,9.067222,2500 +alps_8915,HANEN STOCK,,46.909167,9.074167,2561 +alps_8916,BUETZI STOCK,,46.916944,9.052778,2340 +alps_8917,HEUER STOECK,,46.911389,9.058889,2334 +alps_8918,AENGI SEE,,46.930833,9.073889,1989 +alps_8919,FAETSCHEN HORN,,46.935556,9.078611,1978 +alps_8920,DUEREN BUEEL,,46.899722,9.089444,2104 +alps_8921,ERBSER STOCK,,46.899444,9.095833,2182 +alps_8922,TIERBODEN HORN,,46.913333,9.112222,2269 +alps_8923,BUEBEN GUETSCH,,46.910556,9.111389,2114 +alps_8924,ROT STOCK,,46.910556,9.101667,2330 +alps_8925,CHLI CHAERPF,,46.919444,9.093333,2699 +alps_8926,KAERPF,,46.916667,9.093333,2794 +alps_8927,SCHWARZ TSCHINGEL,,46.923611,9.105000,2426 +alps_8928,MITTLER BLISTOCK,,46.931389,9.120556,2447 +alps_8929,SUNNEN BERG,,46.933333,9.093056,2222 +alps_8930,HINTER BLISTOCK,,46.927500,9.121944,2446 +alps_8931,VORDER BLISTOCK,,46.934167,9.120833,2405 +alps_8932,GELB CHOPF,,46.933333,9.135556,2132 +alps_8933,WILDMAD FURGGELI,,46.937500,9.122778,2294 +alps_8934,SCHABELL,,46.930000,9.139167,2127 +alps_8935,MITTETAG HORN,,46.896667,9.175556,2415 +alps_8936,ZWOELFI HORN,,46.890000,9.169722,2744 +alps_8937,TRITT HOERELI,,46.900000,9.197778,2017 +alps_8938,OFEN,,46.891944,9.212778,2873 +alps_8939,PASS DIL SEGNAS,,46.901944,9.224444,2627 +alps_8940,TSCHINGEL HOREN,,46.898056,9.221111,2849 +alps_8941,TRINSER HORN,,46.903611,9.266389,3028 +alps_8942,PIZ SEGNAS,,46.907778,9.239722,3099 +alps_8943,CHLI SCHIBEN,,46.931944,9.250833,2654 +alps_8944,GSPALTEN GRAT,,46.934167,9.273333,2625 +alps_8945,AELPLI CHOPF,,46.930833,9.271667,2641 +alps_8946,AELPLI JOCH,,46.929167,9.267222,2556 +alps_8947,GROSSI SCHIBEN,,46.926944,9.252778,2937 +alps_8948,SUREN STOCK,,46.923056,9.251389,3055 +alps_8949,SCHEITEL GRAT,,46.915833,9.231667,2391 +alps_8950,SUREN JOCH,,46.914167,9.244167,2946 +alps_8951,PIZ MIRUTTA,,46.881944,9.320556,2604 +alps_8952,PIZ SAX,,46.905000,9.286667,2795 +alps_8953,TRISTEL HORN,,46.901944,9.316389,3114 +alps_8954,GLASER HORN,,46.901667,9.333056,3128 +alps_8955,RINGEL SPITZ,,46.898333,9.343056,3247 +alps_8956,MORCHOPF,,46.883056,9.354167,2943 +alps_8957,SCHAF GRAT,,46.887778,9.374722,2763 +alps_8958,CHRUMM HORN,,46.891944,9.377778,2706 +alps_8959,PANAERA HOERNER,,46.897500,9.360556,3106 +alps_8960,OFEN,,46.903333,9.396667,2409 +alps_8961,ORGLEN,,46.900556,9.385833,2720 +alps_8962,HUS,,46.904722,9.371389,2285 +alps_8963,AUGST BERG,,46.908611,9.353889,2309 +alps_8964,WISLI CHOPF,,46.918056,9.406389,1574 +alps_8965,CHILCHLI CHOPF,,46.921667,9.355000,1468 +alps_8966,SCHAFLAEGER,,46.931389,9.383611,2577 +alps_8967,TIEREGG,,46.880278,9.443056,1963 +alps_8968,FELSBERGER CALANDA,,46.881111,9.455833,2696 +alps_8969,TUEFELS CHILCHLI,,46.886111,9.466944,2460 +alps_8970,HALDENSTEINER CALANDA,,46.900000,9.467500,2805 +alps_8971,DRACHEN BERG,,46.930556,9.413056,2626 +alps_8972,VAETTNER CHOPF,,46.931389,9.421667,2616 +alps_8973,SENNEN STEIN,,46.880000,9.487500,1973 +alps_8974,BERGER CALANDA,,46.912222,9.488056,2270 +alps_8975,LATER CHOPF,,46.909167,9.529722,1143 +alps_8976,GUERSTIG CHOPF,,46.903889,9.526111,1132 +alps_8977,ADLER,,46.910833,9.535556,997 +alps_8978,VALDRUGS,,46.916944,9.534444,1020 +alps_8979,GUETSCH,,46.945556,8.670000,1124 +alps_8980,FIREN STOECKLI,,46.964444,8.664167,1718 +alps_8981,ROT TURM,,46.957500,8.668333,1893 +alps_8982,CHLINGEN STOCK,,46.957500,8.674444,1935 +alps_8983,HUSER STOCK,,46.961944,8.650278,1904 +alps_8984,FRONALP STOCK,,46.968333,8.637222,1922 +alps_8985,UNTER GIBEL,,46.996667,8.658611,917 +alps_8986,CHLI ACHSLEN STOCK,,46.944444,8.737500,2020 +alps_8987,HENGST,,46.956667,8.689167,1890 +alps_8988,LAUCH STOCK,,46.954722,8.698889,1841 +alps_8989,MAELCH STOECKLI,,46.960278,8.706944,1767 +alps_8990,SISIGER SPITZ,,46.954167,8.706944,1914 +alps_8991,DRIANGEL,,46.954167,8.716667,1788 +alps_8992,SCHWARZ STOCK,,46.958611,8.728611,1642 +alps_8993,PLANGG STOCK,,46.964167,8.716389,1761 +alps_8994,SEIL STOCK,,46.976667,8.697222,1364 +alps_8995,BOELLEN STOECKLI,,46.947222,8.782500,1885 +alps_8996,CHRUEZ GUERSCH,,46.950556,8.793611,1733 +alps_8997,CHLI CHUPFERBERG,,46.945000,8.869167,1923 +alps_8998,CHALBERTAL STOCK,,46.962222,8.849167,1704 +alps_8999,AEBNENMATT STOECKLI,,46.965000,8.858889,1699 +alps_9000,TOR STOECKLI,,46.966944,8.864444,1737 +alps_9001,SILBER,,46.966389,8.841667,1683 +alps_9002,FLOESCH EGGEN,,46.973333,8.853056,1672 +alps_9003,ROGGEN STOCK,,46.980000,8.856111,1702 +alps_9004,PFANNEN STOCK,,46.961667,8.911389,2573 +alps_9005,CHRATZEREN FURGGELI,,46.968611,8.906111,2141 +alps_9006,GRISSET,,46.961389,8.937500,2721 +alps_9007,BOES FULEN,,46.967222,8.945556,2802 +alps_9008,CHRATZEREN GRAT,,46.971389,8.901389,2349 +alps_9009,HINTER GASSEN STOCK,,46.973611,8.949167,2541 +alps_9010,SCHWARZ NOSSEN,,46.977222,8.903056,2150 +alps_9011,FIRST,,46.980556,8.923611,2056 +alps_9012,MITTLER GASSEN STOCK,,46.979167,8.947222,2275 +alps_9013,VORDER GASSEN STOCK,,46.980556,8.947778,2140 +alps_9014,HINTER EGGSTOCK,,46.960556,8.966667,2455 +alps_9015,SCHATTEN STOCK,,46.950278,8.968056,2043 +alps_9016,VORDER EGGSTOCK,,46.960556,8.980000,2449 +alps_9017,CHNUGRAT,,46.961667,9.005278,1854 +alps_9018,SEBLEN GRAT,,46.960278,9.000556,1880 +alps_9019,BAECHI STOCK,,46.992778,8.988889,2914 +alps_9020,ZEINEN FURGGEL,,46.982500,8.978889,2435 +alps_9021,ROSS STOCK,,46.984167,8.964444,2387 +alps_9022,RUECHI GRAT,,46.979444,8.977500,2657 +alps_9023,WISSGAND STOCK,,46.980556,8.985833,2404 +alps_9024,FIRST,,46.977778,9.005000,1997 +alps_9025,RAD,,46.985833,8.979444,2661 +alps_9026,GLOTEL STOCK,,46.989444,8.962500,2128 +alps_9027,FRANZEN HORN,,46.942778,9.071667,1869 +alps_9028,ETZEL STOCK,,46.952500,9.068889,1825 +alps_9029,LEUGGEL STOCK,,46.990000,9.032500,1721 +alps_9030,IJEN STOCK,,46.986667,9.031944,1674 +alps_9031,MATZLEN GRAT,,46.940556,9.094722,2082 +alps_9032,BERGLI HORN,,46.943611,9.123889,2428 +alps_9033,MUERLI GRAT,,46.938889,9.133611,2234 +alps_9034,CHAREN STOCK,,46.950556,9.122222,2422 +alps_9035,SCHAFGRIND,,46.940556,9.141389,2155 +alps_9036,NAEGELI STOCK,,46.946111,9.143056,1950 +alps_9037,MATZLEN STOCK,,46.950833,9.092500,1961 +alps_9038,FUEDLE CHOPF,,46.963333,9.099722,1602 +alps_9039,HOHBERG,,46.961111,9.128611,2244 +alps_9040,GAND STOCK,,46.965278,9.116944,2315 +alps_9041,SIWELLEN,,46.960278,9.144444,1994 +alps_9042,ROTSTOCK,,46.978056,9.118611,1895 +alps_9043,HELL HORN,,46.984444,9.110833,1767 +alps_9044,PLATTEN GRAT,,46.948889,9.206111,2248 +alps_9045,FANEN STOCK,,46.945278,9.199167,2235 +alps_9046,HUEENDER TSCHINGEL,,46.948056,9.149444,1786 +alps_9047,STUEL EGGHORN,,46.949167,9.189167,1855 +alps_9048,ARGEN BODEN,,46.952778,9.183611,1418 +alps_9049,FUGGSTOCK,,46.984167,9.205000,2371 +alps_9050,FAERI SPITZ,,46.941389,9.217222,2179 +alps_9051,WERALPER GRAT,,46.939444,9.239167,2446 +alps_9052,GRUEEN SPITZ,,46.950556,9.217500,2361 +alps_9053,FOOSTOECKLI,,46.954722,9.236667,2536 +alps_9054,FOOSTOCK,,46.956389,9.244722,2611 +alps_9055,SCHOEN BUEEL,,46.968889,9.233056,1860 +alps_9056,STOSS CHOPF,,46.981389,9.271389,1686 +alps_9057,RISETEN HOREN,,46.974167,9.245833,2357 +alps_9058,FULEN,,46.985556,9.245833,2415 +alps_9059,HUEENER SPITZ,,46.964722,9.338056,2367 +alps_9060,LARITSCH CHOPF,,46.960833,9.323333,2498 +alps_9061,HANGSACK GRAT,,46.952222,9.321944,2634 +alps_9062,GRAU SPITZ,,46.949722,9.286111,2478 +alps_9063,FAHNEN STOCK,,46.942222,9.293056,2612 +alps_9064,HEUBUETZLER,,46.948889,9.308611,2612 +alps_9065,PLATTEN SPITZ,,46.946667,9.316111,2579 +alps_9066,HORNI,,46.938611,9.320278,2364 +alps_9067,SEEZBERG,,46.943333,9.338611,2487 +alps_9068,HEITEL SPITZ,,46.946389,9.331389,2427 +alps_9069,GRASEGG CHOPF,,46.959444,9.285278,2065 +alps_9070,SAZMARTIN HORN,,46.943889,9.375833,2827 +alps_9071,EGGHORN,,46.941944,9.369444,2728 +alps_9072,ZINER SPITZ,,46.942500,9.352500,2508 +alps_9073,GILBI STOCK,,46.956944,9.375000,2674 +alps_9074,ZANAI HORN,,46.947778,9.405000,2821 +alps_9075,MILBISAND,,46.981667,9.402222,2565 +alps_9076,SCHWARZ PLANGG,,46.983611,9.393611,2551 +alps_9077,SCHWARZ PLANGG GRAT,,46.979167,9.396944,2630 +alps_9078,SCHWARZE HOERNER,,46.977222,9.399444,2645 +alps_9079,MUTTEN CHOPF,,46.955556,9.344722,1971 +alps_9080,PIZOL,,46.959167,9.386667,2844 +alps_9081,HOCHWART,,46.970833,9.387500,2671 +alps_9082,GRAUE HOERNER,,46.965556,9.387500,2703 +alps_9083,WILDSEE HORN,,46.967500,9.399722,2690 +alps_9084,BOELLI,,46.974722,9.407222,2290 +alps_9085,STAFINELLA GRAT,,46.970833,9.372500,2399 +alps_9086,SICHLEN,,46.973611,9.398056,2643 +alps_9087,CHUEE GRAETLI,,46.986389,9.362778,1885 +alps_9088,MUNTALUNA,,46.946111,9.445000,2422 +alps_9089,SCADELLA GRAT,,46.947222,9.420000,2541 +alps_9090,TAGWEIDLI CHOPF,,46.977778,9.428611,2275 +alps_9091,SCHLOESSLI CHOPF,,46.978333,9.441667,2226 +alps_9092,VASANA CHOPF,,46.979444,9.453056,2028 +alps_9093,GIREN SPITZ,,46.972222,9.416944,2347 +alps_9094,ZWEIER SPITZ,,46.944167,9.496944,1858 +alps_9095,SESEL CHOPF,,46.941111,9.521389,1205 +alps_9096,CHEMI,,46.953611,9.504444,1814 +alps_9097,FUERGGLI CHOPF,,46.956389,9.519167,1391 +alps_9098,PIZALUN,,46.971389,9.520556,1478 +alps_9099,MARTEGNAS,,46.577222,9.529444,2670 +alps_9100,CREST OTA,,46.562500,9.526389,2496 +alps_9101,PIZ ARLOS,,46.558889,9.583889,2696 +alps_9102,TGANT SON MARTEGN,,46.604722,9.643333,2550 +alps_9103,CASTALEGNS,,46.553889,9.683611,3021 +alps_9104,PIZ COLM,,46.559167,9.656389,2415 +alps_9105,CARUNGAS,,46.572778,9.675000,2622 +alps_9106,PIZ BLEIS MARSCHA,,46.570000,9.720000,3128 +alps_9107,PIZ DA PEDER BUCS,,46.573333,9.718333,3002 +alps_9108,PIZ SALTERAS,,46.581389,9.708333,3111 +alps_9109,PIZ VAL LUNGA,,46.586389,9.706111,3078 +alps_9110,PIZZA GROSSA,,46.598611,9.670556,2939 +alps_9111,PIZ ELA,,46.601944,9.707500,3339 +alps_9112,PIZ LAVINER,,46.550556,9.726389,3137 +alps_9113,IGL DANCLER,,46.563333,9.781667,2814 +alps_9114,PIZ D'ALP VAL,,46.556944,9.742778,3053 +alps_9115,PIZ BIAL,,46.558889,9.756111,3061 +alps_9116,PIZ DALS VADRETTINS,,46.558889,9.763333,2977 +alps_9117,PIZ MURTEL TRIGD,,46.566389,9.770833,2901 +alps_9118,LA PIRAMIDA,,46.561944,9.769722,2964 +alps_9119,PIZ PALPUOGNA,,46.573611,9.775000,2730 +alps_9120,PIZ MULIX,,46.574722,9.735000,2887 +alps_9121,PIZ MUOT,,46.601944,9.781111,2670 +alps_9122,PIZ MUOTTAS,,46.552500,9.816111,2914 +alps_9123,PIZ MEZ,,46.572222,9.849167,2899 +alps_9124,PIZ DA LAS BLAIS,,46.572500,9.833333,2930 +alps_9125,DSCHIMELS,,46.571944,9.821667,2782 +alps_9126,IGL COMPASS,,46.589167,9.823056,3016 +alps_9127,PIZ UEERTSCH,,46.596389,9.836389,3268 +alps_9128,PIZ ZAVORETTA,,46.596944,9.817500,3043 +alps_9129,CRASTA MORA,,46.571667,9.867778,2952 +alps_9130,PIZ MEZZAUN,,46.569722,9.965278,2963 +alps_9131,PIZ MUERTIROL,,46.592500,10.007500,2660 +alps_9132,PIZ ARPIGLIA,,46.580833,10.005278,2765 +alps_9133,PIZ UTER,,46.569167,10.001667,2907 +alps_9134,IL CORN,,46.559722,9.992222,2959 +alps_9135,PIZ CHASCHANELLA,,46.553333,10.039722,2929 +alps_9136,PIZ VAUGLIA,,46.553333,10.019444,2974 +alps_9137,PIZ SALIENTE,,46.585000,10.102778,3048 +alps_9138,PIZ TRUPCHUN,,46.577222,10.095556,2941 +alps_9139,PIZ CHASCHAUNA,,46.575000,10.078611,3070 +alps_9140,PUNTA CASANA,,46.566944,10.085278,3007 +alps_9141,CORNA CAVALLI,,46.582778,10.118889,2991 +alps_9142,MONTE CRAPENE,,46.547222,10.169444,2430 +alps_9143,CIMA PARADISO,,46.593333,10.200556,3028 +alps_9144,MONTE CASSA DEL FERRO,,46.578611,10.201667,3140 +alps_9145,CIMA DEL SERRAGLIO,,46.592222,10.242222,2685 +alps_9146,CIMA DI PRA GRATA,,46.575278,10.215833,2793 +alps_9147,PIZZO DEL FERRO,,46.568333,10.194167,3054 +alps_9148,MONTE TORRACCIA,,46.540556,10.209722,2789 +alps_9149,MON'ATA,,46.585833,10.268056,2730 +alps_9150,PIZ MON'ATA,,46.577778,10.269444,2938 +alps_9151,PIZ PALA GRONDA,,46.578611,10.293333,3002 +alps_9152,PIZ MURTAROL,,46.570278,10.287500,3180 +alps_9153,PIZ MAGLIAVACHAS,,46.559167,10.295556,3044 +alps_9154,PIZ TURETTAS,,46.587222,10.338056,2957 +alps_9155,PIZ DAL DOESS RADOND,,46.580278,10.348889,2906 +alps_9156,CUCLA DA JON DAD ONSCH,,46.567500,10.324167,2775 +alps_9157,PIZ TEA FONDADA,,46.549444,10.308056,3144 +alps_9158,MONTE FORCOLA,,46.557500,10.350556,2906 +alps_9159,PIZ PRAVEDER,,46.562222,10.372500,2768 +alps_9160,PIZ SCHUMBRAIDA,,46.542778,10.338056,3124 +alps_9161,PIZ LAD,,46.571111,10.409722,2882 +alps_9162,PIZ RIMS,,46.562222,10.414444,2965 +alps_9163,PIZ DAL LAI,,46.555000,10.385278,2831 +alps_9164,PIZ CHASFORA,,46.556667,10.411389,3006 +alps_9165,PIZ UMBRAIL,,46.551111,10.414444,3033 +alps_9166,PUNTA DI RIMS,,46.544167,10.396389,2946 +alps_9167,MOTTA VALLAC,,46.635833,9.576111,1375 +alps_9168,PIZ MITGEL,,46.614167,9.646667,3159 +alps_9169,MOTTA PALOUSA,,46.641111,9.605278,2143 +alps_9170,PIZ DIGL BARBA PEDER,,46.607500,9.718333,2746 +alps_9171,PIZ RADOND,,46.615833,9.719167,2666 +alps_9172,PIZ D'UGLIX,,46.611944,9.701667,2967 +alps_9173,TINZENHORN,,46.611667,9.671111,3172 +alps_9174,PIZ CRAP,,46.623333,9.670556,2818 +alps_9175,PIZ SPADLATSCHA,,46.615833,9.703889,2871 +alps_9176,CHAVAGL GROND,,46.638056,9.700278,2443 +alps_9177,CHANTOTA,,46.631944,9.669444,2542 +alps_9178,BOT DIGL UORS,,46.645000,9.670278,2230 +alps_9179,PIZ PRONSONCH,,46.653333,9.785000,2684 +alps_9180,TSCHIMAS DA TISCH,,46.616667,9.815278,2872 +alps_9181,PIZ FREGSLAS,,46.626389,9.818889,2819 +alps_9182,PIZ BLAISUN,,46.603333,9.862778,3200 +alps_9183,PIZ BELVAIR,,46.612222,9.918889,2822 +alps_9184,PIZ COTSCHEN,,46.615556,9.878611,3208 +alps_9185,PIZ KESCH,,46.621389,9.872778,3418 +alps_9186,AGUOGLIA D'ESCHA,,46.619722,9.880000,3386 +alps_9187,PIZ VAROULA,,46.622778,9.910000,3064 +alps_9188,PIZ VAL MUERA,,46.627778,9.901111,3162 +alps_9189,PIZ PORCHABELLA,,46.635833,9.896389,3079 +alps_9190,PIZ VILUOCH,,46.642222,9.913611,3042 +alps_9191,PIZ FORUN,,46.655278,9.865000,3052 +alps_9192,PIZZET,,46.620278,9.927222,2909 +alps_9193,BOTTA CUOLM,,46.621389,9.935833,2862 +alps_9194,PIZ GRIATSCHOULS,,46.628333,9.943611,2972 +alps_9195,PIZ TANTERMOZZA,,46.635278,10.091944,3068 +alps_9196,PIZ QUATTERVALS,,46.627222,10.095000,3165 +alps_9197,PIZ COTSCHEN,,46.625833,10.076389,2983 +alps_9198,PIZ D'ESAN,,46.624444,10.060556,3127 +alps_9199,PIZ SERRA,,46.610833,10.105556,3095 +alps_9200,PIZ FIER,,46.597778,10.097778,3058 +alps_9201,PIZ MURTER,,46.645833,10.141667,2836 +alps_9202,PIZ DAL DIAVEL,,46.622500,10.139167,3062 +alps_9203,PIZ DA L'ACQUA,,46.611111,10.138889,3126 +alps_9204,PIZ MURTAROUS,,46.616111,10.159722,2930 +alps_9205,CIMA DEL FOPEL,,46.596111,10.149444,2928 +alps_9206,MUNT CHAVAGL,,46.644167,10.233889,2542 +alps_9207,IL JALET,,46.635833,10.285833,2392 +alps_9208,PIZ DAINT,,46.618611,10.290833,2968 +alps_9209,PIZ DORA,,46.605000,10.306111,2951 +alps_9210,PIZ CHAZFORA,,46.592222,10.321667,2783 +alps_9211,PIZ TERZA,,46.638611,10.400000,2909 +alps_9212,MUNTET,,46.636944,10.381667,2763 +alps_9213,LENZER HORN,,46.708889,9.595000,2906 +alps_9214,PIZ MOSCH,,46.712778,9.603333,2729 +alps_9215,PIZ MULAIN,,46.705278,9.615278,2626 +alps_9216,MUCHETTA,,46.675278,9.731944,2623 +alps_9217,STULSERGRAT,,46.676667,9.750833,2678 +alps_9218,BUELENHORN,,46.672500,9.766389,2808 +alps_9219,MAESCHENGRAT,,46.674722,9.791389,2770 +alps_9220,STREL,,46.702500,9.830556,2844 +alps_9221,KOCH DUCAN,,46.689444,9.851389,3063 +alps_9222,CHLEIN DUCAN,,46.681667,9.840833,3004 +alps_9223,CHRACHENHORN,,46.688611,9.814444,2890 +alps_9224,GIPSHORN,,46.677500,9.798056,2814 +alps_9225,DUCAN DADOR,,46.675000,9.830278,3019 +alps_9226,PIZ RAVIGLIEL,,46.670000,9.822222,2987 +alps_9227,PIZ CREALETSCH,,46.664722,9.812778,2950 +alps_9228,PIZ VALMELA,,46.660000,9.804444,2955 +alps_9229,MITTAGHORN,,46.701944,9.865833,2735 +alps_9230,BOCKTENHORN,,46.706944,9.902778,3044 +alps_9231,LEIDHORN,,46.700833,9.906389,2934 +alps_9232,AUGSTENHUERELI,,46.691667,9.903333,3027 +alps_9233,CHUEALPHORN,,46.685278,9.905278,3077 +alps_9234,PASSHOERELI,,46.681667,9.895000,2965 +alps_9235,PLATTENFLUE,,46.693056,9.861111,3013 +alps_9236,PIZ MURTELET,,46.670278,9.868056,3019 +alps_9237,PIZ MUSELLA,,46.656944,9.917222,2896 +alps_9238,SCALETTAHORN,,46.693333,9.942500,3068 +alps_9239,PIZ GRIALETSCH,,46.693889,9.955000,3131 +alps_9240,GRIPPA NAIRA,,46.690833,9.979444,3130 +alps_9241,PIZ VADRET,,46.686944,9.962778,3229 +alps_9242,PIZ DA L'HOM,,46.669167,9.956389,2986 +alps_9243,PIZ PUNT OTA,,46.676667,9.966389,3019 +alps_9244,PIZ FOURUN,,46.661111,9.975278,2932 +alps_9245,PIZ SARSURA PITSCHEN,,46.704167,9.997500,3134 +alps_9246,PIZ SARSURA,,46.691111,9.994444,3178 +alps_9247,PIZ SARSURET,,46.689722,10.008056,3126 +alps_9248,PIZ D'UREZZA,,46.696667,10.047222,2906 +alps_9249,PIZ IVRAINA,,46.701389,10.168611,2886 +alps_9250,PIZ TERZA,,46.669167,10.133889,2686 +alps_9251,PIZ LASCHADURELLA,,46.698056,10.195833,3046 +alps_9252,PIZ FTUR,,46.695556,10.207500,3022 +alps_9253,PIZ SAMPUOIR,,46.695556,10.216944,3023 +alps_9254,PIZ MURTERS,,46.690556,10.229722,3012 +alps_9255,PIZ DAL BOTSCH,,46.686667,10.248056,2852 +alps_9256,PIZ DA FUORN,,46.680278,10.213056,2906 +alps_9257,PIZ FORAZ,,46.690556,10.276667,3092 +alps_9258,PIZ NUGLIA,,46.684444,10.282778,2995 +alps_9259,PIZ STABELCHOD,,46.684167,10.265000,2944 +alps_9260,PIZ TAVRU,,46.679167,10.296111,3168 +alps_9261,PIZ NAIR,,46.666944,10.271944,3010 +alps_9262,PIZ VALLATSCHA,,46.668611,10.313889,3021 +alps_9263,PIZ MEZDI,,46.686389,10.331944,2888 +alps_9264,MOT DAL GAJER,,46.694444,10.330833,2797 +alps_9265,PIZ D'ASTRAS,,46.675556,10.327500,2980 +alps_9266,PIZ MURTERA,,46.665556,10.379167,2969 +alps_9267,MOT RADOND,,46.654167,10.354444,2492 +alps_9268,CIMA D'ARUNDA,,46.685556,10.429444,2880 +alps_9269,MONTE SAN LORENZO,,46.668056,10.390833,3021 +alps_9270,PIZ STARLEX,,46.662778,10.392500,3075 +alps_9271,PIZ COTSCHEN,,46.649444,10.396389,2768 +alps_9272,PARPANER WEISSHORN,,46.758889,9.606944,2824 +alps_9273,TSCHIRPEN,,46.761944,9.618889,2728 +alps_9274,SCHAFTAELLIHORN,,46.753611,9.656389,2546 +alps_9275,AELPLISEEHORN,,46.747222,9.647778,2725 +alps_9276,GAMSCHTAELLIHORN,,46.743889,9.638611,2830 +alps_9277,ERZHORN,,46.742500,9.630833,2924 +alps_9278,AELPLIHORN,,46.748333,9.610833,2842 +alps_9279,PARPANER ROTHORN,,46.743056,9.603611,2899 +alps_9280,AROSER ROTHORN,,46.737778,9.613889,2980 +alps_9281,PIZZA NAIRA,,46.727500,9.611944,2870 +alps_9282,PIZ MEZ,,46.722500,9.604167,2730 +alps_9283,GUGGERNELL,,46.722500,9.653333,2744 +alps_9284,GUGGERGRAT,,46.725556,9.660278,2810 +alps_9285,SCHIESSHORN,,46.766389,9.703333,2605 +alps_9286,STREL,,46.751389,9.715278,2674 +alps_9287,WASMENGRAT,,46.760833,9.720833,2701 +alps_9288,VALBELLAHORN,,46.739722,9.701667,2763 +alps_9289,SANDHUBEL,,46.740000,9.684444,2764 +alps_9290,GUGGERGRAT,,46.729722,9.669167,2793 +alps_9291,TIAUN,,46.723611,9.675556,2705 +alps_9292,RINERHORN,,46.739444,9.814167,2528 +alps_9293,ALPLIHORN,,46.710833,9.825833,3006 +alps_9294,LEIDBACHHORN,,46.721389,9.822222,2909 +alps_9295,WITIHUERELI,,46.752222,9.867500,2635 +alps_9296,BOERTERHORN,,46.743611,9.885556,2697 +alps_9297,WUOSTHORN,,46.734444,9.877778,2815 +alps_9298,TAELLIHORN,,46.740278,9.866389,2684 +alps_9299,SATTELHORN,,46.711389,9.899444,2977 +alps_9300,GFROREN HORN,,46.721667,9.871389,2746 +alps_9301,PIZ CHAMPATSCH,,46.760278,9.990833,2946 +alps_9302,SCHWARZHORN,,46.735833,9.941667,3146 +alps_9303,CHLEIN SCHWARZHORN,,46.743333,9.936667,2968 +alps_9304,PADUNER ROTHORN,,46.724167,9.946389,3022 +alps_9305,PIZ RADONT,,46.722500,9.958056,3065 +alps_9306,PIZ DAL RAS,,46.738611,10.033333,3025 +alps_9307,PIZ MURTAROL,,46.738333,10.012500,2881 +alps_9308,PIZ MURTERCHOEMBEL,,46.729444,10.005556,2996 +alps_9309,PIZ ARPSCHELLA,,46.718611,10.010278,3032 +alps_9310,PIZ D'IMMEZ,,46.713056,10.023056,2892 +alps_9311,PIZ MEZDI,,46.743611,10.116944,2888 +alps_9312,PIZ SURSASSA,,46.726111,10.113889,2968 +alps_9313,PIZ D'ARPIGLIAS,,46.734444,10.117500,3027 +alps_9314,PIZ SURSASS,,46.733611,10.176389,2910 +alps_9315,PIZ MACUN,,46.734167,10.142500,2889 +alps_9316,PIZ NUNA,,46.723333,10.154444,3123 +alps_9317,ILS CUOGNS,,46.715000,10.179167,2896 +alps_9318,PIZ PLAVNA DADORA,,46.737500,10.250556,2981 +alps_9319,PIZ NAIR,,46.733333,10.211667,2951 +alps_9320,PIZ PLATTAS,,46.718889,10.211667,3031 +alps_9321,PIZ PLAVNA DADAINT,,46.708611,10.223611,3166 +alps_9322,PIZ MEZDI,,46.747778,10.260278,2727 +alps_9323,PIZ CLEMGIA,,46.748611,10.278889,3042 +alps_9324,PIZ PISOC,,46.744444,10.279444,3173 +alps_9325,PIZ DALS VADES,,46.736944,10.276667,3140 +alps_9326,PIZ ZUORT,,46.735556,10.262778,3119 +alps_9327,PIZ DA LA CRAPPA,,46.732500,10.264722,3122 +alps_9328,PIZ MINGER,,46.728889,10.267500,3114 +alps_9329,PIZ DALS COTSCHENS,,46.723889,10.263333,3058 +alps_9330,PIZ MADLAIN,,46.739722,10.339167,3099 +alps_9331,PIZ COTSCHEN,,46.745556,10.355000,3046 +alps_9332,PIZ DA L'AUA,,46.749444,10.356111,3002 +alps_9333,PIZ D'IMMEZ,,46.741667,10.372222,3026 +alps_9334,MOT DA L'HOM,,46.718333,10.365556,2758 +alps_9335,PUNTA DI RASASS,,46.747778,10.447500,2941 +alps_9336,PIZ CRISTANAS,,46.734444,10.391944,3092 +alps_9337,PIZ RIMS,,46.733333,10.399167,3067 +alps_9338,SCHADLER,,46.727500,10.409444,2948 +alps_9339,FERNERSPITZ,,46.718889,10.418611,2954 +alps_9340,MUNTPITSCHEN,,46.708889,10.416111,3162 +alps_9341,PIZ SESVENNA,,46.705833,10.402778,3204 +alps_9342,FORATRIDER,,46.705278,10.408611,3136 +alps_9343,CIMA VALDASSA,,46.699444,10.413611,3049 +alps_9344,PIZ PLAZER,,46.708333,10.388056,3104 +alps_9345,PIZ CORNET,,46.733889,10.384444,2971 +alps_9346,GUERGERLETSCH,,46.797222,9.582778,2441 +alps_9347,PARPANER SCHWARZHORN,,46.774444,9.596389,2683 +alps_9348,WEISSHORN,,46.789722,9.638889,2653 +alps_9349,PLATTENHORN,,46.778056,9.625278,2554 +alps_9350,FURGGAHORN,,46.775556,9.725278,2727 +alps_9351,STRELA,,46.809167,9.783056,2636 +alps_9352,CHUEPFENFLUE,,46.807222,9.776111,2658 +alps_9353,CHOERBSCH HORN,,46.790556,9.767500,2650 +alps_9354,AMSELFLUE,,46.766389,9.732778,2771 +alps_9355,MEDERGER FLUE,,46.790556,9.751111,2706 +alps_9356,TIEJER FLUE,,46.780833,9.734444,2781 +alps_9357,SCHWARZHORN,,46.777778,9.742500,2759 +alps_9358,WANNENGRAT,,46.798889,9.778611,2517 +alps_9359,JATZHOEN,,46.765833,9.860000,2682 +alps_9360,JAKOBSHORN,,46.772500,9.849444,2590 +alps_9361,SCHIAHORN,,46.818056,9.804167,2708 +alps_9362,SENTISCH HORN,,46.766111,9.915000,2827 +alps_9363,BASLERSCH CHOPF,,46.781389,9.904167,2629 +alps_9364,BUELENHORN,,46.793056,9.887500,2512 +alps_9365,SEEHORN,,46.816111,9.870000,2238 +alps_9366,FLUELA WISSHORN,,46.762222,9.966667,3085 +alps_9367,PISCHAHORN,,46.813056,9.947500,2980 +alps_9368,GORIHORN,,46.795278,9.958889,2986 +alps_9369,MUTTELHORN,,46.778889,9.988056,2826 +alps_9370,ROSSTAELLISPITZ,,46.789167,9.993611,2929 +alps_9371,GAMSSPITZ,,46.794167,10.007222,2752 +alps_9372,MONTALIN,,46.863611,9.590278,2266 +alps_9373,FUL BERG,,46.871667,9.611111,2390 +alps_9374,HOCHWANG,,46.874167,9.632778,2532 +alps_9375,CUNGGEL,,46.865833,9.671944,2413 +alps_9376,MITTAGSPITZ,,46.869167,9.685000,2382 +alps_9377,HINTEREGG,,46.872778,9.711944,2396 +alps_9378,MATTJISCH HORN,,46.851111,9.723611,2461 +alps_9379,BLACKTER FLUE,,46.841111,9.726667,2318 +alps_9380,CHISTENSTEIN,,46.866111,9.767222,2473 +alps_9381,GAUDERGRAT,,46.856111,9.795833,2305 +alps_9382,SEEHORN,,46.854444,9.790556,2282 +alps_9383,ZENJI,,46.858889,9.753056,2430 +alps_9384,WEISSFLUH,,46.837778,9.792778,2834 +alps_9385,ZENJIFLUE,,46.837500,9.780556,2686 +alps_9386,HAUPTER HORN,,46.823889,9.789444,2586 +alps_9387,CASANNA,,46.859444,9.828333,2557 +alps_9388,SCHWARZHORN,,46.842778,9.811111,2670 +alps_9389,TOTALPHORN,,46.837778,9.821111,2532 +alps_9390,WEISSFLUHJOCH,,46.833333,9.806389,2693 +alps_9391,GOTSCHNAGRAT,,46.856111,9.847222,2300 +alps_9392,SALEZER HORN,,46.826111,9.823889,2536 +alps_9393,GATSCHIEFERS,,46.832222,9.926944,2676 +alps_9394,CANARDHORN,,46.845556,9.985000,2607 +alps_9395,LAUIZUGHORN,,46.841111,9.938889,2479 +alps_9396,WISSHORN,,46.834444,9.991667,2832 +alps_9397,ZIPPERSPITZ,,46.921389,9.595556,1774 +alps_9398,FADEUER,,46.910833,9.648056,2058 +alps_9399,WANNENSPITZ,,46.918333,9.643056,1970 +alps_9400,STELLI,,46.901389,9.651111,2110 +alps_9401,HANEN,,46.890556,9.614444,2056 +alps_9402,ROTHORN,,46.886389,9.649167,2363 +alps_9403,GLATTWANG,,46.880833,9.714167,2376 +alps_9404,GLATT BAERGJI,,46.874722,9.768889,2254 +alps_9405,BOCKHORN,,46.920278,9.851389,2351 +alps_9406,GEISSHORN,,46.915278,9.849167,2270 +alps_9407,HAUPT,,46.961667,9.602500,1398 +alps_9408,HOEHSASS,,46.937778,9.654722,1824 +alps_9409,CHRUZ,,46.955000,9.774722,2196 +alps_9410,SCHOLLBERG,,46.975000,9.864722,2570 +alps_9411,GAEMPIFLUE,,46.964167,9.863333,2390 +alps_9412,RAETSCHENHORN,,46.936667,9.850278,2703 +alps_9413,JAEGGLISCH HORN,,46.936389,9.822778,2290 +alps_9414,PIZ CALDERAS,,46.584722,10.461389,2794 +alps_9415,PIZ MINSCHUNS,,46.580833,10.483611,2934 +alps_9416,FALLASCHOPF,,46.566667,10.474722,2905 +alps_9417,PIZ COSTAINAS,,46.562222,10.474722,3004 +alps_9418,GROSS TARTSCHERKOPF,,46.556944,10.477500,2963 +alps_9419,KLEIN TARTSCHERKOPF,,46.551111,10.473889,2918 +alps_9420,KORSPITZ,,46.543611,10.472222,2933 +alps_9421,PIZ VAL GRONDA,,46.562222,10.452500,2880 +alps_9422,PIZ STABELS,,46.549722,10.450833,2955 +alps_9423,ROETLSPITZ,,46.541944,10.457222,3025 +alps_9424,PIZ CHAVALATSCH,,46.615278,10.491944,2763 +alps_9425,PIZ SIELVA,,46.589722,10.487778,2851 +alps_9426,MONTERODES,,46.690278,10.468611,2361 +alps_9427,CIMA DI TELLA,,46.675278,10.460556,2527 +alps_9428,VERNUN,,46.737778,10.465556,2818 +alps_9429,MONTE VATLES,,46.723611,10.488333,2555 +alps_9430,SCHILD,,47.038333,8.482778,1548 +alps_9431,RIGI SCHEIDEGG,,47.027500,8.519722,1656 +alps_9432,VITZNAUER STOCK,,47.004444,8.508889,1452 +alps_9433,ZUENGGELENFLUE,,47.020833,8.612222,1085 +alps_9434,HOCHFLUE,,47.010278,8.559722,1698 +alps_9435,RIGI KULM,,47.056667,8.485278,1798 +alps_9436,WILDSPITZ,,47.084444,8.577500,1580 +alps_9437,GNIPEN,,47.081667,8.563333,1568 +alps_9438,BRANDHOECHI,,47.113889,8.596111,1127 +alps_9439,HAGGENSPITZ,,47.043889,8.686667,1763 +alps_9440,KLEIN MYTHEN,,47.040556,8.685000,1811 +alps_9441,FURGGELENSTOCK,,47.038611,8.733056,1656 +alps_9442,BRUENNELISTOCK,,47.025278,8.728056,1593 +alps_9443,GROSS MYTHEN,,47.030000,8.688889,1898 +alps_9444,HUDELSCHIJEN,,47.010000,8.742222,1590 +alps_9445,GUGGERENCHOPF,,47.047222,8.790278,1258 +alps_9446,ROGGENSTOCK,,47.023333,8.789722,1778 +alps_9447,GROSS STERNEN,,46.999444,8.804722,1968 +alps_9448,SPIRSTOCK,,47.001111,8.771944,1771 +alps_9449,FARENSTOCK,,47.044722,8.831111,1640 +alps_9450,LEITERENSTOLLEN,,47.046667,8.845556,1789 +alps_9451,BIET,,47.037500,8.841111,1965 +alps_9452,FIDISBERG,,47.034167,8.835000,1919 +alps_9453,SCHUELBERG,,47.025833,8.833056,1929 +alps_9454,GANTSPITZ,,47.044167,8.880556,1970 +alps_9455,WAENIFIRST,,47.037778,8.882222,2004 +alps_9456,TWAERIBERG,,47.012500,8.835000,2117 +alps_9457,LAUIBERG,,47.014722,8.861667,2057 +alps_9458,MIESERENSTOCK,,47.003056,8.856944,2199 +alps_9459,HOCH HUND,,47.004722,8.847222,2215 +alps_9460,CHLAEBDAECHER,,47.006111,8.842500,2175 +alps_9461,DRUESBERG,,47.004167,8.833611,2282 +alps_9462,FORSTBERG,,47.000833,8.823611,2215 +alps_9463,WANNENSTOECKLI,,47.039167,8.911944,1987 +alps_9464,OCHSENKOPF,,47.040000,8.925278,2179 +alps_9465,MUTTERISTOCK,,47.048889,8.942778,2294 +alps_9466,MILCHPLANGGENSTOCK,,47.010000,8.942222,2106 +alps_9467,BIETSTOCK,,47.002500,8.886944,1989 +alps_9468,TWIREN,,47.036389,8.959444,1774 +alps_9469,MAETTLISTOCK,,47.043333,8.978611,1910 +alps_9470,DEJENSTOCK,,47.048056,8.992778,2021 +alps_9471,STRALSTOECKLI,,47.009444,8.954722,2215 +alps_9472,NAEBELCHAEPPLER,,47.006111,8.958611,2446 +alps_9473,USSER FURBERG,,47.006389,8.968333,2605 +alps_9474,INNER FUERBERG,,47.005278,8.979167,2627 +alps_9475,RUCHEN,,47.010556,9.001389,2901 +alps_9476,GLAERNISCH,,46.995000,8.995278,2914 +alps_9477,BAECHIHORN,,46.995556,8.979167,2637 +alps_9478,SCHWANDER GRAT,,47.003056,9.006667,2881 +alps_9479,VORDER GLAERNISCH,,47.021944,9.041111,2327 +alps_9480,VRENELISGAERTLI,,47.008056,9.017222,2904 +alps_9481,SCHILT,,47.044444,9.112222,2299 +alps_9482,HAECHLENSTOCK,,47.033056,9.125278,2316 +alps_9483,HEUSTOCK,,47.034167,9.133889,2384 +alps_9484,HOECH,,47.027500,9.141944,2426 +alps_9485,GUFELSTOCK,,47.025000,9.146667,2436 +alps_9486,SCHWARZSTOECKLI,,47.040000,9.134167,2385 +alps_9487,BREITCHAMM,,47.020278,9.145833,2396 +alps_9488,GOGGEIEN,,47.034722,9.204444,2351 +alps_9489,HEUSTOCK,,47.026111,9.180556,2471 +alps_9490,BUETZISTOCK,,47.028889,9.175278,2489 +alps_9491,GULDERGRAT,,47.000833,9.207222,2352 +alps_9492,GULDERSTOCK,,46.992778,9.200278,2520 +alps_9493,MAGERRAIN,,47.033056,9.220000,2523 +alps_9494,SPITZMEILEN,,47.023889,9.236389,2501 +alps_9495,WISSMILEN,,47.025833,9.230000,2483 +alps_9496,SCHNUERLIGRAT,,47.002778,9.277500,2473 +alps_9497,WISSGANDSTOECKLI,,46.995278,9.249722,2488 +alps_9498,STEINGAESSLER,,47.042222,9.301667,2251 +alps_9499,HOCHGAMATSCH,,47.037500,9.302500,2368 +alps_9500,HOCHFINSLER,,47.033889,9.300000,2421 +alps_9501,HUENERCHOPF,,47.024167,9.327778,2171 +alps_9502,MADCHOPF,,47.015833,9.318611,2236 +alps_9503,APOESTEL,,47.026389,9.298889,2351 +alps_9504,GULI,,47.012778,9.294722,2355 +alps_9505,FULEGG,,47.011389,9.282778,2322 +alps_9506,WANNENCHOPF,,47.008889,9.329444,2205 +alps_9507,ROTRUEFNER,,46.994444,9.281111,2462 +alps_9508,GAMIDAURSPITZ,,46.997500,9.396667,2309 +alps_9509,MORGARTEN,,47.100000,8.655556,1244 +alps_9510,HOCHSTUCKLI,,47.057778,8.670000,1566 +alps_9511,NUESELLSTOCK,,47.090278,8.695556,1478 +alps_9512,AMSELSPITZ,,47.089167,8.742778,1491 +alps_9513,GSCHWAENDSTOCK,,47.063333,8.747222,1616 +alps_9514,SCHRAEHOECHLI,,47.081389,8.787500,1478 +alps_9515,NUESSEN,,47.100556,8.871111,1529 +alps_9516,CHARENSTOCK,,47.067222,8.827778,1288 +alps_9517,DIETHELM,,47.061667,8.883333,2092 +alps_9518,SCHLUNDWALD STOCK,,47.055000,8.831667,1600 +alps_9519,REDERTENSTOCK,,47.049167,8.945833,2292 +alps_9520,TURNER,,47.059167,8.889444,2068 +alps_9521,BOCKMATTLI,,47.100556,8.958889,1932 +alps_9522,PLATTENBERG,,47.089167,8.961111,2082 +alps_9523,BRUENELLISTOCK,,47.084167,8.972500,2133 +alps_9524,ROSSALPELISPITZ,,47.081389,8.966389,2075 +alps_9525,ZINDLENSPITZ,,47.076389,8.959722,2097 +alps_9526,LACHENSTOCK,,47.066667,8.956944,2027 +alps_9527,GUMENSTOCK,,47.060556,9.005000,2256 +alps_9528,SCHIJEN,,47.059444,8.991667,2259 +alps_9529,SCHIBERG,,47.093056,8.953889,2044 +alps_9530,RAUTISPITZ,,47.071111,9.028333,2283 +alps_9531,WIGGIS,,47.065278,9.025556,2282 +alps_9532,NUENCHAMM,,47.091389,9.120556,1904 +alps_9533,SCHIJENSTOCK,,47.075000,9.121111,1923 +alps_9534,STOCK,,47.080278,9.146944,2390 +alps_9535,FULEN,,47.073056,9.144722,2410 +alps_9536,MUERTSCHENSTOCK,,47.070000,9.144167,2441 +alps_9537,FRONALPSTOCK,,47.068611,9.108611,2124 +alps_9538,FAERISTOCK,,47.059444,9.111389,2016 +alps_9539,SIWELLEN,,47.048611,9.118056,2307 +alps_9540,FIRZSTOCK,,47.085556,9.172500,1923 +alps_9541,ALPBIGLIGENSTOECKLI,,47.078611,9.178611,1958 +alps_9542,SILBERSPITZ,,47.056389,9.179167,2236 +alps_9543,HOCHMAETTLI,,47.052500,9.173056,2252 +alps_9544,PRODKAMM,,47.071389,9.265556,2006 +alps_9545,SAECHSMOOR,,47.070000,9.233333,2196 +alps_9546,LEIST,,47.065000,9.233611,2222 +alps_9547,RAINISSALTS,,47.062222,9.222222,2258 +alps_9548,GULMEN,,47.055278,9.221111,2317 +alps_9549,GUSCHA,,47.050833,9.316111,2132 +alps_9550,RUNENBERG,,47.087500,9.396111,1577 +alps_9551,GONZEN,,47.067500,9.433889,1830 +alps_9552,MITTAGSPITZ,,47.069167,9.534167,1857 +alps_9553,MITTLERSPITZ,,47.065278,9.539722,1897 +alps_9554,GOTTSCHALKENBERG,,47.153889,8.648056,1186 +alps_9555,HOHBODEN,,47.159722,8.675556,1229 +alps_9556,WINDWURF,,47.111944,8.707778,1379 +alps_9557,GRUEB,,47.150833,8.819167,1290 +alps_9558,GUETEREGG,,47.150000,8.826389,1275 +alps_9559,BUELHOECHI,,47.116389,8.841667,1425 +alps_9560,GROSS AUBRIG,,47.111389,8.881944,1695 +alps_9561,CHLI AUBRIG,,47.107500,8.862222,1642 +alps_9562,STOCKBERG,,47.155278,8.915278,1217 +alps_9563,SPITZBERG,,47.130000,8.904167,1098 +alps_9564,SALBUEGEL,,47.120000,8.931944,1319 +alps_9565,BRUESCHSTOCKBUEGEL,,47.108333,8.938056,1489 +alps_9566,AUSTOCK,,47.149444,8.960000,1423 +alps_9567,SCHWANTENHORN,,47.144722,8.958611,1457 +alps_9568,HIRZLI,,47.133889,9.007500,1640 +alps_9569,PLANGGENSTOCK,,47.133056,8.993611,1675 +alps_9570,CHOEPFENBERG,,47.118611,8.968611,1896 +alps_9571,BRUEGGLER,,47.117500,8.983889,1777 +alps_9572,WAGETEN,,47.119167,9.000278,1755 +alps_9573,TIERBERG,,47.103889,8.970556,1989 +alps_9574,FRIEDLISPITZ,,47.112778,9.028889,1624 +alps_9575,LEISTCHAMM,,47.146111,9.213333,2101 +alps_9576,NAEGELIBERG,,47.145000,9.230000,2163 +alps_9577,SCHAEAREN,,47.147778,9.238056,2194 +alps_9578,WART,,47.150000,9.245833,2068 +alps_9579,FRIMSEL,,47.152222,9.265833,2267 +alps_9580,TRISTENCHOLBEN,,47.146944,9.322222,2208 +alps_9581,HOECHST,,47.144167,9.348611,2024 +alps_9582,GAMSBERG,,47.135278,9.373889,2385 +alps_9583,SICHELKAMM,,47.133889,9.361944,2269 +alps_9584,MARGELCHOPF,,47.146111,9.399167,2163 +alps_9585,FULFIRST,,47.129722,9.396667,2384 +alps_9586,ROSSWIS,,47.133333,9.385278,2334 +alps_9587,GAERTLICHOPF,,47.126389,9.397778,2289 +alps_9588,CHRUMMENSTEIN,,47.115833,9.405556,2261 +alps_9589,CHLI ALVIER,,47.110556,9.409444,2285 +alps_9590,ALVIER,,47.110000,9.414722,2343 +alps_9591,GARTLICHOPF,,47.124722,9.398333,2298 +alps_9592,HURST,,47.119722,9.430000,1971 +alps_9593,BARBIELERGRAT CHOPF,,47.115833,9.425556,1997 +alps_9594,GAUSCHLER,,47.101389,9.422778,2310 +alps_9595,RICHTERSWILER EGG,,47.161944,8.680278,1225 +alps_9596,WILDSPITZ,,47.163056,8.695833,1205 +alps_9597,OBER STEINEGG,,47.199167,9.080556,1238 +alps_9598,VORDER FEDERISPITZ,,47.159167,9.079167,1626 +alps_9599,TUEFENTALER BERG,,47.203056,9.113333,1526 +alps_9600,USSER GHEIST,,47.199444,9.114722,1544 +alps_9601,WANNENBERG,,47.195278,9.117778,1644 +alps_9602,CHLI SPEER,,47.190278,9.121667,1713 +alps_9603,SPEER,,47.185833,9.122778,1950 +alps_9604,SPEERMURLI,,47.194444,9.139722,1746 +alps_9605,CHUEMETTLER,,47.179722,9.096111,1704 +alps_9606,GRAPPENHORN,,47.178611,9.110833,1741 +alps_9607,SCHAFBERG,,47.174444,9.105833,1790 +alps_9608,MATTSTOCK,,47.169722,9.135833,1936 +alps_9609,FEDERISPITZ,,47.166667,9.089722,1865 +alps_9610,BLAESS CHOPF,,47.206389,9.177500,1458 +alps_9611,GOGGEIEN,,47.185556,9.200278,1655 +alps_9612,SCHAER,,47.183056,9.198056,1637 +alps_9613,ROTBERG,,47.179722,9.193611,1546 +alps_9614,GULMEN,,47.169167,9.183333,1789 +alps_9615,RAABERG,,47.172500,9.156111,1723 +alps_9616,FLUGENSPITZ,,47.156111,9.204167,1703 +alps_9617,MITTAGBERG,,47.182500,9.227778,1549 +alps_9618,BRISI,,47.153056,9.277222,2279 +alps_9619,SELUN,,47.152500,9.255556,2205 +alps_9620,GAMSER RUGG,,47.158056,9.332778,2076 +alps_9621,HINTERRUGG,,47.153611,9.305278,2306 +alps_9622,SCHIBENSTOLL,,47.154444,9.295278,2236 +alps_9623,ZUESTOLL,,47.154167,9.285278,2235 +alps_9624,CHAPF,,47.150833,9.391111,2043 +alps_9625,REGELSTEIN,,47.247778,9.077500,1315 +alps_9626,TANZBODEN,,47.220556,9.106944,1443 +alps_9627,SCHORHUTTENBERG,,47.210556,9.105833,1442 +alps_9628,GOESSIGENHOECHI,,47.258333,9.211111,1436 +alps_9629,HINTERFALLENCHOPF,,47.257778,9.245000,1532 +alps_9630,STOCKBERG,,47.228889,9.243056,1781 +alps_9631,LUETISPITZ,,47.222778,9.283333,1987 +alps_9632,NEUENALPSPITZ,,47.207778,9.251944,1816 +alps_9633,MITTELBERG,,47.206667,9.283056,1483 +alps_9634,SAENTIS,,47.249444,9.343333,2502 +alps_9635,LISENGRAT,,47.246389,9.346944,2377 +alps_9636,GIRENSPITZ,,47.251944,9.341111,2448 +alps_9637,GRENZCHOPF,,47.246944,9.323889,2193 +alps_9638,SILBERPLATTEN,,47.240000,9.316111,2158 +alps_9639,STOSS,,47.234444,9.314167,2111 +alps_9640,GAMSCHOPF,,47.230556,9.304444,1959 +alps_9641,SCHWARZCHOPF,,47.228611,9.303333,1949 +alps_9642,STOELLEN,,47.225556,9.291944,1967 +alps_9643,WILDHUSER SCHAFBERG,,47.229444,9.351944,2373 +alps_9644,LAUIBERG,,47.210278,9.293889,1476 +alps_9645,HUENERBERG,,47.258889,9.348333,2312 +alps_9646,WIDERALPSTOCK,,47.254722,9.409444,2058 +alps_9647,HUNDSTEIN,,47.252500,9.401944,2157 +alps_9648,FAELENTUERM,,47.243056,9.381111,2224 +alps_9649,ALTMANN,,47.239444,9.371667,2435 +alps_9650,RUCHBUEL,,47.233889,9.381944,2106 +alps_9651,MUTSCHEN,,47.236111,9.406389,2122 +alps_9652,CHREIALPFIRST,,47.237222,9.397500,2126 +alps_9653,NAEDLIGER,,47.237778,9.363611,2321 +alps_9654,MOOR,,47.231389,9.362222,2342 +alps_9655,GULMEN,,47.223611,9.385556,1994 +alps_9656,KREUZBERGE,,47.239167,9.415000,2059 +alps_9657,HOCHHUS,,47.250833,9.437778,1926 +alps_9658,FURGGLENFIRST,,47.256667,9.447500,1951 +alps_9659,HUETTCHOPF,,47.313056,8.948611,1232 +alps_9660,BRANDEGG,,47.308889,8.942500,1243 +alps_9661,DAEGELSBERG,,47.315000,8.981667,1269 +alps_9662,SCHINDELEGG,,47.318056,8.990556,1266 +alps_9663,ROSSEGG,,47.312222,8.997222,1254 +alps_9664,HABRUETISPITZ,,47.305556,9.001389,1274 +alps_9665,CHRUTZEGG,,47.298056,9.020278,1314 +alps_9666,HOECHHAND,,47.297778,8.979167,1314 +alps_9667,SCHWARZENBERG,,47.291944,8.967222,1293 +alps_9668,SCHWAMMEGG,,47.280000,9.017500,1282 +alps_9669,ROTSTEIN,,47.285000,9.024444,1285 +alps_9670,STUESSEL,,47.274167,9.005000,1118 +alps_9671,KOEBELBERG,,47.268056,8.993611,1087 +alps_9672,GUNTLIBERG,,47.285833,8.961944,1224 +alps_9673,ALPLISPITZ,,47.303611,9.029444,1246 +alps_9674,TWERALPSPITZ,,47.290833,9.026389,1332 +alps_9675,GEISS CHOPF,,47.298889,9.041389,1201 +alps_9676,KOBELISBERG,,47.316389,9.115556,1146 +alps_9677,HOCHALP,,47.275278,9.253889,1530 +alps_9678,SPICHER,,47.265833,9.275000,1520 +alps_9679,KRONBERG,,47.291389,9.329444,1663 +alps_9680,EBENALP,,47.282778,9.410556,1640 +alps_9681,OEHRLI,,47.265556,9.360556,2194 +alps_9682,JAENGETTEN,,47.263333,9.362778,2211 +alps_9683,SCHAEFLER,,47.276111,9.390278,1925 +alps_9684,ALTENALP TURM,,47.270833,9.378611,2033 +alps_9685,MARWEES,,47.261389,9.403889,2056 +alps_9686,HOHER KASTEN,,47.283611,9.485278,1794 +alps_9687,ALP SIGEL,,47.273333,9.435833,1769 +alps_9688,STAUBEREN CHANZLEN,,47.260278,9.451944,1860 +alps_9689,BOGARTENFIRST,,47.266667,9.426389,1811 +alps_9690,HOERNLI,,47.370833,8.941667,1133 +alps_9691,ROTEN,,47.347500,8.974444,1148 +alps_9692,HIRZEGG,,47.340000,8.973056,1088 +alps_9693,SCHNEBELHORN,,47.325556,8.979722,1293 +alps_9694,LAUBBERG,,47.332778,8.998056,1169 +alps_9695,WARTEN,,47.328333,8.962222,1203 +alps_9696,HOCHHAMM,,47.316944,9.245000,1275 +alps_9697,HUNDWILDER HOEHI,,47.340833,9.333333,1305 +alps_9698,HIRSCHBERG,,47.347222,9.479167,1174 +alps_9699,FAENERENSPITZ,,47.314167,9.480833,1506 +alps_9700,GLEGGHORN,,47.036389,9.576667,2450 +alps_9701,VILAN,,47.012500,9.603056,2376 +alps_9702,SASSAUNA,,47.011944,9.698056,2308 +alps_9703,PFAEWI,,47.020000,9.705000,2306 +alps_9704,LAEGEND SAGETTIS,,47.026389,9.717500,2278 +alps_9705,HOCH SAGETTIS,,47.027778,9.727778,2285 +alps_9706,HURSCHER,,46.996111,9.786389,2001 +alps_9707,GIRENSPITZ,,47.026389,9.743333,2394 +alps_9708,CHUENIHORN,,46.988333,9.814167,2412 +alps_9709,SCHAFBERG,,47.003056,9.815278,2456 +alps_9710,KULMI,,47.087500,9.572222,1993 +alps_9711,PLASSTEIKOPF,,47.066111,9.577500,2345 +alps_9712,HOCHSPIELER,,47.073333,9.571389,2226 +alps_9713,RAPPENSTEIN,,47.076667,9.565833,2221 +alps_9714,ROTSPITZ,,47.057778,9.552500,2127 +alps_9715,SCHWARZHORN,,47.055000,9.587500,2574 +alps_9716,VORDER GRAUSPITZ,,47.052778,9.581111,2599 +alps_9717,FALKNIS,,47.050556,9.563889,2562 +alps_9718,MAZORAKOPF,,47.048611,9.556944,2451 +alps_9719,SCHOENBERG,,47.130278,9.593056,2104 +alps_9720,STACKLERKOPF,,47.122222,9.592222,2071 +alps_9721,KIRCHLESPITZ,,47.105000,9.587500,1890 +alps_9722,HEUBUEHL,,47.096667,9.566667,1936 +alps_9723,FRASTANZERSTAND,,47.193889,9.577500,1647 +alps_9724,DREI SCHWESTERN,,47.175556,9.572778,2052 +alps_9725,GARSELLAKOPF,,47.170556,9.565000,2105 +alps_9726,KUHGRAT,,47.166667,9.560833,2123 +alps_9727,HEHLAWANGSPITZ,,47.148611,9.561944,1999 +alps_9728,ARDETZENBERG,,47.251389,9.602222,631 +alps_9729,MONTLINGER BERG,,47.337222,9.586944,486 +alps_9730,MONTE SERVIN,,44.877222,7.185278,1758 +alps_9731,MONTE CASTELLETTO,,44.875278,7.211944,1512 +alps_9732,MONTE FREIDOUR,,44.973333,7.302500,1451 +alps_9733,MONTE CRISTETTO,,44.989444,7.281111,1612 +alps_9734,TRUC LAUSA,,44.928056,7.186667,1681 +alps_9735,MONTE CRAMMONT,,45.765278,6.947222,2737 +alps_9736,TETE DE L'ANE,,45.764167,6.931111,2793 +alps_9737,TETE DES VIEUX,,45.759167,6.934722,2878 +alps_9738,TETE DES JEUNES,,45.755278,6.938889,2790 +alps_9739,MONTE NIX,,45.761111,6.909444,2919 +alps_9740,MONTE FAVRE,,45.761944,6.894722,2966 +alps_9741,MONTE BERRIO BLANC,,45.753056,6.897778,3251 +alps_9742,MONTE BELLEFACE,,45.737500,6.927222,2890 +alps_9743,MONTE PERCE,,45.756667,6.850833,2844 +alps_9744,MONTE OUILLE,,45.728056,6.868333,3099 +alps_9745,LAITGRE,,45.718333,6.879444,2723 +alps_9746,PUNTA FORNET,,45.733611,6.856667,3076 +alps_9747,COLLE DELLA CROCE,,45.724722,6.986389,2474 +alps_9748,MONTE COLMET,,45.699722,6.988889,3024 +alps_9749,MONTE SALANCIA,,45.076667,7.195833,2088 +alps_9750,CARRA SAETTIVA,,45.078056,7.245000,1659 +alps_9751,ROCCIA CORBA,,45.079444,7.282500,1484 +alps_9752,MONTE PRESA VECCHIA,,45.075833,7.314722,1291 +alps_9753,ROCCA ROSSA,,45.057500,7.197500,2391 +alps_9754,MONTE PIAN REAL,,45.054444,7.180833,2617 +alps_9755,MONTE BOCCIARDA,,45.007778,7.182222,2213 +alps_9756,PORTA SARASINA,,45.005556,7.200833,2220 +alps_9757,MONTE UJA,,45.006111,7.211667,2158 +alps_9758,PUNTA LUNELLA,,45.197222,7.216389,2772 +alps_9759,PUNTA NONNA,,45.195833,7.196389,2640 +alps_9760,MONTE MONCHELLE,,45.686667,7.011667,3036 +alps_9761,TESTA DEL PARAMONT,,45.677778,7.019722,3136 +alps_9762,MONTE PARAMONT,,45.671667,7.028333,3299 +alps_9763,BECCA BIANCA,,45.666667,7.024444,3260 +alps_9764,FLAMBEAU,,45.653056,7.020000,3320 +alps_9765,DORAVIDI,,45.645833,7.023056,3442 +alps_9766,MONTE CHATEAU BLANC,,45.639444,7.023611,3425 +alps_9767,TESTA DEL RUTOR,,45.630833,7.014444,3486 +alps_9768,TORRE DEL TIGHET,,45.689167,7.064167,2976 +alps_9769,MONTE COLOMBO,,45.691111,7.118333,1841 +alps_9770,BECCA DEL MERLO,,45.650556,7.123889,2961 +alps_9771,GRAND REVERS,,45.642778,7.116111,3164 +alps_9772,BECCA DI TOS,,45.630278,7.106667,3301 +alps_9773,ORFEUILLE,,45.660833,7.052500,2761 +alps_9774,PUNTA DELLA LUETTA,,45.618889,7.106389,3215 +alps_9775,PUNTA DI FELUMA,,45.614444,7.101667,3212 +alps_9776,BECCA DI PRE D'AMONT,,45.603333,7.107222,3225 +alps_9777,PUNTA LA PIERRE,,45.666667,7.279444,2653 +alps_9778,PUNTA DEL DRINC,,45.659722,7.289167,2662 +alps_9779,COLLE DEL DRINC,,45.656667,7.300556,2659 +alps_9780,PIATTA DI GREVON,,45.653611,7.312778,2752 +alps_9781,PUNTA DI MOMPRES,,45.651667,7.322222,2790 +alps_9782,MONTE BIANCO,,45.652778,7.182778,2206 +alps_9783,MONTE PAILLASSE,,45.645000,7.182778,2414 +alps_9784,PUNTA CHAMOUSSIERE,,45.625833,7.174167,2933 +alps_9785,PUNTA DEL RAN,,45.615278,7.170833,3271 +alps_9786,PUNTA BIOULA,,45.603056,7.172778,3414 +alps_9787,PUNTA VALLETTA,,45.636944,7.224722,2789 +alps_9788,MONTE FAVRET,,45.624444,7.229167,3173 +alps_9789,GRAND NOMENON,,45.611944,7.236111,3488 +alps_9790,GRIVOLETTA,,45.603056,7.270833,3511 +alps_9791,PUNTA POUSSET,,45.611111,7.301944,3046 +alps_9792,PUNTA DEL TRAIO,,45.618611,7.270278,3123 +alps_9793,BECCA DI NONA,,45.687222,7.365833,3142 +alps_9794,MONTE EMILIUS,,45.678889,7.384722,3559 +alps_9795,PUNTA ROSSA,,45.666111,7.381667,3407 +alps_9796,PUNTA GARIN,,45.655833,7.377500,3455 +alps_9797,MONTE GRAUSON,,45.649722,7.393889,3241 +alps_9798,BECCA DI SENEVA,,45.690278,7.394444,3086 +alps_9799,BECCA DI SALE,,45.688611,7.420000,3137 +alps_9800,PETITE ROISE,,45.681667,7.423889,3276 +alps_9801,GRANDE ROISE,,45.675278,7.423056,3353 +alps_9802,PUNTA DI LEPPE,,45.662500,7.416111,3303 +alps_9803,MONTE VALLONET,,45.656667,7.421667,3099 +alps_9804,COLLE DI LEPPE,,45.668333,7.422222,3272 +alps_9805,MONTE COURQUET,,45.686667,7.471389,2530 +alps_9806,COLLE LA ROSSA,,45.674444,7.471389,2640 +alps_9807,PUNTA PLAN RUE,,45.668056,7.470833,2882 +alps_9808,GRANDE CRESTA,,45.661111,7.471667,2906 +alps_9809,GRAND AVERT,,45.651111,7.471389,2991 +alps_9810,PICCOLO AVERT,,45.644444,7.465000,2948 +alps_9811,PUNTA TESSONET,,45.633889,7.464167,3264 +alps_9812,PUNTA DI LAVAL,,45.645556,7.436667,3098 +alps_9813,PUNTA GIANNI VERT,,45.638889,7.443333,3148 +alps_9814,PUNTA DELLA VALLETTA,,45.658056,7.340556,3090 +alps_9815,PUNTA COPPI,,45.644167,7.367222,3171 +alps_9816,MONTE CREYA,,45.623056,7.399444,3015 +alps_9817,TESTA DI MONEY,,45.618333,7.408333,3130 +alps_9818,PUNTA COUPE,,45.617222,7.414444,3213 +alps_9819,PENNE BLANCHE,,45.618889,7.426944,3250 +alps_9820,TORRE PONTON,,45.603611,7.494722,3101 +alps_9821,TORRE PONTONNET,,45.611944,7.482500,3173 +alps_9822,PUNTA TERSIVA,,45.620556,7.476111,3512 +alps_9823,PUNTA CHERMONTANE,,45.697222,7.526944,2677 +alps_9824,TETE DE PLAN FRET,,45.680556,7.534167,2712 +alps_9825,MONTE IVERTA,,45.662500,7.545000,2935 +alps_9826,MONTE AVIC,,45.676944,7.555000,3006 +alps_9827,MONTE RUVI,,45.689167,7.564722,2920 +alps_9828,MONTE SIRON,,45.696944,7.566389,2700 +alps_9829,BEC GAVIN,,45.659444,7.640000,1999 +alps_9830,CIMA PIANA,,45.646111,7.608889,2512 +alps_9831,MONTE GRIMON,,45.650278,7.608611,2521 +alps_9832,MONTE LA PERTZE,,45.656944,7.609444,2380 +alps_9833,MONTE ORSO,,45.655833,7.562778,2717 +alps_9834,L'INVERS DEL LAGO GELATO,,45.660000,7.555000,2916 +alps_9835,MONTE BELPLA,,45.652778,7.550278,2827 +alps_9836,BEC DE VIOT,,45.651111,7.509167,3051 +alps_9837,MONTE RAFRAY,,45.647778,7.511111,3145 +alps_9838,MONTE GLACIER,,45.631667,7.539444,3186 +alps_9839,MONTE DELA,,45.624444,7.529167,3139 +alps_9840,MONTE MOUSSAILLON,,45.615556,7.504167,3073 +alps_9841,GRAN ROSSA,,45.634722,7.557778,2866 +alps_9842,LA TORRETTA,,45.641111,7.589167,2540 +alps_9843,MONT DANDASSE,,45.635278,7.650278,1916 +alps_9844,CIMA PERCHE,,45.640000,7.613889,2381 +alps_9845,TETE DU MONT,,45.629444,7.664167,1897 +alps_9846,BEC MOUPEY,,45.614167,7.620833,1985 +alps_9847,PUNTA CHAMP CHEVRY,,45.609167,7.600000,2211 +alps_9848,BEC LARIS,,45.600278,7.585278,2426 +alps_9849,BEC RATY,,45.620833,7.575278,2382 +alps_9850,BEC BARMASSE,,45.625556,7.581944,2313 +alps_9851,BEC DES HOMMES,,45.637778,7.581111,2629 +alps_9852,MONTE RASCIAS,,45.600278,7.531944,2782 +alps_9853,BECCA MORTENS,,45.696389,7.775556,2736 +alps_9854,BECCA TORCHE,,45.690556,7.785833,3016 +alps_9855,BECCA VLOU,,45.691667,7.791944,3032 +alps_9856,MONTE VOGHEL,,45.694167,7.802500,2925 +alps_9857,PILASTRO DI VLOU,,45.685556,7.803333,2573 +alps_9858,CORNO DEL LAGO,,45.670833,7.783333,2747 +alps_9859,MONTE CRABUN,,45.663611,7.785000,2711 +alps_9860,MONTE EISCHEMBLATTA,,45.666389,7.805833,2291 +alps_9861,CIMA DI PRIAT,,45.660556,7.811389,2424 +alps_9862,LOSE BIANCHE,,45.651389,7.815000,2435 +alps_9863,MONTE DELL'AQUILA,,45.663333,7.767500,2581 +alps_9864,TESTA COLON,,45.628056,7.676111,1921 +alps_9865,MONTE CHARVATTON,,45.618889,7.690000,1787 +alps_9866,TETE DE COU,,45.625000,7.756667,1410 +alps_9867,CROIX CORMA,,45.625556,7.783611,1958 +alps_9868,CIMA BECCHET,,45.684722,7.884444,2323 +alps_9869,MONTE PIETRA BIANCA,,45.670556,7.910833,2490 +alps_9870,MONTE CRESTO,,45.680556,7.910556,2542 +alps_9871,PUNTA DELLA VECCHIA,,45.691389,7.906667,2388 +alps_9872,MONTE TOVO,,45.645278,7.961667,2229 +alps_9873,MONTE ROSSO,,45.635556,7.936111,2374 +alps_9874,MONTE MARS,,45.633333,7.915278,2600 +alps_9875,PUNTA DELLA SELLA,,45.623611,7.906944,2303 +alps_9876,BALMA D'OROPA,,45.643611,7.939444,2383 +alps_9877,PUNTA GRAGLIASCA,,45.655000,7.925833,2331 +alps_9878,PUNTA LEI LONG,,45.650278,7.927222,2323 +alps_9879,MONTE CAMINO,,45.645000,7.944444,2388 +alps_9880,MONTE BECCO,,45.636667,7.990833,1739 +alps_9881,MONTE MUCRONE,,45.620556,7.944444,2335 +alps_9882,MONTE BECHIT,,45.608611,7.894444,2320 +alps_9883,MONTE ROUX,,45.604167,7.890833,2316 +alps_9884,BEC DI NONA,,45.602500,7.849444,2085 +alps_9885,TESTA DI LICONI,,45.797500,7.018889,2927 +alps_9886,LA GRANDE TESTA,,45.790556,7.010556,2763 +alps_9887,TESTA DRUMIANA,,45.782222,7.036111,2399 +alps_9888,PUNTA FALITA,,45.775000,7.106667,2623 +alps_9889,TESTA DEI FRA,,45.791389,7.110278,2815 +alps_9890,TESTA DI SERENA,,45.796667,7.112500,2830 +alps_9891,TESTA NERA,,45.798611,7.069722,2758 +alps_9892,MONTE ROSSO,,45.766944,7.163889,2936 +alps_9893,MONTE FLASSIN,,45.789722,7.159167,2772 +alps_9894,PUNTA AQUILLETTA,,45.743889,7.143056,2616 +alps_9895,MONTE CHARVET,,45.731389,7.013889,2491 +alps_9896,BECCA PUGNENTA,,45.718611,7.014444,2827 +alps_9897,COURT DI BARD,,45.737778,7.112778,2261 +alps_9898,MONTE FALLERE,,45.775556,7.194167,3059 +alps_9899,COSTA MAYAN,,45.776667,7.212500,2824 +alps_9900,PUNTA CHALIGNE,,45.767500,7.238611,2608 +alps_9901,POINTE DE MET,,45.762500,7.241111,2553 +alps_9902,BECCA FRANCE,,45.748333,7.218889,2312 +alps_9903,MONTE VERTOSAN,,45.775278,7.174167,2815 +alps_9904,BECCA DI VIOU,,45.797500,7.362500,2855 +alps_9905,MONTE MARY,,45.793056,7.372500,2815 +alps_9906,BECCA DI AVUILLE,,45.791667,7.442500,2623 +alps_9907,CIMA LONGHEDE,,45.791944,7.520556,2416 +alps_9908,MONTE ZERBION,,45.788333,7.663611,2719 +alps_9909,MONTE LYAN,,45.705833,7.627778,2168 +alps_9910,MONTE BARBESTON,,45.702500,7.597778,2482 +alps_9911,CIMA NERA,,45.701389,7.568889,2697 +alps_9912,CIMA BOTTA,,45.773056,7.687500,2044 +alps_9913,CORNO BUSSOLA,,45.795833,7.736667,3023 +alps_9914,PUNTA PALASINA,,45.793889,7.766667,2778 +alps_9915,PUNTA VALFREDDA,,45.793333,7.784167,2942 +alps_9916,PUNTA VALNERA,,45.784167,7.791667,2753 +alps_9917,PUNTA GOA,,45.781944,7.736111,2776 +alps_9918,MONTE BIETERON,,45.777500,7.782500,2763 +alps_9919,MONTE CIOSE,,45.764167,7.798056,2647 +alps_9920,PUNTA DELLA REGINA,,45.749444,7.804722,2387 +alps_9921,MONTE RENA,,45.742778,7.809167,2513 +alps_9922,MONTE TAF,,45.735556,7.819722,2525 +alps_9923,PUNTA DI WEISSMATTEN,,45.741944,7.815000,2564 +alps_9924,PUNTA DI FRUDIERE,,45.732222,7.830000,2384 +alps_9925,CORNO MARIA,,45.721389,7.828333,2766 +alps_9926,MONTE NERY,,45.715833,7.820000,3075 +alps_9927,PUNTA DI SOLERON,,45.721667,7.803333,2890 +alps_9928,PUNTA CHAMPLON,,45.725278,7.788333,2674 +alps_9929,TESTA DI COMAGNA,,45.745000,7.721944,2105 +alps_9930,CLEVE DI MOULA,,45.737778,7.775833,2241 +alps_9931,COLLE DI CHASTEN,,45.707778,7.809167,2643 +alps_9932,PUNTA TRISCTE,,45.789167,7.848611,2729 +alps_9933,CORNO VALDOBBIA,,45.791667,7.861667,2759 +alps_9934,PUNTA PLAIDA,,45.783056,7.869167,2690 +alps_9935,CORNO ROSSO,,45.766944,7.880278,2979 +alps_9936,CORNO DEL PALLONE,,45.760556,7.885000,2920 +alps_9937,PUNTA DEL CORTESE,,45.772500,7.922500,2707 +alps_9938,PUNTA DEL TILLIO,,45.776111,7.923611,2670 +alps_9939,MONTE PALANCA,,45.792500,7.933056,2685 +alps_9940,CIMA DI FANZO,,45.796111,7.940833,2525 +alps_9941,PUNTA VASNERA,,45.787222,7.997500,2027 +alps_9942,PUNTA DULARNA,,45.784444,7.976389,2237 +alps_9943,PUNTA CICIOZZA,,45.783611,7.967500,2514 +alps_9944,CORNO ROSSO,,45.782222,7.963333,2548 +alps_9945,BECCO DI COSSARELLO,,45.768889,7.948889,2631 +alps_9946,PUNTA BERRETTA DEL VESCOVO,,45.755833,7.930556,2723 +alps_9947,FRATE DELLA MEIA,,45.759167,7.923889,2812 +alps_9948,MONTE COSSARELLO,,45.741389,7.935000,2691 +alps_9949,PUNTA LAZONEY,,45.734722,7.926944,2580 +alps_9950,MONTE PIANERITZ,,45.733333,7.903611,2552 +alps_9951,MONTE EBY,,45.742778,7.886944,2402 +alps_9952,TAILLE SPITZ,,45.740278,7.876389,2527 +alps_9953,PUNTA VENTULARO,,45.769722,7.958056,2491 +alps_9954,IL TURRIO,,45.746944,7.982500,2041 +alps_9955,PUNTA CORNACCIO,,45.747222,7.908611,2589 +alps_9956,PUNTA TRE VESCOVI,,45.724444,7.937778,2500 +alps_9957,MONTE GEMELLI,,45.717500,7.928611,2472 +alps_9958,PUNTA SERANGE,,45.709722,7.925556,2333 +alps_9959,PUNTA CAPARELLI,,45.701667,7.912222,2411 +alps_9960,CIMA DELL'ARTORTA,,45.732222,7.961389,2332 +alps_9961,CIMA DI BO,,45.714167,7.998889,2555 +alps_9962,MONTE CAMBRA,,45.720000,7.990278,2488 +alps_9963,MONTE ROSSO,,45.718611,7.955556,2338 +alps_9964,CIMA DEL BERGAMASCO,,45.709722,7.987500,2226 +alps_9965,PUNTA LA CASCINACCIA,,45.721111,7.971667,2065 +alps_9966,MONTE WEISS WEIB,,45.712500,7.852500,2516 +alps_9967,COLLE DEL TERMO,,45.899444,8.012500,2545 +alps_9968,CIMA LAMPONE,,45.893056,8.025000,2585 +alps_9969,CIMA DEL SOGLIO,,45.887500,8.030833,2328 +alps_9970,COLMA BELLA,,45.879722,8.034722,2230 +alps_9971,MONTE CERVERO,,45.876389,8.045833,2061 +alps_9972,CIMA COLMETTA,,45.895833,8.099722,2459 +alps_9973,MASSA DEL CASTELLO,,45.890278,8.101389,2433 +alps_9974,PUNTA CASTELLO,,45.884722,8.120278,2095 +alps_9975,CIMA LAVAGGIO,,45.846667,8.163056,1594 +alps_9976,SASSO DELLA COLMA,,45.840000,8.158889,1565 +alps_9977,PIZZO TRACCIORA DI CERVATTO,,45.856667,8.136667,1916 +alps_9978,CIMA CASTELLO,,45.861111,8.087778,1985 +alps_9979,CIMA DEI CARETTI,,45.846944,8.004167,2363 +alps_9980,PUNTA DELLE TIRETTE,,45.843611,8.012778,2379 +alps_9981,CIMA SAJUNCHE,,45.839167,8.030000,2339 +alps_9982,PUNTA MASSAREI,,45.832500,8.036944,2052 +alps_9983,COLMA SOGLIA,,45.822222,8.052778,1990 +alps_9984,COLMA FINESTROLO,,45.818889,8.063889,1943 +alps_9985,QUATTRO BRICCHI,,45.810000,8.056667,1968 +alps_9986,CIMA DI FAUT,,45.850278,8.026667,2028 +alps_9987,COLMETTO DI SCOTTO,,45.802778,8.094444,1605 +alps_9988,CIMA DI RONDO,,45.899444,8.219722,1980 +alps_9989,IL CASTELLO,,45.894722,8.206111,1940 +alps_9990,CIMA DI RAZZAROLA,,45.884444,8.222778,1714 +alps_9991,CIMA DEL CAVALLO,,45.893333,8.196111,1895 +alps_9992,MONTE GALERNO,,45.858333,8.199444,1246 +alps_9993,MASSA DEL TURLO,,45.895278,8.276944,1958 +alps_9994,COLLE DEL CAMPO,,45.890556,8.296389,1744 +alps_9995,MONTE OSTANO,,45.870556,8.302778,1505 +alps_9996,CIMA DEL CAMOSSARO,,45.861111,8.294722,1453 +alps_9997,MONTE NOVESSO,,45.845556,8.325000,1409 +alps_9998,CIMA PIZZE,,45.839167,8.209444,1257 +alps_9999,CIMA DI VASO,,45.838889,8.228333,1342 +alps_10000,MONTE QUARONE,,45.821111,8.293611,1218 +alps_10001,CIMA DELLA VALLE,,45.800833,8.186667,1468 +alps_10002,MARIGAL,,45.994722,8.071389,2599 +alps_10003,PIZZETTO,,45.954722,8.109167,1882 +alps_10004,CIMA PASSET,,45.947778,8.083333,2280 +alps_10005,MONTE RONCASTELLO,,45.941389,8.074167,2422 +alps_10006,PIZZO TIGNAGA,,45.935556,8.065000,2653 +alps_10007,PIZZO DELLA MORIANA,,45.936667,8.044444,2620 +alps_10008,PALONE DEL BADILE,,45.929444,8.015000,2675 +alps_10009,PIZZO QUARAZZOLE,,45.923611,8.007778,2798 +alps_10010,PIZZO MONTEVECCHIO,,45.913333,7.999444,2789 +alps_10011,CIMA TRASINERA,,45.904444,8.006111,2610 +alps_10012,CIMA DEL TIGLIO,,45.899722,8.012500,2545 +alps_10013,PIZZO DELLA CACCIA,,45.946667,8.039444,2404 +alps_10014,PIZZO DEL VITTINI,,45.940000,8.008333,2456 +alps_10015,IL CIMONE,,45.921389,8.086667,2451 +alps_10016,CIMA PIANONE,,45.913611,8.084167,2466 +alps_10017,PIZZO DEL MORO,,45.930556,8.124722,2335 +alps_10018,I TRE PIZZI,,45.933889,8.131111,2254 +alps_10019,PIZZO NONA,,45.933611,8.145833,2246 +alps_10020,CORNO DEL SOLE,,45.939444,8.163611,2163 +alps_10021,CIMA DI SCARPIGNANO,,45.970556,8.186389,2271 +alps_10022,PIZZO CAMINO,,45.977500,8.234444,2148 +alps_10023,CIMA STRIGHET,,45.993611,8.230833,1899 +alps_10024,PUNTA L'OTTONE,,45.983611,8.249444,1691 +alps_10025,MONTE TURI,,45.971389,8.305000,1673 +alps_10026,MONTE CROTTA,,45.956389,8.308333,1965 +alps_10027,CIMA SCARVINI,,45.948889,8.318889,2116 +alps_10028,MAZZA DELL'INTERNO,,45.954444,8.284167,1926 +alps_10029,MONTE VENTOLARO,,45.957222,8.275000,1892 +alps_10030,CIMA RAVINELLA,,45.947500,8.252778,2101 +alps_10031,PUNTA DELL'USCIOLO,,45.952500,8.246944,2187 +alps_10032,MONTE RONDA,,45.954444,8.220833,2416 +alps_10033,CIMA DI CAPEZZONE,,45.945000,8.208889,2421 +alps_10034,CIMA LAGO,,45.941111,8.205278,2401 +alps_10035,CORNO VEGLIANA,,45.932778,8.193611,2105 +alps_10036,PUNTA DEL PIZZO,,45.925833,8.212778,2232 +alps_10037,MONTE CAPIO,,45.910833,8.238611,2172 +alps_10038,CIMA DI RIMEO,,45.908333,8.253889,2072 +alps_10039,MONTE MORA,,45.950556,8.191944,2313 +alps_10040,CIMA CRESTA,,45.950556,8.183333,2324 +alps_10041,CIMA DI FORNO,,45.945000,8.174444,2241 +alps_10042,CIMA DELL'OVAC,,45.983333,8.186944,1850 +alps_10043,MONTE COLTIGNONE,,45.885278,9.388889,1473 +alps_10044,MONTE MOREGALLO,,45.866389,9.339722,1276 +alps_10045,MONTE DUE MANI,,45.898333,9.448889,1657 +alps_10046,RESEGONE DI LECCO,,45.858333,9.468889,1875 +alps_10047,CORNA CAMOZZERA,,45.831111,9.472500,1452 +alps_10048,MONTE PICCHETTO,,45.809722,9.487778,1314 +alps_10049,PIZZO D'ERNA,,45.862222,9.444722,1362 +alps_10050,MONTE BARRO,,45.830833,9.380000,922 +alps_10051,MONTE SPEDONE,,45.812500,9.461389,1110 +alps_10052,I CANTI,,45.866111,9.538056,1563 +alps_10053,ZUC DE VALMANA,,45.870278,9.524167,1546 +alps_10054,MONTE SORNADELLO,,45.858611,9.610556,1580 +alps_10055,CASTELLO REGINA,,45.841667,9.618611,1424 +alps_10056,MONTE FOLDONE,,45.848611,9.618056,1502 +alps_10057,PIZZO GRANDE,,45.868889,9.615556,1571 +alps_10058,ZUCCO,,45.821111,9.656111,1232 +alps_10059,ZUCCONE,,45.817778,9.645833,1272 +alps_10060,MONTE VACCAREGIO,,45.896944,9.712222,1474 +alps_10061,MONTE CASTELLO,,45.896111,9.725000,1474 +alps_10062,CIMA DELLA SPADA,,45.872778,9.776944,1978 +alps_10063,MONTE ALBEN,,45.862222,9.781944,2019 +alps_10064,MONTE SECRETOND0,,45.845000,9.800000,1555 +alps_10065,MONTE SUCHELLO,,45.831389,9.765833,1541 +alps_10066,PIZZO RABBIOSO,,45.838056,9.703333,1151 +alps_10067,COLLE CROSIO,,45.886111,9.940833,712 +alps_10068,MONTE FOGAROLO,,45.841389,9.956944,1529 +alps_10069,MONTAGNINA,,45.844444,9.943333,1598 +alps_10070,MONTE CORNO,,45.829167,9.948056,1370 +alps_10071,PIZZO FORMICO,,45.847500,9.923611,1636 +alps_10072,CORNO FALO,,45.859722,9.895556,1147 +alps_10073,CORNO GUAZZA,,45.853611,9.900000,1297 +alps_10074,CIMA TAGLIATE,,45.861111,9.923611,1095 +alps_10075,PIZZO FROL,,45.848333,9.865278,1053 +alps_10076,CRESTA DEL FARNO,,45.832778,9.907222,1334 +alps_10077,MONTE GRIONE,,45.811389,9.974722,1381 +alps_10078,MONTE SPARAVERA,,45.808056,9.954167,1369 +alps_10079,GRIGNA SETTENTRIONALE,,45.953333,9.387500,2409 +alps_10080,GRIGNA MERIDIONALE,,45.921944,9.390556,2177 +alps_10081,ZUCCO PERTUSO,,45.921111,9.363889,1674 +alps_10082,CIMA DEL CIC,,45.991944,9.363056,1451 +alps_10083,TRE SASSI,,45.961389,9.376111,2105 +alps_10084,PIZZO DELLA PIEVE,,45.962222,9.398889,2248 +alps_10085,ZUCCO DI CHIGNOLI,,45.942778,9.390556,2163 +alps_10086,SASSO CAVALLO,,45.946389,9.370278,1920 +alps_10087,ZUCCO ORICELLERA,,45.954722,9.491944,1856 +alps_10088,MONTE FOPPABONA,,45.994722,9.494444,2082 +alps_10089,ZUCCO ANGELONE,,45.960278,9.460278,1165 +alps_10090,CIMA MUSCHIADA,,45.900278,9.469722,1458 +alps_10091,ZUCCO DI DESIO,,45.903056,9.448333,1655 +alps_10092,CIMA DI PIANCA,,45.944722,9.337500,1354 +alps_10093,ZUCCONE CAMPELLI,,45.953333,9.516944,2159 +alps_10094,CORNA GRANDE,,45.965278,9.517778,2090 +alps_10095,CIMA DI PIAZZO,,45.951111,9.538333,2057 +alps_10096,LA CORNETTA,,45.957222,9.536944,1957 +alps_10097,MONTE SODADURA,,45.940000,9.546944,2010 +alps_10098,MONTE CANTARSO,,45.950000,9.556667,1896 +alps_10099,PIZZO BACIAMORTE,,45.946667,9.580000,2009 +alps_10100,MONTE ARALALTA,,45.945278,9.576944,2006 +alps_10101,GRONDE DEI RICCI,,45.963611,9.585000,1537 +alps_10102,PIZZO DI CUSIO,,45.987222,9.592778,1466 +alps_10103,PIZZO DI MEZZODI,,45.943056,9.635000,1713 +alps_10104,MONTE VENTUROSA,,45.929722,9.616111,1999 +alps_10105,MONTE CANCERVO,,45.918056,9.617778,1840 +alps_10106,CORNA DEI BAGOLI,,45.985000,9.722222,1790 +alps_10107,PIZZO DELL'ORTO,,45.992778,9.785000,2276 +alps_10108,MONTE SPONDONE,,45.980833,9.794722,2445 +alps_10109,I TRE PIZZI,,45.969444,9.778889,2153 +alps_10110,MONTE CORTE,,45.983611,9.825556,2493 +alps_10111,PIZZO FARNO,,45.989167,9.826111,2506 +alps_10112,CORNO BRANCHINO,,45.955278,9.802500,2032 +alps_10113,CORNA PIANA,,45.942500,9.807500,2302 +alps_10114,PIZZO ARERA,,45.934722,9.815833,2512 +alps_10115,IL PIZZO,,45.935833,9.766389,2274 +alps_10116,CIMA DI MENNA,,45.929444,9.759722,2300 +alps_10117,MONTE VALBONA,,45.932222,9.720556,1818 +alps_10118,MONTE ARTIGHERA,,45.926667,9.698333,1631 +alps_10119,MONTE DELLE GALINE,,45.973056,9.814167,2131 +alps_10120,CIMA DI GREM,,45.908333,9.822778,2049 +alps_10121,PIZZO SALINA,,45.986111,9.857778,2495 +alps_10122,MONTE CRAPEL,,45.976389,9.856944,2128 +alps_10123,MONTE CAMPAGANO,,45.968333,9.838056,2031 +alps_10124,MONTE ZULINO,,45.961667,9.862778,1751 +alps_10125,MONTE AVERT,,45.971667,9.989167,2085 +alps_10126,CIMA DI TIMOGNO,,45.965833,9.992778,2172 +alps_10127,MONTE VODALA,,45.960278,9.988889,2099 +alps_10128,MONTE CORRU,,45.955556,9.961389,1823 +alps_10129,MONTE REDONDO,,45.955833,9.948056,1799 +alps_10130,CIMA VALMORA,,45.930278,9.841944,2198 +alps_10131,CIMA DEL FOP,,45.933056,9.863889,2322 +alps_10132,MONTE SECCO,,45.932500,9.881389,2266 +alps_10133,CIMA BLUM,,45.908056,9.967778,1297 +alps_10134,MONTE PARE,,45.919167,9.989444,1642 +alps_10135,CIMA BA,,45.930833,9.958611,1524 +alps_10136,MONTE PRADELLA,,45.992500,9.850278,2619 +alps_10137,MONTE BESUM,,45.688056,10.468889,1115 +alps_10138,MONTE UCIA,,45.600278,10.336111,1168 +alps_10139,MONTE PIZZOCOLO,,45.673056,10.591944,1581 +alps_10140,MONTE SPINO,,45.685000,10.551944,1513 +alps_10141,MONTE BELPO,,45.616111,10.760000,880 +alps_10142,MONTE CASTELCUCCO,,45.678889,10.868333,1187 +alps_10143,CORNO D'AQUIGLIO,,45.671389,10.943056,1545 +alps_10144,MONTE CORNETTO,,45.678056,10.968056,1545 +alps_10145,MONTE PEZZEDA,,45.788056,10.343611,1799 +alps_10146,MONTE FRONDINE,,45.780556,10.346944,1791 +alps_10147,CORNA BLACCA,,45.791389,10.380556,2005 +alps_10148,CIMA MEGHE,,45.785000,10.444167,1803 +alps_10149,CORNA ZENO,,45.768889,10.447778,1619 +alps_10150,MONTE CINGLA,,45.785556,10.566667,1669 +alps_10151,CIME DEL COSTONE,,45.789444,10.661944,1743 +alps_10152,CIMA GUSAUR,,45.765833,10.628333,1421 +alps_10153,MONTE STINO,,45.766944,10.550833,1467 +alps_10154,MONTE MANOS,,45.736944,10.538611,1517 +alps_10155,MONTE CARZEN,,45.734722,10.563056,1507 +alps_10156,MONTE ALBERELLI,,45.700556,10.586111,1166 +alps_10157,MONTE PRACALVIS,,45.701389,10.571667,1164 +alps_10158,MONTE ZINGLA,,45.703889,10.538333,1496 +alps_10159,CIMA DI TIGNALGA,,45.783889,10.694167,1411 +alps_10160,CIMA DI MUGHERA,,45.766944,10.670278,1344 +alps_10161,DOSSO PIEMP,,45.753056,10.710000,1207 +alps_10162,PUNTA TELEGRAFO,,45.706111,10.830556,2200 +alps_10163,MONTE DENERVO,,45.724722,10.666667,1463 +alps_10164,PUNTA PETTORINA,,45.711667,10.839444,2192 +alps_10165,CIMA VALDRITTA,,45.726389,10.843889,2218 +alps_10166,CIMA DEL LONGINO,,45.734444,10.849444,2179 +alps_10167,CIMA DELLE POZZETTE,,45.741667,10.854444,2132 +alps_10168,CORNA PIANA,,45.792500,10.899167,1736 +alps_10169,MONTE VIGNOLA,,45.770556,10.968889,1607 +alps_10170,COLME DI PRAVECCHIO,,45.766667,10.928056,1540 +alps_10171,PUNTA DELLA REDUTTE,,45.716667,10.873333,1618 +alps_10172,MONTE CORNET,,45.875000,10.046389,1429 +alps_10173,PUNTA VALLEVRINA,,45.881944,10.056944,1401 +alps_10174,MONTE PORA,,45.885278,10.109444,1880 +alps_10175,MONTE ALTO,,45.867500,10.089722,1723 +alps_10176,MONTE VALTERO,,45.850556,10.056111,1459 +alps_10177,MONTE TORRIONE,,45.853333,10.036111,1312 +alps_10178,MONTE CUCA,,45.855278,10.019167,1110 +alps_10179,DOSSO CAMUSSONE,,45.801667,10.151667,1433 +alps_10180,DOSSO BLUSSEGA,,45.869722,10.232222,1811 +alps_10181,DOSSO DEL GIUSTADIR,,45.874167,10.262778,1745 +alps_10182,DOSSO BETTI,,45.866389,10.320556,2144 +alps_10183,PUNTA DEL'ARCIFRETE,,45.875278,10.313611,2073 +alps_10184,MONTE FRA,,45.868056,10.294722,2158 +alps_10185,MONTE COLOMBINO,,45.858611,10.310000,2135 +alps_10186,MONTE CRESTOSO,,45.854167,10.310556,2207 +alps_10187,MONTE ROSELLO,,45.845556,10.270556,2025 +alps_10188,MONTE MUFFETTO,,45.833056,10.248889,2060 +alps_10189,MONTE SPLAZA,,45.828889,10.226111,1825 +alps_10190,DOSSO ROTONDO,,45.820833,10.224444,1820 +alps_10191,COLMA DI MARUCOLO,,45.808333,10.211111,1856 +alps_10192,MONTE SAN GALLO,,45.885000,10.367500,2055 +alps_10193,DOSSO DELLA FIORA,,45.870000,10.357778,2140 +alps_10194,PUNTA DELL'AUCCIA,,45.864722,10.375278,2212 +alps_10195,MONTE MIGNOLINO,,45.877778,10.393611,2203 +alps_10196,DOSSO POZZAROTONDA,,45.876389,10.411389,2215 +alps_10197,MONTE MIGNOLO,,45.888611,10.413333,2111 +alps_10198,MONTE BAGOLIGOLO,,45.866667,10.428333,2131 +alps_10199,COSTONE DOLO,,45.876111,10.483333,2193 +alps_10200,COSTONE DELLE CORNELLE,,45.881389,10.493611,2201 +alps_10201,PUNTA SETTEVENTI,,45.860278,10.392778,2250 +alps_10202,MONTE COLOMBINE,,45.847500,10.356111,2214 +alps_10203,MONTE DASDANA,,45.844444,10.363611,2195 +alps_10204,DOSSO DEI GALLI,,45.854167,10.375278,2190 +alps_10205,MONTE CARENA,,45.845556,10.480000,1955 +alps_10206,MONTE BREDA,,45.802500,10.478611,1503 +alps_10207,DOSSO ALTO,,45.813333,10.416944,2064 +alps_10208,DOS DI LAVEN,,45.895278,10.559444,1885 +alps_10209,CIMA BOREI,,45.879722,10.635556,1586 +alps_10210,MONTE STIGOLO,,45.865833,10.611111,1699 +alps_10211,ROCCA PAGANA,,45.860278,10.598611,1668 +alps_10212,COLMA DI DALGUEN,,45.893333,10.627222,1430 +alps_10213,DOSSO DO PORTOLE,,45.881389,10.502222,2120 +alps_10214,DOSSO DELLA CROCE,,45.871111,10.526667,1871 +alps_10215,CIMA SPESSA,,45.821389,10.589167,1816 +alps_10216,PIANO DI BRAGONE,,45.832222,10.628333,1647 +alps_10217,CIMA AVEZ,,45.833056,10.653889,1895 +alps_10218,DOSSO DELLA FAME,,45.822500,10.657500,1802 +alps_10219,CIMA DEL FRATONE,,45.818889,10.651111,1795 +alps_10220,CIMA TOMBEA,,45.806111,10.628333,1950 +alps_10221,MONTE CAPLONE,,45.802222,10.641111,1976 +alps_10222,DOS DA FA,,45.806389,10.589444,1513 +alps_10223,CIMA CASET,,45.868889,10.703056,1776 +alps_10224,CIMA VALDES,,45.883889,10.807778,1578 +alps_10225,CIMA D'ORO,,45.889722,10.789722,1802 +alps_10226,COL PASOVRI,,45.856389,10.672500,1673 +alps_10227,CORNO SPEXXATO,,45.851389,10.689722,1858 +alps_10228,MONTE TREMALZO,,45.841944,10.699444,1974 +alps_10229,CORNO DELLA MAROGNA,,45.836667,10.706667,1953 +alps_10230,CIMA DEL DIL,,45.832222,10.680833,1808 +alps_10231,MONTE CARONE,,45.843611,10.779722,1621 +alps_10232,CIMA DELLA NARA,,45.844444,10.804722,1376 +alps_10233,MONTE TRAVERSOLE,,45.830278,10.756111,1446 +alps_10234,CORNA VECCHIA,,45.823056,10.754167,1415 +alps_10235,CORNO NERO,,45.818056,10.755556,1402 +alps_10236,MONTE ZENONE,,45.802778,10.713333,1424 +alps_10237,CIMA DELLE SCLAPE,,45.822500,10.716944,1538 +alps_10238,MONTE CREINO,,45.886111,10.929444,1292 +alps_10239,MONTE BIAENA,,45.882778,10.970556,1618 +alps_10240,MONTE VARAGNA,,45.825833,10.894722,1780 +alps_10241,MONTE ALTISSIMO DI NAGO,,45.810278,10.888889,2079 +alps_10242,MONTE VIGNA VAGA,,45.988333,10.012778,2332 +alps_10243,PIZZO DI PETTO,,45.992500,10.021111,2270 +alps_10244,MONTE FERRANTE,,45.974722,10.028611,2427 +alps_10245,PIZZO DELLA PRESOLANA,,45.956667,10.055278,2521 +alps_10246,MONTE VISOLO,,45.956111,10.070556,2490 +alps_10247,CORNA MOZZA,,45.953611,10.118889,1429 +alps_10248,MONTE CORNETTO,,45.936667,10.052222,1786 +alps_10249,MONTE GHIGOZZO,,45.929167,10.141944,1599 +alps_10250,MONTE SCANAPA,,45.923056,10.090556,1669 +alps_10251,MONTE VALSACCO,,45.929444,10.013333,1772 +alps_10252,PIZZO CAMINO,,45.981667,10.177500,2491 +alps_10253,CIMA MOREN,,45.975556,10.177222,2418 +alps_10254,CORNA DI SAN FERMO,,45.970000,10.167778,2329 +alps_10255,MONTE MIGNONE,,45.974444,10.220278,1743 +alps_10256,CORNA ROSSA,,45.926389,10.191111,1541 +alps_10257,MONTE ALTISSIMO,,45.914167,10.173333,1703 +alps_10258,MONTE ERBANNO,,45.918611,10.185556,1663 +alps_10259,MONTE BODRELLO,,45.898889,10.296111,1724 +alps_10260,MONTE SUSINO,,45.990556,10.186667,2398 +alps_10261,CORNO DI CADINELLO,,45.973056,10.381111,2191 +alps_10262,MONTE MEZZULLO,,45.969722,10.383611,2304 +alps_10263,MONTE FERONE,,45.961667,10.389167,2409 +alps_10264,MONTE STABIO,,45.953889,10.405556,2536 +alps_10265,MONTE FRERONE,,45.946111,10.413611,2673 +alps_10266,MONTE CADINO,,45.935278,10.415278,2420 +alps_10267,CIMA DEL VALLONE,,45.974444,10.404167,2112 +alps_10268,CORNO DELLA VACCA,,45.980278,10.396389,1815 +alps_10269,MONTE ROSSOLA,,45.998056,10.456389,2721 +alps_10270,MONTE MONOCCOLA,,45.990833,10.453056,2681 +alps_10271,MONTE LISTINO,,45.976944,10.453056,2750 +alps_10272,CIMA LAIONE,,45.965556,10.451389,2757 +alps_10273,CIMA TERRE FREDDE,,45.956667,10.429444,2645 +alps_10274,CORNONE DI BLUMONE,,45.954722,10.455833,2842 +alps_10275,MONTE BRUFFIONE,,45.942222,10.491389,2664 +alps_10276,CIMA COPPETTA,,45.951389,10.482778,2508 +alps_10277,MONTE SEROSINE,,45.966944,10.488611,2577 +alps_10278,MONTE DEL GELO,,45.971944,10.488056,2621 +alps_10279,CIMA DI BOAZZOLO,,45.981111,10.498611,2561 +alps_10280,CIMA RONDO,,45.979167,10.496111,2591 +alps_10281,CIMA DI BLUMONE,,45.972500,10.474444,2565 +alps_10282,MONTE ALTA GUARDIA,,45.943056,10.365000,2226 +alps_10283,MONTE TRABUCCO,,45.927222,10.378889,2228 +alps_10284,COSTONE DI VAL BONA,,45.936389,10.394167,2415 +alps_10285,MONTE COLOMBINE,,45.925278,10.438889,2151 +alps_10286,MONTE BOIA,,45.932778,10.491389,2582 +alps_10287,MONTE MISA,,45.901111,10.444167,2184 +alps_10288,MONTE GERA,,45.900833,10.421667,2034 +alps_10289,PUNTA DELLA ECIA,,45.924167,10.489722,2368 +alps_10290,MONTE MANDRE VAIMANE,,45.920556,10.474167,2150 +alps_10291,PUNTA DEL VALDI,,45.914444,10.474722,2144 +alps_10292,MONTE BAZENA,,45.912778,10.403889,2113 +alps_10293,MONTE PALETTI,,45.918889,10.405833,2147 +alps_10294,MONTE ASINO DI BAZENINA,,45.914722,10.417778,2241 +alps_10295,MONTE MATTONI,,45.925833,10.411944,2271 +alps_10296,MONTE CROCE DOMINI,,45.900000,10.406111,2055 +alps_10297,MONTE FLES,,45.909444,10.343333,1705 +alps_10298,MONTE CORONA,,45.998611,10.588333,2508 +alps_10299,CORNO VECCHIO,,45.985556,10.587778,2326 +alps_10300,DOSSO DEI MORTI,,45.974722,10.605833,2183 +alps_10301,MONTE LAVANECH,,45.951389,10.543333,2229 +alps_10302,MONTE SEDOLE,,45.960833,10.514722,2250 +alps_10303,I BONDOLO,,45.928056,10.498889,2464 +alps_10304,CIMA DI BONDOLO,,45.925278,10.507222,2384 +alps_10305,MONTE PIETRA DI RASOIO,,45.915556,10.510556,2242 +alps_10306,MONTE BREALONE,,45.910000,10.506667,2267 +alps_10307,GROTTA ROSSA,,45.904167,10.525556,2192 +alps_10308,MONTE TANARONE,,45.916667,10.540278,2172 +alps_10309,CIMA CLEVET,,45.923611,10.550833,2147 +alps_10310,CIMA MARESE,,45.929444,10.559722,2102 +alps_10311,CIMA PISSOLA,,45.933611,10.566944,2063 +alps_10312,CINGOLO ROSSO,,45.924167,10.533056,2182 +alps_10313,MONTE REMA,,45.940000,10.519167,2375 +alps_10314,MONTE MELINO,,45.926389,10.607222,1422 +alps_10315,CIMA PALONE,,45.911111,10.651667,1641 +alps_10316,CIMA ANGLI,,45.904722,10.644167,1539 +alps_10317,CIMA BUSMA,,45.974167,10.692500,1705 +alps_10318,MONTE MAIMA,,45.974444,10.698889,1764 +alps_10319,CIMA DI VALLE CARNERA,,45.994722,10.731667,2022 +alps_10320,CIMA PALA,,45.996111,10.750833,2005 +alps_10321,MONTE ALTISSIMO,,45.987778,10.748056,2128 +alps_10322,RODOLA,,45.978611,10.748056,2027 +alps_10323,GAVERDINA,,45.970278,10.751389,2047 +alps_10324,DOSSO DELLA TORTA,,45.966667,10.763889,2156 +alps_10325,DOSSO D'ENZIANA,,45.973056,10.785000,1973 +alps_10326,COGORNA,,45.978611,10.797222,1866 +alps_10327,TOFINO,,45.948333,10.772500,2151 +alps_10328,CORNO DI PICHEA,,45.942500,10.769444,2138 +alps_10329,CORNO DEI GIU,,45.964444,10.729444,2052 +alps_10330,ROCCA CAMPEI,,45.959722,10.721111,2063 +alps_10331,LA RODA,,45.953889,10.710000,2169 +alps_10332,MONTE CADRIA,,45.938611,10.698056,2254 +alps_10333,MONTE CAMPELLET,,45.929444,10.682778,2029 +alps_10334,DOSSO DI SEAO,,45.918889,10.767778,1799 +alps_10335,CIMA PARI,,45.906111,10.766111,1988 +alps_10336,MONTE VIES,,45.920278,10.704167,1699 +alps_10337,MONTE BRENTO,,45.987500,10.897778,1545 +alps_10338,MONTE BIAINA,,45.955278,10.870833,1413 +alps_10339,MONTE MISONE,,45.955278,10.833333,1803 +alps_10340,PALON,,45.941667,10.988056,1916 +alps_10341,CIMA ALTA,,45.936111,10.984444,1847 +alps_10342,MONTE STIVO,,45.920556,10.963611,2059 +alps_10343,MONTE TOMBA,,45.692778,11.057778,1766 +alps_10344,MONTE SCRICCIO,,45.676944,11.005833,1547 +alps_10345,CIMA TRAPPOLA,,45.693333,11.108611,1865 +alps_10346,CASTELMALERA,,45.685000,11.101111,1772 +alps_10347,MONTE GROLLA,,45.674167,11.105833,1659 +alps_10348,MONTE ZEVOLA,,45.688889,11.143056,1987 +alps_10349,MONTE GRAMOLON,,45.681944,11.160556,1884 +alps_10350,MONTE TERRAZZO,,45.682778,11.138056,1876 +alps_10351,CIMA DI LOBBIA,,45.662778,11.152500,1672 +alps_10352,CIMA DEL MESOLE,,45.675556,11.174444,1672 +alps_10353,CIMA CAMPO D'AVANT,,45.675556,11.186111,1691 +alps_10354,MONTE CAMPETTO,,45.669722,11.202778,1662 +alps_10355,CIMA DI MARANA,,45.657778,11.219444,1545 +alps_10356,SELVATA,,45.786389,11.071389,1708 +alps_10357,CIMA MEZZANA,,45.771111,11.085000,1643 +alps_10358,MONTE JOCOLLE,,45.756389,11.099167,1875 +alps_10359,LORA,,45.791667,11.159444,2032 +alps_10360,CIMA LEVANTE,,45.743889,11.094722,2020 +alps_10361,PALA DI CHERLE,,45.737778,11.103611,1980 +alps_10362,CIMA POSTA,,45.723889,11.129722,2259 +alps_10363,CIMA MOSCA,,45.723611,11.139167,2141 +alps_10364,MONTE PLISCE,,45.701944,11.136111,1991 +alps_10365,MONTE SPARAVIERI,,45.710556,11.063889,1797 +alps_10366,MONTE CASTELBERTO,,45.718611,11.017222,1765 +alps_10367,L'AGUZ,,45.722500,11.044444,1603 +alps_10368,MONTE ZENEVRI,,45.796667,11.190000,2141 +alps_10369,CIMA PALON,,45.792222,11.176389,2232 +alps_10370,FORNI ALTI,,45.781944,11.205556,2023 +alps_10371,PUNTA FAVELLA,,45.770833,11.178889,1834 +alps_10372,MONTE RIONE,,45.770833,11.299167,1691 +alps_10373,MONTE CORNETTO,,45.746944,11.176111,1899 +alps_10374,MONTE BAFFELAN,,45.736667,11.177778,1793 +alps_10375,COL SANTO,,45.833056,11.150556,2112 +alps_10376,COL SANTINO,,45.826389,11.161667,2122 +alps_10377,ROITE,,45.809167,11.160556,2144 +alps_10378,MONTE TESTO,,45.818889,11.138611,1998 +alps_10379,MONTE CORNO BATTISTI,,45.810000,11.124167,1760 +alps_10380,MONTE ZUGNA,,45.799722,11.068333,1884 +alps_10381,MARTINELLA,,45.887222,11.178889,1620 +alps_10382,DOSSO DEL SOMMO,,45.880000,11.188333,1670 +alps_10383,SOMMO ALTO,,45.886944,11.200556,1648 +alps_10384,MONTE MARONIA,,45.870278,11.212500,1705 +alps_10385,COSTA D'AGRA,,45.878333,11.241389,1820 +alps_10386,MONTE DI CAMPOLUZZO,,45.869167,11.249167,1775 +alps_10387,CIMA VALBONA,,45.870278,11.271667,1864 +alps_10388,MONTE CAMPOMOLON,,45.873056,11.284722,1853 +alps_10389,SPITZ TONEZZA,,45.875000,11.319167,1694 +alps_10390,COSTON DEI LAGHI,,45.841389,11.218611,1880 +alps_10391,MONTE BUSO,,45.817778,11.171667,2080 +alps_10392,MONTE TORARO,,45.862500,11.269167,1897 +alps_10393,CIMA DI CAMPOLONGO,,45.888611,11.387778,1720 +alps_10394,MONTE CIMONE,,45.821667,11.347222,1226 +alps_10395,CIMA FONTI,,45.807778,11.494444,1518 +alps_10396,CIMA DEL GALLO,,45.804722,11.446111,1417 +alps_10397,MONTE CENGIO,,45.811111,11.394722,1354 +alps_10398,MONTE GUSELLA,,45.823889,11.553611,1388 +alps_10399,MONTE BERTIAGA,,45.822500,11.578889,1356 +alps_10400,CIMA VERDE,,45.995833,11.044722,2102 +alps_10401,DOSSO D'ABRAMO,,45.989722,11.037500,2140 +alps_10402,CORNETTO,,45.988056,11.031389,2180 +alps_10403,MONTE FINONCHIO,,45.900278,11.116389,1603 +alps_10404,CAMPIGOLET,,45.972778,11.168056,2028 +alps_10405,BECCO DI FILADONNA,,45.963889,11.193333,2150 +alps_10406,TERZA CIMA,,45.952500,11.182500,2027 +alps_10407,CORNETTO,,45.942500,11.185833,2060 +alps_10408,MONTE CUCCO,,45.949444,11.320556,1582 +alps_10409,CIMA DODICI,,45.997500,11.468056,2336 +alps_10410,MONTE TRENTIN,,45.988889,11.457222,2325 +alps_10411,CIMA PORTULE,,45.978611,11.446667,2308 +alps_10412,CIMA LARICI,,45.980278,11.422778,2033 +alps_10413,CIMA DI VEZZENA,,45.979167,11.342500,1908 +alps_10414,CIMA MANDERIOLO,,45.983889,11.375833,2049 +alps_10415,MONTE VERENA,,45.931111,11.413611,2015 +alps_10416,MONTE CHIESA,,45.991667,11.501389,2061 +alps_10417,SPITZ KESERLE,,45.977222,11.540556,1786 +alps_10418,COLLE DEI MENEGHINI,,45.971111,11.643611,1601 +alps_10419,MONTE LISSER,,45.944722,11.662778,1633 +alps_10420,MONTE ZINGARELLA,,45.954167,11.502500,1901 +alps_10421,MONTE COLOMBARA,,45.948056,11.520556,1828 +alps_10422,MONTE FIARETTA,,45.949444,11.545556,1787 +alps_10423,MONTE FIOR,,45.916389,11.599722,1824 +alps_10424,FOPPONE,,46.068889,9.668056,2304 +alps_10425,MONTE TARTANO,,46.061111,9.668611,2292 +alps_10426,PIZZO DEL VALLONE,,46.059167,9.687500,2249 +alps_10427,PIZZO ROTONDO,,46.051944,9.686389,2237 +alps_10428,CIMA DI LEMMA,,46.062500,9.708611,2348 +alps_10429,PIZZO SCALA,,46.068333,9.702222,2427 +alps_10430,MONTE MORO,,46.072500,9.696389,2277 +alps_10431,DOSSO TACHER,,46.085556,9.686389,2093 +alps_10432,MONTE GAVET,,46.077500,9.694722,2318 +alps_10433,MONTE VALEGINO,,46.056667,9.737500,2415 +alps_10434,PASSO DI PORCILE,,46.058611,9.738056,2290 +alps_10435,MONTE CADELLE,,46.063056,9.745833,2483 +alps_10436,MONTE ARELE,,46.049722,9.736667,2227 +alps_10437,CIMA VALLOCCI,,46.078333,9.744444,2510 +alps_10438,CIMA CAMPELLO,,46.097500,9.777778,2248 +alps_10439,CIMA VITALENGO,,46.078611,9.782222,2414 +alps_10440,SPONDA CAMOSCERA,,46.072222,9.781111,2452 +alps_10441,MONTE TORO,,46.059722,9.780833,2524 +alps_10442,CORNO STELLA,,46.053889,9.806944,2621 +alps_10443,MONTE VALGUSSERA,,46.039167,9.773333,2183 +alps_10444,PIZZO DEL VESCOVO,,46.032500,9.765278,2175 +alps_10445,PIZZO ZERNA,,46.048611,9.830556,2572 +alps_10446,MONTE CHIERICO,,46.045000,9.808611,2535 +alps_10447,CIMA SASSO CHIARO,,46.090556,9.812500,2395 +alps_10448,CIMA TONALE,,46.068333,9.809444,2544 +alps_10449,CIMA DEI SILTRI,,46.041944,9.686389,2175 +alps_10450,MONTE CAVALLO,,46.034722,9.690556,2323 +alps_10451,PIZZO CAVALLINO,,46.027778,9.699722,2284 +alps_10452,MONTE PEGHEROLO,,46.024722,9.713333,2369 +alps_10453,MONTE SECCO,,46.015278,9.720556,2293 +alps_10454,PIZZO DEL BECCO,,46.004722,9.815556,2507 +alps_10455,PIZZO VACCA,,46.007222,9.778056,1914 +alps_10456,PUNTA CERECH,,46.080278,9.810000,2412 +alps_10457,PIZZO CAMPAGGIO,,46.092778,9.854444,2502 +alps_10458,CIMA BIORCHE,,46.083611,9.850556,2456 +alps_10459,CIME DELLE SCOLTADOR,,46.057222,9.846111,2573 +alps_10460,MONTE MASONI,,46.044167,9.837500,2663 +alps_10461,PIZZO DI CIGOLA,,46.051111,9.871667,2632 +alps_10462,MONTE AGA,,46.046944,9.880556,2720 +alps_10463,PIZZO DEL DIAVOLO,,46.045278,9.908056,2916 +alps_10464,PIZZO DELL'OMO,,46.052222,9.906667,2773 +alps_10465,PIZZO DEL SALTO,,46.057222,9.909167,2665 +alps_10466,CIMA SOLIVA,,46.066944,9.940000,2710 +alps_10467,PIZZO CERIC,,46.068889,9.907500,2536 +alps_10468,MONTE MOTTA,,46.082222,9.906111,2410 +alps_10469,PIZZO DI RODES,,46.095556,9.960278,2829 +alps_10470,PIZZO BIORCO,,46.088611,9.971389,2749 +alps_10471,PIZZO DI SCOTES,,46.080000,9.979722,2978 +alps_10472,CIMA DI CARONNO,,46.073889,9.983889,2945 +alps_10473,PIZZO DI REDORTA,,46.061944,9.984444,3038 +alps_10474,PIZZO DI SCAIS,,46.068611,9.984722,3038 +alps_10475,PIZZO BRUNONE,,46.069722,9.967222,2724 +alps_10476,MONTE GRABIASCA,,46.034167,9.905278,2705 +alps_10477,PIZZO PORIS,,46.036944,9.910556,2712 +alps_10478,PIZZO TENDINA,,46.040000,9.927222,2248 +alps_10479,MONTE MADONNINO,,46.011667,9.886111,2502 +alps_10480,MONTE CABIANCA,,46.010278,9.867500,2601 +alps_10481,PIZZO DELLA CORNA,,46.010000,9.989444,2352 +alps_10482,MONTE VIGNA SOLIVA,,46.006944,9.987222,2356 +alps_10483,MONTE CALVERA,,46.003056,9.981944,2301 +alps_10484,MONTE ROLLA,,46.199167,9.822222,2277 +alps_10485,CIMA DELLA ZOCCA,,46.128611,9.701667,2166 +alps_10486,PIZZO DI PRESIO,,46.115278,9.723611,2391 +alps_10487,MONTE SELERON,,46.100000,9.728333,2519 +alps_10488,PIZZO GERLO,,46.103889,9.722222,2470 +alps_10489,MONTE VESPOLO,,46.111944,9.807222,2385 +alps_10490,MONTE PIZZINVERSA,,46.102500,9.810278,2419 +alps_10491,PIZZOLUNGO,,46.108611,9.772222,2226 +alps_10492,PUNTA SAN STEFANO,,46.102500,9.965000,2693 +alps_10493,PUNTA DELLA PESSA,,46.106389,9.933611,2470 +alps_10494,PIZZO MERIGGIO,,46.104722,9.867222,2358 +alps_10495,PIZZO DI COCA,,46.071667,10.011389,3050 +alps_10496,CIME DEL DRUET,,46.087222,10.028611,2913 +alps_10497,PIZZO DEL DIAVOLO,,46.085000,10.046389,2926 +alps_10498,PIZZO DI CAVREL,,46.076944,10.048056,2824 +alps_10499,CIME DI CARONELLA,,46.090278,10.089722,2871 +alps_10500,MONTE TORENA,,46.088611,10.102778,2911 +alps_10501,CIMA TROBE,,46.060000,10.092778,2865 +alps_10502,MONTE GLENO,,46.054444,10.093056,2882 +alps_10503,PIZZO TRE CONFINI,,46.050556,10.084167,2824 +alps_10504,MONTE CIMONE,,46.043611,10.056389,2530 +alps_10505,PIZZO STRINATO,,46.070000,10.092500,2835 +alps_10506,MONTE DEMIGNONE,,46.061944,10.133333,2584 +alps_10507,MONTE BOGNAVISO,,46.044167,10.149444,2287 +alps_10508,PIZZO RECASTELLO,,46.056944,10.075556,2886 +alps_10509,PIZZO TORNELLO,,46.036389,10.112222,2687 +alps_10510,MONTE POMNOL,,46.040556,10.046667,2257 +alps_10511,MONTE TORNONE,,46.030000,10.113333,2577 +alps_10512,PIZZO PIANEZZA,,46.015000,10.086389,2046 +alps_10513,MONTE SASNA,,46.020000,10.050833,2229 +alps_10514,MONTE TOAZZO,,46.028333,10.025278,1814 +alps_10515,PIZZO DELLA MANINA,,46.013056,10.023889,1821 +alps_10516,MONTE BARBAROSSA,,45.999444,10.018889,2148 +alps_10517,MONTE TELENEK,,46.092500,10.178889,2754 +alps_10518,MONTE SELLERO,,46.081111,10.184722,2744 +alps_10519,MONTE CULVEGLA,,46.081944,10.208056,2618 +alps_10520,MONTE COLOMBARO,,46.071944,10.175556,2687 +alps_10521,MONTE VENEROCOLO,,46.057222,10.168889,2590 +alps_10522,MONTE LARGONE,,46.070000,10.213056,2449 +alps_10523,MONTE TORSOLETO,,46.090833,10.226667,2708 +alps_10524,MONTE ELTO,,46.055833,10.298611,2148 +alps_10525,MONTE CUEL,,46.045000,10.264444,2190 +alps_10526,MONTE CAMPIONE,,46.036111,10.250278,2174 +alps_10527,MONTE GAVIERA,,46.063333,10.219722,2293 +alps_10528,MONTE PERTECATA,,46.045833,10.205556,2270 +alps_10529,MONTE GARDENA,,46.037222,10.229722,2117 +alps_10530,MONTE VACCIO,,46.004167,10.285833,2338 +alps_10531,CIMA DELLA BACCHETTA,,46.010833,10.280000,2549 +alps_10532,CIMA DEI LADRINAI,,46.015833,10.280000,2403 +alps_10533,CIMA MENGOL,,46.016111,10.257778,2421 +alps_10534,CIMONE DELLA BAGOZZA,,46.011667,10.250556,2407 +alps_10535,MONTE BUSMA,,46.030000,10.185278,2135 +alps_10536,MONTE GAFFIONE,,46.025556,10.170000,2035 +alps_10537,I COLLI,,46.031944,10.201389,2135 +alps_10538,MONTE BLISIE,,46.088056,10.454167,2470 +alps_10539,CIMA DI BOAZZO,,46.088333,10.464444,2557 +alps_10540,CORNO DI LENDENO,,46.096389,10.479444,2826 +alps_10541,MONTE CAMPELLIO,,46.051389,10.477222,2809 +alps_10542,CIMA D'AVOLO,,46.055278,10.489722,2637 +alps_10543,MONTE ZUCCHELLO,,46.052778,10.437222,2123 +alps_10544,CIMA BARBIGNAGA,,46.048056,10.404722,2367 +alps_10545,CIMA SABLUNERA,,46.030833,10.421667,2602 +alps_10546,MONTE FRISOZZO,,46.024444,10.448611,2897 +alps_10547,CIMA DEL DOSSO,,46.022222,10.440556,2795 +alps_10548,CORNO DELLE PILE,,46.017222,10.437500,2810 +alps_10549,CIMA BECANT,,46.010833,10.430833,2615 +alps_10550,MONTE RE DI CASTELLO,,46.021667,10.483333,2889 +alps_10551,CIMA DERNAL,,46.021667,10.472222,2826 +alps_10552,CIMA GELLINO,,46.017778,10.464722,2772 +alps_10553,CIMA ROSSOLA,,46.009722,10.457778,2735 +alps_10554,CORNO CRAPER,,46.009167,10.426389,2552 +alps_10555,CIMA LARGA,,46.006667,10.489167,2334 +alps_10556,CORNO DI GREVO,,46.078056,10.512500,2867 +alps_10557,MONTE FOPPA,,46.072500,10.501667,2761 +alps_10558,CIMA LESENA,,46.088333,10.520833,2851 +alps_10559,CRESTA DI SAN VALENTINO,,46.086944,10.592222,2942 +alps_10560,CIMA COP DI CASA,,46.068611,10.584722,2964 +alps_10561,CIMA COP DI BREGUZZO,,46.061944,10.573889,3001 +alps_10562,CIMA DI DANERBA,,46.046944,10.565278,2910 +alps_10563,CIMA BISSINI,,46.046667,10.555278,2882 +alps_10564,CIMA LATOLA,,46.041111,10.545000,2832 +alps_10565,CORNA GUZZA,,46.097500,10.638889,2525 +alps_10566,CORNO VECCHIO,,46.091667,10.610556,2763 +alps_10567,CREPER DI STRACCHIOLA,,46.061944,10.621944,2708 +alps_10568,MONTE CAMPO ANTICO,,46.040833,10.665000,2138 +alps_10569,CIMA VAL AGOSTA,,46.035278,10.602500,2582 +alps_10570,CREPER VAC,,46.040556,10.583333,2818 +alps_10571,CIMA D'ARNO,,46.041389,10.571111,2846 +alps_10572,CIMA DI LAGHISOL,,46.031389,10.571389,2804 +alps_10573,CIMA DI VALBONA,,46.024167,10.571111,2887 +alps_10574,GRAPER DI STABOLONE,,46.009722,10.545556,2501 +alps_10575,CIMA QUADRA,,46.038056,10.609167,2430 +alps_10576,MONTE BENNA,,46.007778,10.627222,2249 +alps_10577,CIMA DURMONT,,46.084167,10.760278,1835 +alps_10578,MONTE IRON,,46.077222,10.789722,1865 +alps_10579,MONTE AMOLO,,46.054722,10.738611,1334 +alps_10580,CIMA SERA,,46.023056,10.789167,1909 +alps_10581,MONTE SAN MARTINO,,46.038056,10.808889,1450 +alps_10582,CIMON DEI ORTI,,46.005000,10.766389,1942 +alps_10583,MONTE SOLVIA,,46.003611,10.758333,1983 +alps_10584,MONTE CASALE,,46.031389,10.927500,1632 +alps_10585,GRANZOLINE,,46.004167,10.911111,1549 +alps_10586,MONTE LAVAZZA,,46.116111,10.106389,2410 +alps_10587,CIMA FRAITINA,,46.101944,10.103611,2578 +alps_10588,MONTE PADRIO,,46.186667,10.227222,2152 +alps_10589,DOSSO TORRIOLA,,46.195833,10.312222,1838 +alps_10590,MONTE PALABIONE,,46.128056,10.170000,2361 +alps_10591,MONTE PALONE,,46.125000,10.260556,2530 +alps_10592,MONTE PALONE DEL SOPRESSA,,46.114444,10.255833,2583 +alps_10593,MONTE PALOMO DEL TORSOLAZZO,,46.100278,10.244722,2670 +alps_10594,PIZ TRI,,46.139722,10.277778,2308 +alps_10595,MONTE TORSOLAZZO,,46.103056,10.172778,2610 +alps_10596,CIMA CADIN,,46.110000,10.167778,2575 +alps_10597,DOSSO PASO,,46.118889,10.165556,2575 +alps_10598,MONTEAVIOLO,,46.185278,10.398611,2881 +alps_10599,CIMA OLE LARGHE,,46.195556,10.441667,3003 +alps_10600,CORNO GIUELLO,,46.186111,10.440556,2999 +alps_10601,CIMA AVEDOLE,,46.179444,10.443611,3074 +alps_10602,CORNO BAITONE,,46.173056,10.441111,3330 +alps_10603,PUNTA NINO CALVI,,46.185278,10.496389,2909 +alps_10604,MONTE ADAMELLO,,46.155833,10.496111,3539 +alps_10605,CORNO MILLER,,46.143333,10.493333,3373 +alps_10606,CIMA PLEM,,46.151389,10.462778,3182 +alps_10607,CORNO DEL CRISTALLO,,46.145278,10.453611,2988 +alps_10608,CORNO DEL LAGO,,46.142222,10.442778,2776 +alps_10609,CORNO DELLE GRANITE,,46.158056,10.422778,3162 +alps_10610,MONTE BOMBIANO,,46.147500,10.416111,2855 +alps_10611,PUNTA DELLA VAL ROSSA,,46.140833,10.415556,2743 +alps_10612,CORNO PREMASSONE,,46.161667,10.452500,3060 +alps_10613,CORNO REMULO,,46.132222,10.484444,2980 +alps_10614,CIMA PRUDENZINI,,46.128333,10.482222,3018 +alps_10615,CORNO DI MACESSO,,46.124722,10.476389,2958 +alps_10616,CORNI DI CEVO,,46.120000,10.451944,2750 +alps_10617,CIMA DEL COPPO,,46.113611,10.439722,2771 +alps_10618,MONTE MARSER,,46.111389,10.429444,2776 +alps_10619,PIAN DELLA REGINA,,46.110833,10.405000,2628 +alps_10620,CIMA DEL COPPETTO,,46.112222,10.413056,2639 +alps_10621,PIZ DI OLDA,,46.111389,10.390278,2515 +alps_10622,DOSSO TONDO,,46.104167,10.467222,2367 +alps_10623,MONTE AVIO,,46.199167,10.442778,2940 +alps_10624,LA CALOTTA,,46.196667,10.511944,3211 +alps_10625,MONTE DEI FRATI,,46.188611,10.512778,3290 +alps_10626,PUNTA DEL VENEROCOLO,,46.182500,10.519167,3323 +alps_10627,CIMA GARIBALDI,,46.173333,10.514722,3237 +alps_10628,CORNO BIANCO,,46.160833,10.516389,3434 +alps_10629,MONTE FALCONE,,46.156667,10.503611,3456 +alps_10630,MONTE VENEZIA,,46.184167,10.530556,3290 +alps_10631,MONTE MANDRONE,,46.188056,10.537778,3294 +alps_10632,CORNO DI BEDOLA,,46.191944,10.543333,3227 +alps_10633,LOBBIA ALTA,,46.170556,10.567500,3196 +alps_10634,LOBBIA DI MEZZO,,46.179722,10.571111,3036 +alps_10635,MONTE MENECIGOLO,,46.185833,10.606944,2686 +alps_10636,MONTE STABEL,,46.177222,10.603611,2869 +alps_10637,AGO MINGO,,46.174722,10.599722,2968 +alps_10638,CROZZON DI FOLGORIDO,,46.167778,10.595833,3079 +alps_10639,CIMON DELLE GERE,,46.190000,10.664444,3015 +alps_10640,CROZZON DEL DIAVOLO,,46.150000,10.609167,3019 +alps_10641,CROZZON DI LARES,,46.148333,10.591944,3354 +alps_10642,CORNO DI CAVENTO,,46.135278,10.585833,3406 +alps_10643,MONTE FOLLETTO,,46.123056,10.588333,3334 +alps_10644,CRESTA DELLA CROCE,,46.161389,10.558611,3313 +alps_10645,CORNO DI SALARNO,,46.144722,10.506944,3298 +alps_10646,CORNETTO DI SALARNO,,46.140278,10.516111,3211 +alps_10647,CORNO TRIANGOLO,,46.132222,10.522500,3097 +alps_10648,CORNO GIOIA,,46.125278,10.523333,3054 +alps_10649,MONTE FUMO,,46.143611,10.546667,3409 +alps_10650,CIMA LEVADE,,46.138056,10.550556,3241 +alps_10651,MONTE OSPEDALE,,46.136944,10.654722,2678 +alps_10652,CIMA DEGLI OBICI,,46.128333,10.638056,2802 +alps_10653,MONTE COEL,,46.126944,10.626944,2870 +alps_10654,POZZONI,,46.124444,10.615833,2915 +alps_10655,MONTE ALTAR,,46.121389,10.665000,2560 +alps_10656,MONTE CARE ALTO,,46.108056,10.596111,3463 +alps_10657,CIMA BUCIAGA,,46.103056,10.541389,3012 +alps_10658,CIMA DELL'ARTIGLIERE,,46.117500,10.549444,2906 +alps_10659,CIMA DI POIA,,46.114722,10.512778,2899 +alps_10660,MONTE PEDERTIC,,46.196944,10.711111,2698 +alps_10661,CIMA TAMALE,,46.182222,10.684167,2583 +alps_10662,PALA DEL MUGHI,,46.150556,10.826111,2321 +alps_10663,CORNO ALTO,,46.144722,10.722500,2271 +alps_10664,SPADALONE,,46.140000,10.716111,2343 +alps_10665,MONTE STAVEL,,46.152222,10.670278,2217 +alps_10666,MONTE FORNACE,,46.123611,10.675556,2468 +alps_10667,LA COSTACCHIA,,46.123333,10.705556,2428 +alps_10668,LA CINGLA,,46.129167,10.710556,2396 +alps_10669,LA PETTA,,46.106667,10.788333,2054 +alps_10670,CALMAC,,46.112778,10.707500,2023 +alps_10671,CIMA FRACINGLO,,46.170000,10.853611,2673 +alps_10672,CIMA NADRIS,,46.159167,10.845833,2613 +alps_10673,CIMA TOSA,,46.155278,10.870556,3159 +alps_10674,CIMA D'AGOLA,,46.146667,10.861944,2988 +alps_10675,CIMA VALLON,,46.136944,10.845278,2965 +alps_10676,CIMA PRATO FIORITO,,46.140000,10.860556,2888 +alps_10677,CIMA D'AMBIEZ,,46.150556,10.868889,3096 +alps_10678,CIMA BRENTA BASSA,,46.155556,10.893056,2803 +alps_10679,CIMA BRENTA ALTA,,46.160278,10.896389,2962 +alps_10680,CIMA BRENTA,,46.179444,10.899722,3150 +alps_10681,CIMA MANDRON,,46.181111,10.887778,3040 +alps_10682,CAMPELLE DI VALLESINELLA,,46.190000,10.904444,2946 +alps_10683,CIMA DELLA VALLAZZA,,46.186111,10.919444,2810 +alps_10684,GLI SFULMINI,,46.167222,10.895833,3013 +alps_10685,CIMA D'ARMI,,46.168889,10.900278,2951 +alps_10686,DOSS DI DALUM,,46.133333,10.901389,2687 +alps_10687,CIMA CEDA,,46.143889,10.889722,2760 +alps_10688,CIMA DEI LASTERI,,46.176667,10.947778,2459 +alps_10689,PIZZO GALLINO,,46.177778,10.962222,2442 +alps_10690,CIMA GAIARDA,,46.189167,10.930556,2640 +alps_10691,CORNO DI SENASO,,46.126667,10.858056,2853 +alps_10692,CIMA GHEZ,,46.124167,10.903056,2715 +alps_10693,DOSS DELLE SAETE,,46.108056,10.904167,2250 +alps_10694,MONTE DION,,46.130000,10.917500,2354 +alps_10695,MONTE DAINO,,46.151111,10.915000,2680 +alps_10696,CIMA FORCOLOTTA,,46.113333,10.847500,2507 +alps_10697,CASTELLO DEI CAMOSCI,,46.099722,10.843056,2538 +alps_10698,COLMA ALTA,,46.104444,10.872222,2324 +alps_10699,CIME DI GROM,,46.270000,10.336389,2773 +alps_10700,DOSSONI,,46.279444,10.340556,2910 +alps_10701,MONTE SEROTTINI,,46.290833,10.346667,2967 +alps_10702,CORNO TREMONCELLI,,46.292778,10.370556,2834 +alps_10703,CIME DI GLERE,,46.295278,10.422778,2776 +alps_10704,CIME DEL TIRLO,,46.287778,10.424167,2929 +alps_10705,CIMA MATTACIUL,,46.282222,10.426389,2852 +alps_10706,MONTE BLES,,46.278611,10.430556,2826 +alps_10707,CIMA MURALTA,,46.270833,10.427500,2521 +alps_10708,MONTE COLEAZZO,,46.291389,10.468889,3030 +alps_10709,MONTE PAGANO,,46.247778,10.342778,2348 +alps_10710,CORNO PORNINA,,46.205000,10.432222,2815 +alps_10711,CIME DI VALLARO,,46.202778,10.436111,2907 +alps_10712,CORNO DI MEZZODI,,46.200833,10.453333,2966 +alps_10713,CIMA CASAIOLE,,46.290278,10.568889,2779 +alps_10714,MONTE TONALE OCCIDALE,,46.283056,10.559722,2694 +alps_10715,MONTE TONALE ORIENTALE,,46.285000,10.594444,2696 +alps_10716,CROZ DI STAVEL,,46.251111,10.646389,2635 +alps_10717,CIMA DEI POZZI,,46.242222,10.638611,2890 +alps_10718,PUNTA DI CASTELLACCIO,,46.233889,10.568056,3029 +alps_10719,CORNO DI LAGO SCURO,,46.223056,10.570278,3166 +alps_10720,CIMA PAYER,,46.215833,10.562500,3056 +alps_10721,PUNTA PISGANA,,46.210278,10.555833,3088 +alps_10722,CIMA PRESANELLA,,46.220000,10.663889,3558 +alps_10723,CIMA DI VERMIGLIO,,46.221389,10.652778,3458 +alps_10724,MONTE GABBIOLO,,46.216667,10.650833,3458 +alps_10725,MONTE CERCEN,,46.223056,10.630556,3280 +alps_10726,CIMA BUSAZZA,,46.223889,10.610278,3326 +alps_10727,CIMA PRESENA,,46.219444,10.586944,3069 +alps_10728,CIMA DEL ZIGOLON,,46.215833,10.586944,3048 +alps_10729,MONTE BOTTERI,,46.211389,10.653333,3285 +alps_10730,AGO DI NARDIS,,46.205000,10.656111,3289 +alps_10731,CIMONE DELLE ROCCHETTE,,46.201944,10.656389,3289 +alps_10732,CIMA DI SALIMMO,,46.206667,10.516667,3115 +alps_10733,PUNTA DEI BUOI,,46.215000,10.506111,2718 +alps_10734,CIMA DI LASTE,,46.259722,10.785000,2760 +alps_10735,CIMA DI VAL GELADA,,46.254722,10.767778,2675 +alps_10736,CIMA BASELGA,,46.251944,10.753056,2799 +alps_10737,MONTE CALDONI,,46.243889,10.743611,2906 +alps_10738,CIMA GINER,,46.237222,10.732500,2957 +alps_10739,CIMA DI BON,,46.241389,10.713333,2901 +alps_10740,MONTE VIGO,,46.275278,10.827222,2179 +alps_10741,CIMA DI STAVEL,,46.266111,10.715833,2619 +alps_10742,CIMA PALU,,46.255278,10.691944,3013 +alps_10743,CIMA SCARPACO,,46.240278,10.685833,3252 +alps_10744,CIMA D'AMOLA,,46.227222,10.672222,3269 +alps_10745,CIMA CORNISELLO,,46.225833,10.689444,3158 +alps_10746,MONTE SERODOLI,,46.239444,10.770833,2708 +alps_10747,MONTE NAMBRONE,,46.230833,10.775000,2625 +alps_10748,MONTE RITORTO,,46.220278,10.782500,2411 +alps_10749,MONTE NERO,,46.215556,10.675000,3344 +alps_10750,SASSO ROSSO,,46.277222,10.902222,2645 +alps_10751,CIMA UOMO,,46.278333,10.919722,2543 +alps_10752,CIMA BENON,,46.268333,10.906667,2687 +alps_10753,CIMA DEL VENTO,,46.262778,10.899722,2761 +alps_10754,CIMA DELLE LIVEZZE,,46.261111,10.896667,2780 +alps_10755,CIMA ROCCA,,46.258889,10.894167,2831 +alps_10756,CIMA SASSARA,,46.250556,10.890278,2894 +alps_10757,CIMA FLAVONA,,46.245833,10.896944,2918 +alps_10758,CORNO DI DENNO,,46.247500,10.900000,2873 +alps_10759,CIMA VAGLIANA,,46.236111,10.893056,2861 +alps_10760,PIETRA GRANDE,,46.231389,10.895833,2937 +alps_10761,CASTELLAZZO,,46.297500,10.942222,2206 +alps_10762,CIMA VALLINA,,46.286944,10.933889,2397 +alps_10763,LOVERDINA,,46.241667,10.968056,2237 +alps_10764,MONTE BEDOLE,,46.208889,10.979722,2419 +alps_10765,CIMA SANTA MARIA,,46.212500,10.950556,2678 +alps_10766,TERMONCELLO,,46.219722,10.946667,2670 +alps_10767,MONTE CORONA,,46.215556,10.969444,2562 +alps_10768,CIMA DI VAL SCURO,,46.226111,10.949167,2770 +alps_10769,CORNO DI BOERO,,46.368611,10.394444,2878 +alps_10770,CIMA DI PROFA ALTA,,46.376111,10.398333,2913 +alps_10771,PUNTA DI POLLORE,,46.380833,10.412778,2954 +alps_10772,CORNO DI PROFA,,46.388056,10.419444,3078 +alps_10773,MONTE SOBRETTA,,46.397500,10.436944,3296 +alps_10774,MONTE MALA,,46.393611,10.394444,2951 +alps_10775,MONTE GAVIA,,46.354167,10.472500,3223 +alps_10776,CIMA DI SAVORETTA,,46.341389,10.443333,3096 +alps_10777,CIMONO DEI BECCHI,,46.324722,10.404167,2822 +alps_10778,CIMA DELLE POZZE,,46.360000,10.442778,2656 +alps_10779,PUNTA DI PIETRA ROSSA,,46.324722,10.437500,3283 +alps_10780,CIMA MONTICELLO,,46.316667,10.440556,3181 +alps_10781,PUNTA DI MONTICELLI,,46.321111,10.465000,2636 +alps_10782,MONTE GAVIOLA,,46.334722,10.498056,3025 +alps_10783,PUNTA SEGNALE,,46.389722,10.528889,3132 +alps_10784,PIZZO TRESERO,,46.390556,10.543056,3594 +alps_10785,CIMA SAN GIACOMO,,46.397222,10.556667,3281 +alps_10786,CIMA DOSEGU,,46.383333,10.555556,3560 +alps_10787,PUNTA SAN MATTEO,,46.378056,10.567222,3675 +alps_10788,PUNTA CADINI,,46.376944,10.599167,3524 +alps_10789,ROCCA SANTA CATERINA,,46.382500,10.609167,3529 +alps_10790,PUNTA TAVIELA,,46.388611,10.616111,3612 +alps_10791,COLLE PLACIDO,,46.374444,10.525833,3121 +alps_10792,MONTE MANTELLO,,46.373056,10.560833,3517 +alps_10793,CIMA VALLOMBRINA,,46.363056,10.540556,3222 +alps_10794,PUNTA DELLA SFORZELLINA,,46.355833,10.519722,3099 +alps_10795,CORNO DEI TRE SIGNORE,,46.343333,10.515556,3360 +alps_10796,CIMA DI CAIONE,,46.325000,10.513611,3140 +alps_10797,CIMA DELLE GRAOLE,,46.314722,10.524444,2861 +alps_10798,VILLA CORNA,,46.346667,10.560833,2880 +alps_10799,PUNTA DI ERCAVALLO,,46.326389,10.566111,3068 +alps_10800,COCCHIOLLE,,46.318333,10.585000,2698 +alps_10801,PUNTA DI MONTOZZO,,46.311944,10.566667,2863 +alps_10802,PUNTA D'ALBIOLO,,46.299722,10.583056,2969 +alps_10803,CIMA FORZELLINA,,46.325556,10.643056,2829 +alps_10804,MONTE PALU,,46.318056,10.635278,2835 +alps_10805,MONTE REDIVAL,,46.308611,10.613889,2973 +alps_10806,MONTE GIUMELLA,,46.375000,10.579167,3594 +alps_10807,CIMA GRANDE,,46.373056,10.736111,2901 +alps_10808,CIMA CADINEL,,46.365833,10.734167,2864 +alps_10809,CIMA VEGAIA,,46.362222,10.741667,2890 +alps_10810,MONTE LE POZZE,,46.368333,10.759444,2805 +alps_10811,CIMA BASSETTA,,46.364444,10.770000,2770 +alps_10812,CIMA TREMENESCA,,46.379722,10.803333,2726 +alps_10813,MONTE POLINAR,,46.385000,10.813056,2604 +alps_10814,MONTE VILLAR,,46.396667,10.747778,2645 +alps_10815,CIMA VALLETTA,,46.361389,10.801111,2828 +alps_10816,CIMA MEZZANA,,46.360833,10.811667,2845 +alps_10817,MONTE SALECI,,46.366111,10.822222,2680 +alps_10818,CIMA BOAI,,46.319444,10.669444,2685 +alps_10819,MONTE GAMBERAI,,46.379722,10.840278,2423 +alps_10820,CIMA LAC,,46.393611,10.915833,2439 +alps_10821,DOSSO DELL'ASINO,,46.368889,10.991667,1708 +alps_10822,MONTAGNA DI CLES,,46.356389,10.986944,1712 +alps_10823,CIMA CAMUCINA,,46.357222,10.856389,2287 +alps_10824,SASS DELL'ANEL,,46.351389,10.847500,2401 +alps_10825,MONTAGNA DI TASSULLO,,46.337778,10.975000,1805 +alps_10826,MONTE PELLER,,46.315000,10.943333,2320 +alps_10827,CIMA DI REIT,,46.495278,10.394444,3049 +alps_10828,CRESTA DI REIT,,46.491944,10.418611,3092 +alps_10829,CIMA TUCKETT,,46.498333,10.489444,3462 +alps_10830,CIME DI CAMPO,,46.492778,10.485278,3480 +alps_10831,PUNTA PAYER,,46.495278,10.479722,3446 +alps_10832,MONTE CRISTALLO,,46.495833,10.460556,3434 +alps_10833,MONTE FORCELLINO,,46.467222,10.478056,2842 +alps_10834,CIMA DELLE SALINE,,46.450556,10.487778,3074 +alps_10835,CIMA BIANCA,,46.420833,10.411389,3018 +alps_10836,MONTE VALLECETTA,,46.414722,10.402778,3148 +alps_10837,MONTE OULTOIR,,46.412500,10.384167,2696 +alps_10838,CIMA DI TRAFOI,,46.495833,10.514722,3565 +alps_10839,PUNTA THURWIESER,,46.495556,10.525278,3652 +alps_10840,MONTE ZEBRU,,46.492500,10.549167,3735 +alps_10841,IL GRAN ZEBRU,,46.478611,10.568333,3851 +alps_10842,CORNO DI SOLDA,,46.470833,10.591944,3386 +alps_10843,PUNTA DEL LAGO GELATO,,46.481111,10.609167,3250 +alps_10844,PALE ROSSE,,46.472778,10.562500,3446 +alps_10845,CIMA DELLA MINIERA,,46.478611,10.552222,3408 +alps_10846,CIMA POZZO,,46.486111,10.622778,3299 +alps_10847,CIMA MADRICCIO,,46.491667,10.629444,3265 +alps_10848,CIMA CEVEDALE,,46.448056,10.622222,3757 +alps_10849,MONTE CEVEDALE,,46.443889,10.616667,3769 +alps_10850,MONTE PASQUALE,,46.443889,10.601389,3553 +alps_10851,PALON DE LA MARE,,46.416667,10.617778,3703 +alps_10852,CIME DEI FORNI,,46.448611,10.539167,3240 +alps_10853,CIMA DELLA MANZINA,,46.448889,10.516944,3318 +alps_10854,MONTE CONFINALE,,46.449444,10.504444,3370 +alps_10855,SASSO ROTONDO,,46.483889,10.511944,3114 +alps_10856,MONTE ROSOLE,,46.430556,10.617222,3529 +alps_10857,MONTE VIOZ,,46.401667,10.632778,3645 +alps_10858,CIMA ROSSA DI MARTELLO,,46.477222,10.705833,3033 +alps_10859,CIMA ROSSA DI SAENT,,46.461111,10.716667,3347 +alps_10860,CIMA VENEZIA,,46.453889,10.689167,3386 +alps_10861,CIMA MARMOTTA,,46.449722,10.682500,3330 +alps_10862,CIMA FONTANA BIANCA,,46.493889,10.773889,3253 +alps_10863,CIMA LORCHEN,,46.483889,10.765833,3361 +alps_10864,CIMA STERNAI,,46.477778,10.770556,3443 +alps_10865,CIMA STERNAI MERIDIALE,,46.472500,10.779167,3385 +alps_10866,CIMA DI RABBI,,46.485278,10.749444,3256 +alps_10867,CIMA DI SAENT,,46.481667,10.738333,3215 +alps_10868,CIMA MEZZENA,,46.454722,10.725833,3172 +alps_10869,CIMA CARESER,,46.448333,10.726944,3189 +alps_10870,COLLECCHIO,,46.444722,10.796111,2957 +alps_10871,SASS FORA,,46.437500,10.803056,2808 +alps_10872,CIMA LAGO LUNGO,,46.440556,10.694444,3165 +alps_10873,CIMA CAMPISOL,,46.444722,10.720000,3159 +alps_10874,CIMA PONTE VECCHIO,,46.424444,10.725556,3182 +alps_10875,CIMA CAVALON,,46.418611,10.722222,3120 +alps_10876,CIMA VERDIGNANA,,46.399722,10.725833,2938 +alps_10877,MONTE STANGA,,46.467778,10.885833,2644 +alps_10878,MONTE MATTONARA,,46.460556,10.883333,2660 +alps_10879,CIMA TRENTA,,46.451111,10.883611,2636 +alps_10880,MONTE FAGGIOLA,,46.477222,10.936389,2579 +alps_10881,STUBELE,,46.466944,10.937778,2671 +alps_10882,CIMA DELLA SIROMBA,,46.469722,10.955556,2539 +alps_10883,CIMA DEGLI OLMI,,46.481944,10.963611,2656 +alps_10884,CIMA LAVAZZE,,46.483889,10.978889,2415 +alps_10885,CIMA BINAZIA,,46.453333,10.931944,2575 +alps_10886,CIMA TUATTI,,46.436389,10.861389,2701 +alps_10887,CIMA DI QUAIRA,,46.439444,10.851944,2752 +alps_10888,CASTEL PAGANO,,46.423889,10.858889,2609 +alps_10889,CIMA ZOCCOLO,,46.418056,10.881944,2561 +alps_10890,MONTE PIN,,46.434444,10.966944,2420 +alps_10891,CIMA DELLE MANDRIE,,46.402222,10.896667,2583 +alps_10892,MONTE BRAULIO,,46.532500,10.387778,2979 +alps_10893,MONTE RADISCA,,46.526667,10.389444,2970 +alps_10894,MONTE SCORLUZZO,,46.521944,10.442500,3095 +alps_10895,MONTE MADACCIO DI MEZZO,,46.507500,10.491667,3313 +alps_10896,MADACCIO DI DENTRO,,46.499722,10.494167,3403 +alps_10897,PUNTA DEGLI SPIRITI,,46.499444,10.475000,3467 +alps_10898,PUNTA DEL NASO,,46.508333,10.456667,3272 +alps_10899,PUNTA DELLA CASCATA,,46.575000,10.604444,2742 +alps_10900,PIETRAFITTA,,46.567222,10.603333,3114 +alps_10901,CRODA DI CENGLES,,46.564167,10.628889,3375 +alps_10902,CIMA DELLE PECORE,,46.563333,10.646667,3306 +alps_10903,L'ANGELO PICCOLO,,46.558056,10.648056,3318 +alps_10904,CRODA DEL FORNO,,46.553889,10.650556,3410 +alps_10905,L'ANGELO GRANDE,,46.544722,10.648056,3521 +alps_10906,PUNTA PEDER DI MEZZO,,46.529167,10.659722,3462 +alps_10907,PUNTA DELLE LASTE,,46.521111,10.641389,3422 +alps_10908,PUNTA DELLO SCUDO,,46.527500,10.649167,3461 +alps_10909,CIMA VERTANA,,46.537500,10.635833,3545 +alps_10910,DOSSOBELLO DI DENTRO,,46.551111,10.607500,3150 +alps_10911,CRODA TEDESCA,,46.570833,10.656111,3180 +alps_10912,MONTE DELLE PECORE,,46.578333,10.659444,2754 +alps_10913,PUNTA ALTA,,46.546389,10.539444,2798 +alps_10914,PUNTA TABARETTA,,46.525278,10.542500,3128 +alps_10915,ORTLES,,46.508889,10.544722,3905 +alps_10916,PUNTA PEDER DI DENTRO,,46.509722,10.638056,3309 +alps_10917,PUNTA BELTOVO DI DENTRO,,46.502778,10.628333,3325 +alps_10918,GRUGNO DI PORCO,,46.579444,10.667222,2727 +alps_10919,CRODA I JENNE,,46.574722,10.718333,2962 +alps_10920,CRODA BIANCA,,46.575556,10.745833,2778 +alps_10921,PUNTA DI LASA,,46.562222,10.718056,3305 +alps_10922,PUNTA DI SLUDER,,46.548056,10.700000,3230 +alps_10923,PUNTA LIVI,,46.534167,10.687222,3352 +alps_10924,PUNTA PEDER DI FUORE,,46.529444,10.671111,3406 +alps_10925,CIMA DEI CAMOSCI,,46.535556,10.667778,3325 +alps_10926,CIMA DI TOVO,,46.531667,10.828333,3097 +alps_10927,GIOVERETTO,,46.501944,10.782222,3439 +alps_10928,CRESTA ALTA,,46.510556,10.776944,3232 +alps_10929,IL PULPITO DI FLIM,,46.530556,10.815556,3113 +alps_10930,STALLA ROSSA,,46.520556,10.710000,2690 +alps_10931,CRODA DELLA CALVA,,46.514444,10.677778,3061 +alps_10932,MONTEBELLO,,46.574444,10.854722,2472 +alps_10933,MONTE MURMENTA,,46.565000,10.866667,2627 +alps_10934,L'ORECCHIA DI LEPRE,,46.544167,10.858889,3257 +alps_10935,MONTE PINO,,46.591111,10.918611,2241 +alps_10936,IL GRAN LADRO,,46.571944,10.930278,2730 +alps_10937,GIOGO ALTO,,46.568889,10.918889,2640 +alps_10938,MONTE CONFINALE,,46.563611,10.890278,2551 +alps_10939,FOSSA DELLA MUTTA,,46.576667,10.956667,2736 +alps_10940,MONTE DEI ROMICI,,46.580000,10.966944,2711 +alps_10941,MONTE DELLA MASSERIA,,46.585833,10.974167,2588 +alps_10942,MOARCUCK,,46.586111,10.988611,2616 +alps_10943,IL SASSO,,46.568889,10.981389,2542 +alps_10944,SAMERBERG,,46.503056,10.986667,2568 +alps_10945,MONTE CROCE,,46.678056,10.663333,2992 +alps_10946,MONTE DI GLORENZA,,46.645278,10.519167,2395 +alps_10947,MONTE PLAGABELLA,,46.634444,10.508333,2534 +alps_10948,MONTE DELLA GUARDIA,,46.610278,10.507778,2621 +alps_10949,MONTONI DI AGUMES,,46.616389,10.550278,1971 +alps_10950,PUNTA DI REMES,,46.694444,10.676944,3212 +alps_10951,PUNTA D'ALLIZ,,46.687778,10.687778,3206 +alps_10952,MONTE DELLE PECORE SUD,,46.688333,10.743889,3040 +alps_10953,MASTAUN,,46.693056,10.802222,3199 +alps_10954,MALANDRO,,46.685278,10.807778,3174 +alps_10955,MONTE ZERMINIG,,46.670278,10.817778,3109 +alps_10956,CIMA CUNA,,46.681667,10.827500,3119 +alps_10957,CIMA CUNA ALTA,,46.691111,10.850278,2978 +alps_10958,CRODA NERA,,46.686111,10.845000,2982 +alps_10959,PUNTA DI TRUMES,,46.671389,10.892222,2912 +alps_10960,CRODA DEL TOVALE,,46.699167,10.995833,3175 +alps_10961,PUNTA DELLE FOSSE,,46.666667,10.887222,2899 +alps_10962,PUNTA VERMOI,,46.659167,10.870278,2929 +alps_10963,CIMA SPARVIERI,,46.774167,10.587500,2901 +alps_10964,PUNTA DI MEZZO,,46.761944,10.602500,2908 +alps_10965,CIMA DI SERRES,,46.769722,10.621111,2955 +alps_10966,CIMA DENTROVALLE,,46.780278,10.633889,3148 +alps_10967,CIMA PLAIES,,46.780000,10.566667,2442 +alps_10968,CIMA TERMINE,,46.792500,10.566667,2652 +alps_10969,TESTE ROSSE,,46.793611,10.649167,3148 +alps_10970,PIZZO PORTLES,,46.744722,10.648056,3074 +alps_10971,CORNO GRANDE,,46.764167,10.576389,2630 +alps_10972,PIANO DEL COVOLO,,46.745556,10.592222,2622 +alps_10973,COSTA SABBIOSA,,46.731667,10.632500,2817 +alps_10974,GIOGO ALTO,,46.710833,10.601667,2593 +alps_10975,CRODA DELLE CORNACCHIE,,46.769167,10.799722,3251 +alps_10976,CRODA GRIGIA,,46.772778,10.794722,3202 +alps_10977,LA CORBA,,46.754444,10.806944,2923 +alps_10978,LAGO DI FINALE,,46.761667,10.814444,2709 +alps_10979,GRAN CADOLA,,46.764167,10.830278,3171 +alps_10980,PUNTA DELLE FRANE,,46.772778,10.769722,2861 +alps_10981,SCHWEMSER SPITZE,,46.773889,10.732778,3459 +alps_10982,CIMA DELLA SORGENTE DI FUORA,,46.778333,10.729167,3385 +alps_10983,CIMA DI LAZAUN,,46.744722,10.733611,3313 +alps_10984,LAGAUN SPITZE,,46.739167,10.739167,3439 +alps_10985,PUNTA SALDURA,,46.740833,10.735556,3433 +alps_10986,MONTE SALDURA,,46.734444,10.731111,3429 +alps_10987,STOTZ,,46.741667,10.759722,2887 +alps_10988,CIMA RAMUDLA,,46.724167,10.723333,3330 +alps_10989,KORTSCHER SCHAFBERG,,46.718611,10.751944,3111 +alps_10990,PUNTA SALDURA DI DENTRO,,46.728056,10.740556,3189 +alps_10991,LAGO DELLA FAME,,46.718889,10.767500,2778 +alps_10992,LAGHETTO NERO,,46.718611,10.782222,2671 +alps_10993,PUNTA DEL MONTE,,46.711389,10.784722,3019 +alps_10994,MONTE ALTO,,46.700556,10.725556,3265 +alps_10995,TORRE DEI CAMOSCI,,46.700556,10.735556,2923 +alps_10996,PUNTA DI CORTISERRADE,,46.704722,10.805556,3140 +alps_10997,GERSTGRASER SPITZE,,46.705833,10.808611,3104 +alps_10998,CIMA DEI CORVI,,46.783611,10.672500,3393 +alps_10999,PUNTA VALBELLA,,46.768611,10.670278,3359 +alps_11000,CIMA DI PLERES,,46.759444,10.674722,3188 +alps_11001,CIMA BARBA D'ORSO DI FUORI,,46.796667,10.699444,3471 +alps_11002,ALLA CROCE,,46.711111,10.977500,3163 +alps_11003,CIMA DEL LAGO AZZURRO,,46.715833,10.969444,3209 +alps_11004,CRODA DEL TOVALE,,46.699167,10.995833,3175 +alps_11005,PUNTA FANAT,,46.771389,10.963056,3358 +alps_11006,CIMA TESSA,,46.719722,10.971944,3318 +alps_11007,MONTEROSSA,,46.723611,10.984167,3337 +alps_11008,CRODA ROSSA,,46.728611,10.985278,3254 +alps_11009,CRODA DI RIOTORBO,,46.733611,10.994444,3264 +alps_11010,ALBERACCIO,,46.740556,10.962222,2823 +alps_11011,GUARDIA ALTA,,46.758889,10.877222,3424 +alps_11012,MONTE CAPPELLO,,46.741389,10.881667,2912 +alps_11013,CRODAROTTA,,46.736111,10.886111,2890 +alps_11014,PIANO D'AZZO,,46.726111,10.913611,2494 +alps_11015,CRODA MARCIA,,46.757222,10.895556,3418 +alps_11016,COL VASO,,46.760556,10.926944,2832 +alps_11017,LAGO DI VERNAGO,,46.738333,10.842222,1690 +alps_11018,MONTE CALISIO,,46.098056,11.143333,1096 +alps_11019,IL PALONE,,46.026944,11.058611,2090 +alps_11020,LA ROSTA,,46.016667,11.023889,1839 +alps_11021,LA MARZOLA,,46.031944,11.187500,1738 +alps_11022,MONTE PANAROTTA,,46.050278,11.334444,2001 +alps_11023,LA FONTANELLA,,46.065833,11.342222,2037 +alps_11024,MONTE FRAVORT,,46.076111,11.351111,2347 +alps_11025,OSCIVART,,46.077500,11.343611,2234 +alps_11026,HOABONTI,,46.093889,11.373333,2334 +alps_11027,MONTE GRONLAIT,,46.093333,11.358889,2383 +alps_11028,CIMA UNDICI,,46.003611,11.485000,2228 +alps_11029,MONTE CASTELNOVO,,46.009167,11.492222,2215 +alps_11030,L'ARMENTERA,,46.022222,11.427222,1499 +alps_11031,COLLE DI STANGA,,46.017222,11.414722,1532 +alps_11032,MONTE SILANA,,46.081111,11.603333,1656 +alps_11033,MONTE AGARO,,46.093611,11.657778,2062 +alps_11034,CIMA LA PRESA,,46.054444,11.584722,1658 +alps_11035,MONTE MEZZA,,46.045556,11.581667,1679 +alps_11036,MONTE CISMON,,46.039444,11.589167,1588 +alps_11037,CIMA DELLA CALDIERA,,46.008889,11.522778,2124 +alps_11038,MONTE ORTIGARA,,46.007222,11.507222,2106 +alps_11039,PUNTA MOLINA,,46.014444,11.543889,1920 +alps_11040,MONTE COPPOLO,,46.082778,11.710833,2069 +alps_11041,MONTE VALLAZZA,,46.092222,11.803611,2167 +alps_11042,MONTE AVENA,,46.031389,11.822222,1454 +alps_11043,CIMA DI LAN,,46.010000,11.756389,1261 +alps_11044,MONTE PICOSTA,,46.054444,11.668056,1427 +alps_11045,VETTE GRANDI,,46.093611,11.837222,2130 +alps_11046,VETTE PICCOLE,,46.098056,11.853333,2187 +alps_11047,MONTE MAGAZON,,46.078333,11.847222,1837 +alps_11048,MONTE SAN MAURO,,46.094167,11.907500,1836 +alps_11049,MONTE GRAVE,,46.093333,11.923056,1544 +alps_11050,MONTE AURIN,,46.009444,11.841111,745 +alps_11051,DOSSO ALTO,,46.189167,11.063333,1554 +alps_11052,LA PAGANELLA,,46.143333,11.037500,2124 +alps_11053,CANFEDIN,,46.123056,11.011944,2046 +alps_11054,DOSSO DI SEGONZANO,,46.186667,11.292222,1542 +alps_11055,CERAMONTE,,46.162222,11.271111,1514 +alps_11056,MONTE SPEGGIA,,46.173333,11.204167,1087 +alps_11057,LA GORSA,,46.139167,11.210556,1041 +alps_11058,DOSSO DI COSTALTA,,46.132222,11.289167,1955 +alps_11059,MONTE FREGASOGA,,46.185556,11.381389,2452 +alps_11060,MONTE CAMIN,,46.174722,11.384444,2328 +alps_11061,MONTE CROCE,,46.169444,11.392222,2490 +alps_11062,MONTE CONCA,,46.146944,11.384444,2301 +alps_11063,CIMA DI SETTESELLE,,46.128056,11.398333,2396 +alps_11064,PALE DI BUSE,,46.191111,11.382222,2412 +alps_11065,CIMA ONCHIELI,,46.186944,11.442222,2172 +alps_11066,MONTE ZIOLERA,,46.171944,11.455278,2478 +alps_11067,CIMA DELLE BUSE,,46.186111,11.498056,2572 +alps_11068,MONTALON,,46.176389,11.471667,2435 +alps_11069,CIMA FORNACE,,46.165000,11.419167,2225 +alps_11070,MONTE VAL PIANA,,46.162778,11.480000,2368 +alps_11071,MONTE SETOLE,,46.153889,11.489722,2208 +alps_11072,CIMA DI VALSOLARA,,46.167778,11.448056,2283 +alps_11073,MONTE RUIOCH,,46.156667,11.365556,2432 +alps_11074,MONTE CISTE,,46.113611,11.445833,2186 +alps_11075,MONTE SALUBIO,,46.104444,11.470556,1886 +alps_11076,SOPRA CONELLA,,46.114167,11.393611,2308 +alps_11077,MONTE DEL LAGO,,46.108611,11.382778,2327 +alps_11078,COL DEI FIORI,,46.193333,11.535833,2234 +alps_11079,COL DI SAN GIOVANNI,,46.180000,11.546389,2251 +alps_11080,CIMA SOCEDE,,46.171944,11.555000,2173 +alps_11081,CIMA CORMA,,46.186111,11.595556,2507 +alps_11082,CIMA D'ASTA,,46.176667,11.605278,2847 +alps_11083,COL DI VENTO,,46.185278,11.613333,2636 +alps_11084,CIMA SPIADON,,46.183611,11.650000,2312 +alps_11085,MONTE CONTE MORO,,46.163889,11.649722,2407 +alps_11086,IL PASSETTO,,46.160833,11.610556,2589 +alps_11087,MONTE TOLVA,,46.143333,11.644444,2343 +alps_11088,MONTE CENGELLO,,46.154167,11.565278,2439 +alps_11089,CIMA ORSERA,,46.137222,11.563889,2471 +alps_11090,CIMA QUARAZZA,,46.129444,11.570000,2530 +alps_11091,CIMON RAVA,,46.123333,11.569444,2436 +alps_11092,CIMA DEL FRATE,,46.116389,11.571944,2351 +alps_11093,MONTE CASTELLETTO,,46.111944,11.569167,2337 +alps_11094,CIMA SEGURA,,46.136389,11.581389,2273 +alps_11095,PUNTA SOCEDE,,46.166667,11.586944,2345 +alps_11096,CAMPAGNASSA,,46.151111,11.606667,2406 +alps_11097,MCENON,,46.126111,11.529167,2278 +alps_11098,CIMA PRIMALUNA,,46.116667,11.544444,2314 +alps_11099,CIMA RAVETTA,,46.111667,11.545556,2266 +alps_11100,CIMA DI BUSE TODESCE,,46.143056,11.565833,2413 +alps_11101,COL DI BOIA,,46.125556,11.665278,2066 +alps_11102,MPALLONE DI CAVALLARA,,46.132500,11.658056,2201 +alps_11103,MONTE FIEROLLO,,46.106944,11.589444,2141 +alps_11104,MONTE PAVIONE,,46.104722,11.821111,2335 +alps_11105,COL DELLA REMITTA,,46.118889,11.713611,1748 +alps_11106,CIMA FOLGA,,46.198611,11.754444,2436 +alps_11107,MONTE CALMANDRINO,,46.146111,11.673056,2079 +alps_11108,MONTE TOTOGA,,46.135556,11.749167,1705 +alps_11109,MONTE VEDERNA,,46.129444,11.788611,1584 +alps_11110,COLLE STIOZE,,46.179167,11.868611,1352 +alps_11111,CIMON DI FRADUSTA,,46.167778,11.870556,1867 +alps_11112,PALE ALTE PALUGHET,,46.179444,11.900000,1880 +alps_11113,PALE DEL GAROFOLO,,46.180556,11.926667,2150 +alps_11114,PIZ DI SAGRON,,46.175556,11.928333,2486 +alps_11115,MONTE PIZZOC,,46.171111,11.930278,2440 +alps_11116,SASSO LARGO,,46.173889,11.939167,2300 +alps_11117,CIMON DEL PIZ,,46.168333,11.955556,2325 +alps_11118,MONTE BRANDOL,,46.170278,11.978889,2160 +alps_11119,MONTE COLAZ,,46.195556,11.993889,1728 +alps_11120,MONTE MONDO,,46.167778,11.994444,2039 +alps_11121,MONTE COLSENTO,,46.148611,11.991944,2086 +alps_11122,MONTE PALE DEL CISO,,46.138333,11.989167,2068 +alps_11123,MONTE NEVA,,46.156111,11.909167,2228 +alps_11124,SASS DI MURA,,46.163611,11.925278,2547 +alps_11125,MONTE COLSENTO,,46.138611,11.920000,2021 +alps_11126,MONTE ZOCCARE ALTO,,46.129167,11.897500,1929 +alps_11127,MONTE RAMEZZA,,46.117778,11.885278,2229 +alps_11128,SASSO SCARNIA,,46.120833,11.893056,2226 +alps_11129,LE VETTE,,46.118056,11.878056,2250 +alps_11130,CIMA DODICI,,46.107778,11.834722,2264 +alps_11131,MONTE PIETENA,,46.101667,11.852500,2194 +alps_11132,MONTE TRE PIETRE,,46.121111,11.980278,1965 +alps_11133,MONTE CUC,,46.266944,11.135278,1807 +alps_11134,CIMA D'ARZA,,46.279444,11.135278,1665 +alps_11135,CORNO DI TRES,,46.296389,11.163889,1812 +alps_11136,CRODA CORVA,,46.276667,11.162222,1472 +alps_11137,CRAUNEL,,46.260000,11.134167,1873 +alps_11138,MONTICELLO,,46.249444,11.121389,1857 +alps_11139,MONTE CORNO,,46.286944,11.318889,1817 +alps_11140,MONTE PRATO DEL RE,,46.288056,11.283333,1622 +alps_11141,LA MADRUTTA,,46.274722,11.266389,1507 +alps_11142,PRATI DEI LARICI,,46.259722,11.286667,1586 +alps_11143,DOSSO DEL COLLE,,46.259167,11.305833,1616 +alps_11144,MONTE DELL'ORSO,,46.248333,11.278889,1576 +alps_11145,MONTE DI GRUMES,,46.233611,11.271944,1556 +alps_11146,MONTE NOVALINE,,46.226944,11.251667,1449 +alps_11147,CASTION,,46.218333,11.233333,1528 +alps_11148,MONTE PINCALDO,,46.205278,11.220556,1351 +alps_11149,DOSSO MOZALON,,46.211111,11.187222,1044 +alps_11150,MONTE BASSO,,46.212500,11.177778,1033 +alps_11151,MONTE ALTO,,46.227778,11.189167,1084 +alps_11152,CORNO CLICHER,,46.259722,11.192500,1167 +alps_11153,MONTE GAS,,46.280556,11.191111,1228 +alps_11154,BOSCO COMUNALE,,46.274722,11.308889,1789 +alps_11155,LAGO DEL FORAME,,46.210000,11.476944,2269 +alps_11156,BUSA GRANA,,46.208056,11.483333,2510 +alps_11157,CIMON DEL TERZO,,46.206389,11.490833,2463 +alps_11158,CIMON DI VAL MOENA,,46.220833,11.478889,2488 +alps_11159,DOS DI MEZZODI,,46.250556,11.468056,1847 +alps_11160,CIMON DEL TRES,,46.205000,11.396944,2292 +alps_11161,MONTE DELL'INFERNO,,46.215278,11.454167,2333 +alps_11162,LAGO DI STRAMENTIZZ0,,46.263611,11.377500,787 +alps_11163,DOSSO DELLE LASTE,,46.231944,11.385833,1775 +alps_11164,LA STORTA,,46.241111,11.440000,1842 +alps_11165,MONTE BRUSTOLONI,,46.214167,11.401111,2108 +alps_11166,IL RUCADIN,,46.256944,11.411111,1249 +alps_11167,MONTE FRATTONI,,46.200556,11.361111,2073 +alps_11168,MONTE MOREL,,46.280000,11.381389,1370 +alps_11169,COL TORONDO,,46.255833,11.638333,2530 +alps_11170,CIMA MOREGNA,,46.259722,11.640278,2517 +alps_11171,CIMA DI VALMAGGIORE,,46.256667,11.657778,2479 +alps_11172,CIMA DI VALBONA,,46.255833,11.648889,2413 +alps_11173,DOS CALIGHER,,46.263889,11.653333,2273 +alps_11174,LAGO DI MOREGNA,,46.266667,11.637222,2058 +alps_11175,CIMA DEI PARADISI,,46.230278,11.662778,2206 +alps_11176,LAGO BRUTTO,,46.260833,11.632778,2207 +alps_11177,FORCA DI COLDOSE,,46.260000,11.625278,2182 +alps_11178,CADINON,,46.261389,11.621111,2322 +alps_11179,CIMA DI CANZENAGOL,,46.255000,11.613889,2457 +alps_11180,CIMA BUSA ALTA,,46.250000,11.609722,2513 +alps_11181,FORCA CARDINAL,,46.245000,11.605278,2301 +alps_11182,CARDINAL,,46.243889,11.601944,2481 +alps_11183,CAURIOL,,46.235278,11.596389,2494 +alps_11184,CAURIOL PICCOLO,,46.234722,11.589167,2396 +alps_11185,CASTEL D'AIE,,46.239722,11.576389,2486 +alps_11186,MONTE FORMENTONE,,46.233333,11.566111,2414 +alps_11187,PASSO LITEGOSA,,46.230833,11.563611,2261 +alps_11188,CIMA DI LITEGOSA,,46.225556,11.558611,2548 +alps_11189,CIMA DI COPOLA,,46.222222,11.558889,2547 +alps_11190,MONTE CAMIN,,46.248333,11.586111,2223 +alps_11191,CORONE DELLA STANGA,,46.255000,11.589722,2151 +alps_11192,MANDRICCIONE,,46.251944,11.588333,2180 +alps_11193,COL DEL LATTE,,46.203889,11.565278,2085 +alps_11194,CIMON DI LASTEOLO,,46.216944,11.544444,2550 +alps_11195,CIMA DELLA SUTE,,46.210833,11.533333,2616 +alps_11196,CIMA DI LAGORAI,,46.202500,11.523889,2585 +alps_11197,CIMA DELLA STELLUNE,,46.200000,11.509722,2605 +alps_11198,CORONA ALTA,,46.241111,11.534722,2224 +alps_11199,PAION DEL CERMIS,,46.241667,11.503611,2229 +alps_11200,FORCA DEL BOMBASEL,,46.236667,11.501667,2180 +alps_11201,CIMON DEL TO DELLA TRAPPOLA,,46.231667,11.500556,2401 +alps_11202,CASTEL DI BOMBASEL,,46.223333,11.506667,2535 +alps_11203,CIMON DELLA ROA,,46.211111,11.513889,2558 +alps_11204,CIMA BUSE DALL'OR,,46.208611,11.518611,2546 +alps_11205,LAGO LAGORAI,,46.236667,11.528333,1870 +alps_11206,CIMA FORMION,,46.225833,11.538056,2529 +alps_11207,CIMA DI PIERONI,,46.221111,11.540556,2443 +alps_11208,LAGHI DI BOMBASEI,,46.227778,11.508889,2268 +alps_11209,LAGHETTI DI LAGORAI,,46.210278,11.525278,2270 +alps_11210,CIMON DI CADINELLO,,46.230833,11.540278,2438 +alps_11211,CIMA DEL BURELONI,,46.297778,11.831944,3130 +alps_11212,CIMA SILVANO,,46.296389,11.822500,2559 +alps_11213,CIMON DELLA PALA,,46.285556,11.821389,3184 +alps_11214,PASSO DEL TRAVIGNOLO,,46.286111,11.828056,2925 +alps_11215,CRODA DELLA PALA,,46.279167,11.830833,2960 +alps_11216,CIMA DELLA VEZZANA,,46.290000,11.829722,3192 +alps_11217,PUNTA ROLLE,,46.293611,11.800000,2222 +alps_11218,LA ROSETTA,,46.263056,11.831111,2743 +alps_11219,CUSIGLIO,,46.260556,11.828333,2510 +alps_11220,SPIZ DEL DOCH,,46.200278,11.798333,1834 +alps_11221,COL SANTO,,46.207500,11.798611,1783 +alps_11222,LAGO DI CALAITA,,46.205000,11.794167,1604 +alps_11223,COLBRICON,,46.274167,11.753333,2602 +alps_11224,FORCA DI CARAMANA,,46.270000,11.744722,2428 +alps_11225,CIME DI CEREMANA,,46.265556,11.738333,2699 +alps_11226,CIME DI BRAGAGNOLO,,46.265000,11.726944,2692 +alps_11227,CIMA VALCIGOLERA,,46.259167,11.743333,2540 +alps_11228,TOGNOLA,,46.251389,11.750000,2405 +alps_11229,CIMA TOGNAZZA,,46.228611,11.770278,2235 +alps_11230,CIMA SCANAIOL,,46.215000,11.765833,2467 +alps_11231,CIMA D'ARZON,,46.207222,11.757500,2309 +alps_11232,CIMA DI GRUGOLA,,46.201389,11.759444,2397 +alps_11233,AGNELESSA,,46.213333,11.775278,2307 +alps_11234,CIMA CUNELETTI,,46.204444,11.735833,2205 +alps_11235,CIMA DI VALSORDA,,46.199722,11.735833,2287 +alps_11236,LAGO CAVALLAZZA,,46.282500,11.778056,2141 +alps_11237,LAGHI DEL COLBRICON,,46.282500,11.765000,1922 +alps_11238,PASSO DEL COLBRICON,,46.281389,11.761667,1908 +alps_11239,CAVALLAZZA,,46.278889,11.776667,2325 +alps_11240,COLBRICCON PICCOLA,,46.277500,11.745833,2511 +alps_11241,CIMA DI SELLA,,46.269444,11.672222,2492 +alps_11242,LAGO DI CECE,,46.281667,11.670000,1879 +alps_11243,CASTEL,,46.278889,11.686389,2164 +alps_11244,COSTON DI SLAVACI,,46.262222,11.716944,2708 +alps_11245,CIMA VALON,,46.261389,11.706111,2678 +alps_11246,CIMA VALBONA,,46.262778,11.695556,2541 +alps_11247,CIMA DI CECE,,46.260833,11.683889,2754 +alps_11248,CIMA MIESNOTTA,,46.253889,11.705556,2340 +alps_11249,FOSSERNICA,,46.239167,11.673056,2115 +alps_11250,MONTE AGNER,,46.276389,11.952778,2872 +alps_11251,TORRE ARMENA,,46.277222,11.946944,2652 +alps_11252,FORCA DEL PIZZON,,46.274722,11.950833,2623 +alps_11253,SPIZ NORD D'AGNER,,46.279722,11.958056,2545 +alps_11254,SPIZ PICCOL,,46.282500,11.958611,2139 +alps_11255,SPIZ VERDE,,46.283333,11.954167,1918 +alps_11256,SPIZ DELLA LASTIA,,46.281944,11.971389,2295 +alps_11257,DENTE DI SATANASSO,,46.280278,11.979722,1937 +alps_11258,CIMA VALTORTA,,46.281667,11.982500,1862 +alps_11259,COLDIN,,46.283333,11.985000,1780 +alps_11260,COL NEGRO,,46.284444,11.939167,1724 +alps_11261,COL TOROND,,46.270833,11.937500,2314 +alps_11262,CIME DEI BALCONI,,46.290833,11.902500,2410 +alps_11263,SASSO NEGRO,,46.295000,11.884444,2189 +alps_11264,TROMBA DEL MIEL,,46.276944,11.892500,2467 +alps_11265,CIMA CORONA,,46.272500,11.836944,2768 +alps_11266,IL NUVOLO,,46.285556,11.831667,3075 +alps_11267,COL CANTONI,,46.281944,11.838056,2822 +alps_11268,CIMA DELLE COMELLE,,46.289722,11.843333,2951 +alps_11269,LE ZIROCOLE,,46.296667,11.837500,3058 +alps_11270,COLLE ALTO,,46.290833,11.867222,2407 +alps_11271,PASSO ANTERMARUCOL,,46.286944,11.870000,2334 +alps_11272,LA FRADUSTA,,46.251111,11.873333,2939 +alps_11273,LAGO DI MANNA,,46.269444,11.864167,2595 +alps_11274,LAGO PRADODALI,,46.247222,11.857222,2242 +alps_11275,PALA DI SAN MARTINO,,46.253889,11.850000,2982 +alps_11276,CIMA DELLE SCARPE,,46.259444,11.849444,2802 +alps_11277,RODETTA,,46.259722,11.846111,2788 +alps_11278,CIMA TOME,,46.259167,11.859444,2748 +alps_11279,CIMA DI BALL,,46.243056,11.844444,2802 +alps_11280,CIMA DI VAL DI RODA,,46.247222,11.839444,2791 +alps_11281,SASS MAOR,,46.232500,11.848611,2814 +alps_11282,CIMA DELLA STANGA,,46.227778,11.845556,2550 +alps_11283,CIMERLO,,46.223611,11.848611,2503 +alps_11284,CIMA DI SEDOLE,,46.234722,11.883889,2244 +alps_11285,CAMP DOSTIO,,46.233611,11.879167,2405 +alps_11286,SASSO DELLE LEDE,,46.239167,11.873611,2580 +alps_11287,CIMA CANALI,,46.243889,11.863611,2900 +alps_11288,PALA CANALI,,46.241389,11.861389,2720 +alps_11289,CIMA WILMA,,46.246667,11.865000,2777 +alps_11290,CIMA PRADIDALI,,46.248333,11.850833,2774 +alps_11291,PASSO DI BAL,,46.246667,11.846944,2443 +alps_11292,CAMP PRADIDALI,,46.244722,11.845278,2733 +alps_11293,COLDEI CISTRI,,46.210833,11.842500,1606 +alps_11294,CAMP FRADUSTA,,46.248889,11.884167,2779 +alps_11295,COL PIAGHER,,46.213889,11.937778,1532 +alps_11296,COL CORNASSIN,,46.213056,11.943333,1492 +alps_11297,LASTEI D'AGNER,,46.271389,11.946944,2861 +alps_11298,SASS DE LE CAURE,,46.268056,11.945833,2762 +alps_11299,SASS DE LE SNARE,,46.261667,11.939722,2708 +alps_11300,CIMA DE LA BETA,,46.258056,11.935833,2723 +alps_11301,FORCA DE LA BETA,,46.253889,11.935278,2357 +alps_11302,CRODA GRANDA,,46.248611,11.928611,2849 +alps_11303,CIME VANI ALTI,,46.243333,11.919722,2690 +alps_11304,CIME DEL MARMPR,,46.252500,11.919167,2698 +alps_11305,CIMA DEL CORO,,46.251111,11.914722,2670 +alps_11306,CIMA D'ALBERGHETTO,,46.252778,11.912500,2574 +alps_11307,CIMA ORSA,,46.253889,11.910556,2472 +alps_11308,COLLE CANALI,,46.256111,11.905000,2522 +alps_11309,CIMA MANSTORNA,,46.251111,11.893889,2816 +alps_11310,CIMA DEI LASTEI,,46.247778,11.891389,2846 +alps_11311,SASS DA CAMP,,46.241667,11.923611,2733 +alps_11312,CIMA SANTA ANNA,,46.239444,11.916111,2461 +alps_11313,PALA DEL RIFUGIO,,46.237778,11.909444,2394 +alps_11314,SASS D'ORTIGA,,46.237500,11.915833,2634 +alps_11315,PALA DELLA MADONNA,,46.231389,11.912222,2524 +alps_11316,PALA D'OLTRO,,46.225556,11.912222,2288 +alps_11317,CIMA D'OLTRO,,46.220556,11.906944,2397 +alps_11318,FORCA GAMBERINA,,46.218889,11.906389,2214 +alps_11319,LE ROCCHETTE,,46.216667,11.904167,3309 +alps_11320,MONTE FELTRAIO,,46.212222,11.901111,2295 +alps_11321,TACCA BIANCA,,46.210833,11.893056,2141 +alps_11322,DALAIBOL,,46.201111,11.894444,2006 +alps_11323,COSTON DI LUNA,,46.244167,11.950833,1887 +alps_11324,COL DI LUNA,,46.243889,11.960556,1766 +alps_11325,MONTE GARDELLON,,46.231389,11.975000,1449 +alps_11326,LAGO DI CALDARO,,46.383333,11.268611,214 +alps_11327,CRESTE BELLE,,46.330278,11.195000,1811 +alps_11328,MONTE ROEN,,46.360556,11.191944,2116 +alps_11329,LA CERVA,,46.367222,11.205000,1856 +alps_11330,GIOGO DI GRAUN,,46.321667,11.188333,1699 +alps_11331,CIMA BATTAGLIONE,,46.318611,11.186389,1699 +alps_11332,CORNO DEL CERVO,,46.306944,11.178333,1706 +alps_11333,MAIGA SIGNALE,,46.343056,11.203611,1856 +alps_11334,COL DI SOTTO,,46.366389,11.215000,1653 +alps_11335,MONTE LIRA,,46.392500,11.211389,1617 +alps_11336,MONTE CAMPANA,,46.396944,11.214722,1554 +alps_11337,CORNO NERO,,46.334722,11.454722,2439 +alps_11338,IL PALONE,,46.333056,11.448889,2350 +alps_11339,CORNO BIANCO,,46.353611,11.444722,2317 +alps_11340,KALMEGG,,46.322500,11.370278,1384 +alps_11341,MONTE COLLE,,46.338333,11.377500,1300 +alps_11342,EINSEIDLER HUEGEL,,46.302500,11.376111,1544 +alps_11343,IL SOLOMBO,,46.302778,11.416111,1412 +alps_11344,LA CUGOLA,,46.324167,11.431389,2077 +alps_11345,SASSO DEL GAZZO,,46.325833,11.419444,2027 +alps_11346,MONTE TOLARGO,,46.325556,11.404167,1836 +alps_11347,PRATI DI LANA,,46.356389,11.416389,1766 +alps_11348,MONTE CUCAL,,46.310278,11.485833,1704 +alps_11349,CIMA CUCUL,,46.330278,11.343333,1563 +alps_11350,MONTE PAUSABELLA,,46.376111,11.405833,1791 +alps_11351,MONTE TOMMEC,,46.384167,11.485556,1594 +alps_11352,MONTE NOVALE,,46.376667,11.495556,1589 +alps_11353,MONTE MULAT,,46.327222,11.632500,2150 +alps_11354,MONTE AGNELLO,,46.329444,11.555556,2358 +alps_11355,PIZZANCAE,,46.308056,11.557222,2162 +alps_11356,LA FORCELLA,,46.311111,11.571389,2181 +alps_11357,DOS CAPEL,,46.335833,11.559722,2266 +alps_11358,CIMA FEUDO,,46.358333,11.569722,2670 +alps_11359,CIMA DI SANTA,,46.346111,11.511944,2488 +alps_11360,LA PORTA,,46.331944,11.543889,2154 +alps_11361,CENSI,,46.326389,11.536944,2215 +alps_11362,DOS DAI BRANCHI,,46.320000,11.528056,2274 +alps_11363,CORNACCI,,46.312222,11.523333,2189 +alps_11364,MANDRICCIO,,46.316944,11.518056,1927 +alps_11365,CORNO D'EGA,,46.371944,11.556667,2799 +alps_11366,CIMA DEL FORCELLONE,,46.379167,11.562222,2750 +alps_11367,PUNTA DELLA CHIESA,,46.385556,11.560556,2616 +alps_11368,ZAN DE MONTAGNA,,46.369722,11.567222,2576 +alps_11369,TORRI DI LATEMAR,,46.381111,11.575278,2842 +alps_11370,COL CORNON,,46.383889,11.591944,2744 +alps_11371,CIMA POPE,,46.388333,11.599722,2460 +alps_11372,MONTE TOAC,,46.378056,11.611111,2319 +alps_11373,CIMA DA CIAMP,,46.377778,11.619722,2265 +alps_11374,SAS DA CIAMP,,46.379444,11.624722,2193 +alps_11375,CIMA DI VALSORDA,,46.364444,11.558889,2752 +alps_11376,MONTE COLFRION,,46.373611,11.528611,1872 +alps_11377,SPIZ DI TARICIOGN,,46.385833,11.740000,2647 +alps_11378,PUNTA D'ALLOCHET,,46.390278,11.750833,2582 +alps_11379,PUNTA DE LE SELE,,46.395000,11.759167,2593 +alps_11380,FORCA RICOLETA,,46.387222,11.733333,2431 +alps_11381,COLIFON,,46.385833,11.760556,2364 +alps_11382,OM PICOL,,46.397778,11.798889,2483 +alps_11383,SAS DAL MUSC,,46.383333,11.775000,2229 +alps_11384,LAGO DI CAMPAGNOLA,,46.385556,11.775000,2209 +alps_11385,COL DELE SALAE,,46.391667,11.816944,2227 +alps_11386,COL MARGHERITA,,46.366667,11.791389,2550 +alps_11387,COL DELE PALUE,,46.367222,11.762222,2266 +alps_11388,SPIZ DEL MALINVERN,,46.387222,11.724722,2630 +alps_11389,VALACIA,,46.395278,11.708333,2637 +alps_11390,PALE RABIOSE,,46.383611,11.715833,2474 +alps_11391,PIZ MEDA,,46.379167,11.690833,2200 +alps_11392,SASSO DI CROCE,,46.384167,11.693889,2200 +alps_11393,UOMO,,46.376944,11.716667,2291 +alps_11394,LAGO DI CAVIA,,46.360556,11.814722,2102 +alps_11395,MONTE PRADAZZO,,46.351389,11.809444,2279 +alps_11396,CIMA DELLA VENEGIOTA,,46.328333,11.822500,2401 +alps_11397,CIMA CALADORA,,46.332222,11.811944,2313 +alps_11398,CIMA VALLES,,46.333333,11.802778,2305 +alps_11399,CASTELLAZ,,46.307500,11.795000,2333 +alps_11400,COSTAZZA,,46.301667,11.803333,2290 +alps_11401,CIMA DI LASTE,,46.347778,11.721667,2410 +alps_11402,GRONTON,,46.354444,11.743611,2622 +alps_11403,LAGHI DI LUSIA,,46.347222,11.734167,2333 +alps_11404,CIMA BOCCHE,,46.354167,11.752222,2745 +alps_11405,LAGO DI BOCCHE,,46.341944,11.751389,2253 +alps_11406,LAGO DI IURIBRUTTO,,46.344167,11.768611,2206 +alps_11407,CIMA IURIBRUTTO,,46.359444,11.765000,2697 +alps_11408,FORCA DI VALLAZZA,,46.358056,11.774167,2521 +alps_11409,COL DE POZA,,46.349722,11.674722,2280 +alps_11410,SAS DA MEZODI,,46.355833,11.670000,2301 +alps_11411,VIEZZENA,,46.337500,11.675278,2490 +alps_11412,CREPA ROSSA,,46.398889,11.901944,2360 +alps_11413,FORCA DE NEGHER,,46.398611,11.900278,2286 +alps_11414,FORCA DELLE PIANEZZE,,46.398889,11.914167,2044 +alps_11415,PUNTA PALAZZA,,46.397500,11.920278,2160 +alps_11416,FORCA DI VALBONA,,46.398056,11.940000,2196 +alps_11417,PIZ ZORLET,,46.398056,11.945000,2378 +alps_11418,LAGO DI CENCENIGHE,,46.347222,11.970556,750 +alps_11419,MONTE PALALADA,,46.311944,11.899722,1973 +alps_11420,CIMA DI CAOZ,,46.318056,11.908056,2050 +alps_11421,MONTE CAOZ,,46.324444,11.916111,2293 +alps_11422,CIME DEI VANEDIEI,,46.328611,11.924167,2484 +alps_11423,CIMA PAPE,,46.334444,11.928056,2503 +alps_11424,MONTE PRADEMUR,,46.324722,11.936944,2361 +alps_11425,MONTE PIAON,,46.317500,11.941667,2184 +alps_11426,FORCA GARDES,,46.312222,11.947500,1998 +alps_11427,COL DEL PEZ,,46.335278,11.946111,1838 +alps_11428,MONTE PETTENASSA,,46.348056,11.886667,1755 +alps_11429,MONTE PALMINA,,46.340833,11.880278,2033 +alps_11430,COL DI FRENA,,46.373056,11.915556,1609 +alps_11431,PIZ CROCE,,46.375000,11.958056,1627 +alps_11432,MONTE SAN LUCANO,,46.311111,11.960278,2409 +alps_11433,EL MULET,,46.311667,11.966111,2361 +alps_11434,CIME D'AMBRUSOGN,,46.318333,11.972500,2365 +alps_11435,COL DI BOI,,46.343611,11.931111,2052 +alps_11436,COL BECHER,,46.396944,11.865000,2444 +alps_11437,PIZZO FORCA,,46.392500,11.848611,2285 +alps_11438,SASS DE LA PALAZA,,46.387222,11.845833,2214 +alps_11439,COL DEI GAI,,46.384167,11.845278,2171 +alps_11440,MONTE TAMER,,46.335278,11.874722,2264 +alps_11441,CIMA DEI PALOGN,,46.332778,11.871667,2266 +alps_11442,CIMON DELLA STIA,,46.328056,11.867778,2391 +alps_11443,PUNTA DEI MAR,,46.317222,11.858889,2365 +alps_11444,CAMP DEI LASTEI,,46.312778,11.855833,2721 +alps_11445,MONTE MULAZ,,46.316389,11.832222,2906 +alps_11446,CIMA ZOPEL,,46.309722,11.853333,2813 +alps_11447,TORRE QUATTRO DITA,,46.303611,11.838611,2932 +alps_11448,CAMP DEL FOCOBON,,46.304444,11.840000,2969 +alps_11449,CIMA DEL FOCOBON,,46.306667,11.841944,3054 +alps_11450,PASSO DEL MULAZ,,46.309722,11.835556,2619 +alps_11451,CRESTA DEL BARBA,,46.299722,11.849167,2716 +alps_11452,PASSO DELLE FEDE,,46.301389,11.847222,2670 +alps_11453,CAMP DEI CAMPIDEI,,46.302778,11.850833,2658 +alps_11454,SASSO TODESCO,,46.301944,11.859167,2541 +alps_11455,CAMP DI VAL GRANDE,,46.302222,11.836389,2995 +alps_11456,CIMA DI VAL GRANDE,,46.299444,11.834167,3038 +alps_11457,LASTIA DI GARDES,,46.306667,11.940000,2112 +alps_11458,CIME DEL VAN DEL PEZ,,46.308333,11.949722,2266 +alps_11459,QUARTA PALA,,46.306111,11.946111,2263 +alps_11460,TERZA PALA,,46.304722,11.958611,2355 +alps_11461,SPIZ,,46.306944,11.955833,2331 +alps_11462,TORRE DI LAGUNAZ,,46.308611,11.955833,2296 +alps_11463,SECONDA PALA,,46.306667,11.964722,2340 +alps_11464,LE CIME,,46.315278,11.976111,2296 +alps_11465,PRIMA PALA,,46.313333,11.978611,2221 +alps_11466,CORNO DEL BUS,,46.310556,11.984167,2071 +alps_11467,MONTE OMETTO,,46.496389,11.007500,2395 +alps_11468,MOZOL,,46.418889,11.053333,1566 +alps_11469,LAGO DI MONTICOLO,,46.425833,11.293056,489 +alps_11470,LAGO PICCOLO,,46.430833,11.296389,519 +alps_11471,PICCOLO PRIOL,,46.426944,11.299722,642 +alps_11472,COL DELL'OMO,,46.442222,11.299722,643 +alps_11473,SELVA DI MONTICOLO,,46.430556,11.288333,603 +alps_11474,GRAN VALLE DEI SASSI,,46.403889,11.281944,658 +alps_11475,SASSO DI MEZZODI,,46.403889,11.276389,661 +alps_11476,MONTE LARGADEN,,46.442778,11.217500,1742 +alps_11477,MONTE PENEGAL,,46.438611,11.216944,1737 +alps_11478,MONTE MACAION,,46.489444,11.210000,1866 +alps_11479,MONTE GANDA,,46.442778,11.242222,934 +alps_11480,SASSO DI SOLOMP,,46.486944,11.169167,1733 +alps_11481,MONTE ARSEN,,46.437500,11.172500,1428 +alps_11482,MONTE TOVAL,,46.426389,11.201389,1675 +alps_11483,DOSSO DEI PINI,,46.407500,11.181667,1282 +alps_11484,MONTE POZZA,,46.463611,11.379167,1616 +alps_11485,PIAN DI SPERLO,,46.450278,11.388889,1596 +alps_11486,MONTE CERVO,,46.455000,11.394444,1566 +alps_11487,MONTE DEL DOSSO,,46.439167,11.440000,1426 +alps_11488,MONTE DEL COLLE,,46.443333,11.428333,1349 +alps_11489,MONTE SOPRACHIESA,,46.420833,11.428056,1478 +alps_11490,COL DI LASTE,,46.422778,11.468056,1374 +alps_11491,MONTE DAUM,,46.400556,11.444444,1525 +alps_11492,MONTE FRANCESCO,,46.405833,11.351667,1228 +alps_11493,MONTE SOMMO,,46.436944,11.493889,1548 +alps_11494,MONTE CASTELLO,,46.414444,11.478611,1291 +alps_11495,MONTE QUAIRA,,46.401111,11.482778,1293 +alps_11496,DOSSO VIRGOLO,,46.467778,11.364167,1386 +alps_11497,BELCOLLE,,46.494444,11.590833,2262 +alps_11498,TERRAROSSA,,46.498333,11.618611,2655 +alps_11499,CIME DEL PRINCIPE,,46.488056,11.637500,2695 +alps_11500,CRODA DELL'ALPE,,46.493056,11.642778,2684 +alps_11501,MOLIGNON,,46.488056,11.643333,2279 +alps_11502,CRODA DEI CERMEI,,46.481944,11.647500,2900 +alps_11503,CRODA DEL LAGO,,46.480833,11.660000,2806 +alps_11504,TESTON DEL LAGO,,46.480000,11.642500,2811 +alps_11505,CATINACCIO D'ANTERMOIA,,46.474444,11.643611,3002 +alps_11506,CIME VALBONA,,46.478333,11.634722,2822 +alps_11507,CIMA DI DONA,,46.479167,11.667222,2666 +alps_11508,LAGO D'ANTERMOIA,,46.478611,11.659722,2495 +alps_11509,CIMA DI LAUSA,,46.471111,11.650556,2876 +alps_11510,PUNTA SELLA,,46.477222,11.618889,2601 +alps_11511,PUNTA SOLA,,46.478056,11.596944,2186 +alps_11512,PLAFETSCH,,46.477778,11.601389,2204 +alps_11513,CIMA VAIOLET,,46.472500,11.630833,2749 +alps_11514,TESTE D'AGNELLO,,46.468333,11.626667,2683 +alps_11515,TORRE DEL VAIOLET,,46.462222,11.626944,2813 +alps_11516,TORRE DELAGO,,46.460833,11.624722,2626 +alps_11517,CRODA DI RE LAURINO,,46.459167,11.618333,2813 +alps_11518,CRESTA DI DAVOI,,46.448611,11.619722,2745 +alps_11519,CIMA CATINACCIO,,46.454722,11.620833,2981 +alps_11520,CIMA SCALIERET,,46.463611,11.644167,2887 +alps_11521,PASSO DELLE POPE,,46.462222,11.640833,2720 +alps_11522,LE POPE,,46.460000,11.640000,2768 +alps_11523,GRAN CRONT,,46.453611,11.652778,2779 +alps_11524,FORCA DEI CAMOSCI,,46.465556,11.662500,2648 +alps_11525,CREPE DE LARSETCH,,46.464722,11.663889,2746 +alps_11526,CRODE DI CIAMIN,,46.472222,11.622500,2754 +alps_11527,MONTE BALZO,,46.484167,11.524722,1834 +alps_11528,MONTE CAVONE,,46.481389,11.528889,1743 +alps_11529,MONTE NICOLA,,46.489722,11.548056,2164 +alps_11530,CIMA DI MEZZODI,,46.491389,11.560278,2187 +alps_11531,MONTE CAVACCIO,,46.494167,11.574722,2235 +alps_11532,RIEDL,,46.448333,11.563056,1646 +alps_11533,SAMBERG,,46.449444,11.518056,1680 +alps_11534,ZENAYBERG,,46.423889,11.574722,1752 +alps_11535,MONTALTO DI NOVA,,46.441667,11.525556,1756 +alps_11536,PLANBUHEL,,46.416667,11.542500,1640 +alps_11537,AUF'N SAM,,46.413333,11.520556,1605 +alps_11538,CORONELLE,,46.438611,11.618889,2797 +alps_11539,MUGONI,,46.435000,11.626944,2765 +alps_11540,ZIGOLADE,,46.432222,11.636389,2540 +alps_11541,CRODA DE VAIL,,46.425556,11.619722,2806 +alps_11542,MASARE,,46.421944,11.621389,2727 +alps_11543,CIMA SFORCELLA,,46.432500,11.617222,2810 +alps_11544,CIAMPAC,,46.420000,11.631944,2316 +alps_11545,CURALTON,,46.439722,11.634444,2292 +alps_11546,COL RODELA,,46.495556,11.748611,2484 +alps_11547,PICCOLO PORDOI,,46.497222,11.806111,2692 +alps_11548,COL DE CUCHE,,46.475278,11.824722,2563 +alps_11549,SAS BECE,,46.483333,11.811111,2534 +alps_11550,SPIZ DE SOTFORCELA,,46.456389,11.762500,2484 +alps_11551,PASSO CIAREGOLE,,46.482778,11.673611,2282 +alps_11552,POLENTON,,46.467222,11.668056,2642 +alps_11553,MANTEL,,46.474444,11.670833,2567 +alps_11554,CIMA DI DONA,,46.479167,11.667222,2665 +alps_11555,PONJIN,,46.480556,11.707778,2350 +alps_11556,SAS DA LEUNDESC,,46.401111,11.712500,2557 +alps_11557,SAS MORIN,,46.403056,11.724444,2318 +alps_11558,SAS AUT,,46.403056,11.702500,2555 +alps_11559,SAS DA LE DOUDESC,,46.408056,11.700833,2446 +alps_11560,SAS DE PERE DA FECH,,46.442778,11.713611,2410 +alps_11561,SAS D'ADAM,,46.436111,11.742500,2430 +alps_11562,COLAC,,46.441389,11.782500,2715 +alps_11563,CREPA NEIGRES,,46.453333,11.763889,2534 +alps_11564,L'AUT,,46.440000,11.758889,2490 +alps_11565,SELA BRUNECH,,46.436944,11.759444,2428 +alps_11566,SAS PORCEL,,46.435278,11.758056,2490 +alps_11567,SAS DE ROCES,,46.431111,11.776389,2618 +alps_11568,CREPA NEIGRA,,46.434167,11.779722,2605 +alps_11569,COL BEL,,46.447778,11.735833,2436 +alps_11570,SELA DE CIAMOL,,46.445000,11.745833,2354 +alps_11571,PALA DAL GAIGHER,,46.434167,11.736111,2372 +alps_11572,PASSO DI SAN NICOLO,,46.422500,11.791389,2340 +alps_11573,COL OMBERT,,46.418333,11.798889,2670 +alps_11574,COMA DELL'UOMO,,46.406111,11.808333,3010 +alps_11575,PONTA DE LE VALATE,,46.405278,11.797500,2837 +alps_11576,CIMA DELA COSTABELLA,,46.403889,11.778611,2706 +alps_11577,CIMA DE LA CAMPAGNACIA,,46.401111,11.773611,2737 +alps_11578,CIMA DI LASTE,,46.406111,11.778889,2731 +alps_11579,SAS DE TAS-CIA,,46.404722,11.813333,2866 +alps_11580,FORCA DI LAGHET,,46.404444,11.811389,2765 +alps_11581,CIME CADINE,,46.410833,11.817500,2885 +alps_11582,PASSO DELLE CIRELLE,,46.410000,11.823611,2683 +alps_11583,LASTE GRAN,,46.401667,11.768056,2716 +alps_11584,PUNTA DEL'ORT,,46.403056,11.758889,2689 +alps_11585,SAS DAL PIEIF,,46.406389,11.755833,2522 +alps_11586,LASTE PICOL,,46.400000,11.763611,2497 +alps_11587,MONTE PECOL,,46.413056,11.759444,2302 +alps_11588,COL DEL JIADOI,,46.458889,11.734722,2097 +alps_11589,GRAN VERNEL,,46.442500,11.832222,3210 +alps_11590,PALA DE VERNEL,,46.445556,11.818056,2836 +alps_11591,PONTA CORNATES,,46.442778,11.823056,3029 +alps_11592,PUNTA JIGOLE,,46.408611,11.828056,2815 +alps_11593,PUNTA ROCCA,,46.434722,11.855278,3309 +alps_11594,MARMOLADA,,46.434722,11.850833,3343 +alps_11595,PICOL VERNEL,,46.439444,11.835000,3098 +alps_11596,CREPE ROSSE,,46.454167,11.909722,2223 +alps_11597,COL DEI BOUSH,,46.453056,11.860000,2494 +alps_11598,LAGO DI FEDAIA,,46.461667,11.871944,2053 +alps_11599,SASSO DELLE UNDICI,,46.445833,11.874167,2801 +alps_11600,COL DAL BARANCHIE,,46.457500,11.848333,2231 +alps_11601,SASSO DELLE DODICI,,46.446667,11.865556,2722 +alps_11602,PIZZO SERAUTA,,46.433889,11.879444,3035 +alps_11603,CIMA OMBRETTA OCCIDENTALE,,46.427222,11.837222,2998 +alps_11604,CIMA OMBRETTA DI MEZZO,,46.426389,11.842222,2983 +alps_11605,CIMA OMBRETTA ORIENTALE,,46.424444,11.846667,3011 +alps_11606,SASSO VERNALE,,46.418889,11.840556,3058 +alps_11607,CIMA OMBRETOLA,,46.412778,11.840278,2931 +alps_11608,FORCA DEL BACHET,,46.411944,11.841111,2836 +alps_11609,FORMENTON,,46.410278,11.849722,2937 +alps_11610,SASSO DI VALFREDDA,,46.410278,11.843611,3009 +alps_11611,MONTE LE SALINE,,46.401667,11.837222,2402 +alps_11612,PASSO DI BANCA,,46.408333,11.852500,2760 +alps_11613,MONTE LA BANCA,,46.407500,11.856667,2875 +alps_11614,MONTE FOP,,46.414167,11.863611,2892 +alps_11615,PALE DEL FOP,,46.417500,11.874444,2550 +alps_11616,CIMA DEL AUTA ORIENTALE,,46.400556,11.886111,2624 +alps_11617,CIMA DEL AUTA OCCIDENTALE,,46.401111,11.880833,2602 +alps_11618,MONTE ALTO,,46.405000,11.895278,2545 +alps_11619,MONTE CHEGARIS,,46.413333,11.895000,2178 +alps_11620,CCOL LASTEI,,46.417778,11.907778,2045 +alps_11621,MONTE PADON,,46.464444,11.903611,2520 +alps_11622,MONTE MESOLA,,46.464722,11.887222,2642 +alps_11623,SAS DE MEZDI,,46.471944,11.877500,2727 +alps_11624,BELVEDERE,,46.473056,11.861667,2648 +alps_11625,LE FORFESC,,46.475556,11.854444,2586 +alps_11626,SAS CIAPEL,,46.476944,11.840833,2557 +alps_11627,PIZAC,,46.485556,11.883889,2225 +alps_11628,PORTADOS,,46.485833,11.866389,2157 +alps_11629,COL TORONT,,46.477500,11.893611,2244 +alps_11630,COL DI LANA,,46.496667,11.959444,2452 +alps_11631,COL TORONT,,46.463611,11.948611,1932 +alps_11632,MONTE MIGON,,46.445556,11.949722,2384 +alps_11633,CIMA DI AGNEREZE,,46.447778,11.937778,2352 +alps_11634,SASS DE ROI,,46.446667,11.926667,2372 +alps_11635,PIZ GUDA,,46.430000,11.918333,2132 +alps_11636,MONTE FOPA,,46.466111,11.924444,2203 +alps_11637,COL DE SCOTE,,46.470000,11.914444,2265 +alps_11638,MONTE PEZZA,,46.405833,11.920278,2408 +alps_11639,SASSO BIANCO,,46.412500,11.959444,2407 +alps_11640,MONTE FORCA,,46.406389,11.983611,2013 +alps_11641,CIME DI PEZZA,,46.400000,11.931111,2396 +alps_11642,CIMA DEI QUATTRO PASTORI,,46.595833,11.003889,2546 +alps_11643,MONTE CROCE,,46.589722,11.123333,1507 +alps_11644,MONTE GIOGO,,46.581944,11.115556,1638 +alps_11645,MONTE DI FUORI,,46.572222,11.110000,1702 +alps_11646,MONTE GALL,,46.560556,11.143611,1629 +alps_11647,MONTE LUCO PICCOLO,,46.537500,11.096111,2297 +alps_11648,MONTE LUCO GRANDE,,46.534722,11.086111,2434 +alps_11649,PRATI BIANCHI,,46.515278,11.086944,2026 +alps_11650,PRATI DI MELTINA,,46.525000,11.130000,1733 +alps_11651,BOSCO MALGASOT,,46.516111,11.119444,1748 +alps_11652,MONTE DEL CAMBIO,,46.526111,11.154444,1772 +alps_11653,MONTE CORNICOLO,,46.514167,11.033333,2311 +alps_11654,MONTE CORNICOLETTO,,46.517778,11.026389,2418 +alps_11655,VEDETTA ALTA,,46.511667,10.999722,2627 +alps_11656,MONTE SOUS,,46.504722,11.052500,1863 +alps_11657,LAGO ALBORELO,,46.568889,11.064444,804 +alps_11658,MONTE LAURES,,46.508889,11.183056,1827 +alps_11659,MONTALTO,,46.527778,11.307500,1238 +alps_11660,MONTE TONDO,,46.536389,11.276944,1235 +alps_11661,COLLE DEL GIOVO,,46.551389,11.283611,1458 +alps_11662,COLLE DI RABEN,,46.573333,11.291667,1504 +alps_11663,PRATI DI LAVENNA,,46.585278,11.281389,1527 +alps_11664,BOSCO ALTO,,46.587500,11.239722,1344 +alps_11665,IL CASTELLIERE,,46.520556,11.206944,1019 +alps_11666,SCHWARZSEE SPITZ,,46.595833,11.452500,2071 +alps_11667,SAMBERG,,46.588056,11.411944,1785 +alps_11668,SERBATOIO,,46.582222,11.431111,1655 +alps_11669,KLEINER HUND,,46.588889,11.455556,1957 +alps_11670,GUNGLWALDEGG,,46.564444,11.445833,1513 +alps_11671,MONTE TONDO,,46.512778,11.377222,1110 +alps_11672,WALDNER EGG,,46.528056,11.436944,1301 +alps_11673,LAGO DI COSTALOVARA,,46.520278,11.426111,1176 +alps_11674,PRATI DEL PREVET,,46.540833,11.428611,1376 +alps_11675,MONTE CASTRALE,,46.538611,11.418056,1363 +alps_11676,TESTA DI SIGNATO,,46.512778,11.419722,1264 +alps_11677,COLLE SELLA,,46.537500,11.352500,1059 +alps_11678,DOSSO NERO,,46.586389,11.352500,1527 +alps_11679,GRUMENBICHL,,46.531389,11.341389,1075 +alps_11680,PUNTA D'ORO,,46.513333,11.637222,2249 +alps_11681,DENTI DI TERRAROSSA,,46.502500,11.638889,2551 +alps_11682,CIMA DI TERRAROSSA,,46.498056,11.618611,2655 +alps_11683,COL DAL SPIEDL,,46.518611,11.636944,2177 +alps_11684,KRANZER,,46.501667,11.595000,2465 +alps_11685,MONTE PEZ,,46.511944,11.574722,2563 +alps_11686,MONTE CASTELLO,,46.519444,11.574167,2515 +alps_11687,PUNTA EURINGER,,46.523889,11.572500,2394 +alps_11688,PUNTA SANTNER,,46.525000,11.571389,2413 +alps_11689,PICCOLO SCILIAR,,46.514722,11.555000,2283 +alps_11690,LAGO DI HILM,,46.594167,11.529444,459 +alps_11691,SALAMES,,46.587222,11.606111,1567 +alps_11692,MONTE BULLACCIA,,46.563889,11.615000,2174 +alps_11693,COL DI RENDE,,46.585833,11.573333,1296 +alps_11694,MONTE PIZ,,46.558333,11.653611,2109 +alps_11695,COL DLA PIERES,,46.585278,11.787500,2747 +alps_11696,COL DE PUEZ,,46.593056,11.824444,2725 +alps_11697,MUNTEJELA,,46.589167,11.775833,2644 +alps_11698,COL TURONT,,46.576111,11.819722,2419 +alps_11699,LEH DE CRESPEINA,,46.568611,11.825000,2374 +alps_11700,MONT DESSERA,,46.567222,11.807778,2548 +alps_11701,PASSO CRESPEINA,,46.564722,11.822778,2528 +alps_11702,COL TORONN,,46.561667,11.824722,2655 +alps_11703,GRAN CIR,,46.558611,11.806389,2592 +alps_11704,PIZES CUECENES,,46.556944,11.793056,2368 +alps_11705,SAS DAL FUECH,,46.558889,11.784167,2083 +alps_11706,BUSTAC,,46.549167,11.794167,2252 +alps_11707,SAS DAI CIAMORCES,,46.531389,11.809167,2999 +alps_11708,LECH DL DRAGON,,46.534444,11.806667,2677 +alps_11709,PIZ CULAC,,46.540000,11.780833,2086 +alps_11710,SELA DE CULAC,,46.538333,11.783333,2018 +alps_11711,CAMPANII DE MURFRET,,46.533889,11.794444,2624 +alps_11712,PIZ MIARA,,46.523611,11.795278,2964 +alps_11713,PIZ GRALBA,,46.521111,11.792500,2972 +alps_11714,PIZ SELVA,,46.515000,11.791111,2941 +alps_11715,PIZ CIAVACES,,46.511667,11.785000,2831 +alps_11716,PASSO SELLA,,46.508889,11.765833,2244 +alps_11717,LECH PISCIADU,,46.535556,11.821944,2564 +alps_11718,SAS DA LECH,,46.534167,11.816667,2936 +alps_11719,CIMA PISCIADU,,46.531389,11.825000,2985 +alps_11720,DENT DE MESDI,,46.528889,11.829722,2881 +alps_11721,BECH DE MEZDI,,46.527222,11.826667,2967 +alps_11722,SAS DE MEZDI,,46.525833,11.822500,2980 +alps_11723,COL TORON,,46.513333,11.819444,2927 +alps_11724,PIZ BOE,,46.508889,11.828056,3152 +alps_11725,TORRE DEL SIELA,,46.514167,11.799444,2831 +alps_11726,COL AUT,,46.510833,11.818333,2882 +alps_11727,PUNTA DE JOEL,,46.501944,11.823333,2945 +alps_11728,INNERKOFLER,,46.511389,11.730833,3081 +alps_11729,SASSOPIATTO,,46.513333,11.716667,2958 +alps_11730,IL DENTE,,46.510278,11.726111,3000 +alps_11731,PUNTA DANTERSAS,,46.516667,11.728611,2821 +alps_11732,LA PALACIA,,46.500833,11.683889,2351 +alps_11733,SASSOLUNGO,,46.525000,11.735278,3181 +alps_11734,CAMPANILE,,46.524167,11.731944,3096 +alps_11735,SPALLONE DELLA SASSOLUNGO,,46.517778,11.741667,3081 +alps_11736,FORCA SASSOLUNGO,,46.514722,11.740000,2681 +alps_11737,CINQUE DITA,,46.513333,11.737222,2998 +alps_11738,SASSO LEVANTE,,46.510556,11.733611,3114 +alps_11739,PIZ SELA,,46.532222,11.750278,2239 +alps_11740,COL DE RAISER,,46.586389,11.745556,2107 +alps_11741,MONTE STEVIA,,46.580833,11.766389,2555 +alps_11742,MONTE PICCIO,,46.580556,11.724444,2363 +alps_11743,PIZ DE LAVARELA,,46.585278,11.971111,3055 +alps_11744,PIZA PAROM,,46.588889,11.984167,2953 +alps_11745,LA STIGA,,46.594167,11.990000,2786 +alps_11746,PIZ DLES CUNTURINES,,46.575833,11.977778,3064 +alps_11747,SAS D'LACIA,,46.553056,11.985000,2234 +alps_11748,SASSO DI STRIA,,46.520278,11.997778,2477 +alps_11749,MONTE CASTELLO,,46.522222,11.972778,2371 +alps_11750,PALE DI GERDA,,46.520556,11.966667,2413 +alps_11751,SETSAS,,46.519444,11.957222,2571 +alps_11752,LES PIZADES,,46.533889,11.948333,2268 +alps_11753,CIMA SIEF,,46.500833,11.954167,2424 +alps_11754,PIZ CIAMPEI,,46.530000,11.980833,2290 +alps_11755,LAGO DI VALPAROLA,,46.530278,11.987778,2140 +alps_11756,PIZ TAIBUN,,46.578611,11.989722,2928 +alps_11757,PIZ DLES DUES FORCELES,,46.578611,11.973056,2960 +alps_11758,PASSO DI GHERDENACIA,,46.579444,11.856389,2543 +alps_11759,SAS SONGHER,,46.568056,11.864444,2665 +alps_11760,COL ALT,,46.554444,11.888333,1981 +alps_11761,PIZ LA VILLA,,46.564167,11.905278,2078 +alps_11762,PRELUNGE,,46.533056,11.915556,2138 +alps_11763,MUNTEJELA,,46.595278,11.839444,2676 +alps_11764,CIAMPANI,,46.596667,11.847222,2668 +alps_11765,COL DLES SONELES,,46.585000,11.849722,2633 +alps_11766,FORCELA DE CIAMPEI,,46.576944,11.837500,2366 +alps_11767,LECH DE CIAMPEI,,46.573889,11.843889,2173 +alps_11768,SAS CIAMPEI,,46.568056,11.839444,2654 +alps_11769,SAS CIAMPAC,,46.563056,11.835278,2672 +alps_11770,PIZ DA LECH,,46.527778,11.841111,2911 +alps_11771,SAS DLES DIESC,,46.525000,11.839444,2916 +alps_11772,SAS DLES NII,,46.522778,11.836111,2904 +alps_11773,PIZES DL'VALUN,,46.517222,11.837500,2905 +alps_11774,PIZ LECH DLACE,,46.514167,11.832500,3009 +alps_11775,LECH DLACE,,46.511944,11.833056,2833 +alps_11776,LA COLONNA,,46.506111,11.842500,2525 +alps_11777,CIMA DI TEL,,46.692778,11.013056,3009 +alps_11778,CRODA DEL CLIVO,,46.693889,11.003333,3081 +alps_11779,DOSSO DEI LARICI,,46.637222,11.097500,1837 +alps_11780,GUARDIA ALTA,,46.600556,11.020278,2608 +alps_11781,MONTE SCAGLIONI,,46.605833,11.035556,2474 +alps_11782,MONTE CATINO,,46.684444,11.310000,2422 +alps_11783,GRASWAND,,46.694722,11.255278,2520 +alps_11784,SCHEIBEN SPITZ,,46.696389,11.253056,2416 +alps_11785,PIO IVIGNA,,46.692222,11.256667,2581 +alps_11786,PICCOLO IVIGNA,,46.691944,11.257778,2552 +alps_11787,PLATTINGER,,46.698333,11.278333,2615 +alps_11788,KESSELBERG SCHARTE,,46.688333,11.304722,2264 +alps_11789,GIOGO DI PIETRAMALA,,46.693056,11.287500,2129 +alps_11790,ESSENBERG SPITZ,,46.693333,11.311944,2316 +alps_11791,KLEIN MITTAGER,,46.685000,11.294722,2305 +alps_11792,ROTWAND,,46.682500,11.264167,2039 +alps_11793,KARKOFEL,,46.655556,11.302778,2114 +alps_11794,MAISER RAST,,46.660556,11.284722,2027 +alps_11795,SPIELER,,46.674444,11.277222,2080 +alps_11796,AMEISER,,46.648056,11.312222,1888 +alps_11797,MONTE RISCO,,46.635556,11.304444,2001 +alps_11798,LAUWAND SPITZ,,46.689444,11.246111,2251 +alps_11799,MONTE CANALE,,46.672778,11.328889,2137 +alps_11800,MONTE SULVO,,46.641389,11.205000,1345 +alps_11801,PIETRAROSSA,,46.621944,11.215278,1465 +alps_11802,GIOGO DELLA CROCE,,46.651944,11.292778,2086 +alps_11803,MONTE DI VERANO,,46.642778,11.273611,1941 +alps_11804,MONTE DI MELTINA,,46.607500,11.287778,1733 +alps_11805,MONTE DEL PASSO,,46.696111,11.491944,2390 +alps_11806,PLANKEN HOERNDL,,46.697778,11.465278,2383 +alps_11807,GUFLREITECK,,46.676944,11.455833,2160 +alps_11808,LAGO NERO,,46.665833,11.430833,2031 +alps_11809,MONTE DEI LAGO,,46.671667,11.427500,2146 +alps_11810,MONTE VILLANDRO,,46.658611,11.418889,2509 +alps_11811,MONTE FORCELLA SARENTINA,,46.650278,11.408333,2460 +alps_11812,ZWOELFER NOCK,,46.656667,11.428056,2430 +alps_11813,TOTENRUECKEN,,46.662778,11.439722,2221 +alps_11814,TOTENSEE,,46.655556,11.437500,2208 +alps_11815,JOECHELSBERG,,46.618333,11.392222,1564 +alps_11816,KIENBERG,,46.626944,11.381667,1413 +alps_11817,DORFERNOCK,,46.616944,11.357500,1502 +alps_11818,CIMA DEI CAMOSCI,,46.633889,11.410556,2155 +alps_11819,MONTE SELLA,,46.631667,11.461389,2161 +alps_11820,CORNO DI RENON,,46.615000,11.461389,2259 +alps_11821,GISSMANNER NOCK,,46.605278,11.418333,1924 +alps_11822,RESCIESA DI FUORI,,46.603611,11.656389,2281 +alps_11823,MONTE SOMMO,,46.647222,11.506667,1838 +alps_11824,MONTE FONDOLI,,46.652778,11.533056,1534 +alps_11825,MONTE GRAVECCIO,,46.647500,11.516944,1749 +alps_11826,MORGENNOCK,,46.662222,11.516667,1570 +alps_11827,MITTAGSNOCK,,46.661944,11.524444,1370 +alps_11828,OTTOHOEHE,,46.657500,11.651111,1460 +alps_11829,MONTE CAPPELLO,,46.653889,11.633056,1258 +alps_11830,GLANDER,,46.620278,11.621944,1883 +alps_11831,BRANDECK,,46.615278,11.641667,2010 +alps_11832,MONTE CAMPO,,46.681111,11.507222,2148 +alps_11833,MUNSCHEGG,,46.698611,11.571389,2154 +alps_11834,MONTE FANA GRANDE,,46.695000,11.751389,2545 +alps_11835,MONTE FORCA GRANDE,,46.690278,11.762778,2576 +alps_11836,GIOGO BELLO,,46.690833,11.719444,2301 +alps_11837,GIOGO DI ALFAREI,,46.698056,11.818056,2280 +alps_11838,MONTE CURTAZZES,,46.680000,11.806111,2120 +alps_11839,LAVINA BIANCA,,46.652500,11.760833,2494 +alps_11840,MONTE ROVINA,,46.653611,11.775000,2653 +alps_11841,ALPE DE COVELO,,46.651389,11.766944,2497 +alps_11842,MONTE LATINO,,46.651111,11.779167,2646 +alps_11843,RINGSPITZE,,46.648056,11.794167,2625 +alps_11844,WALSCHER RING,,46.648611,11.785278,2599 +alps_11845,WEIHERKOFEL,,46.664722,11.764444,1859 +alps_11846,SASS DE PUTIA,,46.658889,11.820000,2875 +alps_11847,COL RODELLA,,46.660556,11.757778,1975 +alps_11848,FORCA DE PUTIA,,46.650278,11.814444,2357 +alps_11849,COL DI POMA,,46.639444,11.801667,2422 +alps_11850,BRONSOI,,46.633333,11.807500,2399 +alps_11851,PASSO DI POMA,,46.635833,11.807500,2340 +alps_11852,MONTE PIRISTI,,46.635278,11.780833,1975 +alps_11853,SOBUCCIO,,46.628889,11.803333,2486 +alps_11854,CRESTA DE LONGIARU,,46.610833,11.784167,2783 +alps_11855,SAS DAL'EGA,,46.613333,11.781667,2924 +alps_11856,ODLA DI VALDUSA,,46.612222,11.776111,2942 +alps_11857,SASSO DELLA PORTA,,46.608611,11.776111,2967 +alps_11858,COL DALA CRUSO,,46.601111,11.774722,2490 +alps_11859,FURCHETA,,46.612222,11.773333,3025 +alps_11860,SAS RIGAIS,,46.609167,11.766667,3025 +alps_11861,FORCA DI MESDI,,46.604722,11.759722,2597 +alps_11862,SAS DI MESDI,,46.603611,11.758611,2762 +alps_11863,PIZ SOMPLUNT,,46.605278,11.817500,2738 +alps_11864,PIZ SOMPLUNF,,46.607778,11.812778,2374 +alps_11865,PIZ DULEDA,,46.600556,11.796111,2909 +alps_11866,MONTE DI MEZZO,,46.658333,11.706389,1807 +alps_11867,MONTE DEI GINEPRI,,46.663889,11.729444,1827 +alps_11868,COL MAGREI,,46.646667,11.747222,2168 +alps_11869,GRAN FERMEDLA,,46.602778,11.751667,2873 +alps_11870,MONTE SECEDA,,46.600556,11.725833,2518 +alps_11871,LA GRAN COSTA,,46.615278,11.710000,2298 +alps_11872,RESCIESA DI DENTRO,,46.613889,11.695278,2317 +alps_11873,FORCA DI VALLUZZA,,46.607778,11.683333,2107 +alps_11874,BAUMANNSPITZ,,46.622222,11.676389,1867 +alps_11875,ANTERSAS,,46.613611,11.840833,2384 +alps_11876,PASSO GOMA,,46.661111,11.850556,2011 +alps_11877,COL COSTACIA,,46.663333,11.854167,2199 +alps_11878,COL VARENCINCH,,46.669444,11.861944,2109 +alps_11879,FRAPES,,46.665000,11.856667,2179 +alps_11880,OEINDLES,,46.630000,11.867500,1963 +alps_11881,SOMAMUNT,,46.609444,11.861944,2366 +alps_11882,COL TORONN,,46.602500,11.857500,2540 +alps_11883,SPIZAN,,46.640000,11.883056,1835 +alps_11884,MONTE CORNO,,46.688333,11.919167,1893 +alps_11885,PLAN DE CORN,,46.681389,11.923333,1873 +alps_11886,MONTE RIT,,46.674722,11.933056,1941 +alps_11887,CRUSC DE RIT,,46.665000,11.945278,2021 +alps_11888,MONTE SADALCE,,46.685556,11.980278,2060 +alps_11889,PARES,,46.660278,11.970278,2396 +alps_11890,MONTE DELLE PECORE,,46.652778,11.977778,2346 +alps_11891,SASSO DELLE NOVE,,46.630278,11.980833,2968 +alps_11892,SASSO DELLE DIECI,,46.622222,11.960556,3026 +alps_11893,CIASTEL DE FANES,,46.620833,11.973611,2657 +alps_11894,COL TORONI,,46.620278,11.993333,2459 +alps_11895,PUNTA CAVALLO,,46.614444,11.951111,2907 +alps_11896,COSTA DELLA FOPA,,46.608889,11.979444,2452 +alps_11897,LE PAROM,,46.599444,11.986111,2311 +alps_11898,COLLE BELVEDERE,,46.621667,11.903333,1659 +alps_11899,COL ARCOGN,,46.630833,11.915556,1878 +alps_11900,COLLE DE PLA,,46.693333,11.956389,1615 +alps_11901,COL DE GALUZ,,46.641667,11.927222,1887 +alps_11902,KARKOPF,,46.786111,11.107500,2411 +alps_11903,MONTE TAVOLINO,,46.772500,11.104722,2846 +alps_11904,ULSENSPITZ,,46.760833,11.099722,2737 +alps_11905,PUNTA DELL'ONORE,,46.764167,11.077222,2756 +alps_11906,ERENSCHNEID,,46.768333,11.072500,2645 +alps_11907,MULS SPITZ,,46.781389,11.136944,2621 +alps_11908,MONTE DELLE CAPANE,,46.792778,11.141944,2407 +alps_11909,LA CLAVA,,46.772778,11.147222,2868 +alps_11910,LA PICCOLA CLAVA,,46.776389,11.153333,2816 +alps_11911,CRODA ALTA,,46.791667,11.156667,2360 +alps_11912,CIMA NERA,,46.741944,11.101389,2805 +alps_11913,IL CORNO,,46.736111,11.128889,2541 +alps_11914,SPITZHORN,,46.735278,11.137222,2528 +alps_11915,MONTE SPICO,,46.743333,11.151111,2329 +alps_11916,PUNTA ALTA,,46.732500,11.141944,2452 +alps_11917,HAHNENKAMM,,46.731389,11.149167,2231 +alps_11918,PFITSCHKOPF,,46.727500,11.154722,2126 +alps_11919,LAGO DEL BOSCO,,46.745278,11.157778,2091 +alps_11920,ROTENSPITZ,,46.752500,11.103611,2873 +alps_11921,LAGO DI VIZZE,,46.728611,11.101111,2126 +alps_11922,COLLE DEL PESCE,,46.728889,11.103333,2191 +alps_11923,OBISELL SEE,,46.741667,11.143333,2151 +alps_11924,COL DI VALLARGA,,46.736944,11.112778,2672 +alps_11925,CIMA DELLA GRAVA,,46.749444,11.038333,3147 +alps_11926,CIMA BIANCA GRANDE,,46.745556,11.036944,3278 +alps_11927,CIMA BIANCA PICCOLA,,46.744167,11.026389,3059 +alps_11928,CIMA FIAMMANTE,,46.733889,11.039722,3228 +alps_11929,CIMA ROSA,,46.723333,11.048889,3037 +alps_11930,CIGOT,,46.720000,11.060000,2998 +alps_11931,LAGO DI LATTE,,46.726111,11.071944,2540 +alps_11932,SCHIEFER SPITZ,,46.743889,11.091944,2815 +alps_11933,LANGSEE,,46.723611,11.081944,2377 +alps_11934,CIMA ROSA,,46.721111,11.093889,2625 +alps_11935,LAGO VERDE,,46.733611,11.087500,2338 +alps_11936,LAGO DELLA CASERA,,46.730278,11.098056,2117 +alps_11937,LAGO NERO,,46.740556,11.093889,2589 +alps_11938,LAGO DEL CATINO,,46.737778,11.086389,2512 +alps_11939,LAGO LAVAGNA,,46.738889,11.090278,2495 +alps_11940,CRODA NERA,,46.737500,11.001944,3170 +alps_11941,MONTE DI BIAGIO,,46.710556,11.011944,2837 +alps_11942,CRODA NERA,,46.704444,10.999444,3065 +alps_11943,GIOGO DI QUARIA,,46.716111,11.111111,2230 +alps_11944,MONTE MUTA,,46.712500,11.120833,2294 +alps_11945,LAGO SAN PANCRAZIO,,46.705556,11.285833,2119 +alps_11946,LASTE DI VERDINS,,46.701944,11.275556,2680 +alps_11947,IL PULPITO,,46.708889,11.278889,2670 +alps_11948,VIDEGGEN PLATTENSPITZE,,46.713333,11.275278,2610 +alps_11949,SCHAFKAMM,,46.718889,11.280278,2512 +alps_11950,GIOGO DI LASTE,,46.722500,11.281389,2398 +alps_11951,HONIGSPITZ,,46.730833,11.273333,2695 +alps_11952,PUNTA CERVINA,,46.737222,11.276667,2781 +alps_11953,CIMA DI PEGNO,,46.751944,11.287222,2538 +alps_11954,MONTE CROCE,,46.753333,11.279444,2445 +alps_11955,PRANTACH KOGEL,,46.760556,11.268889,2326 +alps_11956,PUNTA ALPETTA,,46.761667,11.300833,2748 +alps_11957,SCHAFBERG,,46.768333,11.305000,2598 +alps_11958,CIMA GALLINA,,46.777222,11.290000,2447 +alps_11959,HARLINGER JOCHSPITZ,,46.786111,11.278056,2407 +alps_11960,PUNTA DELLE LASTE,,46.790278,11.274722,2345 +alps_11961,KORBER EGG,,46.795278,11.270833,2179 +alps_11962,MONTE DEL PECORE,,46.780556,11.312500,2557 +alps_11963,CIMA DELL'ALPETTA,,46.773611,11.306111,2536 +alps_11964,GRUBENKOPF,,46.752500,11.316389,2606 +alps_11965,UNTERBERG,,46.785556,11.316944,2711 +alps_11966,GUARDIA ALTA,,46.791389,11.318333,2746 +alps_11967,PUNTA DI MATAZ,,46.786111,11.191944,2179 +alps_11968,MONTE SELLA,,46.745000,11.167778,2134 +alps_11969,HOHE SCHEIBE,,46.777222,11.459722,2563 +alps_11970,MUTNELLEN,,46.779444,11.476389,2659 +alps_11971,PUNTA LAVINA,,46.775278,11.485000,2660 +alps_11972,LAGO DI VALLAGA,,46.772778,11.487222,2479 +alps_11973,NEBLSPITZ,,46.783056,11.469444,2516 +alps_11974,PAULWAND,,46.786111,11.462500,2278 +alps_11975,CORNO DI TRAMIN,,46.780556,11.496667,2708 +alps_11976,SULZSPITZ,,46.791667,11.490556,2572 +alps_11977,CIMA SAN GIACOMO,,46.763056,11.491667,2742 +alps_11978,TELLERJOCH,,46.759722,11.478889,2520 +alps_11979,TELLERJOCH SPITZE,,46.760000,11.474722,2563 +alps_11980,CIMA SAN LORENZO,,46.767500,11.489444,2620 +alps_11981,PUNTA VALCENAI,,46.755556,11.491389,2662 +alps_11982,MUDATSCH,,46.794444,11.392500,2582 +alps_11983,OCHSNER,,46.798611,11.407222,2391 +alps_11984,MONTE GANDA,,46.742500,11.402778,2411 +alps_11985,CIMA DI QUAIRE,,46.752500,11.418889,2412 +alps_11986,ZIRMEGG,,46.766667,11.413333,2113 +alps_11987,SCHOENJOCHL,,46.762500,11.435278,2308 +alps_11988,POSCHBERG,,46.767222,11.441667,2278 +alps_11989,TEUFENTALER SPITZ,,46.771389,11.447222,2337 +alps_11990,LAGO VALDURNA,,46.744167,11.446389,1535 +alps_11991,CIMA DELL'ALPE,,46.797222,11.349444,2477 +alps_11992,SEEBLSPITZ,,46.763333,11.339722,2331 +alps_11993,HUHNERSPIEL,,46.786111,11.375556,2258 +alps_11994,CIMA DELLE LASTE,,46.723611,11.465278,2432 +alps_11995,GEDRUMSPITZ,,46.714167,11.482222,2569 +alps_11996,PLANKENHORN,,46.710000,11.473333,2589 +alps_11997,KASSIANSEE,,46.707500,11.495556,2469 +alps_11998,CIMA SAN CASSIANO,,46.708889,11.496667,2581 +alps_11999,KALLMAN SPITZ,,46.723056,11.383611,2398 +alps_12000,HURLER,,46.734722,11.395278,2405 +alps_12001,LAGO RODELLA,,46.715278,11.378333,2398 +alps_12002,CIMA RODELLA,,46.713611,11.381111,2422 +alps_12003,LEITERSPITZ,,46.707500,11.379444,2375 +alps_12004,PUNTA QUAIRA,,46.761111,11.563333,2517 +alps_12005,CIMA DELLA VALANGA,,46.758889,11.553333,2539 +alps_12006,KASEBACHER HOERNDL,,46.756389,11.543333,2578 +alps_12007,MAERZENHOERNDL,,46.756667,11.538611,2552 +alps_12008,MUCKLEITEN,,46.751667,11.518056,2562 +alps_12009,MONTE LIVOLO,,46.747222,11.509167,2593 +alps_12010,MONTE LIRA,,46.737500,11.506944,2542 +alps_12011,CORNO DEL CEPPO,,46.733056,11.511944,2590 +alps_12012,LAGO NERO,,46.747778,11.504722,2555 +alps_12013,PFANNE SPITZE,,46.749444,11.501389,2620 +alps_12014,EISKOEFELE,,46.713056,11.552500,2421 +alps_12015,KUEHBERG,,46.712222,11.556111,2429 +alps_12016,MONTE DEL PASCOLO,,46.706667,11.571389,2436 +alps_12017,LAGO RODELLA,,46.708056,11.578611,2555 +alps_12018,CIMA SAN LORENZO,,46.712500,11.518889,2483 +alps_12019,CORNO PLANCA,,46.718333,11.511111,2543 +alps_12020,CIMA DI CAPRA,,46.724444,11.511111,2514 +alps_12021,GISS LACKEN,,46.722222,11.514722,2379 +alps_12022,CIMA SAN CASSIANO,,46.708889,11.497222,2574 +alps_12023,RITZLAR,,46.706389,11.500556,2529 +alps_12024,MONTE DEI VITELLI,,46.729444,11.538889,1920 +alps_12025,LAGHI GELATI,,46.720833,11.551111,1957 +alps_12026,GISSPLATTE,,46.719444,11.528056,2323 +alps_12027,SCHEIBENKOFEL,,46.714167,11.591111,2252 +alps_12028,DOSSO LIVES,,46.761944,11.591944,1894 +alps_12029,ALBESKOFEL,,46.753333,11.590833,1975 +alps_12030,CIMA DEL BERSAGLIO,,46.791111,11.527778,2378 +alps_12031,MONTE DELLA CROCE,,46.780278,11.529444,2560 +alps_12032,PUNTA PRADISACCO,,46.781111,11.550833,2335 +alps_12033,MONTE CASURA,,46.781944,11.542778,2450 +alps_12034,MARCHSPITZE,,46.771389,11.516667,2544 +alps_12035,FORCA DI CAPRE,,46.776667,11.507500,2437 +alps_12036,MONTE SELLA,,46.775000,11.574167,2053 +alps_12037,MONTE DEL BERSARIO,,46.766111,11.606111,1967 +alps_12038,CIMA LASTA,,46.762778,11.808611,2194 +alps_12039,MONTE CAMPIGLIO,,46.752778,11.825000,2190 +alps_12040,MONTE GHEZZO,,46.788056,11.731389,1744 +alps_12041,MONTE MURO,,46.704167,11.821389,2332 +alps_12042,MONTE QUAIRA,,46.708889,11.766111,2269 +alps_12043,MONTE FANA PICCOLA,,46.701111,11.752500,2434 +alps_12044,MONTE DI MEZZO,,46.708611,11.752222,2151 +alps_12045,MONTE TELEGRAFO,,46.701111,11.732222,2486 +alps_12046,LA PLOSE,,46.716389,11.733333,2293 +alps_12047,DREIFINGERSPITZ,,46.709167,11.991667,2479 +alps_12048,STEGENER BERG,,46.798889,11.913056,993 +alps_12049,SONNENBURGER KOPF,,46.788889,11.903611,973 +alps_12050,KUEHBERGL,,46.787778,11.936944,1013 +alps_12051,STURMBUEHEL,,46.785278,11.911389,832 +alps_12052,ONSBERG,,46.776389,11.911389,939 +alps_12053,BUBENBUEHEL,,46.774444,11.916667,928 +alps_12054,PROSL,,46.771944,11.900833,956 +alps_12055,BERNTALER BUEHEL,,46.768889,11.906389,941 +alps_12056,CIOMAGNE,,46.745833,11.933611,2039 +alps_12057,HIRSCHLACKE,,46.745833,11.939167,1993 +alps_12058,SPITZHORN,,46.743889,11.966667,2173 +alps_12059,CORN DE PEZES,,46.740000,11.917778,1998 +alps_12060,MOOSENER BERG,,46.742778,11.903889,1968 +alps_12061,PLAN DE CORONES,,46.738889,11.958611,2275 +alps_12062,PASSO DI FURCIA,,46.723611,11.970000,1759 +alps_12063,PIZ DE CORDA,,46.719167,11.953056,1780 +alps_12064,PIZ DA PERES,,46.711944,11.979722,2507 +alps_12065,LIENSBERG,,46.793611,11.868056,1025 +alps_12066,KIENBERG,,46.780278,11.858611,1222 +alps_12067,WEGISSER,,46.762500,11.872500,1233 +alps_12068,KRINNER KOPF,,46.760000,11.880278,1387 +alps_12069,COL DAL LE,,46.715000,11.839444,2175 +alps_12070,COL DELLA VEDLA,,46.711944,11.846111,2100 +alps_12071,LOTHENER KOEPFL,,46.797778,11.880556,1118 +alps_12072,PIZ DI PLAIES,,46.705000,11.896944,1700 +alps_12073,WILDSEE SPITZ,,46.858333,11.125833,2580 +alps_12074,LE SEI PUNTE,,46.852778,11.126944,2677 +alps_12075,GRINOLSPITZ,,46.847778,11.112778,2754 +alps_12076,PUNTA DELLE LASTE,,46.861667,11.125278,2517 +alps_12077,KARRENBERG,,46.873056,11.131111,2249 +alps_12078,MONTE PANCA,,46.890278,11.103889,2833 +alps_12079,TRAUNSBERG,,46.848333,11.126667,2776 +alps_12080,SCHEIBKOPF,,46.838889,11.120833,2817 +alps_12081,MONTE SCABRO,,46.828611,11.113889,2926 +alps_12082,CRODA BIANCA,,46.835278,11.141667,2399 +alps_12083,GROSSES HORN,,46.831667,11.111111,2884 +alps_12084,EBENER FIRST,,46.826111,11.101111,3032 +alps_12085,CRODA DEL LAGO,,46.822500,11.085833,3288 +alps_12086,GLAITNER HOCHJOCH,,46.841389,11.246389,2389 +alps_12087,PICCOLA PUNTA DI MONTECROCE,,46.850278,11.230833,2518 +alps_12088,PUNTA ALTACROCE,,46.854722,11.214444,2743 +alps_12089,CRODA BIANCA,,46.854444,11.203056,2606 +alps_12090,GUARDIA ALTA,,46.852500,11.196944,2617 +alps_12091,ZIRMAIDSPITZ,,46.870278,11.207778,2798 +alps_12092,LA BIANCA,,46.875556,11.210556,2822 +alps_12093,KREUZJOCH,,46.855833,11.194444,2535 +alps_12094,MONTE GANDA,,46.864167,11.180278,2330 +alps_12095,PFAUSES,,46.870278,11.178889,2422 +alps_12096,PASSO DI RENA,,46.882778,11.205833,2571 +alps_12097,MONTE CAMPANA,,46.888056,11.234167,2620 +alps_12098,MONTE RINNA,,46.889722,11.201389,2824 +alps_12099,LAGO MALO,,46.848611,11.234167,2313 +alps_12100,MONTE DELLA POZZA,,46.804167,11.308333,2495 +alps_12101,PUNTA DI TRAMONTANA,,46.810556,11.288889,2106 +alps_12102,PASSO GIOVO,,46.838333,11.324722,2090 +alps_12103,RINNER SATTEL,,46.841111,11.296111,2031 +alps_12104,FLECKNER,,46.841389,11.269722,2331 +alps_12105,SAXENLE,,46.841944,11.265833,2358 +alps_12106,MONTE TALLONE GRANDE,,46.883056,11.259722,2669 +alps_12107,RUDERER BERG,,46.892500,11.263611,2486 +alps_12108,PUNTA ALTA,,46.880833,11.283889,2424 +alps_12109,SASSO DI MARETTA,,46.876944,11.316111,2194 +alps_12110,KLEINE FERSE,,46.881111,11.265833,2487 +alps_12111,EINACHT SPITZ,,46.886389,11.288889,2300 +alps_12112,CIMA DEL INCENDIO,,46.898611,11.265000,2445 +alps_12113,SCHIEFERSTOAN,,46.888056,11.494444,1847 +alps_12114,GSCHLIESSEGG,,46.889444,11.476667,1670 +alps_12115,MONTE CAPO,,46.866667,11.424722,1797 +alps_12116,MANDLSEIT JOCH,,46.852222,11.434167,2185 +alps_12117,CIMA DI STILVES,,46.840833,11.442500,2422 +alps_12118,HOCHEGG,,46.850556,11.452500,1963 +alps_12119,CRODA BIANCA,,46.844167,11.456389,2205 +alps_12120,CIMA SPECOLA,,46.833611,11.433889,2376 +alps_12121,GANSEKRAGEN,,46.819444,11.435000,2322 +alps_12122,NIEDECK,,46.804722,11.466389,2304 +alps_12123,MONTE LASTE,,46.809722,11.455833,2367 +alps_12124,GIOGO DI COSTA,,46.864167,11.381944,1799 +alps_12125,ETSCHENSPITZ,,46.827778,11.405556,2430 +alps_12126,CIMA SALCETO,,46.840556,11.402500,2105 +alps_12127,PUNTA ROSSA,,46.818056,11.415833,2441 +alps_12128,GARTLSPITZ,,46.806944,11.399444,2586 +alps_12129,CORNO BIANCO DI PENNES,,46.801944,11.395556,2705 +alps_12130,MONTE VERSILIO,,46.815833,11.381667,2364 +alps_12131,HOFERSPITZ,,46.823056,11.378056,2378 +alps_12132,RAST,,46.830000,11.377222,2249 +alps_12133,GIOGOBELLO,,46.838611,11.378611,2019 +alps_12134,OTSCHSPITZ,,46.803611,11.370833,2590 +alps_12135,GASCHEIBEN SPITZ,,46.812222,11.362222,2452 +alps_12136,LASTA ALTA,,46.828056,11.349722,2546 +alps_12137,CIMA DEL LAGO,,46.803611,11.341944,2434 +alps_12138,PUNTA DI MONTE GIOVO,,46.834167,11.334167,2480 +alps_12139,CIMA DELLA CAPRA,,46.863333,11.644444,2641 +alps_12140,FELDSPITZ,,46.865000,11.649722,2581 +alps_12141,KURZKOFEL,,46.871389,11.649167,2591 +alps_12142,FENSTERLE KOFEL,,46.876667,11.651667,2564 +alps_12143,WIESER KRAGEN,,46.881111,11.651944,2619 +alps_12144,LAGO GRANDE,,46.875278,11.656944,2271 +alps_12145,MONTE CAVERNONE,,46.885000,11.647778,2698 +alps_12146,SEEFELD SPITZ,,46.888611,11.650000,2715 +alps_12147,CIMA DI SAN PAOLO,,46.890278,11.661111,2695 +alps_12148,KORSPITZ,,46.886667,11.661389,2645 +alps_12149,RAUCHBACHSPITZ,,46.885833,11.663056,2610 +alps_12150,LAGO PICCOLO,,46.888056,11.655278,2514 +alps_12151,LAGO DI MEZZO,,46.886667,11.654722,2501 +alps_12152,RENSENSPITZ,,46.859722,11.583056,2473 +alps_12153,MUTASPITZ,,46.863889,11.587222,2596 +alps_12154,CIMA PIATTA,,46.867222,11.591389,2669 +alps_12155,DREIHORN SPITZ,,46.870833,11.590556,2666 +alps_12156,GRANTSPITZ,,46.874722,11.592500,2653 +alps_12157,SCHWARZENSTOAN,,46.878056,11.593889,2696 +alps_12158,NORNSPITZ,,46.880833,11.592500,2718 +alps_12159,NORNSEE,,46.879167,11.590833,2568 +alps_12160,CIMA SELLA,,46.885556,11.574444,2650 +alps_12161,DREILANDER SPITZ,,46.886944,11.580833,2666 +alps_12162,BLAUER STOAN,,46.883889,11.588333,2584 +alps_12163,KALKGRUBEN SPITZ,,46.894444,11.586111,2738 +alps_12164,MARBLSEE,,46.883333,11.601389,2397 +alps_12165,CIMA DEL COVOLO,,46.871389,11.612500,2261 +alps_12166,RIBIGEN SPITZ,,46.898056,11.641389,2939 +alps_12167,GIOGO DI TRENS,,46.888056,11.522778,2387 +alps_12168,FLANER WIESEN,,46.860556,11.521667,1307 +alps_12169,CIMA DI SENGES,,46.897500,11.538333,2368 +alps_12170,NOATKOEPFL,,46.837778,11.564167,2034 +alps_12171,CIMA DI CAMPO,,46.829722,11.563889,2088 +alps_12172,DOSSO,,46.841667,11.553333,2021 +alps_12173,MONTE CAMPO QUAIRA,,46.821944,11.603056,2043 +alps_12174,STOANAMANDL,,46.833056,11.600000,2118 +alps_12175,GANSEBICHL,,46.842500,11.592778,2100 +alps_12176,SOELDEDE EGG,,46.816944,11.596667,1790 +alps_12177,SCHELLENBERG,,46.854167,11.589444,2355 +alps_12178,MONTE ONES,,46.826667,11.505556,1953 +alps_12179,LAGO DI PONTELLETTO,,46.805556,11.503611,1847 +alps_12180,TERNER NOCK,,46.876944,11.806667,2596 +alps_12181,REISNOCK,,46.878611,11.808889,2663 +alps_12182,KLEINER NOCK,,46.878889,11.831667,2114 +alps_12183,MUTENOCK,,46.867778,11.823333,2484 +alps_12184,SEEFELDSEE,,46.876667,11.822222,2140 +alps_12185,GRINTH,,46.898611,11.748889,2620 +alps_12186,MONTE FLEMM,,46.897500,11.766389,2696 +alps_12187,PICCOLO DEL PASSO,,46.895278,11.789444,2671 +alps_12188,KOENIGSWAND,,46.888889,11.791111,2742 +alps_12189,MONTE GRIGIO,,46.886111,11.788889,2827 +alps_12190,KEMPSPITZ,,46.878611,11.792500,2704 +alps_12191,NEBLNOCK,,46.895556,11.753056,2615 +alps_12192,LAGO DEL PASSO,,46.888333,11.769722,2408 +alps_12193,GOLDSEE,,46.887500,11.767778,2440 +alps_12194,MONTE GRUPPO,,46.882778,11.769444,2809 +alps_12195,GAMSBURG,,46.877500,11.772500,2694 +alps_12196,LAGO DI PAUSA,,46.877500,11.780000,2303 +alps_12197,CIMA DI TERENTO,,46.870278,11.755278,2738 +alps_12198,DONNERSCHLAG,,46.873611,11.775833,2585 +alps_12199,LAGO CAMPOFOSSO,,46.869444,11.775278,2442 +alps_12200,KOMPFOSSPITZ,,46.868333,11.778611,2561 +alps_12201,IL GIOGO,,46.860000,11.816389,2405 +alps_12202,MONTE DI MARCA,,46.832222,11.743889,1421 +alps_12203,COLLI IN PUSTERIA,,46.823889,11.798056,1304 +alps_12204,SCHELLEBERG,,46.877778,11.665556,2531 +alps_12205,MONTE CUZZO,,46.859167,11.686667,2510 +alps_12206,MONTE VAL DI MEZZO,,46.870556,11.677222,2568 +alps_12207,STOLLWIESE,,46.835000,11.694444,1827 +alps_12208,KLEIN GITSCH,,46.854444,11.673611,2262 +alps_12209,PUNTA DELLA CASCATA,,46.897500,11.994167,2652 +alps_12210,BOLSSBERG,,46.881111,11.995000,2619 +alps_12211,HUEHNERSPIEL,,46.881667,11.924722,2066 +alps_12212,RIXNER NOCK,,46.876389,11.913056,2205 +alps_12213,KANDELKOPF,,46.874444,11.911667,2200 +alps_12214,CIMA DEL VENTO,,46.863333,11.902500,2418 +alps_12215,LAGO DI VENGA,,46.875278,11.889444,1881 +alps_12216,CIMA DEI TUONI,,46.871944,11.895000,2299 +alps_12217,KLEINER NOCK,,46.878889,11.831667,2114 +alps_12218,KNAPPNOCK,,46.876111,11.866667,2132 +alps_12219,CIMA DODICI,,46.870556,11.844444,2351 +alps_12220,KALTWASSER SEE,,46.866667,11.841667,2244 +alps_12221,CIME DI POZZO,,46.864444,11.863333,2438 +alps_12222,LAGO VERDE,,46.862222,11.858611,2258 +alps_12223,KNAPPHENNE,,46.869722,11.868889,2277 +alps_12224,CIMA VALPERNA,,46.865556,11.882778,2450 +alps_12225,BAERNTALER SEEN,,46.864722,11.874167,2297 +alps_12226,GIOGO DI RIOMOLINO,,46.866111,11.996667,2441 +alps_12227,MONTE SOMMO,,46.854722,11.895833,2396 +alps_12228,CIME DI POZZO,,46.864167,11.852500,2387 +alps_12229,KNARLING,,46.862500,11.836111,2316 +alps_12230,DOSSO DEL FUMO,,46.849167,11.913333,2170 +alps_12231,LAGO NERO PICCOLO,,46.909722,11.192500,2609 +alps_12232,KLEINER EGETENSEE,,46.907222,11.211667,2443 +alps_12233,MOARER EGETENSEE,,46.911389,11.216389,2468 +alps_12234,HINTERER SENNER EGETENSEE,,46.918889,11.209167,2647 +alps_12235,SENNER EGETENSEEN,,46.920278,11.208056,2653 +alps_12236,LAGO TORBO,,46.932778,11.225833,2344 +alps_12237,MOARERSPITZ,,46.915000,11.226111,2806 +alps_12238,KRAPENKAR SPITZ,,46.928889,11.236111,2707 +alps_12239,SPRINZEN WAND,,46.903333,11.202778,2897 +alps_12240,CIMA DI LAGO NERO,,46.914167,11.200833,2988 +alps_12241,MONTE TUMOLO,,46.920000,11.200278,3033 +alps_12242,DOSSO,,46.928056,11.202222,3185 +alps_12243,IL CAPRO,,46.931111,11.197778,3251 +alps_12244,MONTE REALE,,46.936944,11.185833,3132 +alps_12245,PARETE ALTA,,46.933889,11.207500,3190 +alps_12246,SCHNEEBERGER WEISSEN,,46.908611,11.181111,2961 +alps_12247,EGETSEE KOPF,,46.914444,11.204722,2927 +alps_12248,CRODA DELLA CINTOLA,,46.904722,11.166389,2858 +alps_12249,HOFMANN SPITZ,,46.942778,11.174722,3113 +alps_12250,SIGNAL GIPFEL,,46.968056,11.192778,3393 +alps_12251,CIMA DELL'ACCLA,,46.965278,11.244722,3194 +alps_12252,CIMA DEL LAGO TORBO,,46.939444,11.236111,2477 +alps_12253,MONTE MURO,,46.936944,11.310556,2628 +alps_12254,LAGO DEL FORNO,,46.953611,11.253333,2456 +alps_12255,ROCHOL SPITZ,,46.962500,11.250278,3072 +alps_12256,PUNTA LORENZO,,46.958333,11.263611,2924 +alps_12257,RIDNAUNER SCHNEESPITZ,,46.951667,11.270556,2850 +alps_12258,MONTE ALTO,,46.949444,11.279722,2867 +alps_12259,HOCHTROG SPITZ,,46.951111,11.283889,2823 +alps_12260,WINKELJOCH SPITZ,,46.945833,11.283611,2794 +alps_12261,PUNTA ELLES,,46.943056,11.294722,2661 +alps_12262,MARATSCH SPITZ,,46.943333,11.315556,2648 +alps_12263,PUTZEN,,46.954167,11.312778,2363 +alps_12264,CIMA DEL TEMPO,,46.931389,11.320556,2709 +alps_12265,CIMA NOVALE,,46.929167,11.498056,2490 +alps_12266,SAUN,,46.913889,11.482222,2085 +alps_12267,ROTSPITZ,,46.974722,11.365556,2605 +alps_12268,KOGBERG,,46.978889,11.345833,2357 +alps_12269,FLANER JOECHL,,46.926389,11.409444,1936 +alps_12270,MONTE CAVALLO,,46.914167,11.383889,2189 +alps_12271,SCHLEYER WAND,,46.928889,11.384167,2292 +alps_12272,SCHLEYER BERG,,46.932222,11.388056,2212 +alps_12273,TELFER WEISSEN,,46.921667,11.351667,2588 +alps_12274,CIMA DEL TEMPO,,46.926944,11.336667,2567 +alps_12275,WASTENEGG,,46.935833,11.365556,2027 +alps_12276,LAGO DI NOVALE,,46.928056,11.525000,1365 +alps_12277,PUNTA BIANCA,,46.938333,11.501944,2714 +alps_12278,CIMA GALLINA,,46.944444,11.502222,2748 +alps_12279,CIMA ROLLE,,46.946389,11.507778,2800 +alps_12280,PUNTA DEL TASSO,,46.954167,11.501944,2645 +alps_12281,MONTE GRANDE,,46.926389,11.564444,2701 +alps_12282,FINSTERSTERN,,46.908333,11.561389,2700 +alps_12283,OCHSEN KOPF,,46.908889,11.556667,2656 +alps_12284,FINSTERSTERN,,46.907500,11.548889,2537 +alps_12285,UEBERSEIL SPITZE,,46.917222,11.545000,2493 +alps_12286,LEITNER WAND,,46.922778,11.542222,2361 +alps_12287,HOCHSAGE,,46.950556,11.648611,2778 +alps_12288,LANGSEE,,46.953611,11.638889,2465 +alps_12289,FELBE,,46.946111,11.630000,2849 +alps_12290,CIMA GRAVA,,46.938889,11.614444,3059 +alps_12291,CIMA RIVA,,46.937778,11.599444,2766 +alps_12292,CRODA DELLA PORTA,,46.943889,11.576944,2640 +alps_12293,CIMA DODICI,,46.944722,11.602500,2690 +alps_12294,VIEDSPITZ,,46.947500,11.602222,2583 +alps_12295,PICCO DELLA CROCE,,46.912500,11.593333,3132 +alps_12296,CIMA DI PIAMBELLO,,46.906944,11.583611,2990 +alps_12297,SCHWARZE LACKE,,46.902778,11.585833,2747 +alps_12298,LAGO SELVAGGIO,,46.899722,11.591667,2532 +alps_12299,CIMA DEL LAGO,,46.907500,11.571667,2943 +alps_12300,CIMA DELLA VISTA,,46.907778,11.603056,2988 +alps_12301,CIMA DELLA RENA,,46.927222,11.613611,2755 +alps_12302,PFANNESPITZ,,46.921389,11.626667,2709 +alps_12303,TESTS D'ASINO,,46.919722,11.632500,2839 +alps_12304,CIMA VALMALA,,46.913889,11.637778,3022 +alps_12305,PUNTA RIVA,,46.926111,11.623056,2787 +alps_12306,CRODA ROSSA,,46.904722,11.643056,2928 +alps_12307,CRODA TISCIA,,46.924167,11.581667,2731 +alps_12308,PUNTA ROSSA,,46.952778,11.660556,2949 +alps_12309,LAGO SILVELLA,,46.944722,11.662222,2485 +alps_12310,WEITENBERGSEE,,46.946111,11.650000,2496 +alps_12311,PFLETZEN SPITZ,,46.962778,11.654444,2769 +alps_12312,SAMECK,,46.985000,11.609167,2134 +alps_12313,HINTER LANGSPITZ,,46.955556,11.636111,2640 +alps_12314,VORDER LANGSPITZ,,46.958889,11.636389,2562 +alps_12315,CIMA VALLACCIA,,46.972778,11.524444,2566 +alps_12316,CIMA DELLA STANGA,,46.958889,11.512778,2388 +alps_12317,UNTER FLATSCHSPITZE,,46.974722,11.517778,2463 +alps_12318,CIMA DI SELLA,,46.980000,11.814167,3084 +alps_12319,CIMA DEL PRETE,,46.970833,11.814167,2973 +alps_12320,CIMA DEI CAMOSCI,,46.966111,11.807500,2869 +alps_12321,LAGO DI NEVES,,46.952778,11.779167,1856 +alps_12322,HOCHFENER,,46.977778,11.717778,3470 +alps_12323,HINTER WEISSPITZ,,46.976667,11.710278,3395 +alps_12324,SEEGRUBE,,46.961667,11.772778,2349 +alps_12325,PUNTA BIANCA BASSA,,46.958333,11.736111,3263 +alps_12326,POCKSHORN,,46.953889,11.723611,3021 +alps_12327,MONTE GUARDIA ALTA,,46.950833,11.719444,3068 +alps_12328,KLEIN MAGSTEIN,,46.935833,11.715833,2522 +alps_12329,GSCHIRN,,46.927222,11.711667,2335 +alps_12330,CIMA CADINI,,46.940278,11.739722,2888 +alps_12331,MAGSTEINWIPFEL,,46.944167,11.709722,2775 +alps_12332,LAGO PUNTA DI GHIACCHIO,,46.940000,11.727778,2351 +alps_12333,SCHRECKWAND,,46.943611,11.798056,2508 +alps_12334,SEEBERGI,,46.932778,11.763056,2705 +alps_12335,SEEBERG SEEN,,46.935278,11.749444,2420 +alps_12336,EISBRUGGSPITZ,,46.933056,11.741667,2787 +alps_12337,SCOGLIO ROSSO,,46.923889,11.740278,2874 +alps_12338,SCHAFFLAHNER,,46.922222,11.725556,2624 +alps_12339,SCOGLIO NERO,,46.918333,11.738056,2744 +alps_12340,MONTE DENGOLO,,46.911389,11.737500,2698 +alps_12341,BLAUWAND,,46.908333,11.738611,2584 +alps_12342,RIEGLER,,46.916111,11.713611,2221 +alps_12343,FLEMMSEE,,46.908611,11.771944,2066 +alps_12344,HPRNDLE,,46.905000,11.741667,2603 +alps_12345,GRINTH,,46.898333,11.748889,2620 +alps_12346,MONTE FLEMM,,46.897500,11.766389,2696 +alps_12347,CIMA DELLE PECORE,,46.952222,11.812778,2703 +alps_12348,CIMA DEI COVONI,,46.945833,11.812778,2725 +alps_12349,TRISTENSEE,,46.949167,11.822222,2344 +alps_12350,SEEBERGSEE,,46.938611,11.803333,2215 +alps_12351,ZINSNOCK,,46.919444,11.830278,2479 +alps_12352,SASSO TONDO,,46.931667,11.825833,2551 +alps_12353,CRODA ROSSA,,46.950000,11.688056,2930 +alps_12354,MONTE STRETTO,,46.950833,11.677222,2816 +alps_12355,PUNTA DI DAN,,46.943333,11.686944,2806 +alps_12356,ROTALPE,,46.946667,11.687778,2852 +alps_12357,CRODA BIANCA,,46.932222,11.686944,2497 +alps_12358,MONTE BOTTE,,46.927778,11.670556,2537 +alps_12359,VORDER WEISSPITZ,,46.973056,11.702500,3274 +alps_12360,BLAUER KOFEL,,46.968889,11.683056,2867 +alps_12361,ROTE WANDE,,46.968611,11.690278,2995 +alps_12362,TSCHOREN,,46.900556,11.671111,2519 +alps_12363,CIMA GALLINA,,46.966944,11.980833,2383 +alps_12364,MONTE FUMO,,46.958611,11.997500,2653 +alps_12365,LAGO CHIUSETTA,,46.965556,11.993611,2162 +alps_12366,SASSO DELLA CROCE,,46.998611,11.903611,2420 +alps_12367,ROTBERG,,46.987500,11.913056,2003 +alps_12368,KLEINFADNLER,,46.982778,11.895278,2302 +alps_12369,MONTE LUPO,,46.973889,11.901944,2050 +alps_12370,POJENSPITZ,,46.954444,11.973056,2453 +alps_12371,SCHARHAGGEN,,46.986667,11.861944,2649 +alps_12372,HANTIGEN KLAMMSPITZ,,46.976667,11.871389,2574 +alps_12373,SCHAFBRETTER SPITZ,,46.972778,11.874444,2520 +alps_12374,MONTEBELLO,,46.966944,11.883611,2273 +alps_12375,VORDER HORNSPITZ,,46.993056,11.836667,3145 +alps_12376,AUSSERE GRUNEPLATE,,46.985000,11.839722,2800 +alps_12377,GELENKNOCK,,46.980278,11.840833,2882 +alps_12378,MOSELENOCK,,46.974444,11.845278,2712 +alps_12379,GROSSFADNLER,,46.993611,11.881944,2764 +alps_12380,ZWILCHER,,46.998056,11.880833,2846 +alps_12381,GOLEITKOPF,,46.988056,11.889167,2510 +alps_12382,STEINSTRAICHEN,,46.990000,11.885833,2602 +alps_12383,MITTERBACH SEE,,46.991389,11.850833,2533 +alps_12384,IL DOSSO GRANDE,,46.926944,11.888611,2400 +alps_12385,SEEWASSERNOCK,,46.921667,11.885000,2433 +alps_12386,HENNE,,46.917500,11.861944,2474 +alps_12387,FADNER,,46.918611,11.855556,2457 +alps_12388,MONTE CORNO,,46.916111,11.852778,2475 +alps_12389,WURMTALER SPITZE,,46.916944,11.837500,2343 +alps_12390,CIMA DI SASSALTO,,46.951111,11.966667,2401 +alps_12391,COL PICCOLO,,46.942222,11.978889,2276 +alps_12392,IL DOSSO PICCOLO,,46.931389,11.900000,2227 +alps_12393,HUEHNERSPIEL,,46.924167,11.912222,2110 +alps_12394,MONTE SPICO,,46.917778,11.890833,2517 +alps_12395,TRAIERSEE,,46.919444,11.914722,2046 +alps_12396,SCHREINSEE,,46.955278,11.986389,2325 +alps_12397,SPEIKWAND,,46.944444,11.997222,2503 +alps_12398,PUNTA CASCATA,,46.897500,11.994167,2652 +alps_12399,MONTE AGNELLEZZE,,46.184167,12.004444,2140 +alps_12400,MONTE PRABELLO,,46.174167,12.014722,2073 +alps_12401,COL DORIN,,46.167778,12.014444,2110 +alps_12402,MONTE CIMIA,,46.155000,12.004167,2051 +alps_12403,MONTE PIZZOCCO,,46.140000,12.009722,2186 +alps_12404,SASS DEI GNEI,,46.142500,12.023611,1875 +alps_12405,MONTE ALTO,,46.197222,12.081944,2069 +alps_12406,CIMON DI PERALORA,,46.189444,12.079444,1978 +alps_12407,PALA ALTA,,46.195833,12.148889,1933 +alps_12408,MONTE PERON,,46.176667,12.135278,1486 +alps_12409,MONTE SPERONE,,46.155000,12.066389,1262 +alps_12410,MONTE DOLADA,,46.193611,12.335833,1938 +alps_12411,CAPEL GRANDE,,46.198056,12.441944,2071 +alps_12412,MONTE VENALE,,46.185556,12.443889,2212 +alps_12413,CIMA PIAI,,46.180000,12.446389,2184 +alps_12414,MONTE MESSER,,46.174444,12.455278,2230 +alps_12415,MONTE I MURI,,46.163611,12.475833,2049 +alps_12416,MONTE SESTIER,,46.157222,12.490556,2084 +alps_12417,MONTE CAVALLO,,46.130000,12.496667,2251 +alps_12418,CIMON DI PALANTINA,,46.125000,12.491111,2190 +alps_12419,MONTE COLOMBERA,,46.118889,12.492222,2066 +alps_12420,MONTE TREMOL,,46.115833,12.497500,2007 +alps_12421,MONTE FARA,,46.178611,12.638056,1342 +alps_12422,PALA D'ALTEI,,46.157222,12.597778,1528 +alps_12423,MONTE CASTELLAT,,46.146111,12.564444,1641 +alps_12424,PALA FONTANA,,46.131667,12.565000,1637 +alps_12425,MONTE CAULANA,,46.146111,12.504444,2068 +alps_12426,CIMON DEI FURLANI,,46.127500,12.502778,2183 +alps_12427,CASTELLETTO,,46.295278,12.133333,2367 +alps_12428,SPIZ DI MOSCHESIN,,46.291111,12.134444,2315 +alps_12429,CASTELLO DI MOSCHESIN,,46.296944,12.132778,2499 +alps_12430,FORCA DEL MOSCHESIN,,46.285833,12.136667,1940 +alps_12431,COL PAN D'ORS,,46.286944,12.116389,1729 +alps_12432,CIME DE LE BALANZOLE,,46.285278,12.145000,2080 +alps_12433,LE PRESON,,46.270556,12.163889,2349 +alps_12434,CIME DE ZITA,,46.274722,12.158333,2465 +alps_12435,CIMA DI MEZZO,,46.273333,12.156944,2451 +alps_12436,CIMA SUD,,46.271111,12.156667,2450 +alps_12437,TALVENA,,46.266111,12.155833,2542 +alps_12438,CIME DE LE ROSSE,,46.258056,12.137778,2152 +alps_12439,ZEST DEL VESCOVA,,46.264167,12.140833,2379 +alps_12440,PALE BELE,,46.265556,12.143056,2380 +alps_12441,CIME DE LE ROSSE,,46.257500,12.131944,1983 +alps_12442,CIMA DE SCALABRAS,,46.271944,12.125556,1865 +alps_12443,MONTE VALARAZ,,46.265278,12.112222,1883 +alps_12444,PALE DEL FIEN,,46.267222,12.119722,1846 +alps_12445,MONTE CARTIFAI,,46.254444,12.101111,1344 +alps_12446,MONTE ZELO,,46.263333,12.092500,2083 +alps_12447,CIMA DE LA GIAZA,,46.266667,12.146944,2415 +alps_12448,CIME DEI PEZ,,46.253611,12.139167,2075 +alps_12449,SASS DEI GAI,,46.249722,12.128611,1651 +alps_12450,PRADUSEL,,46.246111,12.121111,1501 +alps_12451,PALE DE I CAMORZ,,46.234167,12.138611,1788 +alps_12452,PALA LONGA,,46.234167,12.158056,1903 +alps_12453,CRESTA DEL CASTELAZ,,46.235556,12.155000,1838 +alps_12454,MONTE CORO,,46.230278,12.140556,1985 +alps_12455,CORNO DE VAL,,46.264167,12.086944,2078 +alps_12456,CIMA DE COPEGN,,46.267778,12.081944,1933 +alps_12457,CIMA DEL CASTILLO,,46.296944,12.078333,1285 +alps_12458,COL DE DIEGO,,46.296667,12.051944,1200 +alps_12459,COLVIGNAS,,46.291667,12.042222,1053 +alps_12460,COLLE FAUZE,,46.289444,12.079444,1128 +alps_12461,COLLE DI TOL,,46.285833,12.085278,1065 +alps_12462,COL DE FOIA,,46.273889,12.042778,752 +alps_12463,COL DEL MUSS,,46.268889,12.016667,891 +alps_12464,CIMA DI PRADUSEL,,46.264444,12.070556,1687 +alps_12465,CIMA DELLA BUCA,,46.262778,12.065833,1530 +alps_12466,COL NEGRO,,46.258611,12.100278,1800 +alps_12467,COL PIZON,,46.238333,12.081389,1482 +alps_12468,COL DI MEZ,,46.237222,12.069444,1429 +alps_12469,LA ZIMATA,,46.236389,12.049722,1882 +alps_12470,PIZ DE L'OMO,,46.234722,12.049722,1912 +alps_12471,PIZZON DI COSTELE,,46.235278,12.038889,1546 +alps_12472,PIZZO DI MEZZO,,46.230833,12.047778,1988 +alps_12473,PIZ DI MEZZODI,,46.218889,12.036111,2240 +alps_12474,MONTE FERUCH,,46.216389,12.068889,2121 +alps_12475,MONTE STORNADE,,46.213889,12.089722,2029 +alps_12476,CIMA DEL CAMIN,,46.215000,12.080278,2063 +alps_12477,CRESTA LE CORAIE,,46.209722,12.077500,2149 +alps_12478,CIMA DI PRAMPER,,46.296667,12.166944,2409 +alps_12479,CIMA DI PRAMPERET,,46.293611,12.166944,2337 +alps_12480,SPIZ DELLA TITA,,46.291389,12.167778,2179 +alps_12481,CIMA CADIN DE CORNIA,,46.288056,12.189722,2081 +alps_12482,COL DEI GAI DE CORNIA,,46.296667,12.195833,1766 +alps_12483,NONO,,46.284167,12.210556,2034 +alps_12484,NONO DE DENTRO,,46.284167,12.204722,2016 +alps_12485,CIMA DE LA CAZETA,,46.286389,12.191667,2048 +alps_12486,COL DEI MUS,,46.280278,12.172778,1882 +alps_12487,COL DE LE SCANDOLE,,46.275833,12.181667,1701 +alps_12488,CIMA DI PIOVON,,46.269722,12.185833,2018 +alps_12489,CIME DI BACHET,,46.269722,12.173611,2342 +alps_12490,COL CANIEL,,46.266667,12.243611,1027 +alps_12491,FORCA LA VARETA,,46.255278,12.170833,1704 +alps_12492,CIME DE LA SCALA,,46.250278,12.184167,1901 +alps_12493,CIMA NERVILLE,,46.243611,12.189722,2076 +alps_12494,MONTE PELF,,46.231389,12.195556,2506 +alps_12495,COL TOROND,,46.235556,12.221389,1823 +alps_12496,MONTE ZIMON,,46.246667,12.253056,1819 +alps_12497,COSTA ORTIGA,,46.240278,12.177222,1877 +alps_12498,LA SCHIARA,,46.230000,12.182222,2565 +alps_12499,ANTICIME EST,,46.232500,12.186389,2506 +alps_12500,COL DEI BROLI,,46.234167,12.237222,1234 +alps_12501,CIMA DE L'ALBERO,,46.296667,12.274444,2018 +alps_12502,CRODA BIANCA,,46.285000,12.279722,1622 +alps_12503,SAS DE BARATIN,,46.281667,12.281111,1498 +alps_12504,TRONDOL,,46.282222,12.266944,1456 +alps_12505,SPIZ ROS,,46.277500,12.282778,1347 +alps_12506,COL CANIEL,,46.268889,12.239167,996 +alps_12507,COL DEL ROCOLO,,46.263056,12.238333,1148 +alps_12508,MONTE BELVEDERE,,46.247500,12.265000,1616 +alps_12509,COL DE LA SPERLONGA,,46.250278,12.286944,1141 +alps_12510,COL DEI FUS,,46.238611,12.248611,1159 +alps_12511,COL D'IGOI,,46.229167,12.245556,1293 +alps_12512,SPIZ GALLINA,,46.227222,12.321111,1545 +alps_12513,CIMA SPIGO,,46.202778,12.331111,1616 +alps_12514,MONTE SERVA,,46.201389,12.232778,2133 +alps_12515,MONTE DURON,,46.207222,12.170278,2000 +alps_12516,TORRE DI VACALIZZA,,46.298333,12.473611,2020 +alps_12517,PUNTA PISANDOLA,,46.295278,12.475000,1854 +alps_12518,COL DI COLLE,,46.285278,12.481111,1470 +alps_12519,MONTE BARBANO,,46.283889,12.476111,1404 +alps_12520,MONTE PIOLSA,,46.271389,12.488889,941 +alps_12521,COL DELLE ROPPE,,46.251944,12.472500,948 +alps_12522,CREP DELLA PIANA,,46.250000,12.493056,1317 +alps_12523,COL MARTIN,,46.236111,12.477500,968 +alps_12524,PALE DEL BRESSA,,46.296944,12.467778,1805 +alps_12525,COL DI VEDIEI,,46.293889,12.423611,1465 +alps_12526,COL DEL SCIARONA,,46.293889,12.456389,1194 +alps_12527,COL ALDA,,46.289167,12.453611,1033 +alps_12528,COL DE CARLE,,46.285278,12.461667,951 +alps_12529,MONTE CORNETTO,,46.274167,12.416944,1792 +alps_12530,CIMA DI TOLA,,46.268056,12.425833,1752 +alps_12531,CIMA DELL'ARDOTO,,46.265556,12.399444,1841 +alps_12532,MONTE ZERTEN,,46.262222,12.397778,1883 +alps_12533,CIMA IL GALLINUT,,46.260833,12.428889,1751 +alps_12534,CIMA IL POZZI,,46.260000,12.446389,1345 +alps_12535,CRODULA,,46.252500,12.478889,1085 +alps_12536,ITERAZ,,46.243611,12.408333,1501 +alps_12537,CRODA PINEDA,,46.242778,12.456944,1202 +alps_12538,MONTE FRUGNA,,46.241111,12.428611,1839 +alps_12539,COL NUDO,,46.227500,12.402778,2471 +alps_12540,MONTE PROVAGNA,,46.229722,12.469444,1696 +alps_12541,CIMA SECCA,,46.227222,12.393333,2350 +alps_12542,MONTE PORGEIT,,46.295833,12.382778,1864 +alps_12543,FORCA BORGA,,46.293889,12.356111,1793 +alps_12544,MONTE BORGA,,46.293611,12.349167,2228 +alps_12545,MONTE STERPEZZA,,46.290833,12.344444,2215 +alps_12546,MONTE SALTA,,46.286667,12.337222,2035 +alps_12547,COL DI GIAI,,46.248889,12.375833,1527 +alps_12548,BECOI DI TOC,,46.248333,12.347500,1860 +alps_12549,CIMA MORA,,46.240833,12.342500,1938 +alps_12550,MONTE TOC,,46.238611,12.337778,1921 +alps_12551,COL DI GAI,,46.245833,12.333611,1684 +alps_12552,CIMA DI CAMP,,46.246111,12.384444,1671 +alps_12553,CIMA SORA IL CLOT,,46.228056,12.391111,2318 +alps_12554,FORCA CANDUABO,,46.239167,12.346389,1608 +alps_12555,CRODA BIANCA,,46.236111,12.350556,1784 +alps_12556,FORMIGOLER,,46.233333,12.355000,1665 +alps_12557,CIMA DI PINO,,46.234444,12.388889,2057 +alps_12558,CREP NUDO,,46.207778,12.446111,2207 +alps_12559,MONTE TEVERONE,,46.209167,12.402778,2345 +alps_12560,COL MAT,,46.208889,12.369444,1981 +alps_12561,MONTE PIZZONS,,46.277778,12.659167,1706 +alps_12562,FORCA DEL POUL,,46.279444,12.652500,1438 +alps_12563,MONTE MAGLINA,,46.280278,12.647778,1724 +alps_12564,MONTE DOSAIP,,46.283889,12.636944,2062 +alps_12565,LE PONTE,,46.296389,12.657222,1228 +alps_12566,COL DE MOC,,46.296667,12.593611,1277 +alps_12567,LANDRO DELLE CAPRE,,46.289722,12.624722,1825 +alps_12568,COSTA DELLE CAPRE,,46.289722,12.610000,1762 +alps_12569,COL DE CONCIO,,46.291389,12.590833,1190 +alps_12570,FORCA GADIN,,46.287778,12.571389,1515 +alps_12571,MONTE CHIAMPON,,46.285000,12.581667,1831 +alps_12572,MONTE PINZAT,,46.282500,12.617222,2061 +alps_12573,MONTE DOMANZON,,46.280833,12.618333,2046 +alps_12574,MONTE LAGIALINA,,46.264167,12.611944,1634 +alps_12575,MONTE COLCIAVAS,,46.244167,12.599722,1973 +alps_12576,MONTE RESETTUM,,46.239722,12.577222,2067 +alps_12577,CIMON DEL PRADUT,,46.250000,12.572778,1743 +alps_12578,FORCA BASSA,,46.245278,12.574722,1749 +alps_12579,MONTE RANDELINO,,46.233333,12.644444,1865 +alps_12580,MONTE CASTELLO,,46.230556,12.629722,1937 +alps_12581,MONTE CORTA,,46.237222,12.615278,1760 +alps_12582,FORCA NAVALESC,,46.232778,12.621667,1526 +alps_12583,MONTE DELL'ASTA,,46.231111,12.613056,1813 +alps_12584,COL DELLA QUESTION,,46.300000,12.502222,1250 +alps_12585,PADE DI CIONE,,46.296667,12.545556,2032 +alps_12586,CIMA POLSADOR,,46.300000,12.545000,1920 +alps_12587,CIMA CIOL DI SASS,,46.300000,12.557500,2072 +alps_12588,PALE DI TOLMI,,46.292778,12.520000,1183 +alps_12589,CIMA MERLODEON,,46.287778,12.535833,1775 +alps_12590,CIMA VAL TREMUOIA,,46.285833,12.527222,1450 +alps_12591,COL DEI MUI,,46.281944,12.516944,1244 +alps_12592,CIMA DEL FAGIER,,46.283611,12.522222,1372 +alps_12593,FORCA DELLA CITA,,46.281944,12.538611,1144 +alps_12594,PUNTA DE SEP,,46.279167,12.540278,1331 +alps_12595,COL TASTAGNER,,46.277222,12.546944,1061 +alps_12596,PUNTA CRODA SPISA,,46.276944,12.535000,1205 +alps_12597,MONTE CIADE,,46.275000,12.531111,1179 +alps_12598,COL DEI PIAIS,,46.274167,12.507500,876 +alps_12599,COL DE CIAVAZZON,,46.259167,12.527222,869 +alps_12600,COL DI MASIERA,,46.258333,12.514167,967 +alps_12601,CIMA LASTRUTA,,46.246667,12.546111,1754 +alps_12602,COL DELLE RITTE,,46.249167,12.501111,1419 +alps_12603,COL DE MEZZOGIORNO,,46.244444,12.519722,1716 +alps_12604,COL GRANDE,,46.243056,12.527778,1879 +alps_12605,MONTE FRATTE,,46.239444,12.545000,1983 +alps_12606,MONTE CUVIL,,46.227778,12.521944,1555 +alps_12607,COL MUSIEL,,46.229722,12.558056,1396 +alps_12608,MONTE CORDA,,46.280000,12.696944,1463 +alps_12609,COL DELLA LUNA,,46.288889,12.742778,1422 +alps_12610,MONTE CELANT,,46.266667,12.819167,1093 +alps_12611,MONTE RODOLINO,,46.232500,12.683333,1699 +alps_12612,MONTE FLAGEL,,46.283056,12.968611,1467 +alps_12613,CUEL DAI POZ,,46.281389,12.980556,1377 +alps_12614,MONTE CUAR,,46.274444,12.996667,1478 +alps_12615,PUNTA BOSCHERT,,46.298056,12.879444,1110 +alps_12616,MONTE SPINA,,46.297778,12.888611,1054 +alps_12617,MONTE GIVOLI,,46.297500,12.914722,1029 +alps_12618,MONTE MASON,,46.293611,12.949167,977 +alps_12619,PLAE DEI LARIS,,46.291667,12.956667,1148 +alps_12620,CUEL TARONDIN,,46.289444,12.937500,598 +alps_12621,MONTE PENOTIAT,,46.283333,12.956944,1031 +alps_12622,MONTE CECON,,46.280000,12.908889,1014 +alps_12623,CUEL DELLA TIVALA,,46.278611,12.945833,565 +alps_12624,MONTE TAIET,,46.274444,12.879722,1369 +alps_12625,CUEL DI FOR,,46.272778,12.908611,884 +alps_12626,CIUCOL DEL PAREIT,,46.295000,12.844444,1198 +alps_12627,MONTE BRUSO,,46.292222,12.836111,1216 +alps_12628,ZUC DI SANTINS,,46.293889,12.858889,1309 +alps_12629,MONTE RAINS,,46.293056,12.870556,1149 +alps_12630,FORCHIA CESILAR,,46.278889,12.870000,1131 +alps_12631,CAZZE ALTE,,46.307500,12.103889,1955 +alps_12632,CIMA DEL COSTONE,,46.307778,12.107222,2080 +alps_12633,CIMA DI PETORGNON,,46.316389,12.148333,1914 +alps_12634,COSTON DE LA GARDESAN,,46.311944,12.141389,2110 +alps_12635,CIMA DE LA GARDESANA,,46.309444,12.131111,2446 +alps_12636,CIMA DE LE FORZELETE,,46.307222,12.128333,2448 +alps_12637,TAMER DAVANTI,,46.310000,12.117500,2496 +alps_12638,TAMER GRANDE,,46.309167,12.121111,2547 +alps_12639,TAMER PICCOLO,,46.310833,12.121944,2550 +alps_12640,COL GRANT,,46.386111,12.152500,1879 +alps_12641,CREP DI PECOL,,46.381944,12.093333,1811 +alps_12642,COL DE LA BISSA,,46.362222,12.102222,1897 +alps_12643,SPIZ DE ZUEL,,46.359167,12.105833,2035 +alps_12644,COL NERO,,46.380278,12.154722,1771 +alps_12645,LA FORZELA,,46.378056,12.158056,1723 +alps_12646,COL DE SALERA,,46.366667,12.159444,1629 +alps_12647,COL CAMPIOI,,46.363611,12.117500,1804 +alps_12648,CREP DI DONT,,46.355000,12.125556,1640 +alps_12649,COL ASINERA,,46.346111,12.133889,1143 +alps_12650,COL BAION,,46.345278,12.148889,1358 +alps_12651,COL DE LE OLE,,46.334722,12.136944,1416 +alps_12652,COLLE DURAN,,46.328056,12.090556,1740 +alps_12653,CIME DE LE LASTIE,,46.321111,12.112222,2421 +alps_12654,CIME DEI GRAVINAI,,46.323611,12.113056,2303 +alps_12655,SASSO DI CALEDA,,46.315833,12.107222,2132 +alps_12656,CRODE DE MEZZODI,,46.326944,12.116111,2056 +alps_12657,CRESTA SUD DI S.SEBASTIANO,,46.316111,12.119167,2420 +alps_12658,CIMA NORD DI S SEBASTIANO,,46.319722,12.113333,2488 +alps_12659,COL D'ORTAT,,46.321667,12.098056,1748 +alps_12660,COL MENADAR,,46.306944,12.090278,1737 +alps_12661,FORCA DAGAREI,,46.308056,12.096389,1620 +alps_12662,CIMA DI FORCELLA STRETTA,,46.301944,12.131944,2337 +alps_12663,COL NEGRO DI COLDAI,,46.395000,12.053333,2248 +alps_12664,TORRE DI COLDAI,,46.393611,12.062500,2600 +alps_12665,TORRE DA LAGO,,46.387222,12.057222,2713 +alps_12666,PUNTA CIVETTA,,46.384167,12.055833,2920 +alps_12667,PICCOLA CIVETTA,,46.377778,12.050278,3207 +alps_12668,MONTE CIVETTA,,46.380000,12.053333,3220 +alps_12669,CIMA DE GASPERI,,46.377778,12.040833,2994 +alps_12670,CIMA TERRANOVA,,46.375278,12.036667,2900 +alps_12671,CIME DEI MONACHESI,,46.371944,12.035000,2678 +alps_12672,CIMA LISTOLADE,,46.368056,12.027778,2483 +alps_12673,CIMA DELLE MEDE,,46.366389,12.026944,2504 +alps_12674,PUNTA WALKER,,46.369167,12.029167,2510 +alps_12675,CIMA DEL BANOON,,46.363333,12.028333,2346 +alps_12676,FORCA DI PELSA,,46.361111,12.023611,2166 +alps_12677,TORRE VENEZIA,,46.360556,12.023333,2337 +alps_12678,CASTELLO DI VALGRANDE,,46.388889,12.059167,2715 +alps_12679,SCHINAL DE BECH,,46.385556,12.065278,2420 +alps_12680,TORRE DI BABELE,,46.366389,12.031667,2310 +alps_12681,CIMA PAOLINA,,46.371111,12.046389,3040 +alps_12682,CIMA DELLA BUSAZZA,,46.365000,12.043333,2894 +alps_12683,CASTELLO DELLA BUSAZZA,,46.360278,12.045556,2592 +alps_12684,TORRE TRIESTE,,46.358056,12.044167,2458 +alps_12685,CIMA DI TOME,,46.375833,12.059722,3004 +alps_12686,FORCA DELLE SASSE,,46.368611,12.064444,2476 +alps_12687,CIMA DELLA MOIZZETTA DELLA GRAVA,,46.365000,12.065278,2727 +alps_12688,CIMA DELLE SASSE,,46.356944,12.064444,2878 +alps_12689,CREPA BASSA,,46.356389,12.074722,2484 +alps_12690,CREPA ALTA,,46.355278,12.069167,2543 +alps_12691,COL DEI CAMORZ,,46.356111,12.057778,2489 +alps_12692,BUSAZZA,,46.359167,12.060556,2320 +alps_12693,FORCA DELLA MOIAZZA,,46.351944,12.066667,2515 +alps_12694,CIMA DI NALI,,46.347778,12.061667,2776 +alps_12695,MOIAZZA NORD,,46.345278,12.061944,2865 +alps_12696,TORRIONE DELLE NEVERE,,46.344722,12.061667,2870 +alps_12697,CIMA DELLE NEVERE,,46.338611,12.053056,2621 +alps_12698,CIMON DEI ZOLDANI,,46.334444,12.049444,2494 +alps_12699,PALA DEL CAMP,,46.325833,12.046667,2083 +alps_12700,FORCA DEL CAMP,,46.323611,12.047778,1933 +alps_12701,MONTE CORNO,,46.314722,12.044167,2186 +alps_12702,FORCA DI SEIERE,,46.314722,12.042222,2003 +alps_12703,MONTALT,,46.312222,12.037222,2181 +alps_12704,LASTIA DI FRAMONT,,46.314167,12.035278,2294 +alps_12705,TRIDENTE PRIMA,,46.328056,12.047778,2158 +alps_12706,TRIDENTE TERZA,,46.331389,12.048611,2310 +alps_12707,TRIDENTE SECONDA,,46.330000,12.048889,2304 +alps_12708,CASTELLO DELLE NEVERE,,46.340556,12.051111,2599 +alps_12709,CIMA DEI TRE,,46.339444,12.046667,2132 +alps_12710,ROCCHETTE DELLE NEVERE,,46.340833,12.059722,2843 +alps_12711,MOIAZZA SUD,,46.338611,12.057778,2878 +alps_12712,FORCA DELLE MASENADE,,46.334444,12.063333,2650 +alps_12713,CRESTA DELLE MASENADE,,46.331944,12.068056,2737 +alps_12714,LA CATHEDRALE,,46.329444,12.068056,2558 +alps_12715,SASS DEL DURAM,,46.332778,12.078889,2515 +alps_12716,CIMA DEL DURAM,,46.331389,12.076944,2577 +alps_12717,CIMA DI COL REAN,,46.388889,12.033333,2281 +alps_12718,SAAS SPIZ,,46.392500,12.015556,1257 +alps_12719,BEC DI MEZZODI,,46.386667,12.024444,2108 +alps_12720,FORCA DI COL REAN,,46.382500,12.034444,2107 +alps_12721,CREP DI CASAMATTA,,46.378889,12.017222,2110 +alps_12722,FORCA DI COL MANDRO,,46.369722,12.013611,2032 +alps_12723,COL DELLA BESADORA,,46.369722,12.086389,1846 +alps_12724,CREPA TONDA,,46.368333,12.080833,1884 +alps_12725,FORCA DELLA GRAVA,,46.369722,12.083611,1784 +alps_12726,COL DEL VANT,,46.363333,12.071389,2384 +alps_12727,COL PALANZIN,,46.338611,12.040278,1746 +alps_12728,COL DEL MUS,,46.338056,12.020278,1625 +alps_12729,COL D'ORS,,46.334167,12.039722,1826 +alps_12730,MONTE PIGHERA,,46.331389,12.008889,1898 +alps_12731,LA MARTINELA,,46.329444,12.007222,1873 +alps_12732,CRODA SPIZA,,46.328889,12.083889,2086 +alps_12733,COL VALORIET,,46.327222,12.035556,1988 +alps_12734,COL MARTINEL,,46.324722,12.006111,1336 +alps_12735,COL DEI PASS,,46.323056,12.069444,1792 +alps_12736,COL MARTINEL,,46.306389,12.046944,1582 +alps_12737,ALTO DI PELSA,,46.355833,11.999722,2417 +alps_12738,SPIZ DI BELVEDERE,,46.323889,12.186389,2062 +alps_12739,CIMA NORD,,46.319444,12.182778,2305 +alps_12740,CIMA EST,,46.316667,12.184444,2317 +alps_12741,CIME DI MEZZODI,,46.315278,12.183611,2324 +alps_12742,FORCA SAGRONA,,46.306667,12.183611,2118 +alps_12743,CIMA SUD,,46.313611,12.184722,2309 +alps_12744,CIMA DEL VENIER,,46.308056,12.183889,2237 +alps_12745,STURLON DI CORONA,,46.305833,12.197500,1828 +alps_12746,CIMA DEL CORO,,46.303889,12.179444,2324 +alps_12747,SPIGOL DEL PALON,,46.300833,12.173889,2314 +alps_12748,CIMA ALTA DE LA NISIA,,46.316944,12.262778,2117 +alps_12749,SPIZ DEVANT DE LA SERRA,,46.309722,12.264444,2145 +alps_12750,CIMA DE LA SERRA,,46.308056,12.258611,2140 +alps_12751,COL COLON,,46.305833,12.251389,1914 +alps_12752,MONTE CASTELLIN,,46.350000,12.214167,1580 +alps_12753,COL DI FIES,,46.393056,12.191111,1568 +alps_12754,CROCE DI MONTE RITE,,46.391667,12.263889,1977 +alps_12755,MONTE RITE,,46.384444,12.258056,2183 +alps_12756,MONTE ROAN,,46.388611,12.262778,2052 +alps_12757,COL DE LA VIZA,,46.390278,12.182778,1732 +alps_12758,COL DI BAGN,,46.387500,12.200833,1659 +alps_12759,COL ALTO,,46.384722,12.241667,2145 +alps_12760,COL DE PIAN,,46.382500,12.183889,1554 +alps_12761,FORCA DEONA,,46.384167,12.245556,2053 +alps_12762,COL DUR,,46.378611,12.211389,2033 +alps_12763,COL DI PIANIZZAN,,46.375000,12.194722,1429 +alps_12764,COL DE CAMIN,,46.365000,12.180556,1415 +alps_12765,PIAN DE MOSENA,,46.359722,12.177500,1317 +alps_12766,SPIZ DE COPADA,,46.360000,12.251667,1999 +alps_12767,CIMA DE LA PALA ANZIANA,,46.353333,12.255000,2104 +alps_12768,FORCA DE LA CIAVAZOLE,,46.353333,12.256667,1994 +alps_12769,SPIZ DE SAN PIERO,,46.354444,12.240833,2084 +alps_12770,I USELOIN,,46.351389,12.225556,1681 +alps_12771,CASTELAZ,,46.348056,12.206944,1454 +alps_12772,LAGO DI PONTESEI,,46.337500,12.223333,800 +alps_12773,ROCCHETTA BASSA,,46.332500,12.252778,2047 +alps_12774,ROCCHETTA ALTA,,46.331111,12.259722,2412 +alps_12775,SASSO DI TOANELLA,,46.331667,12.264167,2430 +alps_12776,COL DE FONTANELLA,,46.320278,12.255278,1565 +alps_12777,SASSO DI BOSCONERO,,46.336389,12.268333,2468 +alps_12778,SASSO DEI CORVI,,46.393611,12.287222,1253 +alps_12779,COLLE I DUOGHE,,46.391111,12.322222,1501 +alps_12780,MONTE DUBIEA,,46.383889,12.314167,1762 +alps_12781,CSTAGUDA,,46.378889,12.292500,1387 +alps_12782,SAS DE MEZDI,,46.372778,12.305833,2202 +alps_12783,LAGO RUDINE,,46.371667,12.273333,1293 +alps_12784,SASSOLUNGO,,46.358889,12.282778,2413 +alps_12785,CRODA SORA RUSTORTO,,46.365556,12.298889,2199 +alps_12786,LA LASTA,,46.367222,12.322500,1612 +alps_12787,COL DEI MAS-CE,,46.361389,12.275556,1963 +alps_12788,CRESTA DI RONCHET,,46.357222,12.304444,1868 +alps_12789,TORRE CAMPESTRIN,,46.352500,12.270278,2241 +alps_12790,SFORNIO NORD,,46.350833,12.265278,2410 +alps_12791,SFORNIO MEZZO,,46.348611,12.267222,2425 +alps_12792,SFORNIO SUD,,46.345000,12.267222,2409 +alps_12793,COL DARIES,,46.334722,12.297778,1391 +alps_12794,COL PELOS,,46.330278,12.285000,1811 +alps_12795,COL CIRIES,,46.333611,12.306389,1318 +alps_12796,COL TAMAI,,46.322222,12.276944,1573 +alps_12797,COL FASON,,46.304444,12.304444,1348 +alps_12798,COL SIRON,,46.304722,12.290833,1671 +alps_12799,PIAN DE VENTURIN,,46.300833,12.301944,1317 +alps_12800,CADIN DEGLI ELMI,,46.387222,12.450556,2424 +alps_12801,CAMPANILE TORO,,46.391389,12.469444,2345 +alps_12802,PALA GRANDE,,46.393611,12.472222,2385 +alps_12803,CIMA CADIN DI TORO,,46.391111,12.456944,2386 +alps_12804,CASTELLO DI VEDORCIA,,46.393056,12.458056,2315 +alps_12805,CIMA CADIN DI VEDORCIA,,46.389722,12.453056,2403 +alps_12806,CIMA DI SAN LORENZO,,46.388333,12.465278,2363 +alps_12807,COL CADORIN,,46.377222,12.466944,1838 +alps_12808,CRODA CIMOLIANA,,46.398056,12.485556,2408 +alps_12809,CIMA STALLA,,46.395278,12.496667,2100 +alps_12810,CIMA MELUZZO,,46.392500,12.484444,2188 +alps_12811,LAGO DI MELUZZO,,46.378333,12.493611,1155 +alps_12812,MONTE PIURA,,46.365278,12.455278,1971 +alps_12813,COL DE MARCH,,46.368611,12.486111,1659 +alps_12814,COL DEI AGNEI,,46.364167,12.481111,1836 +alps_12815,COLLE RONCADA,,46.356944,12.486667,1942 +alps_12816,FORCA DELLA LAMA,,46.353611,12.486389,1935 +alps_12817,COL PIURA,,46.358056,12.459722,1608 +alps_12818,COL DI MEDRI,,46.356111,12.446389,1776 +alps_12819,MONTE FERRARA,,46.353056,12.497222,2258 +alps_12820,FORCA SAVALONS,,46.348056,12.487222,1976 +alps_12821,CIMA NADEI,,46.340278,12.451111,1862 +alps_12822,PICCO DI RODA,,46.391389,12.401944,2229 +alps_12823,PASSO DI RODA,,46.388333,12.403333,2160 +alps_12824,PALE DELL'AIO,,46.384722,12.406667,2318 +alps_12825,MONTE PERA,,46.380000,12.414444,2334 +alps_12826,CIMA DI LARES,,46.375278,12.424167,2273 +alps_12827,FORCA DEI LARES,,46.386111,12.433333,2049 +alps_12828,CIMA SPE,,46.381111,12.436111,2314 +alps_12829,MONTE CASTELLATO,,46.390000,12.468889,2424 +alps_12830,FORCA VAL MISERA,,46.379444,12.431667,2105 +alps_12831,FORCA PIZIE,,46.380278,12.397778,1786 +alps_12832,MONTE PIZIE,,46.377222,12.394722,1884 +alps_12833,CIMA GEA,,46.368611,12.413056,2265 +alps_12834,CIMA SELLA,,46.367500,12.424722,2334 +alps_12835,CIMA DEI FRASSIN,,46.364722,12.436111,2124 +alps_12836,CIMA DELLE MONACHE,,46.366389,12.430833,2160 +alps_12837,CIMA DEI PRETI,,46.342500,12.420833,2706 +alps_12838,PUNTA COMPOL,,46.337778,12.424722,2548 +alps_12839,FORCA COMPOL,,46.337222,12.426944,2450 +alps_12840,CIMA DEI CANTONI,,46.335833,12.428611,2512 +alps_12841,CIMA DELLE CHIAZZE ALTE,,46.330278,12.434722,2286 +alps_12842,CIMA DEL CHECCO,,46.337222,12.431944,2311 +alps_12843,CIMA DEI FRATI,,46.331389,12.411667,2355 +alps_12844,FORCA DEI FRATI,,46.330000,12.408056,2197 +alps_12845,FORCA DURANNO,,46.324167,12.404722,2217 +alps_12846,CIME CENTENERE,,46.322222,12.404167,2295 +alps_12847,MONTE DURANNO,,46.328889,12.402778,2668 +alps_12848,FORCA DELLA SPALLA,,46.330000,12.392500,2127 +alps_12849,IL NASO,,46.328889,12.397500,2510 +alps_12850,CIMA TORO,,46.396389,12.474167,2355 +alps_12851,PUNTA PIA,,46.395556,12.473056,2347 +alps_12852,COL ANDON,,46.360278,12.442500,1977 +alps_12853,CIMA LASTE,,46.355000,12.417500,2555 +alps_12854,FORCA DI COLLALTO,,46.356111,12.409444,2070 +alps_12855,CIME DI COLLALTO,,46.355556,12.407222,2246 +alps_12856,IL TRIDENTE,,46.351944,12.418889,2418 +alps_12857,CIMA SPELLANZON,,46.345833,12.420833,2590 +alps_12858,PUNTA PATERA,,46.347778,12.420556,2553 +alps_12859,CIMA VAL DEL DRAP,,46.349167,12.425000,2330 +alps_12860,PUNTA ZOTTA,,46.341944,12.430556,2173 +alps_12861,CIMA DI RODISEGRE,,46.328889,12.373889,2110 +alps_12862,COLLE SVALUT,,46.373333,12.372222,1289 +alps_12863,COLLE CIAPELIN,,46.375000,12.343889,1154 +alps_12864,COL TONDO,,46.360000,12.382222,1465 +alps_12865,MONTE VAL DELLA CIMA,,46.350833,12.358889,1563 +alps_12866,SASSO DI MEZZO,,46.341389,12.357778,2044 +alps_12867,TORRE NEILARIO,,46.340278,12.356111,1975 +alps_12868,SASSO DELLE UNDICI,,46.333611,12.371111,2060 +alps_12869,COLLE DI TAS,,46.338611,12.376667,1998 +alps_12870,SASSO DELLE DIECI,,46.331944,12.378889,2191 +alps_12871,CIMA PAGNAC,,46.325833,12.366944,1986 +alps_12872,MONTE ZITA,,46.318889,12.352778,2191 +alps_12873,SPALLA DEL DURANNO,,46.329167,12.384167,2234 +alps_12874,FORCA DI ZITA,,46.314167,12.356667,1958 +alps_12875,LA PALAZZA,,46.310556,12.355833,2210 +alps_12876,CAMPANOZ,,46.307778,12.408889,2144 +alps_12877,MONTE LODINA,,46.301667,12.415278,2020 +alps_12878,CIMA FORTEZZA,,46.308611,12.399167,2101 +alps_12879,MONTE SCANDOLER,,46.305278,12.456111,1609 +alps_12880,MONTE VACALIZZA,,46.305000,12.476389,2266 +alps_12881,CIMA GIAEDA,,46.306667,12.477778,2247 +alps_12882,LA FESSURA,,46.308056,12.482222,1926 +alps_12883,CIMA DEI VIERES,,46.309722,12.484722,2310 +alps_12884,PUNTA SUSANNA,,46.312222,12.486667,2292 +alps_12885,CIMA SPALAVIER,,46.313889,12.486667,2279 +alps_12886,PUNTA DEL BORSAT,,46.316111,12.489167,2220 +alps_12887,PUNTA CLAUT,,46.304722,12.488611,2022 +alps_12888,PUNTA BEGARELI,,46.305278,12.487778,2010 +alps_12889,FORCA BORSAT,,46.320278,12.496111,1811 +alps_12890,MONTE BREGOLINA,,46.338333,12.489444,1995 +alps_12891,COL MASONS,,46.369722,12.629167,1630 +alps_12892,CIMA CAMOSCI,,46.364444,12.619167,1806 +alps_12893,PIC ZIAN,,46.359167,12.658889,1760 +alps_12894,CIMA DI PODINUZ,,46.356389,12.621111,1838 +alps_12895,MONTE CHIARESCONS,,46.347778,12.626389,2168 +alps_12896,COL DELLA VALLE,,46.349167,12.634444,1901 +alps_12897,LASTRE DI PESCHIS,,46.345278,12.659444,1871 +alps_12898,VETTA FORNEZZE,,46.339444,12.636944,2110 +alps_12899,CIMA NARTAIS,,46.332222,12.638333,1915 +alps_12900,MONTE CASERINE ALTE,,46.314444,12.631389,2306 +alps_12901,CENGLE FORNEZZE,,46.340556,12.641667,2094 +alps_12902,LA SPIA DI BORTOLUSC,,46.328889,12.612222,1714 +alps_12903,CIMA LADICE,,46.318611,12.657778,1898 +alps_12904,CIMA DI S.FRANCESCO,,46.315833,12.621389,2213 +alps_12905,CIMA BURLAT,,46.320000,12.638889,2121 +alps_12906,PIC DI MEA,,46.398056,12.554167,2207 +alps_12907,CRODON DI VAL DI BRICA,,46.394722,12.537778,2243 +alps_12908,CIME FANTOLINA,,46.385556,12.548056,2283 +alps_12909,CIME DI VAL DE L'INFERNO,,46.380000,12.537222,2282 +alps_12910,CIMA VAL DI BRICA,,46.380278,12.533611,2362 +alps_12911,PASSO DEL MUS,,46.378611,12.550278,2063 +alps_12912,CIMA VAL DI GUERRA,,46.375833,12.550833,2353 +alps_12913,IL CIASTEIL,,46.370556,12.553889,2359 +alps_12914,CRODA DI SION,,46.372222,12.551667,2410 +alps_12915,FORCA PRAMAGGIORE,,46.366944,12.557778,2295 +alps_12916,MONTE PRAMAGGIORE,,46.365000,12.553333,2478 +alps_12917,PASSO PRAMAGGIORE,,46.358333,12.540556,2137 +alps_12918,CIMA CADIN,,46.355278,12.533333,2313 +alps_12919,CIME VAL DI BRICA,,46.383611,12.525000,2186 +alps_12920,PICO DEI MEZZODI,,46.388611,12.576111,1835 +alps_12921,PUNTA DRIA,,46.386389,12.572222,1981 +alps_12922,CIMA DI SUOLA,,46.381667,12.568333,2079 +alps_12923,MONTE RUA,,46.366667,12.571944,2177 +alps_12924,COLLE S.VITO,,46.389722,12.585278,1734 +alps_12925,CIMA DEL PALLONE,,46.385556,12.580278,1712 +alps_12926,CIMA DI PURONE,,46.380278,12.606944,1659 +alps_12927,CIMA DELLE SARODINE,,46.370556,12.593889,1895 +alps_12928,CIMA DI CHIAVA,,46.368333,12.608333,1918 +alps_12929,COL GRION,,46.351111,12.590000,1333 +alps_12930,COL VISENTIN,,46.350278,12.605556,1317 +alps_12931,COL DE POST,,46.347500,12.582778,1380 +alps_12932,MONTE DOF,,46.334722,12.533889,1976 +alps_12933,COL DELLA MEDA,,46.334722,12.590556,1654 +alps_12934,CIMA DELLA GRAVUZZA,,46.329444,12.600278,1834 +alps_12935,MONTE SANDIZZA,,46.331111,12.547222,1792 +alps_12936,COL DELLE TORNAREZZE,,46.327778,12.540278,1401 +alps_12937,CIMA DELLA MEDA,,46.316111,12.596667,2302 +alps_12938,FORCA DEL PREGOIANE,,46.322500,12.601667,1919 +alps_12939,CIME DI BORTOLUSC,,46.323056,12.605278,2160 +alps_12940,CIMON DELLE TEMPIE,,46.316111,12.583889,2279 +alps_12941,FORCELLA DELLA TEMPIE,,46.318611,12.581111,2043 +alps_12942,COL DE CONTRON,,46.319722,12.536944,1199 +alps_12943,MONTE CORNAGET,,46.311944,12.584444,2323 +alps_12944,CAMPANILE GAMBET,,46.390000,12.521389,2025 +alps_12945,CIMA SBOADA,,46.370833,12.505278,1996 +alps_12946,MONTE FERRARA,,46.353056,12.497222,2258 +alps_12947,PALE CANDELE,,46.328611,12.525000,2251 +alps_12948,PUNTA DELLA VENTOLA,,46.323611,12.500556,2192 +alps_12949,MONTE TURLON,,46.321944,12.505278,2312 +alps_12950,CIME POSTEGAE,,46.354167,12.516944,2358 +alps_12951,MONTE AUDA,,46.363056,12.808333,1700 +alps_12952,MONTE REST,,46.351944,12.802222,1780 +alps_12953,MONTE ROVIN,,46.326944,12.796667,806 +alps_12954,MONTE CENGLA,,46.316667,12.824167,1304 +alps_12955,MONTE GIAF,,46.308333,12.809444,938 +alps_12956,MONTE CORONA,,46.391111,12.828611,742 +alps_12957,MONTE CORNO,,46.385278,12.743333,1253 +alps_12958,FORCA VOIANIS,,46.371667,12.710000,1174 +alps_12959,MONTE TRENTASIN,,46.368333,12.717778,1206 +alps_12960,FORCA DI MUGNOL,,46.336667,12.728611,1552 +alps_12961,FORCLA DI VAL DI FISAR,,46.326389,12.745000,1525 +alps_12962,MONTE GIAVONS,,46.321111,12.740000,1711 +alps_12963,MONTE FRASCOLA,,46.318056,12.715556,1961 +alps_12964,FORCA DEL FRASCOLA,,46.320278,12.729444,1520 +alps_12965,COL CHIAVRAIS,,46.387222,12.695000,1063 +alps_12966,PUNTA DEL CHIAVALUT,,46.374722,12.689722,1454 +alps_12967,PUNTA DEL MEZZODI,,46.361111,12.673611,1923 +alps_12968,FORCA CIAMPINZ,,46.351389,12.676389,1736 +alps_12969,CIMA DEL FORAT,,46.352222,12.697222,1776 +alps_12970,FORCELLA DI NAIARDA,,46.348056,12.693889,1764 +alps_12971,CIMON DI AGAR,,46.344167,12.688056,1932 +alps_12972,MONTE NAIARDA,,46.338333,12.693889,1899 +alps_12973,MONTE TAMARUZ,,46.325556,12.707500,1930 +alps_12974,IL TAMER DI LADICE,,46.327778,12.671389,1293 +alps_12975,MONTE BOTTAI,,46.350278,12.977222,1526 +alps_12976,MONTE CERESOI,,46.328889,12.971944,1128 +alps_12977,MONTE FORGOLLINA,,46.331667,12.995556,874 +alps_12978,MONTE GRAN PALA,,46.313611,12.970278,1347 +alps_12979,MONTE FAZ,,46.314167,12.991944,1052 +alps_12980,MONTE AMULA,,46.308611,12.975000,1220 +alps_12981,MONTE PALONS,,46.302222,12.970833,925 +alps_12982,MONTE VERZEGNIS,,46.363056,12.905278,1914 +alps_12983,MONTE PIOMBADA,,46.348611,12.957778,1744 +alps_12984,CRET DEL MAZAR,,46.346944,12.886389,1083 +alps_12985,CORONA ALTA,,46.347500,12.946111,1617 +alps_12986,MONTE DREA,,46.334722,12.905833,1278 +alps_12987,LAS TAVUELAS,,46.333056,12.915000,1346 +alps_12988,MONTE CHIADINS,,46.330000,12.947222,1051 +alps_12989,MONTE SACCONS,,46.324167,12.911667,1011 +alps_12990,MONTE AGARIAL,,46.324167,12.921944,1189 +alps_12991,CUEL DI GIAVAZ,,46.323889,12.947500,781 +alps_12992,MONTE ROVOLEIT,,46.319444,12.890278,1061 +alps_12993,MONTE GIAF,,46.313056,12.913611,1085 +alps_12994,MONTUZZA,,46.306389,12.877222,804 +alps_12995,CUEL DI MOLEC,,46.305000,12.891111,901 +alps_12996,MONTE VENCHIAR,,46.304167,12.913889,1045 +alps_12997,MONTE BIERBI,,46.301389,12.943333,942 +alps_12998,MONTE MASON,,46.303333,12.955556,1091 +alps_12999,CLAP FORAT,,46.400278,12.895000,410 +alps_13000,MONTE NAVADO,,46.393611,12.942500,788 +alps_13001,MONTE NAVADO,,46.394722,12.957222,801 +alps_13002,FORCHIA RIZZAT,,46.374722,12.888611,1373 +alps_13003,MONTE RIZZAT,,46.375556,12.884722,1441 +alps_13004,MONTE CORMOLINA,,46.369722,12.904722,1880 +alps_13005,MONTE LOVINZOLA,,46.372778,12.921389,1868 +alps_13006,COLLE DEI LARICI,,46.370556,12.930556,1779 +alps_13007,MONTE PEZZEIT,,46.364444,12.845556,1423 +alps_13008,MONTE SALUTA,,46.373889,12.851944,1062 +alps_13009,MONTE BURLAT,,46.351944,12.843056,1847 +alps_13010,MONTE VALCALDA NORD,,46.347778,12.832500,1884 +alps_13011,MONTE VALCALDA,,46.343889,12.835000,1908 +alps_13012,MONTE TEGLARA,,46.341667,12.846667,1886 +alps_13013,MONTE SCIARA GRANDE,,46.328889,12.850833,1686 +alps_13014,MONTE SCCIARA PICCOLA,,46.328889,12.841111,1682 +alps_13015,CUESTA SPIOLEIT,,46.330556,12.861667,1687 +alps_13016,MONTE OSELAR,,46.321667,12.863333,1338 +alps_13017,SPICHER DI TUI,,46.316667,12.849722,1219 +alps_13018,MONTE CIUF,,46.308333,12.848611,1037 +alps_13019,MONTE GIOVO,,46.305833,12.840833,898 +alps_13020,FORCHIA ZUVIEL,,46.302500,12.847778,890 +alps_13021,MONTE CIUF,,46.303056,12.870278,913 +alps_13022,CIMA BASSA DA LAGO,,46.487778,12.097778,2538 +alps_13023,PUNTA FRAIO,,46.484167,12.097778,2611 +alps_13024,CRODA DA LAGO,,46.482778,12.098056,2701 +alps_13025,CIMA AMBRIZZOLA,,46.479167,12.098056,2715 +alps_13026,PUNTA DI ZONIA,,46.481111,12.053333,2282 +alps_13027,PONTA DE GIAU,,46.483056,12.085278,2414 +alps_13028,GRAN DIEDRO,,46.481111,12.081111,2482 +alps_13029,COL PIOMBIN,,46.478889,12.063056,2313 +alps_13030,FORCA DI ZONIA,,46.480000,12.058056,2233 +alps_13031,MONTE FORMIN,,46.474444,12.079167,2657 +alps_13032,MONTE CERNERA,,46.466389,12.059444,2657 +alps_13033,COSTA DELLE ROLE,,46.468056,12.067500,2578 +alps_13034,MONTE VERDAI,,46.465278,12.051111,2492 +alps_13035,PIZ DEL CORVO,,46.456111,12.074722,2383 +alps_13036,MONTE MONDEVAL,,46.460000,12.081944,2455 +alps_13037,COL DELLA MONTAGNA,,46.435833,12.039722,1823 +alps_13038,MONTE CROT,,46.423889,12.098333,2158 +alps_13039,MONTE CIMINEL,,46.426944,12.039167,2077 +alps_13040,COL DI AGUSCIEI,,46.424722,12.092778,2011 +alps_13041,COL DAI DOF,,46.425278,12.081944,1974 +alps_13042,CREPA DELLE SALERE,,46.425278,12.058611,1930 +alps_13043,CCIMA DEI VIAI,,46.423889,12.043611,2101 +alps_13044,COL DI DAVAGNIN,,46.422778,12.033611,1917 +alps_13045,COL MUL,,46.406944,12.064167,1989 +alps_13046,CIMA DI COLDAI,,46.402778,12.063611,2403 +alps_13047,CIMA OVEST,,46.403056,12.061111,2396 +alps_13048,LAGO FEDERA,,46.488611,12.104722,2038 +alps_13049,FORCA SONFORCIA,,46.477222,12.127222,2069 +alps_13050,FORCA ROSSA,,46.475278,12.101389,2331 +alps_13051,ROCCHETTA DI CAMPOLONGO,,46.466944,12.144444,2370 +alps_13052,ROCCHETTA DI SORARU,,46.463889,12.135278,2440 +alps_13053,FORCA DI SORARU,,46.465833,12.140556,2229 +alps_13054,ROCCHETTA DI PRENDERA,,46.461667,12.125000,2496 +alps_13055,ROCCHETTA DE RUOIBES,,46.462778,12.131389,2458 +alps_13056,COL DURO,,46.461111,12.109444,2335 +alps_13057,COLLE RUOIBES,,46.456944,12.145278,1969 +alps_13058,COL MUZILAI,,46.451389,12.164167,1598 +alps_13059,COL DEL TERMINE,,46.450278,12.101667,1957 +alps_13060,COL DE COROTO,,46.448889,12.148333,1860 +alps_13061,FORCA DE LA PUINA,,46.447222,12.128056,2034 +alps_13062,MONT DEL FEN,,46.445556,12.108889,1966 +alps_13063,COL DE LA PUINA,,46.443611,12.130000,2254 +alps_13064,LA CREPES DE BECHE,,46.440278,12.132778,2200 +alps_13065,FORCA COSTANTIOL,,46.440833,12.130833,2140 +alps_13066,MONTE SORATIERA,,46.437778,12.150833,2151 +alps_13067,FORCA FORADA,,46.434167,12.131389,1977 +alps_13068,CIME DE VAL D'ARCIA,,46.430278,12.144722,2626 +alps_13069,CIMA FORADA,,46.429444,12.136944,2455 +alps_13070,FORCA VAL D'ARCIA,,46.428889,12.144722,2476 +alps_13071,CRODE DE FORCA ROSSA,,46.426111,12.144167,2737 +alps_13072,FORCA ROSSA,,46.423611,12.143056,2621 +alps_13073,CREPA TORONDA,,46.422222,12.117778,2034 +alps_13074,MONTE PELMO,,46.420000,12.134444,3168 +alps_13075,SPALLA SUD,,46.412778,12.138611,3061 +alps_13076,SPALLA EST,,46.419444,12.144722,3024 +alps_13077,MONTE PELMETTO,,46.416944,12.126389,2990 +alps_13078,PALA SUD,,46.410000,12.144444,2500 +alps_13079,BECCO DI MEZZODI,,46.466667,12.114444,2603 +alps_13080,RA GUSELA,,46.491111,12.050833,2595 +alps_13081,NUVOLAU,,46.495278,12.045833,2574 +alps_13082,MONTE PORE,,46.477500,12.012500,2405 +alps_13083,LAGO DI ALLEGHE,,46.405833,12.012500,966 +alps_13084,CRODA MANDRIN,,46.455556,12.316111,2278 +alps_13085,CRODE DE SAN PIETRO,,46.450000,12.303889,2260 +alps_13086,FORCA PIRIA,,46.447500,12.297500,2096 +alps_13087,COL MAO,,46.429722,12.329444,1504 +alps_13088,CIMA FEDERA,,46.496667,12.302500,2513 +alps_13089,MONTE OTEN,,46.492500,12.303056,2244 +alps_13090,COL GRANDE,,46.486667,12.327500,1763 +alps_13091,COL PICCOLO,,46.486667,12.318611,1622 +alps_13092,COSTA DEL MONEGO,,46.471111,12.315833,2005 +alps_13093,CIMA SALVELLA,,46.452222,12.245833,2556 +alps_13094,FORCA SALVELLA,,46.452222,12.249444,2455 +alps_13095,MONTE ANTELAO,,46.451667,12.261944,3264 +alps_13096,CIMA FANTON,,46.449722,12.267778,3142 +alps_13097,PUNTA CHIGGIATO,,46.450000,12.266389,3163 +alps_13098,PUNTA MENINI,,46.451389,12.264167,3177 +alps_13099,FORCA DELLA ROCCA,,46.453889,12.275556,2732 +alps_13100,LA ROCCA,,46.454167,12.276944,2807 +alps_13101,LE SCALETTE,,46.441111,12.270278,2576 +alps_13102,COLLE S.LUCIA,,46.422778,12.258889,1270 +alps_13103,COL MAO,,46.421389,12.292222,1470 +alps_13104,COL VIDA,,46.418333,12.291389,1476 +alps_13105,COL PECOLINES,,46.419444,12.288056,1449 +alps_13106,COL SANTA ANNA,,46.415833,12.287222,1376 +alps_13107,COLLE DI VINIGO,,46.414444,12.271944,1078 +alps_13108,BECCO DI CUZZE,,46.402222,12.210278,1744 +alps_13109,FORCA CUCEI,,46.402778,12.207778,1693 +alps_13110,FORCA PICCOLA,,46.469444,12.256389,2120 +alps_13111,COSTA BEL PRA,,46.492500,12.244167,2862 +alps_13112,CIMA ,BEL PRA,,46.484444,12.241111,2917 +alps_13113,FORCA SCOTTER,,46.480278,12.247222,2486 +alps_13114,PUNTA DINA,,46.479444,12.248611,2526 +alps_13115,CIMA ,SCOTTER,,46.476944,12.258611,2799 +alps_13116,CIMA ,NOSOIO,,46.481111,12.262222,2806 +alps_13117,CIMA ,BASTIONE,,46.485278,12.267778,2926 +alps_13118,CRODA DE MARCHI,,46.493889,12.263889,2769 +alps_13119,PUNTA TAIOLA,,46.485278,12.224167,2485 +alps_13120,TORRE SABBIONI,,46.489722,12.232500,2531 +alps_13121,CIMA SORA CASERA,,46.485000,12.276944,2398 +alps_13122,FORCA GRANDE,,46.485000,12.229722,2255 +alps_13123,BECCHI D'IMPOSPONDA,,46.469444,12.247778,2087 +alps_13124,CIMA ,CADIN,,46.464444,12.284167,2613 +alps_13125,CIMA ,FORALOSSO,,46.469167,12.288333,2334 +alps_13126,MONTE CIAUDIERONA,,46.466111,12.294167,2587 +alps_13127,TORRE S.VITO,,46.461667,12.245000,2141 +alps_13128,LA SENTINELLA,,46.467500,12.176944,1624 +alps_13129,COL DEL FER,,46.417222,12.165833,2019 +alps_13130,MONTE PENA,,46.402222,12.176944,2196 +alps_13131,COL GRANDE,,46.496667,12.463333,1004 +alps_13132,COL PICCOLO,,46.497222,12.466944,1037 +alps_13133,COL PELOS,,46.496389,12.456111,861 +alps_13134,MONTE FROPPA,,46.455278,12.441111,1167 +alps_13135,COL DELLA CROCE,,46.452500,12.462500,1829 +alps_13136,MONTE AGUDO,,46.440556,12.467778,2130 +alps_13137,MONTANEL,,46.437500,12.462500,2461 +alps_13138,CIMA DI SACCIDO,,46.432500,12.467500,2438 +alps_13139,FORCA VAL LAVINA,,46.431667,12.466389,2399 +alps_13140,CRODA LONGA,,46.427778,12.470000,2471 +alps_13141,TACCA DEL CRIDOLA,,46.426111,12.492500,2410 +alps_13142,TORRE CRIDOLA,,46.426944,12.494444,2457 +alps_13143,MONTE CRIDOLA,,46.426389,12.486667,2581 +alps_13144,CIMA OVEST,,46.426389,12.482222,2564 +alps_13145,PUNTA COZZI,,46.434444,12.498056,2382 +alps_13146,COLLE DELL'ELMA,,46.438056,12.447500,1914 +alps_13147,CRODON DI SCODAVACCA,,46.428611,12.460833,2389 +alps_13148,FORCA SCODAVACCA,,46.422500,12.492778,2043 +alps_13149,TORRE BERTI,,46.421667,12.496944,2155 +alps_13150,CIMA DI GIAF,,46.417778,12.494444,2523 +alps_13151,MONFALCON DI CIMOLIANA,,46.413056,12.497500,2450 +alps_13152,CIMA BOTH,,46.404167,12.481111,2437 +alps_13153,CIMA D'ARADE,,46.408611,12.489722,2503 +alps_13154,CIMA MONFALCON DI MONTANAIA,,46.404444,12.486111,2548 +alps_13155,COLLE S.PIETRO,,46.497222,12.383611,1855 +alps_13156,CRODA DELLA MADONNA,,46.489167,12.380556,1756 +alps_13157,MONTE BRENTE,,46.480556,12.394722,1783 +alps_13158,CRESTI DI POCRODA,,46.475556,12.388333,1786 +alps_13159,COLLE LAGUNE,,46.469444,12.418333,1019 +alps_13160,COLLE DI MEDOL,,46.463056,12.425000,836 +alps_13161,CRODA DI DALEGO,,46.442222,12.430278,1311 +alps_13162,COL DE LA LUM,,46.435833,12.406111,1027 +alps_13163,MONTE CASTELLO,,46.427778,12.379722,953 +alps_13164,MONTE PIDUEL,,46.425278,12.420278,1581 +alps_13165,MONTE VEDORCIA,,46.410000,12.419722,1852 +alps_13166,MONTE ZOVO,,46.419444,12.380278,840 +alps_13167,COL RELOS,,46.406389,12.403333,1635 +alps_13168,COL DE LE FORMIGHE,,46.404167,12.435000,1607 +alps_13169,MARMOLAT,,46.400278,12.457500,2039 +alps_13170,MONTE TRANEGO,,46.448333,12.348611,1849 +alps_13171,COLIO,,46.437778,12.348056,1538 +alps_13172,COL CONTRAS,,46.430000,12.367222,1055 +alps_13173,MONTE RICO,,46.426389,12.376389,953 +alps_13174,MONTE ZUCCO,,46.408333,12.349167,1196 +alps_13175,CRESTA D'AIERON,,46.493611,12.348889,2306 +alps_13176,C352 CIMA SALINA,,46.495556,12.340000,2300 +alps_13177,FORCA BASSA,,46.488056,12.385833,1581 +alps_13178,COL NEGRO,,46.482778,12.351111,1952 +alps_13179,LA MEMORA,,46.480278,12.358611,1874 +alps_13180,COL FALMON,,46.464444,12.374444,1467 +alps_13181,COL DELLA LUM,,46.463333,12.336389,1407 +alps_13182,FORCELLA RIODA,,46.488611,12.652778,1946 +alps_13183,MONTE OBERKOVEL,,46.483889,12.664722,2034 +alps_13184,COL CERVERA,,46.488333,12.627778,1998 +alps_13185,COL DI RIODA,,46.479722,12.625000,1966 +alps_13186,MONTE PEZZOCUCCO,,46.476389,12.640000,1914 +alps_13187,MONTE PALLONE,,46.482222,12.651389,2018 +alps_13188,LAGO DI MEDIANA,,46.465000,12.640278,1464 +alps_13189,COL DI S.GIACOMO,,46.456389,12.616111,2058 +alps_13190,MONTE RIGOLADIS,,46.455278,12.637222,1738 +alps_13191,PALA DI FORNI,,46.453056,12.663333,1737 +alps_13192,MONTE CLAPSAVON,,46.438056,12.631667,2462 +alps_13193,MONTE BIVERA,,46.441389,12.641944,2474 +alps_13194,MONTE ZAUF,,46.428333,12.656389,2245 +alps_13195,MONTE RANCOLIN,,46.421389,12.634722,2096 +alps_13196,MONTE VACCA,,46.415556,12.660278,1819 +alps_13197,CLAP DI VAL,,46.409444,12.662778,1562 +alps_13198,COL DI FORCHIA,,46.407222,12.621111,1233 +alps_13199,FORCELLA LOSCO,,46.496944,12.580556,1778 +alps_13200,COL MENESTRE,,46.496667,12.538611,1630 +alps_13201,COL STAREZZA,,46.496389,12.532222,1813 +alps_13202,COL REMENTERA,,46.490556,12.583056,1910 +alps_13203,MONTE CASSOI,,46.487500,12.556944,1865 +alps_13204,CIMA CAMPO ROSSO,,46.481667,12.542222,1902 +alps_13205,MONTE VERNA,,46.479444,12.556667,2106 +alps_13206,MONTE COLROSOLO,,46.473889,12.552222,2139 +alps_13207,MONTE TUDAIO DI RAZZO,,46.473056,12.582500,2285 +alps_13208,COL MARENDE,,46.471667,12.604722,2079 +alps_13209,MONTE PIOVA,,46.469167,12.571111,2316 +alps_13210,FORCA TORONDON,,46.463611,12.564722,2006 +alps_13211,MONTE CRUSICALAS,,46.459444,12.565000,2105 +alps_13212,MONTE SIMONE,,46.460000,12.559444,2123 +alps_13213,COL PIOI,,46.467222,12.540000,1859 +alps_13214,PASSO DEL LANDRO,,46.468056,12.541389,1820 +alps_13215,CRODON DI TIARFIN,,46.465833,12.591667,2413 +alps_13216,CRODON DEI PUNTIOI,,46.461389,12.593056,2292 +alps_13217,COL DELLA DRIA,,46.448333,12.568611,1774 +alps_13218,CLAP VARMOST,,46.442778,12.567222,1751 +alps_13219,PIC DE SIELA,,46.455556,12.588333,2060 +alps_13220,FORCA FORADA,,46.445556,12.610833,2009 +alps_13221,MONTE LAGNA,,46.443889,12.606111,2134 +alps_13222,MONTE CURNUT,,46.441111,12.555000,1528 +alps_13223,COLLE DAVARAS,,46.429722,12.536111,1237 +alps_13224,COL BOSCON,,46.415556,12.604167,1216 +alps_13225,CIMA URTISIEL,,46.413056,12.531389,2119 +alps_13226,CASTEL BISENZ,,46.413333,12.610833,1336 +alps_13227,CIME DEL LAVINAL,,46.409167,12.533611,2031 +alps_13228,MONTE CIMACUTA,,46.405556,12.553889,2110 +alps_13229,COL TORONDO,,46.480000,12.518333,1575 +alps_13230,DOSSO ZERGOLON,,46.491667,12.508333,1518 +alps_13231,COL PERETTE,,46.482222,12.523333,1453 +alps_13232,COLLE AUDOI,,46.476944,12.499167,1560 +alps_13233,COLLE MEZZARAZZO,,46.472222,12.500278,1545 +alps_13234,COL MAGNENTE,,46.468056,12.521111,1524 +alps_13235,SASSO CROERA,,46.468333,12.498611,1534 +alps_13236,MONTE STIZZINOI,,46.464722,12.510000,1516 +alps_13237,CIMA VENTE,,46.459444,12.518611,1460 +alps_13238,COLLE FAMAZZO,,46.454722,12.521667,1362 +alps_13239,MONTE MIARON,,46.446667,12.500278,2132 +alps_13240,MONTE BOSCHET,,46.431667,12.522500,1706 +alps_13241,MONTE VALLONUT,,46.430278,12.501111,2337 +alps_13242,MONFALCON DI FORNI,,46.416389,12.498889,2453 +alps_13243,CIMA BARBE,,46.413333,12.511111,2303 +alps_13244,CIMA DEI PECOLI,,46.410833,12.515278,2352 +alps_13245,LE CRODE BIANCHE,,46.404167,12.510278,2175 +alps_13246,MONTE VELTRI,,46.457778,12.793333,2003 +alps_13247,CRET DI PIL,,46.453056,12.799167,1910 +alps_13248,MONTE ZAMPIN,,46.436111,12.798889,1442 +alps_13249,COL MARSUL,,46.435278,12.828056,1077 +alps_13250,MONFREDDA,,46.433333,12.813333,1327 +alps_13251,MONTE NOLIA,,46.428889,12.824444,1102 +alps_13252,MONTE NAVIEZZA,,46.426667,12.826111,1077 +alps_13253,MONTE LOSA,,46.493889,12.784444,1953 +alps_13254,MONTE NOVARZA,,46.492500,12.752500,2024 +alps_13255,MONTE VAL BOARIA,,46.493333,12.770000,1987 +alps_13256,MONTE TORONDON,,46.491389,12.736667,2019 +alps_13257,MONTE RINDER PERK,,46.478889,12.729722,1955 +alps_13258,MONTE OLBE,,46.465833,12.740833,1657 +alps_13259,COL GENTILE,,46.466111,12.805556,2075 +alps_13260,MONTE CAMPO,,46.465000,12.785000,1858 +alps_13261,FORA DEL COLADOR,,46.460278,12.796389,1865 +alps_13262,HOCHE BONT,,46.457222,12.763611,1471 +alps_13263,MONTE SESILIS,,46.438333,12.762222,1812 +alps_13264,MONTE CAVALLO DI CERVIA,,46.426389,12.710278,1704 +alps_13265,MONTE NAULENI,,46.426944,12.753611,1790 +alps_13266,MONTE CRETIS,,46.424167,12.764722,1453 +alps_13267,MONTE TINISUTA,,46.418333,12.731389,1827 +alps_13268,MONTE TINISA,,46.413611,12.718333,2120 +alps_13269,MONTE PURA,,46.416944,12.744444,1528 +alps_13270,MONTE MALINS,,46.486111,12.682778,1947 +alps_13271,MONTE PIELTINIS,,46.487500,12.706944,2027 +alps_13272,MONTE OBERKOVEL,,46.483889,12.664722,2034 +alps_13273,MONTE FESTONS,,46.478889,12.677778,1934 +alps_13274,MONTE MORGENLEIT,,46.478611,12.688611,1975 +alps_13275,MONTE RUCHE,,46.459444,12.691944,1489 +alps_13276,MONTE CLAROS,,46.448056,12.674167,1738 +alps_13277,MONTE BRUTTO PASSO,,46.422778,12.685000,2034 +alps_13278,MONTE PRIVA,,46.425556,12.671944,2024 +alps_13279,LE FORCELLE,,46.415000,12.696667,1915 +alps_13280,COL MONTOVO,,46.413333,12.698889,1870 +alps_13281,PUNTA DELL'UCCEL,,46.416111,12.705556,1983 +alps_13282,CIMA AVRONI,,46.412222,12.683333,1814 +alps_13283,CLAP DI LAVRES,,46.405278,12.696944,1661 +alps_13284,COL PIMIN,,46.405000,12.679722,1409 +alps_13285,MONTE TAMAI,,46.490833,12.937222,1970 +alps_13286,MONTE ARVENIS,,46.482500,12.936111,1968 +alps_13287,MONTE CLAUPA,,46.476944,12.928333,1804 +alps_13288,PUNTA BELLA MONT,,46.478889,12.946944,1687 +alps_13289,MONTE DAUDA,,46.477778,12.970556,1765 +alps_13290,IL CAVOLLAT,,46.473056,12.969722,1677 +alps_13291,MONTE CUCASIT,,46.473889,12.917500,1747 +alps_13292,MONTE FORCHIANON,,46.475278,12.891667,1179 +alps_13293,FORCLA MELEIT,,46.480278,12.961667,1537 +alps_13294,ROCCA CRETA,,46.464167,12.852500,1067 +alps_13295,MONTE RUGELA,,46.459722,12.884167,804 +alps_13296,MONTE SERI,,46.457500,12.900000,1145 +alps_13297,MONTE SUELIAS,,46.462500,12.911944,1510 +alps_13298,FORCLA DI CORCE,,46.463056,12.962222,1310 +alps_13299,MONTE DURON,,46.447778,12.987778,1236 +alps_13300,MONTE VAS,,46.450833,12.964722,1403 +alps_13301,MONTE MARSINS,,46.450833,12.937222,1395 +alps_13302,MONTE SADI,,46.455556,12.933611,1344 +alps_13303,MONTE RONCHAIS,,46.447222,12.911111,1232 +alps_13304,MONTE FALCHIA,,46.442222,12.917500,1254 +alps_13305,MONTE CUAR,,46.455556,12.990278,1350 +alps_13306,IL ROCCOLO,,46.459722,12.998333,1089 +alps_13307,COL DEI STOMBI,,46.594167,12.154444,2168 +alps_13308,PEZZORIES,,46.583611,12.129722,2348 +alps_13309,GUSELA PADEON,,46.581389,12.139722,2252 +alps_13310,FORCA DEL POMAGAGNON,,46.575833,12.135556,2178 +alps_13311,CRODA DEL POMAGAGNON,,46.573889,12.140000,2450 +alps_13312,TESTON DI BERTOLDO,,46.571111,12.146111,2435 +alps_13313,CRODA CESTELIS,,46.570278,12.151389,2342 +alps_13314,FORCA ZUMELES,,46.566111,12.166389,2072 +alps_13315,LAGO COATALARES,,46.538056,12.162778,1514 +alps_13316,CIME DI FURCIA ROSSA,,46.575278,12.033333,2806 +alps_13317,CIMA FORMENTON,,46.566389,12.072222,2830 +alps_13318,TOFANA DI DENTRO,,46.557222,12.063889,3238 +alps_13319,NEMESIS,,46.555278,12.052222,2755 +alps_13320,TOFANA DI MEZZO,,46.551111,12.065556,3244 +alps_13321,BUS DE TOFANA,,46.546111,12.069167,2972 +alps_13322,RAZESTES,,46.557222,12.089167,2420 +alps_13323,COL DRUSCIE,,46.543333,12.103889,1779 +alps_13324,PUNTA ANNA,,46.539444,12.071111,2731 +alps_13325,TRE DITA,,46.545278,12.047222,2694 +alps_13326,PUNTA MARIETTA,,46.539722,12.056389,2973 +alps_13327,TOFANA DI ROZES,,46.536944,12.051111,3225 +alps_13328,IL CASTELLETTO,,46.534722,12.041389,2656 +alps_13329,CINQUE TORRI,,46.509167,12.051667,2361 +alps_13330,BECCO D'AIAL,,46.504444,12.106944,1886 +alps_13331,AVERAU,,46.500833,12.036944,2649 +alps_13332,BECCO MURAGLIA,,46.498611,12.059167,2271 +alps_13333,PUNTA NORD,,46.575833,12.018333,2834 +alps_13334,CIMA CAMPESTRIN,,46.570556,12.018889,2910 +alps_13335,MONTE CASTELLO,,46.568056,12.028889,2805 +alps_13336,MONTE CASALE,,46.563889,12.027500,2894 +alps_13337,MONTE CAVALLO,,46.562500,12.024722,2912 +alps_13338,PUNTA NORD DI FANES,,46.556389,12.019167,2969 +alps_13339,FORCA FANIS,,46.553611,12.017500,2864 +alps_13340,PUNTA DI MEZZO DI FANES,,46.551389,12.014167,2989 +alps_13341,CIMA SCOTTONI,,46.553056,12.010278,2874 +alps_13342,PUNTA SUD DI FANES,,46.546111,12.018333,2980 +alps_13343,TREFANES,,46.548611,12.024722,2922 +alps_13344,TORRE TRAVENANZES,,46.548056,12.021389,2900 +alps_13345,CIMA DEL LAGO,,46.556667,12.004167,2654 +alps_13346,FORCA DEL LAGO,,46.556111,12.005833,2486 +alps_13347,LAGO DI LAGOZUOI,,46.551944,12.004167,2182 +alps_13348,LAGAZUOI GRANDE,,46.535833,12.016667,2835 +alps_13349,FORCA LAGAZUOI,,46.530278,12.012778,2573 +alps_13350,FORCA TRAVENANZES,,46.531111,12.019722,2507 +alps_13351,CIMA FALZAREGO,,46.530556,12.021944,2563 +alps_13352,COL DEI BOS,,46.529167,12.029444,2559 +alps_13353,PUNTA BERRINO,,46.527500,12.013889,2556 +alps_13354,LAGAZUOI PICCOLO,,46.529722,12.003056,2778 +alps_13355,PASSO FALZAREGO,,46.518333,12.009444,2105 +alps_13356,CRODA NEGRA,,46.503333,12.024722,2518 +alps_13357,SASS DAI BAC,,46.597500,12.008333,2562 +alps_13358,BOTESTAGNO,,46.596667,12.112778,1513 +alps_13359,PEZOVICO,,46.589444,12.123333,2015 +alps_13360,COL ROSA,,46.586111,12.097500,2166 +alps_13361,MONTE VALLON BIANCO,,46.586111,12.056944,2687 +alps_13362,CADIN DE RINBIANCO,,46.597222,12.289722,2402 +alps_13363,CIMA CIADIN DE LE BISSE,,46.598611,12.286111,2308 +alps_13364,PUNTA ELFIE,,46.589722,12.223889,2739 +alps_13365,MONTE CRISTALLINO,,46.590278,12.221667,2775 +alps_13366,PUNTA MOSCA,,46.590833,12.226667,2701 +alps_13367,LAGO DE ANTORNO,,46.594444,12.264722,1866 +alps_13368,CIME CIADIN DEI TOCCI,,46.591389,12.283056,2473 +alps_13369,COL DEI TOCCI,,46.591389,12.275556,2109 +alps_13370,COL DI VEZZA,,46.576944,12.329167,2158 +alps_13371,FORCA BASSA DI SETTA,,46.570556,12.321389,1953 +alps_13372,CASTELLATO DI SETTA,,46.569444,12.313333,2159 +alps_13373,MONTICELLO,,46.502778,12.316667,2803 +alps_13374,CORNO DEL DOGE,,46.502500,12.250833,2615 +alps_13375,FORCA DELLE CACCIA GRANDE,,46.505833,12.228333,2828 +alps_13376,CACCIA GRANDE,,46.505556,12.225556,3004 +alps_13377,LE TRE SORELLE,,46.506389,12.230000,3005 +alps_13378,CIME DI VALBONA,,46.512222,12.238333,2899 +alps_13379,FORCA MICHELE,,46.587778,12.218611,2590 +alps_13380,TRE SIORPAES,,46.586389,12.300278,2556 +alps_13381,CIMON DI CRODA LISCIA,,46.585833,12.295556,2568 +alps_13382,TORRE WUNDT,,46.587778,12.286944,2517 +alps_13383,MONTE POPENA,,46.585278,12.243889,2225 +alps_13384,LAGO DI MISURIA,,46.582222,12.255000,1745 +alps_13385,CIMA D'ANTORNO,,46.584167,12.278056,2416 +alps_13386,TORRE DEL DIAVOLO,,46.580278,12.280833,2598 +alps_13387,CIMA CADIN DI S.LUCANO,,46.577500,12.288056,2839 +alps_13388,CIMA CIADIN DE LA NEVE,,46.573056,12.279167,2757 +alps_13389,COL DE VARDA,,46.568889,12.266389,2174 +alps_13390,FORCE DE POPENA,,46.573333,12.227778,2214 +alps_13391,CRODA DI FAUSA MARZA,,46.571944,12.217222,2504 +alps_13392,FORCA DE LA NEVE,,46.574444,12.282500,2471 +alps_13393,CIMA CADIN DI MISURINA,,46.574444,12.276111,2674 +alps_13394,MONTE CAMPODURO,,46.557778,12.295000,2244 +alps_13395,PALE DI MENOTTO,,46.559444,12.302500,2248 +alps_13396,FORCLA MARAIA,,46.561667,12.291389,2101 +alps_13397,COL CUCO,,46.545278,12.228333,1820 +alps_13398,CRODA DEL FOGO,,46.520000,12.238333,2567 +alps_13399,TACCO DEL TODESCO,,46.517222,12.308333,2318 +alps_13400,CIMA SCHIAVINA,,46.505556,12.301389,2782 +alps_13401,PALA DI MEDUCE,,46.501944,12.297500,2864 +alps_13402,CIMA VANEDEL,,46.501111,12.290556,2803 +alps_13403,CAMP LE S.MARCO,,46.503889,12.289444,2777 +alps_13404,MESCOL,,46.510000,12.285000,2413 +alps_13405,CRESTA VANEDEL,,46.500833,12.281667,2725 +alps_13406,CRODA ROTTA,,46.509167,12.273056,2632 +alps_13407,FORCA VANEDEL,,46.499167,12.269167,2372 +alps_13408,CRODA DEL BANCO,,46.521111,12.250000,2150 +alps_13409,LAGO DI SORAPIS,,46.520833,12.223611,1923 +alps_13410,MONTE MEDUCE,,46.517778,12.296667,2402 +alps_13411,CIME DI VALLONGA,,46.501667,12.310000,2742 +alps_13412,CIME TIZIANO,,46.500278,12.300556,2802 +alps_13413,MONTE CRISTALLO,,46.575278,12.200556,3221 +alps_13414,PIZ POPENA,,46.576389,12.207500,3152 +alps_13415,CIMA DI MEZZO,,46.578056,12.195833,3154 +alps_13416,AGOLOSCHNER,,46.578611,12.211111,2939 +alps_13417,FORCA DEL CRISTALLO,,46.575833,12.205000,2808 +alps_13418,CORNO D'ANGOLO,,46.570278,12.219722,2430 +alps_13419,CIME DI MARCOIRA,,46.539167,12.215278,2428 +alps_13420,FORCA MARCOIRA,,46.536944,12.214444,2307 +alps_13421,COL SIRO,,46.530278,12.192778,2300 +alps_13422,CIME CIADIN DEL LOUDO,,46.530833,12.213333,2670 +alps_13423,RAZESTA,,46.526667,12.208056,2768 +alps_13424,FORCA FALORIA,,46.526111,12.189444,2309 +alps_13425,MONTE CIASA DIO,,46.527778,12.183056,2362 +alps_13426,CRODA ROTTA,,46.519444,12.187500,2670 +alps_13427,PUNTA NERA,,46.516389,12.191667,2847 +alps_13428,LA SELLETTA,,46.521111,12.194167,2673 +alps_13429,ZURLON,,46.510833,12.212222,3053 +alps_13430,PUNTA SORAPISS,,46.506944,12.211667,3205 +alps_13431,CRODA MARCORA,,46.503333,12.208889,3154 +alps_13432,FORCA DI BIVACCO,,46.498889,12.213333,2670 +alps_13433,DITO DI DIO,,46.515556,12.218611,2603 +alps_13434,VECIO DEL FORAME,,46.587222,12.177778,2868 +alps_13435,CRESTA BIANCA,,46.581389,12.185833,2932 +alps_13436,CRISTALLINO D'AMPEZZO,,46.582500,12.190278,3008 +alps_13437,CRESTA BELLA,,46.595556,12.191667,2722 +alps_13438,FORCA VERDE,,46.596667,12.178889,2380 +alps_13439,GAROLLES,,46.564167,12.172500,2230 +alps_13440,MONTE FROPPA,,46.504167,12.340000,2840 +alps_13441,CIMON DEL FROPPA,,46.507222,12.340556,2932 +alps_13442,CIMA ARDUINI,,46.510833,12.335833,2769 +alps_13443,CIMA PETOZ,,46.508333,12.342500,2877 +alps_13444,PUNTA TERESA,,46.510278,12.344167,2868 +alps_13445,LE SELLE EST,,46.512500,12.344444,2851 +alps_13446,LE SELLE OUEST,,46.514167,12.340833,2828 +alps_13447,TORRE AUGUSTO,,46.516389,12.345000,2718 +alps_13448,CRODA DEL ARBEL,,46.518889,12.344722,2729 +alps_13449,CRODA BAION,,46.527222,12.346111,2573 +alps_13450,SPALLA DELL'ARBEL,,46.521944,12.347500,2678 +alps_13451,FORCA MARMAROLE,,46.505000,12.342500,2661 +alps_13452,CRESTA DEI INVALIDI,,46.503056,12.347222,2783 +alps_13453,CRODA BIANCA,,46.504444,12.351389,2841 +alps_13454,FORCA PERONAL,,46.504722,12.360556,2207 +alps_13455,MONTE PERONAT,,46.505278,12.363889,2409 +alps_13456,MONTE CIASTELIN,,46.509444,12.375000,2570 +alps_13457,MONTE CIAREDO,,46.513889,12.386111,2504 +alps_13458,TORRE PIAN DEI BUOI,,46.517222,12.390000,2358 +alps_13459,COL LANTEDESCO,,46.523333,12.376389,2077 +alps_13460,CIMA DEI CAMOSCI,,46.522778,12.340278,2673 +alps_13461,CRODA ALTA DI SOMPRADE,,46.527778,12.335278,2655 +alps_13462,COL DE BAION,,46.526944,12.360278,1730 +alps_13463,COL DE LIGONTO,,46.581667,12.405556,1820 +alps_13464,MONTE RUSIANA,,46.562778,12.368889,1791 +alps_13465,COL DEL CUCCO,,46.550833,12.346389,1459 +alps_13466,MONTE AGULDO,,46.546944,12.405556,1573 +alps_13467,COL BURGICU,,46.533889,12.407500,1769 +alps_13468,PUNTA ANITA,,46.504167,12.335833,2765 +alps_13469,CRODA DE RONDOI,,46.499722,12.401944,1774 +alps_13470,COL DE GIRALBA,,46.594722,12.381111,2081 +alps_13471,CRODA GRAVASECCA,,46.597778,12.380278,2326 +alps_13472,PUNTA DI BUCO,,46.594444,12.408889,2563 +alps_13473,PUNTA LINA,,46.595556,12.409722,2612 +alps_13474,CRODA RIZZARDI,,46.593056,12.406667,2388 +alps_13475,FORCA DI TACCO,,46.595833,12.435833,2347 +alps_13476,CORNO CAPELEI,,46.592222,12.449444,2059 +alps_13477,LAGO AIARNOLA,,46.591944,12.459167,1573 +alps_13478,CRODA DA CAMPO,,46.589444,12.434167,2712 +alps_13479,CASTELLATO DI AMBATA,,46.589444,12.422222,2006 +alps_13480,CIMA ALBERTA,,46.583333,12.444444,2424 +alps_13481,MONTE AIARNOLA,,46.580556,12.446389,2456 +alps_13482,CRODA GRIGNA,,46.580278,12.435278,2305 +alps_13483,MONTE ZOVO,,46.581389,12.467500,1711 +alps_13484,LAGO SANTA ANNA,,46.581389,12.480556,1380 +alps_13485,COL VAL DAFOI,,46.550000,12.428611,943 +alps_13486,LAGO DI AURONZO,,46.544167,12.452222,826 +alps_13487,COLLE DI VILLA PICCOLA,,46.533056,12.447222,1551 +alps_13488,CRODA ALTA,,46.531389,12.447500,1557 +alps_13489,CRODA BASSA,,46.528056,12.454722,1421 +alps_13490,COL CONTRAS,,46.521389,12.473889,1005 +alps_13491,COL VIDAL,,46.516944,12.430556,1880 +alps_13492,COL DEI BUOI,,46.518333,12.410556,1802 +alps_13493,COL CERVERA,,46.507222,12.419167,1920 +alps_13494,COL DE POECA,,46.508056,12.486667,1406 +alps_13495,COL DELLE RIVE,,46.501944,12.471667,959 +alps_13496,COL PRAMOSEI,,46.507500,12.492222,1531 +alps_13497,COL CARADIES,,46.575556,12.496389,1528 +alps_13498,LAGO CESTELLA,,46.568611,12.490556,1408 +alps_13499,COL CIADINS,,46.556111,12.495556,1382 +alps_13500,COL PICCOLO,,46.539722,12.491389,1545 +alps_13501,MONTE TUDAIO,,46.519722,12.496944,2140 +alps_13502,MONTE COSTON,,46.566389,12.626111,2000 +alps_13503,TERZA PICCOLI,,46.560000,12.624722,2334 +alps_13504,COL TRONDO,,46.545000,12.538611,1314 +alps_13505,MONTE COL,,46.540278,12.570833,2079 +alps_13506,TERZA MEDIA,,46.540833,12.618889,2455 +alps_13507,CRODA CASARA,,46.536111,12.624167,2372 +alps_13508,TERZA GRANDE,,46.526944,12.621389,2586 +alps_13509,CRODA DI MEZZODI,,46.532778,12.577778,2394 +alps_13510,MONTE CORNON,,46.522500,12.581667,2378 +alps_13511,CIMA MALPASSO,,46.521111,12.553333,2133 +alps_13512,FORCA MALPASSO,,46.518333,12.557778,2013 +alps_13513,CRESTA CASTELLATI,,46.511389,12.556667,2491 +alps_13514,FORCA BRENTONI,,46.511389,12.559722,2346 +alps_13515,MONTE BRENTONI,,46.512778,12.565833,2548 +alps_13516,TORRIONI DI VAL D'INFERNO,,46.512778,12.570556,2409 +alps_13517,MONTE PUPERA VAL GRANDE,,46.509722,12.542222,2520 +alps_13518,CIMA OVEST,,46.508889,12.537778,2513 +alps_13519,SASSO MALPASSO,,46.523889,12.548333,2052 +alps_13520,CRODA NAIE,,46.525000,12.613333,2238 +alps_13521,PASSO OBERENGHE,,46.521111,12.624444,2081 +alps_13522,FORCA VALGRANDE,,46.517222,12.581944,2044 +alps_13523,CRETA DI MIMOIAS,,46.511111,12.625833,2320 +alps_13524,COL DELLE VIZZE,,46.507500,12.591944,1618 +alps_13525,COL SARENDE,,46.507222,12.570833,2106 +alps_13526,MONTE LOSCO,,46.501667,12.576111,1992 +alps_13527,FORCA CAMPOROSSO,,46.503333,12.574444,1913 +alps_13528,CIMA CARRO,,46.590278,12.642778,2136 +alps_13529,MONTE FIORITO,,46.537222,12.635833,2131 +alps_13530,MONTE HOBERDEIRER,,46.531667,12.661111,2208 +alps_13531,CRESTA DI ENGHE,,46.520833,12.634444,2414 +alps_13532,CRETON DI CLAP PICCOLO,,46.525556,12.664722,2439 +alps_13533,PASSO ELBEL,,46.519167,12.651389,1963 +alps_13534,CAMPANILE DI MIMOIAS,,46.518333,12.653333,1998 +alps_13535,MONTE PARADARA,,46.511111,12.639167,1989 +alps_13536,MONTE CRISSIN,,46.516111,12.518056,2503 +alps_13537,MONTE SCHIAVON,,46.510000,12.512778,2326 +alps_13538,COL DEL CRISSIN,,46.518611,12.526111,2074 +alps_13539,COL DELLE SITE,,46.534167,12.528056,1427 +alps_13540,CIMA BRAGAGNINA,,46.519722,12.501667,2281 +alps_13541,FORCA ZAMBEI,,46.575278,12.500833,1437 +alps_13542,COSTA DI CIACULA,,46.553056,12.517778,1373 +alps_13543,PRA BECCHEI,,46.556111,12.505278,1414 +alps_13544,MONTE PIEDO,,46.542778,12.499167,1686 +alps_13545,COSTA DI MORTE,,46.562222,12.531667,1248 +alps_13546,CRESTA DEI TOFI,,46.545833,12.516111,1437 +alps_13547,FORCA VALMADEN,,46.546111,12.507222,1526 +alps_13548,MONTE MEZZANA,,46.594722,12.650833,2249 +alps_13549,MONTE CURIE,,46.595556,12.613611,2035 +alps_13550,MONTE TALM,,46.537778,12.831111,1728 +alps_13551,CRET DI NAVOS,,46.588333,12.766667,1241 +alps_13552,MONTE DEL LARICE,,46.586944,12.713056,2025 +alps_13553,MONTE CHIANE,,46.583333,12.739167,1784 +alps_13554,COL DEI MIRTILLI,,46.570556,12.731389,1521 +alps_13555,MONTE TUGLIA,,46.566111,12.765833,1931 +alps_13556,COLLE DEGLI SCOIATTOLI,,46.559167,12.752500,1643 +alps_13557,PASSO DI ENTRALAIS,,46.550556,12.768333,2190 +alps_13558,MONTE CIMONE,,46.551389,12.763056,2422 +alps_13559,MONTE CRETA FORATA,,46.542500,12.735833,2462 +alps_13560,CRETON DI TUL,,46.538889,12.725833,2287 +alps_13561,MONTE GEU,,46.553889,12.745278,2109 +alps_13562,MONTE SIERA,,46.549167,12.710833,2443 +alps_13563,PICCOLO SIERA,,46.545278,12.716667,2430 +alps_13564,FORCA CRETA FORATA,,46.541944,12.723889,2099 +alps_13565,CRETA DELLA FUINA,,46.550556,12.773056,2350 +alps_13566,MONTE PLEROS,,46.550556,12.779444,2314 +alps_13567,CRETE DI CHIAMPIZULON,,46.548889,12.789722,2085 +alps_13568,CIMA DIECI,,46.549722,12.726389,2151 +alps_13569,CRESTA DEL PETTINE,,46.547778,12.726389,2165 +alps_13570,CRETE DELLA FUINA,,46.543889,12.763611,2065 +alps_13571,COL DI SIERA,,46.535000,12.710278,1730 +alps_13572,MONTE DI TRUIA,,46.535833,12.786944,1415 +alps_13573,COLLE CHIAVAZ,,46.529444,12.752500,1252 +alps_13574,COL PESARINA,,46.530556,12.770833,1264 +alps_13575,COL PULINAR,,46.515833,12.757778,1027 +alps_13576,MONTE SAN GIACOMO,,46.502222,12.747222,1725 +alps_13577,MONTE VINADIA,,46.502500,12.710833,1843 +alps_13578,COLLE SAN PIETRO,,46.498889,12.728056,1977 +alps_13579,COL MAGGIORE,,46.560278,12.821667,1317 +alps_13580,MONTE DELLE CAVERNE,,46.591667,12.707500,2073 +alps_13581,MONTE DELLA PIANA,,46.587500,12.704444,2162 +alps_13582,MONTE DEL FERRO,,46.583611,12.668056,2337 +alps_13583,COL DEI MUGHI,,46.545000,12.682500,1973 +alps_13584,CIMA DI RIOBIANCO,,46.531389,12.680833,2400 +alps_13585,CRETON DI CULZEI,,46.529722,12.677222,2458 +alps_13586,TORRE SAPPADA,,46.528056,12.667778,2462 +alps_13587,CRETON DI CLAP GRANDE,,46.529167,12.670556,2487 +alps_13588,FORCA DEL ALPINO,,46.528611,12.673333,2002 +alps_13589,CRETON DELL'ARCO,,46.533333,12.680833,2353 +alps_13590,PASSO DELL'ARCO,,46.540833,12.681111,1907 +alps_13591,MONTE CHIESA,,46.533611,12.677222,2195 +alps_13592,COL LANAR,,46.535556,12.672778,2140 +alps_13593,CRETON DI CLAP PICCOLO,,46.525556,12.664444,2439 +alps_13594,CAMP LUISA,,46.598333,12.667222,2429 +alps_13595,CRESTA DEL FERRO,,46.597500,12.684167,2457 +alps_13596,LAGHI D'OLBE,,46.596944,12.691111,2156 +alps_13597,PUNTA SALINAS,,46.597500,12.759444,1812 +alps_13598,MONTE CHIADIN,,46.597222,12.738333,2287 +alps_13599,MONTE CASARO,,46.594722,12.731667,2105 +alps_13600,GAMSPITZ,,46.592222,12.996389,1847 +alps_13601,MONTE TERZO,,46.573333,12.954444,2034 +alps_13602,PIZ DI MEDE,,46.560000,12.931389,2094 +alps_13603,CIMONE DI CRASULINA,,46.566944,12.951667,2104 +alps_13604,ZOUFPLAN,,46.562500,12.970278,1999 +alps_13605,PIZZO DEL CORVO,,46.560000,12.973889,1945 +alps_13606,MONTE TENCHIA,,46.554444,12.972778,1840 +alps_13607,MONTE VALSECCA,,46.548611,12.928889,1966 +alps_13608,MONTE RUNCH,,46.542778,12.932778,1845 +alps_13609,BERETTA DI CULZIN,,46.534722,12.926389,1497 +alps_13610,ROCCIA LA PALAS,,46.521667,12.949444,1030 +alps_13611,CRET DI MOZ,,46.520556,12.939167,1119 +alps_13612,CUEL PICCIUL,,46.514167,12.932222,1495 +alps_13613,MONTE DI SUTRIO,,46.513333,12.960556,1339 +alps_13614,QUELDAIER,,46.503056,12.955278,1510 +alps_13615,MONTE PEZZET,,46.538889,12.910556,1665 +alps_13616,MONTE TALM,,46.537500,12.831111,1728 +alps_13617,BOSO DI POVOLARO,,46.514722,12.892222,955 +alps_13618,PIC CHIADIN,,46.596667,12.891111,2302 +alps_13619,MONTE FLORIZ,,46.586944,12.896944,2184 +alps_13620,FORA PLUMBS,,46.579167,12.888611,1976 +alps_13621,MONTE CROSTIS,,46.571667,12.891111,2250 +alps_13622,MONTE GOLA,,46.581389,12.873611,1938 +alps_13623,MONTE BIOICHIA,,46.575833,12.860833,1753 +alps_13624,COVENTAS,,46.572222,12.876389,2032 +alps_13625,MONTE PEZZACUL,,46.566389,12.908056,2176 +alps_13626,MONTE NEVAL,,46.564722,12.890833,2061 +alps_13627,GIAVO PICCOLO,,46.666111,12.121389,2372 +alps_13628,MONTE MURO,,46.667222,12.088889,2458 +alps_13629,FORCA COCODEIN,,46.660000,12.102500,2332 +alps_13630,REMEDA ROSSA,,46.652500,12.110833,2605 +alps_13631,LAGO DE FOSSES,,46.653611,12.094444,2142 +alps_13632,COL DE RA SIORES,,46.654444,12.073611,2332 +alps_13633,COL DE LASTE GRANDE,,46.651667,12.047222,2311 +alps_13634,COL DE LASTE PICCOLO,,46.653056,12.052222,2297 +alps_13635,LAGO DI SENNES,,46.652500,12.057778,2120 +alps_13636,PICCOLA CRODA ROSSA,,46.645833,12.124167,2859 +alps_13637,LAGO PICCOLO,,46.649722,12.095000,2146 +alps_13638,LAGO DI REMEDA ROSSA,,46.646111,12.101944,2120 +alps_13639,COLLE DELLA MACCHINA,,46.641389,12.050556,2029 +alps_13640,MONTE GERALBES,,46.640278,12.111389,2456 +alps_13641,COL PIERA MAURA,,46.638889,12.064167,2140 +alps_13642,LAGO DI FODARA,,46.634167,12.072778,1990 +alps_13643,COLLE DI RU,,46.633889,12.050000,2076 +alps_13644,BANC DAL SE,,46.626944,12.049444,2330 +alps_13645,CASTELLO DI VALBONES,,46.630556,12.128611,2380 +alps_13646,FORCA CAMIN,,46.616389,12.052222,2395 +alps_13647,CRODA DEL BECCO,,46.610556,12.052222,2736 +alps_13648,CRODA D'ANTRUILES,,46.613056,12.064444,2405 +alps_13649,BECHEI DI SOPRA,,46.607778,12.044444,2794 +alps_13650,CRODA DE R'ANCONA,,46.614167,12.117778,2366 +alps_13651,TABURLO,,46.603889,12.081389,2261 +alps_13652,TAE,,46.600556,12.070556,2511 +alps_13653,MUNTAJELA DI SENES,,46.671667,12.018611,2787 +alps_13654,PASSO SENES,,46.674167,12.032778,2519 +alps_13655,COL DELLE FEZERES,,46.657222,12.031667,2357 +alps_13656,CRODA DI TAMERSC,,46.657500,12.015000,2141 +alps_13657,MONTE LOIRES,,46.638611,12.001111,2527 +alps_13658,FURCIA DAI FERS,,46.634167,12.021111,2534 +alps_13659,SELLA DI FANES,,46.630278,12.004167,2655 +alps_13660,PASSO DI SAN ANTONIO,,46.627778,11.999167,2466 +alps_13661,LAGO VERDE,,46.609722,12.008056,2043 +alps_13662,LAGO DI LIMO,,46.608056,12.020278,2159 +alps_13663,CIMA DI LIMO,,46.609722,12.020833,2244 +alps_13664,PASSO DI LIMO,,46.608611,12.015833,2172 +alps_13665,SASSO DAI BAC,,46.597500,12.008056,2562 +alps_13666,SASSO DELLA PARA,,46.624722,12.074444,2462 +alps_13667,PUNTA CAMIN,,46.618611,12.052500,2610 +alps_13668,LA CRODETTA,,46.651944,12.134722,2445 +alps_13669,LA CRODACCIA,,46.648889,12.145000,2531 +alps_13670,CRODA ROSSA,,46.634722,12.143611,3146 +alps_13671,COL FIEDO,,46.629444,12.142222,2804 +alps_13672,GUMPALSPITZEN,,46.639444,12.150556,2765 +alps_13673,ZUOGHE,,46.611111,12.143889,2053 +alps_13674,LAGO DI RUFIEDO,,46.610556,12.161944,1502 +alps_13675,MONTE SELVA,,46.691389,12.153611,1648 +alps_13676,SASSO DEL SIGNORE,,46.697778,12.107222,2447 +alps_13677,MONTE DELLE RONDINI,,46.684167,12.130278,2481 +alps_13678,GRANDE APOSTOLO,,46.695833,12.094167,1995 +alps_13679,CAMPO DEL CAVALLO PICCOLO,,46.689167,12.109167,2594 +alps_13680,CAMPO CAVALLO,,46.686667,12.118333,2559 +alps_13681,CRODA DEL BECCO,,46.675000,12.072500,2810 +alps_13682,GIAVO GRANDE,,46.676389,12.105000,2480 +alps_13683,PUNTA DELLA QUAIRA DI SENES,,46.676667,12.056111,2659 +alps_13684,CIMA DE RICIOGOGN,,46.677222,12.034444,2654 +alps_13685,COL BOCIA,,46.694167,12.014167,2335 +alps_13686,MONTE DI GROPES,,46.685833,12.009167,2485 +alps_13687,MONTE DAUMO,,46.694722,12.132222,2263 +alps_13688,LASTRON DEI SCARPERI,,46.656944,12.316667,2957 +alps_13689,CHODON DI SAN CANDIDO,,46.650556,12.323333,2891 +alps_13690,SASSO VECCHIO,,46.654444,12.325556,2919 +alps_13691,LAGHI DEL PIANI,,46.639167,12.315556,2335 +alps_13692,SALSICCHIA,,46.635278,12.312500,2448 +alps_13693,MONTE PATERNO,,46.629722,12.315556,2744 +alps_13694,CRODA PASSAPORTO,,46.624167,12.316667,2701 +alps_13695,FORCA LAVAREDO,,46.622222,12.311389,2454 +alps_13696,GRANDE LAVAREDO,,46.618889,12.302500,2999 +alps_13697,LE CIANPEDELE,,46.604167,12.302222,2346 +alps_13698,TORRE DEI SCARPERI,,46.645000,12.286944,2687 +alps_13699,CIME BULLA SUD,,46.663056,12.260556,2848 +alps_13700,CRODA DEI RONDOI,,46.649722,12.271389,2873 +alps_13701,MONTE RUDO,,46.647500,12.268611,2826 +alps_13702,MONTE MATTINA,,46.652500,12.290833,2493 +alps_13703,PASSO GRANDE DEI BONDOI,,46.646944,12.278611,2289 +alps_13704,TORRE DEI TOBLIN,,46.641944,12.307778,2617 +alps_13705,SASSO DI SESTO,,46.638889,12.308333,2539 +alps_13706,LAGO DI LANDRO,,46.632500,12.232500,1403 +alps_13707,MONTE PIANA,,46.615278,12.242500,2324 +alps_13708,CRODA DE L'ARGHENA,,46.622222,12.269167,2252 +alps_13709,FORCA DEI CASTRATI,,46.618889,12.246667,2272 +alps_13710,MONTE DE FORA,,46.610556,12.281667,2221 +alps_13711,COLLE VALFONDA,,46.605556,12.224167,1798 +alps_13712,COL DE LE BISSE,,46.603056,12.290278,2280 +alps_13713,COLLE BANCE,,46.599167,12.226667,2319 +alps_13714,COL DE LE SALINE,,46.601389,12.258889,1955 +alps_13715,PUNTA GLANVELL,,46.672500,12.181389,2737 +alps_13716,PICCO DI VALANDRO,,46.672500,12.185278,2839 +alps_13717,MONTE SPECIE,,46.644444,12.212500,2307 +alps_13718,COL ROTONDO DEL CANOPE,,46.631111,12.189722,2204 +alps_13719,COL DI SPECIE,,46.628333,12.216111,2100 +alps_13720,LAGO NEGRO,,46.615278,12.168333,1506 +alps_13721,IL FORAME,,46.603333,12.175556,2445 +alps_13722,MONTE FUMO,,46.606389,12.210000,2126 +alps_13723,COSTA BELLA,,46.601389,12.193056,2561 +alps_13724,FORAME DI FUORI,,46.598056,12.178889,2450 +alps_13725,MONTE LUNGO,,46.698056,12.178611,2282 +alps_13726,PUNTA DEL MONEGO,,46.692778,12.186111,2199 +alps_13727,MONTE CASAMUZZA,,46.684722,12.201111,2333 +alps_13728,MONTE DELLA FERRARA,,46.686667,12.235000,1899 +alps_13729,IL NOSSO,,46.683611,12.215833,1937 +alps_13730,PUNTA DI SERLA,,46.682222,12.182778,2314 +alps_13731,ROCCHE DELLA CHIESA,,46.676944,12.170833,2280 +alps_13732,CRODA BAGNATA,,46.670278,12.233056,2254 +alps_13733,C692 CIMA GANDA DI MEZZO,,46.695556,12.263889,2600 +alps_13734,CIMA GANDA DI SUD-EST,,46.691111,12.266111,2697 +alps_13735,ROCCA DEI BARANCI,,46.688611,12.277500,2966 +alps_13736,CIMA SUD,,46.685000,12.273611,2860 +alps_13737,TORRE BERGMANN,,46.681389,12.276944,2806 +alps_13738,CIMA EST,,46.689722,12.281389,2907 +alps_13739,MONTE CASELLA DI FUORI,,46.688611,12.327222,2007 +alps_13740,PICCOLA CRODA DI BARANCI,,46.683611,12.258611,2790 +alps_13741,CRODA DEI BARANCI,,46.681667,12.256111,2905 +alps_13742,CIMA PIATTA ALTA,,46.680278,12.256944,2905 +alps_13743,CIMA PIATTA DI MEZZO,,46.676389,12.264722,2870 +alps_13744,CIMA PIATTA BASSA,,46.668056,12.273333,2581 +alps_13745,CIME DI SESTO,,46.675278,12.326111,2870 +alps_13746,CAMP DEI SASSI,,46.678611,12.315278,2575 +alps_13747,PUNTA DEI TRE SCARPERI,,46.668889,12.317222,3145 +alps_13748,TORRE DEI VIENNESI,,46.665833,12.311944,2892 +alps_13749,MONTE CROCE ALTA,,46.677222,12.241111,2189 +alps_13750,DOSSO PIANO,,46.668056,12.241111,2463 +alps_13751,LAGO MONEGA DI MEZZO,,46.671944,12.253056,2222 +alps_13752,CIME BULLA NORD,,46.666111,12.260000,2817 +alps_13753,SELLETTA DEL DOSSO PIANO,,46.665833,12.243889,2377 +alps_13754,PASSO SILVELLA,,46.671111,12.475556,2329 +alps_13755,COL QUATERNA,,46.667222,12.472222,2503 +alps_13756,COL DE LA CRODATA,,46.654167,12.485278,2310 +alps_13757,MONTE COVOLO,,46.671389,12.412778,1908 +alps_13758,I FORNATTI,,46.669167,12.464167,2301 +alps_13759,COL DELLA CROCE,,46.661389,12.425833,1796 +alps_13760,PASSO MONTECROCE COMELICO,,46.655278,12.421389,1631 +alps_13761,CIMA DEI COLESEI,,46.642778,12.421389,1971 +alps_13762,CRODA SORA I COLESEI,,46.643889,12.406389,2371 +alps_13763,FORCA POPERA,,46.643333,12.403611,2291 +alps_13764,PALA DI POPERA,,46.642778,12.398333,2582 +alps_13765,LAGO DI POPERA,,46.639167,12.395278,2142 +alps_13766,CIMA POPERA,,46.627778,12.393333,2964 +alps_13767,FULMINI,,46.626667,12.396111,2745 +alps_13768,CAMP DI POPERA,,46.620556,12.401111,2657 +alps_13769,CIMA BAGNI,,46.615278,12.410278,2983 +alps_13770,SASSO DI SELVAPIANA,,46.625556,12.421111,1989 +alps_13771,FORCA ANNA,,46.608333,12.421667,2570 +alps_13772,PUNTA ANNA,,46.609167,12.423333,2707 +alps_13773,PUNTA S.LEONARDO,,46.608889,12.430000,2468 +alps_13774,PALA CIAPEL,,46.618611,12.428611,2013 +alps_13775,ROCCA DEI BAGNI,,46.613889,12.435278,2271 +alps_13776,CIMA DI PADOLA,,46.603611,12.433056,2623 +alps_13777,ROCCA DI CAMPO,,46.606667,12.445556,2155 +alps_13778,CRODA DI TACCO,,46.599444,12.431389,2612 +alps_13779,CIMA DE AMBATA,,46.606111,12.417778,2872 +alps_13780,CIMA COFTE,,46.601944,12.419722,2662 +alps_13781,FORCA PAOLA,,46.601944,12.413333,2590 +alps_13782,CRODA DI LIGONTO,,46.599167,12.411389,2786 +alps_13783,LAGO CADIN,,46.622778,12.430000,1623 +alps_13784,LAGO DI CAMPO,,46.611667,12.468333,1299 +alps_13785,PRATI DI CRODA ROSSA,,46.661389,12.369167,2056 +alps_13786,WURZBACH,,46.650556,12.377222,2675 +alps_13787,CRODA ROSSA DI SESTO,,46.643611,12.381389,2965 +alps_13788,SASSO FUOCO,,46.640556,12.386111,2593 +alps_13789,CIMA UNDICI,,46.636389,12.378333,3092 +alps_13790,PUNTA RIVETTI,,46.637222,12.385278,2709 +alps_13791,CRESTA ZSIGMONDY,,46.631389,12.383889,2998 +alps_13792,MONTE POPERA,,46.627500,12.389444,3046 +alps_13793,MONTE GIRALBA DI SOPRA,,46.622778,12.382778,2930 +alps_13794,FORCELLA GIRALBA,,46.620000,12.370556,2431 +alps_13795,PICCOLA CRODA DEI TONI,,46.620000,12.365278,2728 +alps_13796,CRODA DEI TONI,,46.619167,12.359722,3094 +alps_13797,COLLERENA,,46.624444,12.350000,2607 +alps_13798,PASSO DEL COLLERENA,,46.623333,12.345000,2491 +alps_13799,MONTE CENGIA,,46.620556,12.339722,2559 +alps_13800,PUNTA LAVINA LUNGA,,46.653333,12.332222,2770 +alps_13801,CIMA UNA,,46.639444,12.347778,2698 +alps_13802,IL PULPITO ALTO,,46.635000,12.352500,2531 +alps_13803,CRODA FISCALINA,,46.636111,12.337500,2635 +alps_13804,CRODE DEI PIANI,,46.629444,12.331389,2658 +alps_13805,LA LISTA,,46.628333,12.365278,2413 +alps_13806,LA MITRA,,46.628889,12.376389,2788 +alps_13807,MONTE GIRALBA DI SOTTO,,46.620833,12.387222,2981 +alps_13808,CRODA ALBERTI,,46.613611,12.361389,2029 +alps_13809,CIMA SUD,,46.610833,12.363611,2945 +alps_13810,CIMA D'AURONZA,,46.608611,12.363611,2914 +alps_13811,PUNTA DE L'AGNEL,,46.605278,12.360556,2736 +alps_13812,LAGO NERO,,46.613056,12.368889,2231 +alps_13813,PUNTA MARIA,,46.607222,12.370833,2659 +alps_13814,TORRE CADORE,,46.601111,12.378889,2445 +alps_13815,CRODA GRAVASECCA,,46.597778,12.380278,2326 +alps_13816,CIME PEZZIOS,,46.603333,12.377778,2439 +alps_13817,MONTE ROSSO,,46.683056,12.438889,2390 +alps_13818,MONTE RINALDO,,46.598889,12.658056,2473 +alps_13819,CRESTA DEL PALOMBINO,,46.642778,12.570278,2357 +alps_13820,PASSO PALOMBINO,,46.634167,12.563611,2035 +alps_13821,COLLE SPINA,,46.635833,12.592778,1888 +alps_13822,TORRIONE DEI LONGERIN,,46.629167,12.561389,2571 +alps_13823,CRODE DEI LONGERIN,,46.626389,12.560000,2547 +alps_13824,MONTE SCHIARON,,46.620833,12.591389,2246 +alps_13825,MONTE S.DANIELE,,46.615000,12.576389,2229 +alps_13826,COLLE DEI PRADETTI,,46.606389,12.564167,1757 +alps_13827,FORCA ZOVO,,46.602500,12.591667,1606 +alps_13828,MONTE ZOVO,,46.600556,12.558889,1943 +alps_13829,COL DELLA SENTINELLA,,46.600278,12.597500,1715 +alps_13830,CIMA DELLA MINIERI,,46.627778,12.755556,2457 +alps_13831,MONTE AVANZA,,46.626389,12.751389,2489 +alps_13832,MONTE PERALBA,,46.629444,12.719444,2694 +alps_13833,CRETA DI FLEONS,,46.631389,12.760278,2141 +alps_13834,NAVASTOLT,,46.628889,12.764722,2321 +alps_13835,STRETTA DI FLEONS,,46.628333,12.780833,1595 +alps_13836,PIC CHIADENS,,46.625833,12.730000,2490 +alps_13837,CRETE CACCIATORI,,46.625833,12.742778,2475 +alps_13838,MONTE NAVAGIUST,,46.624444,12.798889,2129 +alps_13839,MONTE MELESCEGN,,46.608056,12.786389,1378 +alps_13840,MONTE VAS,,46.602500,12.800000,1964 +alps_13841,PALE DI LINC,,46.607222,12.732222,2029 +alps_13842,MONTE CHIADIN,,46.597222,12.738333,2287 +alps_13843,CIMA OMBLADET,,46.603056,12.818611,2255 +alps_13844,COL DI CANEVA,,46.619444,12.703889,1939 +alps_13845,PALA DE LE STERPE,,46.649722,12.670556,2431 +alps_13846,COL CHIASTELIN,,46.646667,12.666944,2337 +alps_13847,COL DI CANEVA,,46.624722,12.706111,1853 +alps_13848,MONTE FRANZA,,46.605833,12.683056,2329 +alps_13849,MONTE POPERA,,46.603611,12.676667,2224 +alps_13850,MONTE RIGHILE,,46.599722,12.685833,2467 +alps_13851,CAMP LUISA,,46.598333,12.667222,2429 +alps_13852,MONTE LASTRON,,46.602500,12.708056,2449 +alps_13853,FORCA RIGHILE,,46.601389,12.694167,2362 +alps_13854,FORCA RINALDO,,46.599722,12.678889,2241 +alps_13855,CAMPANILE DEL RINALDO,,46.599167,12.675000,2355 +alps_13856,MONTE COLLES,,46.723611,12.156667,1676 +alps_13857,COSTA NELLA,,46.715833,12.164167,1777 +alps_13858,MONTE DEI BAGNI,,46.711667,12.165000,1859 +alps_13859,REGOLA BRUSADA,,46.733611,12.071667,2028 +alps_13860,KASERKOPF,,46.713056,12.052778,2414 +alps_13861,MONTE PRA DELLA VACCA,,46.716389,12.068056,2140 +alps_13862,MONTE RIVA,,46.706111,12.131667,1803 +alps_13863,MONTE NOVALE,,46.786111,12.033333,1479 +alps_13864,CIMA PRATO LUNGO,,46.732222,12.025833,1870 +alps_13865,MONTE MURO,,46.712778,12.033889,2567 +alps_13866,CIMA DEI COLLI ALTI,,46.712778,12.045000,2542 +alps_13867,COL VALACIA,,46.712500,12.017222,2416 +alps_13868,RUDLHORN,,46.797222,12.141944,2448 +alps_13869,SALZLA,,46.790833,12.127222,2131 +alps_13870,MONTE LUTA,,46.793333,12.098056,2145 +alps_13871,BODENECK,,46.750000,12.303889,1983 +alps_13872,INNIHNER ECK,,46.750278,12.291944,1935 +alps_13873,IL DOSSO,,46.749722,12.259444,1954 +alps_13874,PAUSA ALTA,,46.718611,12.316111,1404 +alps_13875,PAUSA GANDA,,46.705556,12.266667,2130 +alps_13876,CIMA NOVE,,46.699444,12.256111,2581 +alps_13877,CALVARIA,,46.703056,12.242500,2180 +alps_13878,MONTE SERLA,,46.703056,12.192778,2378 +alps_13879,MONTE ROTA,,46.757500,12.217500,1877 +alps_13880,CORNETTO DEI FIENILI,,46.757500,12.221944,1881 +alps_13881,SASSO DEL POZZO,,46.708333,12.173056,1954 +alps_13882,MONTE SUES,,46.709444,12.190000,2052 +alps_13883,PASSO DEL CAPRO,,46.706667,12.180000,1803 +alps_13884,LAGO DI DOBBIACO,,46.702778,12.216667,1259 +alps_13885,SEALASPITZ,,46.798056,12.259722,2493 +alps_13886,CORNO ALTO,,46.792778,12.265278,2623 +alps_13887,GOLFEN,,46.787500,12.256389,2493 +alps_13888,SCHLICHTEN,,46.771667,12.289722,2430 +alps_13889,STRICKBERG,,46.773333,12.321111,2553 +alps_13890,PUNTA NUDA,,46.882500,12.003333,2738 +alps_13891,CIMA PICCOLA DEL VENTE,,46.890278,12.009722,2981 +alps_13892,CIMA GRANDE DEL VENTO,,46.889722,12.016944,3041 +alps_13893,FORCA DELLA FOSSA,,46.890556,12.025833,2802 +alps_13894,CIMA FINESTRA,,46.892500,12.042222,3171 +alps_13895,CIMA DELL'ACQUA,,46.893333,12.053333,3135 +alps_13896,NASO ROSSO,,46.874722,12.048056,2619 +alps_13897,STALLA DI SOPRA,,46.873611,12.018889,2559 +alps_13898,ZINSNOCK,,46.860000,12.037222,2528 +alps_13899,BEL COLLE,,46.846389,12.031389,2452 +alps_13900,MONTONE,,46.834444,12.053056,2483 +alps_13901,CIMA SPECOLA,,46.835556,12.020278,2136 +alps_13902,CIMA DI PIANALTO,,46.898889,12.124167,3097 +alps_13903,MONTE MAGRO,,46.897778,12.096667,3273 +alps_13904,CIMA VAL FREDDA,,46.896944,12.083056,3126 +alps_13905,CIMA MATTINA,,46.887500,12.057778,3073 +alps_13906,CRODA NERA,,46.885556,12.065833,3105 +alps_13907,MONTE ROCCIA,,46.888056,12.117222,2448 +alps_13908,MONTE AVOLTOIO,,46.880556,12.052778,2801 +alps_13909,CORNO ALTO,,46.870278,12.068056,2704 +alps_13910,SATTELEITE,,46.865278,12.059167,2533 +alps_13911,MONTE SBARRA,,46.852500,12.136111,2494 +alps_13912,CAMPO BOVE,,46.843889,12.138611,2609 +alps_13913,FORCA DI SOMMA,,46.835278,12.137500,2413 +alps_13914,RAINGRUBE,,46.850556,12.059167,2352 +alps_13915,FORCA DEL FOSSA,,46.855000,12.142500,2394 +alps_13916,AMPERSPITZ,,46.830556,12.136944,2687 +alps_13917,STONANMANDL,,46.830556,12.128333,2435 +alps_13918,DURAKOPF,,46.803333,12.130000,2275 +alps_13919,HASLER KOPF,,46.805278,12.099167,1955 +alps_13920,FRISIBERG,,46.825556,12.157778,2569 +alps_13921,MILLION,,46.816667,12.154444,2438 +alps_13922,INNERRIEDL,,46.810556,12.160000,2372 +alps_13923,AUSERRIEDL,,46.804444,12.157778,2428 +alps_13924,EISATZ,,46.801944,12.155000,2493 +alps_13925,HOCHSTEIN,,46.819444,12.261944,2464 +alps_13926,GERICHTSHALS,,46.816944,12.252778,2239 +alps_13927,BEISPITZ,,46.798889,12.267778,2277 +alps_13928,SEALASPITZ,,46.797778,12.260000,2493 +alps_13929,CORNETTO,,46.818611,12.207500,2127 +alps_13930,LAXIDENSPITZ,,46.805278,12.172500,2404 +alps_13931,BURG,,46.798889,12.228611,1777 +alps_13932,LAGO DI ANTERSELVA,,46.888333,12.170278,1541 +alps_13933,CRODA ROSSA,,46.864444,12.179167,2818 +alps_13934,AUKSTERNSPITZ,,46.861111,12.203056,2734 +alps_13935,ROTELSPITZ,,46.862500,12.207222,2738 +alps_13936,KASERSPITZ,,46.865833,12.214722,2697 +alps_13937,HOLLENSTEIN,,46.860000,12.169722,2755 +alps_13938,MONTE REGOLA,,46.859167,12.200278,2775 +alps_13939,MAIER RIEDL,,46.851111,12.168889,2538 +alps_13940,HOHER MANN,,46.845833,12.198889,2593 +alps_13941,FELLHORN,,46.837500,12.199444,2518 +alps_13942,ACHTERNOCK,,46.909444,12.031111,2667 +alps_13943,PUTZERNOCK,,46.912222,12.033611,2566 +alps_13944,MALERSEE,,46.922778,12.089722,2501 +alps_13945,GATTERNOCK,,46.920833,12.059167,2888 +alps_13946,GRAUESNOECKL,,46.914167,12.132222,3084 +alps_13947,COLLALTO,,46.910833,12.139722,3436 +alps_13948,COLLASPRO,,46.902778,12.135556,3273 +alps_13949,CIMA DI PIANALTO,,46.898889,12.124167,3097 +alps_13950,MONTE NEVOSO,,46.905278,12.084167,3358 +alps_13951,PUNTA DELLE VEDRETTE,,46.900833,12.088889,3249 +alps_13952,LAGO NERO,,46.955000,12.009167,2551 +alps_13953,SATTELNOCK,,46.970833,12.000278,2362 +alps_13954,CIMA CHIUSETTA,,46.959444,12.009167,2819 +alps_13955,ZINTNOCK,,46.945833,12.003333,2623 +alps_13956,KLEIN MOOSSTOCK,,46.942778,12.012500,2630 +alps_13957,BERALSPITZ,,46.995000,12.075556,2738 +alps_13958,SCHWARZERSPITZ,,46.988611,12.076944,2862 +alps_13959,CIMA DEL GATTO,,46.980278,12.058889,2923 +alps_13960,HIRBERNOCK,,46.972500,12.046944,3010 +alps_13961,CIMA DURA,,46.961111,12.028889,3135 +alps_13962,BLAUSTICK,,46.995833,12.055556,2558 +alps_13963,BELMONTE,,46.988056,12.037222,2472 +alps_13964,CRODA BIANCA,,46.988056,12.087222,2517 +alps_13965,CAMPALTO,,46.983889,12.016111,2296 +alps_13966,KNUTTENNOCK,,46.973056,12.106111,2730 +alps_13967,CIMA DI RIVA,,46.961389,12.100556,2737 +alps_13968,KOFLER SEEN,,46.958333,12.107222,2439 +alps_13969,PICCO PALU,,46.950833,12.022222,3059 +alps_13970,CIMA DODICI,,46.930556,12.062778,2516 +alps_13971,TRISTENNOCK,,46.925556,12.103056,2465 +alps_13972,HINTERE HOEHE,,46.926389,12.086944,2505 +alps_13973,KLEIN REINHARD,,46.995833,12.118056,2631 +alps_13974,LAGO DI GOLA,,46.981667,12.128889,2243 +alps_13975,NAPFEN,,46.975556,12.119722,2510 +alps_13976,SOSSENECK,,46.964444,12.120278,2950 +alps_13977,NAPFEN LACKEN,,46.972500,12.118889,2478 +alps_13978,BAERENLUIG SPITZ,,46.960278,12.124722,2960 +alps_13979,BRUNNLEITEN SPITZ,,46.955556,12.116389,2803 +alps_13980,BAERENLUEG WAND,,46.949722,12.121667,2636 +alps_13981,RIESRENOCK,,46.929722,12.131667,2937 +alps_13982,MONTE ROBON ALTO,,46.385833,13.513056,1980 +alps_13983,CIMA MOGENZA PICCOLA,,46.391111,13.523889,1946 +alps_13984,MONTE CERGNALA,,46.377222,13.508889,2344 +alps_13985,CRNELSKA SPICA,,46.376389,13.515556,2332 +alps_13986,VRH RIBEZNOV,,46.374722,13.529167,2022 +alps_13987,PRISHNA GLAVA,,46.370833,13.538056,1946 +alps_13988,MALI USHJE,,46.370000,13.543611,2007 +alps_13989,VELIKI USHJE,,46.368611,13.547500,2048 +alps_13990,ROMBON,,46.367222,13.553889,2208 +alps_13991,SNEZNI VRH,,46.389444,13.541111,1972 +alps_13992,KRIVI ROB,,46.396389,13.556389,2009 +alps_13993,JEREBICA,,46.398056,13.565000,2125 +alps_13994,VELIKI GRADU,,46.381944,13.603611,1966 +alps_13995,VRH KRNICE,,46.385833,13.613889,2234 +alps_13996,OBLICA,,46.388056,13.618056,2246 +alps_13997,OLTARJI,,46.391667,13.626389,2308 +alps_13998,BRICELJK,,46.394722,13.631944,2346 +alps_13999,MOREZH,,46.398333,13.641111,2261 +alps_14000,STUDOR,,46.392778,13.640556,2025 +alps_14001,VELIKI PIHAVEC,,46.384444,13.659167,2090 +alps_14002,MALI PIHAVEC,,46.382500,13.656944,2074 +alps_14003,OBLJAK,,46.378056,13.650833,1866 +alps_14004,MALI GRINTAVEC,,46.365000,13.665278,2282 +alps_14005,VRH LEH,,46.357500,13.648333,1958 +alps_14006,VRH OVCHJE PLANJE,,46.354444,13.641389,1965 +alps_14007,SPICHICA,,46.352222,13.628333,1783 +alps_14008,OSTRI ROB,,46.352778,13.621944,1761 +alps_14009,PRI BANDERI,,46.366389,13.510000,2055 +alps_14010,JELENK,,46.364167,13.510833,2050 +alps_14011,PLESHIVEC,,46.361389,13.515833,1962 +alps_14012,VRATNI VRH,,46.360833,13.511111,1996 +alps_14013,LIPNIK,,46.304444,13.631667,1867 +alps_14014,SREDNJA SPICA,,46.307778,13.627778,1819 +alps_14015,HUDI VRH,,46.310833,13.629722,1804 +alps_14016,VRSHICHI,,46.317500,13.627222,1699 +alps_14017,JAVORSHCHEK,,46.314167,13.597222,1557 +alps_14018,SPIK,,46.302222,13.542500,1482 +alps_14019,POLOVNIK,,46.302778,13.520278,1476 +alps_14020,PIRHOVEC,,46.297778,13.556111,1660 +alps_14021,SREDNI PELC,,46.397222,13.672222,2336 +alps_14022,ZADNJI PELC,,46.395000,13.673333,2315 +alps_14023,SKUTNIK,,46.386389,13.670278,2172 +alps_14024,VELIKI JELENC,,46.383333,13.667500,2114 +alps_14025,ZAGORELEC,,46.378889,13.670556,2090 +alps_14026,SMIHELOVEC,,46.375556,13.667500,2117 +alps_14027,BAVSKI GRINTAVEC,,46.368889,13.670833,2347 +alps_14028,SRAVNIK,,46.369167,13.678056,2140 +alps_14029,SREBRNJAK,,46.378611,13.698611,2099 +alps_14030,TRENTSKI PELC,,46.385833,13.709444,2109 +alps_14031,PLESHIVEC,,46.392778,13.719722,2008 +alps_14032,NA GLAVI,,46.384444,13.724444,1670 +alps_14033,NA GRIVAH,,46.385556,13.730278,1612 +alps_14034,ZADNJISKI OZEBNIK,,46.369444,13.782222,2084 +alps_14035,VRSAC NAD ZADNJICO,,46.363333,13.797500,2194 +alps_14036,MALI SPICJE,,46.351944,13.782778,2312 +alps_14037,VELIKI SPICHJE,,46.343889,13.766667,2398 +alps_14038,VRH LABRIA,,46.341944,13.753889,2326 +alps_14039,PLASKI VOGEL,,46.337778,13.750556,2348 +alps_14040,TRAVNIK,,46.337500,13.744722,2252 +alps_14041,CHELO,,46.329444,13.741389,2228 +alps_14042,TRAVNISKI ROB,,46.334722,13.732222,2135 +alps_14043,BOVSKI GAMSOVEC,,46.398611,13.812500,2392 +alps_14044,PIHAVEC,,46.392778,13.806389,2419 +alps_14045,MALI PIHAVEC,,46.388611,13.804167,2185 +alps_14046,VRH ZELENIC,,46.378333,13.822222,2468 +alps_14047,SMARJETNA GLAVA,,46.364722,13.826667,2358 +alps_14048,KANJAVEC,,46.360278,13.809722,2568 +alps_14049,MISELJSKI KONEC,,46.354722,13.818333,2464 +alps_14050,DEBELI VRH,,46.341111,13.815556,2390 +alps_14051,VRSAKI,,46.351111,13.807778,2448 +alps_14052,VELIKA ZELNARICA,,46.342778,13.791111,2320 +alps_14053,MALA ZELNARICA,,46.338611,13.788889,2310 +alps_14054,KOPICA,,46.332778,13.786944,2190 +alps_14055,ZADNJI VOGEL,,46.340833,13.798056,2327 +alps_14056,SREDNI VOGEL,,46.334167,13.798611,2227 +alps_14057,PRVI VOGEL,,46.330278,13.800000,2181 +alps_14058,SLATNA,,46.328889,13.805556,2077 +alps_14059,KREDA,,46.326667,13.810278,2025 +alps_14060,BELA GLAVA,,46.318056,13.793611,1926 +alps_14061,VELIKA TICHARICA,,46.321944,13.785833,2091 +alps_14062,MALA TICHARICA,,46.319444,13.785000,2071 +alps_14063,RUSNATA GLAVA,,46.312778,13.784444,1899 +alps_14064,STADORSKI ORLICHI,,46.301944,13.803333,1782 +alps_14065,CHISTI VRH,,46.355833,13.752500,1875 +alps_14066,PLAZJANSKI VRSAC,,46.351944,13.757778,1866 +alps_14067,VELIKA GLAVA,,46.362778,13.771389,1869 +alps_14068,VELIKA TICHARICA,,46.358333,13.739444,1891 +alps_14069,MALA TICHARICA,,46.356111,13.729444,1797 +alps_14070,CRNI VRH,,46.325833,13.669444,1544 +alps_14071,VOVENK,,46.316111,13.686667,1515 +alps_14072,KALUDER,,46.305556,13.703333,1980 +alps_14073,RUSHJE,,46.326389,13.732222,2008 +alps_14074,KAL,,46.310833,13.743889,2001 +alps_14075,CIMA DELLA SFINGE,,46.471667,13.162500,1847 +alps_14076,CRETA GRAUZARIA,,46.467500,13.162500,2065 +alps_14077,CIMA SENZA NOME,,46.464167,13.162222,1930 +alps_14078,CUEL BRUSAAT,,46.493889,13.130278,1310 +alps_14079,CRETA DI MEZZODI,,46.485278,13.129722,1806 +alps_14080,MONTE FLOP,,46.487500,13.163889,1715 +alps_14081,COL PINCES,,46.481389,13.123333,1611 +alps_14082,CRETE DI LOVEA,,46.478056,13.110556,1385 +alps_14083,TORRE NUVIERNULIS,,46.474722,13.146111,1881 +alps_14084,FORCA NUVIERNULIS,,46.475000,13.148333,1732 +alps_14085,CIMA DAI GJAI,,46.472222,13.155833,1916 +alps_14086,MONTE SERNIO,,46.475000,13.137500,2187 +alps_14087,FORCA DANEIT,,46.469167,13.133056,1720 +alps_14088,PALE DEL LARIS,,46.463889,13.133056,1906 +alps_14089,MONTE SALIN,,46.491389,13.037500,1216 +alps_14090,MONTE PLOMBS,,46.490833,13.058611,1318 +alps_14091,MONTE CABIA,,46.479167,13.044167,1126 +alps_14092,CUEL DA RINH,,46.463056,13.071389,860 +alps_14093,MONTE SPIN,,46.446667,13.012500,915 +alps_14094,CUEL MAURON,,46.443889,13.113056,1814 +alps_14095,MONTE PALAVIERTE,,46.444722,13.108056,1785 +alps_14096,CRETE DI PALLASECCA,,46.455000,13.121111,1770 +alps_14097,CUEL DE LA CEIT,,46.432778,13.123056,1511 +alps_14098,CUEL DALL OMP,,46.451389,13.128889,1459 +alps_14099,MONTE CIMONS,,46.452500,13.058333,954 +alps_14100,MONTE OLTREVISO,,46.444167,13.073333,1077 +alps_14101,MONTE GIAIDETT,,46.441667,13.056111,1082 +alps_14102,MONTE RIOUINI,,46.428333,13.090556,1267 +alps_14103,CUEL DE LA RUVIIS,,46.428889,13.127222,1318 +alps_14104,CUEL DI GIAI,,46.425556,13.070833,1234 +alps_14105,CUEL DI GIAI,,46.419167,13.080278,1048 +alps_14106,MONTE GLUBITON,,46.415278,13.127778,665 +alps_14107,CUEL DI SPIRUAL,,46.404444,13.102500,1520 +alps_14108,MONTE AMARIANA,,46.400556,13.080278,1905 +alps_14109,MONTE FORCELLA,,46.401389,13.128333,1108 +alps_14110,DOSSO DELLE FORCHIATE,,46.404444,13.068056,1380 +alps_14111,MONTE STRABUT,,46.413333,13.032500,1104 +alps_14112,CIMADORS ALTO,,46.450833,13.157500,1639 +alps_14113,SLENZA EST,,46.492222,13.273611,1589 +alps_14114,MONTE POCCET,,46.488056,13.330833,1519 +alps_14115,CUEL FORMIAN,,46.468056,13.323889,1627 +alps_14116,FORA MINCIGOS,,46.466389,13.322778,1488 +alps_14117,CLAP FORAT,,46.465278,13.320278,1562 +alps_14118,SLENZA OVEST,,46.492778,13.265556,1665 +alps_14119,CIMA VALERI,,46.483611,13.238611,1885 +alps_14120,CUEL BRUSAT,,46.486667,13.227778,1474 +alps_14121,MONTE GLERIS,,46.478889,13.236111,1923 +alps_14122,CIMA EST,,46.469444,13.250556,2043 +alps_14123,CIMA ALTA DI GLERIS,,46.468889,13.247778,2058 +alps_14124,MONTE CHIAVALS,,46.465556,13.247778,2098 +alps_14125,MONTE FORCHIADICE,,46.478056,13.211944,1600 +alps_14126,MONTE VUALT,,46.472778,13.218889,1725 +alps_14127,CIMA DELLA VACCA,,46.473611,13.241389,1880 +alps_14128,FORCA VUALT,,46.461389,13.211944,1282 +alps_14129,ZUC DAL BOR,,46.449444,13.258611,2195 +alps_14130,MONTE COZZAREL,,46.445000,13.269444,2042 +alps_14131,MONTUSEL,,46.443889,13.279722,1881 +alps_14132,MONTE CHIAVELI,,46.446667,13.278889,1820 +alps_14133,FORCA FONDERIS,,46.444722,13.252500,1800 +alps_14134,MONTE CROSTIS,,46.440833,13.251389,1894 +alps_14135,MONTE PISIMONI,,46.417778,13.239167,1880 +alps_14136,FORCA CHIAVAIS,,46.461111,13.249167,1869 +alps_14137,MONTE MASEREIT,,46.451667,13.210278,1459 +alps_14138,FORCA DI SOT CRETIS,,46.438889,13.271389,1666 +alps_14139,CUEL DA LEFRATTE,,46.436389,13.231111,1263 +alps_14140,ZOUF DI MUEZ,,46.414167,13.213056,832 +alps_14141,CRETE DE LA MONT,,46.419167,13.190000,816 +alps_14142,FORCA PEDOT,,46.420278,13.273611,1230 +alps_14143,PUNTA FORCE DIAME,,46.413333,13.249444,1350 +alps_14144,PICCOLO BELEPEIT,,46.410000,13.265556,1170 +alps_14145,MONTE BELEPEIT,,46.410278,13.279722,1284 +alps_14146,CUEL DI ZOUF,,46.460556,13.179722,929 +alps_14147,MONTICELLO,,46.433611,13.181944,1362 +alps_14148,MONTE CESARIIS,,46.417778,13.172500,975 +alps_14149,MONTE PALIS,,46.405556,13.169444,808 +alps_14150,MONTE PLANANIZZA,,46.420556,13.287222,1554 +alps_14151,JOF DI CHIUSAFORTE,,46.418333,13.301111,1295 +alps_14152,CIMA VILDIVER,,46.477500,13.422778,2008 +alps_14153,JOF DI MIEZEGNOT,,46.476667,13.453333,2087 +alps_14154,CIMA ALTA,,46.476667,13.420000,2046 +alps_14155,CUEL DEI PEZ,,46.475000,13.397778,1943 +alps_14156,MONTE SECHIEIZ O BERDA,,46.473611,13.378056,1839 +alps_14157,MONTE PIPER,,46.473611,13.435278,2069 +alps_14158,GOSADON,,46.472778,13.414444,1968 +alps_14159,JOF DI DOGNA,,46.472222,13.332500,1961 +alps_14160,TORRE ALBA,,46.450833,13.425278,1772 +alps_14161,MONTE NABOIS PICCOLO,,46.448611,13.485556,1691 +alps_14162,JOF DES FORCELLIS,,46.445833,13.428889,2041 +alps_14163,CLAP BLANC,,46.441944,13.403333,1662 +alps_14164,MONTE NABOIS GRANDE,,46.439167,13.488333,2313 +alps_14165,TORRE NORD,,46.437778,13.432778,2680 +alps_14166,JOF DI MIEZ,,46.437778,13.410556,1974 +alps_14167,FORCA VERDE,,46.434167,13.440278,2587 +alps_14168,CIMA VERDE,,46.433611,13.442222,2661 +alps_14169,FORCA DEI DISTEIS,,46.431944,13.432778,2201 +alps_14170,MODEON DEL MONTASIO,,46.431111,13.446111,2573 +alps_14171,JOF FUART,,46.430556,13.491389,2666 +alps_14172,JOF DI MIEZDI,,46.429722,13.359167,1911 +alps_14173,FORCA DEL LIVINAL,,46.428611,13.359167,1750 +alps_14174,CIMA DE LISCODIS,,46.428611,13.482222,2380 +alps_14175,CURTISSON,,46.428333,13.425833,2240 +alps_14176,JOVET BLANC,,46.426944,13.360278,1940 +alps_14177,CIMA DE TERRAROSSA,,46.426667,13.451944,2420 +alps_14178,JOF DI GOLIZ,,46.425556,13.380556,2288 +alps_14179,FORCA BASSA,,46.425278,13.422778,2070 +alps_14180,FORCA DE LA VIENE,,46.425000,13.395278,2121 +alps_14181,FORCA DE LA PUARTATE,,46.425000,13.364444,1887 +alps_14182,CIMA GAMBON,,46.424722,13.454444,2392 +alps_14183,CIUC DI VALLISETTA,,46.424167,13.369722,2090 +alps_14184,MONTE ZABUS,,46.424167,13.415278,2244 +alps_14185,MUCUL,,46.424167,13.375278,2055 +alps_14186,JOF DI MONTASIO,,46.435833,13.433611,2753 +alps_14187,TORRE LAZZARA,,46.423889,13.458056,2263 +alps_14188,MONTE CIMONE,,46.423611,13.385278,2379 +alps_14189,TORRE MAZZENI,,46.422500,13.463056,2212 +alps_14190,CIME CASTREIN,,46.422500,13.485833,2502 +alps_14191,CAMPANILE DI VILLACO,,46.421667,13.495278,2247 +alps_14192,FORCA DE LIS SIERIS,,46.421389,13.458889,2274 +alps_14193,MONTE IOVET,,46.421111,13.348611,1814 +alps_14194,FORCA GALANDIN,,46.420000,13.339444,1222 +alps_14195,FORCA LAVINAL DELL'ORSO,,46.418611,13.480278,2138 +alps_14196,FORONON DEL BUINZ,,46.417778,13.465833,2531 +alps_14197,PIZZO VIENNE,,46.417778,13.396944,2037 +alps_14198,FORCA DE LA VAL,,46.417500,13.475000,2352 +alps_14199,MODEON DEL BUINZ,,46.416667,13.471111,2554 +alps_14200,PUNTA PLAGNIS,,46.415000,13.483056,2411 +alps_14201,PASSO DEGLI SCALIRI,,46.412500,13.492222,2022 +alps_14202,CUEL DE LA BARETTA,,46.436111,13.338333,1522 +alps_14203,CUEL MOZ,,46.442778,13.335556,1012 +alps_14204,FORCA DI DOGNA,,46.429722,13.355000,1641 +alps_14205,MONTE SFLAMBERG,,46.419444,13.337500,1347 +alps_14206,MONTE JAMA,,46.406389,13.331667,1167 +alps_14207,MONTE CIAVATER,,46.490833,13.401667,1154 +alps_14208,PRATI SIMELE,,46.483056,13.437222,1587 +alps_14209,FORCA CUEL TAROND,,46.477222,13.391944,1740 +alps_14210,MONTE GRANUDA,,46.483333,13.401667,1563 +alps_14211,MONTE SCHENONE,,46.477778,13.342500,1950 +alps_14212,CLAP DEL JOVEL,,46.476944,13.350556,1846 +alps_14213,MONTE PICCOLO,,46.483889,13.349722,1748 +alps_14214,MONTE AGAR,,46.485000,13.343889,1690 +alps_14215,MONTE POCCET,,46.488056,13.331111,1519 +alps_14216,MONTE NERO,,46.474167,13.479167,1743 +alps_14217,MONTE PRASNIG,,46.479722,13.523333,1789 +alps_14218,CIMA DEL CACCIATORE,,46.464722,13.528056,2071 +alps_14219,MONTE RE,,46.456111,13.556944,1912 +alps_14220,MONTE FLORIANCA,,46.485833,13.546667,1658 +alps_14221,MONTE PRISNIG,,46.492222,13.567222,1324 +alps_14222,COLROTONDO,,46.475000,13.653056,1486 +alps_14223,SCHONECK,,46.468333,13.622778,1844 +alps_14224,PICO DI MEZZODI,,46.459444,13.636667,2063 +alps_14225,MONTE SCIOBER GRANDE,,46.450833,13.600278,1845 +alps_14226,CINQUE PUNTI,,46.458889,13.588889,1909 +alps_14227,CIMA DI RIOFREDDO,,46.430278,13.503056,2507 +alps_14228,CIMA DEL VALLONE,,46.426944,13.511667,2368 +alps_14229,CIMA ALTA DI RIOBIANCO,,46.423056,13.518611,2257 +alps_14230,VETTA BELLA,,46.430556,13.526944,2049 +alps_14231,VETTE SCARBE,,46.423333,13.542500,1810 +alps_14232,JOF DEL LAGO,,46.433611,13.548056,1761 +alps_14233,CIME DELLE RONDINI,,46.446389,13.517778,1845 +alps_14234,BUKOVNIK,,46.450556,13.639444,2076 +alps_14235,MANGART,,46.439444,13.654722,2677 +alps_14236,TRAVNIK,,46.446667,13.648889,2200 +alps_14237,SKALA,,46.442500,13.628333,2133 +alps_14238,RUSHA,,46.441389,13.611389,1922 +alps_14239,GRINTAVEC,,46.438056,13.596111,1943 +alps_14240,SKUTRNIK,,46.433611,13.590000,1865 +alps_14241,VELIKI HLEBEC,,46.431111,13.586944,1799 +alps_14242,TURN,,46.461667,13.630833,1972 +alps_14243,PLESHIVEC,,46.409722,13.660556,2184 +alps_14244,BAVH,,46.407222,13.654444,2186 +alps_14245,BEDINJI VRH,,46.402778,13.649167,2175 +alps_14246,MALA PONCA,,46.467778,13.693611,1925 +alps_14247,VISOKA PONCA,,46.460000,13.697500,2274 +alps_14248,SREDNA PONCA,,46.455000,13.697500,2228 +alps_14249,ZZDNJA PONCA,,46.450278,13.695000,2265 +alps_14250,STRUG,,46.443889,13.693611,2265 +alps_14251,VEVNICA,,46.439444,13.685278,2343 +alps_14252,VELIKA KONCU SPICA,,46.437500,13.684167,2350 +alps_14253,KOTOVA SPICA,,46.434167,13.683611,2361 +alps_14254,MALI MANGART,,46.440278,13.675833,2333 +alps_14255,CIPRNIK,,46.469167,13.740278,1745 +alps_14256,SUHI VRH,,46.461111,13.734167,1645 +alps_14257,KUMLEHOVA GLAVA,,46.454167,13.758889,1788 +alps_14258,KUMLEH,,46.461667,13.765278,1450 +alps_14259,SKRBINJEK,,46.467222,13.773056,1341 +alps_14260,VITRANC,,46.473611,13.749722,1631 +alps_14261,CRNI VRH,,46.472222,13.811944,1475 +alps_14262,KURJI VRH,,46.466667,13.805833,1762 +alps_14263,RIGLJICA,,46.462222,13.804167,1911 +alps_14264,RUSICA,,46.458611,13.806389,2074 +alps_14265,VRH NAD RUDO,,46.455833,13.803889,2108 +alps_14266,FRDAMANE POLICE,,46.452500,13.808889,2284 +alps_14267,SPIK,,46.449167,13.814444,2472 +alps_14268,LIPNICA,,46.446944,13.812778,2418 +alps_14269,MALA PONCA,,46.443889,13.821111,2502 +alps_14270,VELIKA PONCA,,46.442222,13.824722,2602 +alps_14271,OLTAR,,46.439722,13.830278,2621 +alps_14272,VISOKI ROKAV,,46.436111,13.828333,2646 +alps_14273,SKRLATICA,,46.433611,13.820833,2738 +alps_14274,RAKOVA SPIKA,,46.430000,13.813333,2450 +alps_14275,ROGLJICA,,46.427778,13.811944,2547 +alps_14276,DOLKOVA SPICA,,46.426389,13.814167,2591 +alps_14277,DOVSKI GAMSAVEC,,46.423611,13.808056,2440 +alps_14278,STENAR,,46.408333,13.818889,2501 +alps_14279,KRIZ,,46.410556,13.811111,2410 +alps_14280,BOVSKI GAMSOVEC,,46.398611,13.812500,2392 +alps_14281,RAZOR,,46.412500,13.791389,2601 +alps_14282,PRISOJNIK,,46.425278,13.770000,2547 +alps_14283,ZADNJE ROBICHJE,,46.448889,13.751667,1930 +alps_14284,PREDNJE ROBICHJE,,46.444444,13.745000,1941 +alps_14285,SLEMENOVA SPICA,,46.446389,13.726667,1909 +alps_14286,MALA MOJSTROVKA,,46.437778,13.731111,2332 +alps_14287,VELIKA MOJSTROVKA,,46.434722,13.723889,2372 +alps_14288,TRAVNIK,,46.429167,13.713056,2379 +alps_14289,ROB VELIKI DNINE,,46.426389,13.704722,2228 +alps_14290,JALOVEC,,46.421667,13.679722,2645 +alps_14291,VELIKI OZEBNIK,,46.416111,13.679167,2482 +alps_14292,VRH ZELENIC,,46.411111,13.673056,2278 +alps_14293,PELC NAD KLONICAMI,,46.405278,13.672222,2442 +alps_14294,VELIKI PELC,,46.400556,13.673333,2388 +alps_14295,VRH KRAJ STEN,,46.424444,13.758056,2311 +alps_14296,ZADNJI PRISOJNIK,,46.423056,13.777500,2392 +alps_14297,GOLICHICA,,46.433056,13.770000,2078 +alps_14298,PLANJA,,46.406944,13.785556,2453 +alps_14299,KANCELJNI,,46.402500,13.776944,2133 +alps_14300,GOLICHICA,,46.400278,13.770278,2101 +alps_14301,USHJE,,46.398056,13.726389,1821 +alps_14302,CIMA VAL DI PUARTIS,,46.592500,13.111667,1927 +alps_14303,MONTE CULET,,46.574722,13.097778,1591 +alps_14304,LA VALUTE,,46.570833,13.121111,1492 +alps_14305,MONTE ZERMULA,,46.561389,13.151111,2143 +alps_14306,CUL DI CRETA,,46.569444,13.132222,1913 +alps_14307,MONTE ZOUF,,46.526389,13.139444,1248 +alps_14308,MONTE PLACIS,,46.522222,13.095833,1262 +alps_14309,CUESTA LIBARA,,46.522500,13.137500,1129 +alps_14310,MONTE CHIASTILIRS,,46.521667,13.151667,1210 +alps_14311,MONTE DI CASTOIA,,46.513889,13.109444,1233 +alps_14312,MONTE FUARMI,,46.505000,13.133611,1010 +alps_14313,FORCA DURON,,46.531944,13.082222,1121 +alps_14314,CUEL DI VON,,46.524444,13.050833,1105 +alps_14315,MONTE CUC,,46.522778,13.078333,1560 +alps_14316,MONTE CIMON,,46.520000,13.075278,1556 +alps_14317,MONTE TERSADIA,,46.507778,13.081944,1959 +alps_14318,CIMA VALMEDAN,,46.504167,13.061667,1810 +alps_14319,MONTE CUCCO,,46.504167,13.044722,1804 +alps_14320,MONTE DI RIVO,,46.508333,13.028889,1575 +alps_14321,CRETE DEL MEZZODI,,46.585278,13.042222,1980 +alps_14322,FORCA FONTANAFREDDA,,46.581944,13.043611,1876 +alps_14323,MONTE PAULARO,,46.570278,13.049722,2043 +alps_14324,CRESTA CRAVOSTES,,46.570833,13.091667,1662 +alps_14325,MONTE DIMON,,46.569722,13.066389,2043 +alps_14326,LAGO DIMON,,46.566944,13.061389,1852 +alps_14327,MONTE NEDDIS,,46.562778,13.071111,1990 +alps_14328,CIMA VAL DI LEGNAN,,46.555278,13.085556,1709 +alps_14329,CRETA DI TIMAU,,46.596389,13.010556,2217 +alps_14330,CIMA DI LANZA,,46.580000,13.173611,1893 +alps_14331,PASSO DEL CASON DI LANZA,,46.566667,13.170278,1552 +alps_14332,MONTE PIZZUL,,46.553889,13.172500,1985 +alps_14333,ZUC DELLA GUARDIA,,46.557222,13.173333,1911 +alps_14334,FORCA DI LANZA,,46.555000,13.167500,1831 +alps_14335,ZUC DI MALASEIT,,46.555278,13.179167,1829 +alps_14336,FORCA PIZZUL,,46.548889,13.173056,1708 +alps_14337,MONTE SALINCHIET,,46.536111,13.180000,1857 +alps_14338,FORCA PRADULINA,,46.530278,13.179444,1492 +alps_14339,TURRION,,46.526389,13.180278,1632 +alps_14340,MONTE CULLAR,,46.518889,13.181111,1764 +alps_14341,FORCA GRIFFON,,46.500556,13.169444,1290 +alps_14342,CRETA DIRIO SECCO,,46.548333,13.225556,2203 +alps_14343,MONTE MALVUERIC ALTO,,46.542500,13.278889,1899 +alps_14344,MONTE MALVUERIC BASSO,,46.538056,13.285556,1814 +alps_14345,MONTE BRUCA,,46.534444,13.315556,1538 +alps_14346,MONTE BRIZZIA,,46.523611,13.317222,1555 +alps_14347,CRETE DAL CRONS,,46.508333,13.230556,1664 +alps_14348,MONTE PALON,,46.518056,13.194167,1707 +alps_14349,MONTE COCCO,,46.549722,13.443333,1941 +alps_14350,CRODA DEI CACCIATORI,,46.545556,13.390833,1652 +alps_14351,CIMA GAIL,,46.549444,13.386944,1709 +alps_14352,MONTE ACUTO,,46.559722,13.380278,1781 +alps_14353,CIMA DI MEZZO,,46.563889,13.368056,1753 +alps_14354,PUNTA LONAS,,46.550556,13.351944,1784 +alps_14355,MONTE SCINAUZ,,46.533056,13.363889,1999 +alps_14356,MONTE GHISNIZ,,46.527778,13.370833,1927 +alps_14357,MONTE TORRE,,46.530556,13.352500,1742 +alps_14358,MONTE CUCCO,,46.525833,13.401111,1595 +alps_14359,BRENACA ALTA,,46.531944,13.433333,1565 +alps_14360,STABET,,46.524722,13.443889,1627 +alps_14361,MONTE NEBRIA,,46.502778,13.466944,1207 +alps_14362,VETTA SECCA,,46.518056,13.483333,1370 +alps_14363,CIMA MULI,,46.539167,13.521667,1743 +alps_14364,MIRNIG,,46.526667,13.503889,1397 +alps_14365,MONTE PLECCIA,,46.535556,13.588611,1524 +alps_14366,MONTE LEILA,,46.516667,13.636944,1182 +alps_14367,MONTE BORGO,,46.515833,13.587778,1270 +alps_14368,PIZ SAGLIAINS,,46.808611,10.068889,3101 +alps_14369,PLATTEN HOERNER,,46.810278,10.033056,3220 +alps_14370,PIZ LINARD,,46.798889,10.071667,3411 +alps_14371,PIZ FLESS,,46.786944,10.037500,3020 +alps_14372,PIX GLIMS,,46.786667,10.068889,2868 +alps_14373,PIZ MURTERA,,46.775278,10.040556,3044 +alps_14374,PIZ VALTORTA,,46.783333,10.020833,2975 +alps_14375,PIZ CHASTE,,46.770556,10.054444,2870 +alps_14376,CHESSLER,,46.871667,9.991667,2836 +alps_14377,CANARD HORN,,46.845556,9.985000,2607 +alps_14378,ROGGEN HORN,,46.834444,10.008056,2891 +alps_14379,WISSHORN,,46.834722,9.991389,2832 +alps_14380,UNGHUER HOERNER,,46.812500,10.013056,2994 +alps_14381,EGGHORN,,46.873889,10.079444,3120 +alps_14382,KLOSTERTALER SPITZE,,46.867778,10.051111,2842 +alps_14383,TAELLI HORN,,46.865278,10.050833,2844 +alps_14384,ROTFLUE,,46.860556,10.080556,3166 +alps_14385,MEDJI CHOPF,,46.850000,10.039722,2477 +alps_14386,JEGER BUEEL,,46.839167,10.028889,2550 +alps_14387,VERSTANCLA CHOEPF,,46.838889,10.055833,3058 +alps_14388,TORWACHE,,46.835833,10.076667,3186 +alps_14389,CHAPUETSCHIN,,46.830556,10.069167,3232 +alps_14390,VERSTANCLA HORN,,46.835000,10.072500,3298 +alps_14391,BUERGEN CHOPF,,46.834444,10.043889,2923 +alps_14392,ROT HORN,,46.832222,10.025000,2806 +alps_14393,PIZ ZADRELL,,46.812778,10.055278,3104 +alps_14394,GANDATALER KOEPFE,,46.934167,9.883056,2705 +alps_14395,MARCH SPITZE,,46.934444,9.876111,2732 +alps_14396,RAETSCHEN HORN,,46.936389,9.850278,2703 +alps_14397,SAASER CALANDA,,46.929722,9.844444,2554 +alps_14398,MADRISA HORN,,46.931111,9.872222,2826 +alps_14399,GEISS HORN,,46.915278,9.849167,2271 +alps_14400,GROSS TARZANAELLA,,46.922222,9.850556,2362 +alps_14401,SANT JAGGEM,,46.920556,9.868333,2542 +alps_14402,BAERNET,,46.913333,9.878611,2382 +alps_14403,WORMA KOPF,,46.931944,9.936667,2540 +alps_14404,SCHNEE BERG,,46.928889,9.943056,2583 +alps_14405,VALZIFENZER TURM,,46.926389,9.946389,2589 +alps_14406,VALZIFENZER JOCH,,46.925000,9.949167,2485 +alps_14407,SCHLAPPINER SPITZE,,46.923056,9.916111,2442 +alps_14408,ALPELTI SPITZ,,46.884444,9.926111,2686 +alps_14409,SCHILDFLUE,,46.880556,9.956111,2887 +alps_14410,KUCHEN BERG,,46.934444,9.982778,2523 +alps_14411,VORDER BERG,,46.928056,9.983889,2553 +alps_14412,VERGALDNER JOCH,,46.924444,9.984167,2515 +alps_14413,MITTEL BERG,,46.919167,9.985833,2657 +alps_14414,SUEDLICHE VALGRAGGES SPITZE,,46.916111,10.019722,2761 +alps_14415,HINTERBERG,,46.916111,9.978333,2682 +alps_14416,ROTBUEHEL SPITZE,,46.915833,9.959167,2853 +alps_14417,EISENTAELI SPITZE,,46.913333,9.962500,2875 +alps_14418,GARNERA JOCH,,46.911389,9.981667,2489 +alps_14419,BLODIG TURM,,46.906111,10.020278,2784 +alps_14420,KESSI SPITZE,,46.902500,9.991389,2833 +alps_14421,OESTLICHE PLATTEN SPITZE,,46.901944,10.018056,2852 +alps_14422,PLATTEN SPITZE,,46.900556,10.011389,2883 +alps_14423,PLATTEN HORN,,46.893056,9.984444,2672 +alps_14424,LEID HORN,,46.878889,9.994167,2839 +alps_14425,FERGEN HORN,,46.878611,9.968333,2860 +alps_14426,STRIT KOPF,,46.936389,10.031944,2745 +alps_14427,HOCH MADERER,,46.928611,10.028611,2823 +alps_14428,KRESPER SPITZE,,46.929167,10.077778,2620 +alps_14429,HOCHMADERER JOCH,,46.925000,10.025556,2505 +alps_14430,KLEINE LOB SPITZE,,46.906944,10.075556,2760 +alps_14431,VORDERE LOB SPITZE,,46.904167,10.072500,2835 +alps_14432,MITTLERE LOB SPITZE,,46.900278,10.070278,2799 +alps_14433,LOB TURM,,46.897500,10.057778,2867 +alps_14434,HINTERE LOB SPITZE,,46.895000,10.058056,2873 +alps_14435,KLEIN LITZNER,,46.899722,10.033611,2783 +alps_14436,GLOETTER SPITZE,,46.891944,10.046944,2847 +alps_14437,VERHUPF SPITZE,,46.888333,10.056111,2957 +alps_14438,GROSS SEEHORN,,46.887778,10.032222,3121 +alps_14439,KLEIN SEEHORN,,46.886389,10.023889,3032 +alps_14440,WINTERBERG,,46.880556,10.042500,2924 +alps_14441,GROSS LITZNER,,46.886389,10.038611,3109 +alps_14442,SONNTAG SPITZE,,46.876667,10.051944,2882 +alps_14443,SAROTLA JOCH,,46.996667,9.889722,2389 +alps_14444,ROBI SPITZEN,,46.988889,9.891944,2466 +alps_14445,ROT SPITZE,,46.983056,9.883333,2517 +alps_14446,VIEREGGER PASS,,46.984444,9.884722,2405 +alps_14447,BREITE FURKA,,46.978889,9.882500,2430 +alps_14448,RONGG SPITZE,,46.975833,9.879722,2531 +alps_14449,RIED KOPF,,46.975000,9.878056,2552 +alps_14450,SCHOLL BERG,,46.975000,9.864722,2570 +alps_14451,GAEMPI FLUE,,46.964167,9.863333,2390 +alps_14452,GARGELLNER KOEPFE,,46.957222,9.878889,2559 +alps_14453,MADRISA-A,,46.941944,9.891389,2770 +alps_14454,SCHMALZ BERG,,46.968056,9.933889,2345 +alps_14455,VALISERA,,46.960833,9.955556,2716 +alps_14456,SCHIESS HORN,,46.953889,9.931389,2043 +alps_14457,SELZNER KOPF,,46.951389,9.925278,2180 +alps_14458,ALP KOPF,,46.946667,9.921111,2273 +alps_14459,RITZEN SPITZEN,,46.937778,9.928056,2650 +alps_14460,GANTA KOPF,,46.987778,9.990556,1958 +alps_14461,BURG,,46.973333,9.995833,2247 +alps_14462,SCHWARZ KOPF,,46.970556,9.965556,2370 +alps_14463,VERSETTLA,,46.965556,9.995556,2372 +alps_14464,MADRISELLA,,46.959444,9.986111,2466 +alps_14465,HEIM SPITZE,,46.961389,9.966389,2685 +alps_14466,ALPILA KOPF,,46.944167,10.015278,2345 +alps_14467,SCHAFBODEN,,46.950833,10.024444,2399 +alps_14468,BREITFIELER BERG,,46.946111,10.043889,2417 +alps_14469,TSCHAMBREU SPITZE,,46.938889,10.040278,2605 +alps_14470,PIZ CHAMPATSCH,,46.811389,10.121944,2958 +alps_14471,PIZ CHAPISUN,,46.793889,10.117222,2931 +alps_14472,MOT SAN JON,,46.770556,10.316667,2442 +alps_14473,MOT DE LAS SELLAS,,46.754444,10.316944,2604 +alps_14474,PIZ AJUZ,,46.783333,10.357500,2790 +alps_14475,PIZ TRIAZZA,,46.769722,10.358333,3041 +alps_14476,PIZ LISCHANA,,46.769722,10.345278,3105 +alps_14477,PIZ SAN JON,,46.753333,10.339167,3093 +alps_14478,PIZ CURTINATSCH,,46.761111,10.373611,2864 +alps_14479,PIZ S-CHALAMBERT DADORA,,46.810833,10.405556,2678 +alps_14480,INNERER NOCKEN KOPF,,46.795556,10.441111,2769 +alps_14481,PIZ S-CHALAMBERT DADAINT,,46.800833,10.413333,3031 +alps_14482,FALLUNG SPITZE,,46.775000,10.456111,2643 +alps_14483,GRIAN KOPF,,46.766944,10.441944,2896 +alps_14484,PIZ RIMS,,46.766944,10.396111,2773 +alps_14485,PIX MEZDI,,46.770833,10.426944,2542 +alps_14486,PIZ DA GLIASEN,,46.764722,10.421389,2468 +alps_14487,RASSASSER BERG,,46.751667,10.442500,2884 +alps_14488,ZEHNER KOPF,,46.788889,10.491944,2674 +alps_14489,ZWOELFER KOPF,,46.781667,10.480556,2760 +alps_14490,ELFER SPITZE,,46.776389,10.487778,2925 +alps_14491,NOREDLICHE SEEBOEDEN SPITZE,,46.765556,10.481111,2832 +alps_14492,SEEBOEDEN SPITZE,,46.758056,10.481944,2853 +alps_14493,SCHWARZER KOPF,,46.753056,10.462500,2722 +alps_14494,HENGST,,46.790278,10.576389,2616 +alps_14495,ENDKOPF,,46.792500,10.566944,2652 +alps_14496,GROSS HORN,,46.764444,10.576667,2628 +alps_14497,PLEISS KOPF,,46.780000,10.567222,2469 +alps_14498,TIERGARTEN,,46.810556,10.640278,3068 +alps_14499,OCHSEN BERG,,46.791667,10.591944,2694 +alps_14500,ANGERLI KOPF,,46.784444,10.589444,2822 +alps_14501,SPEIKER WAND,,46.786389,10.624722,2977 +alps_14502,DANZEBELL,,46.780278,10.633889,3148 +alps_14503,HABICHER KOPF,,46.774167,10.587500,2901 +alps_14504,ZERZER KOEPFL,,46.769722,10.621111,2955 +alps_14505,STEINMANDL KOEPFL,,46.755278,10.601944,2815 +alps_14506,MITTERECK,,46.761944,10.602222,2908 +alps_14507,FALBANAIR SPITZE,,46.804722,10.661111,3200 +alps_14508,ROTEBEN KOPF,,46.802222,10.670278,3157 +alps_14509,KLEINER BERG,,46.756944,10.647222,2790 +alps_14510,MITTERLOCH SPITZE,,46.799722,10.652778,3176 +alps_14511,ROTE KOEPFE,,46.793611,10.649444,3148 +alps_14512,ROTER KOPF,,46.797778,10.677500,3246 +alps_14513,AEUSSERER BAERENBART KOGEL,,46.796389,10.699444,3471 +alps_14514,FREIBRUNNER SPITZE,,46.792500,10.689722,3366 +alps_14515,RABEN KOPF,,46.783611,10.672778,3394 +alps_14516,NOERLICHE FALWELL SPITZE,,46.775000,10.670556,3334 +alps_14517,SUEDLICHE FALWELL SPITZE,,46.768333,10.670556,3360 +alps_14518,GAWEL SPITZE,,46.765833,10.680000,3175 +alps_14519,PLERES SPITZE,,46.759444,10.675000,3188 +alps_14520,TEUFELS EGG,,46.786111,10.760556,3227 +alps_14521,STEINSCHLAG SPITZE,,46.772778,10.770278,2861 +alps_14522,SPITZAT,,46.755278,10.717500,3038 +alps_14523,WEISSKUGEL,,46.797778,10.726389,3738 +alps_14524,INNERE QUELL SPITZE,,46.788333,10.730278,3514 +alps_14525,AEUSSERE QUELL SPITZE,,46.778333,10.729444,3385 +alps_14526,SCHWEMSER SPITZE,,46.773611,10.732778,3459 +alps_14527,SUEDLICHE OBERETTES SPITZE,,46.767222,10.728333,3296 +alps_14528,INNERER BAERENBART KOGEL,,46.799722,10.720000,3553 +alps_14529,LANGTAUFERER SPITZE,,46.804722,10.745833,3528 +alps_14530,OBER ROFENBERG,,46.811111,10.810000,3010 +alps_14531,EGG,,46.790556,10.775278,3219 +alps_14532,FINELL KOEPFE,,46.774167,10.823056,3415 +alps_14533,FINEIL SPITZE,,46.780278,10.831944,3514 +alps_14534,KORBECK,,46.754444,10.807222,2923 +alps_14535,GROSS KAHNDL,,46.763889,10.830556,3171 +alps_14536,SCHWARZE WAND,,46.775833,10.815556,3354 +alps_14537,HAHL PLATTEN SPITZE,,46.768611,10.828889,3263 +alps_14538,GRAWAND,,46.768889,10.799444,3251 +alps_14539,GRAUE WAND,,46.772778,10.795278,3202 +alps_14540,AM HINTERN EIS,,46.793333,10.782500,3270 +alps_14541,ROFENBERG KOEPFE,,46.796667,10.789444,3279 +alps_14542,KREUZ KOGEL,,46.810556,10.862778,3338 +alps_14543,SENN KOGEL,,46.805000,10.855833,3398 +alps_14544,SEI KOGEL,,46.798056,10.851944,3355 +alps_14545,HAUSLAB KOGEL,,46.787222,10.846667,3402 +alps_14546,WESTLICHE MARZELL SPITZE,,46.769444,10.895000,3529 +alps_14547,SIMILAUN,,46.763611,10.880833,3599 +alps_14548,MITTEL DIEM KOGEL,,46.807778,10.935278,3340 +alps_14549,VORDER DIEM KOGEL,,46.810833,10.923333,3368 +alps_14550,HINTER DIEM KOGEL,,46.803056,10.945556,3398 +alps_14551,MUTMAL KAMM,,46.791111,10.917778,3266 +alps_14552,MUTMAL SPITZE,,46.783056,10.908333,3522 +alps_14553,HINTER SCHWAERZE,,46.773333,10.914722,3624 +alps_14554,MITTEL MARZELL SPITZE,,46.767778,10.904722,3532 +alps_14555,ROETEN SPITZE,,46.775000,10.944722,3393 +alps_14556,HOHE FAULWAND,,46.757222,10.895556,3416 +alps_14557,PFASSER GRAT,,46.760556,10.926944,2832 +alps_14558,UNTER FAULWAND,,46.751111,10.901111,3182 +alps_14559,SCHALF KOGEL,,46.801667,10.959167,3537 +alps_14560,KLEIN LEITN SPITZE,,46.795000,10.963056,3446 +alps_14561,MITTER KAMM,,46.785556,10.995556,3197 +alps_14562,QUER KOGEL,,46.783333,10.967222,3448 +alps_14563,ANNA KOGEL,,46.774167,11.011389,3333 +alps_14564,KARLES SPITZE,,46.772500,10.975000,3462 +alps_14565,FALSCHUNGG SPITZE,,46.768056,10.988056,3361 +alps_14566,BANK SPITZE,,46.766944,10.993333,3311 +alps_14567,FANAT SPITZE,,46.771111,10.963333,3358 +alps_14568,SCHEIBER KOGEL,,46.808056,11.057500,3133 +alps_14569,ROTMOOS KOGEL,,46.807778,11.048889,3336 +alps_14570,MITTLERER SEELEN KOGEL,,46.808611,11.035000,3424 +alps_14571,HINTERER SEELEN KOGEL,,46.801389,11.044444,3470 +alps_14572,ROTEGG,,46.794444,11.038056,3339 +alps_14573,LANGTALER JOCH SPITZE,,46.785000,11.033611,3155 +alps_14574,EREN SPITZE,,46.763889,11.077778,2756 +alps_14575,HOCHWILDE,,46.765556,11.022222,3480 +alps_14576,RAUHER KOPF,,46.871111,10.142222,3099 +alps_14577,SCHNEE GLOCKE,,46.864444,10.085278,3223 +alps_14578,SCHATTEN SPITZE,,46.867778,10.087222,3202 +alps_14579,TIROLER KOPF,,46.867778,10.138611,3095 +alps_14580,OCHSEN KOPF,,46.861944,10.139444,3057 +alps_14581,VERMUNT KOPF,,46.864167,10.126389,2851 +alps_14582,SILVRETTA HORN,,46.858056,10.092222,3244 +alps_14583,PIZ MON,,46.847500,10.131944,2982 +alps_14584,DREI LAENDER SPITZE,,46.850833,10.144722,3197 +alps_14585,PIZ JERAMIAS,,46.847778,10.140556,3136 +alps_14586,EGGHORN,,46.851389,10.091944,3147 +alps_14587,SIGNAL HORN,,46.848611,10.096944,3210 +alps_14588,WIESBADNER GRAETTLE,,46.847778,10.118889,3144 +alps_14589,VERMUNT PASS,,46.847778,10.125556,2798 +alps_14590,PIZ BUIN,,46.844167,10.118611,3312 +alps_14591,GLETSCHER KAMM,,46.842778,10.085000,3173 +alps_14592,KLEIN PIZ BUIN,,46.842222,10.111944,3255 +alps_14593,CRONSEL,,46.835556,10.123333,2653 +alps_14594,PIZ FLIANA,,46.827222,10.108611,3281 +alps_14595,PIZ TIATSCHA,,46.822222,10.101389,3051 +alps_14596,PIZ D'ANSCHATSCHA,,46.814722,10.108889,2978 +alps_14597,HINTER SALZGRAT,,46.873056,10.152500,3058 +alps_14598,RUSS KOPF,,46.865833,10.169722,2693 +alps_14599,SIGNAL SPITZE,,46.867500,10.191111,3159 +alps_14600,NOERDLICHE CHALAUS SPITZE,,46.866389,10.193611,3161 +alps_14601,AUGSTEN SPITZE,,46.864444,10.203889,3228 +alps_14602,SUEDLICHE CHALAUS SPITZE,,46.861389,10.188611,3096 +alps_14603,CHALAUS KOEPFE,,46.858889,10.183333,3120 +alps_14604,GAMS SPITZE,,46.853611,10.172500,3114 +alps_14605,VORDER JAM SPITZE,,46.851667,10.153889,3178 +alps_14606,PIZ TUOI,,46.845278,10.153056,3084 +alps_14607,PIZ UREZZAS,,46.845278,10.159167,3065 +alps_14608,HINTER JAM SPITZE,,46.847778,10.155556,3156 +alps_14609,PIZ URSCHAI,,46.851944,10.191944,3013 +alps_14610,PIZ FURCLETTA,,46.838333,10.154167,2894 +alps_14611,PIZ CHASCHLOGNA,,46.840833,10.182778,2939 +alps_14612,PIZ DA LAS CLAVIGLIADAS,,46.830556,10.152500,2983 +alps_14613,PIZ COTSCHEN,,46.813056,10.176944,3030 +alps_14614,BISCHOF SPITZE,,46.869444,10.230833,3029 +alps_14615,GRENZECK KOPF,,46.866389,10.232778,3047 +alps_14616,PIZ LAVER,,46.867222,10.254167,2984 +alps_14617,PIZ TASNA,,46.859167,10.252222,3179 +alps_14618,PIZ FUTSCHOEL,,46.862222,10.208889,3175 +alps_14619,PIZ MINSCHUN,,46.831389,10.241389,3068 +alps_14620,PIZ NAIR,,46.847500,10.255000,2966 +alps_14621,MINSCHUN PITSCHUN,,46.828056,10.228889,2928 +alps_14622,PIZ CLUENAS,,46.820833,10.244444,2793 +alps_14623,MUOT DA L'HOME,,46.812222,10.230278,2512 +alps_14624,MOT,,46.864444,10.272778,2705 +alps_14625,PIZ SPADLA,,46.851389,10.293611,2936 +alps_14626,PIZ SOER,,46.843056,10.281111,2917 +alps_14627,PIZ CHAMPATSCH,,46.841667,10.271389,2920 +alps_14628,PIZ ARINA,,46.867778,10.370556,2828 +alps_14629,PIZ AJUZ,,46.835833,10.449167,2755 +alps_14630,JOCHBODEN KOPF,,46.830278,10.456667,2802 +alps_14631,GROSSMUTZ KOPF,,46.862778,10.491944,1987 +alps_14632,PIZ LAD,,46.847500,10.468889,2808 +alps_14633,PIZ NAIR,,46.834444,10.460000,2743 +alps_14634,AUSSERER NOCKEN KOPF,,46.824444,10.460556,2767 +alps_14635,PIENGER KOPF,,46.860556,10.564167,2789 +alps_14636,MATAUN KOPF,,46.847778,10.581111,2892 +alps_14637,BERGKASTEL SPITZE,,46.846667,10.556667,2912 +alps_14638,PLAMORDER SPITZE,,46.839722,10.554444,2982 +alps_14639,KLOPEIER SPITZE,,46.836944,10.546111,2918 +alps_14640,PLAMORD,,46.840833,10.524444,2071 +alps_14641,MITTER KOPF,,46.850000,10.552222,2750 +alps_14642,MITTLER SEEKAR KOPF,,46.873611,10.619167,3060 +alps_14643,SUEDLICHER SEEKAR KOPF,,46.871944,10.619167,3057 +alps_14644,KLEIN SCHAF KOPF,,46.874167,10.584167,2742 +alps_14645,ARZ KOPF,,46.869444,10.591389,2787 +alps_14646,MUTTLER,,46.866944,10.602778,2553 +alps_14647,SCHWARZER KOPF,,46.813056,10.636111,3002 +alps_14648,GROSSER SCHAF KOPF,,46.857222,10.595556,2998 +alps_14649,TSCHEYER SCHARTL,,46.858611,10.608889,2806 +alps_14650,NAUDERER HENNESIGL SPITZE,,46.864444,10.624167,3042 +alps_14651,WOELFELES JOCH,,46.853333,10.591944,2829 +alps_14652,WOELFELES KOPF,,46.850556,10.590278,2894 +alps_14653,PLEIFER STEINMANDL,,46.838611,10.587778,2660 +alps_14654,STEINPLEISS,,46.820000,10.640000,2716 +alps_14655,NOCK SPITZE,,46.843056,10.684167,3006 +alps_14656,VORDER KARLES SPITZE,,46.852778,10.693333,3230 +alps_14657,HINTER KARLES SPITZE,,46.858056,10.693056,3160 +alps_14658,OESTLICHE HENNESIGL KOPF,,46.872222,10.660278,3116 +alps_14659,WESTLICHE HENNESIGL KOPF,,46.868611,10.655556,3103 +alps_14660,GLOCKHAUSER,,46.866389,10.650278,3023 +alps_14661,WIESJAGGES KOPF,,46.862500,10.696667,3127 +alps_14662,RAUHER KOPF,,46.865000,10.755556,2989 +alps_14663,WEISSSEE SPITZE,,46.846667,10.717222,3518 +alps_14664,ZAHN,,46.850833,10.725833,3377 +alps_14665,ZINNE,,46.826944,10.759167,3378 +alps_14666,HINTER HINTEREIS SPITZE,,46.822778,10.764444,3485 +alps_14667,HOCH VERNAGL WAND,,46.817778,10.758889,3433 +alps_14668,SCHMIED,,46.836389,10.708611,3207 +alps_14669,VERNAGL,,46.815278,10.751389,3352 +alps_14670,SCHWARZ KOEGELE,,46.866944,10.831667,3079 +alps_14671,FLUCHT KOGEL,,46.858056,10.792222,3497 +alps_14672,HINTERGRASL SPITZE,,46.858889,10.810833,3325 +alps_14673,EHRICH SPITZE,,46.849444,10.776667,3420 +alps_14674,DAHMANN SPITZE,,46.846944,10.776389,3397 +alps_14675,KESSELWAND SPITZE,,46.848611,10.798056,3414 +alps_14676,VORDER GUSLAR SPITZE,,46.839444,10.826667,3118 +alps_14677,MITTLER GUSLAR SPITZE,,46.836944,10.824444,3128 +alps_14678,HINTER GUSLAR SPITZE,,46.837500,10.818056,3147 +alps_14679,VORDERE HINTEREIS SPITZE,,46.832500,10.783056,3437 +alps_14680,MUT SPITZE,,46.831389,10.795833,3257 +alps_14681,MITTLERE HINTEREIS SPITZE,,46.826667,10.775556,3450 +alps_14682,URKUND KOLM,,46.873889,10.875833,3134 +alps_14683,PLATTEI KOGEL,,46.866667,10.846389,3426 +alps_14684,EIS KOGEL,,46.830833,10.867500,3114 +alps_14685,TALLEIT SPITZE,,46.833056,10.886944,3406 +alps_14686,KREUZ SPITZE,,46.816111,10.870278,3455 +alps_14687,GAMPLES KOPF,,46.868333,10.957222,3165 +alps_14688,MUTSBICHL,,46.862222,10.927778,2361 +alps_14689,MITTLER SPIEGEL KOGEL,,46.831944,10.947778,3311 +alps_14690,FIRMISAN SCHNEID,,46.819722,10.953611,3490 +alps_14691,STEINMANDL,,46.816944,10.920556,3145 +alps_14692,ZIRMEGGEN KOGEL,,46.874167,10.986944,3229 +alps_14693,GAMPLES KOGEL,,46.867222,10.975833,3399 +alps_14694,MANIGENBACH KOPF,,46.859167,10.975000,3314 +alps_14695,KLEIN ALPL,,46.840278,10.996389,2209 +alps_14696,NOERDLICHE RAMOL KOGEL,,46.848333,10.970000,3427 +alps_14697,KLEINER RAMOL KOGEL,,46.840278,10.963333,3349 +alps_14698,SCHOENWIES KOPF,,46.849722,11.014167,2324 +alps_14699,GROSSER RAMOL KOGEL,,46.846667,10.958889,3549 +alps_14700,HANGERER,,46.835278,11.018333,3020 +alps_14701,RAMOL JOCH,,46.835000,10.965278,3189 +alps_14702,HOCHEBEN KAMM,,46.826389,11.019722,3165 +alps_14703,HINTER SPIEGEL KOGEL,,46.829167,10.958889,3424 +alps_14704,MITTLERE SCHWENZER SPITZE,,46.868889,11.082222,2886 +alps_14705,HINTERE SCHWENZER SPITZE,,46.865833,11.082222,2870 +alps_14706,KOENIGS KOGEL,,46.858056,11.073056,3050 +alps_14707,FEST KOGEL,,46.851944,11.051389,3038 +alps_14708,HOHE MUT,,46.848333,11.030556,2653 +alps_14709,GRANATEN KOGEL,,46.836944,11.072222,3318 +alps_14710,HOCHFIRST,,46.826667,11.081111,3403 +alps_14711,VORDER SEELEN KOGEL,,46.818611,11.030833,3286 +alps_14712,EIS KOEGELE,,46.821389,11.024167,3233 +alps_14713,KIRCHEN KOGEL,,46.824444,11.064444,3280 +alps_14714,LIEBENER SPITZE,,46.820278,11.075833,3399 +alps_14715,TRINKER KOGEL,,46.812778,11.060833,3160 +alps_14716,HEUFLER KOGEL,,46.815000,11.064444,3238 +alps_14717,KLEIN VALLUELA,,46.932500,10.107778,2643 +alps_14718,SCHATTEN KOPF,,46.931389,10.083611,2654 +alps_14719,BIELER SPITZE,,46.927500,10.098333,2545 +alps_14720,HENNE SPITZE,,46.915556,10.134444,2707 +alps_14721,HENNE KOPF,,46.909444,10.139444,2704 +alps_14722,RAD KOPF,,46.897222,10.109167,2751 +alps_14723,HOHES RAD,,46.892778,10.111667,2934 +alps_14724,RAD SATTEL,,46.883333,10.119722,2652 +alps_14725,MADLENER SPITZE,,46.891944,10.145278,2969 +alps_14726,KLEIN SCHATTEN SPITZE,,46.887222,10.085556,2703 +alps_14727,HAAG SPITZE,,46.874722,10.141389,3029 +alps_14728,BIELTAL KOPF,,46.878889,10.128056,2797 +alps_14729,KLEIN EGGHOERNER,,46.878333,10.085000,2872 +alps_14730,SEDEL SPITZE,,46.928333,10.163333,2719 +alps_14731,ROTE WAND,,46.925278,10.207778,2949 +alps_14732,BODMER SPITZE,,46.919444,10.154444,2851 +alps_14733,SCHNAPFENLOCH SPITZE,,46.921667,10.207778,2991 +alps_14734,FINSTERKAR SPITZE,,46.913056,10.208056,3012 +alps_14735,HENNEBERG SPITZEN,,46.907500,10.159444,2836 +alps_14736,OESTLICHER GAMSHORN,,46.896667,10.202222,3073 +alps_14737,WESTLICHER GAMSHORN,,46.896111,10.190000,2987 +alps_14738,VORDER GETSCHNER SPITZE,,46.899444,10.154444,2960 +alps_14739,HINTER GETSCHNER SPITZE,,46.893333,10.149167,2950 +alps_14740,MITTLER GETSCHNER SPITZE,,46.896944,10.150833,2965 +alps_14741,TOTENFELD KOPF,,46.880278,10.146667,2935 +alps_14742,VORDER SALZGRAT,,46.884444,10.153056,3023 +alps_14743,PFANN KNECHT,,46.876667,10.193056,2822 +alps_14744,GAMSPLEIS SPITZE,,46.931667,10.241667,3014 +alps_14745,HOHER KOGEL,,46.922778,10.241111,2817 +alps_14746,CRAP ALV,,46.920556,10.249444,2537 +alps_14747,RITZEN JOCH,,46.917222,10.240833,2687 +alps_14748,HEIDELBERGER SPITZE,,46.912778,10.236389,2963 +alps_14749,LAREIN FERNER SPITZE,,46.905278,10.234167,3009 +alps_14750,SCHNAPFEN SPITZE,,46.898056,10.214722,3219 +alps_14751,FLUCHTHORN,,46.890833,10.227500,3399 +alps_14752,KRONE,,46.875556,10.232222,3188 +alps_14753,PAULCKE TURM,,46.880833,10.234444,3072 +alps_14754,ZAHN SPITZE,,46.884722,10.234722,3096 +alps_14755,PIZ DAVO LEIS,,46.878889,10.268056,3027 +alps_14756,VESIL SPITZE,,46.925278,10.316111,3097 +alps_14757,VESIL JOCH,,46.924444,10.300278,2793 +alps_14758,PIZ VAL GRONDA,,46.923333,10.290833,2812 +alps_14759,PIZ DAVO SASSE,,46.911944,10.281389,2792 +alps_14760,PIZ MOTTANA,,46.890278,10.288333,2928 +alps_14761,PIZ CHOEGLIAS,,46.893056,10.294167,2849 +alps_14762,MOTNAIR,,46.936667,10.386111,2731 +alps_14763,MUTTLER,,46.900556,10.378611,3294 +alps_14764,PIZ TSCHUETTA,,46.901667,10.338333,3147 +alps_14765,STAMMER SPITZ,,46.903333,10.343611,3254 +alps_14766,PIZ NAIR,,46.889444,10.375278,3018 +alps_14767,PIZ MEZDI,,46.933889,10.440556,2920 +alps_14768,PIZ ALPETTA,,46.928611,10.449167,2975 +alps_14769,PIZ MUNDIN,,46.925278,10.430833,3146 +alps_14770,PIZ FOT,,46.911389,10.427500,2593 +alps_14771,PIX MALMURAINZA,,46.906111,10.407222,3038 +alps_14772,PIZ SALET,,46.902500,10.399444,2971 +alps_14773,KLEINMUTZ KOPF,,46.882222,10.490833,1812 +alps_14774,SCHMALZ KOPF,,46.931389,10.535833,2724 +alps_14775,GEISPLEIS KOPF,,46.911111,10.544444,2718 +alps_14776,AFFEN KOPF,,46.910556,10.573056,2623 +alps_14777,OCHSEN KOPF,,46.906111,10.559722,2765 +alps_14778,SCHARTL KOPF,,46.899722,10.562222,2808 +alps_14779,VALDAFUR KOPF,,46.896667,10.555278,2746 +alps_14780,TSCHEYEGG,,46.889167,10.571111,2666 +alps_14781,GUESER KOPF,,46.884444,10.577222,2740 +alps_14782,WANNE KOPF,,46.926944,10.640833,2876 +alps_14783,MUTTLER KOPF,,46.896111,10.605833,2744 +alps_14784,WILD NOERDERER,,46.891111,10.615278,3011 +alps_14785,SCHOENKARLES SPITZE,,46.880000,10.616944,2915 +alps_14786,NOERLICHE SEEKAR KOPF,,46.877778,10.620278,2999 +alps_14787,ABSATZ KOPF,,46.877778,10.639722,2604 +alps_14788,BRUNNEWANDSPITZE,,46.883333,10.611389,2981 +alps_14789,VORDER GEBHARD SPITZE,,46.936389,10.678056,3114 +alps_14790,HINTER GEBHARD SPITZE,,46.933333,10.675278,3106 +alps_14791,GAMS KOEPFE,,46.931389,10.657778,3108 +alps_14792,MITTERKEIL,,46.930556,10.646667,2823 +alps_14793,PLATZER SPITZE,,46.925833,10.667500,3098 +alps_14794,PLATTIG KOPF,,46.927778,10.675833,3170 +alps_14795,KAISER SPITZE,,46.921111,10.664722,3089 +alps_14796,GRATFERNER KOEPFE,,46.910833,10.703889,3003 +alps_14797,ROTSCHRAGEN SPITZE,,46.909722,10.661389,3112 +alps_14798,KAISERGRAT SPITZE,,46.903056,10.692778,3155 +alps_14799,OCHSEN KOPF,,46.895556,10.704444,2942 +alps_14800,BRUCH KOPF,,46.906944,10.650278,3012 +alps_14801,HOEHLEN SPITZE,,46.901111,10.685833,3199 +alps_14802,RIFFLKAR SPITZE,,46.900556,10.673889,3219 +alps_14803,GLOCKTURM,,46.893056,10.665278,3353 +alps_14804,HABICHT,,46.889167,10.678611,3092 +alps_14805,ARZKAR KOPF,,46.882222,10.662778,3123 +alps_14806,KRUMMGAMPEN TURM,,46.885000,10.662778,3130 +alps_14807,KRUMMGAMP SPITZEN,,46.884444,10.686111,3110 +alps_14808,HENNESIGL SPITZE,,46.875556,10.667222,3141 +alps_14809,AEUSSERER BLIGG KOPF,,46.920278,10.762778,2897 +alps_14810,PLANGEROS SPITZE,,46.916389,10.712778,2943 +alps_14811,INNERER BLIGG KOPF,,46.908889,10.760000,2865 +alps_14812,GEPATSCH HAUS,,46.901389,10.737778,1925 +alps_14813,WANNET SPITZE,,46.888611,10.764722,3099 +alps_14814,VORDER EISKASTEN KOPF,,46.933889,10.812778,3086 +alps_14815,EISKASTEN SPITZE,,46.930278,10.791944,3371 +alps_14816,BLIGG SPITZE,,46.918056,10.786111,3453 +alps_14817,MITTLER EISKASTEN KOPF,,46.916944,10.796667,3259 +alps_14818,HINTER EISKASTEN KOPF,,46.913333,10.778333,3299 +alps_14819,OELGRUBEN KOPF,,46.906389,10.775556,3392 +alps_14820,VORDER OELGRUBEN SPITZE,,46.908056,10.773611,3452 +alps_14821,URKUND KOPF,,46.901944,10.815556,2898 +alps_14822,OELGRUBEN JOCH,,46.896111,10.777778,3044 +alps_14823,HINTER OELGRUBEN SPITZE,,46.890833,10.775000,3295 +alps_14824,PITZTALER URKUND,,46.895278,10.809444,3197 +alps_14825,TASCHACH JOCH,,46.887500,10.822222,3236 +alps_14826,NOERLICHE SEXEGERTEN SPITZE,,46.886944,10.789444,3348 +alps_14827,SUEDLICHE SEXEGERTEN SPITZE,,46.883889,10.793611,3428 +alps_14828,HOCH VERNAGT WAND,,46.886111,10.805556,3399 +alps_14829,HOCH VERNAGT SPITZE,,46.881389,10.796944,3535 +alps_14830,SCHWARZ WAND SPITZE,,46.875000,10.787222,3466 +alps_14831,MITTAGS KOGEL,,46.933333,10.871667,3159 +alps_14832,GRAB KOGEL,,46.928889,10.889444,3054 +alps_14833,MITTERKAMM,,46.925833,10.862500,3219 +alps_14834,HINTER BRUNNEN KOGEL,,46.912778,10.861389,3438 +alps_14835,VORDER BRUNNEN KOGEL,,46.919444,10.856667,3396 +alps_14836,MITTER KOPF,,46.921111,10.854167,3344 +alps_14837,BRUNNENKAR KOPF,,46.909167,10.846944,3246 +alps_14838,RECHTER FERNER KOGEL,,46.907500,10.886667,3299 +alps_14839,SCHUCHT KOGEL,,46.897500,10.875556,3471 +alps_14840,TASCHACH WAND,,46.894722,10.845833,3358 +alps_14841,TAUFKAR KOGEL,,46.885278,10.887778,3362 +alps_14842,WILD SPITZE,,46.885278,10.867222,3768 +alps_14843,PETERSEN SPITZE,,46.888889,10.839444,3482 +alps_14844,HINTER BROCH KOGEL,,46.886111,10.849722,3628 +alps_14845,OETZTALER URKUND,,46.881111,10.872778,3554 +alps_14846,VORDER BROCH KOGEL,,46.875000,10.850833,3562 +alps_14847,INNERE SCHWARZE SCHNEID,,46.923889,10.921111,3367 +alps_14848,LINKER FERNER KOGEL,,46.921111,10.910278,3277 +alps_14849,TIEFENBACH KOGEL,,46.919167,10.919167,3307 +alps_14850,MUT KOGEL,,46.915278,10.919722,3309 +alps_14851,WEISSER KOGEL,,46.891667,10.906111,3407 +alps_14852,NIEDER KOGEL,,46.906944,11.008889,3163 +alps_14853,MITTAGS KOGEL,,46.913889,11.017222,2825 +alps_14854,AUSSERER GRIES KOGEL,,46.901944,11.005833,3105 +alps_14855,INNERER GRIES KOGEL,,46.895556,10.999722,3107 +alps_14856,SPITZIGES KOGEL,,46.886944,11.004722,2948 +alps_14857,KARL KOEGELE,,46.887222,10.971667,2788 +alps_14858,ZIRM KOGEL,,46.881389,10.988611,3278 +alps_14859,KIRCHEN KOEGELE,,46.908333,11.074444,2860 +alps_14860,KIRCHEN KOGEL,,46.899444,11.081389,3113 +alps_14861,WURM KOGEL,,46.886111,11.062500,2682 +alps_14862,OCHSEN KOPF,,46.876667,11.032222,1961 +alps_14863,FLUH SPITZEN,,46.990278,10.138056,2653 +alps_14864,VERSAL SPITZE,,46.982500,10.085000,2462 +alps_14865,ALP KOGEL,,46.973333,10.139167,1995 +alps_14866,BREITER SPITZE,,46.958333,10.099444,2201 +alps_14867,BALLUN SPITZE,,46.955278,10.135000,2671 +alps_14868,VALLUELA,,46.937500,10.112500,2813 +alps_14869,HOHE KOEPFE,,46.997222,10.196667,2608 +alps_14870,GLATTER BERG,,46.999167,10.183333,2866 +alps_14871,SCHROTTEN KOPF,,46.993611,10.154722,2890 +alps_14872,GAIS SPITZE,,46.991389,10.183333,2779 +alps_14873,FAEDNER SPITZE,,46.983889,10.160000,2788 +alps_14874,GRIES KOPF,,46.983056,10.171667,2754 +alps_14875,GORFEN SPITZE,,46.955278,10.175556,2558 +alps_14876,NOERDERER SPITZE,,46.939444,10.161667,2677 +alps_14877,HOCH NOERDERER,,46.944722,10.166944,2754 +alps_14878,MITTAGS KOPF,,46.969722,10.270278,2735 +alps_14879,BERGLER HORN,,46.961667,10.263333,2888 +alps_14880,ZIRMLI,,46.954722,10.257778,2921 +alps_14881,PREDIGBERG,,46.954722,10.214722,2645 +alps_14882,BLAUER KOPF,,46.956944,10.259167,2893 +alps_14883,DREI KOEPFL,,46.952500,10.246389,2970 +alps_14884,THOMASBERG,,46.949167,10.212778,2630 +alps_14885,BIDNER SPITZE,,46.944444,10.243889,2871 +alps_14886,LANG GRABEN SPITZE,,46.937222,10.209722,2766 +alps_14887,TSCHAMATSCH KOPF,,46.998611,10.292500,2145 +alps_14888,RAUHER KOPF,,46.989444,10.283611,2485 +alps_14889,LANGE WAND,,46.973889,10.328056,2698 +alps_14890,HOELLEN SPITZE,,46.956667,10.308889,2799 +alps_14891,SALAASER KOPF,,46.953056,10.326111,2746 +alps_14892,PALIN KOPF,,46.950278,10.309444,2864 +alps_14893,ZEBLAS JOCH,,46.937500,10.308611,2539 +alps_14894,VISNITZ KOPF,,46.990833,10.371944,2745 +alps_14895,BUERKEL KOPF,,46.989722,10.346667,3032 +alps_14896,FLIM SPITZE,,46.982222,10.343611,2929 +alps_14897,PIZ MUNSCHUNS,,46.970278,10.374444,2657 +alps_14898,GREIT SPITZE,,46.970278,10.334167,2871 +alps_14899,PIZ OT,,46.951389,10.341944,2799 +alps_14900,MUNT DA CHIERNS,,46.983611,10.398333,2690 +alps_14901,UNTERER MALFRAG KOPF,,46.995556,10.407778,2654 +alps_14902,FLIESSER BERG,,46.991389,10.416389,2520 +alps_14903,MUTER KOEPFL,,46.969444,10.446944,2525 +alps_14904,PIZ UREZZA,,46.966389,10.401667,2098 +alps_14905,RUINA COTSCHNA,,46.937500,10.431667,2666 +alps_14906,GAMSPLEIS KOPF,,46.997500,10.481944,2791 +alps_14907,BLAUWAND,,46.993056,10.458611,2816 +alps_14908,HOHER KOPF,,46.991944,10.499167,2440 +alps_14909,PRAIS KOPF,,46.991389,10.507222,2371 +alps_14910,RUDIGER KOPF,,46.987500,10.460278,2709 +alps_14911,IN DER KEIL,,46.977500,10.459444,2679 +alps_14912,ROT SPITZE,,46.973611,10.465000,2678 +alps_14913,HAHNTENNEN BERG,,46.976111,10.504167,2255 +alps_14914,KREUZ JOCH,,46.969167,10.472778,2698 +alps_14915,RAUHER KOPF,,46.952222,10.483611,2052 +alps_14916,TOARJOCH,,46.996667,10.535000,2406 +alps_14917,LOSNER,,46.967500,10.573056,2006 +alps_14918,SATTEL KOPF,,46.948056,10.581389,1837 +alps_14919,ULRICHS KOPF,,46.943056,10.543056,2457 +alps_14920,SONN BERG,,46.989722,10.607778,2022 +alps_14921,MOLZ KOPF,,46.985556,10.626667,2212 +alps_14922,LEITER KOPF,,46.984167,10.639722,2391 +alps_14923,FRUDIGER KOPF,,46.976111,10.587222,2149 +alps_14924,LAHN KOPF,,46.969167,10.622222,2471 +alps_14925,RAUHER KOPF,,46.967222,10.634444,2695 +alps_14926,HOCHJOCH,,46.948056,10.639167,2896 +alps_14927,SATTEL,,46.947500,10.594444,2106 +alps_14928,RAUH KOPF,,46.947222,10.611111,2366 +alps_14929,KUPPKARLES SPITZE,,46.998611,10.706944,2991 +alps_14930,ZIRMES SPITZE,,46.995278,10.681111,2944 +alps_14931,PLEIS KOPF,,46.997222,10.661111,2460 +alps_14932,AEUSSERE RIFEKAR SPITZE,,46.988889,10.704722,3001 +alps_14933,INNERE RIFEKAR SPITZE,,46.982778,10.698333,3004 +alps_14934,SCHWARZSEE KOPF,,46.937222,10.683333,3127 +alps_14935,TAUFERER KOPF,,46.968056,10.686111,3066 +alps_14936,PFROSL KOPF,,46.977778,10.689167,3148 +alps_14937,SERNES KOPF,,46.974167,10.656111,2703 +alps_14938,ARZ KOPF,,46.952222,10.667500,2860 +alps_14939,GLOCK HAUS,,46.956389,10.686111,3096 +alps_14940,BERGLER FERNER KOGEL,,46.951111,10.682222,3099 +alps_14941,FISSLAD KOPF,,46.943611,10.687500,3107 +alps_14942,ATEM KOGEL,,46.942778,10.699444,3010 +alps_14943,WATZE KOPF,,46.990278,10.767222,2918 +alps_14944,STANGE,,46.973333,10.761111,2705 +alps_14945,KREUZ KOPF,,46.955833,10.716667,2680 +alps_14946,SUDLES KOPF,,46.968611,10.719167,2522 +alps_14947,GEIL STANGE,,46.958611,10.765000,2754 +alps_14948,ATEM KOPF,,46.948333,10.714444,2792 +alps_14949,PARSTLES WAND,,46.998333,10.817222,3096 +alps_14950,WATZE SPITZE,,46.989444,10.795556,3532 +alps_14951,HOHER KOGEL,,46.979722,10.832222,3047 +alps_14952,SEEKARLES SCHNEID,,46.981111,10.816944,3207 +alps_14953,SEE KOGEL,,46.971667,10.811111,3357 +alps_14954,ROSTIZ KOGEL,,46.968611,10.794722,3394 +alps_14955,GEIL KOPF,,46.957222,10.773333,2874 +alps_14956,GRUBENKAR SPITZE,,46.943611,10.818889,2999 +alps_14957,LOECHER KOGEL,,46.959167,10.791389,3324 +alps_14958,SUEDLICHER HAPMES KOPF,,46.945000,10.782500,3240 +alps_14959,NOERLICHER HAPMES KOPF,,46.949444,10.784444,3289 +alps_14960,WURMTALER KOPF,,46.938611,10.796111,3225 +alps_14961,GRUBEN GRAT,,46.955556,10.835556,2821 +alps_14962,MUTTEN KOPF,,46.964167,10.855833,2344 +alps_14963,BRAND KOGEL,,46.975278,10.851389,2676 +alps_14964,ZURAG KOGEL,,46.976667,10.841111,2895 +alps_14965,STEIN KOGEL,,46.981667,10.851111,2632 +alps_14966,PARSTLES KOGEL,,46.997778,10.847222,2740 +alps_14967,EBNET KOPF,,46.996389,10.878333,2217 +alps_14968,AUSSERE SCHWARZE SCHNEID,,46.937500,10.952778,3255 +alps_14969,POLLES KOGEL,,46.944444,10.919722,3032 +alps_14970,KARLES KOGEL,,46.937222,10.922500,3106 +alps_14971,KARLES KOPF,,46.938333,10.910000,2902 +alps_14972,EINZEIGER,,46.950278,10.931389,2961 +alps_14973,VORDER EINZEIGER,,46.958333,10.934444,2985 +alps_14974,SCHWARZ KOGEL,,46.962222,10.938611,3016 +alps_14975,SCHWARZSEE KOGEL,,46.962778,10.947500,2931 +alps_14976,ROT KOGEL,,46.967222,10.949167,2947 +alps_14977,ROSS KIRPL,,46.970833,10.950833,2942 +alps_14978,WURMSITZ KOGEL,,46.956944,10.908611,3079 +alps_14979,GSCHRAPP KOGEL,,46.961389,10.906389,3197 +alps_14980,WASSERTAL KOGEL,,46.966944,10.905278,3252 +alps_14981,SONNEN KOGEL,,46.973611,10.901667,3166 +alps_14982,PUIT KOGEL,,46.981111,10.901389,3343 +alps_14983,WEISS MAURACH KOPF,,46.991111,10.909444,3069 +alps_14984,LEGER KOGEL,,46.991944,10.933333,2844 +alps_14985,AMPFER KOGEL,,46.996389,10.913611,3183 +alps_14986,VORDER AMPFER KOGEL,,46.998056,10.940556,2909 +alps_14987,HINTER NACHTBERG,,46.939167,11.016944,1867 +alps_14988,GAISLACHER KOGEL,,46.942222,10.967500,3056 +alps_14989,BREIT LEHNER,,46.983056,10.963056,2795 +alps_14990,KREUZ KOGEL,,46.990833,10.984444,2658 +alps_14991,GRANSTEIN KOPF,,46.997778,10.971389,2799 +alps_14992,GRIES KOGEL,,46.990556,10.971111,2911 +alps_14993,WILDE ROETE SPITZE,,46.937778,11.065833,2966 +alps_14994,ROTKOGEL,,46.940556,11.057778,2894 +alps_14995,HINTER SOELDEN KOGEL,,46.981111,11.041389,2975 +alps_14996,HINTER NEBEL KOGEL,,46.978889,11.064167,3213 +alps_14997,WARENKAR SEITEN SPITZE,,46.979722,11.076111,3347 +alps_14998,WINDACHER DAUN KOGEL,,46.987222,11.081111,3348 +alps_14999,DURRN KOEGELE,,46.984444,11.064444,3130 +alps_15000,DURRN KOEPFL,,46.987500,11.051111,2858 +alps_15001,WUETENKAR SPITZE,,46.997222,11.062222,3219 +alps_15002,PLATTEN SPITZE,,46.861667,11.125278,2517 +alps_15003,SECHS SPITZLER,,46.855000,11.124722,2655 +alps_15004,DRAUNSBERG,,46.848056,11.126667,2776 +alps_15005,GRINOL SPITZE,,46.847778,11.113056,2754 +alps_15006,SCHEIB KOPF,,46.838889,11.120833,2817 +alps_15007,RACINE SPITZE,,46.831111,11.086944,3037 +alps_15008,SEEWER SPITZE,,46.822500,11.083611,3286 +alps_15009,WEISER KOPF,,46.835278,11.141667,2399 +alps_15010,WANNEN KOGEL,,46.936389,11.084722,3089 +alps_15011,VORDER KITZKAMP,,46.935556,11.120833,2868 +alps_15012,JOCHKOPFL,,46.926111,11.108056,3143 +alps_15013,HINTER KITZKAMP,,46.933889,11.129167,2987 +alps_15014,SCHEIBLEHN KOGEL,,46.930278,11.144444,3055 +alps_15015,HINTER KITZKOGEL,,46.929167,11.127778,3059 +alps_15016,VORDER KITZKOGEL,,46.931111,11.114722,3061 +alps_15017,SCHRAA KOGEL,,46.930556,11.104167,3137 +alps_15018,TIMMELSJOCH BERG,,46.915833,11.109167,2970 +alps_15019,WURM KOGEL,,46.880556,11.085833,3082 +alps_15020,SCHERMER SPITZE,,46.887500,11.084444,3116 +alps_15021,BOTZER,,46.931111,11.198056,3251 +alps_15022,HOCHGWAEND,,46.933889,11.208056,3190 +alps_15023,TIMMELS,,46.920000,11.200278,3033 +alps_15024,GUERTEL SPITZE,,46.904722,11.166389,2858 +alps_15025,SPRINZEN WAND,,46.903611,11.202778,2899 +alps_15026,RINNER SPITZE,,46.889722,11.201389,2824 +alps_15027,WEST DAUNKOGEL,,46.988611,11.090000,3299 +alps_15028,OST DAUNKOGEL,,46.986944,11.094722,3330 +alps_15029,STUBAIER WILDSPITZE,,46.983056,11.099444,3341 +alps_15030,APERER PFAFF,,46.972500,11.140833,3353 +alps_15031,SCHAUFEL SPITZE,,46.978333,11.115833,3332 +alps_15032,SCHUSSGRUBEN KOGEL,,46.968333,11.108611,3211 +alps_15033,GAISKOGEL,,46.955000,11.129167,3128 +alps_15034,GROSSER TROEGLER,,46.995556,11.160556,2902 +alps_15035,SULZENAU KOGEL,,46.985278,11.185000,2944 +alps_15036,APERER FREIGER,,46.976667,11.179722,3261 +alps_15037,GAMSSPITZL,,46.978889,11.202500,3050 +alps_15038,WILDER PFAFF,,46.965833,11.164444,3456 +alps_15039,WILDER FREIGER,,46.970278,11.190278,3418 +alps_15040,ZUCKERHUETL,,46.964444,11.153889,3507 +alps_15041,ROTER GRAT,,46.962500,11.207500,3098 +alps_15042,BECHER,,46.960833,11.192500,3191 +alps_15043,SONKLAR SPITZE,,46.955278,11.165833,3467 +alps_15044,SCHWARZWAND SPITZE,,46.945278,11.168056,3353 +alps_15045,HOFMANN SPITZE,,46.942778,11.175000,3113 +alps_15046,KOENIGSHOF SPITZE,,46.936944,11.186111,3132 +alps_15047,URFALL SPITZE,,46.984167,11.212222,2805 +alps_15048,APERER FEUERSTEIN,,46.981389,11.238056,2967 +alps_15049,W.FEUERSTEIN,,46.970000,11.240278,3230 +alps_15050,HOHE WAND,,46.968889,11.220833,2968 +alps_15051,SCHNEE SPITZE,,46.974444,11.256111,3173 +alps_15052,LORENZ SPITZE,,46.958056,11.263889,2924 +alps_15053,O.FEUERSTEIN,,46.971667,11.244444,3267 +alps_15054,AGGLS SPITZE,,46.965278,11.245000,3194 +alps_15055,HOCHECK,,46.952778,11.257778,2576 +alps_15056,HUETTER BICHL,,46.938611,11.255278,1779 +alps_15057,PINGGL,,46.991111,11.316944,2767 +alps_15058,SCHAFKAMP SPITZE,,46.984167,11.286944,3011 +alps_15059,WEISS WAND,,46.983333,11.300278,3017 +alps_15060,HOHER ZAHN,,46.984167,11.308056,2924 +alps_15061,PUTZEN,,46.954167,11.313056,2363 +alps_15062,HOCHECK,,46.949444,11.280000,2867 +alps_15063,ELLES SPITZE,,46.943056,11.295000,2661 +alps_15064,MARATSCH SPITZE,,46.943333,11.315833,2648 +alps_15065,MAURER SPITZE,,46.936944,11.310556,2628 +alps_15066,PFLERSCHER TRIBULAUN,,46.985278,11.339167,3097 +alps_15067,GSCHNITZER TRIBULAUN,,46.990556,11.345833,2946 +alps_15068,SCHWARZE WAND,,46.990000,11.359167,2917 +alps_15069,NOERDLICHER ROSSLAUF,,46.983611,11.366111,2881 +alps_15070,OBERNBERGER TRIBULAUN,,46.988889,11.375833,2780 +alps_15071,KLEINER TRIBULAUN,,46.994167,11.385278,2492 +alps_15072,SUEDLICHER ROSSLAUF,,46.971944,11.380833,2378 +alps_15073,ALLERLEI GRUBENSPITZE,,46.993889,11.423889,2131 +alps_15074,HOHER LORENZEN,,46.972500,11.432500,2315 +alps_15075,GRUBENKOPF,,46.966389,11.409444,2330 +alps_15076,GEIERSKRAGEN,,46.966389,11.417778,2309 +alps_15077,GEIGENSPITZE,,46.993611,11.528333,2334 +alps_15078,WOLFENDORN,,46.984167,11.537778,2774 +alps_15079,WILDSEESPITZE,,46.992778,11.565278,2733 +alps_15080,FRIEDRICHSHOHE,,46.997222,11.581667,2713 +alps_15081,BEILSTEIN,,46.987778,11.594167,2231 +alps_15082,VORDER LANGSPITZE,,46.959167,11.636667,2562 +alps_15083,FELBE SPITZE,,46.946111,11.630278,2849 +alps_15084,VIED SPITZE,,46.944722,11.603056,2690 +alps_15085,RUEBE SPITZ,,46.937778,11.600000,2766 +alps_15086,GRAB SPITZE,,46.938889,11.614722,3059 +alps_15087,ROTBACHL SPITZE,,46.995278,11.688611,2897 +alps_15088,VORDERE WEISS SPITZE,,46.972778,11.700000,3269 +alps_15089,BLAUER KOFE,,46.969167,11.683056,2867 +alps_15090,PLETZEN SPITZE,,46.962778,11.655000,2769 +alps_15091,ROTES BEIL,,46.952778,11.660833,2949 +alps_15092,ENGBERG,,46.950833,11.677500,2816 +alps_15093,ROETECK,,46.950000,11.688611,2930 +alps_15094,HOCHSAG,,46.950556,11.648889,2778 +alps_15095,DANNEL SPITZE,,46.943611,11.687500,2806 +alps_15096,HOCHSTELLER,,46.996667,11.711667,3098 +alps_15097,HOCHFERNER SPITZE,,46.978056,11.718333,3470 +alps_15098,BREITNOCK,,46.972500,11.758333,3212 +alps_15099,SCHLEGEIS SCHARTE,,46.970833,11.751389,3082 +alps_15100,HOHER WEISSZINT,,46.968611,11.747222,3371 +alps_15101,HOCHFEILER,,46.972222,11.727778,3509 +alps_15102,NIEDERER WEISSZINT,,46.958056,11.736667,3283 +alps_15103,HOCHWART,,46.950556,11.714167,3045 +alps_15104,EISBRUGG SPITZE,,46.936944,11.740000,2887 +alps_15105,NAPF SPITZE,,46.940278,11.740278,2888 +alps_15106,GROSS MOESELER,,46.992500,11.781944,3480 +alps_15107,ROSSRUGG SPITZE,,46.991667,11.804167,3304 +alps_15108,SATTELNOCK,,46.980278,11.814444,3084 +alps_15109,TURNERKAMP,,46.990000,11.810000,3420 +alps_15110,PFAFFEN NOCK,,46.970833,11.814722,2973 +alps_15111,SCHAFLAHNER NOCK,,46.952222,11.813333,2703 +alps_15112,WEISSE WAND,,46.945833,11.813333,2725 +alps_15113,TRISTEN SPITZE,,46.944167,11.819167,2716 +alps_15114,WOLAYER KOPF,,46.613889,12.834722,2472 +alps_15115,MAHDERKOPF,,46.621944,12.861944,2155 +alps_15116,RAUCHKOFEL,,46.619167,12.883611,2460 +alps_15117,HOHE WARTE,,46.606944,12.883056,2780 +alps_15118,KELLERWARTE,,46.606389,12.888889,2726 +alps_15119,SEEWARTE,,46.608611,12.876944,2595 +alps_15120,MONTE CANALE,,46.604444,12.854167,2536 +alps_15121,SEEKOPF,,46.606111,12.860833,2554 +alps_15122,SASSO NERO,,46.607222,12.840278,2468 +alps_15123,KELLERSPITZEN,,46.609167,12.900278,2774 +alps_15124,KOLLINKOFEL,,46.607222,12.905278,2742 +alps_15125,FRISCHENKOFEL,,46.609722,12.931389,2241 +alps_15126,LAUCHECK,,46.623056,13.006944,2156 +alps_15127,KOEDERHOEHE,,46.614444,13.013333,2228 +alps_15128,GROSSER PAL,,46.601111,12.995000,1890 +alps_15129,FREIKOFEL,,46.600556,12.977778,1757 +alps_15130,KLEINER PAL,,46.605833,12.958056,1875 +alps_15131,HOHER TRIEB,,46.596944,13.061667,2199 +alps_15132,PROMOS,,46.601944,13.021667,2195 +alps_15133,CIMA FRUGNONI,,46.677222,12.487500,2561 +alps_15134,PFANNSPITZE,,46.680278,12.502222,2678 +alps_15135,KLEINE KERNIGAT,,46.678611,12.516111,2674 +alps_15136,ROSSKOPF,,46.685278,12.500833,2603 +alps_15137,GROSSE KERNIGAT,,46.675278,12.524444,2689 +alps_15138,LIKOEFELWAND,,46.680278,12.535556,2421 +alps_15139,TSCHARRKNOLLEN,,46.674444,12.535000,2482 +alps_15140,RESNERKNOLLEN,,46.677222,12.546111,2306 +alps_15141,HOHER BOESRING,,46.686667,12.579444,2324 +alps_15142,HERETKOFEL,,46.672222,12.568611,2440 +alps_15143,FILMOORHOEHE,,46.667778,12.533889,2457 +alps_15144,WILDKARLEGG,,46.658611,12.551667,2532 +alps_15145,ROSSKARSPITZE,,46.657222,12.559167,2511 +alps_15146,PORZE,,46.651667,12.569444,2599 +alps_15147,SPITZKOEFELE,,46.675278,12.612778,2314 +alps_15148,HINTERKOFELEGG,,46.679722,12.640278,2117 +alps_15149,HUILAHNER KOGEL,,46.670000,12.636389,2230 +alps_15150,REITERKARSPITZ,,46.661667,12.631389,2422 +alps_15151,STOLLEN,,46.661667,12.619444,2370 +alps_15152,KESSELHOEHE,,46.665278,12.615000,2375 +alps_15153,BAERENBADEGG,,46.656111,12.603889,2431 +alps_15154,CIMA MANZON,,46.652222,12.641389,2330 +alps_15155,SCHULTERHOEHE,,46.672222,12.695000,2424 +alps_15156,GAMSKOFEL,,46.653056,12.650833,2415 +alps_15157,HOCHSPITZ,,46.657222,12.668611,2581 +alps_15158,STEINKARSPITZ,,46.656944,12.691111,2524 +alps_15159,SONNSTEIN,,46.670556,12.745833,2290 +alps_15160,ZWOELFERSPITZ,,46.661667,12.728333,2592 +alps_15161,WEIDENKOPF,,46.657778,12.720833,2405 +alps_15162,TORKARSPITZE,,46.648889,12.716389,2574 +alps_15163,RAUDENSPITZE,,46.647500,12.761667,2507 +alps_15164,WEISSSTEINSPITZE,,46.640278,12.727222,2479 +alps_15165,MITTAGSKOFEL,,46.656667,12.806667,2251 +alps_15166,MARCHKOFEL,,46.653333,12.805556,2299 +alps_15167,WASSERKOEPFE,,46.646944,12.804444,2264 +alps_15168,LETTERSPITZE,,46.642222,12.795556,2463 +alps_15169,STEINWAND,,46.642778,12.792222,2520 +alps_15170,EDIGON,,46.646111,12.777222,2511 +alps_15171,KESSELKOFEL,,46.631944,12.808056,2251 +alps_15172,KREUZEN,,46.628333,12.819167,2169 +alps_15173,KREUZLEITHOEHE,,46.632222,12.831944,2160 +alps_15174,RUNSECK,,46.651389,12.848889,2144 +alps_15175,ELFERHOEHE,,46.647778,12.891389,2356 +alps_15176,GRUBENSPITZ,,46.640000,12.888333,2306 +alps_15177,STALLON,,46.646111,12.845000,2162 +alps_15178,SAEBELSPITZ,,46.640556,12.839444,2159 +alps_15179,JUDENKOPF,,46.629722,12.874167,1826 +alps_15180,PLENGE,,46.652222,12.900833,2373 +alps_15181,GAMSKOFEL,,46.630833,12.900833,2526 +alps_15182,MOOSKOFEL,,46.633611,12.919444,2360 +alps_15183,POLINIK,,46.627222,12.982222,2332 +alps_15184,ELFERSPITZ,,46.625278,12.991389,2254 +alps_15185,ZOLLNERHOEHE,,46.624722,13.064167,1931 +alps_15186,HELM,,46.715000,12.387778,2433 +alps_15187,SATTEL,,46.721389,12.408333,2124 +alps_15188,FUELLHORN,,46.710833,12.400833,2445 +alps_15189,ZENZERSPITZE,,46.707222,12.436944,2393 +alps_15190,HOLLBRUCKER EGG,,46.702500,12.430833,2573 +alps_15191,HOLBRUCKER SPITZE,,46.698889,12.427222,2580 +alps_15192,HOCHGRUBEN,,46.705833,12.410278,2538 +alps_15193,HORNISCHEGG,,46.700556,12.414444,2550 +alps_15194,DEMUT,,46.690000,12.446389,2592 +alps_15195,SCHOENTALHOEHE,,46.689444,12.453889,2635 +alps_15196,WIDERSCHWING,,46.696667,12.456944,2395 +alps_15197,NOECKL,,46.704722,12.509167,2142 +alps_15198,GATTERSPITZE,,46.698056,12.481944,2430 +alps_15199,TSCHARRESPITZE,,46.693333,12.472778,2499 +alps_15200,EISENREICH,,46.687222,12.469444,2665 +alps_15201,SPITZENSTEIN,,46.741667,12.581944,2265 +alps_15202,DORFBERG,,46.727500,12.561944,2115 +alps_15203,OEFENSPITZE,,46.700000,12.540556,2334 +alps_15204,HOCHEGG,,46.693333,12.534722,2477 +alps_15205,BREITENSTEIN,,46.747500,12.606667,2304 +alps_15206,ALPLSPITZE,,46.741111,12.606389,2296 +alps_15207,GOLZENTIPP,,46.734167,12.604167,2317 +alps_15208,PFANNEGG,,46.729167,12.591944,2248 +alps_15209,KOFELSPITZ,,46.741944,12.621389,2185 +alps_15210,TAMERLANHOEHE,,46.746111,12.648056,2376 +alps_15211,EGGENKOFEL,,46.738611,12.678056,2591 +alps_15212,STEINRASTL,,46.726944,12.654167,2184 +alps_15213,UNTERALPL,,46.737500,12.730278,2105 +alps_15214,OBERALPL,,46.740833,12.738611,2235 +alps_15215,EISENSCHUSS,,46.747222,12.748611,2615 +alps_15216,SOLECK,,46.736111,12.792222,2221 +alps_15217,RIEBENKOFEL,,46.729722,12.802222,2386 +alps_15218,GRUBENSPITZ,,46.748889,12.814167,2671 +alps_15219,BOESES WEIBELE,,46.742222,12.811944,2599 +alps_15220,LUMKOFEL,,46.721944,12.843889,2287 +alps_15221,GRUENKOFEL,,46.709444,12.842222,1886 +alps_15222,SCHARTENKOPF,,46.728611,12.897778,2025 +alps_15223,SCHATEZBICHL,,46.724167,12.911944,2090 +alps_15224,HOCHECK,,46.715556,12.986944,1645 +alps_15225,JUKBICHL,,46.708889,13.009444,1889 +alps_15226,TORKOFEL,,46.701944,13.076667,2276 +alps_15227,JAUKENHOEHE,,46.701111,13.063056,2234 +alps_15228,MULTERSPITZE,,46.807222,12.289444,2515 +alps_15229,TOBLACHER PFANNHORN,,46.782778,12.284722,2663 +alps_15230,MARCHGINGELE,,46.780833,12.328056,2545 +alps_15231,BLANKENSTEIN,,46.784167,12.312500,2483 +alps_15232,GANNEKOFEL,,46.787222,12.336111,2488 +alps_15233,GUMRIAUL,,46.776944,12.341389,2526 +alps_15234,HOCHRAST,,46.775000,12.357778,2436 +alps_15235,THURNTALER,,46.774444,12.383333,2408 +alps_15236,RAUCHEGG,,46.800000,12.485000,2594 +alps_15237,WEISSLACHBERG,,46.806111,12.495278,2671 +alps_15238,KUEHEGG,,46.781944,12.470833,2253 +alps_15239,FINSTERKOFEL,,46.808611,12.531389,2633 +alps_15240,RIEDER GAMPEN,,46.801111,12.540833,2390 +alps_15241,SPIELBICHL,,46.786389,12.527500,2072 +alps_15242,GEDEINDLSPITZE,,46.752222,12.644444,2327 +alps_15243,KOSTER BERG,,46.755278,12.612500,2050 +alps_15244,FRAUENTALEGG,,46.761389,12.685556,2235 +alps_15245,KASERKOFEL,,46.761667,12.665000,1906 +alps_15246,FEUER AM BICHL,,46.763056,12.645556,2008 +alps_15247,SCHOENFELDJOCH,,46.749722,12.685000,2218 +alps_15248,KREIDENFEUER,,46.800278,12.766944,1615 +alps_15249,SCHULTER,,46.781389,12.742222,1987 +alps_15250,BISCHOFSMUETZE,,46.778056,12.743611,2431 +alps_15251,OBERWALDERTURM,,46.775556,12.745278,2612 +alps_15252,SPITZKOFEL,,46.772222,12.743333,2717 +alps_15253,KUEHBODENSPITZE,,46.768056,12.737500,2704 +alps_15254,RAUCHBICHL,,46.768333,12.724444,2503 +alps_15255,GAMSALPSPITZE,,46.771389,12.714167,2344 +alps_15256,LAMPERKOEPFE,,46.774444,12.751389,2410 +alps_15257,BOESEGG,,46.763333,12.753056,2495 +alps_15258,GAMSKOFEL,,46.754444,12.731389,2556 +alps_15259,KREUZKOFEL,,46.755833,12.740556,2694 +alps_15260,SANDEGG,,46.755278,12.709722,2336 +alps_15261,WEITTALSPITZE,,46.749444,12.766389,2539 +alps_15262,RAUCHKOFEL,,46.798889,12.782778,1910 +alps_15263,RAUCHBICHL,,46.774444,12.781667,2180 +alps_15264,BLOSSKOFEL,,46.768889,12.783889,2400 +alps_15265,ROTER TURM,,46.771111,12.806111,2700 +alps_15266,LASERZKOPF,,46.770556,12.810278,2718 +alps_15267,SANDSPITZEN,,46.766389,12.811944,2770 +alps_15268,GAMSKOEPFE,,46.760833,12.814722,2695 +alps_15269,WILDE SENDER,,46.756111,12.810278,2728 +alps_15270,SEEKOFEL,,46.756944,12.803333,2738 +alps_15271,LASERZWAND,,46.772500,12.801667,2614 +alps_15272,KEILSPITZEN,,46.768889,12.825556,2739 +alps_15273,GAMSWIESENSPITZEN,,46.766111,12.783611,2486 +alps_15274,SCHWAERZA,,46.751667,12.826667,2493 +alps_15275,LAVANTER KOLBEN,,46.779444,12.840556,1939 +alps_15276,GROSSNITZ KOPF,,46.774722,12.866667,1496 +alps_15277,ADLER WAND,,46.772222,12.838333,2391 +alps_15278,FREIUNG,,46.765556,12.864167,2409 +alps_15279,SCHNEEKLAMM KOPF,,46.758611,12.855556,2642 +alps_15280,HOCHSTADEL,,46.760000,12.857222,2681 +alps_15281,RUDNIG KOFEL,,46.761944,12.872778,2283 +alps_15282,ROSENGARTEN,,46.755278,12.876944,2202 +alps_15283,ZIETENKOPF,,46.805000,12.944444,2483 +alps_15284,SANDFELD KOPF,,46.806944,12.984444,2554 +alps_15285,KESSEL KOGEL,,46.808056,12.978611,2533 +alps_15286,DAMERKOPF,,46.798611,12.963889,2441 +alps_15287,KLEIN HOCHKREUZ,,46.811111,13.073333,2611 +alps_15288,DRISCHAUFEL ECK,,46.808611,13.042222,2577 +alps_15289,TORWAND,,46.800556,13.041111,2562 +alps_15290,GURSGEN TOERL,,46.798889,13.042222,2445 +alps_15291,ROTWIELAND,,46.790833,13.048889,2555 +alps_15292,SCHARNIK,,46.794444,13.044722,2657 +alps_15293,MOKAR SPITZ,,46.781944,13.059722,2305 +alps_15294,DACHSKOFEL,,46.784167,13.053333,2272 +alps_15295,HINTERBERG KOFEL,,46.873611,12.218333,2727 +alps_15296,KASER SPITZE,,46.865000,12.215000,2768 +alps_15297,HOCHSTEIN,,46.819444,12.262222,2464 +alps_15298,PFANN SPITZE,,46.871111,12.305278,2676 +alps_15299,HOCHKREUZ SPITZE,,46.873611,12.275556,2739 +alps_15300,RIEPEN SPITZE,,46.847500,12.296667,2774 +alps_15301,HEIMWALD,,46.843333,12.295833,2760 +alps_15302,ROTLAHNER,,46.841111,12.306944,2743 +alps_15303,GEIL,,46.826389,12.296111,2494 +alps_15304,KAERLS SPITZE,,46.814722,12.283056,2612 +alps_15305,WEISSE SPITZE,,46.871944,12.358056,2962 +alps_15306,GROSS DEGENHORN,,46.868611,12.393056,2946 +alps_15307,STORFEN SPITZE,,46.868333,12.374444,2895 +alps_15308,ROTES GINGGELE,,46.841944,12.370833,2763 +alps_15309,KASCHAS WAND,,46.851389,12.362778,2717 +alps_15310,GRUMAUER BERG,,46.831667,12.369444,2670 +alps_15311,WILDEGG,,46.843889,12.421111,2830 +alps_15312,KUGELWAND,,46.853889,12.408056,2803 +alps_15313,HOCHGRABE,,46.848889,12.421667,2951 +alps_15314,GRABENSTEIN,,46.846667,12.450556,2665 +alps_15315,SAUSPITZE,,46.846389,12.446389,2604 +alps_15316,HOHES HAUS,,46.831667,12.431111,2784 +alps_15317,HOHES KREUZ,,46.833889,12.426667,2746 +alps_15318,KAESEBERG,,46.828056,12.407222,2589 +alps_15319,GABESITTEN,,46.818611,12.423889,2672 +alps_15320,BLITZKOFEL,,46.873889,12.513611,2655 +alps_15321,HOCHEGG,,46.865833,12.515000,2835 +alps_15322,MARCHEGGEN SPITZE,,46.872500,12.461111,2684 +alps_15323,KUGEL SPITZE,,46.867778,12.483889,2796 +alps_15324,REGENSTEIN,,46.860556,12.490556,2891 +alps_15325,BEIM KREUZ,,46.857778,12.501667,2783 +alps_15326,HOCHEGG,,46.851389,12.518611,2720 +alps_15327,ARNHOERNER,,46.845556,12.504722,2799 +alps_15328,RAPPLER,,46.835833,12.497500,2812 +alps_15329,GOELBNER,,46.824167,12.504722,2943 +alps_15330,GUMRIAUL,,46.816111,12.507222,2918 +alps_15331,TEBLEN SPITZE,,46.871111,12.560833,2667 +alps_15332,GREIN SPITZE,,46.865278,12.543056,2747 +alps_15333,BOCKSTEIN,,46.853333,12.535556,2805 +alps_15334,KLEINER OHREN SPITZE,,46.851667,12.539722,2662 +alps_15335,GROSS OHREN SPITZE,,46.850000,12.544722,2697 +alps_15336,ZAR SPITZEN,,46.844444,12.562500,2778 +alps_15337,PATERSKOPF,,46.844722,12.551667,2726 +alps_15338,ROTSTEIN,,46.855833,12.602500,2702 +alps_15339,LAVANTEGG,,46.851389,12.613333,2658 +alps_15340,MUNZAL SPITZE,,46.845833,12.584722,2682 +alps_15341,GELENK SCHARTE,,46.850556,12.590556,2518 +alps_15342,SCHOENBERG SPITZE,,46.845000,12.623889,2640 +alps_15343,HINTER LAVANT SPITZE,,46.840556,12.637500,2546 +alps_15344,VORDER LAVANT SPITZE,,46.840278,12.644444,2519 +alps_15345,TULLEN KOGEL,,46.816944,12.584444,2552 +alps_15346,LERCHKNOTEN,,46.821944,12.608056,2264 +alps_15347,HOCHSTEIN,,46.823889,12.693333,2058 +alps_15348,BOESES WEIBELE,,46.835000,12.650556,2521 +alps_15349,STRONACHKOGEL,,46.844167,12.877222,1831 +alps_15350,HAPPLKOEFEL,,46.813889,12.926389,2348 +alps_15351,EBENECK,,46.827778,12.973889,2266 +alps_15352,LORENZEN KOPF,,46.821111,12.990000,2541 +alps_15353,TAUBICHL,,46.818611,13.019167,2462 +alps_15354,WALLISCHALM KOPF,,46.816111,13.010000,2432 +alps_15355,MORITZ HORN,,46.813056,13.001111,2546 +alps_15356,URCHBICHL,,46.816111,12.968333,2269 +alps_15357,RENNBICHL,,46.848611,13.041389,2474 +alps_15358,GROSS GRIEDEL KOPF,,46.837500,13.050000,2659 +alps_15359,HOHE NASE,,46.832500,13.052778,2630 +alps_15360,WEISSEN KOPF,,46.830556,13.075000,2452 +alps_15361,SANDFELD KOPF,,46.824444,13.071667,2498 +alps_15362,ROTER BEIL,,46.819167,13.027778,2497 +alps_15363,KREUZL HOEHE,,46.818333,13.043611,2624 +alps_15364,HOCHKREUZ,,46.815000,13.074167,2709 +alps_15365,SCHWARZ WAND,,46.816667,13.071111,2683 +alps_15366,GUERSGL,,46.813333,13.043889,2509 +alps_15367,GONHORN,,46.815833,13.082500,2649 +alps_15368,HINTERE HOEHE,,46.926389,12.087222,2505 +alps_15369,RIESERNOCK,,46.929722,12.131944,2932 +alps_15370,TRISTEN NOECKL,,46.925556,12.103056,2465 +alps_15371,GRAUES NOECKL,,46.914444,12.132500,3084 +alps_15372,BARMER SPITZE,,46.914444,12.145278,3354 +alps_15373,WILDGALL,,46.902778,12.135833,3273 +alps_15374,SCHNEEBIGER NOCK,,46.905556,12.084444,3358 +alps_15375,HOCHGALL,,46.910833,12.140000,3436 +alps_15376,FERNER KOEPFL,,46.900833,12.089167,3249 +alps_15377,HOCHFLACH KOFEL,,46.898889,12.124444,3097 +alps_15378,MAGERSTEIN,,46.898056,12.096667,3273 +alps_15379,ROSS HORN,,46.934167,12.178889,3068 +alps_15380,FENNEREGG,,46.933056,12.168056,3123 +alps_15381,BARMER SPITZE,,46.916111,12.152222,3199 +alps_15382,ALMER HORN,,46.907778,12.195000,2985 +alps_15383,GROSS OHREN SPITZE,,46.906944,12.177500,3101 +alps_15384,MITTLER OHREN SPITZE,,46.910000,12.170000,3005 +alps_15385,KLEIN OHREN SPITZE,,46.906944,12.162500,2938 +alps_15386,KLEIN MANDL,,46.899722,12.196111,2591 +alps_15387,GROSS MANDL,,46.902778,12.191111,2818 +alps_15388,DURRER SPITZE,,46.909167,12.149167,3063 +alps_15389,WEITSTRAHL,,46.934722,12.268889,2734 +alps_15390,HUTNER,,46.936389,12.247500,2885 +alps_15391,ROTHORN,,46.936389,12.209444,2648 +alps_15392,HOFER,,46.924444,12.219167,2113 +alps_15393,PFANNHORN,,46.890833,12.242500,2820 +alps_15394,KARLSKOPF,,46.888611,12.236111,2836 +alps_15395,INNER RODELGUNGGE,,46.879722,12.222500,2729 +alps_15396,LANGSCHNEID,,46.893333,12.325556,2688 +alps_15397,KAHORN,,46.887222,12.277778,2692 +alps_15398,GSCHRITT,,46.880000,12.325278,2750 +alps_15399,GAMSBURG,,46.882222,12.324167,2729 +alps_15400,PLANKFELD,,46.884167,12.273889,2664 +alps_15401,GASSER HOERNDLE,,46.935833,12.368056,2612 +alps_15402,KLEIN LEPPLERSKOFEL,,46.892500,12.375278,2469 +alps_15403,AUF DER RAHN,,46.892222,12.392500,2450 +alps_15404,GROSS LEPPLESKOFEL,,46.884167,12.383056,2811 +alps_15405,HOCHLEITEN SPITZE,,46.880000,12.393611,2877 +alps_15406,ROTE SPITZE,,46.876111,12.344444,2956 +alps_15407,PLOESS,,46.909167,12.447778,2229 +alps_15408,BEIL SPITZE,,46.895556,12.437222,2587 +alps_15409,HOCH ALM,,46.882778,12.457778,2797 +alps_15410,HOCHWAND,,46.886389,12.440000,2730 +alps_15411,KARNASE,,46.881944,12.421111,2713 +alps_15412,ROTEGG,,46.880278,12.412778,2796 +alps_15413,WAGENSTEIN,,46.875833,12.400000,2849 +alps_15414,BLOESS EGG,,46.934444,12.557222,1714 +alps_15415,FIRST KOGEL,,46.905000,12.531389,2136 +alps_15416,RUDNIG,,46.899167,12.570000,2429 +alps_15417,OCHSEN BICHL,,46.883889,12.525278,2569 +alps_15418,MAUS KOPF,,46.891944,12.566944,2477 +alps_15419,SCHNEIDEGG,,46.876111,12.557778,2755 +alps_15420,ZILIN KOPF,,46.931389,12.686389,2616 +alps_15421,KREUZ SPITZE,,46.936111,12.668333,2937 +alps_15422,ZUTRUGEN SPITZE,,46.930833,12.674444,2662 +alps_15423,LEIBNIGER TOR,,46.926389,12.656389,2515 +alps_15424,ROTKOFEL,,46.912222,12.690556,2727 +alps_15425,MIRMITZ SCHNEID,,46.934167,12.727778,2640 +alps_15426,LEIBNITZ KOPF,,46.928333,12.716111,2863 +alps_15427,TOERLKOPF,,46.931944,12.717222,2755 +alps_15428,TSCHARNAKT,,46.923889,12.739167,2613 +alps_15429,ALKUSER ROTSPITZE,,46.917500,12.731667,3053 +alps_15430,KLEINE MIRNITZ SPITZE,,46.922500,12.720833,2906 +alps_15431,GROSSE MIRNITZ SPITZE,,46.920000,12.725000,2985 +alps_15432,BARRENEGG,,46.916111,12.718333,2954 +alps_15433,HOHER PRIJAKT,,46.915556,12.712778,3064 +alps_15434,NIEDER PRIJAKT,,46.914444,12.709167,3056 +alps_15435,KLEINER ROTSPITZE,,46.912778,12.737500,2869 +alps_15436,GRUENLEITEN KOEPFE,,46.909167,12.755278,2542 +alps_15437,ROTKOPF,,46.908889,12.742500,2838 +alps_15438,SATTEL KOEPFE,,46.898889,12.762222,2697 +alps_15439,ROTGABELE,,46.892500,12.737778,2696 +alps_15440,SCHLEINITZ,,46.895556,12.749167,2904 +alps_15441,FELDKOPF,,46.928611,12.790000,2717 +alps_15442,MULLETER,,46.915278,12.831389,2918 +alps_15443,GEISSKOFEL,,46.922500,12.808611,2816 +alps_15444,KOBRITZ KOPF,,46.920278,12.817500,2729 +alps_15445,SEICHEN KOPF,,46.916389,12.827500,2888 +alps_15446,MITTEREGG,,46.914444,12.818889,2657 +alps_15447,SCHWARZ KOFEL,,46.909722,12.829167,2534 +alps_15448,GOISELE,,46.885278,12.777778,2433 +alps_15449,TOERLKOPF,,46.916667,12.822222,2821 +alps_15450,TOERL KOPF,,46.917778,12.856944,2532 +alps_15451,KUHLEITEN KOPF,,46.914167,12.848333,2599 +alps_15452,WINKEL KOPF,,46.910000,12.838889,2748 +alps_15453,ROSSBICHL,,46.912500,12.837500,2774 +alps_15454,GARNITZEN,,46.910556,12.855556,2435 +alps_15455,STRASS KOPF,,46.893056,12.842222,2401 +alps_15456,GROSSBODEN,,46.906389,12.835278,2691 +alps_15457,KUGEL KOPF,,46.901389,12.852500,2361 +alps_15458,WETSCHKEN KOPF,,46.936111,12.924167,1983 +alps_15459,MOERTSCHACH BERG,,46.929444,12.923333,1822 +alps_15460,HOHER WIFFEL,,46.928889,12.957778,2524 +alps_15461,GOASCHNIG KOPF,,46.920000,12.941667,2191 +alps_15462,ZELLIN KOPF,,46.894167,12.951389,2597 +alps_15463,GROLLER KOPF,,46.901389,12.945278,2420 +alps_15464,LEITEN KOPF,,46.890278,12.940556,2449 +alps_15465,EBENECK,,46.886389,12.932500,2283 +alps_15466,TOERLECK,,46.935278,13.014722,2559 +alps_15467,KREUZECK KOPF,,46.932778,13.008056,2656 +alps_15468,SCHWARZSEE KOPF,,46.933056,13.004444,2633 +alps_15469,LASCHKITZ KOPF,,46.935833,12.973611,2626 +alps_15470,STELLEN KOPF,,46.932500,12.963611,2590 +alps_15471,FIRSTL,,46.928056,12.986389,2522 +alps_15472,KLENITZEN KOPF,,46.924722,13.005278,2592 +alps_15473,HOCHGRUBEN KOPF,,46.929722,13.010000,2664 +alps_15474,OCHSEN KOPF,,46.925833,13.016944,2536 +alps_15475,MELEN KOPF,,46.918333,13.001389,2597 +alps_15476,KLENITZEN TOERL,,46.920833,13.005833,2450 +alps_15477,KOLM KOEPFL,,46.907778,12.965278,2313 +alps_15478,RUCKEN KOPF,,46.901667,12.972778,2542 +alps_15479,HOCHNASE,,46.898333,12.965833,2560 +alps_15480,MARTISCHNIG SPITZ,,46.905000,12.988333,2364 +alps_15481,BRUNNERLEITEN SPITZE,,46.955833,12.116667,2803 +alps_15482,KLEIN ROTSTEIN,,46.956389,12.138611,3048 +alps_15483,STUTENNOCK,,46.961389,12.100833,2737 +alps_15484,DREIEGG SPITZE,,46.963889,12.131389,3030 +alps_15485,SOSSENECK,,46.964444,12.120556,2950 +alps_15486,GRAUNOCK,,46.970833,12.136111,2961 +alps_15487,NAPFEN,,46.975556,12.120278,2510 +alps_15488,KNUTTENNOCK,,46.973056,12.106389,2730 +alps_15489,GROSS REINHARD,,46.997778,12.126389,2790 +alps_15490,KLEIN REINHARD,,46.995833,12.118333,2631 +alps_15491,TOERL SPITZE,,46.995000,12.200556,3052 +alps_15492,HOERNLE,,46.991944,12.160278,2744 +alps_15493,TOTENKAR SPITZE,,46.980278,12.204722,3133 +alps_15494,ROTENMANN SPITZE,,46.983056,12.202222,3077 +alps_15495,FLEISCHBACH SPITZE,,46.958056,12.162500,3157 +alps_15496,LENKSTEIN,,46.939444,12.166667,3236 +alps_15497,MULLE,,46.950556,12.158333,3162 +alps_15498,WINKEL SPITZE,,46.944167,12.162778,3156 +alps_15499,GROSS ROTSTEIN,,46.953056,12.148056,3147 +alps_15500,RASENEGG,,46.998056,12.268333,2784 +alps_15501,GROSS SCHOBER,,46.996111,12.255833,3054 +alps_15502,REICHENBERGER SPITZE,,46.985278,12.260000,3030 +alps_15503,ROSEN SPITZE,,46.988333,12.254722,3060 +alps_15504,GRAUE WAND,,46.976944,12.263056,2816 +alps_15505,PANARGEN SPITZE,,46.976111,12.221667,3117 +alps_15506,KEESEGG,,46.969167,12.241667,3173 +alps_15507,SANDBICHL,,46.970833,12.217778,2921 +alps_15508,ALPLES SPITZE,,46.957778,12.260833,3149 +alps_15509,TOINIG SPITZE,,46.996389,12.322222,2666 +alps_15510,KRISELACH SPITZE,,46.988333,12.318889,2848 +alps_15511,KLEINBACH KOPF,,46.983056,12.297222,2844 +alps_15512,STAMPFLES KOPF,,46.974722,12.321667,3071 +alps_15513,GOESLES WAND,,46.979167,12.295556,2912 +alps_15514,FINSTERKAR SPITZE,,46.973611,12.305000,3029 +alps_15515,BLINDIS,,46.968889,12.331389,2999 +alps_15516,KESSELPATER,,46.971111,12.303611,2985 +alps_15517,HAINZEN SPITZE,,46.969444,12.294167,2930 +alps_15518,SEE SPITZE,,46.948333,12.273889,3021 +alps_15519,KAUSCHKA HORN,,46.942778,12.284167,2903 +alps_15520,MUHSKOPF,,46.993889,12.352778,2561 +alps_15521,BERGER KOGEL,,46.994444,12.382500,2656 +alps_15522,SEICHE,,46.985833,12.377222,2795 +alps_15523,SCHOBER,,46.980278,12.373056,2882 +alps_15524,SAULE,,46.973611,12.366667,2850 +alps_15525,LASOERLING,,46.975833,12.355278,3098 +alps_15526,BERGER TOERL,,46.972500,12.358333,3050 +alps_15527,STABEREGG,,46.975833,12.376944,2670 +alps_15528,PIZLESHORN,,46.966667,12.339444,2942 +alps_15529,GOSACH KOFEL,,46.956944,12.390000,2536 +alps_15530,WOHL,,46.946944,12.390833,2772 +alps_15531,STEINGRUBEN HOEHE,,46.953333,12.358333,2895 +alps_15532,HOFSPITZE,,46.950000,12.367778,2819 +alps_15533,KASTAL,,46.945000,12.363333,2776 +alps_15534,SCHEIBE,,46.947778,12.378333,2765 +alps_15535,LUENEBISCH HOEHE,,46.963889,12.410833,2567 +alps_15536,LEGERLE,,46.962222,12.446389,2527 +alps_15537,MELSPITZE,,46.947222,12.451389,2641 +alps_15538,GRIFTEN ZUPAL KOGEL,,46.950000,12.443333,2720 +alps_15539,GRITZER RIEGEL,,46.946389,12.404444,2736 +alps_15540,SPEIKBODEN,,46.945833,12.418889,2653 +alps_15541,DONNERSTEIN,,46.947222,12.427500,2725 +alps_15542,REITER BODEN,,46.964722,12.488056,2380 +alps_15543,OBERST KOGEL,,46.959444,12.470556,2570 +alps_15544,TOR KOGEL,,46.953889,12.489722,2730 +alps_15545,GROSSER ZUNIG,,46.955556,12.515556,2776 +alps_15546,KREUZBERG,,46.945833,12.491667,2743 +alps_15547,STANZLING,,46.943889,12.498056,2715 +alps_15548,DEFEREGGER RIEGEL,,46.945000,12.506389,2729 +alps_15549,KLEINER ZUNIG,,46.963333,12.523611,2442 +alps_15550,ROTES KOEGELE,,46.942778,12.524444,2570 +alps_15551,GORNER,,46.986111,12.602778,2702 +alps_15552,BUENKOEFL,,46.983611,12.584167,2419 +alps_15553,ROTEN KOGEL,,46.980000,12.598889,2762 +alps_15554,KEGEL STEIN,,46.967500,12.594722,2418 +alps_15555,NOERDLICHE MOERBETZ SPITZE,,46.987222,12.707778,2912 +alps_15556,SUEDLICHE MOERBETZ SPITZE,,46.983611,12.704444,2834 +alps_15557,SCHOENLEITEN SPITZE,,46.990556,12.690278,2809 +alps_15558,GOLLSPITZE,,46.974444,12.658056,2219 +alps_15559,SPINAL,,46.970000,12.662222,2464 +alps_15560,KREUZEGG,,46.958611,12.666667,2819 +alps_15561,WINKEL EGG,,46.960833,12.674444,2799 +alps_15562,NOERDLICHE WASSERFALL SPITZE,,46.956667,12.679722,2886 +alps_15563,GANOT,,46.958611,12.706667,3102 +alps_15564,SUEDLICHE WASSERFALL SPITZE,,46.953056,12.684722,2878 +alps_15565,KLEIN SCHOBER,,46.945833,12.705278,3119 +alps_15566,HOCH SCHOBER,,46.942500,12.698333,3242 +alps_15567,ROT SPITZEN,,46.939722,12.684722,3096 +alps_15568,KEGELSTEIN,,46.937500,12.648333,2518 +alps_15569,RIEGEL KOPF,,46.940556,12.654444,2713 +alps_15570,TRAMER KOPF,,46.996944,12.741667,2954 +alps_15571,BOESES WEIBL,,46.997222,12.723333,3119 +alps_15572,TSCHADIN HORN,,46.991944,12.709444,3017 +alps_15573,RUIS KOPF,,46.991667,12.726667,3090 +alps_15574,HINTERSEE KAMP,,46.986944,12.768611,2589 +alps_15575,KRISTALL KOPF,,46.985278,12.734167,3160 +alps_15576,ROTER KNOPF,,46.978611,12.739444,3281 +alps_15577,SUEDLICHE TALLEITEN SPITZE,,46.969167,12.741667,3113 +alps_15578,NOERDLICHE TALLEITEN SPITZE,,46.971389,12.741944,3115 +alps_15579,GOESSNITZ KOPF,,46.966944,12.744167,3096 +alps_15580,KLAMMER KOEPFE,,46.959167,12.762222,3155 +alps_15581,GLOEDIS,,46.961111,12.726389,3206 +alps_15582,RALF KOPF,,46.956944,12.714167,3106 +alps_15583,KEES KOPF,,46.950833,12.762778,3081 +alps_15584,DEBANT GRAT,,46.951389,12.710278,3055 +alps_15585,KARLKAMP,,46.996667,12.801111,3114 +alps_15586,BRENTEN KOEPFE,,46.985833,12.790556,3019 +alps_15587,KREUZ KOPF,,46.973056,12.786111,3102 +alps_15588,KLEINER HORNKOPF,,46.964444,12.777222,3194 +alps_15589,GROSSER HORNKOPF,,46.967222,12.778889,3251 +alps_15590,GROSSER FRIEDRICHS KOPF,,46.957778,12.828611,3134 +alps_15591,GEORGS KOPF,,46.953333,12.820000,3090 +alps_15592,PETZECK,,46.948056,12.804722,3283 +alps_15593,KLEIN PETZECK,,46.941944,12.820833,2798 +alps_15594,KRUCKEL KOPF,,46.942222,12.796667,3181 +alps_15595,PERSCHITZ KOPF,,46.939444,12.786944,3125 +alps_15596,FLECKEN KOPF,,46.996111,12.834167,2483 +alps_15597,HIMMELS KOPF,,46.967222,12.838056,2664 +alps_15598,GRASKOPF,,46.968056,12.835556,2620 +alps_15599,OCHSEN KOPF,,46.947222,12.856667,2611 +alps_15600,WEISSER KOPF,,46.951667,12.836111,2925 +alps_15601,HILMERSBERG,,46.985833,12.955556,2658 +alps_15602,KULMER KOGEL,,46.984167,12.906667,1867 +alps_15603,KLUID HOEHE,,46.975556,12.952500,2579 +alps_15604,MOHAR,,46.966389,12.946944,2605 +alps_15605,KOGEL SCHEIBEN KOPF,,46.946111,12.927500,2044 +alps_15606,SANDFELD KOPF,,46.998611,13.005000,2920 +alps_15607,SAUKOPF,,46.996111,13.008889,2786 +alps_15608,ROTE WAND,,46.988889,12.991667,2855 +alps_15609,KRAK KOEPFE,,46.989167,12.988611,2847 +alps_15610,STELLKOPF,,46.989722,12.978333,2852 +alps_15611,ROTWAND ECK,,46.980000,12.996389,2715 +alps_15612,MAGERNIG SPITZ,,46.961111,12.996389,2640 +alps_15613,HIRTEN KOPF,,46.954722,12.997778,2606 +alps_15614,OFENSPITZ,,46.951389,13.005833,2398 +alps_15615,MULLETER SADNIG,,46.950000,12.990833,2569 +alps_15616,SADNIG,,46.941111,12.989167,2745 +alps_15617,FELDKOPF,,46.936944,12.982222,2670 +alps_15618,KLEIN SADNIG,,46.938056,13.000000,2626 +alps_15619,STOISSIS SPITZ,,46.989167,13.032778,2470 +alps_15620,KAMM SPITZ,,46.985000,13.074444,2757 +alps_15621,KLEMITZEN,,46.937222,13.026389,2440 +alps_15622,VODICHNI VRH,,46.304722,13.841667,1617 +alps_15623,MEDVEDOV VRH,,46.303611,13.865556,1173 +alps_15624,STORECH VRH,,46.259722,13.848333,1590 +alps_15625,STUDOR,,46.295278,13.907778,1001 +alps_15626,SHAVINCE,,46.285278,13.951111,862 +alps_15627,RUDNICA,,46.285278,13.920556,946 +alps_15628,CHIBROVICA,,46.259167,13.922500,703 +alps_15629,MALI DRASHKI VRH,,46.362778,13.891667,2129 +alps_15630,MISHELJSKI GLAVA,,46.356111,13.837778,2340 +alps_15631,VELIKI DRASHKI,,46.360000,13.875833,2237 +alps_15632,TOSHC,,46.356667,13.868333,2275 +alps_15633,SHPIK,,46.353056,13.884167,2001 +alps_15634,PREVALSKI STOG,,46.344444,13.838056,2074 +alps_15635,VELIKI STOG,,46.338333,13.845000,2036 +alps_15636,MESNOVA GLAVA,,46.340556,13.891944,1712 +alps_15637,MALI STOG,,46.330833,13.850000,1876 +alps_15638,OGRADI,,46.333889,13.835000,2087 +alps_15639,VELIKI VRH,,46.372500,13.909167,1956 +alps_15640,VELIKI SELISHNIK,,46.366111,13.903333,1956 +alps_15641,VISHEVNIK,,46.358889,13.898333,2047 +alps_15642,PETKOVAC,,46.356944,13.943889,1362 +alps_15643,KRASCE,,46.353056,13.905278,1786 +alps_15644,MISHCHOVEC,,46.339167,13.909167,1482 +alps_15645,JAVOROV VRH,,46.323889,13.951389,1482 +alps_15646,MESNOVEC,,46.337500,13.945000,1536 +alps_15647,RUSHOV VRH,,46.320000,13.938333,1458 +alps_15648,VISOKI ROKAV,,46.435278,13.828611,2646 +alps_15649,KRISHKI ROB,,46.409722,13.802500,2356 +alps_15650,DOLKOVA SHPICA,,46.425556,13.814722,2591 +alps_15651,SHKRLATICA,,46.432778,13.821111,2738 +alps_15652,GOLICHICA,,46.432222,13.770556,2078 +alps_15653,MALI PRISOJNIK,,46.429444,13.772500,2215 +alps_15654,RAKOVA SHPICA,,46.430556,13.816944,2550 +alps_15655,KUCELJ,,46.426667,13.819722,2372 +alps_15656,ROGLJICA,,46.426944,13.812222,2547 +alps_15657,DOVSHKI GAMSOVEC,,46.423056,13.808611,2440 +alps_15658,ZADNJI PRISOJNIK,,46.422500,13.778056,2392 +alps_15659,PLANJA,,46.406389,13.786111,2453 +alps_15660,GOLICHICA,,46.399722,13.771111,2101 +alps_15661,GERMLAJI,,46.401389,13.775000,2051 +alps_15662,KANCELJNI,,46.401944,13.777500,2133 +alps_15663,PREVCHEV STOPL,,46.403889,13.778056,2213 +alps_15664,RAZOR,,46.411944,13.791944,2601 +alps_15665,KRIZH,,46.410000,13.811667,2410 +alps_15666,STENAR,,46.407778,13.819444,2501 +alps_15667,DOVSHKI PIHAVEC,,46.404167,13.811389,2224 +alps_15668,BOVSKI GAMSOVEC,,46.398056,13.812778,2392 +alps_15669,SPLEVTA,,46.395278,13.803056,2215 +alps_15670,VRH NAD KAMNOM,,46.394167,13.810000,2365 +alps_15671,ZAPLANJA,,46.377500,13.828056,2556 +alps_15672,VRH ZELENIC,,46.377778,13.822500,2468 +alps_15673,SFINGA,,46.381667,13.825000,2384 +alps_15674,GORA KOPICA,,46.435278,13.850000,2204 +alps_15675,KALISHCHE,,46.426389,13.842500,1904 +alps_15676,POZHAR,,46.423333,13.891389,1500 +alps_15677,MLINARICA,,46.412778,13.880278,1779 +alps_15678,POZHGANA MLINARICA,,46.406111,13.878889,1872 +alps_15679,CMIR,,46.400278,13.860833,2393 +alps_15680,BEGUNSKI VRH,,46.390556,13.855000,2459 +alps_15681,VRBANOVA SHPICA,,46.396667,13.868889,2295 +alps_15682,MALI RJAVINA,,46.390556,13.876944,2529 +alps_15683,VELIKI RJAVINA,,46.392222,13.881667,2530 +alps_15684,LUKNJA PECH,,46.395833,13.893333,2246 +alps_15685,VELIKI PSIVEC,,46.381389,13.886944,2049 +alps_15686,APNICA,,46.378611,13.877222,2020 +alps_15687,REZH,,46.381944,13.859167,2535 +alps_15688,TRIGLAV,,46.378056,13.836944,2863 +alps_15689,MALI TRIGLAV,,46.376667,13.844444,2732 +alps_15690,MALI PSHIVEC,,46.375833,13.883889,1992 +alps_15691,KREDARICA,,46.380278,13.852222,2539 +alps_15692,CHRNA GORA,,46.435000,13.911667,1384 +alps_15693,PREDELOV VRH,,46.430833,13.901944,1460 +alps_15694,TRCHKOV VRH,,46.423889,13.950278,1362 +alps_15695,BISHCHKOVA,,46.422222,13.922778,1352 +alps_15696,VOSHNI VRH,,46.412500,13.944444,1620 +alps_15697,MECESNOVEC,,46.403889,13.906944,1929 +alps_15698,KLECHICA,,46.397222,13.941944,1888 +alps_15699,DIMNIKI,,46.398333,13.898333,2105 +alps_15700,LIPANJSKI VRH,,46.378611,13.920556,1977 +alps_15701,DEBELA PECH,,46.390000,13.933611,2014 +alps_15702,BRDA,,46.385000,13.925833,2009 +alps_15703,OBLEK,,46.421111,14.008611,1260 +alps_15704,POLICE,,46.401389,14.013611,1151 +alps_15705,KRNIVOVICA,,46.403611,13.964167,1684 +alps_15706,BRATOVLJA PECH,,46.397778,13.982778,1490 +alps_15707,PLAVSKI VRH,,46.421389,14.049444,1299 +alps_15708,VISOKI VRH,,46.496111,13.888889,1830 +alps_15709,GOZDICH,,46.490556,13.894444,1629 +alps_15710,GLAVA,,46.471111,13.843056,1226 +alps_15711,VRSHICH,,46.464444,13.847500,1697 +alps_15712,VRTASHKI VRH,,46.455000,13.888333,1898 +alps_15713,SLEMENA,,46.451667,13.872222,2075 +alps_15714,KUKOVA SHPICA,,46.447500,13.855000,2417 +alps_15715,DOVSHKI KRIZH,,46.441111,13.843056,2538 +alps_15716,JURCHOVA PECH,,46.492500,13.908611,1505 +alps_15717,PLANICA,,46.483611,13.942778,1505 +alps_15718,BOROVJE,,46.480556,13.951944,1474 +alps_15719,JEREBIKOVEC,,46.443056,13.956389,1593 +alps_15720,BAEREN KOGEL,,46.496667,13.970556,1979 +alps_15721,ROSEN KOGEL,,46.481111,14.007222,1776 +alps_15722,FRAUEN KOGEL,,46.487500,13.994444,1892 +alps_15723,BELA PECH,,46.475833,13.981389,1468 +alps_15724,MRZLE KONTE,,46.440556,13.979444,1387 +alps_15725,KAHL KOGEL,,46.491111,14.055000,1834 +alps_15726,HAHN KOGEL,,46.485000,14.025000,1754 +alps_15727,CHRNI VRH,,46.463333,14.076111,1365 +alps_15728,SPANJ VRH,,46.459722,14.070278,1334 +alps_15729,SNEZHAN,,46.457500,14.027778,1084 +alps_15730,MIRCA,,46.445000,14.054722,1026 +alps_15731,ROSSKOFEL,,46.550278,13.240556,2240 +alps_15732,MADRITSCHENKOPF,,46.557222,13.261389,1842 +alps_15733,AUERNIG,,46.558056,13.286944,1863 +alps_15734,GARNITZENBERG,,46.559722,13.298611,1951 +alps_15735,KRONALM,,46.551944,13.322222,1832 +alps_15736,SAGRAN,,46.558611,13.462500,1931 +alps_15737,SCHOENWIPFEL,,46.546667,13.520278,1813 +alps_15738,KAPINBERG,,46.539444,13.569722,1735 +alps_15739,KAPIN,,46.542778,13.612500,1530 +alps_15740,GOERIACHER BERG,,46.545556,13.593333,1693 +alps_15741,TSCHABIN,,46.523056,13.673611,1273 +alps_15742,HOMITSCH,,46.522778,13.700278,1301 +alps_15743,RAWIKAUTZ,,46.514444,13.767500,1621 +alps_15744,DREILAENDERECK,,46.522778,13.714722,1508 +alps_15745,HAHNENWIPFEL,,46.518333,13.733889,1552 +alps_15746,BLEKOVA,,46.515000,13.829722,1746 +alps_15747,WOSCHZA,,46.510000,13.818611,1737 +alps_15748,STEINWIPFEL,,46.510556,13.785000,1650 +alps_15749,STEINBERG,,46.517222,13.776944,1655 +alps_15750,KANZIANI BERG,,46.551944,13.875833,795 +alps_15751,MALLESTEIGER MITTAGS KOGEL,,46.522500,13.882500,1823 +alps_15752,MURNOUC,,46.518056,13.882222,1867 +alps_15753,GRAJSH CHICA,,46.516389,13.893333,1760 +alps_15754,TECHANTINGER MITTAGS KOGEL,,46.515000,13.861111,1931 +alps_15755,LEPI VRH,,46.511667,13.865000,1928 +alps_15756,BASHICA,,46.502778,13.893889,1816 +alps_15757,SREDNJI VRH,,46.507222,13.853889,1830 +alps_15758,SCHWARZ KOGEL,,46.519722,13.895556,1842 +alps_15759,JEPICA,,46.513611,13.928333,1611 +alps_15760,MITTAG KOGEL,,46.506667,13.952778,2145 +alps_15761,FERLACHER SPITZE,,46.521111,13.964722,1742 +alps_15762,HUHNER KOGEL,,46.500278,13.961667,2034 +alps_15763,KAPELLENBERG,,46.512500,14.078333,1226 +alps_15764,DUERRKOGEL,,46.513056,14.041667,1300 +alps_15765,TURMALPE,,46.500833,14.076667,1168 +alps_15766,ST GERTRUD,,46.558889,14.038889,515 +alps_15767,NOEBLINGER HOEHE,,46.622222,13.090556,1760 +alps_15768,LEITENKOGEL,,46.605000,13.126111,1845 +alps_15769,WAIDEGGER HOEHE,,46.608611,13.112778,1961 +alps_15770,FINDENIGKOFEL,,46.595833,13.101389,2016 +alps_15771,KIRCHBACHER WIPFEL,,46.606389,13.172222,1880 +alps_15772,HOCHWIPFEL,,46.594444,13.176667,2195 +alps_15773,WINDSCHAUFEL,,46.595278,13.186111,2095 +alps_15774,SCHULTER,,46.589722,13.169444,2091 +alps_15775,RINGMAUER,,46.583333,13.171944,2018 +alps_15776,STRANIGER KOPF,,46.590556,13.151111,1843 +alps_15777,ZOTTACHKOPF,,46.572778,13.202222,2046 +alps_15778,ZWEIKOFEL,,46.582778,13.222222,2013 +alps_15779,ZUCKERHUETL,,46.580833,13.221389,2059 +alps_15780,ALPENKOFEL,,46.573889,13.219722,2040 +alps_15781,TROGKOFEL,,46.570556,13.216944,2280 +alps_15782,REPPWAND,,46.581667,13.301111,1865 +alps_15783,KAMMLEITEN,,46.575278,13.294167,1998 +alps_15784,GARTNERKOFEL,,46.571389,13.304167,2195 +alps_15785,PLANJA,,46.578333,13.376111,1720 +alps_15786,ZIELKOFEL,,46.569722,13.345278,1825 +alps_15787,POLUDNIG,,46.571944,13.410278,1999 +alps_15788,EGGER KANZEL,,46.586389,13.396111,1595 +alps_15789,STARHAND,,46.566111,13.469167,1965 +alps_15790,OISTERNIG,,46.565556,13.500000,2052 +alps_15791,BADSTUBEN,,46.622222,13.594167,1369 +alps_15792,KILZERBERG,,46.620278,13.635556,1331 +alps_15793,BREITER KOPF,,46.605278,13.638056,1447 +alps_15794,ZWOELFERNOCK,,46.601111,13.690278,2049 +alps_15795,ZEHNERNOCK,,46.597222,13.697778,1956 +alps_15796,ELFERNOCK,,46.605000,13.689167,2031 +alps_15797,GANGES,,46.601389,13.653056,1732 +alps_15798,LUDWIG WALTER HOHE,,46.603333,13.671111,2166 +alps_15799,WABENRIEDEL,,46.589444,13.750833,1443 +alps_15800,GEKLOBENE WAND,,46.580000,13.783056,1043 +alps_15801,GRASCHELITZEN,,46.576944,13.825278,728 +alps_15802,TABOR,,46.581667,13.940000,724 +alps_15803,PETELIN,,46.573611,13.985000,802 +alps_15804,BLEIBERG,,46.574444,13.963611,772 +alps_15805,ST¾KATHREIN,,46.585833,14.075000,772 +alps_15806,REISSKOFEL,,46.685833,13.147222,2371 +alps_15807,HOCHWATER HOEHE,,46.663333,13.215278,1688 +alps_15808,GROSSBODEN,,46.680556,13.341389,1806 +alps_15809,GOLZ,,46.671389,13.365833,2004 +alps_15810,LAKA,,46.686111,13.401389,1852 +alps_15811,SPITZEGEL,,46.655000,13.410556,2119 +alps_15812,KRIEBHOEHE,,46.656667,13.424722,2065 +alps_15813,VELLACHER EGEL,,46.656944,13.433056,2108 +alps_15814,KOK,,46.660278,13.466389,1886 +alps_15815,GRASLITZEN,,46.654167,13.468889,2044 +alps_15816,TSCHEKELNOCK,,46.651667,13.537500,1892 +alps_15817,SPARBERWIPFEL,,46.656667,13.580000,1555 +alps_15818,WITZALA,,46.635556,13.568333,1430 +alps_15819,ALTENBERG,,46.682500,13.616111,1288 +alps_15820,KABESNOCK,,46.648611,13.601667,1820 +alps_15821,ZEBERNOCK,,46.646389,13.621111,1555 +alps_15822,SATTLERNOCK,,46.639444,13.630833,1583 +alps_15823,WEISSOFEN,,46.634167,13.585000,1496 +alps_15824,POELLANER HOEHE,,46.680833,13.648611,994 +alps_15825,MARDERBOEDEN,,46.666389,13.686944,1147 +alps_15826,KELLERBERG,,46.657778,13.694444,1167 +alps_15827,MITTAGSNOCK,,46.637778,13.654444,1558 +alps_15828,HACHELNOCK,,46.638611,13.675833,1442 +alps_15829,LAHNERNOCK,,46.636944,13.696389,1514 +alps_15830,SPITZECK,,46.639444,13.751944,1332 +alps_15831,MITTAGSKOFEL,,46.636667,13.742500,1426 +alps_15832,SCHWANDNOCK,,46.636111,13.708611,1517 +alps_15833,UEBERING,,46.682778,13.782222,1523 +alps_15834,OSWALDIBERG,,46.648889,13.854444,963 +alps_15835,KUMITZBERG,,46.634444,13.868333,658 +alps_15836,KANZELHOEHE,,46.676944,13.902222,1524 +alps_15837,BOCKLEITEN,,46.676389,14.029444,1022 +alps_15838,TAUBENBUEHEL,,46.660833,14.055000,1069 +alps_15839,LAASER KOFEL,,46.660278,14.035556,1014 +alps_15840,MITTERKOFEL,,46.700833,13.084722,2247 +alps_15841,SPITZKOFEL,,46.698333,13.094722,2223 +alps_15842,DONNERSPITZ,,46.693333,13.133889,1704 +alps_15843,TRISTSTALKOFEL,,46.690278,13.168056,2094 +alps_15844,SATTELNOCK,,46.693889,13.188889,2033 +alps_15845,GRAFENWEGERHOEHE,,46.711944,13.229444,1441 +alps_15846,WAISACHER HOEHE,,46.716667,13.209167,1363 +alps_15847,MITTAGSNOCK,,46.690556,13.288333,1473 +alps_15848,PLENTELITZ,,46.728333,13.308889,1674 +alps_15849,HOCHTRATEN,,46.730000,13.297222,1646 +alps_15850,FELGENBICHL,,46.736389,13.357778,1797 +alps_15851,HUEHNERSPITZ,,46.734444,13.379167,2002 +alps_15852,AUERKOPF,,46.722222,13.340833,1636 +alps_15853,LATSCHUR,,46.738333,13.396667,2236 +alps_15854,ALMSPITZ,,46.733611,13.401389,2180 +alps_15855,ECKWAND,,46.735000,13.415000,2221 +alps_15856,STAFF,,46.735556,13.438333,2217 +alps_15857,KOPASNOCK,,46.729167,13.423056,2087 +alps_15858,ZLANNOCK,,46.688889,13.451111,1487 +alps_15859,SPITZNOCK,,46.711111,13.506667,1533 +alps_15860,RIEDNOCK,,46.703611,13.570278,1537 +alps_15861,GOLSERNOCK,,46.710000,13.546389,1561 +alps_15862,KOLM,,46.747500,13.651111,967 +alps_15863,LIERZBERGER ALPENSPITZ,,46.749167,13.727222,2018 +alps_15864,LAHNERNOCK,,46.736944,13.730000,1861 +alps_15865,PALNOCK,,46.713889,13.739722,1901 +alps_15866,AMBER ALM,,46.697500,13.769167,1832 +alps_15867,VORDERER BUCHHOLZ,,46.700000,13.866944,1655 +alps_15868,GERLITZEN,,46.694444,13.914722,1909 +alps_15869,GRILZWIPFEL,,46.719167,13.975000,1565 +alps_15870,GALGENBUEHEL,,46.712778,14.072500,630 +alps_15871,KRAHKOGEL,,46.720556,14.063056,790 +alps_15872,GRAFISCHE TRISTEN,,46.805556,13.137222,2553 +alps_15873,RENNSFELD,,46.808056,13.095556,2418 +alps_15874,SENSEN SPITZ,,46.797222,13.142222,2480 +alps_15875,HOCHTRISTEN,,46.795278,13.135833,2536 +alps_15876,KNOTEN,,46.781111,13.112778,2214 +alps_15877,GAMSECK,,46.809444,13.151667,2201 +alps_15878,GRUBACH KOGEL,,46.804444,13.147778,2394 +alps_15879,DOLZER,,46.787778,13.203333,2172 +alps_15880,NASSFELD RIEGEL,,46.784444,13.146944,2238 +alps_15881,STAGOR,,46.786389,13.266667,2289 +alps_15882,MOSCHEGG STAND,,46.802778,13.265000,2243 +alps_15883,SPEIKBICHL,,46.791667,13.270278,2285 +alps_15884,GAUGEN,,46.786667,13.209722,2195 +alps_15885,KREUZKOFEL,,46.777500,13.224167,1842 +alps_15886,HOHER STAND,,46.790278,13.300000,2086 +alps_15887,PLATTECK SPITZ,,46.788056,13.284444,2170 +alps_15888,WEISSWANDE,,46.790278,13.397222,1643 +alps_15889,ALPENBUEHEL,,46.783611,13.416111,1770 +alps_15890,KREUZBUEHEL,,46.751944,13.397500,2060 +alps_15891,KUHSTAND,,46.753333,13.404444,2046 +alps_15892,GOLDECK,,46.758611,13.459444,2142 +alps_15893,MARTENNOCK,,46.757222,13.475833,2039 +alps_15894,HOCHGOSCH,,46.790833,13.555000,876 +alps_15895,KREUZSTEIN,,46.789444,13.543333,833 +alps_15896,JUFEN,,46.810000,13.635833,1802 +alps_15897,GEISSRIEGEL,,46.753611,13.631667,988 +alps_15898,BODENOCK,,46.768056,13.700000,2006 +alps_15899,TUERNDL,,46.765833,13.710833,2023 +alps_15900,MIRNOCK,,46.758889,13.715556,2110 +alps_15901,RINDERNOCK,,46.750278,13.725000,2024 +alps_15902,KAISERBURG,,46.784167,13.829167,2055 +alps_15903,STROHSACK,,46.789722,13.801667,1908 +alps_15904,KOLMNOCK,,46.794167,13.774722,1845 +alps_15905,WOELLANER NOCK,,46.776667,13.829722,2145 +alps_15906,LICHTEBEN,,46.780278,13.858333,1968 +alps_15907,PFAFFENECK,,46.778611,13.835556,2046 +alps_15908,BUCHSKOPF,,46.761111,13.875833,1865 +alps_15909,VORDERER WOELLANER NOCK,,46.768611,13.834722,2090 +alps_15910,DUERRER BAUM,,46.763333,13.916667,1771 +alps_15911,HOFERALMKOPF,,46.753889,13.946111,1631 +alps_15912,KNITTEL,,46.805000,13.980833,1705 +alps_15913,APLITSCHBERG,,46.800000,14.053056,1222 +alps_15914,DRAGELSBERG,,46.758333,14.051667,971 +alps_15915,STRIEDEN KOPF,,46.868333,13.113333,2749 +alps_15916,SCHEUCHEN KOPF,,46.864444,13.110000,2715 +alps_15917,GOESSNITZ TOERL,,46.851111,13.100000,2432 +alps_15918,SCHWARZRIESEN KOPF,,46.845278,13.104722,2631 +alps_15919,DECHANT,,46.843611,13.131389,2609 +alps_15920,KREUZECK,,46.840278,13.111944,2701 +alps_15921,PLATTACH KOPF,,46.817222,13.119444,2502 +alps_15922,ROTHORN,,46.828333,13.108333,2621 +alps_15923,HOCHKREUZ,,46.830278,13.101667,2565 +alps_15924,GLENK TOERL,,46.833611,13.109722,2457 +alps_15925,SCHWARZSTEIN KOPF,,46.821667,13.118056,2515 +alps_15926,SEEBACH HOEHE,,46.841667,13.162222,2479 +alps_15927,SCHRONECK,,46.838056,13.203333,2549 +alps_15928,KARLKOPF,,46.836111,13.196667,2502 +alps_15929,SEEBACH TOERL,,46.836667,13.166389,2317 +alps_15930,ANNARUHE,,46.830278,13.188056,2508 +alps_15931,STAWIPFEL,,46.826111,13.187222,2514 +alps_15932,PUTZEN,,46.813056,13.199444,2330 +alps_15933,SCHANITZEN TOERL,,46.813889,13.194444,2188 +alps_15934,BLASKOPF,,46.856667,13.255833,2090 +alps_15935,POLENIG,,46.849444,13.232500,2344 +alps_15936,SALZKOFEL,,46.846944,13.261389,2498 +alps_15937,HOHER BOLZ,,46.845000,13.237500,2421 +alps_15938,GEIER SPITZ,,46.839444,13.230556,2403 +alps_15939,KLEINER KREUZECK,,46.836111,13.224167,2505 +alps_15940,GRAKOFEL,,46.832778,13.228889,2551 +alps_15941,HOCHBICHL,,46.827222,13.221389,2275 +alps_15942,RASTL,,46.817222,13.270000,2165 +alps_15943,KARLHOEHE,,46.818056,13.253889,2232 +alps_15944,LENKEN SPITZ,,46.813056,13.258611,2298 +alps_15945,KLEIN SALZKOFEL,,46.845278,13.281667,2222 +alps_15946,ECKBERG,,46.846389,13.472778,1176 +alps_15947,TSCHIERNOCK,,46.864444,13.565833,2088 +alps_15948,TSCHIERWEGER NOCK,,46.841111,13.582222,2010 +alps_15949,RABENKOFEL,,46.862222,13.640000,2059 +alps_15950,HOCHPALFENNOCK,,46.851111,13.584167,2099 +alps_15951,KAMPLNOCK,,46.851111,13.613056,2101 +alps_15952,MILLSTAETTER ALPE,,46.839167,13.624444,2091 +alps_15953,LAMMESDORFER BERG,,46.825278,13.637222,2063 +alps_15954,LANGNOCK,,46.873611,13.656389,2109 +alps_15955,SCHWARZWALDER WIPFEL,,46.850278,13.668333,1781 +alps_15956,SPITZECK,,46.849167,13.746389,1913 +alps_15957,PRIEDROEF,,46.819722,13.742222,1963 +alps_15958,WIESERNOCK,,46.836667,13.742778,1974 +alps_15959,FALKERTKOEPFL,,46.867778,13.817500,2197 +alps_15960,FALKERT,,46.860278,13.817500,2308 +alps_15961,RODRESNOCK,,46.852778,13.817500,2310 +alps_15962,FADENBERG,,46.861389,13.862778,1934 +alps_15963,HOELLENBERG,,46.830556,13.891667,1772 +alps_15964,RONACHRIEGEL,,46.829444,13.918889,1659 +alps_15965,AUF DER SCHOEN,,46.838333,13.928333,1690 +alps_15966,KEGEL,,46.862500,13.987500,1745 +alps_15967,KRUCKENSPITZE,,46.837222,13.964722,1886 +alps_15968,JURI ECKEN,,46.844444,14.038056,1324 +alps_15969,GRILLENBERG,,46.826389,14.043889,1087 +alps_15970,MITTAGS SPITZ,,46.901389,13.110556,2433 +alps_15971,STRUGEN KOPF,,46.895833,13.108056,2420 +alps_15972,MOELL KOPF,,46.889722,13.103611,2397 +alps_15973,SCHNEESTELL KOPF,,46.879167,13.140556,2688 +alps_15974,SAUKOPF,,46.881389,13.106944,2421 +alps_15975,STRIDEN,,46.875833,13.112500,2682 +alps_15976,RAUCHKOPF,,46.910278,13.164167,2177 +alps_15977,SCHOENECK,,46.896667,13.198889,2179 +alps_15978,BOESE NASE,,46.893056,13.195000,2297 +alps_15979,POLINIK,,46.895000,13.158056,2784 +alps_15980,GAMSKAR SPITZ,,46.892778,13.169167,2580 +alps_15981,KEHLLUCKERL KOPF,,46.885000,13.156944,2635 +alps_15982,TEUCHL SPITZ,,46.886389,13.211111,2320 +alps_15983,DORNECK,,46.932500,13.306389,2658 +alps_15984,ARLKOPF,,46.928889,13.300278,2495 +alps_15985,KAMPLECK,,46.925556,13.295278,2523 +alps_15986,DANIELS BERG,,46.887778,13.282778,966 +alps_15987,GRUBEL WAND,,46.929167,13.344722,2517 +alps_15988,RIEDBOCK,,46.928611,13.356667,2822 +alps_15989,RADLECK,,46.931667,13.370833,2802 +alps_15990,KAMMWAND,,46.919722,13.353056,2753 +alps_15991,HOCHKEDL,,46.909444,13.377222,2558 +alps_15992,SCHOBER SPITZE,,46.911111,13.341111,2573 +alps_15993,KLEINE LEIER,,46.910000,13.381667,2630 +alps_15994,HOHE LEIER,,46.912500,13.390556,2774 +alps_15995,HOCHECK,,46.889722,13.380278,2432 +alps_15996,PLAN KOGEL,,46.875000,13.368889,1791 +alps_15997,GURGLITZEN,,46.885556,13.393889,2352 +alps_15998,STAFFEN HOEHE,,46.901667,13.367500,2336 +alps_16000,DONNERSCHLAG SPITZE,,46.919722,13.408611,2386 +alps_16001,BOCKSTEIN,,46.920278,13.428889,2028 +alps_16002,KOENIGSANGER SPITZE,,46.908333,13.407222,2639 +alps_16003,ROSS KOPF,,46.901667,13.415556,2573 +alps_16004,GMEINECK,,46.894722,13.428889,2592 +alps_16005,STODER,,46.895000,13.445278,2433 +alps_16006,GEMEINDEWALD,,46.907778,13.605278,1644 +alps_16007,STILECK,,46.874722,13.640556,2179 +alps_16008,SAUNOCK,,46.895556,13.693611,2214 +alps_16009,GROSSLEOBENECK,,46.886389,13.671667,2196 +alps_16010,PLATTNOCK,,46.898333,13.727222,2316 +alps_16011,PFANNOCK,,46.887778,13.755278,2254 +alps_16012,ROSENNOCK,,46.876944,13.713056,2440 +alps_16013,KLEINER ROSENNOCK,,46.882778,13.720000,2361 +alps_16014,MALLNOCK,,46.876389,13.771111,2226 +alps_16015,STANGNOCK,,46.934722,13.795278,2316 +alps_16016,GREGERLNOCK,,46.918333,13.816667,2296 +alps_16017,SIMMERLECK,,46.911389,13.829167,2079 +alps_16018,KOFLERNOCK,,46.909167,13.795000,2277 +alps_16019,SCHIESTELNOCK,,46.893333,13.797778,2206 +alps_16020,KLOMNOCK,,46.881389,13.788889,2331 +alps_16021,SCHOBERRIEGEL,,46.910556,13.895000,2208 +alps_16022,KORNOCK,,46.915556,13.856944,2193 +alps_16023,RINSENNOCK,,46.908889,13.851389,2334 +alps_16024,SPIELRIEGEL,,46.924722,13.948889,2176 +alps_16025,LATTERSTEIGHOEHE,,46.918889,13.948056,2264 +alps_16026,BRETTHOEHE,,46.912222,13.936944,2320 +alps_16027,HOAZHOEHE,,46.910556,13.925833,2319 +alps_16028,KASERHOEHE,,46.911944,13.918611,2318 +alps_16029,GRUFT,,46.905278,13.902500,2232 +alps_16030,TORER,,46.904444,13.943889,2205 +alps_16031,GROSSER SPEIKKOFEL,,46.893889,13.940556,2270 +alps_16032,HIRNKOPF,,46.932500,14.011944,1840 +alps_16033,KALTEBEN,,46.916944,13.985000,2140 +alps_16034,KALTEBEN,,46.917222,13.962778,2145 +alps_16035,KUSTER,,46.930833,14.039167,1669 +alps_16036,SCHLEICHKOGEL,,46.895833,14.058889,1502 +alps_16037,ZEDELING,,46.995833,13.098889,2330 +alps_16038,ASTROM SPITZ,,46.990833,13.083333,2811 +alps_16039,STRAKOEPFE,,46.985278,13.106667,2699 +alps_16040,KRIPPEN HOEHE,,46.980556,13.129444,2478 +alps_16041,KALTE WAND,,46.989444,13.091111,2746 +alps_16042,BOESECK,,46.983056,13.102778,2842 +alps_16043,SCHWAN SPITZ,,46.974722,13.093333,2686 +alps_16044,OSCHENIK TUERM,,46.972500,13.087500,2389 +alps_16045,TOERL KOPF,,46.976944,13.133611,2517 +alps_16046,RESSECK,,46.967778,13.128889,2498 +alps_16047,TOERL KOPF,,46.996389,13.204444,2446 +alps_16048,LASSACHER,,46.966111,13.156111,2166 +alps_16049,GROSS FELDSPITZ,,46.998611,13.269722,2828 +alps_16050,KLEIN FELDSPITZ,,46.997222,13.261667,2788 +alps_16051,OCHENLADIN SPITZ,,46.979167,13.268611,2778 +alps_16052,LAWOGGE,,46.973611,13.238611,2701 +alps_16053,ZAGUTNIG SPITZ,,46.972222,13.243889,2731 +alps_16054,OBERER SICKER KOPF,,46.971389,13.231944,2566 +alps_16055,UNTERER SICKEL KOPF,,46.968611,13.224444,2360 +alps_16056,LABIGES KOEPFL,,46.945556,13.243611,1989 +alps_16057,WABNIG SPITZ,,46.976667,13.256667,2773 +alps_16058,SAEULECK,,46.996944,13.287778,3086 +alps_16059,EBENECK,,46.980556,13.300000,2858 +alps_16060,DOESNER SPITZE,,46.981944,13.293611,2899 +alps_16061,GROSS GOESSPITZ,,46.990833,13.294167,2933 +alps_16062,MALLNITZER SCHARTE,,46.985833,13.293611,2673 +alps_16063,PFAFFENBERGER NOCKEN,,46.973333,13.308611,2763 +alps_16064,TRISTEN SPITZ,,46.963889,13.309444,2930 +alps_16065,LACKEN SPITZ,,46.960833,13.298056,2705 +alps_16066,KESSELECK,,46.958056,13.291944,2759 +alps_16067,RIEKEN KOPF,,46.958333,13.324167,2896 +alps_16068,GRONECK,,46.951389,13.271111,2691 +alps_16069,GAMOLNIG SPITZ,,46.944167,13.322500,2788 +alps_16070,JOCHECK,,46.937222,13.313333,2692 +alps_16071,WINTERLEITEN,,46.995556,13.333889,2518 +alps_16072,LARCHRIEGEL,,46.969167,13.366944,2475 +alps_16073,SCHWALBEN HOEHE,,46.971389,13.346389,2356 +alps_16074,RIEKENER SONNBLICK,,46.955556,13.334722,2876 +alps_16075,ZAUBERNOCK,,46.957500,13.351667,2944 +alps_16076,KLEINER REISSECK,,46.948611,13.375278,2924 +alps_16077,GROSSER STAPNIK,,46.952500,13.355000,2882 +alps_16078,REISSECK,,46.947222,13.365000,2965 +alps_16079,HOEHEN NOCK,,46.996667,13.421389,2124 +alps_16080,TANDLAUGE,,46.961389,13.425556,2415 +alps_16081,TANDL SPITZE,,46.956111,13.415278,2633 +alps_16082,HOHENKAR ECK,,46.952500,13.401111,2544 +alps_16083,ZINKEN SPITZE,,46.941667,13.396667,2430 +alps_16084,STUBECK,,46.993056,13.536944,2370 +alps_16085,BURGSTALLBERG,,46.997222,13.588333,1938 +alps_16086,SPEIERECK,,46.989167,13.664167,2087 +alps_16087,DOERERKOEPFL,,46.964722,13.698333,2056 +alps_16088,BODENLUCKEN,,46.940278,13.663611,2030 +alps_16089,HOHE PRESSING,,46.937500,13.693611,2370 +alps_16090,BAERENAUNOCK,,46.940556,13.706389,2292 +alps_16091,KAMERITZHOEHE,,46.993889,13.714722,2167 +alps_16092,GAIPAHOEHE,,46.990556,13.728889,2192 +alps_16093,ZECHNERHOEHE,,46.993611,13.745000,2188 +alps_16094,GRUENLEITENNOCK,,46.954444,13.752222,2160 +alps_16095,KASPERKOPF,,46.953889,13.714722,2129 +alps_16096,EISENTALHOEHE,,46.942222,13.762222,2180 +alps_16097,PEITLERNOCK,,46.937778,13.718333,2244 +alps_16098,OCHSENRIEGEL,,46.986389,13.796944,2282 +alps_16099,SCHILCHERNOCK,,46.990278,13.791667,2270 +alps_16100,BAERENNOCK,,46.994444,13.801389,2234 +alps_16101,ROSANINHOEHE,,46.971944,13.804444,2280 +alps_16102,SAUEREGGNOCK,,46.961944,13.774444,2240 +alps_16103,REISSECK,,46.966667,13.833333,2305 +alps_16104,FRAUENNOCK,,46.958889,13.822222,2270 +alps_16105,MUHLBACHER NOCK,,46.950833,13.805556,2273 +alps_16106,SEENOCK,,46.952500,13.775278,2260 +alps_16107,FRIESENHALSHOEHE,,46.948889,13.776944,2246 +alps_16108,KOENIGSTUHL,,46.943611,13.785556,2336 +alps_16109,KILNPREIN,,46.985833,13.843333,2408 +alps_16110,VORDERHUETTENECK,,46.995833,13.865556,2204 +alps_16111,HOCHALMKOEPFL,,46.964444,13.844722,2079 +alps_16112,MARKTKOEPFL,,46.939722,13.872500,1845 +alps_16113,GRUENBUEHEL,,46.998056,13.949167,2172 +alps_16114,SCHOBER,,46.977222,13.920556,1822 +alps_16115,WEISSWAENDE,,46.959722,13.951389,1996 +alps_16116,EISENHUT,,46.951944,13.928889,2441 +alps_16117,WINTERTALENOCK,,46.942222,13.952500,2394 +alps_16118,DAMMEGGERNOCK,,46.985833,13.965833,2112 +alps_16119,SUMPERHOEHE,,46.977222,14.019444,1560 +alps_16120,BOCKBUEHEL,,46.955278,14.011389,1678 +alps_16121,SONNTAGSBUEHEL,,46.989167,13.985833,1929 +alps_16122,LAGUNERHOEHE,,46.990833,14.055000,1895 +alps_16123,LICHTBERG,,46.971667,14.081667,1930 +alps_16124,PRAEGARTERKOEPFE,,46.965556,14.060278,1778 +alps_16125,DORFERECKEN,,46.938611,14.073333,1726 +alps_16126,VELIKA ZVOH,,46.308611,14.541944,1973 +alps_16127,KOSHUTNA,,46.310278,14.558333,1975 +alps_16128,GRADISHCHE,,46.305556,14.528333,1696 +alps_16129,KRVAVEC,,46.299444,14.537500,1853 +alps_16130,KRZISHE,,46.289167,14.544167,1654 +alps_16131,RECELNIK,,46.250833,14.537778,518 +alps_16132,TOLSTI VRH,,46.348333,14.363611,1715 +alps_16133,POTOSHKA GORA,,46.315556,14.455000,1274 +alps_16134,VELIKI VRH,,46.326944,14.412500,994 +alps_16135,SREDNJI VRH,,46.339167,14.439722,1854 +alps_16136,CJANOVCA,,46.335833,14.441944,1821 +alps_16137,MALI GRINTAVEC,,46.346389,14.428056,1810 +alps_16138,STORZHICH,,46.350000,14.405278,2132 +alps_16139,KOZJI VRH,,46.364444,14.446667,1628 +alps_16140,JAVOROV VRH,,46.324444,14.464444,1435 +alps_16141,KOKRSKA KOCHNA,,46.355278,14.518889,2475 +alps_16142,MOKRICA,,46.315278,14.570833,1853 +alps_16143,KALSKI GREBEN,,46.331389,14.538056,2223 +alps_16144,GRINTAVEC,,46.356944,14.536111,2558 +alps_16145,KOCHNA,,46.358333,14.522778,2539 +alps_16146,TURSKA GORA,,46.359722,14.577778,2249 +alps_16147,SKUTA,,46.363056,14.558333,2532 +alps_16148,RINKE,,46.367500,14.565833,2429 +alps_16149,VRH KORENA,,46.314722,14.554722,1999 +alps_16150,OJSTRICA,,46.363611,14.638333,2350 +alps_16151,PLANJAVA,,46.356111,14.614167,2394 +alps_16152,SKARJE,,46.361944,14.631111,2141 +alps_16153,BRANA,,46.354444,14.588333,2252 +alps_16154,LUSHKI DEDEC,,46.351667,14.639167,2021 +alps_16155,KAMNISHKI DEDEC,,46.340278,14.609722,1663 +alps_16156,VRSHICHI,,46.342778,14.633056,1965 +alps_16157,KONJ,,46.331667,14.638611,1786 +alps_16158,ERSENIK,,46.327500,14.633333,1833 +alps_16159,KOPA,,46.322222,14.613056,1182 +alps_16160,MOLICHKA PECH,,46.360278,14.668056,2111 +alps_16161,CRNI VRH,,46.353611,14.663889,1926 +alps_16162,DLESKOVEC,,46.353333,14.682778,1972 +alps_16163,SMREKOVEC,,46.356111,14.700278,1613 +alps_16164,TOLSTI VRH,,46.348889,14.662222,1984 +alps_16165,JECAVCA,,46.394167,14.183889,1121 +alps_16166,PLECHE,,46.392222,14.195556,1120 +alps_16167,TOLSTI VRH,,46.405833,14.206389,1227 +alps_16168,GODASHNICA,,46.410556,14.150000,871 +alps_16169,HOCHSTUHL,,46.433611,14.174722,2237 +alps_16170,SREDNJI VRH,,46.435278,14.190278,1925 +alps_16171,DOBRCHA,,46.380278,14.253056,1634 +alps_16172,DRMALKE,,46.402222,14.261111,1313 +alps_16173,MALI VRH,,46.418056,14.214444,1757 +alps_16174,BEGUNJSHCHICA,,46.421111,14.230278,2063 +alps_16175,PLOT,,46.430000,14.238056,1695 +alps_16176,SREDNJI VRH,,46.430556,14.208611,1790 +alps_16177,PIRMANCE,,46.377778,14.310556,947 +alps_16178,MESERJOVEC,,46.379722,14.285278,991 +alps_16179,KOBEL,,46.395278,14.313889,1204 +alps_16180,MACESNOVEC,,46.407222,14.329444,1382 +alps_16181,VELIKI VRH KOSHUTA,,46.430556,14.310000,2080 +alps_16182,MALIJOVEC,,46.385556,14.394167,1502 +alps_16183,JAVORCHE,,46.382500,14.384444,1664 +alps_16184,JAVORNIK,,46.381944,14.418056,1684 +alps_16185,ZENIKLOVEC,,46.375000,14.403056,1716 +alps_16186,BUKOVEC,,46.393611,14.451111,1506 +alps_16187,STEGOVNIK,,46.395278,14.420556,1691 +alps_16188,RUSH,,46.401944,14.436667,1605 +alps_16189,PLESCHIWETZ,,46.434167,14.431667,1802 +alps_16190,VELIKI VRH,,46.415833,14.433333,1637 +alps_16191,CHRNA PECH,,46.426667,14.413889,1473 +alps_16192,SAUKOGEL,,46.432222,14.450556,1526 +alps_16193,MECESNOVEC,,46.376667,14.466667,1016 +alps_16194,SKUBROV VRH,,46.398056,14.516111,1232 +alps_16195,KLEIN GRINTOUTZ,,46.413056,14.480000,1654 +alps_16196,MRZLA GORA,,46.376944,14.578889,2203 +alps_16197,VISOKI VRH,,46.385000,14.525000,1458 +alps_16198,BABA,,46.379167,14.556667,2127 +alps_16199,KRNITZA,,46.383056,14.579167,1967 +alps_16200,GOLI VRH,,46.397500,14.547778,1788 +alps_16201,MALINSCHEK,,46.406111,14.541111,1623 +alps_16202,PAULITSCH WAND,,46.418056,14.581667,1657 +alps_16203,KAERNTNER STORSCHITZ,,46.430833,14.525833,1759 +alps_16204,KEPP,,46.434167,14.525000,1633 +alps_16205,SADONIG HOEHE,,46.436667,14.596111,1624 +alps_16206,PERKOVA PECH,,46.416111,14.611389,1211 +alps_16207,VRLOVEC,,46.410833,14.627778,1255 +alps_16208,LESNIK SATTEL,,46.411667,14.589167,1518 +alps_16209,GRINTOUTZ,,46.405556,14.588889,1762 +alps_16210,VELIKI VRH,,46.396667,14.616667,1545 +alps_16211,RKLEVA PECH,,46.399444,14.639167,1088 +alps_16212,KOPA,,46.392222,14.586667,1960 +alps_16213,BRLOZHNICA,,46.376944,14.601111,1635 +alps_16214,STRELCHEVA PECH,,46.430000,14.660278,1336 +alps_16215,HUDA PECH,,46.428333,14.679444,1322 +alps_16216,GOLARJEVA PECH,,46.430000,14.653056,1277 +alps_16217,ICMANIKOVA PECH,,46.408056,14.657778,1610 +alps_16218,OJSTERC,,46.409444,14.685278,1371 +alps_16219,ROZHNI VRH,,46.401389,14.670000,1475 +alps_16220,STRELOVEC,,46.393889,14.658889,1763 +alps_16221,KROFICHKA,,46.374444,14.645833,2084 +alps_16222,UTE,,46.378889,14.648333,2031 +alps_16223,KRIZEVNIK,,46.375000,14.689444,1909 +alps_16224,PROSENCHEV VRH,,46.433333,14.745000,1487 +alps_16225,SEVATNICA,,46.422500,14.763889,1815 +alps_16226,LANEZH,,46.416111,14.749444,1909 +alps_16227,RADUHA,,46.409722,14.738333,2062 +alps_16228,SHPIK,,46.441667,14.088333,969 +alps_16229,DEBELO BRD,,46.441944,14.114167,1209 +alps_16230,BONCLA,,46.452222,14.104722,1126 +alps_16231,KORENSH CHICA,,46.477222,14.104167,1760 +alps_16232,KOTSCHNA,,46.485278,14.088889,1551 +alps_16233,VELIKI ZRTNIK,,46.476111,14.088056,1424 +alps_16234,GRINTOUTZ,,46.480556,14.129167,1660 +alps_16235,MATSCHACHER GUPF,,46.489444,14.138056,1691 +alps_16236,BAERENTALER KOTSCHNA,,46.472500,14.123333,1944 +alps_16237,BIELSCHITZA,,46.443889,14.191389,1958 +alps_16238,EDELWEISS SPITZE,,46.438889,14.185556,1995 +alps_16239,KLAGENFURTER SPITZE,,46.436944,14.179444,2116 +alps_16240,GEISS BERG,,46.453056,14.182222,2024 +alps_16241,KOSMATITZA,,46.459722,14.198333,1659 +alps_16242,STEILE WAND,,46.485833,14.151944,1379 +alps_16243,SINACHER GUPF,,46.494167,14.192500,1577 +alps_16244,BELSH CHICA,,46.442778,14.151389,2104 +alps_16245,HEILIGE WAND,,46.456389,14.231944,1613 +alps_16246,RJAUTZA,,46.451389,14.222500,1789 +alps_16247,SELENITZA,,46.443056,14.219722,2026 +alps_16248,VERTATSCHA,,46.439722,14.213056,2180 +alps_16249,LOIBLER BABA,,46.438889,14.299444,1969 +alps_16250,GRINTOUTZ,,46.445000,14.300833,1809 +alps_16251,ZELLER PRAPOTNIK,,46.447222,14.312222,1727 +alps_16252,PETROUTZ,,46.455278,14.303056,1502 +alps_16253,TOMASCH BERG,,46.456111,14.319444,1505 +alps_16254,LOIBLER PRAPOTNIK,,46.463056,14.279444,1499 +alps_16255,ZELLER GRINTOUTZ,,46.475278,14.284444,1368 +alps_16256,NEUBERG,,46.479722,14.276111,1368 +alps_16257,FERLACHER HORN,,46.486389,14.314722,1840 +alps_16258,GRINTOUTZ,,46.494722,14.271111,1295 +alps_16259,WINDHOEHE,,46.439444,14.368889,1999 +alps_16260,HOHE SPITZE,,46.438889,14.381667,2044 +alps_16261,TAGOSHKA GORA,,46.438333,14.366111,2026 +alps_16262,SKARBINA,,46.438056,14.355278,1869 +alps_16263,HAINSCH TURM,,46.436944,14.344722,2092 +alps_16264,TSCHEUZ,,46.453611,14.383611,1434 +alps_16265,LAERCHEN TURM,,46.443056,14.388611,1980 +alps_16266,LAERCHEN BERG,,46.441667,14.389722,2081 +alps_16267,TOLSTI VRH,,46.455278,14.358056,1550 +alps_16268,KLADWO,,46.475833,14.380000,1148 +alps_16269,BREZOV VRH,,46.474722,14.358611,975 +alps_16270,JAUERNIK GUPF,,46.499167,14.380556,1690 +alps_16271,JAUERNIK,,46.493333,14.378889,1657 +alps_16272,BREITWAND,,46.444444,14.401667,2132 +alps_16273,MEJNIK,,46.453333,14.396389,1517 +alps_16274,KALISNIK TURM,,46.456667,14.454722,1575 +alps_16275,SELENZ,,46.461944,14.401944,1553 +alps_16276,FREIBERG,,46.488611,14.409722,1923 +alps_16277,TERKL TURM,,46.490278,14.422222,1798 +alps_16278,MALA KOSHUTA,,46.442778,14.438611,1740 +alps_16279,TOLSTA KOSCHUTA,,46.446667,14.429722,2059 +alps_16280,KOSCHUTNIK TURM,,46.446111,14.410556,2136 +alps_16281,WILZE,,46.449722,14.408611,1799 +alps_16282,STRUGLBERG,,46.458611,14.516944,1368 +alps_16283,RESCHOUNIK TURM,,46.458611,14.464167,1504 +alps_16284,ZWOELFER KOPF,,46.460556,14.489444,1263 +alps_16285,KUHBERG,,46.495833,14.468889,2026 +alps_16286,ZIMPASER KOGEL,,46.458056,14.550556,1547 +alps_16287,ST.LEONHARD,,46.480278,14.525556,942 +alps_16288,JOVANBERG,,46.495556,14.542778,1499 +alps_16289,LEPPEN BERG,,46.485278,14.630000,1130 +alps_16290,SERPITSCH KOGEL,,46.458889,14.601389,1144 +alps_16291,KURAT KOGEL,,46.457500,14.631389,1258 +alps_16292,BABA,,46.457778,14.616389,1003 +alps_16293,NABERNIG KOGEL,,46.450556,14.586944,1074 +alps_16294,WILMOSCH,,46.448333,14.611111,1323 +alps_16295,KOLARJEV VRH,,46.442222,14.644444,1508 +alps_16296,GORELZA,,46.494722,14.689722,1360 +alps_16297,SPITZ BERG,,46.473333,14.685556,1551 +alps_16298,JAWORNIK,,46.474444,14.673056,1507 +alps_16299,OLSHEVA,,46.449167,14.686111,1929 +alps_16300,HEILIGEN GEIST SATTEL,,46.444722,14.654167,1432 +alps_16301,KUKESCH HOEHE,,46.480556,14.709722,1567 +alps_16302,MOSGAN BERG,,46.491667,14.712222,1575 +alps_16303,COFATIJEV VRH,,46.474722,14.750278,1604 +alps_16304,LEPI VRH,,46.449444,14.719722,1610 +alps_16305,KOZJA PECH,,46.440278,14.763611,1315 +alps_16306,KNEZHEV SHPIC,,46.449722,14.783333,1198 +alps_16307,TANZBODEN,,46.558056,14.130278,929 +alps_16308,RABENBERG,,46.499722,14.215000,1465 +alps_16309,SINGERBERG,,46.500278,14.258889,1589 +alps_16310,AUSSICHT PETELINZ,,46.548611,14.320000,608 +alps_16311,SECHTER,,46.499722,14.316111,1449 +alps_16312,MATZEN,,46.508611,14.363056,1627 +alps_16313,SCHWARZER GUPF,,46.513056,14.416944,1688 +alps_16314,HOCH OBIR,,46.505833,14.487778,2139 +alps_16315,KLEINOBIR,,46.517500,14.484722,1950 +alps_16316,MINICHOUTZ,,46.520833,14.515833,1624 +alps_16317,BOSCHITZ BERG,,46.501111,14.561667,1228 +alps_16318,ALTBERG,,46.524722,14.531389,1552 +alps_16319,OISTRA,,46.509444,14.643889,1577 +alps_16320,POSCHAR,,46.510556,14.600000,1115 +alps_16321,JEGART KOGEL,,46.522778,14.617778,1263 +alps_16322,GRADISCHE,,46.538611,14.636389,753 +alps_16323,OBETSCHNIK,,46.559444,14.606389,681 +alps_16324,POSILE,,46.552500,14.602778,702 +alps_16325,TOPITZA,,46.516111,14.677778,1649 +alps_16326,HABER KOPF,,46.521111,14.686389,1359 +alps_16327,TOTSCHNIK,,46.528611,14.658611,1046 +alps_16328,HOMAR BERG,,46.537778,14.693889,1080 +alps_16329,SIMON BERG,,46.535278,14.674444,1043 +alps_16330,KNIRPS,,46.503611,14.763333,2110 +alps_16331,HRWATI,,46.506389,14.720833,1472 +alps_16332,TURM,,46.520000,14.714722,1463 +alps_16333,FEUERS BERGER,,46.519444,14.726389,1704 +alps_16334,MUSCHENIK,,46.531111,14.767222,1168 +alps_16335,JELEN,,46.535278,14.727500,1301 +alps_16336,FERRA KOGEL,,46.560833,14.752778,566 +alps_16337,KORDESCHKOPF PETZEN,,46.500000,14.780556,2126 +alps_16338,GORNJA,,46.519444,14.819722,1189 +alps_16339,STROPPITZ BERG,,46.530556,14.797778,962 +alps_16340,DOBEINER WAND,,46.564722,14.154722,924 +alps_16341,SCHROTTKOGEL,,46.600833,14.241111,759 +alps_16342,PLOESCHENBERG,,46.572778,14.220833,802 +alps_16343,HOHER GALLIN,,46.665833,14.095833,1046 +alps_16344,FALKENBERG,,46.635000,14.256389,671 +alps_16345,TSCHWARZENBERG,,46.741667,14.123611,882 +alps_16346,ST¾URBANER BERG,,46.743056,14.154444,881 +alps_16347,ULRICHSBERG,,46.701944,14.296667,1022 +alps_16348,MAGDALENSBERG,,46.728056,14.429722,1059 +alps_16349,HOMBERG,,46.804444,14.105833,1256 +alps_16350,TSCHIGGERHOEHE,,46.807500,14.108333,1262 +alps_16351,KITZELKAPELLE,,46.768889,14.102778,1091 +alps_16352,LANTSCHNIG,,46.761944,14.122778,990 +alps_16353,PAULSBERG,,46.777778,14.175000,1333 +alps_16354,HOCHECK,,46.771111,14.163333,1338 +alps_16355,GOESCHEBERG,,46.753611,14.200000,1171 +alps_16356,SCHNEEBAUERBERG,,46.796944,14.251389,1338 +alps_16357,SOERGERBERG,,46.788056,14.263056,1255 +alps_16358,WUNDERRIEGEL,,46.791944,14.219444,1274 +alps_16359,GAUERSTALL,,46.776944,14.307500,1129 +alps_16360,ZAMMELSBERG,,46.831944,14.163611,1171 +alps_16361,SCHMIEDKOGEL,,46.818056,14.165000,1117 +alps_16362,FREITHOFER BERG,,46.844167,14.244167,1188 +alps_16363,KOLBENKOPF,,46.857500,14.298611,1068 +alps_16364,DEBRIACHER KOPF,,46.853333,14.272500,1128 +alps_16365,SALBRECHTKOPF,,46.811944,14.317778,1246 +alps_16366,ESELBERG,,46.929167,14.108611,1544 +alps_16367,MOEDRINGBERG,,46.932500,14.141944,1693 +alps_16368,SCHMARITZERKOGEL,,46.917500,14.190556,1364 +alps_16369,GURNIKBERG,,46.885833,14.175833,1264 +alps_16370,KUSTER",,46.896667,14.238056,1481 +alps_16371,LEESFALLTOR,,46.919444,14.233056,1353 +alps_16372,SALZERKOPF,,46.923611,14.245833,1352 +alps_16373,HOLZERRIEGEL,,46.876944,14.246944,967 +alps_16374,PIRKERKOGEL,,46.875833,14.330833,1123 +alps_16375,HIRSCHSTEIN,,46.998333,14.086389,2047 +alps_16376,LICHTBERG,,46.975000,14.089167,1872 +alps_16377,DOLZERKOGEL,,46.939167,14.083333,1680 +alps_16378,PIRKERKOGEL,,46.954167,14.173333,1462 +alps_16379,LAMERHOEHE,,46.938611,14.167500,1538 +alps_16380,LADINIGRIEGEL,,46.942222,14.206389,1491 +alps_16381,KUSTER",,46.959167,14.238056,1481 +alps_16382,KOGLERKOGEL,,46.996667,14.293889,1374 +alps_16383,SPIELBERG,,46.986111,14.318889,1241 +alps_16384,SAUMARKT,,46.947222,14.297222,1359 +alps_16385,PRIEGERTRATE,,46.947500,14.311667,1295 +alps_16386,VILAN,,47.012500,9.603056,2376 +alps_16387,AUGSTENBERG,,47.051667,9.636667,2541 +alps_16388,HINTER GRAUSPITZ,,47.054722,9.587500,2574 +alps_16389,NAAFKOPF,,47.060556,9.607222,2571 +alps_16390,HORNSPITZE,,47.059722,9.645278,2537 +alps_16391,SASSAUNA,,47.011944,9.697778,2308 +alps_16392,PFAEWI,,47.020000,9.705000,2306 +alps_16393,HINTERBERG,,47.025833,9.703611,2107 +alps_16394,PICARDI CHOPF,,47.026389,9.697778,2080 +alps_16395,LUDERER EGG,,47.015278,9.680278,1952 +alps_16396,MOTTA BUEHEL,,47.035278,9.679444,1840 +alps_16397,SALARUEL JOCH,,47.058333,9.656667,2246 +alps_16398,SALARUEL KOPF,,47.061389,9.677500,2841 +alps_16399,SCHESAPLANA,,47.053611,9.707500,2965 +alps_16400,GIRENSPITZ,,47.026389,9.743333,2394 +alps_16401,LITZIWALD,,47.001389,9.762778,1337 +alps_16402,DROSBUEEL,,47.017778,9.742778,2052 +alps_16403,WALDIBUEEL,,47.009722,9.741389,1899 +alps_16404,LAEGEND SAGETTIS,,47.026389,9.717500,2278 +alps_16405,HOCH SAGETTIS,,47.027778,9.727778,2285 +alps_16406,LUENER ECK,,47.036944,9.747778,2297 +alps_16407,KANZEL KOEPFE,,47.042500,9.741667,2437 +alps_16408,KIRCHLI SPITZEN,,47.038889,9.769444,2551 +alps_16409,ROSSBERG,,47.046944,9.766944,2452 +alps_16410,TOTALP SEE,,47.054167,9.728056,2318 +alps_16411,FELSEN KOPF,,47.054167,9.714444,2835 +alps_16412,ZIRMEN KOPF,,47.056667,9.719722,2806 +alps_16413,SEEKOPF,,47.057500,9.736111,2698 +alps_16414,LUENER KRINNE,,47.057500,9.768889,2156 +alps_16415,SCHAFBERG,,47.002778,9.815556,2456 +alps_16416,BRAEGEZ,,47.018056,9.790556,2150 +alps_16417,DREI TUERME,,47.024722,9.810000,2830 +alps_16418,DRUSENFLUH,,47.028889,9.801667,2827 +alps_16419,MITTELGANDA,,47.016667,9.807500,2236 +alps_16420,SPORATURM,,47.026667,9.815000,2489 +alps_16421,GAMSFREIHEIT,,47.029722,9.812778,2445 +alps_16422,TIERGARTEN,,47.031667,9.818333,2103 +alps_16423,ZALUANDI KOPF,,47.053333,9.776667,2437 +alps_16424,SCHWEIZER TOR,,47.038333,9.783611,2137 +alps_16425,ZERNEUER JOECHLE,,47.038889,9.804167,2191 +alps_16426,KREUZJOCH,,47.056389,9.817222,2261 +alps_16427,KREUZ SPITZE,,47.043056,9.811944,2353 +alps_16428,GEISS SPITZE,,47.044444,9.827778,2334 +alps_16429,WILDER MANN,,47.048333,9.816667,2291 +alps_16430,HAETABERGER JOCH,,47.052222,9.815833,2154 +alps_16431,FRESCHLUA KOPF,,47.058333,9.786389,2314 +alps_16432,LATSCHAETZ KOPF,,47.056667,9.826667,2219 +alps_16433,SAROTLA SPITZE,,47.000833,9.889444,2563 +alps_16434,WEISS PLATTE,,47.009444,9.870833,2630 +alps_16435,SCHEIEN FLUH,,47.006389,9.873333,2627 +alps_16436,SULZ FLUH,,47.012500,9.839722,2818 +alps_16437,KLEIN SULZ FLUH,,47.017500,9.837500,2708 +alps_16438,SCHWARZ HORN,,47.032500,9.870278,2460 +alps_16439,TSCHAGGUNSER MITTAG SPITZE,,47.045556,9.885000,2168 +alps_16440,AUSSER PLATINA KOPF,,47.013889,9.900000,2416 +alps_16441,INNER PLATINA KOPF,,47.010000,9.896944,2505 +alps_16442,GWEIL SPITZE,,47.026111,9.925278,2187 +alps_16443,AUSSER GWEIL KOPF,,47.024722,9.907500,2406 +alps_16444,ALPILA KOPF,,47.030278,9.905278,2255 +alps_16445,MOTADENSER KOPF,,47.032500,9.917222,2041 +alps_16446,RUETIHORN,,47.008611,9.918889,2348 +alps_16447,FREDA KOPF,,47.046944,10.005833,2252 +alps_16448,PIZAGUTER GRAT,,47.040556,10.020278,2480 +alps_16449,SCHEIMERSCH,,47.042222,10.005278,2420 +alps_16450,ZAMANG SPITZE,,47.051389,9.975000,2386 +alps_16451,KREUZ JOCH,,47.060833,9.975278,2395 +alps_16452,ZAPFKOPF,,47.016111,10.040833,2288 +alps_16453,GRAPPES KOPF,,47.013056,10.028889,2206 +alps_16454,TALI SPITZE,,47.028333,10.061944,2616 +alps_16455,MADERER SPITZE,,47.025000,10.069722,2769 +alps_16456,LUTERSEE BERG,,47.033889,10.060000,2480 +alps_16457,DUERR KOPF,,47.036389,10.036111,2407 +alps_16458,GORVION,,47.078056,9.618889,2308 +alps_16459,KUHGRAT,,47.103333,9.620278,2003 +alps_16460,AUGSTEN BERG,,47.082500,9.609722,2359 +alps_16461,NOSPITZ,,47.093056,9.598611,2091 +alps_16462,KIRCHLE SPITZ,,47.103611,9.589167,1929 +alps_16463,OCHSEN KOPF,,47.114722,9.624722,2286 +alps_16464,PANUEELER KOPF,,47.066944,9.679722,2856 +alps_16465,WILDBERG,,47.067778,9.702222,2788 +alps_16466,OBER ZALIMKOPF,,47.078889,9.677778,2340 +alps_16467,GALAMANT,,47.079444,9.650278,1730 +alps_16468,STRAHLECK,,47.071944,9.655833,2068 +alps_16469,WINDEGGER SPITZ,,47.099444,9.686111,2331 +alps_16470,BLANKUS KOPF,,47.092500,9.679167,2334 +alps_16471,AMATSCHON JOCH,,47.104444,9.681944,2028 +alps_16472,FUNDEL KOPF,,47.110000,9.676389,2401 +alps_16473,TUKLAR,,47.117778,9.694167,2318 +alps_16474,KLEIN FUNDEL,,47.121111,9.675278,2104 +alps_16475,SCHAFGAFALL,,47.064722,9.766389,2414 +alps_16476,MOTTAKOPF,,47.086111,9.718611,2176 +alps_16477,SAULAKOPF,,47.079444,9.768889,2517 +alps_16478,SAULAJOCH,,47.072778,9.763333,2065 +alps_16479,MITTELBERG,,47.093333,9.725556,1493 +alps_16480,BRANDNER MITTAGSPITZE,,47.089167,9.763333,2557 +alps_16481,WILDBERG,,47.096389,9.768889,2372 +alps_16482,WASEN SPITZE,,47.110000,9.768056,2009 +alps_16483,BRANDNER GOLM,,47.109722,9.714444,1859 +alps_16484,SCHAFGAFALL,,47.068611,9.766111,2393 +alps_16485,GIPSKOEPFLE,,47.070278,9.779444,1975 +alps_16486,SAROTLA HOERNER,,47.099722,9.775833,2192 +alps_16487,ZIMBA,,47.091389,9.788889,2643 +alps_16488,GROSS VALKASTIEL,,47.100556,9.805556,2449 +alps_16489,GOTTVATER SPITZE,,47.103056,9.803611,2438 +alps_16490,ZWOELFER KOPF,,47.113056,9.791944,2271 +alps_16491,MITTAG SPITZE,,47.114167,9.815278,2107 +alps_16492,ZWOELFER JOCH,,47.110278,9.796667,2210 +alps_16493,STEINWAND ECK,,47.116111,9.829167,1996 +alps_16494,ROSSKOPF,,47.113889,9.827222,2075 +alps_16495,GULMKOPF,,47.120833,9.818056,1781 +alps_16496,TANTERMAUSES,,47.120556,9.805278,1822 +alps_16497,KENNERBERG,,47.118056,9.794167,2099 +alps_16498,VALBONA KOPF,,47.121111,9.785000,1714 +alps_16499,MONTENEU,,47.109167,9.911667,1883 +alps_16500,ITONS KOPF,,47.116111,9.933333,2089 +alps_16501,SPITZGUF,,47.123611,9.903611,1908 +alps_16502,MITTAGSJOCH,,47.071667,9.997500,2362 +alps_16503,HOCHJOCH,,47.066111,9.988056,2520 +alps_16504,LOB SPITZE,,47.079167,10.062778,2605 +alps_16505,LOBSCHILD,,47.072500,10.055833,2445 +alps_16506,AMEISEN SPITZE,,47.094444,10.080278,2589 +alps_16507,WESTLICHE EISENTALER SPITZE,,47.080556,10.078889,2710 +alps_16508,MUTT JOECHLE,,47.098611,10.028056,2074 +alps_16509,GOPPASCHROFEN,,47.175556,9.613333,1781 +alps_16510,HAARKOPF,,47.170000,9.608056,1638 +alps_16511,HOHE KOEPFE,,47.166111,9.623056,2066 +alps_16512,ZIGERBERGKOPF,,47.150278,9.604444,2051 +alps_16513,GALINAKOPF,,47.151667,9.620833,2198 +alps_16514,SCHOENBERG,,47.130278,9.593056,2104 +alps_16515,DREI KAPUZINER,,47.124722,9.588889,2084 +alps_16516,SCHEIENKOPF,,47.128333,9.635833,2159 +alps_16517,LOHNSPITZ,,47.160000,9.649167,1758 +alps_16518,GAMPBERG,,47.167500,9.661944,1710 +alps_16519,AEUSSERER ALPELIKOPF,,47.140556,9.653056,2063 +alps_16520,KLAMPERSCHROFEN,,47.158889,9.725278,1755 +alps_16521,SCHWARZKOPF,,47.160278,9.732778,1753 +alps_16522,MONDSPITZE,,47.152500,9.726667,1967 +alps_16523,SCHILLERKOPF,,47.142222,9.720833,2006 +alps_16524,MOTTAKOPF,,47.159444,9.755556,1221 +alps_16525,ALPILAKOPF,,47.128889,9.711944,2156 +alps_16526,LOISCHKOPF,,47.134722,9.742222,1809 +alps_16527,DALEU,,47.126667,9.749167,1746 +alps_16528,MATONA,,47.180556,9.782500,717 +alps_16529,DAVENNA,,47.126667,9.891667,1881 +alps_16530,DAVENNA KOPF,,47.129722,9.880556,1708 +alps_16531,STIER KOPF,,47.165278,9.872500,1801 +alps_16532,ELS SPITZE,,47.172222,9.864167,1980 +alps_16533,BREITHORN,,47.179722,9.863889,2009 +alps_16534,ROGGEL SPITZE,,47.152500,9.957500,2284 +alps_16535,PITSCHI KOEPFE,,47.168333,9.937222,2280 +alps_16536,SCHAFBERG,,47.169722,9.951111,2413 +alps_16537,LUSGRIND,,47.178889,9.950833,2286 +alps_16538,WEISSES ROESSLI,,47.170278,9.916944,2214 +alps_16539,NOVA SPITZE,,47.183611,9.904444,2022 +alps_16540,GAMSFREIHEIT,,47.173333,9.897222,2211 +alps_16541,NOVA KOPF,,47.178333,9.901389,2093 +alps_16542,HANFLENDER,,47.174722,9.954167,2349 +alps_16543,ALLHOEHE,,47.140556,10.004167,2026 +alps_16544,SALADINA SPITZE,,47.149722,10.002778,2230 +alps_16545,FENSTERLE WAND,,47.154722,10.004722,2329 +alps_16546,GANAHLS KOPF,,47.156389,10.008611,2314 +alps_16547,GWURFJOCH,,47.159444,9.964444,2170 +alps_16548,FORMALETSCH,,47.168056,10.009444,2292 +alps_16549,GEIS KOEPFE,,47.167500,9.963056,2303 +alps_16550,ROTE WAND,,47.186389,9.985000,2704 +alps_16551,BATZIGG,,47.140000,10.075000,1833 +alps_16552,GRAFEN SPITZE,,47.144722,10.055278,1871 +alps_16553,GAMSBODEN SPITZE,,47.153333,10.033611,2296 +alps_16554,GLONG SPITZE,,47.150278,10.054722,2243 +alps_16555,PLATTNITZER JOCH SPITZE,,47.154167,10.059167,2318 +alps_16556,GRUENER BUEHEL,,47.159167,10.069722,1985 +alps_16557,SPULLERSCHAF BERG,,47.173889,10.075833,2679 +alps_16558,PFAFFENECK,,47.171944,10.040833,2539 +alps_16559,POENGERTLE KOPF,,47.174722,10.035000,2539 +alps_16560,MEHLSACK,,47.180000,10.073333,2651 +alps_16561,KOPES,,47.240833,9.732500,1735 +alps_16562,HOCHGERACH,,47.236944,9.756944,1985 +alps_16563,HUETTENKOPF,,47.234167,9.765000,1976 +alps_16564,KUHSPITZE,,47.236389,9.771389,1963 +alps_16565,TAELLISPITZE,,47.239444,9.777500,2000 +alps_16566,MELKSPITZE,,47.240556,9.789722,1935 +alps_16567,MUTABELLASPITZE,,47.248889,9.820000,1935 +alps_16568,KLESI WAND,,47.190000,9.851111,1929 +alps_16569,HOHER FRASSEN,,47.191944,9.833611,1979 +alps_16570,GUGGERNUELL,,47.210278,9.881944,1736 +alps_16571,FALV KOPF,,47.241667,9.845000,1849 +alps_16572,MONT CALV,,47.242778,9.837500,1804 +alps_16573,GRENZ SPITZE,,47.248056,9.833611,1879 +alps_16574,OTTERN KOPF,,47.190000,9.933889,1938 +alps_16575,GRONGGEN KOPF,,47.210556,9.932778,1978 +alps_16576,KELLA SPITZE,,47.209722,9.896667,2017 +alps_16577,BREITHORN,,47.211389,9.914167,2081 +alps_16578,WANG SPITZE,,47.218611,9.908056,1766 +alps_16579,GLATTMAHD,,47.220556,9.936944,1930 +alps_16580,WANDFLUH,,47.232222,9.944444,1574 +alps_16581,SCHOEN BUEHEL,,47.192778,10.013056,2152 +alps_16582,ROTHORN,,47.190833,9.993333,2357 +alps_16583,MADRATSCH,,47.191389,9.968889,2287 +alps_16584,MISTHAUFEN,,47.203333,9.997222,2436 +alps_16585,GADNER KOEPFE,,47.206111,9.984722,2271 +alps_16586,HIRSCHEN SPITZE,,47.201111,10.013611,2501 +alps_16587,SCHWARZE WAND,,47.203611,10.014444,2524 +alps_16588,BETTLER SPITZE,,47.211667,9.971667,2272 +alps_16589,KLESENZA HOERNER,,47.208333,9.980000,2276 +alps_16590,HUTLA SPITZE,,47.216944,9.966667,2034 +alps_16591,MATONA KOPF,,47.221667,9.968889,2019 +alps_16592,WANG SPITZE,,47.230000,9.968056,1873 +alps_16593,FEUER STEIN,,47.229167,10.010833,2271 +alps_16594,DIESNER HOEHE,,47.236944,10.000000,2105 +alps_16595,POSTEL KOPF,,47.239444,9.963056,1381 +alps_16596,OESTLICHER JOHANNES KOPF,,47.208611,10.031111,2508 +alps_16597,WESTLICHER JOHANNES KOPF,,47.210278,10.022500,2573 +alps_16598,BRATSCHEN KOPF,,47.214167,10.022778,2520 +alps_16599,HOCHLICHT SPITZE,,47.219722,10.045833,2599 +alps_16600,LOEFFEL SPITZE,,47.222778,10.049444,2563 +alps_16601,ORGEL SPITZE,,47.228056,10.051667,2592 +alps_16602,BRAUNARL SPITZE,,47.229444,10.064444,2649 +alps_16603,BUTZEN SPITZE,,47.228611,10.074722,2547 +alps_16604,HOCHBERG,,47.247222,10.069444,2324 +alps_16605,DUEMELEKOPF,,47.309444,9.749444,1523 +alps_16606,NOB,,47.281667,9.762500,1785 +alps_16607,FALBEN,,47.272500,9.769444,1793 +alps_16608,ALPWEGKOPF,,47.273889,9.715556,1437 +alps_16609,HOHER FRESCHEN,,47.306944,9.777778,2004 +alps_16610,MATONA,,47.296667,9.788056,1998 +alps_16611,LOEFFELSPITZE,,47.253056,9.827222,1962 +alps_16612,GERENSPITZE,,47.250556,9.806944,1871 +alps_16613,SUENSER SPITZE,,47.303333,9.834167,2062 +alps_16614,RAGAZER BLANKEN,,47.305000,9.852500,2051 +alps_16615,DAMUELSER MITTAGSPITZE,,47.310278,9.883889,2095 +alps_16616,PORTLER HORN,,47.290556,9.849444,2010 +alps_16617,DAMUELSER HORN,,47.265278,9.879722,2134 +alps_16618,PFRONDHORN,,47.262500,9.842222,1949 +alps_16619,TUERTSCHHORN,,47.257500,9.880000,2096 +alps_16620,ELSENKOPF,,47.296389,9.896944,1940 +alps_16621,ZAFERHORN,,47.270000,9.925000,2107 +alps_16622,BLASENKA,,47.257222,9.945278,2010 +alps_16623,TOBLERMANNSKOPF,,47.286389,10.007778,2010 +alps_16624,ANNALPER STECKEN,,47.278611,9.970278,2124 +alps_16625,GRUENES GRAESHORN,,47.273889,9.971667,2201 +alps_16626,WILDES GRAESHORN,,47.271389,9.968333,2258 +alps_16627,ZITTERKLAPFEN,,47.268056,9.971111,2403 +alps_16628,KILKASCHROFEN,,47.269722,9.996389,2262 +alps_16629,SCHOENEBERG,,47.271111,10.012500,2282 +alps_16630,UENTSCHENSPITZE,,47.303889,10.060833,2135 +alps_16631,GUENTLESPITZE,,47.300833,10.078611,2092 +alps_16632,NIEDER KUENZELSPITZE,,47.278333,10.029444,2156 +alps_16633,HOCHKUENZELSPITZE,,47.271944,10.030278,2397 +alps_16634,ROTHORN,,47.251944,10.041667,2239 +alps_16635,KUMMABERG,,47.336111,9.616389,667 +alps_16636,TSCHUETSCH,,47.318056,9.641389,641 +alps_16637,KAPF,,47.342500,9.685556,1153 +alps_16638,SCHWARZENBERG,,47.366389,9.735556,1475 +alps_16639,BOCKSBERG,,47.360833,9.757778,1461 +alps_16640,STRAHLKOPF,,47.353333,9.721667,1366 +alps_16641,SCHOENER MANN,,47.356944,9.737778,1532 +alps_16642,HOHE KUGEL,,47.335000,9.715833,1645 +alps_16643,VORDERHOERNLI,,47.326944,9.733889,1656 +alps_16644,HOHER KNOPF,,47.362778,9.778611,1092 +alps_16645,LEUENKOPF,,47.349444,9.814167,1830 +alps_16646,MOERZELSPITZE,,47.345556,9.810833,1830 +alps_16647,SALZBOEDENKOPF,,47.330278,9.793611,1765 +alps_16648,ALPKOPF,,47.328611,9.775000,1788 +alps_16649,HANGSPITZE,,47.359444,9.849444,1746 +alps_16650,KOJENKOPF,,47.330000,9.876667,1583 +alps_16651,BETTLERKOPF,,47.317222,9.887778,1822 +alps_16652,GOPFBERG,,47.357778,9.898611,1316 +alps_16653,SONNENSPITZE,,47.334444,9.942500,1965 +alps_16654,RUNDERKOPF,,47.333611,9.936389,2014 +alps_16655,HOLENKE,,47.331667,9.927778,2044 +alps_16656,WANNENKOPF,,47.313333,9.900000,2006 +alps_16657,GUNGERN,,47.313889,9.908333,2053 +alps_16658,KLIPPERN,,47.316389,9.915833,2066 +alps_16659,HIRSCHBERG,,47.359444,9.998333,1834 +alps_16660,MITTAGSFLUH,,47.337500,9.983889,1637 +alps_16661,MOHRENKOPF,,47.360278,10.025000,1645 +alps_16662,GRUENE KOEPFE,,47.359167,10.036667,1725 +alps_16663,SEVISCHROFEN,,47.369722,10.063611,1659 +alps_16664,HAELEKOPF,,47.346667,10.070833,2058 +alps_16665,DIEDAMSKOPF,,47.346389,10.025556,2090 +alps_16666,STEINMANNL,,47.332222,10.070000,1981 +alps_16667,KREUZMANNL,,47.330000,10.064167,1974 +alps_16668,GRUENHORN,,47.323889,10.079167,2039 +alps_16669,FALZER KOPF,,47.331667,10.050000,1968 +alps_16670,TRIESTENKOPF,,47.401944,9.966667,1741 +alps_16671,WINTERSTAUDE,,47.399444,9.980278,1877 +alps_16672,PATENNERKOPF,,47.406389,10.013611,1385 +alps_16673,BULLERSKOPF,,47.396667,10.006667,1761 +alps_16674,NAGELEKOPF,,47.394722,10.017778,1693 +alps_16675,HAELEKOPF,,47.384167,9.968056,1614 +alps_16676,LUGUNTENKOPF,,47.387222,9.989167,1702 +alps_16677,SIENSPITZE,,47.384722,10.017778,1600 +alps_16678,FEUERSTAETTERKOPF,,47.432778,10.078333,1645 +alps_16679,STELLERHOEHE,,47.404722,10.026111,1347 +alps_16680,PLESSIGKOPF,,47.390556,10.064167,1384 +alps_16681,HENGSTIG,,47.389722,10.045000,1121 +alps_16682,HOCHHAEDRICH,,47.482222,10.003056,1566 +alps_16683,ROHNEHOEHE,,47.489167,10.038333,1639 +alps_16684,RENKKNIE,,47.439167,10.045278,1411 +alps_16685,BURSTKOPF,,47.439722,10.078611,1559 +alps_16686,STRITKOPF,,47.013056,10.131111,2604 +alps_16687,VERBELLA KOPF,,47.002500,10.104722,2581 +alps_16688,GIAMP SPITZE,,47.032222,10.091389,2533 +alps_16689,VALSCHAVIEL BERGE,,47.009444,10.126667,2623 +alps_16690,WINTER JOECHLE,,47.019722,10.124722,2310 +alps_16691,VALSCHAVIELER PLATTENSPITZE,,47.033056,10.125000,2561 +alps_16692,TORKOPF,,47.031389,10.133333,2630 +alps_16693,VALSCHAVIEL KOPF,,47.029444,10.134444,2696 +alps_16694,ALBONA KOPF,,47.023889,10.124444,2490 +alps_16695,GIAMP KOPF,,47.026389,10.092778,2470 +alps_16696,FANESKLA KOPF,,47.033056,10.118611,2539 +alps_16697,SCHWARZE WAND,,47.033611,10.106389,2592 +alps_16698,MUTTBERG,,47.061667,10.122222,2551 +alps_16699,GRUNER GRAT,,47.001944,10.156389,2708 +alps_16700,VERTINES BERG,,47.002500,10.186111,2855 +alps_16701,VERTINES KOPF,,47.000278,10.195278,2685 +alps_16702,VERTINES PLEISKOPF,,47.003889,10.204722,2706 +alps_16703,JOECHLI GRAT,,47.005278,10.154167,2626 +alps_16704,SCHOTTEN SEE,,47.008056,10.200000,2472 +alps_16705,FASUL ZWILLINGE,,47.013333,10.177778,2880 +alps_16706,VOLLAND SPITZE,,47.018611,10.176667,2928 +alps_16707,MITTER SPITZE,,47.023333,10.175278,2870 +alps_16708,FRASCH KOPF,,47.037500,10.147500,2349 +alps_16709,SCHOEN VERWALL KOPF,,47.024722,10.170278,2742 +alps_16710,TALLIGER,,47.026389,10.178889,2845 +alps_16711,FASUL SPITZE,,47.033333,10.180556,2835 +alps_16712,WANNEN JOECHLI,,47.035278,10.179444,2633 +alps_16713,PATTERIOL,,47.044167,10.187500,3056 +alps_16714,ROSANNA GRAT,,47.036111,10.168333,2680 +alps_16715,KLEINER PATTERIOL,,47.051944,10.187778,2590 +alps_16716,DROSBERG,,47.061667,10.157778,2661 +alps_16717,PLANNSEE KOPF,,47.061111,10.149722,2660 +alps_16718,GRAUER KOPF,,47.012778,10.217778,2793 +alps_16719,MALNAL KOPF,,47.020000,10.220000,2897 +alps_16720,KARKOPF,,47.022222,10.224167,2948 +alps_16721,MADLEIN KOPF,,47.017222,10.248889,2907 +alps_16722,LATTEN KOPF,,47.020000,10.266944,2454 +alps_16723,SUEDLICHER SCHOENPLEIS KOPF,,47.029167,10.229444,2920 +alps_16724,SCHOENPLEIS JOECHLI,,47.031111,10.230833,2809 +alps_16725,RAUTE JOECHLI,,47.041389,10.243611,2752 +alps_16726,FASULWAND,,47.045556,10.216389,2885 +alps_16727,SCHEIBLER,,47.058333,10.221944,2978 +alps_16728,KUCHEN JOECHLI,,47.054444,10.223056,2730 +alps_16729,KUCHEN SPITZE,,47.048611,10.230000,3148 +alps_16730,KUECHL SPITZE,,47.041389,10.232778,3147 +alps_16731,RAUTEKOPF,,47.041944,10.248056,2849 +alps_16732,SEEKOPFE,,47.044444,10.267500,3061 +alps_16733,MADLEIN SEE,,47.038056,10.262500,2437 +alps_16734,SAUM SPITZE,,47.050833,10.269722,3039 +alps_16735,NOERDLICHER SCHOENPLEIS KOPF,,47.034722,10.229167,2943 +alps_16736,RAUTE TURM,,47.043611,10.256389,2825 +alps_16737,KAPPLER KOPF,,47.060556,10.325278,2404 +alps_16738,BREITER KOPF,,47.061389,10.304722,2532 +alps_16739,VELILL SPITZE,,47.011667,10.327778,2704 +alps_16740,ALSCHNER SPITZE,,47.050000,10.300000,2837 +alps_16741,OBERPLATT KOPF,,47.047778,10.301389,2789 +alps_16742,FATLAR SPITZE,,47.051944,10.286667,2986 +alps_16743,KARTELL KOPF,,47.060000,10.273056,2642 +alps_16744,GRUEBELE KOPF,,47.000833,10.389167,2894 +alps_16745,OCHSEBNE KOPF,,47.010000,10.389167,2888 +alps_16746,VESUL SPITZE,,47.001667,10.349167,3089 +alps_16747,VESUL SCHARTE,,47.004167,10.353611,2727 +alps_16748,RIERER KOPF,,47.011667,10.361389,2856 +alps_16749,KARLE SPITZE,,47.018056,10.392500,2858 +alps_16750,SCHAFPLEIS KOPF,,47.030000,10.390833,2707 +alps_16751,KNOLL KOPF,,47.030833,10.363333,2518 +alps_16752,MUTLER KOPF,,47.034444,10.391944,2718 +alps_16753,LAHNGANG KOPF,,47.046667,10.395278,2471 +alps_16754,MITTAG KOPF,,47.051944,10.395000,2249 +alps_16755,FRUDIGER KOPF,,47.001389,10.454167,2822 +alps_16756,GMAIRER KOPF,,47.012222,10.453889,2914 +alps_16757,MALFRAG KOPF,,47.000556,10.405000,2776 +alps_16758,MARTINS KOPF,,47.010833,10.436944,2736 +alps_16759,HINTERES KREUZ JOCH,,47.015556,10.424167,2853 +alps_16760,VORDERES KREUZ JOCH,,47.031111,10.422222,2845 +alps_16761,ZONPLEIS KOPF,,47.044722,10.415556,2438 +alps_16762,BERGLIS KOPF,,47.037778,10.434444,2595 +alps_16763,BLAUE TALRUECK,,47.001667,10.481389,2834 +alps_16764,MINDERS KOPF,,47.006389,10.477222,2780 +alps_16765,SCHAFBERG,,47.007500,10.503333,2560 +alps_16766,MASNER KOPF,,47.012500,10.473056,2828 +alps_16767,PEZID,,47.020278,10.513333,2770 +alps_16768,HEXEN KOPF,,47.021111,10.469444,3035 +alps_16769,STILL EGG,,47.043889,10.470833,2670 +alps_16770,ARREZ KOPF,,47.028333,10.498056,2870 +alps_16771,PLATT KOPF,,47.029722,10.470000,2893 +alps_16772,STILL KOPF,,47.035833,10.469167,2889 +alps_16773,LAWENS KOPF,,47.035000,10.505000,2877 +alps_16774,FURGLER,,47.040278,10.512222,3004 +alps_16775,BLANKAR KOPF,,47.053333,10.517500,2892 +alps_16776,MEDRIG,,47.059444,10.500556,2568 +alps_16777,GEIERS KOPF,,47.009167,10.522500,2580 +alps_16778,VORDERER HEUBERG,,47.008611,10.561944,2353 +alps_16779,HINTERER HEUBERG,,47.012500,10.544444,2578 +alps_16780,RIEFEN KOPF,,47.018611,10.527778,2654 +alps_16781,BOEDEN KOEPFE,,47.032500,10.535833,2415 +alps_16782,ALP KOPF,,47.035833,10.570556,2022 +alps_16783,PLANS KOPF,,47.052778,10.538889,2804 +alps_16784,KUEBELGRUBEN KOPF,,47.058056,10.529444,2870 +alps_16785,BRUNNEN KOPF,,47.059444,10.557500,2682 +alps_16786,MATONBERG,,47.006667,10.638056,2168 +alps_16787,MICHAELS KOPF,,47.027778,10.587222,1892 +alps_16788,BEUTEL KOPF,,47.049167,10.598611,1795 +alps_16789,KRUPP KOEPFE,,47.006111,10.656667,2473 +alps_16790,SCHLANTE KOPF,,47.021667,10.695278,2524 +alps_16791,ZIRMES KOPF,,47.028333,10.680833,2092 +alps_16792,OCHSEN KOPF,,47.054167,10.707500,2153 +alps_16793,FEICHTENER KARL SPITZE,,47.015278,10.707778,2916 +alps_16794,MADATSCH KOPF,,47.007500,10.769167,2778 +alps_16795,ALTER MANN,,47.010833,10.711389,2888 +alps_16796,MOOS KOPF,,47.013611,10.765000,2532 +alps_16797,ROTER SCHROFEN,,47.039722,10.718333,2702 +alps_16798,MITTAGS KOPF,,47.045833,10.719722,2616 +alps_16799,VERPEIL SPITZE,,47.003333,10.805000,3423 +alps_16800,SCHWABEN KOPF,,47.006389,10.793611,3378 +alps_16801,SONNEN KOEGEL,,47.023333,10.814444,3135 +alps_16802,GAMEZ KOGEL,,47.025000,10.828056,3126 +alps_16803,TOTENKAR KOEPFL,,47.028056,10.820278,3181 +alps_16804,SCHWEIKERT,,47.033056,10.773889,2879 +alps_16805,HOCHRINN EGG,,47.030833,10.784444,3058 +alps_16806,ROFEL WAND,,47.032222,10.818333,3353 +alps_16807,GSALL KOPF,,47.037778,10.805000,3277 +alps_16808,BREHN KOGEL,,47.042500,10.794444,3025 +alps_16809,GROSS DRIST KOGEL,,47.050278,10.801111,3058 +alps_16810,ROSS KOPF,,47.051944,10.832222,2305 +alps_16811,KLEIN DRIST KOGEL,,47.054444,10.800556,2934 +alps_16812,STURPEN,,47.023333,10.883056,2718 +alps_16813,HUNDSTAL KOGEL,,47.032500,10.893056,3080 +alps_16814,RAPPEN KOPF,,47.041389,10.844444,2320 +alps_16815,FEUER KOGEL,,47.055833,10.891389,2954 +alps_16816,SILBER SCHNEID,,46.999722,10.913889,3341 +alps_16817,HOHE GEIGE,,47.004722,10.908611,3393 +alps_16818,HOHER BREITER,,47.016111,10.912500,3293 +alps_16819,INNERER HAHL KOGEL,,47.020833,10.949444,2734 +alps_16820,AEUSSERER WART KOGEL,,47.015278,10.951111,2552 +alps_16821,WILDE GEIGE,,47.024167,10.922500,3152 +alps_16822,AEUSSERER HAHN KOGEL,,47.024167,10.952778,2655 +alps_16823,BREITLEHN KOGEL,,47.028889,10.930556,2813 +alps_16824,REISER KOGEL,,47.045556,10.906389,3082 +alps_16825,FELDER KOGEL,,47.046389,10.917778,3071 +alps_16826,LUIBIS KOGEL,,47.049722,10.904167,3110 +alps_16827,SCHARTLAS KOGEL,,47.004722,10.973611,2784 +alps_16828,PEERLER KOGEL,,47.005833,10.977222,2750 +alps_16829,REICHENKAR SPITZE,,47.039722,11.016389,2971 +alps_16830,LOCH KOGEL,,47.046389,11.008889,3044 +alps_16831,KLEIN LOCHKOGEL,,47.049444,11.004444,2922 +alps_16832,GAMS KOGEL,,47.055278,10.997222,2813 +alps_16833,WILDE LECK,,47.002778,11.062500,3359 +alps_16834,ATTERKAR SPITZEN,,47.000556,11.054444,3244 +alps_16835,FELDERLAS KOGEL,,47.001389,11.041944,2946 +alps_16836,ZAHME LECK,,47.005278,11.062222,3226 +alps_16837,KUHSCHEIBE,,47.012778,11.055278,3188 +alps_16838,WANNEN KOGEL,,47.020000,11.064722,2977 +alps_16839,ROTER KOGEL,,47.020000,11.046667,3037 +alps_16840,MURKAR SPITZE,,47.023889,11.035833,3150 +alps_16841,TONIGEN KOGEL,,47.029167,11.028889,3011 +alps_16842,NIEDERER SULZ KOGEL,,47.040000,11.062500,2796 +alps_16843,HOHER SULZ KOGEL,,47.036944,11.059444,2907 +alps_16844,GAMEZWART,,47.036111,11.020833,3042 +alps_16845,SCHWARZ WANTER,,47.040278,11.026667,3077 +alps_16846,BACHLEITEN SPITZE,,47.044444,11.036111,2726 +alps_16847,UNTER GAISLEHN KOGEL,,47.057222,11.080278,2955 +alps_16848,GAFLUNA KOPF,,47.063889,10.134722,2676 +alps_16849,REUTLINGER TURM,,47.074722,10.101389,2606 +alps_16850,OESTLICHE EISENTALE SPITZE,,47.079722,10.100000,2753 +alps_16851,PFLUN SPITZE,,47.079444,10.132778,2912 +alps_16852,KALTENBERG,,47.086389,10.138333,2896 +alps_16853,SATTEINSER SPITZE,,47.094444,10.137222,2722 +alps_16854,BURTSCHA KOPF,,47.111944,10.085000,2244 +alps_16855,GSTANS KOPF,,47.087778,10.169167,2730 +alps_16856,WIRT,,47.120278,10.202778,2339 +alps_16857,WILDEBENE,,47.095833,10.180278,2571 +alps_16858,MAROI JOECHLE,,47.119167,10.161944,2380 +alps_16859,STUBNER ALBONA KOPF,,47.105833,10.154444,2654 +alps_16860,MAROI SPITZE,,47.109444,10.156111,2548 +alps_16861,MAROI KOEPFE,,47.114722,10.158333,2522 +alps_16862,PEISCHEL KOPF,,47.121667,10.191111,2412 +alps_16863,KNOEDEL KOPF,,47.120000,10.182778,2400 +alps_16864,ALBONA GRAT,,47.119167,10.169722,2391 +alps_16865,HAHNENTRITT KOPF,,47.076667,10.213333,2636 +alps_16866,FASELFAD SPITZE,,47.063056,10.240000,2993 +alps_16867,FASELFAD JOCH,,47.071389,10.234444,2636 +alps_16868,AUGSTENBERG KOPF,,47.077500,10.240278,2881 +alps_16869,KLEINE SULZSPITZE,,47.088333,10.237778,2741 +alps_16870,GROSSE SULZSPITZE,,47.084444,10.235833,2853 +alps_16871,MAIEN KOPF,,47.123333,10.220000,1905 +alps_16872,RUGGLE SPITZE,,47.063056,10.291111,2864 +alps_16873,MADAUN JOECHLI,,47.072778,10.293889,2778 +alps_16874,MADAUN SPITZE,,47.076389,10.297222,2961 +alps_16875,SESSLAD SPITZE,,47.070556,10.293056,2906 +alps_16876,ROTE WAND,,47.078056,10.319444,2810 +alps_16877,KREUZJOCH SPITZE,,47.079167,10.306111,2919 +alps_16878,BEILSTEIN,,47.081667,10.324167,2749 +alps_16879,RIFFEL SPITZE,,47.085000,10.299722,2935 +alps_16880,SCHAR KOPF,,47.102778,10.320278,2465 +alps_16881,HINTERE RENDL SPITZE,,47.099722,10.300556,2741 +alps_16882,HOCHKAR SPITZE,,47.110833,10.307500,2836 +alps_16883,HOCHKAR KOPF,,47.114444,10.313333,2772 +alps_16884,HOHE SPITZ,,47.091667,10.346389,2796 +alps_16885,RIFFLA KOPF,,47.093611,10.376667,2680 +alps_16886,KAPPLERJOCH SPITZE,,47.099167,10.364722,2843 +alps_16887,GAMPERNUN SPITZE,,47.104444,10.390000,2887 +alps_16888,BLANKA HORN,,47.114167,10.367500,3129 +alps_16889,SCHIEBEN KOPF,,47.118611,10.393611,2538 +alps_16890,HOHER RIFFLER,,47.116111,10.370833,3168 +alps_16891,KLEINER RIFFLER,,47.116389,10.365000,3014 +alps_16892,GAUDER KOPF,,47.120000,10.375278,2991 +alps_16893,PEZINER SPITZE,,47.101944,10.441111,2550 +alps_16894,GROSS GFALL KOPF,,47.101667,10.408611,2639 +alps_16895,HINTERER SATTEL KOPF,,47.063333,10.564444,2670 +alps_16896,ROTPLEIS KOPF,,47.066111,10.528889,2936 +alps_16897,ZWOELFER KOPF,,47.072500,10.576389,2596 +alps_16898,GAMSBERG SPITZE,,47.076111,10.528889,2839 +alps_16899,GAMSBERG KOPF,,47.087778,10.530278,2821 +alps_16900,KEGEL KOPF,,47.091944,10.541944,2837 +alps_16901,GATSCH KOPF,,47.098056,10.552500,2588 +alps_16902,GIGGLER SPITZE,,47.098056,10.526944,2614 +alps_16903,ZIRM EGG,,47.112500,10.543889,2073 +alps_16904,SCHOEN JOECHL,,47.077500,10.598611,2493 +alps_16905,MATE KOPF,,47.087778,10.623611,2248 +alps_16906,MAIREN BICHL,,47.100278,10.691111,1852 +alps_16907,HAHNENEGGER,,47.114167,10.677222,1685 +alps_16908,KALKOFEN EGG,,47.118333,10.695833,1724 +alps_16909,OELGRUBENK,,47.093889,10.758333,2887 +alps_16910,SEE KOPF,,47.101667,10.755000,2583 +alps_16911,AIFNER SPITZE,,47.104167,10.731389,2779 +alps_16912,KREUZ JOECHL,,47.113889,10.731111,2589 +alps_16913,SCHILD,,47.117222,10.735000,2517 +alps_16914,PEISCHL KOPF,,47.064444,10.792778,2913 +alps_16915,HINTER STUPFARRI,,47.070000,10.792778,2895 +alps_16916,GIETKOEGELE,,47.066389,10.819722,2413 +alps_16917,MITTLERER STUPFARRI,,47.077778,10.786944,2911 +alps_16918,STUPFARRI KOEPFLE,,47.085833,10.777500,2808 +alps_16919,SAXUIRER FEUER KOGEL,,47.077222,10.797500,2807 +alps_16920,AHER KOGEL,,47.083611,10.790556,2803 +alps_16921,VORDERER STUPFARRI,,47.082222,10.784722,2874 +alps_16922,SCHWARZ WAND,,47.089722,10.775278,2942 +alps_16923,STALL KOGEL,,47.087222,10.807222,2605 +alps_16924,KITZMOERDER,,47.091667,10.797222,2435 +alps_16925,DRISTEN KOGEL,,47.062500,10.888611,2996 +alps_16926,KANS,,47.066389,10.885833,2980 +alps_16927,LANGKARLES SCHNEID,,47.073056,10.885833,3044 +alps_16928,PLATTIG KOGEL,,47.076667,10.885556,3089 +alps_16929,BLOCK KOGEL,,47.085278,10.880556,3097 +alps_16930,AM GAMPEN,,47.079722,10.855833,2266 +alps_16931,ROTPLEIS KOPF,,47.093889,10.864444,2884 +alps_16932,HAIRLACHER SEE KOPF,,47.098611,10.860556,3040 +alps_16933,MAURER KOPF,,47.098056,10.846389,2528 +alps_16934,LEHNER GRIES KOGEL,,47.107222,10.864444,3038 +alps_16935,FUNDUS FEILER,,47.112222,10.870278,3079 +alps_16936,LEIERS KOPF,,47.121944,10.867222,2812 +alps_16937,HAUER KOGEL,,47.065278,10.936111,2491 +alps_16938,SCHMALZ KOPF,,47.064444,10.904444,2526 +alps_16939,HOHE SEITE,,47.086667,10.900556,2852 +alps_16940,INNERBERGER FELDER KOGEL,,47.082222,10.898333,2830 +alps_16941,WINKLBODEN,,47.103333,10.935556,1255 +alps_16942,RECHENSTIEL EGG,,47.107222,10.927222,1490 +alps_16943,HOHER BICHL,,47.112500,10.929722,1442 +alps_16944,WOLFS EGG,,47.121389,10.953889,1680 +alps_16945,HOERNDLE,,47.094722,10.994444,2985 +alps_16946,STRAHL KOGEL,,47.108889,11.019722,3288 +alps_16947,GRASTALER GRIES KOGEL,,47.108889,11.011944,3168 +alps_16948,HEMER KOGEL,,47.108056,10.985833,2760 +alps_16949,GAISLEHN KOGEL,,47.063333,11.076667,3216 +alps_16950,KUEHLENKAR SCHNEID,,47.069167,11.065833,3195 +alps_16951,PUTZENKAR SCHNEID,,47.073889,11.063333,3129 +alps_16952,GRUENE TATZEN,,47.084722,11.080833,2952 +alps_16953,HOHER SEEBLAS KOGEL,,47.095556,11.075000,3235 +alps_16954,BREITER GRIES KOGEL,,47.101111,11.022778,3287 +alps_16955,WINNEBACHER WEISS KOGEL,,47.110556,11.062500,3182 +alps_16956,LARSTIG SPITZE,,47.108889,11.033611,3172 +alps_16957,GLEIRSCHER FERNER KOGEL,,47.113889,11.063611,3189 +alps_16958,HINTER SONNEN WAND,,47.123611,11.061944,3106 +alps_16959,BLISADONA KOPF,,47.148611,10.119444,2424 +alps_16960,BLISADONA SPITZE,,47.150556,10.120000,2508 +alps_16961,ERZBERG SPITZE,,47.153056,10.141944,2536 +alps_16962,GRUBENJOCH SPITZE,,47.154444,10.135833,2659 +alps_16963,WASEN SPITZE,,47.153889,10.127778,2665 +alps_16964,BRAZER JOECHL,,47.151389,10.110833,2282 +alps_16965,ROHN SPITZE,,47.153611,10.099722,2495 +alps_16966,GOPPEL SPITZE,,47.155556,10.093333,2371 +alps_16967,FLEXEN SPITZE,,47.159444,10.137222,2627 +alps_16968,WILDGRUBEN SPITZE,,47.165000,10.126389,2753 +alps_16969,ROGGAL SPITZE,,47.166111,10.117222,2673 +alps_16970,HINTERE HASENFLUH,,47.166111,10.139722,2544 +alps_16971,OBERE WILDGRUBEN SPITZE,,47.172500,10.120833,2625 +alps_16972,OMES HORN,,47.185833,10.128056,2557 +alps_16973,STIERLOCH KOPF,,47.180278,10.110000,2354 +alps_16974,MADLOCH SPITZE,,47.179167,10.122500,2546 +alps_16975,PFANNEN KOPF,,47.145000,10.202500,2308 +alps_16976,ROTER TURM,,47.147222,10.146944,2147 +alps_16977,SCHWARZER TURM,,47.149167,10.146389,2297 +alps_16978,ROSS KOPF,,47.153056,10.152500,2199 +alps_16979,OCHSENBODEN KOPF,,47.148611,10.177778,2222 +alps_16980,PAZUEL FERNER SPITZE,,47.154444,10.200278,2712 +alps_16981,TRITT KOPF,,47.155278,10.193333,2720 +alps_16982,NOERDLICHER TRITT KOPF,,47.161667,10.188889,2581 +alps_16983,VORDERE HASENFLUH,,47.164722,10.147778,2534 +alps_16984,TRITTWANG KOPF,,47.185556,10.199167,2482 +alps_16985,KNOPPENJOCH SPITZE,,47.154444,10.229722,2680 +alps_16986,WEISS SCHROFEN SPITZE,,47.156111,10.246667,2752 +alps_16987,VALLUGA,,47.157500,10.213056,2809 +alps_16988,FALLERSTEISS SPITZE,,47.160000,10.249444,2634 +alps_16989,BACHER,,47.158611,10.266389,2391 +alps_16990,ROGG SPITZE,,47.165556,10.209167,2747 +alps_16991,KUGLA SPITZE,,47.180000,10.231111,2684 +alps_16992,SCHMALZGRUBE SPITZE,,47.183056,10.239444,2643 +alps_16993,FANGGEKAR SPITZE,,47.179722,10.223056,2640 +alps_16994,HIRSCHPLEIS KOPF,,47.166389,10.296389,2546 +alps_16995,SCHINDLE KOPF,,47.168889,10.315833,2471 +alps_16996,WIESS KOPF,,47.175278,10.332500,2581 +alps_16997,BERGLES KOPF,,47.172222,10.315000,2577 +alps_16998,STANS KOGEL,,47.173333,10.304722,2757 +alps_16999,GLOGGER SPITZE,,47.172500,10.290278,2523 +alps_17000,KAISERSTEIN SPITZE,,47.181667,10.319722,2347 +alps_17001,FALLESIN SPITZE,,47.181389,10.300278,2769 +alps_17002,MITTAG SPITZE,,47.126944,10.383056,2650 +alps_17003,APPERIES SPITZE,,47.173889,10.355556,2588 +alps_17004,GEIER KOPF,,47.166111,10.363889,2227 +alps_17005,SAM SPITZE,,47.173889,10.395556,2624 +alps_17006,KRIDLON SCHARTE,,47.174722,10.345278,2371 +alps_17007,VORDERSEE SPITZE,,47.184722,10.366944,2889 +alps_17008,HINTERSEE JOCH,,47.178333,10.360000,2482 +alps_17009,EISEN SPITZE,,47.162500,10.447778,2859 +alps_17010,BLANKA SPITZE,,47.162500,10.405278,2174 +alps_17011,GRIESMUTTE KOPF,,47.171667,10.439167,2805 +alps_17012,STIER KOPF,,47.177778,10.413611,2589 +alps_17013,GRIESSL SPITZE,,47.183611,10.435278,2830 +alps_17014,STIERLOCH KOPF,,47.179167,10.433056,2788 +alps_17015,SCHWARZLOCH KOPF,,47.175833,10.435000,2739 +alps_17016,STERTE KOPF,,47.161667,10.472222,2765 +alps_17017,DAWIN KOPF,,47.166111,10.473056,2968 +alps_17018,GATSCH KOPF,,47.173333,10.489444,2945 +alps_17019,SIMELES KOPF,,47.176389,10.502500,2804 +alps_17020,BLANKA HORN,,47.175000,10.512778,2822 +alps_17021,BRAND JOECHL,,47.164444,10.553056,2045 +alps_17022,RAUHER KOPF,,47.172500,10.533611,2811 +alps_17023,WANNEN KOPF,,47.174167,10.523333,2821 +alps_17024,SILBER SPITZE,,47.184167,10.572778,2461 +alps_17025,KRAHBERG,,47.145000,10.625000,2208 +alps_17026,GLANDER SPITZE,,47.148333,10.661667,2512 +alps_17027,KREUZ JOCH,,47.159167,10.674444,2464 +alps_17028,WANNE JOECHL,,47.154444,10.670556,2497 +alps_17029,IMSTERBERG JOCH,,47.168889,10.686389,2207 +alps_17030,GAMPEL KOPF,,47.170000,10.671111,2225 +alps_17031,HOHER GEMEINDE KOPF,,47.130556,10.816944,2771 +alps_17032,KREUZJOECHL SPITZE,,47.131667,10.825278,2908 +alps_17033,RIEGE SPITZE,,47.135278,10.826667,2944 +alps_17034,SCHWENDT KOPF,,47.141111,10.809722,2605 +alps_17035,BRECHKOGEL,,47.148056,10.832778,2936 +alps_17036,WILD GRAT,,47.140556,10.826667,2971 +alps_17037,UMGANG KOPF,,47.145278,10.820556,2701 +alps_17038,ZOLL BERG,,47.143056,10.775278,2225 +alps_17039,MURMENTENKAR SPITZE,,47.152222,10.830000,2770 +alps_17040,SECHSZEIGER,,47.165833,10.783611,2392 +alps_17041,MUTZEIGER,,47.181389,10.827222,2277 +alps_17042,AEUSSERER HOHER KOGEL,,47.150278,10.848333,2728 +alps_17043,KREUZJOCH SPITZE,,47.157500,10.873056,2675 +alps_17044,WEITERKAR KOPF,,47.162500,10.836667,2774 +alps_17045,HOHER KAR KOPF,,47.170833,10.846389,2686 +alps_17046,MITTLER KAR KOPF,,47.174167,10.858333,2607 +alps_17047,ERSTER KAR KOPF,,47.178056,10.870833,2513 +alps_17048,WENDER KOGEL,,47.126944,10.901944,2199 +alps_17049,PLAN KOGEL,,47.158056,10.951111,2347 +alps_17050,FARSTER KOPF,,47.165278,10.928611,1988 +alps_17051,SAND BICHL,,47.178889,10.908333,997 +alps_17052,LAUSER,,47.176389,10.953056,2616 +alps_17053,HABICHER WAND,,47.185278,10.926111,2176 +alps_17054,NEDER KOGEL,,47.128056,11.005833,2755 +alps_17055,SOEMEN SPITZE,,47.146111,11.020278,2682 +alps_17056,POSCHACH KOGEL,,47.148056,10.974167,2574 +alps_17057,GRUE JOCH,,47.154722,10.982500,2747 +alps_17058,GAIS KOGEL,,47.162500,10.985278,2720 +alps_17059,HOHER WASSERFALLE,,47.165000,10.971667,3003 +alps_17060,HOHER PLATT KOGEL,,47.173056,10.997222,2791 +alps_17061,NIEDER PLATT KOGEL,,47.172500,10.988333,2739 +alps_17062,HOCHREICH KOPF,,47.170278,10.969722,3010 +alps_17063,NIEDERREICH SCHARTE,,47.173333,10.963333,2729 +alps_17064,HOCHBRUNNACH KOGEL,,47.176944,10.962222,2889 +alps_17065,GAMS KOGEL,,47.177500,11.012222,2965 +alps_17066,WECHNER KOGEL,,47.183611,10.960833,2954 +alps_17067,ROTER KOGEL,,47.184722,10.975833,2827 +alps_17068,SULZ KOGEL,,47.181944,11.011944,3016 +alps_17069,VORDER SONNEN WAND,,47.129444,11.061389,3156 +alps_17070,ZWIESELBACHER GRIES KOGEL,,47.136944,11.058889,3055 +alps_17071,SAMERSCHLAG,,47.144167,11.063056,2829 +alps_17072,GLEIRSCHER ROSS KOGEL,,47.157222,11.049722,2994 +alps_17073,ZWIESELBACHER ROSS KOGEL,,47.163333,11.048056,3081 +alps_17074,ROTGRUBEN SPITZE,,47.168333,11.060278,3042 +alps_17075,HAIDEN SPITZE,,47.171944,11.067222,2975 +alps_17076,GAMS KOEGELE,,47.175000,11.023056,2912 +alps_17077,WEITKAR SPITZE,,47.175278,11.046667,2947 +alps_17078,RAEUHEN GRAT,,47.185556,11.076389,2814 +alps_17079,KRASPES SPITZE,,47.180556,11.043333,2954 +alps_17080,SCHOLLE KOGEL,,47.184167,11.044722,2902 +alps_17081,SCHARTEN KOPF,,47.178889,11.030000,2855 +alps_17082,ZUGER HORN,,47.212500,10.083889,2111 +alps_17083,KRIEGER HORN,,47.214167,10.113889,2173 +alps_17084,ZUGER HOCHLICHT,,47.226389,10.100833,2371 +alps_17085,MOHNEN FLUH,,47.232222,10.102222,2542 +alps_17086,JUPPEN SPITZE,,47.238889,10.107222,2412 +alps_17087,GUEMPLE SPITZE,,47.194444,10.196667,2518 +alps_17088,RAUHER KOPF,,47.195833,10.201389,2520 +alps_17089,RUEFI SPITZE,,47.191111,10.182222,2632 +alps_17090,KRABACH SPITZE,,47.195833,10.207778,2522 +alps_17091,RUFI KOPF,,47.201389,10.169722,2362 +alps_17092,SUEDLICHE WOESTER SPITZE,,47.207778,10.190833,2537 +alps_17093,NOERDLICHE WOESTER SPITZE,,47.212778,10.190278,2558 +alps_17094,MITTLERE WOESTER SPITZE,,47.210278,10.191389,2557 +alps_17095,WOESTER HORN,,47.225000,10.180556,2310 +alps_17096,MITTAG SPITZE,,47.241111,10.196111,2370 +alps_17097,SCHAEFER KOEPFE,,47.232500,10.192778,2416 +alps_17098,RAPPEN SPITZE,,47.236667,10.197500,2472 +alps_17099,KARALPE,,47.237222,10.146944,1840 +alps_17100,HOELLEN SPITZE,,47.243333,10.205278,2362 +alps_17101,KAR HORN,,47.248056,10.151111,2416 +alps_17102,RUEGGELE,,47.199444,10.214167,2270 +alps_17103,FLEISCH KOPF,,47.204167,10.258056,2472 +alps_17104,SCHWARZER KRANZ,,47.215000,10.268056,2494 +alps_17105,HOERLEMANNS KOPF,,47.229167,10.232222,2244 +alps_17106,LAERCH SPITZE,,47.223611,10.230833,2393 +alps_17107,ZWOELFER SPITZE,,47.187222,10.305000,2511 +alps_17108,ELFER SPITZE,,47.192222,10.309722,2421 +alps_17109,MUTTE KOPF,,47.216111,10.314167,2046 +alps_17110,HAHNES KOPF,,47.228611,10.315556,2210 +alps_17111,PIMIG,,47.224722,10.273611,2406 +alps_17112,ZWOELFER KOPF,,47.236111,10.326944,2310 +alps_17113,ALPLESPLEIS SPITZE,,47.196944,10.343333,2648 +alps_17114,FALLENBACHER SPITZE,,47.200556,10.390556,2723 +alps_17115,FEUER SPITZE,,47.200000,10.368889,2852 +alps_17116,WETTER SPITZE,,47.206389,10.369444,2895 +alps_17117,GUFLE SPITZE,,47.208611,10.337222,2577 +alps_17118,ETLER KOPF,,47.212222,10.373056,2693 +alps_17119,ROTSCHROFEN SPITZE,,47.220556,10.335000,2588 +alps_17120,MUTTLER KOPF,,47.219722,10.373333,2617 +alps_17121,GRIESTALER SPITZE,,47.227500,10.336389,2622 +alps_17122,TAJA SPITZE,,47.227500,10.375833,2538 +alps_17123,VORDERER SONNEN KOGEL,,47.248611,10.394444,2204 +alps_17124,HINTERER SONNEN KOGEL,,47.245000,10.386944,2324 +alps_17125,PEISCHEL SPITZE,,47.237500,10.345556,2424 +alps_17126,ROT SPITZE,,47.189444,10.422778,2837 +alps_17127,ROTE PLATTE,,47.193611,10.424722,2831 +alps_17128,FREI SPITZE,,47.200278,10.428889,2884 +alps_17129,SAXER SPITZE,,47.210833,10.439167,2690 +alps_17130,DREISCHARTL KOPF,,47.206667,10.424167,2440 +alps_17131,GREITJOCH SPITZE,,47.224444,10.405833,2321 +alps_17132,HINTERER SEEKOPF,,47.188889,10.479167,2718 +alps_17133,MITTLERER SEEKOPF,,47.191389,10.478611,2702 +alps_17134,VORDERER SEEKOPF,,47.192778,10.476389,2685 +alps_17135,SEESCHARTEN SPITZE,,47.195000,10.495556,2705 +alps_17136,SEE KOGEL,,47.204444,10.475833,2412 +alps_17137,KLEINBERG SPITZE,,47.202222,10.496944,2756 +alps_17138,GROSSBERG KOPF,,47.201667,10.510278,2612 +alps_17139,SCHIELER SPITZE,,47.208056,10.517778,2735 +alps_17140,OBER LAHM SPITZE,,47.213889,10.490278,2658 +alps_17141,LANDSCHAFTS SPITZE,,47.234167,10.515556,2507 +alps_17142,TOR SPITZE,,47.237778,10.494444,2622 +alps_17143,GRUENTAL SPITZE,,47.245833,10.520556,2399 +alps_17144,GROSS STEIN,,47.242222,10.491667,2632 +alps_17145,SEEBLESKAR SPITZE,,47.248889,10.481944,2539 +alps_17146,SONNENPLEIS KOPF,,47.193333,10.567500,2453 +alps_17147,KREUZJOCH SPITZE,,47.200278,10.557222,2672 +alps_17148,WESTLICHE SPIESSRUTEN SPITZE,,47.200833,10.521389,2703 +alps_17149,OESTLICHE SPIESSRUTEN SPITZE,,47.200833,10.525278,2699 +alps_17150,VILEID KOPF,,47.207222,10.568056,2496 +alps_17151,SCHOENPLEIS KOPF,,47.205556,10.547500,2549 +alps_17152,MEDRIOL KOPF,,47.213889,10.524167,2664 +alps_17153,BITTRICH KOPF,,47.216944,10.544167,2698 +alps_17154,LEITER SPITZE,,47.223056,10.521944,2750 +alps_17155,MITTEL KOPF,,47.226111,10.572500,2390 +alps_17156,GUFELGRAS JOCH,,47.228056,10.564167,2382 +alps_17157,STEINKAR SPITZE,,47.232778,10.573889,2650 +alps_17158,PARZINN SPITZE,,47.239167,10.575833,2613 +alps_17159,KOGELSEE SPITZE,,47.247778,10.565278,2647 +alps_17160,GARSEIL KOPF,,47.187500,10.616111,1305 +alps_17161,GRUBIG JOCH,,47.212778,10.613889,2586 +alps_17162,GAMSPLEIS,,47.221944,10.594444,2479 +alps_17163,WILDKARLE JOECHLI,,47.219722,10.614444,2616 +alps_17164,OBER EISEN KOPF,,47.218056,10.645000,2373 +alps_17165,BERGWERKS KOPF,,47.225000,10.608889,2728 +alps_17166,HANAUER SPITZE,,47.233889,10.604444,2553 +alps_17167,DREMEL SPITZE,,47.235000,10.595833,2733 +alps_17168,SCHNEEEKARLE SPITZE,,47.233611,10.587222,2641 +alps_17169,KLEIN SCHLENKER SPITZE,,47.243056,10.608611,2746 +alps_17170,GROSS SCHLENKER SPITZE,,47.248889,10.615278,2827 +alps_17171,LAAGGERS,,47.235000,10.678889,2328 +alps_17172,OEDKARLE KOPF,,47.248333,10.655278,2565 +alps_17173,MANN KOPF,,47.247500,10.674167,2171 +alps_17174,OBER KOGEL,,47.201944,10.729722,1669 +alps_17175,GROMBICHL,,47.225556,10.760278,988 +alps_17176,TSCHIRGANT,,47.241667,10.796389,2370 +alps_17177,AMBERG,,47.225556,10.882778,1590 +alps_17178,ACHER KOGEL,,47.189167,10.956667,3007 +alps_17179,ACHPLATTE,,47.188333,10.936944,2430 +alps_17180,WOERGEGRAT SPITZE,,47.196389,10.957778,2725 +alps_17181,WETTERKREUZ KOGEL,,47.205000,10.950000,2591 +alps_17182,RAUHER KOGEL,,47.216944,10.913056,1783 +alps_17183,NARREN KOPF,,47.230833,10.910278,1832 +alps_17184,ZWOELFER KOGEL,,47.190000,11.011111,2988 +alps_17185,HOCHWANNER,,47.201389,10.993056,2488 +alps_17186,MANING KOGEL,,47.191111,10.959722,2894 +alps_17187,DIE MUTE,,47.200556,11.017222,2398 +alps_17188,HINTER KARLES SPITZE,,47.200278,10.969444,2641 +alps_17189,VORDER KARLES SPITZE,,47.207500,10.972778,2574 +alps_17190,ZWOELFER KOEPFL,,47.220278,10.960833,2253 +alps_17191,SCHAFZOELLEN,,47.214444,10.974722,2399 +alps_17192,VORDER GRIES KOGEL,,47.226111,11.004722,2671 +alps_17193,PIRCH KOGEL,,47.231944,10.999167,2828 +alps_17194,IRZWAENDE,,47.232500,11.019167,2757 +alps_17195,HOCHWANNER,,47.239167,11.016944,2456 +alps_17196,PREDIGT STUHL,,47.246111,10.987222,2283 +alps_17197,TAJEN EGG,,47.244722,11.002500,2262 +alps_17198,STEINTAL SPITZE,,47.194167,11.038611,2741 +alps_17199,POCK KOGEL,,47.197778,11.042778,2807 +alps_17200,NEUNER KOGEL,,47.200278,11.033333,2640 +alps_17201,PLENDERLESSEE KOPF,,47.205556,11.044444,2590 +alps_17202,GAIS KOGEL,,47.204167,11.053889,2820 +alps_17203,MITTER GRAT,,47.211944,11.057500,2420 +alps_17204,HOCHALTER,,47.231389,11.030556,2678 +alps_17205,MUG KOGEL,,47.230000,11.037778,2693 +alps_17206,SCHARTEN KOGEL,,47.233056,11.070000,2602 +alps_17207,MITTERZEIGER KOPF,,47.241944,11.035833,2628 +alps_17208,RIETZER GRIES KOGEL,,47.245833,11.059444,2884 +alps_17209,UNSPITZE,,47.309167,10.093889,1926 +alps_17210,BAERENKOPF,,47.300278,10.135833,2083 +alps_17211,KLEINER WIDDERSTEIN,,47.290833,10.136389,2236 +alps_17212,WIDDERSTEIN,,47.284722,10.129167,2533 +alps_17213,HEITERBERG,,47.281944,10.090000,2188 +alps_17214,HOEFERBERG,,47.274167,10.101389,2131 +alps_17215,AUENFELDER HORN,,47.250556,10.140556,2292 +alps_17216,ZWOELFER,,47.306944,10.170833,2224 +alps_17217,ELFER,,47.302222,10.177778,2387 +alps_17218,WARTHER HORN,,47.251667,10.156667,2256 +alps_17219,HUNDSKOPF,,47.268333,10.212778,2050 +alps_17220,HOHES LICHT,,47.280278,10.276111,2651 +alps_17221,WILDMAHDSPITZE,,47.273333,10.296944,2489 +alps_17222,MUTTEKOPF,,47.275278,10.308889,2431 +alps_17223,WILDER KASTEN,,47.270000,10.287778,2542 +alps_17224,PEISCHELSPITZE,,47.271389,10.277778,2512 +alps_17225,ELLBOGNER SPITZE,,47.265278,10.272500,2552 +alps_17226,KROTTENKOPF,,47.311667,10.355833,2656 +alps_17227,RAMSTALLSPITZE,,47.302778,10.354722,2533 +alps_17228,HERMANNSKARSPITZE,,47.310000,10.376667,2472 +alps_17229,STRAHLKOPF,,47.294722,10.359167,2388 +alps_17230,ROTHORNSPITZE,,47.290000,10.359444,2393 +alps_17231,JOECHLSPITZE,,47.281667,10.359444,2226 +alps_17232,ROTWAND,,47.310278,10.429722,2262 +alps_17233,GARTENSPITZE,,47.262500,10.448889,2331 +alps_17234,RUITELSPITZE,,47.255556,10.446111,2580 +alps_17235,KARLESSPITZE,,47.273611,10.489722,2378 +alps_17236,WANNENSPITZE,,47.275278,10.488056,2362 +alps_17237,KLEINE SCHAFKARSPITZE,,47.261389,10.494167,2338 +alps_17238,GROSSE SCHAFKARSPITZE,,47.252778,10.494444,2532 +alps_17239,ZWOELFERSPITZE,,47.250833,10.465278,2594 +alps_17240,ELFERKOPF,,47.252500,10.478056,2311 +alps_17241,LICHTSPITZE,,47.300000,10.529444,2356 +alps_17242,UMSINNER,,47.299167,10.543333,2199 +alps_17243,ZIRMEBENJOCH,,47.293889,10.538333,2407 +alps_17244,SPITZKOPF,,47.286944,10.577778,2346 +alps_17245,SEITEKOPF,,47.282500,10.552778,2344 +alps_17246,WANNEKOPF,,47.282222,10.560000,2319 +alps_17247,HOCHGWAS,,47.281389,10.575000,2365 +alps_17248,TAJASPITZE,,47.267500,10.569722,2587 +alps_17249,BOCKKARSPITZEN,,47.256111,10.568333,2602 +alps_17250,PLATTIGSPITZEN,,47.251111,10.573889,2558 +alps_17251,KOGEL,,47.258056,10.555556,2318 +alps_17252,HABART,,47.293333,10.632778,2294 +alps_17253,REICHSPITZE,,47.264444,10.612778,2590 +alps_17254,BRUNNKARSPITZE,,47.249722,10.626389,2609 +alps_17255,ROTKOPF,,47.255278,10.641389,2692 +alps_17256,TSCHACHAUN,,47.308056,10.673056,2334 +alps_17257,MALDONGRAT,,47.298333,10.675000,2544 +alps_17258,GABELSPITZE,,47.302500,10.683056,2581 +alps_17259,ALPEILSPITZE,,47.306389,10.705833,2521 +alps_17260,FALSCHKOGEL,,47.294444,10.659722,2388 +alps_17261,MUTTEKOPF,,47.267222,10.651667,2774 +alps_17262,SCHARNITZKOEPFE,,47.275278,10.659167,2554 +alps_17263,MALDONKOPF,,47.274722,10.670000,2632 +alps_17264,SPARKETGRAT,,47.281111,10.688056,2418 +alps_17265,HINTERE PLATTEINSPITZE,,47.273056,10.678333,2723 +alps_17266,VORDERE PLATTEINSPITZE,,47.269722,10.690833,2562 +alps_17267,PLEISKOPF,,47.252222,10.651944,2560 +alps_17268,HEITERWAND,,47.307778,10.711111,2552 +alps_17269,RAUCHBERG,,47.304167,10.758889,2480 +alps_17270,ARZEINKOPF,,47.273889,10.708889,2143 +alps_17271,SINNESJOCH,,47.302778,10.775556,2273 +alps_17272,SCHIMMERING,,47.278056,10.866944,2096 +alps_17273,FIECHTER KOEPFL,,47.297500,11.013889,1032 +alps_17274,OBERALPL,,47.251111,11.053056,2613 +alps_17275,HOCHEDER,,47.252222,11.071389,2796 +alps_17276,SCHAFMAREBENKOGEL,,47.255278,11.080000,2651 +alps_17277,WALMENDIGER HORN,,47.326944,10.128333,1990 +alps_17278,MUTTELBERGKOPF,,47.324722,10.111111,1989 +alps_17279,OCHSENHOFER KOEPFE,,47.325000,10.093889,1950 +alps_17280,MUTTEKOPF,,47.344444,10.379722,2284 +alps_17281,MARCHSPITZE,,47.315278,10.374444,2609 +alps_17282,ILFENSPITZEN,,47.318056,10.387500,2552 +alps_17283,PLATTENSPITZE,,47.317778,10.394444,2489 +alps_17284,KANZBERG,,47.353056,10.408611,2009 +alps_17285,GLIEGERKARSPITZE,,47.334444,10.454444,2575 +alps_17286,SATTELKARSPITZE,,47.327778,10.447778,2552 +alps_17287,NOPPENSPITZE,,47.325833,10.441111,2594 +alps_17288,BETTERKARSPITZE,,47.334444,10.432500,2267 +alps_17289,KREUZKARSPITZE,,47.323889,10.425278,2587 +alps_17290,BALSCHTESPITZE,,47.323611,10.417778,2499 +alps_17291,PFEILER,,47.314167,10.457222,2206 +alps_17292,KLIMMSPITZE,,47.351667,10.506389,2464 +alps_17293,SCHWELLENSPITZE,,47.349167,10.491389,2496 +alps_17294,WASSERFALLKARSPITZE,,47.343889,10.485556,2557 +alps_17295,ZWOELFERSPITZE,,47.342778,10.473056,2416 +alps_17296,URBELESKARSPITZE,,47.336667,10.468611,2632 +alps_17297,BRETTERSPITZE,,47.333056,10.461944,2608 +alps_17298,MITTAGSPITZE,,47.356944,10.576944,2227 +alps_17299,ELMER MUTTEKOPF,,47.353333,10.579722,2350 +alps_17300,PFEILSPITZE,,47.330278,10.574167,2469 +alps_17301,ROTWAND,,47.326944,10.563333,2334 +alps_17302,FRAUENSPITZE,,47.361389,10.603611,2111 +alps_17303,TAUBERSPITZE,,47.356111,10.603889,2298 +alps_17304,BRUNNENKOPF,,47.357500,10.613333,2155 +alps_17305,ELMER KREUZSPITZE,,47.345833,10.591389,2480 +alps_17306,MITTLERE KREUZSPITZE,,47.336111,10.592778,2496 +alps_17307,BSCHLABER KREUZSPITZE,,47.331667,10.591389,2462 +alps_17308,EGGER MUTTEKOPF,,47.323056,10.607500,2311 +alps_17309,NAMLOSER WETTERSPITZE,,47.323056,10.641667,2553 +alps_17310,ORTKOPF,,47.313889,10.615278,2314 +alps_17311,KREUZJOCH,,47.313889,10.627778,2185 +alps_17312,SANDEGG,,47.359444,10.701389,2216 +alps_17313,SEELAKOPF,,47.351667,10.702222,2368 +alps_17314,ENGELSPITZE,,47.346944,10.693056,2291 +alps_17315,SCHLIEREKOPF,,47.342778,10.694722,2290 +alps_17316,RUDIGERKOPF,,47.336667,10.692500,2249 +alps_17317,RUDIGER,,47.329167,10.701667,2382 +alps_17318,KALTER STEIN,,47.352778,10.685833,2145 +alps_17319,DREI KOEPFE,,47.327500,10.657500,2229 +alps_17320,IMSTER MITTERBERG,,47.315556,10.670000,2118 +alps_17321,GEIREKOEPFE,,47.312778,10.693611,2303 +alps_17322,SCHLIEREWAND,,47.363056,10.708889,2217 +alps_17323,UNHEIMLICHER,,47.361667,10.765833,2189 +alps_17324,SCHOENBICHLKOPF,,47.355833,10.743889,1938 +alps_17325,ASERLIKOPF,,47.345556,10.746389,2282 +alps_17326,GAMPELSPITZE,,47.341389,10.747222,2325 +alps_17327,ASERLESPITZE,,47.340556,10.757500,2337 +alps_17328,KARLEKOPF,,47.342500,10.765278,2270 +alps_17329,TARRENTONSPITZE,,47.312222,10.723056,2608 +alps_17330,HAUPTGIPFEL,,47.313889,10.733333,2639 +alps_17331,OSTGIPFEL,,47.315278,10.747222,2471 +alps_17332,ALPLESKOPF,,47.316389,10.773611,2258 +alps_17333,BRUNNWALDKOPF,,47.322500,10.808611,1506 +alps_17334,GALTBERGSPITZE,,47.371111,10.772778,2391 +alps_17335,KAMINLOCHKOEPFE,,47.366667,10.775833,2345 +alps_17336,MITTLERES KREUZJOCH,,47.363611,10.780000,2321 +alps_17337,OESTLICHES KREUZJOCH,,47.364444,10.788333,2231 +alps_17338,TAGWEIDKOPF,,47.358056,10.776944,2408 +alps_17339,LOREAKOPF,,47.354167,10.771667,2471 +alps_17340,WANNIG,,47.336944,10.862222,2493 +alps_17341,HANDSCHUHSPITZE,,47.340278,10.882500,2319 +alps_17342,SONNENSPITZE,,47.367500,10.921944,2417 +alps_17343,SCHARTENKOPF,,47.359444,10.914444,2332 +alps_17344,WAMPETER SCHROFEN,,47.354444,10.914444,2520 +alps_17345,MARIENBERGSPITZEN,,47.350556,10.916111,2561 +alps_17346,GRUENSTEIN,,47.348889,10.921389,2661 +alps_17347,VORDERER TAJAKOPF,,47.365000,10.948333,2450 +alps_17348,HINTERER TAJAKOPF,,47.360278,10.948611,2408 +alps_17349,DRACHENKOPF,,47.357778,10.926389,2302 +alps_17350,WESTLICHE GRIESSPITZ,,47.349722,10.949722,2741 +alps_17351,OESTLICHE GRIESSPITZ,,47.352500,10.955278,2747 +alps_17352,HOELLKOPF,,47.341944,10.918333,2194 +alps_17353,ZAEUNLKOPF,,47.337500,10.918056,2155 +alps_17354,HOHER KOPF,,47.334722,10.914444,2121 +alps_17355,WANKSPITZE,,47.337778,10.939167,2209 +alps_17356,JOECHLE,,47.323333,10.928889,1786 +alps_17357,NISSKOGEL,,47.317500,10.922778,1710 +alps_17358,IGELSKOPF,,47.365833,10.970278,2224 +alps_17359,BREITENKOPF,,47.361667,10.987778,2469 +alps_17360,HOCHWAND,,47.358611,11.015833,2719 +alps_17361,MITTERSPITZEN,,47.354167,10.972500,2701 +alps_17362,HOHE MUNDE,,47.347778,11.071944,2662 +alps_17363,KARKOPF,,47.355278,11.027778,2469 +alps_17364,HOCHVOGEL,,47.380278,10.436944,2592 +alps_17365,KALBLEGGSPITZE,,47.431944,10.486111,2000 +alps_17366,SCHNATTERBACHKOPF,,47.392778,10.504444,2065 +alps_17367,HALDENSPITZE,,47.388611,10.510556,2220 +alps_17368,STALLKARSPITZE,,47.385278,10.502778,2350 +alps_17369,KLEINER ROSSZAHN,,47.393611,10.475278,2312 +alps_17370,GROSSER ROSSZAHN,,47.390000,10.468333,2356 +alps_17371,KLUPPENKARKOPF,,47.387222,10.468889,2355 +alps_17372,JOCHUMKOPF,,47.385000,10.475278,2337 +alps_17373,WESTLICHE ROSSKARSPITZE,,47.380556,10.486944,2292 +alps_17374,OESTLICHE ROSSKARSPITZE,,47.380000,10.490556,2291 +alps_17375,KROTTENKOEPFE,,47.435278,10.535556,2180 +alps_17376,SALDEINER SPITZE,,47.398889,10.532222,2036 +alps_17377,GRUBACH SPITZE,,47.383333,10.522778,2100 +alps_17378,HALLANDERBERG,,47.413889,10.640278,1971 +alps_17379,SCHARTENBERG,,47.411111,10.621944,2071 +alps_17380,MANDSPITZE,,47.410556,10.608333,1963 +alps_17381,SCHWARZHANSKARSPITZE,,47.405000,10.613056,2227 +alps_17382,MITTERGROTZENSPITZE,,47.399167,10.615000,2193 +alps_17383,MITTERKARSPITZE,,47.389444,10.621111,2191 +alps_17384,NEUALPSPITZE,,47.384444,10.634167,2143 +alps_17385,DUERREKOPFSPITZE,,47.380278,10.639167,2157 +alps_17386,RAUCHKOPF,,47.431667,10.696111,1624 +alps_17387,RAINBERG,,47.400556,10.673889,2020 +alps_17388,ABENDSPITZE,,47.398333,10.686667,1962 +alps_17389,GALTJOCH,,47.393889,10.675556,2109 +alps_17390,STEINKARSPITZE,,47.386389,10.663333,2181 +alps_17391,KNITTELKARSPITZE,,47.375556,10.651111,2376 +alps_17392,KELMER SPITZE,,47.379444,10.689722,2000 +alps_17393,RINTLJOCH,,47.424722,10.715833,2166 +alps_17394,THANELLER,,47.426389,10.724722,2341 +alps_17395,ACHSELJOCH,,47.426389,10.743889,2020 +alps_17396,LICHTEKOEPFL,,47.423056,10.766389,1463 +alps_17397,ALPKOPF,,47.415278,10.765278,1802 +alps_17398,KAMP,,47.392222,10.767500,2014 +alps_17399,NEEDERBERG JOCH,,47.388611,10.745556,2052 +alps_17400,VORDERE SUWALDSPITZE,,47.377500,10.751667,2155 +alps_17401,HINTERE SUWALDSPITZE,,47.375278,10.754722,2159 +alps_17402,STEINMANDLSPITZE,,47.377778,10.769722,2347 +alps_17403,MAEHBERGJOCH,,47.403056,10.807222,1926 +alps_17404,BLEISPITZE,,47.398056,10.818611,2225 +alps_17405,ROTER STEIN,,47.381944,10.773333,2366 +alps_17406,SCHAFSKOEPFLE,,47.381389,10.784444,2135 +alps_17407,GARTNER WAND,,47.385000,10.821111,2377 +alps_17408,BUCHSENTALJOCH,,47.434444,10.867500,2244 +alps_17409,UPSSPITZE,,47.431111,10.875000,2332 +alps_17410,DANIEL,,47.432778,10.880278,2340 +alps_17411,GRAENTJOCH,,47.428056,10.886111,2125 +alps_17412,KOHLBERG,,47.411944,10.883889,1419 +alps_17413,GRUBIGSTEIN,,47.383056,10.840556,2233 +alps_17414,HOCHWANNIGKOPF,,47.386667,11.019167,2234 +alps_17415,PREDIGTSTUHL,,47.383333,11.058333,2234 +alps_17416,PONTEN,,47.485833,10.451667,2045 +alps_17417,RONENSPITZE,,47.488333,10.468056,1990 +alps_17418,ROSSBERG,,47.480556,10.499722,1753 +alps_17419,GAISHORN,,47.470000,10.476389,2247 +alps_17420,ROTE SPITZE,,47.443056,10.500000,2130 +alps_17421,STEINKARSPITZE,,47.438611,10.505000,2065 +alps_17422,LACHENSPITZE,,47.440000,10.517778,2126 +alps_17423,VOGELHOERNLE,,47.480278,10.543889,1882 +alps_17424,LOCHGEHRENKOPF,,47.475278,10.531111,1790 +alps_17425,SULZSPITZE,,47.462500,10.536667,2084 +alps_17426,LITNISSCHROFEN,,47.466667,10.563333,2068 +alps_17427,SCHOCHENSPITZE,,47.452500,10.524167,2069 +alps_17428,LELLACHSPITZE,,47.438889,10.546389,2274 +alps_17429,KOLLENSPITZE,,47.498889,10.630278,2238 +alps_17430,SCHNEID,,47.493333,10.644722,2000 +alps_17431,HAHNENKAMM,,47.478333,10.641944,1938 +alps_17432,KRINNENSPITZE,,47.474167,10.585556,1999 +alps_17433,GAICHTSPITZE,,47.465833,10.639722,1986 +alps_17434,FUEHRENBERGALPE,,47.446389,10.586667,1720 +alps_17435,BLACHENSPITZE,,47.498056,10.664167,1965 +alps_17436,HORNBERGL,,47.472222,10.652778,1755 +alps_17437,SCHLOSSBERG,,47.460833,10.699167,1283 +alps_17438,TAUERN,,47.467778,10.762500,1841 +alps_17439,ZUNTERKOPF,,47.471389,10.758056,1811 +alps_17440,SINTWAG,,47.476389,10.716111,939 +alps_17441,GSCHWENTKOPF,,47.461389,10.736944,1314 +alps_17442,MAEUERLE,,47.461944,10.749167,1224 +alps_17443,RINNERSKOPF,,47.440278,10.727222,1536 +alps_17444,RAUCHKOPF,,47.442778,10.711667,1527 +alps_17445,SCHLLELESKOPF,,47.484444,10.792500,1722 +alps_17446,HOCHJOCH,,47.484722,10.806667,1823 +alps_17447,SCHROFENNAS,,47.467500,10.771667,1708 +alps_17448,SPIESS,,47.459722,10.819444,1846 +alps_17449,HOCHJOCH,,47.442500,10.792500,2019 +alps_17450,KOHLBERGSPITZE,,47.437778,10.800000,2202 +alps_17451,KESSELJOCH,,47.441111,10.818056,2126 +alps_17452,PITZENEGG,,47.443056,10.823611,2174 +alps_17453,SCHOENJOECHL,,47.495278,10.859167,1661 +alps_17454,FASELBERGKOPF,,47.465278,10.840000,1800 +alps_17455,LICHTBRENNTJOCH,,47.461389,10.834167,1961 +alps_17456,MITTELBERG,,47.468889,10.886111,1526 +alps_17457,SPITZIGER BRAND,,47.461667,10.891944,1816 +alps_17458,RAUHER,,47.448611,10.893889,1811 +alps_17459,HOCHSCHRUTTE,,47.445278,10.842222,2247 +alps_17460,NEUWEIDKOPF,,47.451944,10.850278,1766 +alps_17461,HOCHWANNER,,47.443611,10.882222,2085 +alps_17462,EINSTEIN,,47.522222,10.513611,1866 +alps_17463,BRENTENJOCH,,47.532222,10.582500,2000 +alps_17464,ZEICHENKOPF,,47.520556,10.572500,1864 +alps_17465,LUMBERGER GRAT,,47.515833,10.578611,1860 +alps_17466,RAPPENSCHROFEN,,47.518611,10.537222,1551 +alps_17467,ROTER STEIN,,47.543889,10.596389,1547 +alps_17468,ROSSBERG,,47.535000,10.590000,1945 +alps_17469,WILDBOEDEN,,47.523333,10.618889,1803 +alps_17470,GROSSE SCHLICKE,,47.518333,10.623611,2059 +alps_17471,KARRETSCHROFEN,,47.518611,10.631111,2034 +alps_17472,VILSER KEGEL,,47.530278,10.621667,1831 +alps_17473,HAHNENKOPF,,47.512222,10.606944,1942 +alps_17474,LAEUFERSPITZE,,47.510000,10.597778,1956 +alps_17475,GIMPEL,,47.501389,10.612778,2173 +alps_17476,ROTE FLUEH,,47.499722,10.608611,2108 +alps_17477,SCHARTSCHROFEN,,47.503611,10.602500,1968 +alps_17478,RANZEN,,47.543611,10.655556,1002 +alps_17479,SIEBELER,,47.523611,10.691944,1047 +alps_17480,GEHRENSPITZE,,47.500278,10.655278,2163 +alps_17481,HAEHLEKOPF,,47.509167,10.667778,1760 +alps_17482,STEINEBERG,,47.504444,10.724444,949 +alps_17483,KREUZKOPF,,47.520278,10.813056,1910 +alps_17484,GUGGER,,47.514722,10.816944,1863 +alps_17485,ALTENBERGKOPF,,47.505000,10.827778,1574 +alps_17486,GEIERKOEPFE,,47.519167,10.875000,2161 +alps_17487,SCHRANDELE,,47.054444,11.111667,3392 +alps_17488,NOERDLICHE WILDGRAT SPITZE,,47.050000,11.116944,3320 +alps_17489,SCHRANKAR KOGEL,,47.051667,11.103611,3332 +alps_17490,SUEDLICHE WILDGRAT SPITZE,,47.045556,11.118333,3274 +alps_17491,WESTLICHE SEESPITZE,,47.047500,11.142500,3354 +alps_17492,RUDERHOF SPITZE,,47.039444,11.143056,3474 +alps_17493,OESTLICHE SCHWARZENBERG SPITZE,,47.031111,11.120278,3379 +alps_17494,WESTLICHE SCHWARZENBERG SPITZE,,47.031944,11.116111,3364 +alps_17495,HOELLTAL SPITZE,,47.026389,11.120833,3279 +alps_17496,MUTTERBERGER SEESPITZE,,47.023333,11.108889,3302 +alps_17497,BOCK KOGEL,,47.022778,11.094722,3095 +alps_17498,NOERDLICHER DAUN KOGEL,,47.015278,11.098611,3075 +alps_17499,HINTERER DAUN KOPF,,47.004167,11.096389,3225 +alps_17500,VORDERER DAUN KOPF,,47.006111,11.113889,2879 +alps_17501,EGESEN GRAT,,47.001667,11.135556,2631 +alps_17502,VORDERE PLATTEN SPITZE,,47.058056,11.181389,2936 +alps_17503,FALBESONER KNOTEN SPITZE,,47.061389,11.175833,3118 +alps_17504,ALPEINER KNOTEN SPITZE,,47.060556,11.167778,3233 +alps_17505,M.KRAEUL SPITZE,,47.054444,11.157222,3303 +alps_17506,N.KRAEUL SPITZE,,47.055278,11.163333,3285 +alps_17507,H.PLATTEN SPITZE,,47.054444,11.171111,3070 +alps_17508,GREIT SPITZE,,47.046667,11.201944,2784 +alps_17509,OESTLICHE SEESPITZE,,47.049167,11.151667,3416 +alps_17510,PFANDL NIEDER,,47.042778,11.189722,2786 +alps_17511,PFANDL SPITZE,,47.039167,11.181389,3026 +alps_17512,NOCK WAND,,47.036667,11.174722,3092 +alps_17513,GRABA WAND,,47.037778,11.159167,3163 +alps_17514,OBERER DAUNBICHL,,47.032222,11.195833,2455 +alps_17515,GAMS SPITZE,,47.031944,11.155278,3097 +alps_17516,MAIR SPITZE,,47.005278,11.205556,2780 +alps_17517,ROT SPITZL,,47.050278,11.263889,2379 +alps_17518,OCHSEN KOGEL,,47.027222,11.260556,3029 +alps_17519,AEUSSERE WETTER SPITZE,,47.007500,11.254722,3070 +alps_17520,NOERDLICHE ROETEN SPITZE,,47.025000,11.254444,2924 +alps_17521,S.ROETEN SPITZE,,47.019444,11.253889,2981 +alps_17522,LAUTERSEE JOCH,,47.000833,11.247500,2761 +alps_17523,ILM SPITZE,,47.057222,11.330278,2692 +alps_17524,MANTELER,,47.057778,11.289167,2811 +alps_17525,KALK WAND,,47.046389,11.319444,2564 +alps_17526,SCHAUFEL SPITZL,,47.051667,11.293056,2833 +alps_17527,HABICHT,,47.043611,11.289722,3277 +alps_17528,GLAETTE SPITZE,,47.036944,11.281111,3133 +alps_17529,PRAMAR SPITZE,,47.023333,11.291667,2511 +alps_17530,GARGGLERIN,,47.008611,11.328889,2470 +alps_17531,SCHNABELE,,47.002500,11.318056,2451 +alps_17532,ZEISSPITZE,,47.036389,11.364722,2219 +alps_17533,HOHES TOR,,47.023056,11.358611,2636 +alps_17534,ROTENSPITZE,,47.029167,11.386944,2481 +alps_17535,AM HOHEN KREUZ,,47.020833,11.380556,2486 +alps_17536,MUTTENKOPF,,47.017222,11.369167,2638 +alps_17537,KREUZJOECHL,,47.015000,11.361944,2650 +alps_17538,NOESSLACHJOCH,,47.058056,11.441389,2231 +alps_17539,LEITNERBERG,,47.041667,11.417222,2309 +alps_17540,NIEDERERBERG,,47.003889,11.450000,2196 +alps_17541,PADAUNER KOGEL,,47.042778,11.507500,2066 +alps_17542,SATTELBERG,,47.010833,11.478889,2115 +alps_17543,ULTENSPITZE,,47.054444,11.547222,2179 +alps_17544,RIEPENSPITZE,,47.055833,11.569722,2460 +alps_17545,GAMMERSPITZE,,47.054722,11.574722,2537 +alps_17546,SILLESKOGEL,,47.021944,11.554444,2418 +alps_17547,ROSSGRUBENKOFEL,,47.021944,11.547500,2450 +alps_17548,PADAUNER BERG,,47.022222,11.528889,2230 +alps_17549,SAXALMWAND,,47.013056,11.566111,2635 +alps_17550,GRAWAND KOFEL,,47.003056,11.635278,2835 +alps_17551,KRAXENTRAGER,,47.005278,11.590000,2999 +alps_17552,KLUPPEN,,47.006667,11.603611,2940 +alps_17553,PFITSCH SCHARTE,,47.009167,11.608333,2742 +alps_17554,HOHE WAND,,47.013333,11.627500,3289 +alps_17555,SAGWAND SPITZE,,47.025000,11.628611,3227 +alps_17556,HOHE WARTE,,47.027500,11.620000,2943 +alps_17557,SCHRAMMACHER,,47.026944,11.643056,3410 +alps_17558,HOHE KIRCHE,,47.032778,11.608056,2634 +alps_17559,GAMPES SPITZE,,47.059444,11.584722,2624 +alps_17560,KAHLWAND SPITZE,,47.055833,11.613611,2546 +alps_17561,KAELBERLAHNER SPITZE,,47.002778,11.705556,2928 +alps_17562,KLEINER HOCHSTELLER,,47.010833,11.701111,2860 +alps_17563,KELLER KOPF,,47.007500,11.656111,2648 +alps_17564,AMEIS KOPF,,47.023056,11.665278,2553 +alps_17565,SCHRAMER KOPF,,47.035833,11.673056,2764 +alps_17566,FUSS STEIN,,47.046667,11.649722,3380 +alps_17567,FALSCHER KASERER,,47.056944,11.657222,3254 +alps_17568,GROSSER KASERER,,47.060278,11.657778,3263 +alps_17569,OLPERER,,47.053056,11.658889,3476 +alps_17570,TALGGEN KOEPFE,,47.013333,11.762500,3179 +alps_17571,GROSS GREINER,,47.019722,11.753611,3199 +alps_17572,KLEIN GREINER,,47.024444,11.741111,2959 +alps_17573,GREINER MAUER,,47.029167,11.735556,2883 +alps_17574,ZWEISEL KOPF,,47.041389,11.736111,2584 +alps_17575,FURTSCHAGL SPITZE,,47.004444,11.773611,3190 +alps_17576,STEINMANDL,,47.011944,11.811667,2634 +alps_17577,SCHOENBICHLER HORN,,47.008611,11.772778,3134 +alps_17578,SCHOENBICHL,,47.023611,11.784722,2263 +alps_17579,ROT KOPF,,47.043333,11.822778,2985 +alps_17580,PLATTEN KOPF,,47.047222,11.828611,2891 +alps_17581,OCHSNER,,47.043889,11.815556,3107 +alps_17582,HENNSTEIGEN SPITZE,,47.045556,11.803611,3002 +alps_17583,GROSS INGENT,,47.056389,11.787778,2917 +alps_17584,KLEIN INGENT,,47.058611,11.780000,2840 +alps_17585,SCHWARZENBACH SPITZE,,47.005556,11.876389,3254 +alps_17586,I HORNSPITZE,,47.000278,11.852500,3172 +alps_17587,III HORNSPITZE,,47.002500,11.845000,3254 +alps_17588,SCHWARZENSTEIN,,47.010000,11.874167,3369 +alps_17589,FELSKOPFL,,47.016111,11.880556,3235 +alps_17590,WESTLICHE FLOITEN SPITZE,,47.020278,11.895278,3195 +alps_17591,TRIBBACH KOPF,,47.016389,11.892778,3111 +alps_17592,GROSS MORCHNER,,47.031111,11.865278,3285 +alps_17593,KLEIN MORCHNER,,47.037222,11.856944,3198 +alps_17594,SUEDLICHE MORCHENSCH,,47.041667,11.850833,2960 +alps_17595,ROSS KOPFE,,47.047222,11.843611,3031 +alps_17596,NOERDLICHE MORCHENSCH,,47.043889,11.850000,2962 +alps_17597,ZSIGMONDY SPITZE,,47.050278,11.838333,3089 +alps_17598,GIGALITZ,,47.057778,11.891389,3001 +alps_17599,SCHAUFLER,,47.002222,11.929167,2265 +alps_17600,RAUHER KOPF,,47.010556,11.956111,2147 +alps_17601,OESTLICHE FLOITEN SPITZE,,47.023056,11.901389,3150 +alps_17602,TRIBBACH SPITZE,,47.028611,11.914722,3271 +alps_17603,OBWASSERER,,47.027222,11.950278,2910 +alps_17604,GROSS LOEFFLER,,47.032500,11.915833,3379 +alps_17605,KEILBACH SPITZE,,47.033333,11.947222,3094 +alps_17606,KASSELER SPITZE,,47.038611,11.951667,2952 +alps_17607,KLEIN LOEFFLER,,47.036667,11.911667,3224 +alps_17608,GREIZER SPITZE,,47.047222,11.903333,3010 +alps_17609,GRUENE WANDSPITZE,,47.043333,11.956944,2946 +alps_17610,LAPEN SPITZE,,47.051389,11.900000,2996 +alps_17611,BEIM MANDL,,47.032222,11.991944,2420 +alps_17612,MOOS KOPF,,47.025278,11.997222,2214 +alps_17613,LAERCHEN EGG,,47.033056,12.018333,2197 +alps_17614,GFALLEN SPITZE,,47.040278,11.968889,2966 +alps_17615,ROTWAND SPITZE,,47.041667,11.985278,3050 +alps_17616,KNOSPE,,47.040556,12.013056,2392 +alps_17617,WOLLBACH JOCH,,47.044722,11.971944,2832 +alps_17618,HOLLENZ KOFEL,,47.048611,12.003333,2785 +alps_17619,HOLLENZ KOPF,,47.046944,11.985833,3194 +alps_17620,WOLLBACH SPITZE,,47.050000,11.979722,3209 +alps_17621,HINTERE STANGEN SPITZE,,47.057222,11.976111,3225 +alps_17622,LUTTER KOPF,,47.004167,12.048611,2310 +alps_17623,FADEN,,47.038056,12.066111,2288 +alps_17624,MUSLAHNER,,47.036667,12.029444,2209 +alps_17625,SPEIKKOFEL,,47.047500,12.021667,2591 +alps_17626,NAPFE,,47.050833,12.031111,2734 +alps_17627,SONNWAND,,47.054722,12.032222,2837 +alps_17628,ZATL KOPF,,47.051111,12.042778,2682 +alps_17629,LOEFFEL SPITZE,,47.061111,12.055556,3009 +alps_17630,NAPF SPITZE,,47.060000,12.039722,3144 +alps_17631,GRIESBACH JOCH,,47.061111,12.046111,2899 +alps_17632,VORDERER WILDER TURM,,47.064444,11.118056,3177 +alps_17633,HINTERER WILDER TURM,,47.064167,11.110278,3294 +alps_17634,LAENGENTALER WEISSER KOGEL,,47.070000,11.086111,3217 +alps_17635,WILDES HINTERBERGL,,47.070556,11.106944,3288 +alps_17636,VORDERES HINTERBERGL,,47.074444,11.119167,3131 +alps_17637,HINTERER BRUNNEN KOGEL,,47.073889,11.103056,3325 +alps_17638,BACHFALLEN KOPF,,47.073611,11.087778,3178 +alps_17639,LANGENTAL JOCH,,47.071389,11.096111,2988 +alps_17640,BERGLAS SPITZE,,47.080556,11.128611,3123 +alps_17641,VORDERER BRUNNEN KOGEL,,47.083056,11.105278,3304 +alps_17642,LUESENER SPITZE,,47.088056,11.110833,3231 +alps_17643,RIMMEN SPITZE,,47.085556,11.141111,2999 +alps_17644,LUESENER FERNER KOGEL,,47.096389,11.115278,3298 +alps_17645,GRUBEN WAND,,47.117778,11.084722,3173 +alps_17646,SCHOENTAL SPITZE,,47.121944,11.094444,3002 +alps_17647,OESTLICHE KNOTEN SPITZE,,47.064444,11.182500,3101 +alps_17648,UELASGRAT SPITZE,,47.068611,11.189444,3038 +alps_17649,SCHRIMMEN KOPF,,47.068611,11.198333,2907 +alps_17650,PLATZEN KOPF,,47.086389,11.201389,2387 +alps_17651,BLECHNER KAMP,,47.094444,11.151389,2995 +alps_17652,KREUZ KAMP,,47.091667,11.147500,3008 +alps_17653,SCHAF GRUEBLER,,47.100833,11.160278,2922 +alps_17654,SCHALDERS SPITZE,,47.109167,11.183889,2784 +alps_17655,VILLER SPITZE,,47.106389,11.165556,3087 +alps_17656,LUSENER VILLER SPITZE,,47.115278,11.160000,3027 +alps_17657,HOCHGRAFFL JOCH,,47.121111,11.167778,2693 +alps_17658,BASSLER JOCH,,47.071111,11.210278,2829 +alps_17659,BRENNER SPITZE,,47.083889,11.226944,2877 +alps_17660,KERRACH SPITZE,,47.081667,11.216667,2918 +alps_17661,MITTERGRAT SPITZE,,47.087500,11.230556,2746 +alps_17662,KUEHSTEIN,,47.090833,11.208611,2364 +alps_17663,KELDERER,,47.065278,11.296667,2694 +alps_17664,ZWOELFER SPITZE,,47.076667,11.299722,2562 +alps_17665,ELFER SPITZE,,47.082222,11.312778,2505 +alps_17666,SERLES,,47.123889,11.381389,2717 +alps_17667,LAEMPERMAHDSPITZE,,47.111389,11.377222,2595 +alps_17668,OBER DER MAUER,,47.106667,11.374167,2520 +alps_17669,KESSELSPITZE,,47.100556,11.364722,2728 +alps_17670,PEILSPITZE,,47.102500,11.390556,2392 +alps_17671,WASENWAND,,47.087778,11.357500,2563 +alps_17672,ROTERKOPF,,47.093889,11.358611,2526 +alps_17673,HOHE BURG,,47.074722,11.377778,2198 +alps_17674,HAMMERSPITZE,,47.078889,11.353056,2631 +alps_17675,KIRCHDACH,,47.067222,11.341944,2840 +alps_17676,PADASTERKOGEL,,47.072500,11.365556,2301 +alps_17677,WEISSE WAND,,47.118889,11.420278,1830 +alps_17678,BLASER,,47.106111,11.411667,2241 +alps_17679,SCHEIBENSPITZE,,47.105278,11.571944,2489 +alps_17680,SCHAFSEITENSPITZE,,47.102778,11.554444,2602 +alps_17681,SUNNTIGER,,47.105278,11.537500,2400 +alps_17682,BENTLSTEIN,,47.103333,11.522500,2436 +alps_17683,SUMPFKOPF,,47.086389,11.536944,2341 +alps_17684,REISSENSCHUH,,47.093889,11.552778,2470 +alps_17685,HOHE WARTE,,47.115833,11.588611,2398 +alps_17686,GAMSKARSPITZE,,47.122778,11.638889,2750 +alps_17687,HORNSPITZE,,47.102500,11.635833,2650 +alps_17688,JOCHGRUBENKOPF,,47.090278,11.608611,2453 +alps_17689,SCHOENLAHNERSPITZE,,47.083333,11.619722,2424 +alps_17690,SCHOEBERSPITZEN,,47.074444,11.624444,2602 +alps_17691,HOHE WARTE,,47.062500,11.589444,2687 +alps_17692,GEFRORENE WAND SPITZE,,47.064722,11.678889,3288 +alps_17693,KLEINER KASERER,,47.068333,11.646111,3093 +alps_17694,LARMSTANGE,,47.080000,11.654444,2686 +alps_17695,HOHER RIFFLER,,47.081111,11.704444,3231 +alps_17696,KLEEGRUBE,,47.086389,11.677778,2218 +alps_17697,PFANN KOEPFL,,47.100556,11.651389,2388 +alps_17698,SCHMITTEN BERG,,47.105278,11.705833,2731 +alps_17699,WAND SPITZE,,47.121389,11.656389,2614 +alps_17700,GSCHUETZ SPITZE,,47.123333,11.649722,2710 +alps_17701,PETERS KOPF,,47.069444,11.710000,2679 +alps_17702,KLEIN RIFFLER,,47.077778,11.722500,2837 +alps_17703,REAL SPITZE,,47.102222,11.730833,3039 +alps_17704,ROSS KOPF,,47.109722,11.742222,2971 +alps_17705,NEST SPITZE,,47.115556,11.757778,2966 +alps_17706,HINTER GRINBERG SPITZE,,47.118611,11.766389,2870 +alps_17707,HOELLENSTEIN,,47.113611,11.724444,2874 +alps_17708,KELLER KOPF,,47.068056,11.829444,2722 +alps_17709,FRIDERICH,,47.076111,11.826389,2638 +alps_17710,TRENKER,,47.071667,11.793333,2399 +alps_17711,LAPPEN KOPF,,47.071389,11.827222,2710 +alps_17712,BRETTER KOGEL,,47.076389,11.790833,2251 +alps_17713,GRINBERG SPITZE,,47.122500,11.771389,2867 +alps_17714,KREUZ SPITZE,,47.062778,11.886111,2886 +alps_17715,BIRBERG SPITZE,,47.071667,11.881389,2849 +alps_17716,TOIFLER,,47.078056,11.873889,2727 +alps_17717,FLOITEN TURM,,47.088889,11.869167,2805 +alps_17718,SCHLIERER SPITZE,,47.095556,11.864167,2687 +alps_17719,BLASER,,47.104167,11.854722,2695 +alps_17720,DRISTNER,,47.113333,11.839444,2767 +alps_17721,ROFEL SPITZE,,47.099444,11.860833,2714 +alps_17722,TOREGGEN KOPF,,47.123889,11.895278,2470 +alps_17723,MADEREGG SPITZE,,47.091389,11.958056,3050 +alps_17724,GRUND SCHARTNER,,47.100556,11.954444,3065 +alps_17725,MUGLER,,47.105278,11.942222,2958 +alps_17726,WILHELMER,,47.109722,11.933611,2937 +alps_17727,POPBERG SPITZE,,47.116111,11.926667,2891 +alps_17728,VORDERE STANGEN SPITZE,,47.068056,11.974167,3127 +alps_17729,ROSSWAND SPITZE,,47.083056,11.959722,3157 +alps_17730,MULLNER,,47.106944,11.967500,2818 +alps_17731,GRUENKARL EGG,,47.105278,11.982500,2454 +alps_17732,STANGE,,47.120000,11.979444,2635 +alps_17733,HOHE WARTE,,47.076111,12.035556,3097 +alps_17734,KLEIN SPITZE,,47.088333,12.080278,3169 +alps_17735,HAHN,,47.108056,12.027500,2453 +alps_17736,S.MAGNER KOPF,,47.100278,12.074444,2892 +alps_17737,N.MAGNER KOPF,,47.101389,12.071667,2878 +alps_17738,GROSS MAGNER,,47.103333,12.067778,2873 +alps_17739,ZISCHGELES,,47.131389,11.095000,3004 +alps_17740,OBERST KOGEL,,47.132778,11.111944,2767 +alps_17741,LAMPSEN SPITZE,,47.155833,11.095833,2876 +alps_17742,GRIES KOGEL,,47.168611,11.110833,2710 +alps_17743,FREIHUT,,47.182500,11.118889,2625 +alps_17744,HOHE ROETE,,47.125000,11.170833,2855 +alps_17745,GALLWIESER MITTERGRAT,,47.131667,11.168333,2843 +alps_17746,ROTER KOGEL,,47.137778,11.169167,2832 +alps_17747,KASTEN GRAT,,47.140556,11.190556,2648 +alps_17748,WENTEN,,47.156667,11.181111,2641 +alps_17749,SCHELLEN BERG,,47.157778,11.207222,2108 +alps_17750,WIND EGG,,47.175833,11.181667,2577 +alps_17751,GAMS KOGEL,,47.142778,11.260000,2659 +alps_17752,SCHWARZ HORN,,47.135556,11.227500,2812 +alps_17753,SCHAF KOGEL,,47.144444,11.231389,2572 +alps_17754,SCHAFLEGER KOGEL,,47.154444,11.237222,2405 +alps_17755,ANGERBERG KOPF,,47.162778,11.238333,2399 +alps_17756,SONNTAGS KOEPFL,,47.166667,11.263611,2096 +alps_17757,HOHER BURGSTALL,,47.133333,11.281111,2611 +alps_17758,RIEPEN WAND,,47.148889,11.274444,2774 +alps_17759,GROSSE OCHSEN WAND,,47.154167,11.278889,2699 +alps_17760,KLEINE OCHSEN WAND,,47.159722,11.279167,2553 +alps_17761,STEINGRUBEN WAND,,47.168056,11.285833,2578 +alps_17762,STEINGRUBEN KOGEL,,47.163333,11.282500,2633 +alps_17763,MARCHREISEN SPITZE,,47.172778,11.308889,2620 +alps_17764,MALGRUBEN SPITZE,,47.171667,11.296667,2571 +alps_17765,HOCHTENN SPITZE,,47.170833,11.290278,2549 +alps_17766,WIDDERS BERG,,47.180000,11.298056,2327 +alps_17767,AMPFER STEIN,,47.174167,11.313333,2556 +alps_17768,HOADL,,47.183333,11.281389,2340 +alps_17769,SCHNEIDER SPITZE,,47.185000,11.308611,2156 +alps_17770,KRINNEN KOEPFE,,47.147222,11.308333,2139 +alps_17771,NEDERJOCH,,47.183056,11.337222,2142 +alps_17772,JOCHKREUZ,,47.183611,11.346111,2045 +alps_17773,SONNENSTEIN,,47.130556,11.376944,2441 +alps_17774,WALDRASTER JOECHL,,47.137222,11.406944,1878 +alps_17775,UBERFALLGRUENDL,,47.184722,11.493333,2302 +alps_17776,MISLKOPF,,47.156944,11.518889,2633 +alps_17777,KREUZSPITZE,,47.185000,11.536389,2746 +alps_17778,ROSENJOCH,,47.180000,11.543333,2796 +alps_17779,GRUENBERGSPITZE,,47.173889,11.547222,2790 +alps_17780,GRAFMARTSPITZE,,47.171389,11.552500,2720 +alps_17781,SEEKARSPITZE,,47.183056,11.582500,2645 +alps_17782,SONNENSPITZE,,47.171389,11.574722,2619 +alps_17783,SEEBLESSPITZE,,47.165833,11.531389,2628 +alps_17784,RAUHER KAMM,,47.161111,11.521667,2645 +alps_17785,MOLSER BERG,,47.182500,11.621944,2479 +alps_17786,KLAMMSPITZEN,,47.164444,11.621944,2512 +alps_17787,TARNTALER KOEPFE,,47.158056,11.622222,2757 +alps_17788,LIZUMER SONNENSPITZE,,47.153333,11.631111,2831 +alps_17789,MOELSER SONNENSPITZE,,47.166667,11.610556,2490 +alps_17790,GEIER,,47.140000,11.632778,2857 +alps_17791,LIZUMER RECKNER,,47.143889,11.630833,2886 +alps_17792,NAVISER RECKNER,,47.143889,11.624167,2824 +alps_17793,KREUZJOECHL,,47.132222,11.598056,2536 +alps_17794,SAGENHORST,,47.133611,11.633889,2713 +alps_17795,BLEIJAEGERSPITZE,,47.126667,11.634444,2660 +alps_17796,TORWAND,,47.158889,11.666389,2771 +alps_17797,KALKWAND,,47.153889,11.661667,2826 +alps_17798,TORSPITZE,,47.180000,11.672222,2663 +alps_17799,GRAUE WAND,,47.171111,11.662778,2594 +alps_17800,GRUEBLSPITZE,,47.157500,11.693056,2395 +alps_17801,MADSEITBERG,,47.138611,11.681667,2292 +alps_17802,HOCHWARTSPITZE,,47.134167,11.666389,2491 +alps_17803,DUNKLE SPITZE,,47.133889,11.654722,2479 +alps_17804,AM FLACH,,47.136944,11.740833,2248 +alps_17805,LAPPIN,,47.128056,11.758889,2430 +alps_17806,WANGLSPITZE,,47.184167,11.775278,2420 +alps_17807,PENKEN,,47.168889,11.800000,2095 +alps_17808,LACHTALSPITZL,,47.136944,11.772778,2259 +alps_17809,SPITZEGG,,47.131667,11.773611,2647 +alps_17810,FILZEN KOGEL,,47.131667,11.883056,2227 +alps_17811,HOLLENZ BERG,,47.176667,11.891667,1621 +alps_17812,AHORN SPITZE,,47.128889,11.918056,2973 +alps_17813,TRENKNER,,47.134167,11.939444,2666 +alps_17814,SCHAFKAR SPITZE,,47.140000,11.913611,2397 +alps_17815,TRENTNER KIRCHL,,47.138611,11.936389,2481 +alps_17816,TORHELM,,47.180000,11.956111,2452 +alps_17817,KLEIN KOLM,,47.172222,11.946944,2223 +alps_17818,GEIS KOPF,,47.179167,11.937222,2277 +alps_17819,HOCHFELD,,47.183333,11.925000,2350 +alps_17820,SEICHEN KOPF,,47.186111,11.955278,2270 +alps_17821,HOEHENBERGKAR KOPF,,47.151111,12.020278,2791 +alps_17822,PFANNSTIEL KOPF,,47.165556,12.017222,2528 +alps_17823,KEHL KOPF,,47.175833,12.013056,2230 +alps_17824,HOCHSTEIN FLACHE,,47.158611,11.997778,2769 +alps_17825,AUSSERER FALK,,47.165556,11.984444,2668 +alps_17826,INNERER FALK,,47.163889,11.989444,2661 +alps_17827,BRANDBERGER KOLM,,47.172500,11.962500,2699 +alps_17828,SCHAF KOGEL,,47.184444,12.010000,2097 +alps_17829,PLATT KOPF,,47.132778,12.063889,2594 +alps_17830,SCHNEEKAR KOPF,,47.141111,12.035556,2830 +alps_17831,AUKAR KOPF,,47.138611,12.041389,2736 +alps_17832,SCHOENACH SCHNEID,,47.143611,12.070000,3001 +alps_17833,ROT KOPF,,47.143056,12.030000,2819 +alps_17834,ZILLER KOPF,,47.148333,12.059444,2995 +alps_17835,STEINKAR KOPF,,47.156111,12.055278,2740 +alps_17836,SCHWARZER KOPF,,47.162222,12.053056,2778 +alps_17837,KUGLATER HAUER,,47.173611,12.044167,2610 +alps_17838,WECHSEL SPITZE,,47.179444,12.040000,2637 +alps_17839,MUTEN KOGEL,,47.196389,11.083889,2420 +alps_17840,KOFLER SPITZEN,,47.218056,11.130000,2663 +alps_17841,PEIDER SPITZE,,47.219722,11.121667,2808 +alps_17842,MITTER KOGEL,,47.223333,11.142222,2581 +alps_17843,SCHLOSS KOEPFE,,47.228333,11.128056,2660 +alps_17844,FLAURLINGER ROSS KOGEL,,47.224722,11.102778,2808 +alps_17845,METZEN,,47.226111,11.086389,2583 +alps_17846,BRECHTEN,,47.243056,11.131944,2419 +alps_17847,WEISS STEIN,,47.219722,11.148611,2640 +alps_17848,RANGGER KOEPFL,,47.242500,11.181389,1939 +alps_17849,GRIES KOGEL,,47.188056,11.245278,2158 +alps_17850,SAILE,,47.191944,11.325278,2404 +alps_17851,PLEISEN,,47.192500,11.280833,2236 +alps_17852,SPITZMANDL,,47.196667,11.333611,2206 +alps_17853,BERGISL,,47.246667,11.400000,746 +alps_17854,LANSER KOPF,,47.245000,11.418333,930 +alps_17855,NEUNERSPITZE,,47.216944,11.502778,2285 +alps_17856,VIGGARSPITZE,,47.213333,11.499167,2306 +alps_17857,PATSCHERKOFEL,,47.208333,11.460833,2260 +alps_17858,MORGENKOGEL,,47.187222,11.508611,2607 +alps_17859,SCHARTENKOGEL,,47.219167,11.536944,2311 +alps_17860,GLUNGEZER,,47.207500,11.528889,2677 +alps_17861,GAMSLAHNERSPITZE,,47.198333,11.532222,2681 +alps_17862,WATTENSPITZE,,47.232222,11.591667,2321 +alps_17863,ROSSKOPF,,47.224167,11.590278,2382 +alps_17864,HANEBURGER,,47.212222,11.585000,2596 +alps_17865,MALGRUEBLER,,47.200556,11.588611,2749 +alps_17866,SAGSPITZE,,47.233056,11.651111,2401 +alps_17867,ROTE WAND,,47.248889,11.648056,2252 +alps_17868,WILDOFEN,,47.224722,11.674167,2553 +alps_17869,HIRZER,,47.217778,11.663333,2725 +alps_17870,GRAFENNSSPITZE,,47.210278,11.664722,2619 +alps_17871,HOBARJOCH,,47.205000,11.703611,2512 +alps_17872,ALMKOGEL,,47.200000,11.690278,2419 +alps_17873,HIPPOLDSPITZE,,47.197778,11.667222,2642 +alps_17874,EISKARSPITZE,,47.190000,11.665278,2611 +alps_17875,ROSSLAUFSPITZE,,47.239167,11.724444,2248 +alps_17876,PFAFFENBICHL,,47.242222,11.755278,2431 +alps_17877,HOHER KOPF,,47.228056,11.728056,2373 +alps_17878,NAFINGKOEPFL,,47.218611,11.726667,2454 +alps_17879,ROSSKOPF,,47.221111,11.752778,2576 +alps_17880,DREISPITZKOPF,,47.209444,11.749722,2604 +alps_17881,RASTKOGEL,,47.204167,11.751111,2762 +alps_17882,HALSLSPITZE,,47.204444,11.730556,2574 +alps_17883,GRAUE SPITZE,,47.193056,11.753333,2552 +alps_17884,KRAXENTRAGER,,47.240278,11.796389,2423 +alps_17885,GIPFEL,,47.243611,11.801389,2445 +alps_17886,RAUHENKOPF,,47.226111,11.818333,2268 +alps_17887,SANDEGG,,47.210556,11.782778,2360 +alps_17888,PANGERT,,47.202222,11.775278,2550 +alps_17889,HOARBERGKARSPITZE,,47.191389,11.791389,2278 +alps_17890,FREI KOPF,,47.191667,11.926667,2205 +alps_17891,GERLOSSTEIN WAND,,47.193889,11.923611,2166 +alps_17892,GERLOS KOGERL,,47.202222,11.904444,1682 +alps_17893,LARCH KOPF,,47.201389,11.925833,1856 +alps_17894,RICHT BERG,,47.234722,11.986667,2278 +alps_17895,PFEILER,,47.241111,11.987500,2308 +alps_17896,ISS KOGEL,,47.248333,12.013333,2263 +alps_17897,KIRCH SPITZE,,47.191389,12.043333,2312 +alps_17898,ARBIS KOGEL,,47.205556,12.043056,2048 +alps_17899,FILZ EGG,,47.227500,12.072222,1734 +alps_17900,FLAURLINGER JOCH,,47.256389,11.131389,2211 +alps_17901,RAUHENKOPF,,47.308611,11.228611,2011 +alps_17902,BRUNSTKOPF,,47.294722,11.256667,1719 +alps_17903,GROSSER SOLSTEIN,,47.302778,11.308056,2541 +alps_17904,KLEINER SOLSTEIN,,47.302500,11.324444,2637 +alps_17905,KIRCHBERGKOEPFL,,47.281111,11.302500,1943 +alps_17906,HOCHWANDKOPF,,47.276667,11.280556,1579 +alps_17907,HIPPENSPITZE,,47.309444,11.338333,2388 +alps_17908,HINTERE BRANDJOCHSPITZE,,47.302778,11.339444,2599 +alps_17909,VORDERE BRANDJOCHSPITZE,,47.302222,11.341944,2559 +alps_17910,KLEINER GAMSSTEIN,,47.290000,11.759167,1924 +alps_17911,NONSJOECHL,,47.272500,11.722778,2112 +alps_17912,GROSSER GAMSTEIN,,47.282500,11.748333,2142 +alps_17913,SONNTAGSKOEPFL,,47.271944,11.756111,2244 +alps_17914,GILFERT,,47.268056,11.743333,2506 +alps_17915,METZEN,,47.250833,11.746667,2355 +alps_17916,WETTERKREUZSPITZE,,47.275000,11.803333,2276 +alps_17917,HUTTENKOGEL,,47.261389,11.805833,2386 +alps_17918,GEDRECHTER,,47.266667,11.828333,2217 +alps_17919,WIMBACHKOPF,,47.255000,11.817500,2442 +alps_17920,MARCHKOPF,,47.251111,11.806389,2499 +alps_17921,DURRJOCH,,47.301389,11.823333,1635 +alps_17922,SEEBACHKOPF,,47.305556,11.833889,1510 +alps_17923,OEFELERJOCH,,47.251667,11.838333,2162 +alps_17924,SCHARTENJOCH,,47.287222,11.951111,2220 +alps_17925,REGENFELD,,47.296667,12.017500,2258 +alps_17926,SCHAFKOPF,,47.288611,11.986111,2454 +alps_17927,HUETTENKOPF,,47.283333,11.985833,2462 +alps_17928,KATZENKOPF,,47.275000,11.986667,2535 +alps_17929,GRUBACHKOPF,,47.282222,12.009722,2343 +alps_17930,TORHELM,,47.271389,12.004444,2494 +alps_17931,RIFFLERKOGEL,,47.264167,11.972778,2494 +alps_17932,MANSKIRCH,,47.269444,11.968889,2393 +alps_17933,KREUZJOCH,,47.251389,11.982778,2558 +alps_17934,PALLSPITZE,,47.286389,12.062500,2389 +alps_17935,KASTENWENDENKOPF,,47.273056,12.046111,2329 +alps_17936,OCHSENKOPF,,47.275278,12.078889,2469 +alps_17937,SCHOENEGG,,47.373889,11.096389,1624 +alps_17938,SIMMLBERG,,47.361667,11.199444,1508 +alps_17939,ZAEUNLKOPF,,47.364167,11.269167,1746 +alps_17940,MITTAGKOPF,,47.370833,11.266111,1638 +alps_17941,SEEFELDER SPITZE,,47.332778,11.237778,2221 +alps_17942,HAERMELEKOPF,,47.326667,11.231111,2224 +alps_17943,REITHER SPITZE,,47.323056,11.236111,2374 +alps_17944,FREIUNGSPITZEN,,47.317778,11.256111,2332 +alps_17945,SCHLAGKOPF,,47.358889,11.243056,1518 +alps_17946,ZUNTERKOPF,,47.361389,11.285000,1661 +alps_17947,SAMSTAGKARSPITZE,,47.334444,11.284444,2196 +alps_17948,FLEISCHBANKSPITZE,,47.329722,11.286944,2206 +alps_17949,FLEISCHBANKTURME,,47.323611,11.285278,2216 +alps_17950,ERLSPITZE,,47.320000,11.285556,2405 +alps_17951,KUHLOCHSPITZE,,47.315000,11.271667,2297 +alps_17952,ZISCHGENKOPF,,47.336111,11.311667,1932 +alps_17953,HOHER GLEIRSCH,,47.360833,11.356389,2492 +alps_17954,JAEGERKARLSPITZE,,47.351111,11.391667,2470 +alps_17955,HINTEROEDKOPF,,47.356111,11.383056,2453 +alps_17956,MITTLERE JAEGERKARSPITZE,,47.353611,11.375556,2608 +alps_17957,AEUSSERE RIEGELKARSPITZE,,47.357500,11.364167,2407 +alps_17958,GROSSER KATZENKOPF,,47.350833,11.364444,2531 +alps_17959,NIEDERBRAND,,47.331944,11.393056,2104 +alps_17960,KUMPFKARSPITZE,,47.318333,11.365556,2393 +alps_17961,KEMACHER,,47.312778,11.366944,2480 +alps_17962,SEEGRUBENSPITZE,,47.312222,11.374722,2435 +alps_17963,HAFELEKARSPITZE,,47.312778,11.386389,2334 +alps_17964,GRUBREISENTUERME,,47.317778,11.379167,2266 +alps_17965,ZEIGERKOPF,,47.362778,11.409722,1970 +alps_17966,GUMPENKOPF,,47.363056,11.425833,1960 +alps_17967,WESTLICHE PRAXMARERKARSPITZE,,47.350833,11.401944,2638 +alps_17968,PRAXMARERKARSPITZEN,,47.351389,11.403611,2638 +alps_17969,KASKARSPITZE,,47.347778,11.418333,2580 +alps_17970,SONNTAGKARSPITZE,,47.346389,11.427500,2575 +alps_17971,HINTERE BACHOFENSPITZE,,47.345556,11.438611,2668 +alps_17972,VORDERE BACHOFENSPITZE,,47.345833,11.443611,2663 +alps_17973,GROSSER LAFATSCHER,,47.345556,11.452778,2696 +alps_17974,ROSSKOPF,,47.339444,11.441944,2670 +alps_17975,STEMPELJOCHSPITZE,,47.334722,11.438333,2543 +alps_17976,LATTENSPITZE,,47.325556,11.448611,2330 +alps_17977,PFEISER SPITZE,,47.325278,11.445278,2347 +alps_17978,GLEIRSTALER BRANDJOCH,,47.326111,11.410278,2372 +alps_17979,MANDLSPITZE,,47.319722,11.407222,2366 +alps_17980,GLEIRSCHSPITZE,,47.315833,11.398333,2317 +alps_17981,RUMER SPITZE,,47.320556,11.426111,2454 +alps_17982,REPS,,47.366111,11.462222,2159 +alps_17983,SUNNTIGER SPITZE,,47.364722,11.481111,2321 +alps_17984,HALLERANGERSPITZE,,47.364444,11.491389,2442 +alps_17985,GAMSKARSPITZE,,47.362778,11.502778,2601 +alps_17986,BRANDLSPITZE,,47.363611,11.508333,2626 +alps_17987,HOCHKANZEL,,47.365278,11.516111,2574 +alps_17988,ROSSLOCHSPITZE,,47.373333,11.519167,2538 +alps_17989,SPECKKARSPITZE,,47.346389,11.487500,2621 +alps_17990,SIGNALKOPF,,47.347222,11.501111,2504 +alps_17991,BETTELWURF,,47.344167,11.520000,2726 +alps_17992,WILDANGERSPITZE,,47.326111,11.459167,2153 +alps_17993,HALLER ZUNTERKOPF,,47.319444,11.484722,1966 +alps_17994,SPITZKARLSPITZE,,47.368611,11.557500,2376 +alps_17995,KAISERKOPF,,47.369444,11.574444,2506 +alps_17996,HUDERBANKSPITZE,,47.362500,11.578611,2319 +alps_17997,HOHE FURLEG,,47.340278,11.534722,2570 +alps_17998,WECHSELSPITZE,,47.335556,11.524167,2316 +alps_17999,HUNDSKOPF,,47.341111,11.558333,2243 +alps_18000,HOCHGLUCK,,47.374167,11.571667,2573 +alps_18001,STEINKARLSPITZE,,47.370278,11.612222,2460 +alps_18002,HOCHNISSL,,47.367222,11.618056,2547 +alps_18003,SCHNEEKOPF,,47.366667,11.636111,2313 +alps_18004,MITTAGSPITZE,,47.368056,11.642500,2332 +alps_18005,WALDER JOCH,,47.338611,11.596389,1636 +alps_18006,MEHRERKOPF,,47.345556,11.755278,1666 +alps_18007,PROXENSTAND,,47.337222,11.763056,1896 +alps_18008,ARBESERKOGEL,,47.320556,11.747222,2026 +alps_18009,KREUZJOCH,,47.318889,11.770833,2344 +alps_18010,KELLERJOCH,,47.316389,11.765000,2242 +alps_18011,DURRAJOCH,,47.362778,11.799167,1738 +alps_18012,GERSTKOPF,,47.351944,11.790000,1714 +alps_18013,ARZJOCH,,47.342500,11.803333,1717 +alps_18014,METZENJOCH,,47.320278,11.776389,2313 +alps_18015,LUDERSTEIN,,47.370556,11.908611,1830 +alps_18016,WIEDERSBERGER HORN,,47.361111,11.923333,2127 +alps_18017,HOCHSTAND,,47.348056,11.926389,2058 +alps_18018,SAGTALERSPITZE,,47.335000,11.929167,2241 +alps_18019,GAMSKOPF,,47.332222,11.942500,2205 +alps_18020,DRISTENKOPF,,47.330556,11.958333,2203 +alps_18021,HAMBERG,,47.325278,11.909722,2096 +alps_18022,JOELSPITZE,,47.371667,12.002222,1964 +alps_18023,SAUPANZEN,,47.365278,12.007222,1957 +alps_18024,HEIMJOCH,,47.346667,11.982778,2004 +alps_18025,GALTENBERG,,47.336667,11.976389,2424 +alps_18026,KLEINER GALTENBERG,,47.331111,11.971667,2318 +alps_18027,TORKOPF,,47.335556,11.995278,2116 +alps_18028,BREITEGGERN,,47.366111,12.079722,1981 +alps_18029,WILDKARSPITZE,,47.360556,12.078889,1961 +alps_18030,BREITEGGSPITZE,,47.353611,12.072778,1868 +alps_18031,LAEMPERSBERG,,47.355556,12.025556,2202 +alps_18032,KLEINER BEIL,,47.349722,12.027222,2197 +alps_18033,SEEKOPF,,47.346111,12.025000,2189 +alps_18034,GROSSER BEIL,,47.341389,12.027222,2309 +alps_18035,HENGSTKOGEL,,47.340833,12.067500,1803 +alps_18036,GRESSENSTEIN,,47.330000,12.022778,2216 +alps_18037,SONNENJOCH,,47.321667,12.023333,2292 +alps_18038,HOHER GAIFKOPF,,47.424167,11.085278,1864 +alps_18039,DIENSTHUETTE,,47.423889,11.127500,1957 +alps_18040,GEHRENSPITZE,,47.386944,11.135278,2367 +alps_18041,KIRCHL,,47.384722,11.124722,2250 +alps_18042,PLATTACH,,47.383611,11.100833,2096 +alps_18043,OFELEKOPF,,47.404444,11.150278,2478 +alps_18044,WEISSLEHNKOPF,,47.390556,11.201667,2002 +alps_18045,ARNKOPF,,47.388889,11.195278,1934 +alps_18046,ZWIRCHKOPF,,47.387500,11.186389,1773 +alps_18047,MITTLERE ARNSPITZE,,47.394444,11.215833,2091 +alps_18048,ARNPLATTENSPITZE,,47.392778,11.209167,2171 +alps_18049,NOERDLICHE LINDERSPITZE,,47.428056,11.293056,2372 +alps_18050,SUEDLICHE LINDERSPITZE,,47.423056,11.290556,2305 +alps_18051,SULZLEKLAMMSPITZE,,47.418889,11.293333,2321 +alps_18052,KIRCHLSPITZE,,47.415556,11.293056,2301 +alps_18053,ROTWANDLSPITZE,,47.406667,11.288333,2191 +alps_18054,KIENLEITENKOPF,,47.386944,11.317222,1605 +alps_18055,ANGERKOPF,,47.419722,11.385833,2232 +alps_18056,BOCKKARLSPITZE,,47.414722,11.386111,2435 +alps_18057,GROSSE RIEDLKARSPITZE,,47.411389,11.366389,2585 +alps_18058,LARCHETKARSPITZE,,47.410000,11.353889,2541 +alps_18059,PLEISENSPITZE,,47.408611,11.342222,2569 +alps_18060,BREITGRIESKARSPITZE,,47.407778,11.378333,2590 +alps_18061,GROSSE SEEKARSPITZE,,47.404722,11.390833,2677 +alps_18062,OBERER SPITZHUETTENKOPF,,47.397222,11.382222,2502 +alps_18063,KUHKOPF,,47.436111,11.456389,2399 +alps_18064,HOCHALMKREUZ,,47.424167,11.428611,2192 +alps_18065,SCHLAUCHKARKOPF,,47.416667,11.440000,2500 +alps_18066,BIRKKARSPITZE,,47.411111,11.437778,2749 +alps_18067,ODKARSPITZEN,,47.412500,11.424444,2745 +alps_18068,MARXENKARSPITZE,,47.408611,11.405278,2636 +alps_18069,BIRKKOEPFE,,47.395833,11.417778,2574 +alps_18070,KALTWASSERKARSPITZE,,47.403056,11.450556,2733 +alps_18071,SAEGERZAEHNE,,47.398056,11.446944,2660 +alps_18072,KLEINER HIESSENKOPF,,47.380000,11.436667,2038 +alps_18073,LALIDERER FALK,,47.435000,11.519167,2427 +alps_18074,STEINFALK,,47.426944,11.512500,2347 +alps_18075,MAHNKOPF,,47.412222,11.508056,2094 +alps_18076,MOSERKARSPITZE,,47.397222,11.469444,2533 +alps_18077,KUHKARLSPITZE,,47.393056,11.478611,2464 +alps_18078,NOERDLICHE SONNENSPITZE,,47.390556,11.481944,2650 +alps_18079,SUEDLICHE SONNENSPITZE,,47.386389,11.477500,2668 +alps_18080,LADIZKOEPFL,,47.401944,11.501944,1920 +alps_18081,BOCKKARSPITZE,,47.390833,11.486667,2589 +alps_18082,LALIDERER SPITZE,,47.391111,11.500278,2588 +alps_18083,DREIZINKENSPITZE,,47.388333,11.514167,2603 +alps_18084,ROSSKOPFSPITZE,,47.434444,11.556667,2015 +alps_18085,RUEDERKARSPITZE,,47.421944,11.556111,2240 +alps_18086,GAMSJOCH,,47.418333,11.548889,2452 +alps_18087,GUMPENSPITZE,,47.406667,11.539722,2176 +alps_18088,TEUFELSKOPF,,47.398056,11.526389,1978 +alps_18089,GRUBENKARSPITZE,,47.380556,11.522222,2663 +alps_18090,PLATTENSPITZE,,47.377222,11.536944,2492 +alps_18091,SPRITZKARSPITZE,,47.381389,11.551389,2606 +alps_18092,EISKARLSPITZE,,47.376944,11.558889,2610 +alps_18093,BARTHSPITZE,,47.380556,11.578333,2454 +alps_18094,SCHAUFELSPITZE,,47.422778,11.607500,2306 +alps_18095,BETTLERKARSPITZE,,47.430833,11.617778,2268 +alps_18096,FALZTHURNJOCH,,47.435278,11.631389,2150 +alps_18097,BRUNNTALKOPF,,47.412500,11.643611,1718 +alps_18098,SONNJOCH,,47.412222,11.605000,2457 +alps_18099,BAERENWANDKOPF,,47.411944,11.585556,1871 +alps_18100,LUNSTKOPF,,47.395556,11.635556,2143 +alps_18101,RAUHER KNOELL,,47.386944,11.623333,2278 +alps_18102,HAHNKAMPL,,47.395278,11.595000,2080 +alps_18103,LAMSENSPITZE,,47.382500,11.591389,2508 +alps_18104,SCHAFKARSPITZE,,47.382222,11.584167,2505 +alps_18105,MITTERKARLSPITZE,,47.378056,11.588611,2418 +alps_18106,SCHARFJOECHL,,47.381111,11.614722,2157 +alps_18107,DRISTENKOPF,,47.420556,11.664167,2005 +alps_18108,RAPPENSPITZE,,47.402222,11.646111,2223 +alps_18109,KASERJOCH,,47.403611,11.657778,2198 +alps_18110,GAMSKARSPITZE,,47.400833,11.667222,2098 +alps_18111,OCHSENKOPF,,47.398611,11.680556,2148 +alps_18112,HAHNKAMP,,47.395000,11.669722,2086 +alps_18113,STANSER JOCH,,47.399722,11.698889,2102 +alps_18114,BRENTENKOPF,,47.388333,11.647222,2024 +alps_18115,BAERENKOPF,,47.414444,11.712222,1901 +alps_18116,EBNER SPITZE,,47.425556,11.773889,1957 +alps_18117,LARCHKOPF,,47.378333,11.816944,1375 +alps_18118,MARIAHILFBERGL,,47.434167,11.891944,909 +alps_18119,REITHER KOGEL,,47.400833,11.860278,1336 +alps_18120,HAUSKOGEL,,47.433889,11.909444,1011 +alps_18121,GRATLSPITZE,,47.414722,11.948056,1899 +alps_18122,GRASSBERGJOECHL,,47.426389,11.959722,1536 +alps_18123,THIERBACHER KOGEL,,47.426667,11.989444,1312 +alps_18124,HOHLRIEDERKOGEL,,47.406389,12.015000,1312 +alps_18125,SCHATSBERG,,47.390278,11.984444,1898 +alps_18126,SCHATSBERG,,47.385000,11.984722,1902 +alps_18127,ROSSKOPF,,47.425556,12.070833,1731 +alps_18128,TUERMKOGEL,,47.406667,12.069444,1648 +alps_18129,GRABENKARSPITZE,,47.439444,11.431667,2471 +alps_18130,TORWAENDE,,47.437500,11.443889,2416 +alps_18131,TORKOPF,,47.455278,11.438333,2014 +alps_18132,VORDERSKOPF,,47.496944,11.437778,1858 +alps_18133,ROHNBERG,,47.477222,11.427500,1771 +alps_18134,HOCHALPLKOPF,,47.474167,11.417500,1770 +alps_18135,RAPPENSPITZE,,47.469444,11.408333,1835 +alps_18136,LARCHENBERG,,47.463056,11.447500,1652 +alps_18137,SCHOENALMJOCH,,47.485833,11.504722,1986 +alps_18138,FLEISCHBANK,,47.478889,11.519167,2026 +alps_18139,ROSSKOPF,,47.480556,11.494167,1840 +alps_18140,SUEDLICHER STUHLKOPF,,47.445833,11.472222,2049 +alps_18141,NOERDLICHER STUHLKOPF,,47.447500,11.473056,2015 +alps_18142,TALELESPITZE,,47.439444,11.468611,2104 +alps_18143,KLEINER FALK,,47.444722,11.507500,2190 +alps_18144,RISSER FALK,,47.438611,11.506944,2413 +alps_18145,KUPPEL,,47.482500,11.579444,1771 +alps_18146,HOELZELSTALJOCH,,47.479167,11.530278,2012 +alps_18147,GRASBERG,,47.476667,11.542778,2020 +alps_18148,LAURISJOCH,,47.486111,11.549167,1827 +alps_18149,HEIMJOCH,,47.472500,11.579722,1871 +alps_18150,TOTENFALK,,47.442500,11.525556,2131 +alps_18151,TUERMFALK,,47.440000,11.525000,2200 +alps_18152,LARCHKOEPFL,,47.496667,11.591944,1418 +alps_18153,DER MANTSCHEN,,47.476944,11.619167,1825 +alps_18154,DER KOTZEN,,47.479167,11.605000,1773 +alps_18155,MONDSCHEINSPITZE,,47.466111,11.613056,2106 +alps_18156,PLUMSJOCH,,47.456667,11.611667,1921 +alps_18157,SATTELJOCH,,47.451111,11.603889,1935 +alps_18158,KOMPAR,,47.455556,11.584722,2011 +alps_18159,GUETENBERG,,47.445556,11.641667,1665 +alps_18160,SEEKARSPITZE,,47.479167,11.682778,2053 +alps_18161,HOHE GANS,,47.474722,11.658333,1950 +alps_18162,SCHLEIMSJOCH,,47.473611,11.646944,1809 +alps_18163,SEEBERGSPITZE,,47.466111,11.679722,2085 +alps_18164,RAUHKOPF,,47.490278,11.755278,1552 +alps_18165,KUPPAL,,47.488056,11.743611,1691 +alps_18166,OCHSENKOPF,,47.483056,11.743611,1665 +alps_18167,LAUBKOGEL,,47.485278,11.766944,1501 +alps_18168,KOTALMJOCH,,47.465556,11.751944,2157 +alps_18169,STREICHKOPF,,47.459444,11.759444,2243 +alps_18170,HOCHISS,,47.458333,11.765000,2299 +alps_18171,DALFAZER WAENDE,,47.453889,11.755000,2233 +alps_18172,KLOBEN JOCH",,47.458333,11.735000,2041 +alps_18173,GSCHOELLKOPF,,47.446944,11.763889,2039 +alps_18174,ROTSPITZE,,47.445556,11.752778,2067 +alps_18175,KREUZEINJOCH,,47.483611,11.830000,1702 +alps_18176,AMEISKOGEL,,47.497778,11.827222,1518 +alps_18177,GAMSWANDSPITZE,,47.462500,11.774722,1937 +alps_18178,SEILEGG,,47.463333,11.787222,1981 +alps_18179,SPIELJOCH,,47.455833,11.773056,2236 +alps_18180,ROSSKOEPFE,,47.457222,11.778056,2261 +alps_18181,ROFANSPITZE,,47.457500,11.793611,2259 +alps_18182,SAGZAHN,,47.453333,11.798056,2228 +alps_18183,MARCHSPITZE,,47.466667,11.802778,2004 +alps_18184,LATSCHBERG,,47.460833,11.812222,1949 +alps_18185,ROSSKOGEL,,47.466944,11.827222,1940 +alps_18186,HEIDACHSTELLWAND,,47.443889,11.780556,2192 +alps_18187,VORDERES SONNWENDJOCH,,47.444722,11.801111,2224 +alps_18188,PRAMAKOPF,,47.492500,11.853056,1475 +alps_18189,VOLDOEPPBERG,,47.474722,11.888333,1509 +alps_18190,PLETZACHKOGEL,,47.454444,11.845278,1549 +alps_18191,ZIMMERERKOPF,,47.488889,11.929167,1246 +alps_18192,BUMBERG,,47.455833,11.980278,904 +alps_18193,SONNBERGER JOECHL,,47.459167,12.069444,1285 +alps_18194,BEMBERGER JOCH,,47.449167,12.037500,1356 +alps_18195,DELPSJOCH,,47.500833,11.496389,1945 +alps_18196,BAUMGARTENJOCH,,47.501389,11.513611,1939 +alps_18197,ROSSKOPF,,47.550278,11.610278,1528 +alps_18198,PITZKOPF,,47.557500,11.623611,1670 +alps_18199,SCHULTERBERG,,47.554167,11.643611,1686 +alps_18200,JUIFEN,,47.543056,11.625833,1988 +alps_18201,RABERSKOPF,,47.531667,11.601944,1383 +alps_18202,MARBICHLER SPITZE,,47.533611,11.636111,1898 +alps_18203,KAFELL,,47.528056,11.637500,1906 +alps_18204,RETHER KOPF,,47.520278,11.635556,1926 +alps_18205,SCHMALKOPF,,47.557778,11.690000,1048 +alps_18206,HOCHPLATTE,,47.527778,11.650000,1813 +alps_18207,SCHRECKENSPITZE,,47.500278,11.648889,2022 +alps_18208,CHRISTLUMKOPF,,47.503611,11.661111,1758 +alps_18209,HINTERRUNNUTZ,,47.529722,11.735278,2007 +alps_18210,ZWOELFERKOPF,,47.521389,11.759444,1513 +alps_18211,SCHLAGKOPF,,47.515278,11.759444,1688 +alps_18212,HOCHUNNUTZ,,47.520000,11.736111,2075 +alps_18213,VORDERUNNUTZ,,47.514722,11.738889,2078 +alps_18214,GUFFERTSPITZE,,47.546111,11.789167,2194 +alps_18215,SANDEGG,,47.536944,11.822222,1849 +alps_18216,KITZSTEIN,,47.529167,11.801111,1625 +alps_18217,GFASSKOEPFE,,47.504722,11.787222,1279 +alps_18218,ENTERKOPF,,47.509444,11.823333,1200 +alps_18219,KREUZEGG,,47.553056,11.846111,1308 +alps_18220,ROSSKOPF,,47.537500,11.885000,1632 +alps_18221,RAUHEGG,,47.538611,11.846667,1690 +alps_18222,ASCHAUHOERNDLI,,47.517500,11.877778,1282 +alps_18223,DRISTENKOPF,,47.512222,11.864722,1405 +alps_18224,JOECHL,,47.552222,11.948333,1554 +alps_18225,BRUNFTKOPF,,47.542500,11.951111,1417 +alps_18226,SCHATTENKOPF,,47.542500,11.934722,1233 +alps_18227,HIRSCHLACK,,47.541389,11.901111,1284 +alps_18228,PRINZKOPF,,47.527222,11.915000,1304 +alps_18229,HOHER NOCK,,47.530000,11.938611,1497 +alps_18230,KIENBERG,,47.515556,11.949167,1786 +alps_18231,HEUBERG,,47.511944,11.956389,1746 +alps_18232,EINKEHRBODEN,,47.519444,11.932778,1490 +alps_18233,DURRENBERG,,47.537222,12.011111,1534 +alps_18234,KUEHBERG,,47.532778,11.973333,1677 +alps_18235,ZUNTERKOEPFL,,47.533056,11.990556,1635 +alps_18236,BLESSENBERG,,47.514167,11.960556,1743 +alps_18237,JOCHKOPF,,47.555833,12.077500,1409 +alps_18238,FEUERKOEPFL,,47.550000,12.070278,1292 +alps_18239,KOEGLHOERNDL,,47.549722,12.059167,1645 +alps_18240,HUNDSALMJOCH,,47.540000,12.037778,1637 +alps_18241,HALSLKOPF,,47.571667,11.626944,1406 +alps_18242,SATTELKOPF,,47.578333,11.682778,1418 +alps_18243,HOFJOCH,,47.563333,11.701111,1341 +alps_18244,RORMOESERKOPF,,47.569722,11.736667,1522 +alps_18245,NATTERWAND,,47.572222,11.750000,1618 +alps_18246,MAHMOOSKOPF,,47.571667,11.723611,1336 +alps_18247,SCHNEIDJOCH,,47.566389,11.790000,1811 +alps_18248,ABENDSTEIN,,47.563889,11.816667,1596 +alps_18249,RAGSTATTJOCH,,47.567778,11.849444,1545 +alps_18250,KRENSPITZE,,47.600833,11.955833,1972 +alps_18251,HINTERER SONNWENDJOCH,,47.598611,11.949722,1986 +alps_18252,BAEREN JOCH,,47.601111,11.923056,1813 +alps_18253,SCHMALEGGERJOCH,,47.575000,11.927500,1633 +alps_18254,SCHOENFELDJOCH,,47.602222,11.991667,1716 +alps_18255,VEITSBERG,,47.574167,11.973611,1787 +alps_18256,LARCHBERG,,47.573056,12.018056,1412 +alps_18257,SEMMELKOPF,,47.606667,12.054444,1558 +alps_18258,SAURUESSEL,,47.603056,12.043056,1530 +alps_18259,SCHATTBERG,,47.577222,12.065556,1126 +alps_18260,WAESCHKOGEL,,47.570833,12.048611,1119 +alps_18261,GABEL SPITZE,,47.005556,12.121389,3071 +alps_18262,ARVENTAL SPITZE,,47.008333,12.123333,3083 +alps_18263,LENK SPITZE,,47.015833,12.131389,3105 +alps_18264,SCHNEE SPITZE,,47.004444,12.106389,2925 +alps_18265,HUEHNER SPIEL,,47.006944,12.087778,2426 +alps_18266,JAGDHAUS SPITZE,,47.009444,12.163333,3165 +alps_18267,GLOCKHAUS,,47.013889,12.163889,3103 +alps_18268,LOEFFEL SPITZE,,47.017500,12.164444,3190 +alps_18269,ROTENMANN KOGEL,,47.007778,12.204722,3127 +alps_18270,ROET SPITZE,,47.026944,12.205278,3496 +alps_18271,DABER SPITZE,,47.016111,12.207222,3402 +alps_18272,KEMET SPITZE,,47.025556,12.180278,3004 +alps_18273,MERB SPITZE,,47.025000,12.147500,3090 +alps_18274,PFERRER SPITZE,,47.049722,12.158611,2578 +alps_18275,REINHART,,47.042222,12.179722,2891 +alps_18276,SAU SPITZE,,47.058056,12.195833,2847 +alps_18277,HOHE WARTE,,47.059167,12.207500,3128 +alps_18278,HOHES KREUZ,,47.007500,12.225278,3159 +alps_18279,TREDEBER SPITZE,,47.016667,12.215278,3134 +alps_18280,STEINGRUBEN KOGEL,,47.031389,12.256667,3231 +alps_18281,ROET SPITZE,,47.032500,12.209722,3289 +alps_18282,QUIRL,,47.033056,12.268889,3251 +alps_18283,MALHAM SPITZE,,47.049167,12.259444,3368 +alps_18284,MALHAMHORN,,47.037222,12.261111,3186 +alps_18285,ESSENER ECK,,47.043611,12.240833,3006 +alps_18286,VORDER GUBACH SPITZE,,47.058889,12.259444,3316 +alps_18287,REGGEN TOERL,,47.052778,12.258333,3047 +alps_18288,ROSSHUF,,47.058611,12.216944,3199 +alps_18289,AHRNER KOPF,,47.047778,12.217222,3051 +alps_18290,KLEIN SCHOBER,,46.999444,12.271111,2806 +alps_18291,MULLWITZ KOGEL,,47.021389,12.295000,2768 +alps_18292,OGASIL SPITZE,,47.023056,12.276944,3032 +alps_18293,FINSTERWITZ KOPF,,47.031667,12.324444,2257 +alps_18294,SCHLUESSEL SPITZE,,47.044167,12.320833,2778 +alps_18295,NIKLAS KOGEL,,47.058611,12.319722,2791 +alps_18296,HOCHKAR KOPF,,47.029722,12.286667,2940 +alps_18297,ROSTOCKER ECK,,47.050000,12.288056,2749 +alps_18298,ROETE SAEULE,,47.039444,12.350000,2820 +alps_18299,KNAPPEN SPITZE,,47.043889,12.351111,2888 +alps_18300,SCHERNERS KOPF,,47.046944,12.353889,3033 +alps_18301,KREUZ SPITZE,,47.046667,12.359444,3135 +alps_18302,ZOPET SPITZE,,47.057222,12.361944,3198 +alps_18303,TULP SPITZE,,47.051389,12.362778,3054 +alps_18304,SCHAUFEL SPITZE,,47.033056,12.427778,2631 +alps_18305,ZINIZACH SPITZE,,47.032222,12.449167,2754 +alps_18306,MITTEREGG SPITZE,,47.040000,12.451389,3044 +alps_18307,STOTZKOPF,,47.035833,12.433611,2669 +alps_18308,WUNSPITZE,,47.043333,12.402500,3217 +alps_18309,GALTEN KOGEL,,47.042778,12.443056,2986 +alps_18310,FIRSCHNITZ SCHARTE,,47.041111,12.456389,2768 +alps_18311,RAUHKOPF,,47.045833,12.429167,3070 +alps_18312,SAULKOPF,,47.048333,12.420278,3209 +alps_18313,NIEDER EICHHAM,,47.053611,12.411944,3247 +alps_18314,HOHER EICHHAM,,47.053889,12.406667,3371 +alps_18315,GROSS HEXENKOPF,,47.059722,12.405556,3314 +alps_18316,KLEIN HEXENKOPF,,47.061667,12.410000,3194 +alps_18317,SCHOBER,,47.058056,12.437778,2745 +alps_18318,PLANLISS BICHL,,47.021389,12.497778,2160 +alps_18319,WALDKOEPFL,,47.017500,12.475278,1889 +alps_18320,HINTEREGG KOGEL,,47.029167,12.495278,2638 +alps_18321,PEGOMLSPITZE,,47.033889,12.466111,2865 +alps_18322,BRETTERSPITZ,,47.036667,12.468333,3001 +alps_18323,NOERDLICHE GORIACHE ROETE,,47.041667,12.464444,3011 +alps_18324,SUEDLICHE GOERIACHE ROETE,,47.039167,12.466944,3020 +alps_18325,OCHSENBUG,,47.035556,12.472500,2995 +alps_18326,NUENITZ KOEPFL,,47.036667,12.501111,2025 +alps_18327,HOHES FENSTER,,47.047222,12.476389,2567 +alps_18328,BUNZKOEGELE,,47.029444,12.563611,2430 +alps_18329,BRETTERWAND SPITZE,,47.036667,12.576389,2887 +alps_18330,TRIGEN KOEPFL,,47.043333,12.550000,2620 +alps_18331,NUSSING KOGEL,,47.051667,12.553333,2989 +alps_18332,GRADOTZKOGEL,,47.048611,12.593611,3063 +alps_18333,BERGERALM,,47.047778,12.613889,2113 +alps_18334,BRETTERSPITZE,,47.046111,12.643333,2864 +alps_18335,BRETTERBODEN,,47.038333,12.634722,2343 +alps_18336,GANIMITZ,,47.036667,12.604167,2785 +alps_18337,KENDLSPITZE,,47.038056,12.593333,3085 +alps_18338,TSCHADIN HOERNDLI,,47.032222,12.591389,2769 +alps_18339,BRUNNER KOGEL,,47.026944,12.596111,2607 +alps_18340,WEISSER KNOPF,,47.018611,12.602778,2577 +alps_18341,BLAUSPITZE,,47.018889,12.607500,2575 +alps_18342,KALSER HOHE,,47.011389,12.600278,2434 +alps_18343,SCHERE,,47.059722,12.684167,3037 +alps_18344,BLAUE KOEPFE,,47.058889,12.699722,3061 +alps_18345,KRISTALL SPITZL,,47.055833,12.654167,3005 +alps_18346,KREUZWAND SPITZ,,47.053889,12.657222,3031 +alps_18347,FANOTKOGEL,,47.052500,12.682778,2905 +alps_18348,SAEULSPITZE,,47.053056,12.646389,2956 +alps_18349,HOHER GULDANOA,,47.045278,12.660000,2777 +alps_18350,FREIWANDSPITZE,,47.041944,12.682778,2919 +alps_18351,FIGERHORN,,47.031111,12.675556,2743 +alps_18352,TSCHENGLKOPF,,47.030278,12.653611,2410 +alps_18353,MEDELSPITZE,,47.030000,12.701111,2669 +alps_18354,GREIBICHL,,47.018611,12.672222,2247 +alps_18355,DRITTER LEITERK,,47.054444,12.751111,2891 +alps_18356,SCHWERTKOPF,,47.054722,12.738333,3099 +alps_18357,SCHWERTECK,,47.056944,12.723333,3247 +alps_18358,GLATZBERG,,47.040833,12.720833,2627 +alps_18359,SCHINAL,,47.038056,12.737222,2452 +alps_18360,HAHNLKAMP,,47.036944,12.767222,2634 +alps_18361,SAUKOPF,,47.033333,12.756667,2749 +alps_18362,KASTENEGG,,47.027778,12.717500,2821 +alps_18363,ZINGGETZKAMP,,47.026111,12.755000,2876 +alps_18364,GREMUL,,47.019722,12.747222,2909 +alps_18365,ZINGGETZ,,47.012778,12.736111,2971 +alps_18366,TRAMERKAMP,,47.014167,12.743056,2974 +alps_18367,SCHULTERKOPF,,47.012500,12.763889,2619 +alps_18368,GRIDENKARKOEPFE,,47.002500,12.733889,3031 +alps_18369,ERSTER LEITERK,,47.053056,12.770833,2483 +alps_18370,KRACKER,,47.042222,12.782500,2461 +alps_18371,HINTERN HAP,,47.030833,12.814444,2332 +alps_18372,JOECHLKOPF,,47.026944,12.821667,2337 +alps_18373,SCHILDBERG,,47.018611,12.810556,2683 +alps_18374,ALWITZSCH,,47.011111,12.807222,2847 +alps_18375,TALDERKOPF,,47.013333,12.827778,2538 +alps_18376,LACKNERBERG,,47.060000,12.843611,2329 +alps_18377,OCHSENKOPF,,47.023889,12.835833,2353 +alps_18378,KREUZKOPF,,47.015556,12.839167,2497 +alps_18379,EGGERWIESENKOPF,,47.002778,12.849167,2628 +alps_18380,GOLDZECHKOPF,,47.059167,12.942778,3042 +alps_18381,HOHER SONNBLICK,,47.053889,12.956944,3106 +alps_18382,GOLDBERGSPITZE,,47.048889,12.952500,3073 +alps_18383,ROTER MANN,,47.043333,12.938611,3097 +alps_18384,SANDKOPF,,47.037222,12.930278,3090 +alps_18385,TROEGERECK,,47.022500,12.923889,2732 +alps_18386,STANZIWURTEN,,47.008889,12.926111,2707 +alps_18387,NEUNERKOGEL,,47.048611,13.000278,2827 +alps_18388,HERZOG ERNST SPITZE,,47.043889,13.003056,2933 +alps_18389,SCHAMBACHSPITZE,,47.041389,13.017500,3123 +alps_18390,TRAMERKOPF,,47.038889,12.965278,2841 +alps_18391,WINDISCHKOGEL,,47.038333,12.976667,2837 +alps_18392,ALTECK,,47.035556,12.985278,2942 +alps_18393,ROJACHERSPITZE,,47.028056,12.981667,2987 +alps_18394,ZIRKNITSPITZE,,47.025000,12.979167,2934 +alps_18395,WEISSSEEKOPF,,47.015278,12.995833,2908 +alps_18396,ECKKOPF,,47.019167,12.970833,2871 +alps_18397,SCHWARZSEEKOPF,,47.007778,13.004444,2825 +alps_18398,SPARANGERKOPF,,47.031389,13.039444,2922 +alps_18399,SCHLAPPEREBENSPITZEN,,47.027778,13.029444,3021 +alps_18400,WESTERFROELKEKOGEL,,47.022500,13.078611,2727 +alps_18401,GEISSLKOPF,,47.013333,13.072778,2974 +alps_18402,FELDSEEKOPF,,47.001389,13.069722,2864 +alps_18403,WINKEL KOPF,,47.073056,12.118889,2854 +alps_18404,RAUCHKOFEL,,47.076111,12.091944,3251 +alps_18405,MARCHSTEIN JOCH,,47.077500,12.105000,2766 +alps_18406,WINDBACH SPITZE,,47.077500,12.133611,2867 +alps_18407,DREIECKER,,47.080556,12.136111,2892 +alps_18408,SEEKAR KOGEL,,47.092500,12.125556,2916 +alps_18409,REINBACH SPITZE,,47.109444,12.128056,3129 +alps_18410,NADEL SPITZE,,47.115000,12.122500,2972 +alps_18411,ZILLER PLATTEN SPITZE,,47.104167,12.129722,3148 +alps_18412,SUEDLICHE SCHWARZKOPF,,47.121389,12.115000,3042 +alps_18413,SCHUTTAL KOPF,,47.079167,12.151667,2773 +alps_18414,STEINKAR SPITZE,,47.088611,12.198056,2869 +alps_18415,SCHLACHTER TAUERN,,47.106389,12.178333,2750 +alps_18416,GLOCKENKAR KOGEL,,47.090833,12.180833,2911 +alps_18417,TAUERN KOGEL,,47.086667,12.170000,2872 +alps_18418,ZWILLINGS KOEPFE,,47.090833,12.190278,2841 +alps_18419,HINTER GUBACH SPITZE,,47.063889,12.258333,3387 +alps_18420,UMBAL KOEPFL,,47.070556,12.248611,3426 +alps_18421,VORDER MAURERKEES KOGEL,,47.078333,12.269444,3325 +alps_18422,OESTLICHE SIMONY SPITZE,,47.075000,12.267500,3448 +alps_18423,WESTLICHE SIMONY SPITZE,,47.072500,12.261944,3481 +alps_18424,HINTER SONNTAGS KOEPFE,,47.111944,12.259722,3136 +alps_18425,SCHLIEFER TUERME,,47.114444,12.255833,3142 +alps_18426,SCHLIEFER SPITZE,,47.122500,12.243333,3290 +alps_18427,GRASLEIEN KOPF,,47.080000,12.228333,2954 +alps_18428,DREIHERRN SPITZE,,47.069167,12.241111,3499 +alps_18429,KLEINER HAPP,,47.071944,12.329444,2852 +alps_18430,HINTER MAURERKEES KOGEL,,47.092500,12.284167,3311 +alps_18431,GROSSER HAPP,,47.085000,12.312222,3352 +alps_18432,MITTLER MAURERKEES KOGEL,,47.086667,12.278611,3283 +alps_18433,GROSSER GEIGER,,47.093056,12.308889,3360 +alps_18434,VENEDIGER WESTGRAT,,47.107222,12.325833,3230 +alps_18435,GASTACHER WAENDE,,47.066111,12.369722,3087 +alps_18436,WEISS SPITZE,,47.076111,12.392500,3299 +alps_18437,KAPUNITZ KOEPFL,,47.076389,12.352778,2816 +alps_18438,MULLWITZ ADERL,,47.090556,12.367778,3244 +alps_18439,MULLWITZ KOEPFL,,47.080278,12.359167,2960 +alps_18440,RAINERHORN,,47.100833,12.364167,3559 +alps_18441,HOHER ZAUN,,47.100000,12.376944,3451 +alps_18442,HOHES ADERL,,47.101944,12.350556,3506 +alps_18443,SCHWARZE WAND,,47.103611,12.370278,3506 +alps_18444,GROSS VENEDIGER,,47.109167,12.346389,3666 +alps_18445,KLEIN VENEDIGER,,47.116667,12.358889,3471 +alps_18446,HOHE ACHSEL,,47.067222,12.426667,3161 +alps_18447,VORDER SEEKOPF,,47.072778,12.401667,3282 +alps_18448,LOEBBEN KOPF,,47.097778,12.411111,2917 +alps_18449,KRISTALLWAND,,47.093611,12.399722,3310 +alps_18450,INNER KNORR KOGEL,,47.101944,12.420000,2882 +alps_18451,AUSSERER KNORR KOGEL,,47.103889,12.440278,2920 +alps_18452,STRICHWAND KOGEL,,47.070556,12.503056,2638 +alps_18453,DABERNITZ KOGEL,,47.087778,12.468056,2969 +alps_18454,VORDER MICHLBACH SPITZE,,47.077778,12.469444,2821 +alps_18455,STANZL EGG,,47.075000,12.490556,2814 +alps_18456,RANEBURG KOGEL,,47.081389,12.484444,2925 +alps_18457,HINTER MICHLBACH SPITZE,,47.083611,12.472778,2905 +alps_18458,STALL KOGEL,,47.086667,12.504167,2599 +alps_18459,VORDER PLATTEN KOGEL,,47.116389,12.469722,2672 +alps_18460,SCHILD KOGEL,,47.097222,12.482778,2826 +alps_18461,SPITZ KOGEL,,47.103611,12.488889,2606 +alps_18462,WILDEN KOGEL,,47.103889,12.459722,3021 +alps_18463,HINTER PLATTEN KOGEL,,47.110000,12.468333,2741 +alps_18464,TAXER KOGEL,,47.080833,12.557778,2629 +alps_18465,GRAU KOGEL,,47.078333,12.577778,2985 +alps_18466,BROCHET KOPF,,47.091111,12.577222,2662 +alps_18467,SCHWARZ KOGEL,,47.109722,12.582222,2866 +alps_18468,GLOCKEN KOGEL,,47.115278,12.544722,2828 +alps_18469,WILDE MAHDER,,47.106944,12.546944,2668 +alps_18470,HAUPMER KOPF,,47.115278,12.530833,2625 +alps_18471,SILLING KOPF,,47.123333,12.555000,2858 +alps_18472,TAUERNKOGEL,,47.121111,12.616944,2683 +alps_18473,MEDELSKOPF,,47.115278,12.629167,2761 +alps_18474,KALSER BAERENKOPF,,47.112500,12.601389,3079 +alps_18475,KASTENTURM,,47.105278,12.639167,2917 +alps_18476,KNAUDL,,47.106944,12.603889,2936 +alps_18477,ADERSPITZE,,47.100556,12.605278,2990 +alps_18478,UNTER KASTEN,,47.093611,12.635833,2670 +alps_18479,KNAPPENKOEPFE,,47.090556,12.595556,3020 +alps_18480,SPINEWITROL,,47.086111,12.618056,2483 +alps_18481,GRAUER SCHIMMEL,,47.078889,12.583889,3053 +alps_18482,MUNTANITZ,,47.073611,12.589167,3232 +alps_18483,KLEIN MUNTANITZ,,47.068889,12.585000,3192 +alps_18484,SCHATSEITKOEPFL,,47.124167,12.690833,3182 +alps_18485,VORDER BAERENKOPF,,47.121667,12.704167,3249 +alps_18486,HOHE RIFFEL,,47.122500,12.666667,3338 +alps_18487,GAMSKOPF,,47.114444,12.657500,2757 +alps_18488,HOHER SAND,,47.116111,12.650833,2605 +alps_18489,JOHANNIS BERG,,47.108889,12.673889,3453 +alps_18490,HOHER KASTEN,,47.101944,12.645833,3189 +alps_18491,EISKOEGELE,,47.099444,12.656944,3426 +alps_18492,SCHNESS WINKELKOPF,,47.095833,12.662222,3476 +alps_18493,TEUFELSKAMP,,47.086667,12.680000,3511 +alps_18494,KLEIN BURGSTALL,,47.088056,12.706389,2709 +alps_18495,HOFMANN SPITZE,,47.079167,12.686944,3722 +alps_18496,TEUFELSHORN,,47.076111,12.692222,3680 +alps_18497,GRAMUL,,47.072222,12.672500,3276 +alps_18498,GROSS GLOCKNER,,47.074167,12.694444,3798 +alps_18499,KLEIN GLOCKNER,,47.073889,12.695278,3770 +alps_18500,GAMSSPITZE,,47.068889,12.663056,3157 +alps_18501,LUISENK,,47.065278,12.686667,3207 +alps_18502,SALZKOGEL,,47.065000,12.658056,2986 +alps_18503,BREITKOPF,,47.113611,12.734722,3154 +alps_18504,BURGSTALL,,47.101389,12.710000,2933 +alps_18505,HOHER BURGSTALL,,47.105000,12.715833,2972 +alps_18506,SINWELLECK,,47.097778,12.758056,3261 +alps_18507,FUSCHER KAR-KOPF,,47.098889,12.745556,3331 +alps_18508,EISCHBERG,,47.095833,12.725833,2664 +alps_18509,FREIWAND KASTEN,,47.093333,12.746389,3114 +alps_18510,FREIWAND SPITZ,,47.086111,12.751944,3034 +alps_18511,FREIWAND KOPF,,47.080000,12.756389,2854 +alps_18512,HOHENWART KOGEL,,47.065278,12.709444,3308 +alps_18513,KELLERSKOGEL,,47.063333,12.721944,3239 +alps_18514,ELISABETH FELSEN,,47.065278,12.758889,2156 +alps_18515,KELLERSWAND,,47.066389,12.726667,3010 +alps_18516,EISBICHL,,47.121111,12.781944,1428 +alps_18517,EDELWEISS SPITZE,,47.123611,12.831667,2572 +alps_18518,PFALZKOGEL,,47.119444,12.821111,2402 +alps_18519,TOERLKOPF,,47.116389,12.825000,2455 +alps_18520,KAPUZINER,,47.100833,12.773333,2852 +alps_18521,BRENNKOGEL,,47.097500,12.820556,3018 +alps_18522,KLOBEN,,47.097778,12.805000,2938 +alps_18523,SCHARTENKOGEL,,47.095556,12.781111,2857 +alps_18524,SPIELMANN,,47.092778,12.795556,3027 +alps_18525,HOERNDL,,47.089167,12.817222,2767 +alps_18526,ALBITZEN SPITZ,,47.078333,12.789722,2971 +alps_18527,RACHERIN,,47.081111,12.794444,3092 +alps_18528,WASSERRADKOPF,,47.075000,12.798333,3032 +alps_18529,STEINMANDLKOPF,,47.117500,12.847500,2293 +alps_18530,WUSTKOGEL,,47.097500,12.870833,2507 +alps_18531,WOAZKOEPFL,,47.100000,12.838611,2391 +alps_18532,MODERECK,,47.084167,12.886111,2930 +alps_18533,HOCHTOR,,47.082778,12.836944,2734 +alps_18534,TAUERNKOPF,,47.082222,12.845556,2628 +alps_18535,ROSSSCHARTENKOPF,,47.080556,12.860000,2665 +alps_18536,SCHARECK,,47.066667,12.861111,2606 +alps_18537,SAGKOGEL,,47.119722,12.908611,2645 +alps_18538,GAMSKARKOGEL,,47.110556,12.909722,2588 +alps_18539,RITTERKOPF,,47.102500,12.948889,3006 +alps_18540,HOCHARN,,47.076111,12.937222,3254 +alps_18541,SCHNEEHORN,,47.078333,12.930556,2062 +alps_18542,ARLTHOEHE,,47.080000,12.925833,3084 +alps_18543,KRUMLKEESKOPF,,47.081111,12.914167,3101 +alps_18544,NOESPITZE,,47.081111,12.904444,3005 +alps_18545,GJAIDTROGHOHE,,47.063333,12.911389,2988 +alps_18546,KALBERGRAT,,47.069722,12.928056,2992 +alps_18547,FROESTLBERG,,47.123056,12.998056,1823 +alps_18548,FILZENKAEMMFELSEN,,47.065833,13.015556,2522 +alps_18549,KALKBRETTERKOPF,,47.120000,13.030556,2412 +alps_18550,MITTERASTENKOPF,,47.103333,13.030556,2401 +alps_18551,SILBERPFENNIG,,47.088889,13.041667,2600 +alps_18552,ORTBERG,,47.086111,13.070000,2401 +alps_18553,KOLMKARSPITZ,,47.074167,13.038056,2529 +alps_18554,NOERDLICHE SCHWARZKOPF,,47.124444,12.113889,3079 +alps_18555,RICHTER SPITZE,,47.128611,12.114444,3052 +alps_18556,REICHEN SPITZE,,47.139444,12.110833,3303 +alps_18557,ZILLER SPITZE,,47.132500,12.113611,3092 +alps_18558,KUCHELMOOS KOPF,,47.139167,12.097222,3214 +alps_18559,HAHNEN KAMM,,47.141667,12.104444,3209 +alps_18560,GABLER,,47.140833,12.113333,3263 +alps_18561,WILDGERLOS SPITZE,,47.143889,12.098056,3280 +alps_18562,SCHNEEKAR SPITZE,,47.146111,12.093056,3209 +alps_18563,MANNLKAR KOPF,,47.147222,12.128889,2870 +alps_18564,ROSSKAR SCHARTE,,47.149444,12.131111,2689 +alps_18565,ROSS KOPF,,47.151667,12.138611,2845 +alps_18566,SICHEL KOPF,,47.167222,12.091944,2982 +alps_18567,HINTER SCHAFL KOPF,,47.164722,12.144167,3057 +alps_18568,WILDKAR SPITZE,,47.173333,12.138889,3073 +alps_18569,SEHNDL SPITZE,,47.171667,12.086389,2882 +alps_18570,WEISSKAR KOPF,,47.174444,12.087500,2850 +alps_18571,SEEKAR SPITZE,,47.178889,12.141111,2914 +alps_18572,ANKEN KOPF,,47.181111,12.088333,2699 +alps_18573,STIER KOPF,,47.183889,12.095556,2501 +alps_18574,TRISS KOPF,,47.183056,12.127500,2694 +alps_18575,GRAUKAR KOPF,,47.132222,12.165833,2663 +alps_18576,GAMSBICHL KOPF,,47.130833,12.170556,2645 +alps_18577,WINDBACHKAR KOPF,,47.127500,12.153056,2764 +alps_18578,GAMSLANER KOPF,,47.166944,12.167500,2466 +alps_18579,GREIFLAHNER KOPF,,47.155556,12.174444,2405 +alps_18580,REINBACH EGG,,47.153056,12.172500,2530 +alps_18581,RETTENKAR KOPF,,47.160278,12.153889,2968 +alps_18582,RAINBACH KOPF,,47.155556,12.162222,2669 +alps_18583,WALDBERGKAR KOPF,,47.181111,12.164444,2374 +alps_18584,HUETTELTAL KOPF,,47.184722,12.207778,2962 +alps_18585,JAIDBACH SPITZE,,47.131667,12.238056,3099 +alps_18586,SONNTAGSKAR KOPF,,47.165833,12.243889,2571 +alps_18587,UNLASSKAR KOPF,,47.135556,12.225556,3074 +alps_18588,VORDER KOPF,,47.157500,12.222500,3024 +alps_18589,UNLASS ECK,,47.127778,12.212222,2654 +alps_18590,WEIGLKAR KOPF,,47.140278,12.222222,3009 +alps_18591,KRAUSENKAR KOPF,,47.147222,12.250000,2757 +alps_18592,SCHACHEN KARKOPF,,47.154444,12.222500,2982 +alps_18593,FIISKAR KOPF,,47.165278,12.219167,3029 +alps_18594,HUMBACHKAR KOPF,,47.169722,12.214444,2926 +alps_18595,SOELLENKAR KOGEL,,47.177222,12.214167,2879 +alps_18596,SCHWARZES HOERNDL,,47.133889,12.331667,3099 +alps_18597,BACHMAYR SPITZE,,47.134444,12.324722,3120 +alps_18598,KEES KOGEL,,47.136389,12.311944,3291 +alps_18599,STEINKAR KOGEL,,47.142222,12.304444,3180 +alps_18600,SATTELKAR KOGEL,,47.159444,12.293889,2903 +alps_18601,KAEFERFELD SPITZE,,47.156111,12.296389,2970 +alps_18602,GOSS KOPF,,47.165556,12.291944,2876 +alps_18603,KESSELKAR KOPF,,47.176667,12.329167,2703 +alps_18604,GROSS WARTKOPF,,47.177222,12.283333,2640 +alps_18605,SONNTAGS KOGEL,,47.182500,12.326667,2740 +alps_18606,INNERER KESSEL KOGEL,,47.124444,12.391111,2897 +alps_18607,ZWISCHEN SULZBACH TOERL,,47.127778,12.342222,2918 +alps_18608,UNTER SULZBACH TOERL,,47.129722,12.356667,2855 +alps_18609,TOERLBIRG KOPF,,47.149167,12.359722,3115 +alps_18610,PLATTIGER HABACH,,47.140278,12.372222,3207 +alps_18611,HOHE FUERLEG,,47.141667,12.363333,3243 +alps_18612,SCHWARZ KOPF,,47.150278,12.392500,2996 +alps_18613,GAMSMUTTER,,47.154444,12.355278,3089 +alps_18614,LEITERHORN,,47.167222,12.347778,2967 +alps_18615,HABACH SPITZE,,47.160000,12.351944,3062 +alps_18616,ROSSLAHNER KOGEL,,47.185833,12.387500,2861 +alps_18617,LEITER KOGEL,,47.170556,12.342222,2987 +alps_18618,VORDER KESSEL KOGEL,,47.125000,12.410000,2713 +alps_18619,ZEIGERPALFEN,,47.136111,12.433333,2505 +alps_18620,ROTER KOGEL,,47.145000,12.451111,2946 +alps_18621,ROTE SAEULE,,47.146389,12.444444,2993 +alps_18622,SEE KOPF,,47.146944,12.406944,2921 +alps_18623,ABRETTER,,47.150278,12.435000,2979 +alps_18624,KRATZEN BERG,,47.152500,12.399722,3022 +alps_18625,GEIERING,,47.172778,12.448889,2516 +alps_18626,LARM KOGEL,,47.174167,12.403889,3017 +alps_18627,LIENZINGER,,47.185833,12.400556,2947 +alps_18628,WEISS KOGEL,,47.181944,12.456667,2749 +alps_18629,BLESSACH KOPF,,47.180556,12.400833,3050 +alps_18630,MESSELING,,47.139167,12.509444,2693 +alps_18631,DICHTEN KOGEL,,47.146944,12.464444,2839 +alps_18632,HOERNDL,,47.166389,12.516944,2852 +alps_18633,WEINBICHL,,47.154722,12.501389,2556 +alps_18634,TAUERN KOGEL,,47.157778,12.483889,2988 +alps_18635,FUERLEG,,47.168333,12.507222,2784 +alps_18636,HOCHBIRG HOEHE,,47.171667,12.465833,2767 +alps_18637,GEIERING HOEHE,,47.175556,12.461111,2746 +alps_18638,HUGGACH KOEPFE,,47.174444,12.500000,2477 +alps_18639,SCHRANK ECK,,47.185556,12.501111,2394 +alps_18640,BOCK KASTER HOEHE,,47.180278,12.458611,2727 +alps_18641,RABENSTEIN,,47.131944,12.579722,2902 +alps_18642,AMERTALER HOEHE,,47.127500,12.553611,2841 +alps_18643,RIEGEL KOPF,,47.133333,12.537222,2920 +alps_18644,TEUFELS SPITZ,,47.136944,12.535833,2818 +alps_18645,KLEIN LANDEGG KOPF,,47.140278,12.565000,2717 +alps_18646,GROSS LANDEGG KOPF,,47.136111,12.566944,2900 +alps_18647,BAEREN KOEPFE,,47.144722,12.523611,2863 +alps_18648,HOCHGASSER,,47.150556,12.521944,2922 +alps_18649,KUEHKAR HOEHE,,47.148056,12.559722,2642 +alps_18650,HOHER BEIL,,47.159167,12.558889,2671 +alps_18651,GAMSKAR HOEHE,,47.163889,12.557500,2541 +alps_18652,S.GLANZKOPF,,47.175556,12.553889,2554 +alps_18653,N.GLANZKOPF,,47.181389,12.551111,2571 +alps_18654,STEINKARLHOEHE,,47.181389,12.594167,2036 +alps_18655,WIEGENKOEPFE,,47.180833,12.618611,1738 +alps_18656,TEUFELSMUEHLE,,47.173056,12.601667,2508 +alps_18657,ROTENKOGEL,,47.169444,12.641667,2164 +alps_18658,MAGAISKOPF,,47.165000,12.600000,2640 +alps_18659,WINTERKOGEL,,47.160556,12.600833,2670 +alps_18660,SPRENGKOGEL,,47.157778,12.633056,2204 +alps_18661,KITZKARKOGEL,,47.153333,12.601667,2801 +alps_18662,SEDLGRAT,,47.153611,12.612778,2323 +alps_18663,SCHAFFELKOGEL,,47.145000,12.612778,2580 +alps_18664,VORDER SCHAFFBICHL,,47.142500,12.634722,2232 +alps_18665,HOHE FUERLEG,,47.141667,12.598611,2943 +alps_18666,STUBACHER SONNBLICK,,47.131944,12.587778,3088 +alps_18667,RIFFENKARLKOPF,,47.127222,12.655556,3016 +alps_18668,OCHSENKOEPFL,,47.143611,12.650000,2288 +alps_18669,HOCHSEDLKOPF,,47.145833,12.660833,2772 +alps_18670,GERALKOPF,,47.179444,12.683056,2931 +alps_18671,GERALSCHARTE,,47.172500,12.681111,2767 +alps_18672,KLEIN GRIESSKOGEL,,47.164167,12.695000,2669 +alps_18673,SEDLGRATKOEPFL,,47.160833,12.657500,2531 +alps_18674,GRIESSKOGEL,,47.162778,12.683056,3066 +alps_18675,HOCHEISER,,47.156111,12.673611,3206 +alps_18676,ROTER PALFEN,,47.155278,12.663056,2611 +alps_18677,KLEIN EISER,,47.143611,12.668056,2897 +alps_18678,KLEIN TENN,,47.185000,12.756944,3158 +alps_18679,SCHNEESPITZE,,47.183889,12.762500,3317 +alps_18680,HOHER TENN,,47.179722,12.759444,3368 +alps_18681,WEILINGER KOGEL,,47.177778,12.723056,1776 +alps_18682,HOHENBURG,,47.169722,12.723333,2108 +alps_18683,SANDBODENKOPF,,47.166667,12.769167,2922 +alps_18684,OBERER FOCHEZKOPF,,47.161111,12.746944,3159 +alps_18685,KLEIN WIESBACHHORN,,47.166389,12.761389,3283 +alps_18686,GROSS WIESBACHHORN,,47.156389,12.755278,3564 +alps_18687,KLOCKERIN RIEDEL,,47.155833,12.725833,2567 +alps_18688,HINTER BRATSCHENKOPF,,47.151111,12.743611,3413 +alps_18689,VORDER BRATSCHENKOPF,,47.148611,12.746944,3401 +alps_18690,KLOCKERIN,,47.146944,12.736389,3425 +alps_18691,KLEIN BAERENKOPF,,47.146111,12.719167,2727 +alps_18692,SCHWARZKOEPFL,,47.133889,12.710556,3124 +alps_18693,MT.BARENKOPF,,47.127500,12.713611,3358 +alps_18694,GROSS BAERENKOPF,,47.130833,12.731667,3396 +alps_18695,HOHE DOCK,,47.130833,12.741111,3348 +alps_18696,BERGNER KARLKOPF,,47.181667,12.800556,2171 +alps_18697,JUDENBICHL,,47.177778,12.817500,1240 +alps_18698,WALCHER HOERNDLKOPF,,47.168611,12.793889,2047 +alps_18699,HEIDNISCHE KIRCHE,,47.162500,12.780278,2535 +alps_18700,LACKKOPF,,47.161944,12.790278,2084 +alps_18701,EICHHORNRUHE,,47.142500,12.782778,1722 +alps_18702,PFALZKOPF,,47.138889,12.815556,1998 +alps_18703,PIFF,,47.134444,12.825278,2231 +alps_18704,HOCHGAMSBURG,,47.183333,12.844722,2279 +alps_18705,KLEMERBRETTKOPF,,47.175278,12.851667,2567 +alps_18706,KOENIGSTUHLHORN,,47.173889,12.882500,2603 +alps_18707,SCHWARZKOPF,,47.166944,12.860833,2765 +alps_18708,DURCHECKKOPF,,47.158333,12.854444,2680 +alps_18709,MAEUSKARKOPF,,47.152778,12.854444,2621 +alps_18710,ARCHKOGL,,47.151111,12.836389,2284 +alps_18711,HIRZKARKOPF,,47.142778,12.853889,2548 +alps_18712,BAUMGARTLKOPF,,47.139167,12.844167,2623 +alps_18713,KENDLKOPF,,47.132500,12.841389,2587 +alps_18714,SCHREINHOEHE,,47.134722,12.860000,2424 +alps_18715,KASERKOEPFL,,47.182778,12.902222,2355 +alps_18716,LEITERKOPF,,47.165556,12.940000,2322 +alps_18717,MITTERKARKOPF,,47.160278,12.940833,2404 +alps_18718,EDWEINSCHOEDERKOPF,,47.148333,12.920833,2764 +alps_18719,SCHAFKARKOGEL,,47.151667,12.930278,2732 +alps_18720,KOGLKARKOPF,,47.155278,12.938333,2565 +alps_18721,GAMSKOPF,,47.136389,12.936944,2765 +alps_18722,EDLENKOPF,,47.136389,12.926389,2923 +alps_18723,BOCKALMRIEDEL,,47.141667,12.919167,2750 +alps_18724,SCHAFLEGERKOPF,,47.125278,12.911389,2788 +alps_18725,FROESTLBERG,,47.185556,12.998056,1823 +alps_18726,GAMSKOGEL,,47.172500,13.033333,2436 +alps_18727,GUGGENSTEIN,,47.181944,13.060556,1979 +alps_18728,KIRCHLEITENKOGEL,,47.159444,13.033056,2419 +alps_18729,RUEHRKUEBEL,,47.147500,13.023056,2482 +alps_18730,TUERCHLWAND,,47.150833,13.032500,2577 +alps_18731,MAUSKARKOPF,,47.154167,13.047222,2373 +alps_18732,LUNGKOGEL,,47.146389,13.047222,2327 +alps_18733,SEEKAR KOPF,,47.193333,12.136944,2605 +alps_18734,ROSS KOPF,,47.196389,12.136389,2606 +alps_18735,SCHNECKEN KOEPFE,,47.201111,12.132500,2475 +alps_18736,SEDL KOPF,,47.191667,12.098056,2188 +alps_18737,HANGER,,47.196944,12.085000,2472 +alps_18738,PFANN KOGEL,,47.201667,12.087500,2310 +alps_18739,SILBER KOPF,,47.202778,12.092778,2169 +alps_18740,LAHNER HOEHE,,47.210833,12.088333,1964 +alps_18741,FARNBUEHEL,,47.212778,12.130000,2026 +alps_18742,SCHOEN BICHL,,47.215278,12.086389,2049 +alps_18743,FILZEN HOEHE,,47.219722,12.093333,1948 +alps_18744,PLATTEN KOGEL,,47.224444,12.135278,2039 +alps_18745,SCHOENRAIN KOEPFE,,47.188056,12.201944,2775 +alps_18746,ACHSEL KOPF,,47.196389,12.195278,2666 +alps_18747,GABEL,,47.198889,12.195278,2601 +alps_18748,RAUHER KOPF,,47.208056,12.147778,2055 +alps_18749,FEDER SPITZE,,47.208611,12.207778,2264 +alps_18750,ZWOELFER,,47.203611,12.208333,2404 +alps_18751,HUETTEN KOPF,,47.189167,12.224444,2614 +alps_18752,OBER HACKEN KOPF,,47.192222,12.234722,2406 +alps_18753,ACHKOGEL,,47.212222,12.210278,2313 +alps_18754,HOCHWINKELKAR KOPF,,47.206389,12.225556,2348 +alps_18755,GLATZ,,47.213611,12.222778,2015 +alps_18756,ELFER,,47.218333,12.218056,2124 +alps_18757,RABEN KOPF,,47.223333,12.225000,1957 +alps_18758,ABRETTER KOPF,,47.188889,12.324167,2774 +alps_18759,NOTKLAMM,,47.187222,12.279722,2187 +alps_18760,BREITFUSS,,47.194444,12.321111,2853 +alps_18761,SILBEROFEN,,47.200833,12.273611,2022 +alps_18762,HUNDSKIRCH,,47.200278,12.314444,2733 +alps_18763,GROSS FINAGL,,47.207222,12.312222,2730 +alps_18764,KLEIN FINAGL,,47.211389,12.308889,2575 +alps_18765,PLATTACH KOPF,,47.211111,12.319167,2435 +alps_18766,HEUSCHARTEN KOPF,,47.213889,12.306111,2498 +alps_18767,POPBERG,,47.221111,12.294722,2188 +alps_18768,GAMSKOGEL,,47.223889,12.312500,2107 +alps_18769,HACHEL KOPF,,47.224167,12.289167,2052 +alps_18770,WEISSHORN,,47.188889,12.383333,2829 +alps_18771,LANGER KOPF,,47.195556,12.377500,2752 +alps_18772,PAIL KOPF,,47.208611,12.386111,2524 +alps_18773,NASEN KOPF,,47.206389,12.368611,2461 +alps_18774,SCHAF KOPF,,47.220556,12.366944,2514 +alps_18775,BREIT KOPF,,47.228333,12.360000,2420 +alps_18776,GRAU KOGEL,,47.202222,12.380000,2834 +alps_18777,SCHOTTMEILER,,47.231389,12.356944,2321 +alps_18778,WILDLOSECK,,47.221389,12.394167,2312 +alps_18779,KUEH KOPF,,47.214444,12.391111,2395 +alps_18780,ELFER KOGEL,,47.240000,12.368611,2190 +alps_18781,MAHDLEITEN KOPF,,47.233611,12.368333,2348 +alps_18782,ZWOELFER KOGEL,,47.236111,12.353333,2281 +alps_18783,GEISS KOPF,,47.188056,12.450000,2748 +alps_18784,HOHER HERD,,47.199444,12.450000,2824 +alps_18785,LEITACH KOGEL,,47.207222,12.447778,2678 +alps_18786,PEMBACH KOGEL,,47.215278,12.447222,2467 +alps_18787,STUBEN KOGEL,,47.228333,12.456389,2535 +alps_18788,ARCHEN KOPF,,47.208611,12.499167,1920 +alps_18789,ACHSEL KOGEL,,47.217500,12.472222,1694 +alps_18790,PIHAPPER,,47.233889,12.461667,2513 +alps_18791,SPIELBERG KOGEL,,47.241111,12.467778,2112 +alps_18792,GLANZGSCHIRR,,47.191667,12.553889,2653 +alps_18793,SCHWARZ KOPF,,47.196111,12.564722,2476 +alps_18794,GRAULAHNER KOGEL,,47.197500,12.547778,2671 +alps_18795,BRETTEL KOPF,,47.208611,12.568889,2301 +alps_18796,SCHROT KOPF,,47.204167,12.540000,2776 +alps_18797,BRUSTINGER KOGEL,,47.215556,12.571944,2302 +alps_18798,GRUENECK KOGEL,,47.218333,12.530278,2623 +alps_18799,ZWOELFER KOGEL,,47.235278,12.525278,2446 +alps_18800,SCHIEDER HOERNDL,,47.225278,12.530000,2476 +alps_18801,SCHIEDER SCHARTE,,47.229444,12.527778,2282 +alps_18802,BIRK KOGEL,,47.242222,12.524444,2212 +alps_18803,FLACHBUEHEL,,47.248056,12.600000,2050 +alps_18804,SCHEIBENHOEHE,,47.244444,12.643889,2126 +alps_18805,SCHEIDEGG,,47.242500,12.611667,2214 +alps_18806,GAMSKRAEGEN,,47.232500,12.640000,2362 +alps_18807,LERCHWAND,,47.231667,12.614444,2388 +alps_18808,VORDER PLANITZE,,47.223333,12.637778,2538 +alps_18809,HINTER PLANITZER,,47.217778,12.636944,2562 +alps_18810,BEILWIESECK,,47.216389,12.617222,1999 +alps_18811,KOENIGSSTUHL,,47.210556,12.636667,2408 +alps_18812,JAGGESER,,47.205833,12.645278,2570 +alps_18813,MITTAGSKOGEL,,47.244722,12.676944,2167 +alps_18814,SCHOPPACH HOEHE,,47.243889,12.706667,2069 +alps_18815,BAMBAECHKOPF,,47.229722,12.681389,2516 +alps_18816,HOHE ARCHE,,47.237500,12.679444,2453 +alps_18817,RETTINGER,,47.223056,12.677500,2640 +alps_18818,TRISTKOGEL,,47.225833,12.679722,2642 +alps_18819,TRISTINGER,,47.213056,12.671389,2646 +alps_18820,KLEIN SCHMIEDINGER,,47.207222,12.675833,2739 +alps_18821,HOHE KAMMER,,47.202778,12.699444,2636 +alps_18822,KITZSTEINHORN,,47.188056,12.687778,3203 +alps_18823,MAURERKOGEL,,47.191944,12.676389,2990 +alps_18824,GROSS SCHMIEDINGER,,47.197222,12.671667,2957 +alps_18825,HACKBRETTL,,47.191944,12.662778,2708 +alps_18826,RICHTZEITSEDL,,47.191111,12.651389,2498 +alps_18827,BAUERNBRACHK,,47.191667,12.750000,3125 +alps_18828,OBER JAEGERSCHARTE,,47.203056,12.754167,2735 +alps_18829,KRAPFBRACHK,,47.209167,12.754167,2716 +alps_18830,RETTENZINK,,47.223611,12.765833,2510 +alps_18831,TUERCHELKOPF,,47.238611,12.778333,2134 +alps_18832,KREUZKOPF,,47.236944,12.796389,1915 +alps_18833,IMBACHHORN,,47.232500,12.771111,2470 +alps_18834,ROSSKOPF,,47.231944,12.786944,2152 +alps_18835,BRENNSTEIN,,47.231111,12.793056,2083 +alps_18836,ROSSKOPFL,,47.214722,12.791389,1970 +alps_18837,HOCHETZKOPF,,47.214444,12.806111,1909 +alps_18838,MITTLERES STREICHECK,,47.210556,12.786111,2248 +alps_18839,PEILSTEIN,,47.206111,12.796111,2357 +alps_18840,HINTERES STREICHECK,,47.205278,12.782500,2345 +alps_18841,HEUWAND SPITZE,,47.196389,12.812222,2088 +alps_18842,LORENZKOPF,,47.197500,12.782222,2703 +alps_18843,KANDLSPITZE,,47.192222,12.805556,2354 +alps_18844,ZWINGSPITZE,,47.191944,12.776389,2810 +alps_18845,ZWINGKOPF,,47.187222,12.772222,3117 +alps_18846,LANGWEIDKOGEL,,47.246667,12.855278,1999 +alps_18847,SCHAFELKOPF,,47.242222,12.882500,2266 +alps_18848,BREITKOPF,,47.243611,12.885833,2251 +alps_18849,STOLZKOPF,,47.245833,12.870833,2138 +alps_18850,KREUZKOEPFL,,47.213889,12.868056,2094 +alps_18851,KUEHKARLKOPF,,47.211944,12.881111,2267 +alps_18852,ACHENKOPF,,47.240278,12.896944,2260 +alps_18853,BAUKOGEL,,47.242778,12.946389,2224 +alps_18854,HIRSCHKOPF,,47.232500,12.942500,2252 +alps_18855,SCHRECKALMHOEHE,,47.229722,12.897778,2138 +alps_18856,REISSRACHKOPF,,47.220278,12.941944,2210 +alps_18857,SCHWARZWAND,,47.211111,12.935278,2194 +alps_18858,BREITEBENKOPF,,47.198333,12.907778,2236 +alps_18859,WEICHSELBACHHOEHE,,47.190833,12.907500,2220 +alps_18860,HOCHBICHEL,,47.218056,12.967222,1769 +alps_18861,GRUBERECK,,47.245833,13.025000,2167 +alps_18862,SLADINKOPF,,47.245556,13.040833,2305 +alps_18863,BERNKOGEL,,47.248611,13.043333,2325 +alps_18864,KATZINGER,,47.238611,13.050833,2155 +alps_18865,MOOSECKHOEHE,,47.234167,13.053611,2129 +alps_18866,TAGKOPF,,47.233611,13.064167,2085 +alps_18867,SEEBACHKATZENKOPF,,47.217500,13.049167,2148 +alps_18868,WACHTBERG,,47.201667,13.067500,1931 +alps_18869,JEDLKOPF,,47.207500,13.051667,2176 +alps_18870,KRAMKOGEL,,47.188611,13.036667,2454 +alps_18871,SCHWARZWAND,,47.193333,13.054444,2204 +alps_18872,ALEITENSPITZE,,47.310833,12.117500,2449 +alps_18873,SCHWEBENKOPF,,47.306389,12.114722,2354 +alps_18874,FUENFMANDLING,,47.298056,12.103889,2422 +alps_18875,DRISTKOPF,,47.288611,12.144444,2361 +alps_18876,SALZACHGEIER,,47.293611,12.103611,2469 +alps_18877,KLEEFELDKOPF,,47.286389,12.095000,2348 +alps_18878,NEBELKARSPITZE,,47.282500,12.086944,2339 +alps_18879,BRUCHECK,,47.269167,12.112222,2144 +alps_18880,MUELLACHGEIER,,47.267500,12.098889,2254 +alps_18881,KOENIGSLEITEN,,47.261389,12.089722,2315 +alps_18882,KRONDLBERG,,47.301111,12.165000,2440 +alps_18883,MITTERKOPF,,47.300278,12.180278,2306 +alps_18884,SONNWENDKOGEL,,47.290000,12.169444,2289 +alps_18885,KROENDLHORN,,47.298611,12.165278,2444 +alps_18886,BAUMGARTGEIER,,47.276667,12.146944,2392 +alps_18887,LAUBKOGEL,,47.273333,12.186111,2317 +alps_18888,GERNKOGEL,,47.265833,12.186667,2267 +alps_18889,GAMSKOGEL,,47.306667,12.232500,2206 +alps_18890,STEINKOGEL,,47.298611,12.237222,2299 +alps_18891,SPEIKOGEL,,47.302778,12.241667,2232 +alps_18892,GEIGE,,47.307500,12.252500,2084 +alps_18893,FRUHMESSER,,47.297778,12.267778,2233 +alps_18894,BRAUNKOGEL,,47.291667,12.266667,2167 +alps_18895,HUETTENKOPF,,47.291944,12.238333,2180 +alps_18896,TRATTENBACHECK,,47.278056,12.237778,2063 +alps_18897,FILZENHOEHE,,47.291389,12.327500,1921 +alps_18898,WILDKOGEL,,47.285556,12.297778,2224 +alps_18899,RESTERHOEHE,,47.307222,12.382778,1894 +alps_18900,ANGERKOPF,,47.264722,12.392778,1388 +alps_18901,PLATTE,,47.257500,12.463611,1787 +alps_18902,ATZBICHL,,47.253611,12.581389,1565 +alps_18903,DREIWALLNERHOEHE,,47.250833,12.710278,1861 +alps_18904,SCHRECKKOPF,,47.249444,12.792222,1836 +alps_18905,ETZENKOPF,,47.257778,12.905278,1848 +alps_18906,PLATTKOPF,,47.261944,12.906944,1821 +alps_18907,BRANDKOPF,,47.299167,13.010833,1144 +alps_18908,BUCHBERG,,47.308889,13.058333,1234 +alps_18909,RAUCHKOEGERL,,47.276111,13.050833,1810 +alps_18910,MITTERKOEGERL,,47.250000,13.036389,2098 +alps_18911,SCHWAIGBERGHORN,,47.371389,12.088056,1990 +alps_18912,KREUZJOCH,,47.336944,12.123056,2071 +alps_18913,DUERNBERGSTEIN,,47.328333,12.118056,2205 +alps_18914,STANGLHOEHE,,47.325000,12.121667,2276 +alps_18915,SCHAFSIEDEL,,47.314444,12.114444,2447 +alps_18916,HERZOGKOGEL,,47.322500,12.117222,2292 +alps_18917,WIESBODEN,,47.358889,12.176389,1947 +alps_18918,RAMKARKOPF,,47.348889,12.178889,2062 +alps_18919,STEINBERGSTEIN,,47.341389,12.190278,2215 +alps_18920,SCHNEEGRUBENSPITZE,,47.316111,12.180556,2237 +alps_18921,FLOCH,,47.365833,12.263889,2057 +alps_18922,GERSTINGER JOCH,,47.348333,12.261111,2035 +alps_18923,KLEINER TANZKOGEL,,47.339722,12.251389,1974 +alps_18924,GROSSER TANZKOGEL,,47.335000,12.256667,2097 +alps_18925,SCHWARZKARKOGEL,,47.330000,12.256667,2089 +alps_18926,WESTERACHKOPF,,47.319167,12.256667,2096 +alps_18927,GAMSBEIL,,47.314444,12.253611,2169 +alps_18928,SPIESSNAEGEL,,47.355833,12.307778,1880 +alps_18929,GROSSER RETTENSTEIN,,47.332778,12.296944,2366 +alps_18930,LAUBKOGEL,,47.313333,12.280000,2114 +alps_18931,SCHWARZKOGEL,,47.368611,12.344444,2030 +alps_18932,TALSENHOEHE,,47.351389,12.364722,1928 +alps_18933,KLEINER RETTENSTEIN,,47.336389,12.341667,2216 +alps_18934,BAERENBADKOGEL,,47.340278,12.381389,1883 +alps_18935,ZWEITAUSENDER,,47.323333,12.350000,2004 +alps_18936,ROSSGRUBERKOGEL,,47.328611,12.335556,2156 +alps_18937,HANGLHOEHE,,47.313611,12.369444,1940 +alps_18938,SCHUETZKOGEL,,47.369444,12.457222,2067 +alps_18939,KUHKASER,,47.336944,12.447500,2054 +alps_18940,SCHELLENBERG,,47.328611,12.442222,2048 +alps_18941,SCHOENTAGWEIDKOGEL,,47.332500,12.438889,2014 +alps_18942,RANKENKOPF,,47.312778,12.413333,1496 +alps_18943,TRISTKOGEL,,47.368056,12.476667,2095 +alps_18944,GAMSHAG,,47.364444,12.468056,2178 +alps_18945,SCHUSTERKOGEL,,47.349167,12.499167,2207 +alps_18946,TEUFELSSPRUNG,,47.356111,12.469722,2174 +alps_18947,KITZSTEIN,,47.341944,12.477778,2032 +alps_18948,GEISSSTEIN,,47.337500,12.495556,2363 +alps_18949,LEITENKOGEL,,47.329444,12.505000,2015 +alps_18950,RESCHESKOGEL,,47.326111,12.478611,2182 +alps_18951,MAURERKOGEL,,47.323889,12.470556,2129 +alps_18952,RINNKOGEL,,47.321389,12.486389,2147 +alps_18953,ZWOELFERKOGEL,,47.360833,12.569722,1983 +alps_18954,HOHE PENHAB,,47.354722,12.557778,2113 +alps_18955,STOFFENWAND,,47.341111,12.546389,2122 +alps_18956,LAMPERBUEHELKOGEL,,47.323056,12.575000,2036 +alps_18957,RABENKOPF,,47.327778,12.556389,2074 +alps_18958,MANLITZKOGEL,,47.327500,12.542222,2247 +alps_18959,MITTAGSKOGEL,,47.329722,12.527500,2092 +alps_18960,PIHAPPENKOGEL,,47.320556,12.542222,2117 +alps_18961,SCHATTBERG WEST,,47.365000,12.623333,2096 +alps_18962,MITTELGIPFEL,,47.362778,12.627778,2097 +alps_18963,SCHATTBERG OST,,47.367778,12.638889,2018 +alps_18964,STEMMERKOGEL,,47.353333,12.621389,2123 +alps_18965,SAALBACHKOGEL,,47.342778,12.620278,2092 +alps_18966,XHOCHKOGEL,,47.328056,12.615833,2249 +alps_18967,MEDALKOGEL,,47.330556,12.602778,2123 +alps_18968,BAERENSTEIGKOPF,,47.325278,12.589722,2225 +alps_18969,DILLINGER ECK,,47.370000,12.651389,1875 +alps_18970,LANGECK,,47.341667,12.674722,2021 +alps_18971,MAURERKOGEL,,47.330000,12.698333,2074 +alps_18972,OBERER GERNKOGEL,,47.332500,12.670556,2175 +alps_18973,NIEDERER GERNKOGEL,,47.328889,12.665556,2153 +alps_18974,ZIRMKOGEL,,47.331944,12.653889,2215 +alps_18975,SCHRAMBACHKOPF,,47.344722,12.756667,1856 +alps_18976,WANKRAUTKOPF,,47.345556,12.769167,1762 +alps_18977,SALERSBACHKOEPFL,,47.339167,12.744167,1934 +alps_18978,SCHMITTENHOEHE,,47.329722,12.738611,1965 +alps_18979,KETTINGKOPF,,47.328333,12.721667,1865 +alps_18980,DUERNBERGER ECK,,47.315833,12.750833,1711 +alps_18981,SCHRAMBACHKOPF,,47.344722,12.819167,1856 +alps_18982,SCHWALBENWAND,,47.364444,12.863611,2011 +alps_18983,SCHOENWIESKOPF,,47.353611,12.875278,1994 +alps_18984,HAHNECKKOGEL,,47.311944,12.854444,1857 +alps_18985,BREITER KOPF,,47.313611,12.870833,1872 +alps_18986,MOOSALMHOHE,,47.321667,12.887778,1843 +alps_18987,HOCHKASERN,,47.348611,12.950833,2077 +alps_18988,LANGEGG,,47.356944,12.920000,1899 +alps_18989,HUNDSTEIN,,47.338056,12.911389,2117 +alps_18990,OCHSENKOPF,,47.337778,12.924167,1978 +alps_18991,GALTVIEHKOPF,,47.331111,12.924167,1986 +alps_18992,PFARRACHHOEHE,,47.325833,12.925278,1922 +alps_18993,OCHSINGER,,47.334444,12.900278,1995 +alps_18994,LAMMSTEIN,,47.316944,12.935833,1732 +alps_18995,TAXBERGHOEHE,,47.314167,12.949167,1678 +alps_18996,GRUENKOEPFL,,47.368056,12.972500,1707 +alps_18997,KLINGSPITZE,,47.349722,12.959167,1988 +alps_18998,BRUENDLINGKOPF,,47.343889,12.974444,1746 +alps_18999,HOCHECK,,47.336111,12.984722,1772 +alps_19000,ESCHENAUER KOGEL,,47.325000,12.998889,1646 +alps_19001,AHORNSTEIN,,47.366389,13.043611,1855 +alps_19002,SCHNEEBERG,,47.368611,13.073611,1921 +alps_19003,SCHNEEBERGKREUZ,,47.365556,13.069167,1938 +alps_19004,HOCHEGG,,47.352222,13.072500,1817 +alps_19005,GAMSKOEGERL,,47.347500,13.066111,1746 +alps_19006,SCHREMPFALM,,47.338611,13.061111,1552 +alps_19007,MARCHBACHJOCH,,47.430278,12.101389,1496 +alps_19008,FELDALPHORN,,47.385278,12.085000,1923 +alps_19009,GLANTERER KOGEL,,47.405556,12.162222,1473 +alps_19010,NACHTSOELLBERG,,47.416389,12.248333,1886 +alps_19011,LAUBKOGEL,,47.410278,12.248333,1769 +alps_19012,FLEIDING,,47.403333,12.250000,1892 +alps_19013,GAMPENKOGEL,,47.404722,12.266111,1957 +alps_19014,SCHLEDERERKOPF,,47.387778,12.267222,1802 +alps_19015,BRECHHORN,,47.378056,12.266667,2032 +alps_19016,GAISBERG,,47.426389,12.287222,1770 +alps_19017,BREITLABALM,,47.376667,12.275556,1898 +alps_19018,ZENZERN,,47.385000,12.366667,1119 +alps_19019,HAHNENKAMM,,47.423611,12.365000,1712 +alps_19020,EHRENBACHHOEHE,,47.418333,12.359722,1802 +alps_19021,STEINBERGKOGEL,,47.402222,12.367778,1972 +alps_19022,PENGELSTEIN,,47.390833,12.348889,1938 +alps_19023,GAISBERG,,47.423056,12.475556,1798 +alps_19024,BRUNNERKOGEL,,47.433611,12.463056,1749 +alps_19025,GEBRA,,47.415278,12.493333,2057 +alps_19026,LAUBKOGEL,,47.399444,12.465833,1760 +alps_19027,BISCHOF,,47.405278,12.511944,2127 +alps_19028,MESNERHOEHE,,47.400278,12.510000,2048 +alps_19029,SCHOTTING,,47.400833,12.497222,1799 +alps_19030,SONNSPITZE,,47.395833,12.504722,2062 +alps_19031,SAALKOGEL,,47.377778,12.482778,2006 +alps_19032,STAFFKOGEL,,47.381111,12.498333,2115 +alps_19033,WILDSEELODER,,47.431944,12.531944,2118 +alps_19034,HENNE,,47.428611,12.543889,2078 +alps_19035,HOHER MAHDSTEIN,,47.418056,12.528056,2063 +alps_19036,NIEDERER MAHDSTEIN,,47.412778,12.521667,1899 +alps_19037,HOCHALMSPITZE,,47.398333,12.561944,1921 +alps_19038,REICHKENDLKOPF,,47.397778,12.551389,1941 +alps_19039,SPIELECKKOGEL,,47.390556,12.523889,1998 +alps_19040,BUERGLKOPF,,47.431389,12.593889,1730 +alps_19041,KLEBERKOPF,,47.432778,12.616667,1757 +alps_19042,SPIELBERGHORN,,47.432222,12.632778,2044 +alps_19043,REITERKOGEL,,47.401389,12.593611,1818 +alps_19044,KOHLMAISKOPF,,47.410000,12.653611,1794 +alps_19045,MARDECKKOPF,,47.408889,12.663889,1817 +alps_19046,PRUENDELKOPF,,47.405556,12.675278,1881 +alps_19047,WILDENKARKOGEL,,47.401111,12.686389,1910 +alps_19048,ASITZKOPF,,47.401944,12.702500,1914 +alps_19049,KUHFELDHOERNDL,,47.433333,12.645278,1942 +alps_19050,KNIESTICHKOGEL,,47.417222,12.724722,1570 +alps_19051,DURCHENKOPF,,47.400278,12.763611,1764 +alps_19052,HAIDERBERGKOGEL,,47.395000,12.756111,1875 +alps_19053,SAUSTEIGEN,,47.386111,12.759722,1912 +alps_19054,SCHABERGKOGEL,,47.392500,12.710833,1888 +alps_19055,BRAGGSTEIN,,47.432500,12.952222,1827 +alps_19056,BALEITENKOPF,,47.412222,12.949167,1438 +alps_19057,PRIMBACHKOEGERL,,47.402778,12.947500,1310 +alps_19058,FILZENKOPF,,47.402500,13.003056,1513 +alps_19059,GABUEHEL,,47.390000,12.985278,1636 +alps_19060,GRINNBERG,,47.380833,12.978889,1714 +alps_19061,HOCHSEILER,,47.430833,13.031111,2793 +alps_19062,LAMKOPF,,47.422222,13.041111,2846 +alps_19063,HOCHKOENIG,,47.420278,13.062500,2941 +alps_19064,KUMMETSTEIN,,47.420278,13.053333,2875 +alps_19065,WASTLHOEHE,,47.374722,13.032222,1737 +alps_19066,GROSSER BRATSCHENKOPF,,47.419722,13.078889,2857 +alps_19067,WETTERRIFFL,,47.416111,13.078611,2618 +alps_19068,TENNLADEN,,47.439167,12.113056,1269 +alps_19069,PAISSLBERG,,47.494722,12.139722,1181 +alps_19070,MOESLALMKOGEL,,47.474167,12.092778,1109 +alps_19071,RIEDERBERG,,47.468056,12.103889,1045 +alps_19072,BURGSTALLSTEIN,,47.458333,12.091389,903 +alps_19073,AUKOGEL,,47.490278,12.188333,1130 +alps_19074,SALVENBERG,,47.485278,12.193611,1238 +alps_19075,KLEINE SALVE,,47.467222,12.185556,1565 +alps_19076,HOHE SALVE,,47.465000,12.204167,1828 +alps_19077,BROMBERG,,47.490000,12.222500,1279 +alps_19078,ZINSBERG,,47.476944,12.249444,1680 +alps_19079,HARTKASER,,47.491944,12.272222,1555 +alps_19080,SCHWAIGLERKOGEL,,47.495000,12.315833,1278 +alps_19081,RAUHER KOPF,,47.474444,12.309167,1580 +alps_19082,ZENZERN,,47.447500,12.366667,1119 +alps_19083,HARSCHBICHL,,47.484167,12.428611,1604 +alps_19084,KITZBUEHELER HORN,,47.476111,12.430556,1996 +alps_19085,HORNKOEPFL,,47.466944,12.433333,1773 +alps_19086,PFEIFFERKOGEL,,47.457222,12.453056,1669 +alps_19087,WILDER HAG,,47.459722,12.422222,1639 +alps_19088,HOCHETZKOGEL,,47.443333,12.451667,1738 +alps_19089,OBINGKOGEL,,47.484722,12.473889,1303 +alps_19090,REISENBERGKOEPFL,,47.476389,12.470278,1362 +alps_19091,KARSTEIN,,47.455278,12.487500,1922 +alps_19092,STUCKKOGEL,,47.441111,12.465833,1888 +alps_19093,BUCHENSTEINWAND,,47.483889,12.580833,1456 +alps_19094,LIENDLMAIS,,47.456111,12.566667,1184 +alps_19095,PLATTE,,47.440000,12.524722,1906 +alps_19096,LAERCHFILZKOGEL,,47.442778,12.549722,1654 +alps_19097,TANNKOGEL,,47.497778,12.600833,1289 +alps_19098,GEIERKOGEL,,47.496667,12.637778,1753 +alps_19099,KIRCHL,,47.496944,12.628056,1691 +alps_19100,SCHRECKKOPF",,47.437500,12.629722,1769 +alps_19101,HEUECK,,47.492778,12.685556,1757 +alps_19102,BARBARAHORN,,47.488056,12.697500,2058 +alps_19103,HOCHBRETT,,47.476111,12.701111,2470 +alps_19104,GROSSES MARCHENTHORN,,47.479167,12.698889,2375 +alps_19105,KALTACHKOPF,,47.478333,12.661389,1348 +alps_19106,GEISSKOPF,,47.466389,12.658056,1456 +alps_19107,HOCHDURCHK,,47.470556,12.679167,1722 +alps_19108,DREI ZINTHOERNER,,47.473889,12.706944,2486 +alps_19109,GROSSES ROTHORN,,47.495278,12.720000,2430 +alps_19110,SCHAFSPITZE,,47.490278,12.716944,2456 +alps_19111,PASSAUERKOPF,,47.483056,12.715556,2465 +alps_19112,DUERRKARHORN,,47.488056,12.743611,2286 +alps_19113,METZHOERNDL,,47.483056,12.746667,2135 +alps_19114,MITTERHORN,,47.475000,12.759167,206 +alps_19115,BIRNHORN,,47.474722,12.733889,2634 +alps_19116,SCHARLEITHOERNER,,47.472222,12.724167,2461 +alps_19117,ROTHOERNDLN,,47.474444,12.716111,2406 +alps_19118,HUNDSHOERNDLN,,47.476944,12.710556,2484 +alps_19119,SIGNALKOPF,,47.481111,12.714722,2465 +alps_19120,KUCHELHORN,,47.481111,12.735000,2507 +alps_19121,JAUZKOPF,,47.470556,12.728889,2492 +alps_19122,BRANDLHORN,,47.474167,12.777500,2095 +alps_19123,FINSTERBACHKOPF,,47.494444,12.863333,2164 +alps_19124,SCHINDLKOEPFE,,47.490556,12.884167,2357 +alps_19125,HOLLERMAISSHORN,,47.483889,12.891389,2299 +alps_19126,SCHARTENKOPF,,47.479167,12.895000,2308 +alps_19127,PERSAILHORN,,47.460000,12.891667,2347 +alps_19128,ROTWANDL,,47.476389,12.922778,2231 +alps_19129,BRANDENBERG,,47.472222,12.954722,2299 +alps_19130,ACHSELHORN,,47.467500,12.899722,2467 +alps_19131,AEULHOEHE,,47.467778,12.907500,2314 +alps_19132,MITTERHORN,,47.460833,12.900833,2491 +alps_19133,SCHOENFELDSPITZE,,47.458056,12.937500,2653 +alps_19134,WURMKOPF,,47.456667,12.928056,2451 +alps_19135,SCHOENEGG,,47.453333,12.919167,2390 +alps_19136,BREITHORN,,47.456944,12.902778,2504 +alps_19137,HUEHNERKOEPFE,,47.494722,12.895833,2089 +alps_19138,WILDALMROTKOPF,,47.473611,12.981667,2517 +alps_19139,BRUNNSULZENGRAT,,47.465833,12.971667,2433 +alps_19140,GROSSE HUNDSSCHAEDEL,,47.462778,13.018611,2394 +alps_19141,MITTLERE HUNDSSCHAEDEL,,47.458056,13.016389,2392 +alps_19142,KLEINE HUNDSSCHAEDEL,,47.453889,13.011667,2468 +alps_19143,LANGEGG,,47.454167,13.007500,2593 +alps_19144,SELBHORNGRAT,,47.458611,12.967500,2539 +alps_19145,MITTERHOERNDL,,47.451667,12.985000,2568 +alps_19146,SELBHORN,,47.446944,12.963611,2655 +alps_19147,BONEGG,,47.442778,12.976389,2560 +alps_19148,SCHAREGG,,47.446389,12.983889,2570 +alps_19149,WILDALMKIRCHL,,47.447778,12.992778,2578 +alps_19150,BRANDHORN,,47.447222,13.004444,2610 +alps_19151,TANNTALHOEHE,,47.498889,13.078889,2223 +alps_19152,RAUCHEGG,,47.493333,13.067778,2216 +alps_19153,ALPRIEDLHORN,,47.471111,13.023056,2351 +alps_19154,HOHER TENNECK,,47.448889,13.066111,2435 +alps_19155,REISSHORN,,47.454167,13.027222,2412 +alps_19156,MARTELKOPF,,47.446111,13.022222,2445 +alps_19157,FLIEGERKOEPFL,,47.444444,13.070556,2370 +alps_19158,EIBERGKOPF,,47.543611,12.190278,1089 +alps_19159,ACHLEITNERKOGEL,,47.532778,12.204722,1229 +alps_19160,KLEINER POELVEN,,47.517778,12.166111,1562 +alps_19161,MITTAGSKOGEL,,47.510278,12.151389,1595 +alps_19162,ZETTENKAISERKOPF,,47.554722,12.218889,1609 +alps_19163,SCHEFFAUER,,47.557222,12.242222,2111 +alps_19164,HACKENKOEPFE,,47.560833,12.254444,2125 +alps_19165,SONNENSTEIN,,47.557222,12.267222,1714 +alps_19166,ROTENALM,,47.504167,12.251667,1215 +alps_19167,TREFFAUER,,47.555278,12.291667,2304 +alps_19168,TUXECKOPF,,47.552500,12.289722,2226 +alps_19169,KAISERKOPF,,47.558333,12.302222,2171 +alps_19170,TOERLSPITZE,,47.560833,12.328333,2204 +alps_19171,REGALPSPITZE,,47.556667,12.339167,2253 +alps_19172,ACKERLSPITZE,,47.559167,12.347500,2329 +alps_19173,MAUKSPITZE,,47.558889,12.356667,2231 +alps_19174,BRENNENDER PALVEN,,47.546667,12.335833,1572 +alps_19175,SCHEIBELBERG,,47.533611,12.342500,1106 +alps_19176,HUETTLINGBERG,,47.534167,12.362500,1028 +alps_19177,SCHATTERBERG,,47.544722,12.411111,1274 +alps_19178,MITTERBERG,,47.543333,12.501667,1344 +alps_19179,KALKSTEIN,,47.530556,12.485278,1506 +alps_19180,KIRCHBERG,,47.537500,12.535833,1678 +alps_19181,SCHAFELBERG,,47.536667,12.546944,1597 +alps_19182,GERSTBERG,,47.524722,12.541111,1661 +alps_19183,WALLERBERG,,47.514722,12.535000,1682 +alps_19184,SCHARTENKOGEL,,47.510833,12.558889,1414 +alps_19185,WAIDRINGER JOCH,,47.540278,12.596111,1727 +alps_19186,ZWOELFERHOERNL,,47.557222,12.605556,2105 +alps_19187,ROTHORN,,47.552778,12.613889,2400 +alps_19188,MITTERHORN,,47.549444,12.628611,2506 +alps_19189,GEISELHORN,,47.536944,12.629722,2291 +alps_19190,REIFHORN,,47.541111,12.643889,2488 +alps_19191,SEEHORN,,47.545000,12.600000,2155 +alps_19192,BRENNTERKOPF,,47.513056,12.642778,1514 +alps_19193,UNTERBERG,,47.510833,12.604167,1187 +alps_19194,GROSSER TAGWEID,,47.500278,12.645000,1691 +alps_19195,VORDERHORN,,47.543333,12.683333,2109 +alps_19196,VORDERES OCHSENHORN,,47.540278,12.672778,2299 +alps_19197,MITTLERES OCHSENHORN,,47.539167,12.668611,2366 +alps_19198,GROSSES OCHSENHORN,,47.538333,12.660833,2511 +alps_19199,DREISPITZ,,47.530278,12.654444,1940 +alps_19200,KLEINER TAGWEID,,47.503889,12.653056,1646 +alps_19201,HOCHSAEUL,,47.508333,12.669722,1757 +alps_19202,LAMMBERG,,47.503056,12.661944,1697 +alps_19203,THURNECK,,47.553056,12.711667,1355 +alps_19204,GERHARDSTEIN,,47.538333,12.752222,1536 +alps_19205,HUNDSFUSS,,47.545833,12.734722,1253 +alps_19206,LAHNERHORN,,47.508333,12.727500,2019 +alps_19207,LITZLKOGEL,,47.551111,12.778889,1625 +alps_19208,HOCHKRANZ,,47.523333,12.790278,1953 +alps_19209,KOPFSTEIN,,47.508056,12.797778,1525 +alps_19210,RAUCHKOPF,,47.502222,12.824444,1953 +alps_19211,SEEHORN,,47.516667,12.853056,2321 +alps_19212,PRAGHORN,,47.499722,12.843889,2143 +alps_19213,MANDLHOEHE,,47.535833,13.061944,2049 +alps_19214,LANGTALSCHNEID,,47.519444,13.061944,2228 +alps_19215,PARADEISKOEPFE,,47.506944,13.067222,2169 +alps_19216,STANGENKOPF,,47.513056,13.080833,2144 +alps_19217,OFENSTEINWAND,,47.609444,12.108611,1300 +alps_19218,MEISTALLER BERG,,47.583333,12.131389,998 +alps_19219,DREIBRUNNENJOCH,,47.578333,12.131111,946 +alps_19220,MITTAGSKOPF,,47.568056,12.101944,1543 +alps_19221,PENDLING,,47.571389,12.109444,1563 +alps_19222,WINTERKOPF,,47.563056,12.184444,1226 +alps_19223,EINSERKOGEL,,47.611944,12.263056,1924 +alps_19224,PETERSKOEPFL,,47.608889,12.246944,1745 +alps_19225,ZEHNERKOPF,,47.604444,12.228056,1241 +alps_19226,LAHNKOPF,,47.601667,12.218333,1204 +alps_19227,ROGERKOPF,,47.599722,12.212778,1138 +alps_19228,BRANDKOGEL,,47.573889,12.244444,1411 +alps_19229,GAMSKOGEL,,47.580278,12.234444,1449 +alps_19230,WIESBERG,,47.563333,12.264444,2000 +alps_19231,JOVENSPITZE,,47.613611,12.281389,1890 +alps_19232,PYRAMIDENSPITZE,,47.610000,12.277222,1997 +alps_19233,HEUBERG,,47.619444,12.310000,1603 +alps_19234,KOHLLAHNERKOPF,,47.597222,12.320833,1556 +alps_19235,VORDERE KESSELSCHNEID,,47.606944,12.277778,2001 +alps_19236,HINTERE KESSELSCHNEID,,47.603333,12.283056,1995 +alps_19237,FELDBERG,,47.592500,12.324444,1813 +alps_19238,STRIPSENKOPF,,47.581944,12.308611,1807 +alps_19239,KOPFKRAXEN,,47.562222,12.278056,2190 +alps_19240,SONNECK,,47.561667,12.283889,2260 +alps_19241,GAMSHALT,,47.564444,12.300556,2291 +alps_19242,ELLMAUER HALT,,47.561667,12.302778,2344 +alps_19243,VORDERE KARLSPITZE,,47.563889,12.316389,2260 +alps_19244,HINTERE KARLSPITZE,,47.566667,12.315556,2281 +alps_19245,VORDERER GOINGER HALT,,47.564444,12.325556,2242 +alps_19246,XHINTERER GOINGER HALT,,47.568889,12.324444,2192 +alps_19247,TOTENKIRCHL,,47.569722,12.312222,2190 +alps_19248,FLEISCHBANK,,47.569167,12.318056,2186 +alps_19249,PREDIGSTUHL,,47.570556,12.323611,2116 +alps_19250,SCHEIBENKOGEL,,47.609167,12.350000,1614 +alps_19251,SCHNEEBICHL,,47.593333,12.357778,1470 +alps_19252,MITTERKAISER,,47.567500,12.336944,2011 +alps_19253,LAERCHEGG,,47.568889,12.351667,2123 +alps_19254,SCHNAPPEN,,47.608889,12.409722,1546 +alps_19255,UNTERBERGHORN,,47.620556,12.436667,1773 +alps_19256,HEFFERTHORN,,47.618333,12.439444,1735 +alps_19257,KOHLENBERG,,47.586389,12.425833,1362 +alps_19258,REITBERG,,47.571111,12.398056,1129 +alps_19259,LEERBERG,,47.566389,12.438333,1213 +alps_19260,EGGENALMKOGEL,,47.623611,12.513056,1685 +alps_19261,FELLHORN,,47.609722,12.509167,1764 +alps_19262,BERNFARCHTKOGEL,,47.611944,12.550000,1537 +alps_19263,STEINPLATTE,,47.603889,12.580833,1869 +alps_19264,GRUENWALDKOPF,,47.603056,12.563889,1521 +alps_19265,HAUSBERG,,47.576667,12.559444,1120 +alps_19266,GRUENDBERG,,47.575556,12.526389,1231 +alps_19267,HOCHGRUENDBERG,,47.565000,12.535833,1495 +alps_19268,MUEHLBERG,,47.572778,12.578889,1026 +alps_19269,WAIDRINGER JOCH,,47.602778,12.596111,1727 +alps_19270,DIETRICHSHORN,,47.621944,12.674167,1542 +alps_19271,GFOELLHOERNL,,47.601667,12.666667,1627 +alps_19272,GRUBHOERNL,,47.596667,12.661389,1747 +alps_19273,LAERCHBERGHOERNL,,47.592500,12.669722,1535 +alps_19274,LACHFELDKOPF,,47.587778,12.663333,1680 +alps_19275,EIBLHORN,,47.563333,12.652778,1993 +alps_19276,RAUCHENBERG,,47.565556,12.686944,1293 +alps_19277,LENZENKOGEL,,47.614167,12.720000,989 +alps_19278,HIEFELWAND,,47.607778,12.768333,1821 +alps_19279,PERHORN,,47.597778,12.734722,1384 +alps_19280,GROSSES HUNDSHORN,,47.582500,12.750000,1703 +alps_19281,KIENBERG,,47.581667,12.721111,1304 +alps_19282,KOETSCHMAIRHORN,,47.568611,12.741944,1593 +alps_19283,POINTELKOPF,,47.570556,12.751111,1605 +alps_19284,GUGGENBUEHEL,,47.617778,12.781111,1713 +alps_19285,ROSSBUEHEL,,47.611389,12.796667,1962 +alps_19286,HAUSELHORN,,47.601944,12.784444,2284 +alps_19287,LOCHNER HORN,,47.676389,12.332222,1448 +alps_19288,BRENNKOPF,,47.675000,12.310556,1353 +alps_19289,MIESBERG,,47.651389,12.305278,968 +alps_19290,EBERSBERG,,47.630278,12.331944,1164 +alps_19291,RESCHARKOPF,,47.678611,12.346111,1393 +alps_19292,STAFFNER,,47.665833,12.382778,930 +alps_19293,RIEDLBERG,,47.666111,12.363056,1136 +alps_19294,HORAUER SPITZE,,47.663611,12.350556,1117 +alps_19295,FEILENBERG,,47.676111,12.413889,748 +alps_19296,LOFERBERG,,47.649167,12.453056,1018 +alps_19297,WALMBERG,,47.683611,12.494167,1062 +alps_19298,WINDBICHL,,47.624722,12.548333,1513 +alps_19299,SCHEIBELBERG,,47.631389,12.574722,1465 +alps_19300,HOCHGIMPLING,,47.662778,12.622500,1537 +alps_19301,MARTINSBUEHEL,,47.649167,12.610833,1326 +alps_19302,PRUNZBERG,,47.640278,12.615833,1264 +alps_19303,REIFELBERG,,47.682222,12.678333,1883 +alps_19304,HIRSCHECK,,47.682500,12.684722,1907 +alps_19305,SONNTAGSHORN,,47.681944,12.696389,1961 +alps_19306,FISCHBACHKOPF,,47.681111,12.666667,1696 +alps_19307,KUEHSTEIN,,47.663056,12.699722,1615 +alps_19308,DICKKOPF,,47.653611,12.659444,1204 +alps_19309,LIEDERSBERG,,47.633611,12.702222,1026 +alps_19310,HOCHGSENG,,47.666667,12.716389,1537 +alps_19311,ACHHORN,,47.653056,12.759167,1316 +alps_19312,PRECHLERBERG,,47.632778,12.717500,1031 +alps_19313,KRANZKOPF,,47.629444,12.748333,1017 +alps_19314,DREI BRUEDER,,47.626667,12.776389,1864 +alps_19315,WEITSCHARTENKOPF,,47.631944,12.787222,1979 +alps_19316,LOCHNER HORN,,47.738889,12.332222,1448 +alps_19317,BRENNKOPF,,47.737500,12.310556,1353 +alps_19318,MIESBERG,,47.713889,12.305278,968 +alps_19319,EBERSBERG,,47.692778,12.331944,1164 +alps_19320,HOCHKOEPFL,,47.691389,12.321944,1539 +alps_19321,WANDBERG,,47.687222,12.303333,1454 +alps_19322,HINTERER RAUSCHBERG,,47.733056,12.697222,1671 +alps_19323,VORDERER RAUSCHBERG,,47.732778,12.685000,1645 +alps_19324,LANZELECK,,47.706389,12.704444,1292 +alps_19325,SAURUESSELKOPF,,47.696944,12.649722,1271 +alps_19326,ADLERKOPF,,47.696111,12.668333,1338 +alps_19327,KIENBERGL,,47.746389,12.741944,1135 +alps_19328,FALKENSTEIN,,47.747222,12.757778,1181 +alps_19329,ZENOKOPF,,47.734444,12.719722,1603 +alps_19330,SESSSEEKOPF,,47.716111,12.714444,1153 +alps_19331,LITZLBACHHOERNL,,47.704167,12.735833,1330 +alps_19332,AUGENSTEIN,,47.699167,12.717500,1584 +alps_19333,OCHSENHORN,,47.689167,12.719444,1615 +alps_19334,RAMETER SPITZE,,47.026944,13.127222,2695 +alps_19335,GREIL KOPF,,47.025000,13.101111,2583 +alps_19336,KLEIN WOISGEN KOPF,,47.034722,13.133333,2557 +alps_19337,GROSSER WOISGEN KOPF,,47.035833,13.140556,2708 +alps_19338,MALLINTZ RIEGEL,,47.042500,13.120556,2611 +alps_19339,KREUZ KOGEL,,47.053889,13.100556,2686 +alps_19340,SALESEN KOGEL,,47.060278,13.093611,2681 +alps_19341,HONIGLEITEN KOPF,,47.061389,13.115556,2438 +alps_19342,GOETTINGER SPITZE,,47.035556,13.151944,2749 +alps_19343,GAMSKARL SPITZ,,47.036944,13.162500,2832 +alps_19344,EBENECK,,47.043611,13.204444,2608 +alps_19345,SCHOENBRETTER KOGEL,,47.042778,13.191111,2738 +alps_19346,TOTER STEIN,,47.047778,13.165833,2501 +alps_19347,VIEHZEIT KOGEL,,47.050278,13.182500,2481 +alps_19348,ROSSKAR KOPF,,47.049722,13.151389,2545 +alps_19349,GRASLEITEN KOPF,,47.059444,13.149167,2377 +alps_19350,MARESEN SPITZ,,47.004167,13.230278,2915 +alps_19351,TROMKOPF,,47.001944,13.243611,2702 +alps_19352,CELLER SPITZE,,47.029167,13.269444,2853 +alps_19353,SCHAFLEGG,,47.000833,13.250833,2708 +alps_19354,GRAULEITEN SPITZ,,47.046944,13.228056,2893 +alps_19355,ANKOGEL,,47.051111,13.249167,3246 +alps_19356,SCHWARZ KOPF,,47.055556,13.245278,3168 +alps_19357,GUSSENBAUER SPITZE,,47.000278,13.296944,2978 +alps_19358,SCHNEEWINKEL SPITZE,,47.003333,13.301667,3016 +alps_19359,WINKEL SPITZ,,47.011389,13.314722,3112 +alps_19360,HOCHALM SPITZE,,47.015000,13.321111,3360 +alps_19361,JOCH SPITZEN,,47.019722,13.313889,3178 +alps_19362,GROSSELEND KOPF,,47.019167,13.319722,3315 +alps_19363,ELEND KOEPFE,,47.024167,13.325556,3071 +alps_19364,KAERL SPITZ,,47.024722,13.287778,2936 +alps_19365,KAELBER SPITZEN,,47.033889,13.285000,2838 +alps_19366,OBERLERCHER SPITZE,,47.041389,13.327500,3051 +alps_19367,BRUNNKAR SCHNEID,,47.053611,13.323611,2770 +alps_19368,BRUNNKAR KOPF,,47.049722,13.305556,2397 +alps_19369,KLEINER HOCHALMER,,47.005000,13.351667,2910 +alps_19370,ZSIGMONDY KOPF,,47.010000,13.335556,3152 +alps_19371,KORDON SPITZ,,47.010833,13.343056,3102 +alps_19372,GAMSNOCK,,47.009444,13.387222,2386 +alps_19373,PREIML SPITZ,,47.029444,13.334444,3133 +alps_19374,VORDERER FINDELKAR KOPF,,47.042778,13.359444,2418 +alps_19375,STEINKARECK,,47.053333,13.340278,2571 +alps_19376,WASCHGANG,,47.051111,13.451389,2709 +alps_19377,GROSSER SONNBLICK,,47.048333,13.423056,3030 +alps_19378,MITTLERER SONNBLICK,,47.052500,13.431389,2999 +alps_19379,KARSCHNEID ECK,,47.061944,13.411111,2972 +alps_19380,LANISCH ECK,,47.054722,13.416389,3024 +alps_19381,KLEINER SONNBLICK,,47.055556,13.433056,2992 +alps_19382,FASCHAUNER ECK,,47.006389,13.501389,2614 +alps_19383,REITER ECK,,47.019444,13.504722,2790 +alps_19384,ELEND SPITZE,,47.023889,13.497778,2782 +alps_19385,TASCHEN SPITZE,,47.026111,13.466944,2763 +alps_19386,SCHOBER,,47.034444,13.468333,2967 +alps_19387,GIRLITZ SPITZE,,47.036667,13.511944,2468 +alps_19388,SEEMANN WAND,,47.031389,13.483056,2822 +alps_19389,EISIG SPITZ,,47.045833,13.462500,2746 +alps_19390,HIRNECK,,47.002500,13.570000,2218 +alps_19391,FELDHOEHE,,47.008611,13.574444,2163 +alps_19392,POISNIG,,47.012778,13.530000,2528 +alps_19393,WAND SPITZE,,47.018333,13.525278,2623 +alps_19394,STERN SPITZE,,47.018889,13.541389,2497 +alps_19395,ABSPRUNG,,47.055278,13.563333,2288 +alps_19396,KARECK,,47.058611,13.554167,2481 +alps_19397,STEINWAND ECK,,47.060000,13.546944,2475 +alps_19398,TSCHANECK,,47.061111,13.596667,2024 +alps_19399,AINECK,,47.055833,13.639167,2210 +alps_19400,TEUERLNOCK,,47.042778,13.644444,2145 +alps_19401,SCHOENGELITZHOEHE,,47.040278,13.688056,1812 +alps_19402,EBENWALDHOEHE,,47.028611,13.676389,1848 +alps_19403,TURNHOEHE,,47.005000,13.657222,2078 +alps_19404,SCHERECK,,47.007222,13.677500,2181 +alps_19405,SCHWARZWAND,,47.007500,13.693333,2214 +alps_19406,GMEINNOCK,,47.001667,13.702500,2130 +alps_19407,FEGENDORFER KOPF,,47.043056,13.757778,2003 +alps_19408,WIRTSNOCK,,47.019722,13.751389,2014 +alps_19409,LENZENBUEHEL,,47.000000,13.750833,2106 +alps_19410,PIRKEGG,,47.046111,13.808611,1808 +alps_19411,HUEHNERLEITENNOCK,,47.032222,13.777500,2182 +alps_19412,MUEHLHAUSERHOEHE,,47.023611,13.780000,2216 +alps_19413,VORDERECK,,47.015833,13.831111,2133 +alps_19414,PREDIGSTUHL,,47.015833,13.805000,2097 +alps_19415,KLEINE KOENIGSTUHL,,47.007222,13.804444,2254 +alps_19416,FELDERNOCK,,47.006944,13.820278,257 +alps_19417,GSTOSSHOEHE,,47.046944,13.855000,1890 +alps_19418,ROTOFEN,,47.019444,13.864167,1999 +alps_19419,KARLSBERGERECK,,47.061111,13.943889,1838 +alps_19420,STEIBERHOEHE,,47.040833,13.942500,1954 +alps_19421,STRANNERHOEHE,,47.025000,13.949444,2116 +alps_19422,WUERFLINGHOEHE,,47.013611,13.947222,2198 +alps_19423,TSCHAUDINOCK,,47.016111,13.931389,2200 +alps_19424,ROSENKRANZHOEHE,,47.055000,14.049722,2118 +alps_19425,KIRBISCH,,47.049722,14.051111,2140 +alps_19426,GOLDACHNOCK,,47.034722,14.057500,2171 +alps_19427,PRANKERHOEHE,,47.023333,14.068611,2166 +alps_19428,SCHWARMBRUNNHOEHE,,47.021944,14.079167,2120 +alps_19429,ZITTERAUER TISCH,,47.098056,13.086389,2461 +alps_19430,STUBNER KOGEL,,47.113056,13.099444,2246 +alps_19431,LAINKAR KOGEL,,47.075000,13.186667,2428 +alps_19432,HOELLTOR SPITZE,,47.071111,13.207222,2845 +alps_19433,FEUERSANG,,47.085000,13.156667,2468 +alps_19434,PALFNER SEEKOPF,,47.084722,13.180556,2531 +alps_19435,HOHER STUHL,,47.086667,13.150833,2331 +alps_19436,RAUCHZAGE KOGEL,,47.100833,13.199722,1988 +alps_19437,GRAU KOGEL,,47.096667,13.171944,2492 +alps_19438,TISCHLER SPITZE,,47.071667,13.240556,3001 +alps_19439,HOELLTOR KOGEL,,47.074167,13.211111,2905 +alps_19440,ROT SPITZE,,47.073333,13.221667,2897 +alps_19441,TISCHLERKAR KOPF,,47.078889,13.245556,3002 +alps_19442,TIRESCHLERKAR SCHARTE,,47.086111,13.248889,2723 +alps_19443,BOECKSTEIN KOGEL,,47.095278,13.231667,2527 +alps_19444,STEINBACH KOGEL,,47.088056,13.255000,2870 +alps_19445,KREUZ KOGEL,,47.108889,13.265000,2620 +alps_19446,GRASLEITEN KOGEL,,47.115556,13.228333,2406 +alps_19447,MANDL KOGEL,,47.117778,13.260833,2442 +alps_19448,GLASERER,,47.121111,13.215556,2434 +alps_19449,SCHWARZHORN,,47.068611,13.278889,2933 +alps_19450,STEINKAR SPITZ,,47.064167,13.322778,2661 +alps_19451,GAMSKAR NOCK,,47.069722,13.328611,2564 +alps_19452,ZWOELFER SPITZ,,47.096667,13.291667,2773 +alps_19453,KEES KOGEL,,47.095278,13.278056,2884 +alps_19454,ELFER KOGEL,,47.111667,13.303889,2340 +alps_19455,LAUSNOCK,,47.079444,13.360833,2443 +alps_19456,PETER ECK,,47.080000,13.382500,2893 +alps_19457,KOELNBREIN SPITZE,,47.092222,13.380556,2934 +alps_19458,HADERLING SPITZE,,47.096667,13.389444,2761 +alps_19459,KALTWAND SPITZE,,47.097222,13.365833,2822 +alps_19460,MURITZEN SCHARTE,,47.105000,13.352222,2386 +alps_19461,MARCHKAR ECK,,47.110833,13.347500,2661 +alps_19462,FRAUEN NOCK,,47.119444,13.358333,2678 +alps_19463,HAFNER,,47.070000,13.400833,3076 +alps_19464,LANISCH HAFNER,,47.068889,13.406667,3018 +alps_19465,OBLITZEN,,47.080000,13.458056,2658 +alps_19466,SCHURF SPITZE,,47.078333,13.437778,2664 +alps_19467,KESSEL WAND,,47.077778,13.419167,2855 +alps_19468,KESSEL SPITZE,,47.081111,13.428056,2763 +alps_19469,SILBER ECK,,47.086667,13.431667,2810 +alps_19470,OCHSEN KOPF,,47.091389,13.437778,2676 +alps_19471,VORDERER SCHOBER,,47.109722,13.396667,2681 +alps_19472,MANNSITZ,,47.115278,13.397500,2547 +alps_19473,BETTEL WAND,,47.120833,13.397222,2340 +alps_19474,STORZ SPITZ,,47.071667,13.502500,2469 +alps_19475,HARRER SPITZE,,47.075833,13.483333,2434 +alps_19476,DOLENZ BERG,,47.120278,13.490000,2390 +alps_19477,KENDL SPITZE,,47.110278,13.515278,2323 +alps_19478,BRETTER ECK,,47.119167,13.503889,2406 +alps_19479,GROSS ECK,,47.115556,13.512222,2427 +alps_19480,BRANDRIEGEL,,47.063333,13.538611,2371 +alps_19481,ZICKENBERG HOEHE,,47.100556,13.548333,2064 +alps_19482,SCHROVIN KOPF,,47.111389,13.532500,2203 +alps_19483,GRANDL NASEN,,47.108056,13.535833,2204 +alps_19484,HOLLERBERG,,47.108056,13.673611,1601 +alps_19485,HOHENBUEHEL,,47.118889,13.726111,1581 +alps_19486,FINGERLINGNOCK,,47.085000,13.750278,1604 +alps_19487,GOLDBRUNNOCK,,47.095556,13.781944,1766 +alps_19488,MAISSLHOEHE,,47.098333,13.796667,1696 +alps_19489,HOCHKOPF,,47.088056,13.785278,1779 +alps_19490,OBERNOCK,,47.080000,13.777778,1722 +alps_19491,HEINRICHSHOEHE,,47.114722,13.845000,1616 +alps_19492,SALZRIEGEL,,47.109722,13.887500,1888 +alps_19493,LASABERG,,47.103611,13.873889,1935 +alps_19494,DORNKOGEL,,47.099167,13.878889,1889 +alps_19495,ROTKOPF,,47.093333,13.881111,1853 +alps_19496,PAYERHOEHE,,47.121944,13.980556,1966 +alps_19497,BODENDORFER OCHSENBERG,,47.089167,14.037222,1655 +alps_19498,GEISSKARKOPF,,47.185278,13.141389,2384 +alps_19499,RAUCHKOGEL,,47.165000,13.143333,2208 +alps_19500,TENNKOGEL,,47.178333,13.157778,2333 +alps_19501,FRAUENKOGEL,,47.173333,13.166944,2423 +alps_19502,SCHROTTWAND,,47.183333,13.157222,2318 +alps_19503,ARAPPKOPF,,47.160556,13.195278,2193 +alps_19504,GAMSKARKOGEL,,47.161111,13.158611,2467 +alps_19505,THRONECK,,47.147500,13.173611,2212 +alps_19506,KREUZKOGEL,,47.146389,13.185833,2324 +alps_19507,SCHOENWEIDKOGEL,,47.126944,13.200556,2237 +alps_19508,FLUGKOPF,,47.130278,13.194444,231 +alps_19509,KARKOGEL,,47.140556,13.261111,2088 +alps_19510,HEIDENTEMPEL,,47.125278,13.210833,2315 +alps_19511,SPIELKOGEL,,47.135000,13.260278,2143 +alps_19512,PLATTENKOGEL,,47.128056,13.260000,2270 +alps_19513,SCHATTLEITENKOPF,,47.176389,13.291944,2014 +alps_19514,KREUZECK,,47.173889,13.307500,205 +alps_19515,GURENSTEIN,,47.185556,13.303889,2220 +alps_19516,RIFFL,,47.169444,13.315000,2265 +alps_19517,GLINGSPITZE,,47.159167,13.318333,2433 +alps_19518,SCHOEDERHORN,,47.125000,13.333056,2475 +alps_19519,MURECK,,47.130556,13.336389,2402 +alps_19520,FRISCHING HOEHE,,47.130278,13.373056,2466 +alps_19521,NEBELKAR ECK,,47.143056,13.336667,2535 +alps_19522,JAEGER SPITZE,,47.146389,13.339167,2508 +alps_19523,KLEINER REICHESCH KOGEL,,47.155278,13.360000,2348 +alps_19524,GROSSER REICHESCH KOGEL,,47.160556,13.365000,2413 +alps_19525,WEISS ECK,,47.162500,13.394167,2711 +alps_19526,RIEDING SPITZE,,47.180556,13.373333,2266 +alps_19527,WEISSGRUBEN KOPF,,47.186111,13.333056,2369 +alps_19528,SCHWARZ KOGEL,,47.176111,13.369722,2206 +alps_19529,SCHIER ECK,,47.175000,13.334722,2366 +alps_19530,HELM,,47.126389,13.449167,2340 +alps_19531,SILBER PLATTEN,,47.136389,13.434722,2482 +alps_19532,KREUZ HOEHE,,47.140556,13.455833,2521 +alps_19533,PLEISSNITZ KOGEL,,47.139167,13.440556,2536 +alps_19534,ROETH SPITZE,,47.140833,13.426667,2413 +alps_19535,PLANKOWITZ SPITZE,,47.146667,13.408333,2412 +alps_19536,BARLEITEN KOPF,,47.151389,13.401111,2431 +alps_19537,FELSKAR SPITZE,,47.157500,13.400000,2506 +alps_19538,KEMPEN,,47.164722,13.414167,2277 +alps_19539,GRIESSEN SPITZE,,47.128889,13.478889,2504 +alps_19540,SCHOBER,,47.144444,13.469167,2222 +alps_19541,WABEN SPITZE,,47.137222,13.485000,2360 +alps_19542,MARISL WAND,,47.137778,13.465278,2529 +alps_19543,SCHWARZ ECK,,47.185000,13.518333,2636 +alps_19544,KLEINE GUGLSPITZE,,47.185278,13.484444,2570 +alps_19545,HAGLEITEN SPITZE,,47.157222,13.525833,1952 +alps_19546,BREITECK,,47.164167,13.565278,2265 +alps_19547,VIERTLECK,,47.168611,13.575556,2340 +alps_19548,WEISSEN ECK,,47.176111,13.564722,2563 +alps_19549,ZEPP SPITZE,,47.182500,13.535278,2507 +alps_19550,MALUTZ SPITZE,,47.178611,13.535833,2468 +alps_19551,GRUBACH SPITZE,,47.181389,13.549444,2430 +alps_19552,LACKEN SPITZE,,47.183333,13.543056,2459 +alps_19553,LAPERNIG SPITZE,,47.170000,13.590278,2369 +alps_19554,LAGLERSPITZ,,47.167222,13.607222,2148 +alps_19555,SCHARECK,,47.159722,13.599167,2466 +alps_19556,SCHOENECK,,47.152222,13.617500,2235 +alps_19557,KLEINE LANSCHUETZ,,47.135000,13.625278,2355 +alps_19558,SPEIERECK,,47.127222,13.625000,2411 +alps_19559,GROSSE LANSCHUETZ,,47.141667,13.620278,2347 +alps_19560,KAEMPENKOEPFLN,,47.145278,13.608056,2366 +alps_19561,AIBLHOEHE,,47.186111,13.647222,2104 +alps_19562,ZECHNERRIEGEL,,47.177222,13.655556,2115 +alps_19563,FANNINGHOEHE,,47.174167,13.659722,2115 +alps_19564,FRISCHLINGHOEHE,,47.171111,13.663611,2085 +alps_19565,GROSSECK,,47.130278,13.646111,2072 +alps_19566,ZANKWARNER BERG,,47.180278,13.745278,1529 +alps_19567,VORDERECK,,47.183889,13.783333,1714 +alps_19568,LERCHECK,,47.178056,13.830833,1699 +alps_19569,KOEGERL,,47.164722,13.826944,1568 +alps_19570,WENGERKOPF,,47.176667,13.875000,1797 +alps_19571,KOGELWALD,,47.159167,13.884444,1686 +alps_19572,WEIDSCHOBER,,47.170278,13.929444,1789 +alps_19573,SATTELKOPF,,47.129722,13.925556,1809 +alps_19574,GSTODER,,47.141944,13.993056,2140 +alps_19575,DOERFLER HOEHE,,47.134722,13.994167,1987 +alps_19576,KALVARIENBERG,,47.182500,14.027500,1306 +alps_19577,FREIBERG,,47.172222,14.076667,1468 +alps_19578,DRAUNIGL,,47.169444,14.049722,1384 +alps_19579,WASSERMANNKOGEL,,47.143611,14.062778,1500 +alps_19580,SCHOENOCK,,47.124722,14.069444,1549 +alps_19581,FULSECK,,47.235833,13.148611,2033 +alps_19582,KREUZKOGEL,,47.225000,13.153889,2027 +alps_19583,AUKOPF,,47.205000,13.146944,2136 +alps_19584,LADERDINGER GAMSKARSPITZ,,47.191111,13.147778,2413 +alps_19585,REMSTEINKOGEL,,47.213056,13.242500,1946 +alps_19586,KASERKOPF,,47.210000,13.246111,1998 +alps_19587,KLEINER SCHNEIBENSTEIN,,47.222500,13.266111,1988 +alps_19588,GROSSER SCHNEIBENSTEIN,,47.216111,13.267500,2143 +alps_19589,FILZMOOSHOERNDL,,47.204722,13.267778,2187 +alps_19590,SPIELKOGEL,,47.197500,13.259444,2201 +alps_19591,HUNDECK,,47.187500,13.247500,2079 +alps_19592,SEISERKOPF,,47.203056,13.250278,2035 +alps_19593,ROSSFELDECK,,47.246111,13.285556,2163 +alps_19594,ROSSFELDALM,,47.235833,13.288611,2026 +alps_19595,NEBELECK,,47.218611,13.298333,2159 +alps_19596,MAURECK,,47.221111,13.310000,2112 +alps_19597,SCHEIBENKOGEL,,47.201944,13.309167,2255 +alps_19598,MAIERKOGEL,,47.199722,13.315833,2168 +alps_19599,GAMSKOEPFL,,47.210278,13.293056,2160 +alps_19600,DRAUGSTEIN,,47.203056,13.291667,2356 +alps_19601,KARTEISKOPF,,47.193333,13.303611,2201 +alps_19602,WEISSGRUBENKOPF,,47.188333,13.329444,2295 +alps_19603,WILDKAR KOPF,,47.193056,13.341667,2379 +alps_19604,STIERKAR KOPF,,47.197222,13.353889,2366 +alps_19605,WILDKAR HOEHE,,47.203889,13.355278,2511 +alps_19606,WINDISCH KOPF,,47.207778,13.389444,2609 +alps_19607,ROT HORN,,47.208333,13.358889,2522 +alps_19608,FAUL KOGEL,,47.216111,13.372500,2654 +alps_19609,GRAIL KOPF,,47.223333,13.391667,2287 +alps_19610,SCHOBER KOGEL,,47.234167,13.369722,2229 +alps_19611,LIEBES ECK,,47.240278,13.367778,2303 +alps_19612,BERNKAR KOGEL,,47.246389,13.358889,2336 +alps_19613,AIGNER HOEHE,,47.200833,13.454444,2104 +alps_19614,MOSERMANDL,,47.206111,13.396111,2680 +alps_19615,TAFERL NOCK,,47.217222,13.455000,2375 +alps_19616,PERMUTH WAND,,47.220833,13.441111,2479 +alps_19617,SCHLIER SPITZ,,47.216667,13.411389,2402 +alps_19618,RETTEN WAND,,47.220278,13.435000,2364 +alps_19619,HOCHBIRG,,47.224167,13.412222,2319 +alps_19620,GEISS KOPF,,47.233889,13.406111,2051 +alps_19621,ZEHNER KOGEL,,47.241944,13.410556,1862 +alps_19622,GOEDERNIERKAR KOPF,,47.191111,13.506389,2595 +alps_19623,HOCHFEIND,,47.187222,13.495000,2687 +alps_19624,GROSSE GUGLSPITZE,,47.188889,13.487222,2638 +alps_19625,ZWILLING WAND,,47.188056,13.466944,2518 +alps_19626,LAB SPITZE,,47.199722,13.476389,2223 +alps_19627,MAUTLING,,47.205556,13.487778,2016 +alps_19628,HEISSEN SPITZE,,47.200278,13.509167,2288 +alps_19629,FELLNER KOPF,,47.207778,13.512778,2076 +alps_19630,GEBREIN SPITZE,,47.204722,13.469722,2167 +alps_19631,STAMPFER WAND,,47.209722,13.463611,2342 +alps_19632,KESSEL KOPF,,47.226111,13.472500,2252 +alps_19633,HOEL KOGEL,,47.231111,13.468889,2211 +alps_19634,GROSSER PLEISLING KEIL,,47.227222,13.491389,2501 +alps_19635,GLOECKNERIN,,47.229167,13.512500,2433 +alps_19636,PREDIGT STUHL,,47.231111,13.519444,2367 +alps_19637,HINTERE GROSSWAND SPITZE,,47.231944,13.503056,2437 +alps_19638,VORDERE GROSSWAND SPITZE,,47.234722,13.502500,2380 +alps_19639,SCHEIBEN KOGEL,,47.238333,13.464444,1997 +alps_19640,SPIRZINGER,,47.249167,13.458611,2066 +alps_19641,KAEMPEN,,47.193889,13.529167,2320 +alps_19642,SPEIK KOGEL,,47.188056,13.548333,2265 +alps_19643,ROSS KOGEL,,47.192778,13.558889,2151 +alps_19644,TREBERLING SPITZE,,47.189722,13.573611,2083 +alps_19645,MITTER ECK,,47.213889,13.573056,1899 +alps_19646,GAMSLEITEN SPITZE,,47.239167,13.546944,2359 +alps_19647,HERBERT SPITZE,,47.238056,13.559722,2137 +alps_19648,KLEINE KESSEL SPITZE,,47.237500,13.552222,2321 +alps_19649,GROSSE KESSEL SPITZE,,47.231667,13.556389,2361 +alps_19650,GAMSSPITZL,,47.238889,13.530556,2340 +alps_19651,ZEHNERKAR SPITZE,,47.236389,13.529722,2382 +alps_19652,STEINKARHOEHE,,47.233333,13.595000,2299 +alps_19653,BLASRIEGEL,,47.222778,13.624444,2228 +alps_19654,ROSSKOGEL,,47.228056,13.610000,2098 +alps_19655,TAUERNHOEHE,,47.228611,13.597500,2328 +alps_19656,GOLLITSCHSPITZE,,47.223333,13.597778,2247 +alps_19657,TWENGER ALMKOPF,,47.214444,13.594722,2025 +alps_19658,GURPITSCHECK,,47.210556,13.615556,1526 +alps_19659,KARNERECK,,47.215278,13.636944,2380 +alps_19660,PREDIGSTUHL,,47.217500,13.617778,2315 +alps_19661,KLEINER GURPITSCHECK,,47.202222,13.622222,2378 +alps_19662,KARNEITSCHENHOEHE,,47.195278,13.637778,2181 +alps_19663,TEUFELSKIRCHE,,47.244722,13.649167,2131 +alps_19664,STEINKARSPITZE,,47.248889,13.685556,2626 +alps_19665,SATTELSPITZE,,47.245556,13.684167,2550 +alps_19666,MITTERSPITZEN,,47.242500,13.681944,2607 +alps_19667,HUNDSTEIN,,47.236111,13.683056,2614 +alps_19668,ZAHLERKOGEL,,47.225556,13.694722,2176 +alps_19669,ZECHNERKARSPITZE,,47.219167,13.688333,2452 +alps_19670,GRANITZSTEIN,,47.216111,13.696944,2326 +alps_19671,RAUDINGHOEHE,,47.213333,13.698056,2321 +alps_19672,KASTLHOEHE,,47.211389,13.690833,2292 +alps_19673,MULETECK,,47.205278,13.693056,2096 +alps_19674,HILLEBRANDKOPF,,47.242500,13.718056,2563 +alps_19675,HOCHECK,,47.236111,13.724167,2638 +alps_19676,WEISSHOEHE,,47.248889,13.765278,2659 +alps_19677,FURTRIEGEL,,47.233056,13.764167,2367 +alps_19678,LESSHOEHE,,47.225278,13.727778,2490 +alps_19679,GENSGITSCH,,47.210833,13.732222,2279 +alps_19680,KASERECK,,47.237500,13.771667,2740 +alps_19681,WIRRIEGELHOEHE,,47.232500,13.776111,2600 +alps_19682,KAMPELFENSTER,,47.228611,13.780833,2562 +alps_19683,SOMSPITZ,,47.236667,13.828889,2414 +alps_19684,KREUZHOEHE,,47.221667,13.781667,2566 +alps_19685,GUMMA,,47.210556,13.780000,2316 +alps_19686,JAEGERSPITZ,,47.240278,13.845278,2573 +alps_19687,GROSSE BARBARASPITZE,,47.232500,13.852778,2726 +alps_19688,HOCHLAHNECK,,47.247778,13.866944,2463 +alps_19689,BOCKLEITECK,,47.240833,13.868889,2515 +alps_19690,KRAUTKARECK,,47.238333,13.865833,2521 +alps_19691,ROTECK,,47.230000,13.850556,2742 +alps_19692,STIERKOPF,,47.230556,13.839722,2505 +alps_19693,GOLZHOEHE,,47.219444,13.845000,2580 +alps_19694,PREBER,,47.219722,13.865278,2740 +alps_19695,GAMSLEITECK,,47.238333,13.921389,2489 +alps_19696,KIRCHELECK,,47.248889,13.919722,2414 +alps_19697,EISENHUT,,47.232500,13.946667,2189 +alps_19698,HEMMERFELDECK,,47.224444,13.936111,2443 +alps_19699,ARNLUG,,47.225278,13.901944,2158 +alps_19700,TOCKNERALM,,47.219444,13.946111,2357 +alps_19701,SCHAFSITZ,,47.222500,13.955833,2164 +alps_19702,RUPPRECHTSECK,,47.239444,14.001389,2591 +alps_19703,ARFELD,,47.232778,14.006111,2491 +alps_19704,BRENNERFELDECK,,47.228611,14.014722,2507 +alps_19705,FELDECK,,47.222778,14.013611,2480 +alps_19706,TRUEBECK,,47.215556,14.015278,2367 +alps_19707,BREITDACH,,47.248889,14.029722,2451 +alps_19708,ARKOGEL,,47.242778,14.036667,2441 +alps_19709,SULZKOGEL,,47.239444,14.039722,2360 +alps_19710,LACKENKOGEL,,47.237778,14.060833,2130 +alps_19711,KARLECK,,47.226667,14.059444,2371 +alps_19712,EISENHUT,,47.235000,14.049722,2456 +alps_19713,HELDKOEGERL,,47.206389,14.071944,1973 +alps_19714,LUXKOGEL,,47.283333,13.098333,1824 +alps_19715,HASSECK,,47.281667,13.122222,2119 +alps_19716,URKUEBL,,47.268611,13.126111,2010 +alps_19717,TENNKOGEL,,47.290556,13.185278,1975 +alps_19718,HEUKARECK,,47.292222,13.165278,2100 +alps_19719,SANDKOGEL,,47.285278,13.163056,2249 +alps_19720,SCHOBER,,47.285833,13.173333,1997 +alps_19721,HOELLWAND,,47.282500,13.163889,2287 +alps_19722,SCHIEDREITSPITZ,,47.276667,13.159444,2094 +alps_19723,AUSTUHL,,47.266111,13.156389,2151 +alps_19724,ARLSPITZE,,47.262778,13.150278,2214 +alps_19725,HOCHEGG,,47.266111,13.145556,2180 +alps_19726,GERN,,47.307500,13.238611,1787 +alps_19727,SONNTAGSKOGEL,,47.301944,13.258333,1849 +alps_19728,KITZSTEIN,,47.284444,13.268889,2037 +alps_19729,GRINDKOGEL,,47.294167,13.263333,1823 +alps_19730,SAUKARKOPF,,47.254167,13.233056,2048 +alps_19731,KARRIEDEL,,47.253889,13.241389,2018 +alps_19732,KITZSTEINHOERNDL,,47.285833,13.282778,1935 +alps_19733,PENKKOPF,,47.266389,13.279444,2011 +alps_19734,GRUENDEGG,,47.249444,13.282222,2168 +alps_19735,SAUKARKOPF,,47.309722,13.347778,2028 +alps_19736,MOOSKOPF,,47.292222,13.348889,1961 +alps_19737,WILDBUEHEL,,47.288611,13.357222,1916 +alps_19738,MOSEREGG,,47.275000,13.360556,1960 +alps_19739,BERENTZEGG,,47.264722,13.395278,2076 +alps_19740,ENNSKRAXEN,,47.257222,13.356667,2410 +alps_19741,KRAXENKOGEL,,47.254167,13.357778,2436 +alps_19742,SCHILCHEGG,,47.253333,13.385278,2040 +alps_19743,VORDERKOGEL,,47.307500,13.425556,2008 +alps_19744,HINTERKOGEL,,47.300000,13.428611,1922 +alps_19745,ROSSKOPF,,47.293611,13.428889,1929 +alps_19746,HIRSCHKOEPFL,,47.288333,13.433056,1971 +alps_19747,ARCHE,,47.283056,13.438889,2060 +alps_19748,TAGWEIDEGG,,47.277500,13.434722,2135 +alps_19749,GAMSKOGEL,,47.273333,13.447222,2186 +alps_19750,SCHWARZKOPF,,47.269167,13.441944,2263 +alps_19751,STEINFELDSPITZE,,47.266111,13.451944,2344 +alps_19752,WINDSCHAUFEL,,47.260000,13.446944,2214 +alps_19753,HAKOPF,,47.298889,13.476944,1996 +alps_19754,TAXALMKOGEL,,47.307500,13.481111,2021 +alps_19755,SAURUCK,,47.288611,13.483611,1848 +alps_19756,RAUCHKOPF,,47.288889,13.475278,1893 +alps_19757,KLEINER BAERENSTAFF,,47.265278,13.472778,2013 +alps_19758,SPAZECK,,47.254167,13.464722,2065 +alps_19759,SCHECKKOPF,,47.260000,13.512222,1845 +alps_19760,HINTERER GEISSSTEIN,,47.306667,13.538611,2190 +alps_19761,KONERS,,47.294167,13.541667,2048 +alps_19762,STEINKARLSPITZE,,47.280000,13.547778,2156 +alps_19763,SEEKARSPITZE,,47.272778,13.543889,2350 +alps_19764,SONNTAGKARHOEHE,,47.276111,13.582778,2245 +alps_19765,HUNDSKOGEL,,47.265556,13.580833,2239 +alps_19766,KLAMMELKARL,,47.273889,13.557222,2179 +alps_19767,SEEKARSCHNEID,,47.271111,13.536111,2288 +alps_19768,SEEKARECK,,47.264722,13.532778,2217 +alps_19769,PLATTENSPITZE,,47.255833,13.579722,2294 +alps_19770,WEITGASSBRETTER,,47.310833,13.603333,2022 +alps_19771,NEBELSPITZE,,47.295833,13.600833,2134 +alps_19772,KAMPSPITZE,,47.293889,13.642778,2390 +alps_19773,KRANZLHOEHE,,47.287778,13.604167,2095 +alps_19774,MEREGG,,47.283333,13.608333,2235 +alps_19775,STEIRISCHE KALKSPITZE,,47.283333,13.622778,2459 +alps_19776,LUNGAUER KALKSPITZE,,47.272222,13.625278,2471 +alps_19777,MENTENKARSPITZE,,47.260556,13.643333,2341 +alps_19778,SAMERKOGEL,,47.254722,13.631111,2192 +alps_19779,ROSSKOGEL,,47.267222,13.585000,2254 +alps_19780,GAMSKARLSPITZE,,47.250833,13.585278,2411 +alps_19781,SCHUSTERSTUHL,,47.250278,13.644167,2416 +alps_19782,SCHIEDECK,,47.311667,13.650833,2339 +alps_19783,DUISITZER HAHNKAMP,,47.287778,13.694444,2296 +alps_19784,MURSPITZEN,,47.291944,13.674444,2333 +alps_19785,GIGLACHALMSPITZE,,47.289722,13.671944,2352 +alps_19786,GROBFELDSPITZE,,47.286667,13.671389,2358 +alps_19787,ROTMANNDLSPITZE,,47.281111,13.672778,2453 +alps_19788,SAUBERG,,47.277778,13.675833,2520 +alps_19789,ENGELKARSPITZE,,47.273333,13.661944,2518 +alps_19790,VETTERNSPITZEN,,47.274167,13.676944,2524 +alps_19791,KRUKECK,,47.280833,13.685833,2428 +alps_19792,ZINKWAND,,47.268889,13.683056,2442 +alps_19793,BRETTSPITZE,,47.264722,13.696111,2412 +alps_19794,GRAUNOCK,,47.260000,13.696389,2477 +alps_19795,BLUTSPITZE,,47.249722,13.685833,2626 +alps_19796,HINTERE WAESCHLKARSPITZE,,47.310556,13.721667,2327 +alps_19797,WASSERFALLSPITZE,,47.302778,13.730000,2507 +alps_19798,HINTERER WILDKARSTEIN,,47.307222,13.733333,2417 +alps_19799,HAUSELSPITZE,,47.301389,13.742222,2450 +alps_19800,GAMSSPITZE,,47.304722,13.747500,2444 +alps_19801,TRISTHOF,,47.295278,13.735556,2517 +alps_19802,ELENDBERG,,47.283889,13.746944,2672 +alps_19803,ZWERFENBERG,,47.277778,13.748056,2642 +alps_19804,SAMSPITZE,,47.276944,13.730278,2381 +alps_19805,HOCHGOLLING,,47.266111,13.761111,2862 +alps_19806,HOHER WAGEN,,47.264722,13.729722,2320 +alps_19807,PIETRACH,,47.272222,13.716944,2390 +alps_19808,ROTSANDSPITZE,,47.258889,13.722500,2481 +alps_19809,SCHARNOCK,,47.258056,13.713611,2490 +alps_19810,STEINKARLEGG,,47.253889,13.765278,2637 +alps_19811,PLACKEN,,47.310833,13.791944,2434 +alps_19812,STEINKARHOEHE,,47.303889,13.796111,2370 +alps_19813,WALDHORN,,47.296111,13.817500,2702 +alps_19814,GREIFELSTEIN,,47.299444,13.801111,2397 +alps_19815,MEISTERSPITZE,,47.287222,13.824167,2617 +alps_19816,KIESECK,,47.293056,13.825833,2681 +alps_19817,GREIFENBERG,,47.289167,13.789722,2618 +alps_19818,KLEINES GANGL,,47.273889,13.778333,2478 +alps_19819,GROSSES GANGL,,47.278056,13.787222,2602 +alps_19820,POELLERHOEHE,,47.281389,13.791667,2601 +alps_19821,KAISERSPITZE,,47.283056,13.827778,2570 +alps_19822,DEICHSELSPITZE,,47.270278,13.822222,2684 +alps_19823,ZISCHKEN,,47.266944,13.824167,2661 +alps_19824,ALTERKOGEL,,47.252778,13.772778,2552 +alps_19825,ZWILLING,,47.305833,13.839722,2421 +alps_19826,GROSSER GNASEN,,47.300556,13.840000,2461 +alps_19827,KLEINER GNASEN,,47.301389,13.857222,2244 +alps_19828,LAERCHECK,,47.281111,13.845833,2248 +alps_19829,HOCHGANG,,47.273056,13.879444,2230 +alps_19830,OPFERSTOCK,,47.263889,13.876111,2327 +alps_19831,SCHAFKARSPITZE,,47.260833,13.845000,2434 +alps_19832,ALPKARSPITZE,,47.263333,13.858611,2294 +alps_19833,SCHOENECK,,47.256667,13.852222,2540 +alps_19834,HASENHOEHE,,47.251389,13.864722,2446 +alps_19835,GAMSKARSPITZE,,47.256389,13.876667,2439 +alps_19836,KNARRNSPITZE,,47.253611,13.882222,2387 +alps_19837,JACKERSTAGECK,,47.299167,13.904167,2409 +alps_19838,VORDERES OHRENECK,,47.292500,13.952222,2154 +alps_19839,SCHOBERSPITZE,,47.285556,13.952222,2217 +alps_19840,GHAGSPITZE,,47.284167,13.911111,2431 +alps_19841,SEEKARSPITZE,,47.277222,13.909167,2500 +alps_19842,HINTERES OHRENECK,,47.280278,13.954167,2290 +alps_19843,STEINKARSPITZE,,47.264722,13.953889,2397 +alps_19844,KITZBERGSPITZE,,47.267778,13.916667,2466 +alps_19845,PREDIGSTUHL,,47.261944,13.911389,2543 +alps_19846,WINDSCHNURSPITZE,,47.255556,13.912500,2451 +alps_19847,WIEGENECK,,47.258333,13.901111,2472 +alps_19848,EDELFELD,,47.254444,13.945278,2315 +alps_19849,SEEKARLSPITZ,,47.306944,13.971944,2523 +alps_19850,MITTERECK,,47.296389,13.973056,2469 +alps_19851,STEINRINNECK,,47.298611,14.003889,2247 +alps_19852,GJOADECK,,47.282500,13.970278,2525 +alps_19853,SCHOENKARLSPITZ,,47.282222,13.986111,2349 +alps_19854,SAUOFEN,,47.264167,14.014722,2415 +alps_19855,SCHIMPELGRAT,,47.271389,14.015833,2395 +alps_19856,SCHREIN,,47.265278,14.006111,2410 +alps_19857,SUESSLEITECK,,47.267500,13.998333,2507 +alps_19858,SCHIMPELSPITZ,,47.266944,13.988056,2413 +alps_19859,BAULEITECK,,47.270833,13.969444,2424 +alps_19860,KRAUTGARTENSCHARTE,,47.268056,13.963333,2329 +alps_19861,FLEDERWEISSSPITZ,,47.260000,13.958611,2386 +alps_19862,DUERRNBERG,,47.252500,13.961944,2241 +alps_19863,DACHLEITECK,,47.250833,14.000000,2463 +alps_19864,DENECK,,47.286944,14.050556,2433 +alps_19865,MITTERECK,,47.296111,14.048889,2284 +alps_19866,BREITMODL,,47.281389,14.037222,2380 +alps_19867,NAEGELECK,,47.272500,14.072500,2155 +alps_19868,SCHOEDERKOGEL,,47.255833,14.024167,2500 +alps_19869,ZINKEN,,47.255556,14.050000,2191 +alps_19870,BRENNERKOEPFL,,47.361389,13.116667,1398 +alps_19871,HOCHGLOCKNER,,47.347500,13.139167,1590 +alps_19872,FITZKOGEL,,47.346667,13.087778,1660 +alps_19873,SCHIEICHKOGEL,,47.369444,13.163889,1421 +alps_19874,OBERES GRUENDECK,,47.358056,13.246111,1438 +alps_19875,ZEDERBERGKOPF,,47.321111,13.215278,1308 +alps_19876,ASCHEGG,,47.369722,13.291389,1622 +alps_19877,OEBRISTKOPF,,47.350278,13.285556,1411 +alps_19878,GRIESSENKARECK,,47.318611,13.351389,1991 +alps_19879,LACKENKOGEL,,47.326389,13.423611,2051 +alps_19880,EIBENBERG,,47.332500,13.411944,1738 +alps_19881,SCHARWANDSPITZE,,47.317222,13.415000,1918 +alps_19882,KEHLBRAND,,47.342222,13.463056,1753 +alps_19883,VORDERES LABENECK,,47.336111,13.471667,1832 +alps_19884,HINTERES LABENECK,,47.319722,13.471389,1986 +alps_19885,STRIMSKOGEL,,47.311944,13.470833,2139 +alps_19886,VORDERER FAGER,,47.348333,13.526944,1790 +alps_19887,MITTLERER FAGER,,47.341111,13.533611,1836 +alps_19888,HINTERER FAGER,,47.322778,13.538611,1967 +alps_19889,VORDERER GEISSSTEIN,,47.313889,13.541667,2177 +alps_19890,HOCHWURZEN,,47.360000,13.640278,1849 +alps_19891,ROSSFELD,,47.349167,13.641667,1919 +alps_19892,GASSELHOEHE,,47.352778,13.592500,2001 +alps_19893,SCHOBER,,47.345833,13.605556,2133 +alps_19894,RIPPETEGG,,47.340833,13.600000,2126 +alps_19895,HOELLERMAHD,,47.328889,13.604444,1987 +alps_19896,STEINKARHOEHE,,47.324444,13.599722,2105 +alps_19897,MAHDSPITZE,,47.318611,13.596944,1990 +alps_19898,KRUEGERZINKEN,,47.339722,13.701667,2204 +alps_19899,STEINKARZINKEN,,47.336389,13.706111,2281 +alps_19900,GUSCHEN,,47.335556,13.649444,1982 +alps_19901,MELCHERSPITZE,,47.324444,13.666944,2084 +alps_19902,HOCHFELD,,47.321389,13.649167,2189 +alps_19903,PLANAI,,47.368889,13.726944,1906 +alps_19904,KRAHBERGZINKEN,,47.356111,13.742500,2134 +alps_19905,RAUHENBERG,,47.349167,13.756111,2268 +alps_19906,SONNTAGERHOEHE,,47.347500,13.758611,2305 +alps_19907,RABENKOEPFL,,47.345556,13.764722,2240 +alps_19908,SONNTAGKARZINKEN,,47.322222,13.711111,2243 +alps_19909,VORDERE WAESCHLKARSPITZE,,47.315000,13.718611,2255 +alps_19910,VORDERER WILDKARSTEIN,,47.314722,13.734444,2362 +alps_19911,HAUSER KAIBLING,,47.373611,13.779444,2015 +alps_19912,BAERFALLSPITZE,,47.360000,13.786667,2150 +alps_19913,MODERSPITZE,,47.355833,13.803889,2292 +alps_19914,MOARALMSPITZE,,47.352222,13.784444,2267 +alps_19915,HOECHSTEIN,,47.346944,13.791667,2543 +alps_19916,ZWIESLING,,47.345000,13.785833,2469 +alps_19917,ULMSPITZE,,47.342778,13.782222,2409 +alps_19918,PULVERTURM,,47.341389,13.801111,2463 +alps_19919,HASENKARSPITZE,,47.341944,13.770556,2284 +alps_19920,GRUBERBERG,,47.342222,13.811944,2414 +alps_19921,HOCHWILDSTELLE,,47.335000,13.830833,2747 +alps_19922,WILDLOCHHOEHE,,47.328889,13.829167,2534 +alps_19923,HIMMELREICH,,47.325833,13.825000,2500 +alps_19924,MANDLSPITZE,,47.317222,13.783889,2180 +alps_19925,SCHNEIDER,,47.320833,13.822778,2328 +alps_19926,PLESCHNITZZINKEN,,47.372778,13.856667,2112 +alps_19927,SCHEIBLECK,,47.363333,13.842778,2117 +alps_19928,SCHUSTERSTUHL,,47.349167,13.887222,2216 +alps_19929,GAMSKARSPITZ,,47.349444,13.836389,2491 +alps_19930,UMLAUFER,,47.335833,13.835833,2664 +alps_19931,SAULECK,,47.339167,13.874722,2359 +alps_19932,STIERKARKOPF,,47.332500,13.849722,2331 +alps_19933,HOHES SCHARECK,,47.323056,13.838889,2575 +alps_19934,KLEINES SCHARECK,,47.313889,13.840833,2479 +alps_19935,STUMMERKESSELSPITZE,,47.320000,13.867778,2088 +alps_19936,DROMEISSPITZ,,47.361667,13.902778,2047 +alps_19937,SPATECK,,47.349444,13.897778,2256 +alps_19938,KLEINE KESSELSPITZE,,47.330278,13.923889,1971 +alps_19939,GROSSE KESSELSPITZE,,47.323333,13.913333,2294 +alps_19940,SCHAUFELSPITZE,,47.317222,13.911944,2375 +alps_19941,ZINKEN,,47.366667,13.963333,2120 +alps_19942,SPEIERECK,,47.362222,13.966944,2131 +alps_19943,MODITZEN,,47.353056,13.995556,1993 +alps_19944,AHRNSPITZ,,47.347500,13.991389,2014 +alps_19945,KARLSPITZ,,47.341667,13.964167,2212 +alps_19946,BADSTUBENSPITZ,,47.324167,14.010278,2076 +alps_19947,SCHOENWETTER,,47.328611,13.998333,2114 +alps_19948,SCHUESTERSTUHL,,47.334444,13.968889,2321 +alps_19949,KLEINER KNALLSTEIN,,47.330556,13.973056,2378 +alps_19950,GROSSER KNALLSTEIN,,47.320000,13.976944,2599 +alps_19951,GASSENECK,,47.363056,14.048611,2111 +alps_19952,SCHWARZKARSPITZ,,47.369167,14.065833,1996 +alps_19953,SONNTAGKARSPITZ,,47.364722,14.070000,1999 +alps_19954,KLEINES BAERNECK,,47.352778,14.070278,2037 +alps_19955,GROSSES BAERNECK,,47.352778,14.080278,2071 +alps_19956,TATTERMANN,,47.361111,14.043611,2089 +alps_19957,SCHOBERKOPF,,47.430556,13.097500,2708 +alps_19958,TORSAEULER,,47.428611,13.105000,2588 +alps_19959,KLEINER BRATSCHENKOPF,,47.423056,13.097222,2686 +alps_19960,KOENIGSKOEPFL,,47.421389,13.102500,2632 +alps_19961,HOCHSTELLKOPF,,47.418611,13.107500,2478 +alps_19962,SATTELKOEPFE,,47.421111,13.114167,2526 +alps_19963,GAMSLEITENKOPF,,47.421944,13.117222,2534 +alps_19964,SCHNEEKLAMM,,47.422778,13.123333,2482 +alps_19965,TEUFELSKIRCHE,,47.434444,13.104167,2666 +alps_19966,HOCHKEIL,,47.402222,13.140833,1782 +alps_19967,JAGERKOEPFL,,47.425556,13.188056,1295 +alps_19968,PALFNERKOGEL,,47.376111,13.179167,1413 +alps_19969,BREITSPITZ,,47.397778,13.278889,1804 +alps_19970,FAISTALKOPF,,47.375556,13.328611,1566 +alps_19971,WEYERBERG,,47.433611,13.329167,1455 +alps_19972,HOELLBERG,,47.395278,13.370556,1585 +alps_19973,BLUEMECK,,47.385000,13.341944,1695 +alps_19974,TANNKOPPEN,,47.407778,13.439444,1678 +alps_19975,HOFEREGG,,47.417222,13.511389,1642 +alps_19976,ROSSBRAND,,47.415556,13.479444,1770 +alps_19977,CBERSTEINKOEPFL,,47.393056,13.572222,1292 +alps_19978,EIBENBERGKOPF,,47.391667,13.552778,1406 +alps_19979,SCHEIBLINGPALFEN,,47.390278,13.580278,1304 +alps_19980,PREDIGTSTUHL,,47.388333,13.526667,1305 +alps_19981,SCHACHENKOPF,,47.381667,13.521389,1307 +alps_19982,HALSERBERG,,47.405556,13.610000,1338 +alps_19983,SAUMERBERG,,47.405000,13.597222,1229 +alps_19984,ROESSINGKOGEL,,47.426389,13.734444,1346 +alps_19985,SCHWARZKOGEL,,47.383889,13.813889,1760 +alps_19986,KALTECK,,47.376111,13.866389,1978 +alps_19987,KOCHOFEN,,47.394167,13.913611,1916 +alps_19988,FLEISCHKOEGEL,,47.381389,13.906667,1891 +alps_19989,JAUERECK,,47.425833,13.994167,1715 +alps_19990,SCHRETTENKARSPITZ,,47.411667,14.010000,1852 +alps_19991,ZINKEN,,47.403333,14.016389,2042 +alps_19992,GUMPENECK,,47.397222,14.014722,2226 +alps_19993,UNTERKARSPITZ,,47.411111,14.081111,1982 +alps_19994,HIRSCHECK,,47.412222,14.045833,1853 +alps_19995,DORNKARSPITZ,,47.400556,14.076111,2050 +alps_19996,STEINKARSPITZ,,47.393889,14.071944,1992 +alps_19997,MOERSBACHSPITZ,,47.390000,14.069444,2020 +alps_19998,KUEHOFENSPITZ,,47.393611,14.025556,2145 +alps_19999,PLOESCHMITZZINKEN,,47.387778,14.034444,2095 +alps_20000,HANGOFEN,,47.389167,14.039722,2056 +alps_20001,LAEMMERTOERLKOPF,,47.378056,14.055000,2046 +alps_20002,STADELFIRST,,47.383056,14.063611,1940 +alps_20003,ALBLEGG,,47.452778,13.091667,2361 +alps_20004,NIXRIEDEL,,47.441944,13.095000,2558 +alps_20005,FLOSSKOGEL,,47.447500,13.088611,2437 +alps_20006,KLOBNER KOPF,,47.497500,13.116111,2228 +alps_20007,HIRSCHKOGEL,,47.438889,13.163056,1486 +alps_20008,AUKOEPFL,,47.436944,13.193333,1231 +alps_20009,RAUCHECK,,47.499167,13.226667,2430 +alps_20010,FIEBERHORN,,47.494444,13.238056,2276 +alps_20011,HOCHTHRON,,47.492500,13.243056,2362 +alps_20012,TEUFELSKIRCHL,,47.498611,13.281111,2218 +alps_20013,EISKOGEL,,47.496667,13.282500,2321 +alps_20014,NAPF,,47.493889,13.292222,2167 +alps_20015,TAUERNKOGEL,,47.493889,13.298611,2247 +alps_20016,BRANDLBERGKOEPFE,,47.481111,13.325000,1784 +alps_20017,FROMMER KOGEL,,47.465556,13.326944,1883 +alps_20018,SCHWARZENEGG,,47.449444,13.330278,1598 +alps_20019,DONNEREGG,,47.446389,13.287500,1542 +alps_20020,HOFSCHOBERBERG,,47.491111,13.342222,1666 +alps_20021,KOREIN,,47.469722,13.348333,1850 +alps_20022,GSENGPLATTE,,47.463611,13.443333,1671 +alps_20023,GERZKOPF,,47.460278,13.431111,1728 +alps_20024,PLATTEN,,47.460000,13.411111,1705 +alps_20025,LOOSEGG,,47.490278,13.480833,1647 +alps_20026,ARMKARWAND,,47.496389,13.516667,2351 +alps_20027,BISCHOFSCHMUTZE,,47.493611,13.511667,2458 +alps_20028,KAMPLBRUNNSPITZE,,47.489167,13.510278,2190 +alps_20029,MOSERMANDL,,47.489167,13.515833,2088 +alps_20030,LECKKOGEL,,47.485278,13.505278,2032 +alps_20031,LIENKOEPFL,,47.472500,13.476667,1536 +alps_20032,HACKLPLATTEN,,47.470278,13.501944,1546 +alps_20033,WURMEGG,,47.455000,13.508889,1411 +alps_20034,ADELWAND,,47.497222,13.536111,2114 +alps_20035,STEIGLKOGEL,,47.494444,13.529444,2204 +alps_20036,MITTERKOGEL,,47.494722,13.535000,2122 +alps_20037,GOSAUSTEIN,,47.490000,13.548056,2058 +alps_20038,HOCHKESSELECK,,47.486389,13.563611,2218 +alps_20039,SCHREIBERWANDECK,,47.498056,13.582222,2330 +alps_20040,TORSTEINECK,,47.485000,13.578056,2256 +alps_20041,HOCHKESSELKOPF,,47.482778,13.568611,2454 +alps_20042,EISKARLSPITZ,,47.480556,13.573333,2480 +alps_20043,WINDLEGERSPITZ,,47.475000,13.570000,2325 +alps_20044,RETTENSTEIN,,47.457222,13.555278,2247 +alps_20045,SCHREIBERWAND,,47.493333,13.592500,2637 +alps_20046,SCHNESSLOCHTURM,,47.493056,13.596111,2574 +alps_20047,NIEDERES KREUZ,,47.494722,13.607778,2651 +alps_20048,HOHES KREUZ,,47.488333,13.604444,2837 +alps_20049,SCHOBER,,47.498056,13.617500,2426 +alps_20050,GJAIDSTEIN,,47.481667,13.632778,2794 +alps_20051,NIEDERER DACHSTEIN,,47.478333,13.606944,2934 +alps_20052,DACHSTEIN,,47.475278,13.606389,2995 +alps_20053,MITTLERSPITZ,,47.475556,13.596389,2925 +alps_20054,TORSPITZ,,47.474722,13.585556,2948 +alps_20055,DIRNDLN,,47.472500,13.617500,2832 +alps_20056,HUNERKOGEL,,47.467778,13.626667,2687 +alps_20057,KOPPENKARSTEN,,47.466111,13.640833,2863 +alps_20058,TUERLSPITZ,,47.462222,13.634722,2646 +alps_20059,SCHEIBLINGSTEIN,,47.463889,13.622500,2423 +alps_20060,NIEDER TURLSPITZ,,47.454167,13.630278,2364 +alps_20061,VORDERER GJAIDSTEIN,,47.493333,13.651111,2414 +alps_20062,NIEDERER GJAIDSTEIN,,47.487222,13.651944,2484 +alps_20063,MODERSTEIN,,47.492500,13.668333,2197 +alps_20064,HOHER TAG,,47.493889,13.701111,2020 +alps_20065,HAHNRIEDEL,,47.485000,13.695833,2021 +alps_20066,BESENKOGEL,,47.473333,13.689444,2058 +alps_20067,LACKENOFEN,,47.472500,13.701944,2037 +alps_20068,HOCHECKEN,,47.477500,13.677500,2107 +alps_20069,MITTERSTEIN,,47.479444,13.646944,2417 +alps_20070,LANDFRIEDSTEIN,,47.462500,13.667778,2536 +alps_20071,HUNDSOFEN,,47.462222,13.688333,2158 +alps_20072,WASENSPITZE,,47.450833,13.701111,2257 +alps_20073,SINABELL,,47.451111,13.691667,2349 +alps_20074,ESELSTEIN,,47.454167,13.676111,2556 +alps_20075,GAMSFELDSPITZE,,47.451944,13.645833,2655 +alps_20076,SCHEICHENSPITZE,,47.450833,13.656389,2667 +alps_20077,HOHE RAMS,,47.450278,13.665833,2551 +alps_20078,GROSSES HOCHECK,,47.489167,13.750556,1905 +alps_20079,KLEINES HOCHECK,,47.481389,13.751944,1886 +alps_20080,KLAMMECK,,47.473333,13.746944,1870 +alps_20081,LACKNER HOCHECK,,47.473611,13.717778,2027 +alps_20082,LACKNER MIESBERG,,47.461111,13.713333,2232 +alps_20083,KUFSTEIN,,47.456667,13.761667,2049 +alps_20084,GROSSER MIESBERG,,47.460000,13.732222,2202 +alps_20085,KLEINER MIESBERG,,47.459444,13.743611,2175 +alps_20086,LUSERWAND,,47.452778,13.741944,2135 +alps_20087,LUSERRIEDEL,,47.445556,13.726667,1850 +alps_20088,MOOSECK,,47.480556,13.778611,1832 +alps_20089,KUEMPFLING,,47.469444,13.790556,1839 +alps_20090,STODERZINKEN,,47.459444,13.828889,2048 +alps_20091,HOCHECK,,47.498333,13.883889,1586 +alps_20092,LAERCHKOGEL,,47.490000,13.856389,1529 +alps_20093,KAMMSPITZ,,47.476111,13.885000,2139 +alps_20094,MITTERSPITZE,,47.476111,13.874444,2121 +alps_20095,WINTERSTEIN,,47.473333,13.889444,1915 +alps_20096,FREISTEIN,,47.440000,13.852778,1279 +alps_20097,STICKLERECK,,47.444722,13.840556,1283 +alps_20098,BERGERECK,,47.491111,13.936944,1565 +alps_20099,GSAENGERECK,,47.471944,14.060000,1425 +alps_20100,PENDLESECK,,47.465833,14.078056,1489 +alps_20101,ZACHENSCHOEBERL,,47.451667,14.080000,1726 +alps_20102,STARKENBERG,,47.452222,14.029167,1347 +alps_20103,HOCHECK,,47.437222,14.051667,1663 +alps_20104,ROTWAND,,47.553056,13.094167,1865 +alps_20105,LAERCHKOPF,,47.544167,13.132222,1804 +alps_20106,RAUHKOPF,,47.554722,13.143611,1845 +alps_20107,FILLINGSCHNEID,,47.535556,13.136667,2004 +alps_20108,UMGANG,,47.530278,13.095000,1946 +alps_20109,TRISTKOPF,,47.532778,13.124167,2110 +alps_20110,BERGERALMSCHNEID,,47.520000,13.130833,2123 +alps_20111,HOCHSCHOTTWIES,,47.514167,13.124722,2262 +alps_20112,HOCHWIESKOPF,,47.516667,13.099722,2189 +alps_20113,HUEHNERKRALL,,47.501111,13.089167,2288 +alps_20114,BITZKOGEL,,47.507500,13.100556,2256 +alps_20115,SULZKOPF,,47.505833,13.090556,2237 +alps_20116,HOCHGSCHIRR,,47.501667,13.114722,2254 +alps_20117,RIFFLKOPF,,47.506111,13.130278,2254 +alps_20118,WASSERSTEINKOPF,,47.508333,13.123056,2223 +alps_20119,SCHAFGEBIRGSPITZ,,47.546944,13.195278,1771 +alps_20120,BAERECK,,47.534167,13.202222,2068 +alps_20121,SULZAUER KOPF,,47.529444,13.204444,2119 +alps_20122,TIROLER KOGEL,,47.525000,13.203611,2322 +alps_20123,HOCHKOGEL,,47.517500,13.193056,2281 +alps_20124,HUEHNERKRALL,,47.507222,13.205000,2289 +alps_20125,STEINWAENDHORN,,47.546944,13.150278,1863 +alps_20126,PLATTENECK EISHOEHLEN,,47.559167,13.225556,1820 +alps_20127,PLATTENECK,,47.553056,13.225278,1946 +alps_20128,HOCHTOERL,,47.550833,13.212222,1919 +alps_20129,SOMMERECKSCHNEID,,47.548611,13.243056,1983 +alps_20130,KUCHLBERG,,47.557778,13.258611,1656 +alps_20131,KNALLSTEIN,,47.544444,13.231944,2233 +alps_20132,MITTLERER WIESELSTEIN,,47.538333,13.223056,2299 +alps_20133,SUEDLICHER WIESELSTEIN,,47.534444,13.225000,2315 +alps_20134,HOCHWIESKOEGEL,,47.531111,13.256111,2220 +alps_20135,HOCHPFEILER,,47.506667,13.220833,2410 +alps_20136,LEHNENDER STEIN,,47.503611,13.217222,2400 +alps_20137,HUEHNERKRALLKOPF,,47.508889,13.213056,2403 +alps_20138,STREITMANDL,,47.502500,13.244722,2360 +alps_20139,WERMUTSCHNEID,,47.503889,13.255000,2304 +alps_20140,WINDISCHKOPF,,47.520278,13.208889,2257 +alps_20141,SCHIEBLINGBUEHEL,,47.525000,13.267500,2257 +alps_20142,ARLSTEIN,,47.556389,13.324444,913 +alps_20143,SCHEIBLINGKOGEL,,47.534167,13.272500,2289 +alps_20144,ROTWAND,,47.548333,13.275278,1900 +alps_20145,SCHWERWAND,,47.538611,13.279444,2212 +alps_20146,SCHOEBERL,,47.543056,13.291111,2020 +alps_20147,GROSSER BREITSTEIN,,47.533333,13.315556,2161 +alps_20148,LANGWAND,,47.525278,13.307778,2260 +alps_20149,GROSSER GRIESSKOGEL,,47.526389,13.331667,1999 +alps_20150,BLEIKOGEL,,47.514167,13.298333,2411 +alps_20151,SCHUBBUEHEL,,47.504444,13.282778,2334 +alps_20152,SCHARTWAND,,47.503056,13.288056,2339 +alps_20153,BRIETKOGEL,,47.500833,13.294444,2316 +alps_20154,KEMETSTEIN,,47.503611,13.272222,2209 +alps_20155,GRIESSKOGEL,,47.508056,13.300833,2270 +alps_20156,AUGSTEIN,,47.502500,13.302222,2055 +alps_20157,HOCHBRETT,,47.510000,13.308056,2312 +alps_20158,KLEINER FRITZERKOGEL,,47.510278,13.315278,2287 +alps_20159,FRITZERKOGEL,,47.509722,13.329167,2360 +alps_20160,PAILWAND,,47.551667,13.392222,1221 +alps_20161,GROSSER TRAUNSTEIN,,47.533056,13.367500,1943 +alps_20162,SCHOBER,,47.532500,13.385000,1810 +alps_20163,KLEINER TRAUNSTEIN,,47.535833,13.373333,1659 +alps_20164,SCHALLWAND,,47.531667,13.358889,1929 +alps_20165,TAGWEIDE,,47.526944,13.355833,2128 +alps_20166,HOCHKARFELDERKOPF,,47.519167,13.355556,2219 +alps_20167,RIFFL,,47.513889,13.353611,2093 +alps_20168,EDELWEISSKOGEL,,47.512500,13.346111,2030 +alps_20169,KOENIGSWAND,,47.515833,13.377222,1752 +alps_20170,SONNTAGSKOGEL,,47.520556,13.365278,2046 +alps_20171,LUEFTENECK,,47.507778,13.340556,2024 +alps_20172,BUCHBERGRIEDEL,,47.554722,13.445000,1286 +alps_20173,KRAILBERG,,47.508611,13.412500,1289 +alps_20174,KOPFBERG,,47.509444,13.447778,1147 +alps_20175,HOEHBUEHEL,,47.553333,13.484722,1473 +alps_20176,TOERLECK,,47.532222,13.476944,1618 +alps_20177,DONNERKOGEL,,47.524167,13.481944,2054 +alps_20178,ANGERSTEIN,,47.513056,13.490833,2100 +alps_20179,MANDLKOGEL,,47.510556,13.501389,2279 +alps_20180,STEINRIESENKOGEL,,47.521389,13.483889,2008 +alps_20181,STRICHKOGEL,,47.519722,13.487500,2034 +alps_20182,WASSERKARKOGEL,,47.507778,13.507222,2221 +alps_20183,STERNKOGEL,,47.504167,13.509167,2325 +alps_20184,GROSSWAND,,47.502778,13.514167,2415 +alps_20185,DAUMLING,,47.501944,13.518611,2322 +alps_20186,GROSSER SCHWARZKOGEL,,47.536944,13.565000,1850 +alps_20187,KLEINER SCHWARZKOGEL,,47.536389,13.573889,1787 +alps_20188,MODERECKHOEHE,,47.538333,13.540000,1752 +alps_20189,HINTERE SEEKARWAND,,47.533056,13.549444,1857 +alps_20190,BEERWURZKOGEL,,47.524722,13.565833,2006 +alps_20191,LANGTALKOGEL,,47.520000,13.575000,2037 +alps_20192,HOSSWAND,,47.512222,13.580278,2247 +alps_20193,GRUENBERGKOGEL,,47.506667,13.570556,2095 +alps_20194,BRETTKOGEL,,47.514722,13.550556,1838 +alps_20195,HALSKOGEL,,47.504167,13.541944,1390 +alps_20196,KOPFWAND,,47.500000,13.534722,2135 +alps_20197,GABELKOGEL,,47.507222,13.527222,1909 +alps_20198,SOLINGERKOGEL,,47.561111,13.619444,1406 +alps_20199,VORDERE HIRLATZ,,47.537778,13.637222,1934 +alps_20200,FEUERKOGEL,,47.534722,13.628056,1964 +alps_20201,GAMSKOGEL,,47.523889,13.597500,2020 +alps_20202,GRUENKOGEL,,47.526944,13.607778,1914 +alps_20203,MITTLERE HIRLATZ,,47.530000,13.630556,1985 +alps_20204,HINTERE HIRLATZ,,47.529444,13.636667,1972 +alps_20205,NIEDERER OCHSENKOGEL,,47.514722,13.618056,2220 +alps_20206,MITTLERER OCHSENKOGEL,,47.511111,13.612778,2365 +alps_20207,HOHER GRUENBERG,,47.514722,13.604722,2243 +alps_20208,NIEDER GRUENBERG,,47.517222,13.608611,2174 +alps_20209,HOHER OCHSENKOGEL,,47.502222,13.602222,2527 +alps_20210,HOSSKOGEL,,47.507778,13.590833,2366 +alps_20211,WILDKARKOGEL,,47.506389,13.624167,2163 +alps_20212,HOHE SIEG,,47.559722,13.635000,1151 +alps_20213,ZWOELFERKOGEL,,47.531667,13.645556,1982 +alps_20214,WANDELN,,47.524722,13.648333,1930 +alps_20215,SCHOENBUEHEL,,47.526667,13.662500,1768 +alps_20216,SCHWEMMERKOGEL,,47.523611,13.674444,1837 +alps_20217,HOHER KRIPPENSTEIN,,47.524167,13.692500,2108 +alps_20218,NIEDER KRIPPENSTEIN,,47.516667,13.683611,1989 +alps_20219,TAUBENKOGEL,,47.504167,13.648056,2300 +alps_20220,MARGSCHIERF,,47.515278,13.707500,2080 +alps_20221,GSCHIRRKOGEL,,47.560000,13.755833,1649 +alps_20222,ROSSKOGEL,,47.538056,13.753611,1402 +alps_20223,WILDKOGEL,,47.540833,13.768889,1638 +alps_20224,DAEUMELKOGEL,,47.523889,13.710000,2001 +alps_20225,HIRSCHBERG,,47.529167,13.737222,2017 +alps_20226,PFALZKOGEL,,47.519444,13.761111,1785 +alps_20227,SPEIKBERG,,47.519722,13.731111,2125 +alps_20228,LOSKOPPEN,,47.506111,13.711944,1956 +alps_20229,NAPFENKOGEL,,47.501667,13.749722,2032 +alps_20230,HOCHFINET,,47.526389,13.797500,1808 +alps_20231,HOCHUNTERS,,47.538889,13.785278,1758 +alps_20232,LADENWALDKOGEL,,47.518333,13.813056,1716 +alps_20233,LAEMMERECK,,47.510278,13.825833,1737 +alps_20234,HOCHSTUBE,,47.505000,13.810000,1860 +alps_20235,HIRZBERG,,47.503889,13.786667,2051 +alps_20236,FAHRNRINNKOGEL,,47.519722,13.876667,1608 +alps_20237,ZELLERKOGEL,,47.510000,13.843056,1734 +alps_20238,LAERCHECK,,47.501389,13.882778,1599 +alps_20239,KULMKOGEL,,47.541944,13.999722,1123 +alps_20240,GRIMMING,,47.520556,14.016944,2351 +alps_20241,SCHARTENSPITZE,,47.515556,14.007778,2328 +alps_20242,STEINFELDSPITZE,,47.516111,14.001667,2290 +alps_20243,ZWOELFER,,47.513056,13.988889,2146 +alps_20244,KRAUTSCHWELLERECK,,47.511944,13.976667,1959 +alps_20245,ZLEMER HOEHE,,47.553333,14.040000,1061 +alps_20246,BRANDANGERKOGEL,,47.543889,14.072500,1508 +alps_20247,MULTERECK,,47.528889,14.027778,2176 +alps_20248,TRESSENSTEIN,,47.518889,14.051111,1196 +alps_20249,HINTERES FREIECK,,47.586944,13.100556,2308 +alps_20250,VORDERES FREIECK,,47.586667,13.110000,2142 +alps_20251,GRUBERHORN,,47.585278,13.105000,2230 +alps_20252,HAARBERG,,47.595000,13.189722,688 +alps_20253,MEHLSTEIN,,47.595000,13.201944,701 +alps_20254,KRATZSPITZ,,47.562778,13.149167,1759 +alps_20255,GSCHIRRWAND,,47.605000,13.247778,1553 +alps_20256,SCHWARZER BERG,,47.606111,13.237778,1584 +alps_20257,RABENSTEINKOPF,,47.593889,13.253333,1123 +alps_20258,HUEHNERKOPF,,47.588889,13.252222,1118 +alps_20259,LAMMEREGG,,47.581667,13.211111,894 +alps_20260,WIRRECK,,47.562222,13.208333,1473 +alps_20261,SATTELBERG,,47.570278,13.241111,1022 +alps_20262,AMEISEGGBERG,,47.621111,13.280000,1351 +alps_20263,ALPBICHL,,47.624167,13.316111,1477 +alps_20264,MOSAUKOPF,,47.609167,13.314167,1132 +alps_20265,ROADBERG,,47.572222,13.291667,1270 +alps_20266,EINBERG,,47.618056,13.361111,1688 +alps_20267,HUETTENKOGEL,,47.623056,13.389722,1593 +alps_20268,TABORBERG,,47.606667,13.418889,1618 +alps_20269,BODENBERG,,47.596389,13.444722,1523 +alps_20270,GAMSFELD,,47.623056,13.481111,2027 +alps_20271,RUSSBERG,,47.608889,13.514722,1666 +alps_20272,HORNSPITZ,,47.568056,13.478611,1433 +alps_20273,WIESKOGEL,,47.617500,13.522778,1605 +alps_20274,KRIEGECK,,47.611111,13.544722,1518 +alps_20275,SONNENWENDKOGEL,,47.622778,13.562222,1638 +alps_20276,HOCH KALMBERG,,47.612500,13.568056,1833 +alps_20277,NIEDER KALMBERG,,47.608056,13.579444,1827 +alps_20278,ROSENKOGEL,,47.607222,13.528889,1487 +alps_20279,LEITGEBKOGEL,,47.574444,13.550833,1220 +alps_20280,SULZKOGEL,,47.570833,13.574722,1546 +alps_20281,LOECKERKOGEL,,47.601667,13.619167,1597 +alps_20282,BRENNTENKOGEL,,47.608056,13.588889,1640 +alps_20283,ZWOELFERKOGEL,,47.608056,13.603889,1634 +alps_20284,ELFERKOGEL,,47.606111,13.610278,1580 +alps_20285,ROETENGRABENKOGEL,,47.586944,13.597500,1419 +alps_20286,SCHNEIDKOGEL,,47.575278,13.636944,1552 +alps_20287,BLEKARKOGEL,,47.580833,13.625278,1505 +alps_20288,SCHREIERKOGEL,,47.582222,13.596111,1619 +alps_20289,SCHIECHLINGKOGEL,,47.580000,13.602500,1668 +alps_20290,PLASSEN,,47.570278,13.606389,1953 +alps_20291,LAHNGANGKOGEL,,47.567500,13.610833,1755 +alps_20292,HOHE SCHEIBE,,47.562778,13.585000,1659 +alps_20293,SCHWARZKOGEL,,47.611389,13.696944,1800 +alps_20294,HOHER SARSTEIN,,47.602222,13.698889,1975 +alps_20295,FEUERKOGEL,,47.577222,13.696667,1704 +alps_20296,SOMMERBERGKOGEL,,47.620833,13.729722,1077 +alps_20297,ISCHLKOGEL,,47.620833,13.741944,977 +alps_20298,ZINKENKOGEL,,47.581944,13.766944,1854 +alps_20299,EISLOCHKOGEL,,47.580556,13.763889,1830 +alps_20300,FEUERKOGEL,,47.579722,13.751667,1779 +alps_20301,RAUER KOPPEN,,47.570833,13.744444,1807 +alps_20302,GALLHOFKOGEL,,47.610556,13.813333,958 +alps_20303,HOHE RADLING,,47.593889,13.813056,1398 +alps_20304,WEISSENBACHKOGEL,,47.611389,13.871667,1580 +alps_20305,SCHNOEDERITZKOGEL,,47.599167,13.882778,1545 +alps_20306,HASENKOGEL,,47.596389,13.868889,1616 +alps_20307,ROETELSTEIN,,47.593611,13.847500,1614 +alps_20308,KAMPL,,47.588889,13.877500,1685 +alps_20309,KUMITZBERG,,47.568056,13.885556,930 +alps_20310,TUERKENKOGEL,,47.608889,13.904167,1756 +alps_20311,GRASBERG,,47.615556,13.895833,1626 +alps_20312,LAWINENSTEIN,,47.597778,13.954167,1965 +alps_20313,RABENKOEGEL,,47.580278,13.955556,1534 +alps_20314,REITHARTLKOGEL,,47.578889,13.918611,1051 +alps_20315,SCHOEDELKOGEL,,47.571667,13.903056,981 +alps_20316,PLANWIPFEL,,47.565556,13.943333,1227 +alps_20317,BAEUERL,,47.604167,13.953611,1683 +alps_20318,TRAWENG,,47.603611,14.014167,1931 +alps_20319,SCHNEIDERKOGEL,,47.600556,13.989444,1765 +alps_20320,KRAHSTEIN,,47.573056,13.985278,1571 +alps_20321,WEISSKIRCHL,,47.568056,13.993056,1526 +alps_20322,SCHEIBLINGTRAGL,,47.620278,14.023889,2151 +alps_20323,BARTLRUECKEN,,47.623889,14.032500,2136 +alps_20324,GROSSES TRAGL,,47.618611,14.032222,2179 +alps_20325,KLEINES TRAGL,,47.615278,14.030833,2164 +alps_20326,KLEINER BRIEGLERSBERG,,47.621111,14.051667,2078 +alps_20327,GAMSSPITZ,,47.618056,14.060278,2057 +alps_20328,GRUBSTEIN,,47.613333,14.051944,2036 +alps_20329,GAMSSTEIN,,47.618889,14.080278,1994 +alps_20330,ROSSKOGEL,,47.598333,14.064444,1890 +alps_20331,SCHLUND,,47.610000,14.027778,2060 +alps_20332,MITTERBERG,,47.595833,14.040556,1711 +alps_20333,TRANEBENKOGEL,,47.597778,14.072222,1815 +alps_20334,GWOHNLISTEIN,,47.571111,14.048333,1645 +alps_20335,HECHLSTEIN,,47.573333,14.066667,1814 +alps_20336,GERORGENBERG,,47.635000,13.160000,528 +alps_20337,SCHLENKEN,,47.681389,13.213611,1648 +alps_20338,SCHMITTENSTEIN,,47.683056,13.236944,1695 +alps_20339,GITSCHENWAND,,47.634444,13.260278,1527 +alps_20340,REGENSPITZ,,47.680556,13.289167,1675 +alps_20341,GRUBERHORN,,47.674444,13.299444,1732 +alps_20342,GENNERHORN,,47.674722,13.310000,1735 +alps_20343,HOLZECK,,47.678889,13.329167,1603 +alps_20344,DUERLSTEIN,,47.665833,13.299444,1697 +alps_20345,HOHER FIRST,,47.661389,13.296389,1718 +alps_20346,FRUNSTBERG,,47.656389,13.285556,1673 +alps_20347,HOCHWIESKOPF,,47.640556,13.316944,1754 +alps_20348,HOCHBUEHEL,,47.636111,13.316111,1710 +alps_20349,TRATTBERG,,47.641111,13.274444,1757 +alps_20350,OSTERHORN,,47.673056,13.363889,1746 +alps_20351,HOHER ZINKEN,,47.670000,13.348611,1764 +alps_20352,GROSSE RADL,,47.664167,13.351389,1742 +alps_20353,KLEINE RADL,,47.658056,13.341944,1673 +alps_20354,PITSCHERBERG,,47.666111,13.375556,1720 +alps_20355,LABENBERG SCHOEBERL,,47.640833,13.388056,1546 +alps_20356,LABENBERG,,47.645556,13.395278,1642 +alps_20357,EGELSEEHOERNDL,,47.643611,13.358333,1782 +alps_20358,WIESLERHORN,,47.680833,13.409167,1603 +alps_20359,GSCHLOESSL,,47.637500,13.426944,1452 +alps_20360,BRAUNEDLKOGEL,,47.635000,13.450278,1894 +alps_20361,RETTENKOGEL,,47.681111,13.507222,1780 +alps_20362,BERGWERKSKOGEL,,47.676111,13.510000,1781 +alps_20363,MEISTERGUPF,,47.669167,13.500556,1584 +alps_20364,SCHOBERSTEIN,,47.657500,13.499722,1368 +alps_20365,RINNKOGEL,,47.666667,13.486667,1823 +alps_20366,BAERENPFADKOGEL,,47.649444,13.492500,1333 +alps_20367,PLATTENECK,,47.641389,13.484722,1492 +alps_20368,SCHARFEN,,47.635833,13.461111,1828 +alps_20369,SCHMALZTRAGER,,47.627500,13.465833,1889 +alps_20370,WILDER JAEGER,,47.631389,13.501111,1842 +alps_20371,GROSSER BRETTKOGEL,,47.628889,13.505833,1658 +alps_20372,KLEINER BRETTKOGEL,,47.633056,13.514722,1585 +alps_20373,WANKGUPF,,47.673056,13.525833,1683 +alps_20374,SONNTAGSKARKOGEL,,47.672222,13.531944,1682 +alps_20375,ROSSKOPF,,47.682222,13.555556,1657 +alps_20376,HAINZEN,,47.686667,13.567500,1638 +alps_20377,LAERCHKOGEL,,47.630278,13.535556,1530 +alps_20378,FEUERKOGEL,,47.686111,13.588333,1460 +alps_20379,PREDIGTSTUHL,,47.659722,13.639444,1278 +alps_20380,GROSSER ROSENKOGEL,,47.665278,13.646667,1190 +alps_20381,HOHER ROSENKOGEL,,47.668333,13.673889,1359 +alps_20382,HOHER RASCHBERG,,47.656111,13.689167,1487 +alps_20383,FEUERKOGEL,,47.649722,13.689444,1446 +alps_20384,BRUNNKOGEL,,47.680556,13.741389,1104 +alps_20385,SANDLING,,47.656389,13.714444,1717 +alps_20386,REHKOGEL,,47.658333,13.731389,1260 +alps_20387,DIETRICHSKOGEL,,47.642778,13.739167,1126 +alps_20388,KRITKOGEL,,47.644167,13.717222,1242 +alps_20389,KLAMMECKKOGEL,,47.634444,13.721667,973 +alps_20390,DIMMELBERG,,47.635000,13.739167,995 +alps_20391,BRAEUNINGZINKEN,,47.675278,13.793056,1899 +alps_20392,VORDERER SCHWARZMOOSKOGEL,,47.678611,13.816111,1842 +alps_20393,GREIMUTH,,47.669167,13.784722,1871 +alps_20394,ATTERKOGEL,,47.666667,13.787500,1826 +alps_20395,LOSER,,47.660833,13.771667,1837 +alps_20396,KLAMMKOGEL,,47.646111,13.829444,1794 +alps_20397,TRISSELWAND,,47.646111,13.814167,1754 +alps_20398,AHORNKOGEL,,47.639444,13.815833,1686 +alps_20399,HOCHKLAPF,,47.673611,13.829444,1600 +alps_20400,TRESSENSTEIN,,47.626389,13.789444,1201 +alps_20401,BREITWIESBERG,,47.672778,13.882500,1902 +alps_20402,REICHENSTEIN,,47.661389,13.886111,1913 +alps_20403,HAEUSLKOGEL,,47.660833,13.872778,1851 +alps_20404,BACKENSTEIN,,47.655278,13.868611,1772 +alps_20405,GROSSER GSOLBERG,,47.670833,13.855556,1881 +alps_20406,KLEINER GSOLBERG,,47.666389,13.854444,1840 +alps_20407,SCHOENBERG,,47.660833,13.843333,1863 +alps_20408,HOELLWIESER,,47.658056,13.835833,1861 +alps_20409,LANGEWAND,,47.684444,13.905000,1878 +alps_20410,DREIBRUEDERKOGEL,,47.676389,13.917500,1924 +alps_20411,SALZOFEN,,47.681944,13.938611,2070 +alps_20412,NEUSTEIN,,47.669444,13.937778,1870 +alps_20413,TENDLKOGEL,,47.627778,13.924167,1162 +alps_20414,ZWICKER,,47.626389,13.933333,1353 +alps_20415,FLODRING,,47.636667,13.946944,1385 +alps_20416,ELM,,47.673611,13.963056,2128 +alps_20417,HETZKOGEL,,47.675556,13.978333,1966 +alps_20418,WEISSE WAND,,47.640278,14.006111,2198 +alps_20419,PLANKERMIRA,,47.632778,14.005000,2178 +alps_20420,HOCHWEISS,,47.629444,14.007500,2158 +alps_20421,FEUERTALBERG,,47.685833,14.023056,2376 +alps_20422,BOESENBUEHEL,,47.679167,14.037222,2277 +alps_20423,GROSSER HOCHKASTEN,,47.673333,14.047500,2389 +alps_20424,SONNLEITSTEIN,,47.672222,14.026389,2177 +alps_20425,KLEINER HOCHKASTEN,,47.667778,14.055278,2352 +alps_20426,BRANDLECK,,47.660000,14.064167,2247 +alps_20427,HEBENKAS,,47.653333,14.065000,2285 +alps_20428,HOCHPLANBERG,,47.647222,14.061667,2229 +alps_20429,MITTERBERG,,47.648056,14.050556,2183 +alps_20430,KLEINER KRAXENBERG,,47.638333,14.041111,2179 +alps_20431,GROSSER KRAXENBERG,,47.636944,14.048056,2195 +alps_20432,GROSSER BRIEGLERSBERG,,47.626111,14.051944,2148 +alps_20433,SUNIWELL,,47.625833,14.059444,1898 +alps_20434,SCHATTECK,,47.744167,13.156111,922 +alps_20435,SENDLBERG,,47.736111,13.179444,1024 +alps_20436,OCHSENBERG,,47.748611,13.203611,1487 +alps_20437,EIBLECK,,47.742778,13.210556,1518 +alps_20438,SEEBERGHORN,,47.739444,13.239167,1261 +alps_20439,ANZENBERGHOEHE,,47.723056,13.243611,1469 +alps_20440,WIESERHOERNDL,,47.727222,13.233611,1567 +alps_20441,GROBRIEDEL,,47.709444,13.252500,1473 +alps_20442,LADENBERG,,47.700833,13.253889,1383 +alps_20443,SATTELKOEPFL,,47.690833,13.256667,1478 +alps_20444,LOIBERSBAHER HOEHE,,47.740278,13.296944,1456 +alps_20445,KOENIGSBERGER HORN,,47.701944,13.332778,1621 +alps_20446,BERGKOEPFL,,47.689167,13.273333,1480 +alps_20447,ZWOELFERHORN,,47.742500,13.351944,1521 +alps_20448,PILLSTEINHOEHE,,47.735000,13.338889,1478 +alps_20449,GARTENBERG,,47.743056,13.334167,1454 +alps_20450,ELFERSTEIN,,47.745278,13.360833,1376 +alps_20451,ILLINGERBERG,,47.721667,13.336389,1479 +alps_20452,SPITZECK,,47.725556,13.354167,1335 +alps_20453,BREITENBERG,,47.714167,13.387778,1260 +alps_20454,HOCHTHRON,,47.690833,13.333611,1574 +alps_20455,BLECKWAND,,47.691944,13.446667,1541 +alps_20456,BUERGL,,47.726389,13.485000,745 +alps_20457,SPARBER,,47.693889,13.466667,1502 +alps_20458,SOMMERRAUSTEIN,,47.749167,13.476944,1275 +alps_20459,GARTENZINKEN,,47.740556,13.560833,1557 +alps_20460,FIFERKOGEL,,47.687222,13.577500,1601 +alps_20461,GSPRANGGUPF,,47.744444,13.600833,1368 +alps_20462,HOCHJOCH,,47.741667,13.624722,1315 +alps_20463,JAINZENBERG,,47.720833,13.625000,834 +alps_20464,HOCHGLEGT,,47.725556,13.703056,1784 +alps_20465,TEUFLINGKOGEL,,47.717778,13.683333,1510 +alps_20466,PETERGUPF,,47.746111,13.736667,1646 +alps_20467,BANNKOGEL,,47.742500,13.732778,1656 +alps_20468,BERGWERKKOGEL,,47.738889,13.728611,1689 +alps_20469,MITTAGKOGEL,,47.733889,13.720833,1790 +alps_20470,SPEIKOGEL,,47.730833,13.729167,1707 +alps_20471,HOHE SCHROTT,,47.727500,13.711944,1839 +alps_20472,GLATZECK,,47.728611,13.758611,1523 +alps_20473,LANGWAND,,47.722500,13.746667,1685 +alps_20474,ROTKOGEL,,47.715556,13.732778,1585 +alps_20475,PREDIGTKOGEL,,47.716944,13.744167,1691 +alps_20476,GAMSKOGEL,,47.714167,13.747222,1628 +alps_20477,KARKOGEL,,47.717222,13.764722,1739 +alps_20478,AHORNKOGEL,,47.691389,13.752222,1397 +alps_20479,SCHUETTINGKOGEL,,47.729722,13.827500,1799 +alps_20480,MITTAGKOGEL,,47.725278,13.824722,1823 +alps_20481,GRUENBERG,,47.728333,13.808611,1874 +alps_20482,VORDERER RAUHENKOGEL,,47.722222,13.788333,1770 +alps_20483,HINTERER RAUHENKOGEL,,47.722500,13.783611,1747 +alps_20484,MOESELHORN,,47.720278,13.776667,1740 +alps_20485,SCHOENBERG,,47.712500,13.793611,2093 +alps_20486,WEHRKOGEL,,47.713333,13.800000,2006 +alps_20487,GROSSER SCHEIBLINGKOGEL,,47.714167,13.821667,2020 +alps_20488,KLEINER AUGSTKOGEL,,47.713333,13.830000,2003 +alps_20489,GRIESSKOGEL,,47.703611,13.815000,2006 +alps_20490,KLEINER WILDKOGEL,,47.701944,13.811111,1987 +alps_20491,GROSSER WILDKOGEL,,47.706944,13.803611,1992 +alps_20492,VORDERER RAUCHER,,47.698333,13.778333,1786 +alps_20493,NIEDERER AUGST½ECK,,47.694167,13.823611,1921 +alps_20494,RAUHKOGEL,,47.732222,13.867778,1652 +alps_20495,ROSSKOGEL,,47.726389,13.876389,1928 +alps_20496,FEIGENTALKOGEL,,47.722500,13.887222,1984 +alps_20497,WEISSHORN,,47.726944,13.861111,1755 +alps_20498,FELDKOGEL,,47.720000,13.860833,1790 +alps_20499,RINNERKOGEL,,47.719722,13.840556,2012 +alps_20500,REDENDER STEIN,,47.689722,13.887500,1899 +alps_20501,NESSELTAGKOGEL,,47.739444,13.899722,1235 +alps_20502,HOHES ECK,,47.729722,13.918333,1270 +alps_20503,KLEINER WOISING,,47.718056,13.896667,1879 +alps_20504,GROSSER WOISING,,47.716111,13.903889,2064 +alps_20505,HOCHWINDHAG,,47.718889,13.954167,1512 +alps_20506,ZWOELFERKOGEL,,47.709444,13.952500,2099 +alps_20507,GROSSER RABENSTEIN,,47.706111,13.950556,2068 +alps_20508,EINSERKOGEL,,47.709167,13.936111,1945 +alps_20509,WIDDERKARKOGEL,,47.690556,13.901944,1950 +alps_20510,HINTERER BRUDERKOGEL,,47.689167,13.916111,2031 +alps_20511,WILDGOESL,,47.692500,13.932222,2062 +alps_20512,SCHEIBLINGKOGEL,,47.688056,13.935000,2062 +alps_20513,HOCHKOGEL,,47.695000,13.953889,2091 +alps_20514,KNIEKOGEL,,47.697778,13.927500,1915 +alps_20515,FOEHREBGRABENECK,,47.735833,13.986944,1661 +alps_20516,PYRAMIDENKOGEL,,47.729167,14.005000,1961 +alps_20517,FAEUSTLING,,47.734722,13.998889,1919 +alps_20518,PULVERHOERNDL,,47.719722,14.001944,1997 +alps_20519,WESTLICHER HOCHPLATTENKOGEL,,47.714722,14.000833,2073 +alps_20520,OESTLICHER HOCHPLATTENKOGEL,,47.711944,14.011944,2154 +alps_20521,ROTGSCHIRR,,47.701667,13.996389,2270 +alps_20522,ELFERKOGEL,,47.705556,13.963611,2038 +alps_20523,ZEHNERKOGEL,,47.703889,13.968056,1929 +alps_20524,NEUNERKOGEL,,47.700000,13.970833,1904 +alps_20525,KLEINER ZOEBEL,,47.745833,14.041111,1361 +alps_20526,GROSSER ZOEBEL,,47.741389,14.045556,1508 +alps_20527,TEUFELSMAUER,,47.732500,14.082222,2185 +alps_20528,ZWILLINGKOGEL,,47.731944,14.057778,2184 +alps_20529,KREUZ,,47.729167,14.058056,2174 +alps_20530,KIRTAGMAUER,,47.729167,14.068611,2144 +alps_20531,ALMTALER KOEPFL,,47.718611,14.039722,204 +alps_20532,SCHERMBERG,,47.715278,14.035833,2396 +alps_20533,SAEUZAHN,,47.712778,14.043333,2250 +alps_20534,GROSSER PRIEL,,47.716944,14.063333,2515 +alps_20535,BROTFALL,,47.706389,14.059722,2360 +alps_20536,TEMLBERG,,47.700000,14.036944,2331 +alps_20537,GROESSTENBERGWINKEL,,47.694722,14.031944,2249 +alps_20538,WEITGRUBENKOPF,,47.697222,14.054444,2259 +alps_20539,SPITZMAUER,,47.695278,14.062222,2446 +alps_20540,MEISENBERG,,47.691111,14.052778,2119 +alps_20541,GURLSPITZE,,47.788056,13.143611,1158 +alps_20542,PITRACHSPITZE,,47.784722,13.162500,982 +alps_20543,STRUMBERG,,47.780556,13.194167,981 +alps_20544,SCHWARZENBERG,,47.760278,13.156944,1334 +alps_20545,GRUENBERG,,47.758889,13.203333,1014 +alps_20546,LIDAUNBERG,,47.795000,13.226667,1237 +alps_20547,SCHMIEDHORN,,47.783611,13.258611,1224 +alps_20548,KUGELBERG,,47.768889,13.232500,904 +alps_20549,RANNBERG,,47.752222,13.269722,1366 +alps_20550,SEEBERG,,47.749722,13.235000,1014 +alps_20551,FELDBERG,,47.810000,13.285278,871 +alps_20552,ELLMAUSTEIN,,47.794444,13.319444,1047 +alps_20553,BAMBICHL,,47.784722,13.302778,878 +alps_20554,SONNBERG,,47.771944,13.325000,1072 +alps_20555,PLOMBERG,,47.806111,13.348333,1105 +alps_20556,HOELLKAR,,47.798611,13.355278,1169 +alps_20557,EIBENBERG,,47.791111,13.377778,923 +alps_20558,WALLHUETTENKOPF,,47.790556,13.349167,1116 +alps_20559,SAURUESSEL,,47.772222,13.384167,722 +alps_20560,SULZBERG,,47.768611,13.341944,1017 +alps_20561,NASENBERG,,47.785556,13.393333,753 +alps_20562,KIENBERG,,47.796111,13.417500,947 +alps_20563,SCHAFBERG,,47.776389,13.434444,1782 +alps_20564,SPINNERIN,,47.773611,13.443056,1725 +alps_20565,TOERLSPITZ,,47.771389,13.448889,1589 +alps_20566,REININGSPITZ,,47.768056,13.427222,1460 +alps_20567,AUBERG,,47.785556,13.498333,907 +alps_20568,ACKERSCHNEID,,47.791667,13.473333,1119 +alps_20569,BREITENBERG,,47.771944,13.516111,1412 +alps_20570,HOHENECK,,47.761944,13.506389,1165 +alps_20571,FEICHTINGECK,,47.772222,13.463333,1412 +alps_20572,VORMAUERSTEIN,,47.753889,13.462222,1450 +alps_20573,KAEFERWANDL,,47.751667,13.476944,1320 +alps_20574,BRENNERIN,,47.811667,13.571944,1559 +alps_20575,MAHDLKOPF,,47.805000,13.560000,1261 +alps_20576,SECHSERKOGEL,,47.793333,13.527222,872 +alps_20577,TRATTENSPITZ,,47.761667,13.576389,1556 +alps_20578,SCHEIBLINGKOGEL,,47.759722,13.549167,1428 +alps_20579,LEONSBERG,,47.754444,13.569722,1745 +alps_20580,MITTERZINKEN,,47.751389,13.565833,1702 +alps_20581,ELEXENKOGEL,,47.801944,13.643889,1739 +alps_20582,HAUSECK,,47.779167,13.625000,844 +alps_20583,SEGENBAUMKOGEL,,47.801944,13.652500,1779 +alps_20584,HOCHHIRN,,47.806667,13.667222,1821 +alps_20585,KLEINER HOELLKOGEL,,47.801667,13.674167,1788 +alps_20586,GROSSER HOELLKOGEL,,47.797500,13.678611,1862 +alps_20587,OFENTALGUPF,,47.796667,13.692778,1701 +alps_20588,BRUNNKOGEL,,47.780278,13.679444,1508 +alps_20589,GOFFECK,,47.758889,13.683333,1101 +alps_20590,STEINKOGEL,,47.810833,13.714722,1644 +alps_20591,HELMESKOGEL,,47.803056,13.716389,1633 +alps_20592,WIMMERSBERG,,47.803889,13.743333,1243 +alps_20593,LOSKOGEL,,47.750278,13.731667,1538 +alps_20594,EIBENBERG,,47.787778,13.825000,1598 +alps_20595,ARIKOGEL,,47.756944,13.789444,1517 +alps_20596,SCHARERKOGEL,,47.751944,13.785833,1517 +alps_20597,SULZKOGEL,,47.753333,13.794444,1539 +alps_20598,STEINBERG,,47.785556,13.893889,1458 +alps_20599,SULZKOGEL,,47.763333,13.858056,1207 +alps_20600,GSCHIRRECK,,47.751667,13.867778,1410 +alps_20601,ROSSKOPF,,47.759167,13.886111,1268 +alps_20602,DONNERSTEIN,,47.786944,13.908333,1251 +alps_20603,WOLFSBERG,,47.772500,13.937222,1099 +alps_20604,KREUZECK,,47.768889,13.909444,1306 +alps_20605,BRUNNTALGUPF,,47.764444,13.898889,1280 +alps_20606,BALLKOGEL,,47.754167,13.909167,1032 +alps_20607,AMEISSTEIN,,47.758611,13.951389,776 +alps_20608,SPITZPLANECK,,47.804167,13.977500,1617 +alps_20609,KASBERG,,47.801667,13.998889,1747 +alps_20610,ROSSSCHOPF,,47.794167,14.007222,1647 +alps_20611,SCHWALBENMAUER,,47.801944,14.016111,1657 +alps_20612,BRANDBERG,,47.766389,13.968056,1074 +alps_20613,STRANEGG,,47.757778,14.005833,994 +alps_20614,JAUSENKOGEL,,47.810556,14.038611,1514 +alps_20615,HOCHSTEIN,,47.806667,14.057222,1405 +alps_20616,HUNDSKOGEL,,47.770000,14.046111,1167 +alps_20617,BRUNNKOGEL,,47.776389,14.021944,1063 +alps_20618,SANDBERG,,47.754167,14.037500,1106 +alps_20619,NOCKSTEIN,,47.815556,13.120278,1042 +alps_20620,GITZENBERG,,47.814444,13.189722,918 +alps_20621,SCHOBER,,47.812778,13.312778,1328 +alps_20622,SCHATZWAND,,47.812778,13.321111,1264 +alps_20623,MONDSEEBERG,,47.864722,13.371389,1029 +alps_20624,DRACHENWAND,,47.813889,13.347778,1176 +alps_20625,KULMSPITZE,,47.850556,13.406667,1095 +alps_20626,HOEBLINGKOGEL,,47.822222,13.428889,994 +alps_20627,KOPPENSTEIN,,47.821667,13.457778,1123 +alps_20628,ROSSMOOS,,47.872778,13.479444,1015 +alps_20629,HOCHPLETTSPITZ,,47.821944,13.469722,1134 +alps_20630,MIESENBERG,,47.867778,13.633333,993 +alps_20631,KRAHBERG,,47.852222,13.616944,1090 +alps_20632,BRAMHOSEN,,47.858611,13.587778,960 +alps_20633,BRUNNKOGEL,,47.827500,13.630556,1708 +alps_20634,HOCHLECKENKOGEL,,47.826944,13.621389,1691 +alps_20635,JAEGERKOEPFL,,47.823611,13.614722,1668 +alps_20636,SULZKOGEL,,47.817222,13.611389,1661 +alps_20637,GUGELZIPF,,47.830833,13.600833,1517 +alps_20638,SALZBERG,,47.814167,13.584444,1607 +alps_20639,GRUENALMKOGEL,,47.814444,13.640278,1821 +alps_20640,WIEGENECK,,47.868889,13.652500,955 +alps_20641,ROTTENSTEINER GUPF,,47.849167,13.695556,993 +alps_20642,HINTERER SIGNALKOGEL,,47.841111,13.671111,1014 +alps_20643,KLAUSGRABENKOGEL,,47.845833,13.678611,1008 +alps_20644,EIBLGUPF,,47.814722,13.675833,1813 +alps_20645,ALBERFELDKOGEL,,47.816944,13.705556,1707 +alps_20646,KOLLMANNSBERG,,47.862778,13.718611,957 +alps_20647,HOHENAUGUPF,,47.844167,13.722222,1062 +alps_20648,FAHRNAUGUPF,,47.837778,13.750833,1239 +alps_20649,HOCHLAKEN,,47.830556,13.760556,1026 +alps_20650,HEUMADGUPF,,47.814722,13.712778,1680 +alps_20651,PLEDLRIDL,,47.816667,13.717778,1624 +alps_20652,FEUERKOGEL,,47.816111,13.722778,1592 +alps_20653,BRENNTENKOGEL,,47.821111,13.755833,1135 +alps_20654,TRAUNKIRCHNER KOGEL,,47.869444,13.828611,1575 +alps_20655,ERLAKOGEL,,47.819167,13.826111,1575 +alps_20656,ROETELSTEIN,,47.824167,13.816944,1287 +alps_20657,SONNSTEIN,,47.823889,13.774722,1037 +alps_20658,KLEINER SONNSTEIN,,47.829167,13.785833,923 +alps_20659,TRAUNSTEIN,,47.873333,13.840278,1691 +alps_20660,KATZENSTEIN,,47.874444,13.860000,1350 +alps_20661,HOCHKOGEL,,47.852500,13.851944,1486 +alps_20662,WASSERKOGEL,,47.842778,13.867222,1268 +alps_20663,GASSLKOGEL,,47.824444,13.841111,1411 +alps_20664,SCHNELLERPLAN,,47.818333,13.866389,1411 +alps_20665,ZWILLINGSKOGEL,,47.860278,13.911667,1402 +alps_20666,ZWEISELECK,,47.814722,13.903889,1325 +alps_20667,TOTES KREUZ,,47.816389,13.921944,1243 +alps_20668,WINDHAGKOGEL,,47.871667,13.977222,1334 +alps_20669,JANSLKOGEL,,47.866111,14.002222,1040 +alps_20670,ZUCKERHUT,,47.850556,13.980000,902 +alps_20671,SCHEITERWIEDBERG,,47.840556,13.974167,977 +alps_20672,JAGERSPITZ,,47.830278,14.002500,1270 +alps_20673,FARRENAUBUEHEL,,47.831944,13.989167,1287 +alps_20674,SONNWAERTSKOGEL,,47.825556,13.968611,1195 +alps_20675,HOLLERBERG,,47.866667,14.059722,1279 +alps_20676,PFANNSTEIN,,47.860000,14.079722,1423 +alps_20677,SPEIKKOGEL,,47.847500,14.066111,1214 +alps_20678,GEISSSTEIN,,47.840000,14.043056,1279 +alps_20679,SCHWERECK,,47.824167,14.060278,1194 +alps_20680,ACKERLHOEHE,,47.045556,14.125833,2040 +alps_20681,PREININGER KUSTER,,47.024444,14.163333,1734 +alps_20682,KUCHALM,,47.033611,14.190556,1765 +alps_20683,KUHALM,,47.035000,14.250556,1784 +alps_20684,ZANITZBERG,,47.030556,14.210833,1607 +alps_20685,GEIERKOGEL,,47.023889,14.214444,1605 +alps_20686,MITTAGSKOGEL,,47.023611,14.229167,1577 +alps_20687,GREBENZEN,,47.038889,14.330278,1870 +alps_20688,GIDIKOGEL,,47.045000,14.305000,1468 +alps_20689,WASSEROFEN,,47.031111,14.286111,1544 +alps_20690,SCHARFES ECK,,47.013611,14.329722,1818 +alps_20691,OCHSENBERG,,47.124444,14.091389,1668 +alps_20692,FRAUENALPE,,47.064444,14.137222,1997 +alps_20693,MOOSALMKAKOGEL,,47.085556,14.175556,1519 +alps_20694,REUTERKOGEL,,47.118333,14.268889,1343 +alps_20695,KARCHAUER ECK,,47.091667,14.262222,1658 +alps_20696,TALER ECK,,47.078889,14.250556,1642 +alps_20697,PROBSTER ALM,,47.088889,14.256111,1652 +alps_20698,REITERKOGEL,,47.068611,14.234444,1561 +alps_20699,BLASENKOGEL,,47.111944,14.307778,1602 +alps_20700,ROSSECK,,47.102222,14.285556,1592 +alps_20701,STARNBERG,,47.062222,14.326667,1488 +alps_20702,FREIENECK,,47.173333,14.096111,1344 +alps_20703,KRAMERKOGEL,,47.129722,14.085278,1802 +alps_20704,TRATTENKOGEL,,47.134722,14.090000,1793 +alps_20705,NIKLBERG,,47.171389,14.155278,1531 +alps_20706,MITTELBERG,,47.160000,14.163333,1501 +alps_20707,STOLZALPE,,47.151389,14.190000,1817 +alps_20708,LASSER HOEHE,,47.144444,14.238333,1442 +alps_20709,PALINGKOGEL,,47.180278,14.298611,1468 +alps_20710,PLESCHAITZ,,47.161667,14.316389,1797 +alps_20711,SCHAFFERKOGEL,,47.150556,14.331389,1524 +alps_20712,MIRZLZINKEN,,47.229444,14.116389,1976 +alps_20713,BAIERDORFER BERG,,47.217222,14.124167,1762 +alps_20714,GREIM,,47.247778,14.151667,2480 +alps_20715,SANDKOGEL,,47.236667,14.149167,2214 +alps_20716,HOCHALPL,,47.247500,14.202222,1994 +alps_20717,SCHOETTLECK,,47.232778,14.261667,1596 +alps_20718,OFEN,,47.214444,14.221944,1256 +alps_20719,BUCHEN,,47.214722,14.259722,1315 +alps_20720,DUERNBERG,,47.210833,14.328611,1546 +alps_20721,UNHOLDINGSPITZE,,47.310278,14.090278,2293 +alps_20722,TISCHFELDSPITZE,,47.301667,14.093611,2268 +alps_20723,HOCHWART,,47.311667,14.131667,2301 +alps_20724,GAMSKARSPITZE,,47.304167,14.137500,2162 +alps_20725,SEIFRIEDSENKE,,47.295833,14.137778,2150 +alps_20726,KAMMKARLSPITZ,,47.295000,14.108056,2248 +alps_20727,SCHAFDACH,,47.286667,14.111111,2314 +alps_20728,MELLECK,,47.282222,14.128889,2365 +alps_20729,KRAUTWASCH,,47.279167,14.120833,2360 +alps_20730,HOCHSTUBOFEN,,47.267778,14.112778,2385 +alps_20731,HORNFELDSPITZE,,47.266944,14.091111,2277 +alps_20732,AARFELDSPITZ,,47.262500,14.098889,2284 +alps_20733,NARRENSPITZE,,47.255000,14.100556,2336 +alps_20734,AMEISKOPF,,47.250000,14.104444,2245 +alps_20735,RETTLKIRCHSPITZE,,47.259722,14.127778,2475 +alps_20736,STRASSECK,,47.253611,14.144167,2390 +alps_20737,ALKER,,47.304722,14.158056,2202 +alps_20738,LAUBTALECK,,47.308056,14.172222,2230 +alps_20739,TALKENSCHREIN,,47.296111,14.155000,2319 +alps_20740,HOCHWEBERSPITZE,,47.308611,14.200833,2375 +alps_20741,SCHOBERSPITZE,,47.289167,14.161111,2423 +alps_20742,BERNKADLERECK,,47.273056,14.176944,2262 +alps_20743,STANGENECK,,47.267778,14.185833,2291 +alps_20744,ROTOFEN,,47.271111,14.194444,2012 +alps_20745,RECHENGRAT,,47.259722,14.155000,2076 +alps_20746,LANGHAUSECK,,47.257778,14.193889,2142 +alps_20747,GIGLER,,47.306389,14.221667,2294 +alps_20748,KEGELECK,,47.301111,14.213056,2323 +alps_20749,SCHARNITZFELD,,47.311944,14.269722,2282 +alps_20750,MAISSOEFEN,,47.306389,14.262500,2174 +alps_20751,GSTODER,,47.293056,14.214444,2318 +alps_20752,GASTRUMERHOEHE,,47.278611,14.232222,2281 +alps_20753,ROSSALMSPITZ,,47.274722,14.234444,2237 +alps_20754,HUEHNERKOGEL,,47.298889,14.274722,2242 +alps_20755,STEINECK,,47.290833,14.294722,2260 +alps_20756,KUEHLNBREIN,,47.294444,14.288611,2229 +alps_20757,SCHIESSECK,,47.274722,14.323333,2275 +alps_20758,KLEINER ZINKEN,,47.275833,14.356111,2135 +alps_20759,SCHOENBERG,,47.265556,14.375833,1943 +alps_20760,HOHER ZINKEN,,47.270556,14.342500,2222 +alps_20761,ROSSSCHOPF,,47.280556,14.437778,1674 +alps_20762,STEINERKOGEL,,47.268889,14.418611,1755 +alps_20763,REITTRUHE,,47.268611,14.433333,1654 +alps_20764,ROSENKOGEL,,47.297222,14.552222,1918 +alps_20765,WILDINGER HOEHE,,47.278056,14.552778,1721 +alps_20766,RIESNERKRISPEN,,47.364444,14.092222,1922 +alps_20767,FINSTERKARSPITZ,,47.349167,14.088611,2022 +alps_20768,AHORNKOGL,,47.345278,14.115278,2001 +alps_20769,WOLFNALMSPITZE,,47.330278,14.124444,2049 +alps_20770,ALPLSPITZE,,47.324444,14.087222,1936 +alps_20771,HOCHROTWAND,,47.322778,14.126389,2166 +alps_20772,KOLLERRIEGEL,,47.372500,14.165556,2023 +alps_20773,RIEDLERZINKEN,,47.346111,14.202222,2175 +alps_20774,HAHNALPL,,47.331389,14.155000,1942 +alps_20775,SCHATTENKOGEL,,47.316389,14.197222,2054 +alps_20776,KREUZBERG,,47.373611,14.215000,2045 +alps_20777,BREITECKKOPPE,,47.370833,14.237222,2144 +alps_20778,GANGKOGEL,,47.364167,14.232778,2069 +alps_20779,HAINZL WASSERKOGEL,,47.365278,14.268333,2002 +alps_20780,HIRNKOGEL,,47.350278,14.249722,1981 +alps_20781,SCHOENFELDSPITZ,,47.337778,14.224167,2202 +alps_20782,HOHENWART,,47.329167,14.236667,2363 +alps_20783,EISKARSPITZ,,47.329167,14.228333,2350 +alps_20784,GROSSHANSL,,47.318611,14.265556,2315 +alps_20785,POELSECK,,47.321944,14.258889,2161 +alps_20786,RAUCHKOGEL,,47.361389,14.320278,1913 +alps_20787,REGENKOGEL,,47.360000,14.331944,1920 +alps_20788,KLEINHANSL,,47.324444,14.271389,2217 +alps_20789,GRUBER HIRNKOGEL,,47.335000,14.311111,2080 +alps_20790,JAURISKAMPEL,,47.335278,14.283056,2064 +alps_20791,SONNECK,,47.313611,14.310278,1836 +alps_20792,ROSENKOGEL,,47.350833,14.346667,1887 +alps_20793,EBNERALM,,47.341667,14.358611,1932 +alps_20794,KASOFEN,,47.325556,14.381944,1892 +alps_20795,EISENBEUTEL,,47.360556,14.439167,1855 +alps_20796,FUCHSRIEDL,,47.430278,14.101389,1762 +alps_20797,SCHAABSPITZE,,47.420000,14.143611,1901 +alps_20798,RATZENKOGEL,,47.416667,14.102222,1733 +alps_20799,TOTENKARSPITZ,,47.422778,14.084444,1834 +alps_20800,DORNKARRRUECKEN,,47.398333,14.089167,1905 +alps_20801,HOCHSTEIN,,47.430556,14.187778,2183 +alps_20802,VORDERE GSTEMMERSPITZE,,47.420556,14.191111,2136 +alps_20803,MITTLERE GSTEMMERSPITZE,,47.416111,14.199167,2104 +alps_20804,TATTERMANN,,47.409444,14.157222,2047 +alps_20805,KARHORNECK,,47.420833,14.155833,1828 +alps_20806,SCHOBERSPITZE,,47.403333,14.168056,2126 +alps_20807,JOCHSPITZE,,47.390833,14.191944,2037 +alps_20808,KARLSPITZE,,47.392778,14.173333,2097 +alps_20809,HUHNERECK,,47.381389,14.156111,2035 +alps_20810,SCHREINL,,47.380556,14.168611,2154 +alps_20811,HOCHRETTELSTEIN,,47.424722,14.233056,2220 +alps_20812,SEEKOPPE,,47.435278,14.248889,2150 +alps_20813,PLANNERSEEKARSPITZE,,47.414722,14.210000,2072 +alps_20814,PLANNERECK,,47.406944,14.218611,2003 +alps_20815,KLEINER ROTBUEHEL,,47.399444,14.210000,1866 +alps_20816,GROSSER ROTBUEHEL,,47.392500,14.208333,2019 +alps_20817,HINTERGULLINGSPITZ,,47.386667,14.213611,2054 +alps_20818,BRENNKOGEL,,47.400556,14.252222,1871 +alps_20819,KREUZKOGEL,,47.375556,14.241667,2109 +alps_20820,SOMMERECK,,47.418889,14.329722,2095 +alps_20821,SCHATTNERZINKEN,,47.398611,14.321389,2156 +alps_20822,SCHATTOFEN,,47.406667,14.313611,1960 +alps_20823,SEITNERZINKEN,,47.392222,14.300278,2164 +alps_20824,SCHRATTNERKOGEL,,47.384167,14.287500,2104 +alps_20825,PERWURZGUPF,,47.424167,14.385000,2082 +alps_20826,ZINKENKOGEL,,47.420000,14.376389,2233 +alps_20827,HOCHSCHWUNG,,47.407500,14.339444,2196 +alps_20828,REGENKARSPITZ,,47.397222,14.347778,2112 +alps_20829,STEINWANDKOGEL,,47.403611,14.387778,2132 +alps_20830,KRABERG,,47.384722,14.357778,1967 +alps_20831,GROSSER HENGST,,47.430556,14.428889,2159 +alps_20832,BRUDERKOGEL,,47.387778,14.422222,2299 +alps_20833,SCHUETTNERKOGEL,,47.396389,14.395833,2170 +alps_20834,STEINERMANDL,,47.380833,14.430556,2192 +alps_20835,KREUZKOGEL,,47.410556,14.499722,2027 +alps_20836,GEIERKOGEL,,47.399722,14.500000,2231 +alps_20837,SONNTAGSKOGEL,,47.390278,14.510833,2229 +alps_20838,SITZSTATTRIEDEL,,47.436389,14.545833,1557 +alps_20839,TIEBENFELDKOGEL,,47.425556,14.575000,1884 +alps_20840,BRANDNERKOGEL,,47.415556,14.576111,1786 +alps_20841,GROSSER GRIESSSTEIN,,47.390833,14.540000,2337 +alps_20842,KLEINER GRIESSSTEIN,,47.383889,14.545556,2175 +alps_20843,KNAUDACHKOGEL,,47.377222,14.536111,2227 +alps_20844,BRANDWALL,,47.475278,14.196944,1720 +alps_20845,SCHATTLEITKOPPE,,47.465278,14.185000,1808 +alps_20846,MOELBEGG,,47.456111,14.187500,2080 +alps_20847,EDELWEISSSPITZE,,47.444444,14.178611,1990 +alps_20848,BRANTSBERG,,47.494167,14.211944,1257 +alps_20849,PANZRIEDL,,47.465000,14.240000,1775 +alps_20850,HOCHGROESSEN,,47.458056,14.252778,2115 +alps_20851,HOCHGROESSEN,,47.460278,14.257500,2122 +alps_20852,SCHAFOEFEN,,47.487778,14.315556,1899 +alps_20853,SCHAFZAEHNE,,47.480278,14.313333,1917 +alps_20854,HORNINGER ZINKEN,,47.476667,14.321111,1989 +alps_20855,SCHUETTKOGEL,,47.461944,14.320556,2049 +alps_20856,TIEFENKARSPITZ,,47.468333,14.327778,1997 +alps_20857,ROTLEITENKOPPE,,47.453611,14.324444,1948 +alps_20858,RIEDNERZINKEN,,47.447500,14.270833,1846 +alps_20859,STEIN AM MANDL,,47.492500,14.365833,2043 +alps_20860,SEEGUPF,,47.483889,14.372500,2011 +alps_20861,MOSERSPITZ,,47.473056,14.387500,2230 +alps_20862,DIEWALFGUPF,,47.476389,14.378611,2125 +alps_20863,WIRTSPITZ,,47.446389,14.337500,2032 +alps_20864,WURZLEITEN,,47.443889,14.373611,2066 +alps_20865,ALMSPITZ,,47.470556,14.410000,2188 +alps_20866,HOCHHAIDE,,47.469722,14.399722,2363 +alps_20867,LAERCHKOGEL,,47.461389,14.457778,1666 +alps_20868,GROSSE RUEBE,,47.454444,14.416111,2093 +alps_20869,DREISTECKEN,,47.458056,14.396389,2382 +alps_20870,GROSSER BOESENSTEIN,,47.443333,14.404444,2448 +alps_20871,SONNTAGSKARSPITZE,,47.448611,14.396389,2350 +alps_20872,KLEINER BOESENSTEIN,,47.437778,14.402222,2395 +alps_20873,HAUSECK,,47.441667,14.423056,1982 +alps_20874,SCHOBER,,47.446389,14.453611,1577 +alps_20875,SCHWARZKOGEL,,47.459722,14.519444,1742 +alps_20876,SUNKMAUER,,47.457500,14.466944,1561 +alps_20877,TRIEBENSTEIN,,47.445000,14.487500,1810 +alps_20878,GEISSMAUER,,47.454167,14.483611,1511 +alps_20879,VOETTLECK,,47.453889,14.554722,1888 +alps_20880,HUEHNERKOGEL,,47.443611,14.555833,1793 +alps_20881,SCHWARZKOGEL,,47.438889,14.571111,1797 +alps_20882,NOJER,,47.553056,14.105556,1492 +alps_20883,AICHERLSTEIN,,47.556944,14.136389,1180 +alps_20884,LEISTENSTEIN,,47.548333,14.083611,1480 +alps_20885,KULM,,47.521111,14.125278,918 +alps_20886,HOHE TRETT,,47.519167,14.205000,1681 +alps_20887,LIEDLKOPPEN,,47.508611,14.182222,1378 +alps_20888,MITTERBERG,,47.541667,14.262222,1046 +alps_20889,OEDSTEIN,,47.538333,14.219167,826 +alps_20890,SCHMIEGERERKOEPFEL,,47.507778,14.238333,1458 +alps_20891,BLOSEN,,47.500833,14.271944,1724 +alps_20892,KIRCHDORFBERG,,47.510833,14.296944,1438 +alps_20893,DUERRENSCHOEBERL,,47.552778,14.365833,1737 +alps_20894,SPIESSKOGEL,,47.550833,14.379444,1675 +alps_20895,KLOSETERKOGEL,,47.550833,14.435000,1565 +alps_20896,TONECK,,47.534722,14.456111,1426 +alps_20897,LAERCHKOGEL,,47.560000,14.505556,1664 +alps_20898,KREUZKOGEL,,47.551111,14.502778,2001 +alps_20899,RIFFEL,,47.552778,14.515000,2106 +alps_20900,HAHNSTEIN,,47.547778,14.488611,1697 +alps_20901,LAHNGANGKOGEL,,47.528333,14.508889,1778 +alps_20902,KLEERIEDEL,,47.521111,14.485278,1329 +alps_20903,KALBLING,,47.547222,14.521667,2196 +alps_20904,SPARAFELD,,47.549722,14.531111,2247 +alps_20905,REICHENSTEIN,,47.549167,14.544167,2251 +alps_20906,HERRENWARTKOGEL,,47.558611,14.535556,1631 +alps_20907,SPIELKOGEL,,47.519444,14.569444,1731 +alps_20908,AMHARTSKOGEL,,47.512500,14.582778,1764 +alps_20909,WABENBAENKBERG,,47.517222,14.521111,1626 +alps_20910,ALMKOGEL,,47.619444,14.093611,2116 +alps_20911,SUMPERECK,,47.610833,14.131667,1913 +alps_20912,STEILECK,,47.598333,14.100556,1566 +alps_20913,GROSSER KAMPERBODEN,,47.604167,14.087500,1726 +alps_20914,BAERENFEUCHTMOELBING,,47.586944,14.126667,1770 +alps_20915,NIEDERTAUSING,,47.579167,14.140833,1539 +alps_20916,FELDL,,47.580833,14.102500,1696 +alps_20917,KLEINMOELBING,,47.622222,14.165000,2160 +alps_20918,QUERLSTEIN,,47.620278,14.178889,2084 +alps_20919,WALCHERKOPF,,47.611944,14.198889,1731 +alps_20920,BETSTEIN,,47.602222,14.185556,1836 +alps_20921,RAIDLING,,47.598056,14.158889,1909 +alps_20922,SONNWENDKOEPPERL,,47.591389,14.145833,1746 +alps_20923,SCHAFBERG,,47.599722,14.174722,1932 +alps_20924,BURGSTALL,,47.589722,14.188056,1284 +alps_20925,HOCHTAUSING,,47.584444,14.156944,1823 +alps_20926,GAMERINGSTEIN,,47.569167,14.160833,1293 +alps_20927,SCHWARZKOPPEN,,47.621111,14.236111,2035 +alps_20928,ANGERKOGEL,,47.617778,14.228889,2114 +alps_20929,NAZOGL,,47.611111,14.230000,2057 +alps_20930,KOSENNSPITZ,,47.609167,14.211944,1962 +alps_20931,KUEHFELD,,47.618889,14.248056,1923 +alps_20932,LAERCHKOGEL,,47.615833,14.254444,1788 +alps_20933,TORKOPPEN,,47.613889,14.246111,1901 +alps_20934,ROTENKOGEL,,47.596111,14.221389,1269 +alps_20935,HIRSCHRIEDEL,,47.593333,14.255556,1415 +alps_20936,BRUNNSTEIN,,47.621667,14.297222,1281 +alps_20937,HOCHBRAND,,47.615000,14.304167,1144 +alps_20938,SCHWARZKOGEL,,47.603333,14.323056,1454 +alps_20939,ANGERERHOEHE,,47.596944,14.318889,1509 +alps_20940,HARTING,,47.596111,14.309722,1539 +alps_20941,SALBERG,,47.573611,14.286389,1398 +alps_20942,BOSRUCK,,47.622778,14.346944,192 +alps_20943,PLESCHBERG,,47.610833,14.403056,1720 +alps_20944,LEICHENBERG,,47.591111,14.428056,1070 +alps_20945,LAERCHECK,,47.618056,14.478611,1488 +alps_20946,DOERFELSTEIN,,47.603611,14.479167,1074 +alps_20947,AUGSTEIN,,47.603333,14.547500,1370 +alps_20948,HIMBEERSTEIN,,47.585556,14.554722,1222 +alps_20949,HAINDLMAUER,,47.574444,14.548889,1435 +alps_20950,OSTRAWITZ,,47.684722,14.090833,1823 +alps_20951,HOCHFOHRA,,47.676944,14.091389,1507 +alps_20952,ZAMSEGGERKOGEL,,47.667500,14.124167,1031 +alps_20953,SCHAFFERKOGEL,,47.653333,14.125000,1200 +alps_20954,GROSSE SCHEIBE,,47.636111,14.144167,1848 +alps_20955,KLEINE SCHEIBE,,47.631667,14.135000,1836 +alps_20956,HIRSCHECK,,47.627500,14.123333,2068 +alps_20957,WILDALMLIITEN,,47.662778,14.206111,1917 +alps_20958,MITTERBERG,,47.660556,14.196944,1840 +alps_20959,BERGGHOF HOES,,47.666944,14.175833,1853 +alps_20960,SCHAFKOEGEL,,47.654722,14.177778,1990 +alps_20961,PYHRNER KAMPL,,47.648889,14.199167,2241 +alps_20962,SCHROCKEN,,47.644167,14.187222,2281 +alps_20963,KREUZSPITZE,,47.637778,14.178333,2327 +alps_20964,MITTERMOELBING,,47.631667,14.177500,2318 +alps_20965,SATTELKOPPEN,,47.624722,14.186111,2030 +alps_20966,HOCHMOELBING,,47.634167,14.178056,2336 +alps_20967,ZODERBERG,,47.636667,14.151667,1881 +alps_20968,DREI TURME,,47.670833,14.246667,1842 +alps_20969,LAGELSBERG,,47.669722,14.233889,2008 +alps_20970,TORSTEIN,,47.650278,14.219444,2236 +alps_20971,ROSSARSCH,,47.641944,14.223889,2205 +alps_20972,BAERNEGG,,47.636389,14.217222,1930 +alps_20973,EISERNES BERGL,,47.637500,14.240833,1955 +alps_20974,WARSCHENECK,,47.652500,14.241389,2388 +alps_20975,RAMESCH,,47.652222,14.251389,2119 +alps_20976,KITZSPITZE,,47.628056,14.235000,1977 +alps_20977,SEESPITZ,,47.678056,14.301389,1574 +alps_20978,SCHWARZENBERG,,47.661389,14.314444,1603 +alps_20979,KASKELLER,,47.665000,14.288611,1686 +alps_20980,MITTERBERG,,47.659722,14.285833,1695 +alps_20981,ROTE WAND,,47.658056,14.273333,1872 +alps_20982,STUBWIESWIPFEL,,47.654722,14.300278,1786 +alps_20983,SCHWARZECK,,47.645556,14.298333,1537 +alps_20984,WURZERKAMPL,,47.642222,14.287222,1706 +alps_20985,KARLECK,,47.631389,14.375556,1582 +alps_20986,SCHAFKOGEL,,47.675556,14.452222,1550 +alps_20987,LANGSTEIN,,47.662222,14.449167,1998 +alps_20988,KLEINER PYHRGAS,,47.662778,14.409722,2023 +alps_20989,LAGLMAUER,,47.665278,14.424444,1839 +alps_20990,MANNSBERG,,47.671944,14.426389,1603 +alps_20991,SCHEIBLINGSTEIN,,47.652778,14.424167,2197 +alps_20992,GROSSER PYHRGAS,,47.652500,14.398056,2244 +alps_20993,KREUZMAUER,,47.656389,14.446944,2091 +alps_20994,MUEHLAUER STADEL,,47.643889,14.442222,1541 +alps_20995,RAUCHSCHOBER,,47.665556,14.483611,1479 +alps_20996,KESSELKARGRAT,,47.653611,14.463611,1984 +alps_20997,RAUCHMAUER,,47.645556,14.503611,1834 +alps_20998,NATTERRIEGEL,,47.640278,14.490000,2065 +alps_20999,MITTAGSKOGEL,,47.638889,14.493056,2041 +alps_21000,HEXENTURM,,47.645833,14.481667,2172 +alps_21001,ADMONTER WARTE,,47.630000,14.493333,1804 +alps_21002,GRABNERSTEIN,,47.632778,14.505278,1847 +alps_21003,GROSSES MAIERECK,,47.671944,14.553333,1764 +alps_21004,GROSSER LECKERKOGEL,,47.650833,14.535278,1742 +alps_21005,HOCHTURM,,47.644167,14.528056,1686 +alps_21006,HIMMELREICH,,47.625000,14.524722,1369 +alps_21007,ANGELMAUER,,47.734167,14.106944,2102 +alps_21008,SCHWARZKOGEL,,47.732778,14.117500,2091 +alps_21009,KLEINER PRIEL,,47.732778,14.129722,2136 +alps_21010,KARLSPITZE,,47.729444,14.141667,1883 +alps_21011,ALMKOGEL,,47.721667,14.103056,1638 +alps_21012,OETTLBERG,,47.703611,14.121389,1342 +alps_21013,STEYSBERG,,47.718056,14.183889,1007 +alps_21014,POPPENBERG,,47.710000,14.171667,860 +alps_21015,TAMBERG,,47.737222,14.217222,1516 +alps_21016,SCHMEISSERKOGEL,,47.729722,14.240278,1324 +alps_21017,HUTBERG,,47.697778,14.219722,1191 +alps_21018,RADINGBERG,,47.741667,14.292222,901 +alps_21019,GUNST,,47.728889,14.312778,787 +alps_21020,PRAEWALD,,47.687778,14.281389,1227 +alps_21021,HAHNBAUM,,47.748056,14.356389,1453 +alps_21022,AUGUSTINKOGEL,,47.734167,14.392500,1335 +alps_21023,KLEINERBERG,,47.733611,14.367222,1287 +alps_21024,IMITZBERG,,47.695556,14.395278,1296 +alps_21025,HUNDSECK,,47.741389,14.420278,1259 +alps_21026,ZEITSCHENBERG,,47.718333,14.446389,1433 +alps_21027,TANNBERG,,47.692778,14.413333,1282 +alps_21028,LAERCHKOGEL,,47.725278,14.515833,1282 +alps_21029,ASTEIN,,47.719167,14.470000,1419 +alps_21030,WASSERKLOTZ,,47.721111,14.481944,1505 +alps_21031,GROSSER QUENKOGEL,,47.712500,14.508333,1254 +alps_21032,HIELFERSTUTZEN,,47.693056,14.503056,1487 +alps_21033,SCHWARZKOGEL,,47.696389,14.488889,1554 +alps_21034,GLOECKEL,,47.691944,14.551667,1319 +alps_21035,SALCHERBERG,,47.701389,14.539444,1256 +alps_21036,FEDERECK,,47.741944,14.560833,1340 +alps_21037,ANDELSBERG,,47.801944,14.108889,792 +alps_21038,HABICHTKOGEL,,47.775833,14.103889,1142 +alps_21039,WIPFL,,47.761111,14.099167,1126 +alps_21040,HUEHNERBODEN,,47.753611,14.097500,1229 +alps_21041,LAERCHSTOCK,,47.749722,14.116944,1366 +alps_21042,FUCHSKOGEL,,47.760556,14.133056,1106 +alps_21043,SPERING,,47.803611,14.195000,1605 +alps_21044,TAMBERG,,47.750278,14.179722,1188 +alps_21045,SCHILLERECK,,47.801389,14.225556,1748 +alps_21046,HOCHSENGS,,47.794444,14.247500,1838 +alps_21047,GAMSKOGEL,,47.787778,14.262222,1710 +alps_21048,HOHER NOCK,,47.782778,14.323611,1963 +alps_21049,ROHRAUER GROSSTENBERG,,47.787778,14.289444,1810 +alps_21050,HAGLER,,47.771389,14.310278,1669 +alps_21051,RAUHER KALBLING,,47.856667,14.085833,1381 +alps_21052,FALKENMAUER,,47.846389,14.086389,1569 +alps_21053,KERMSMAUER,,47.843611,14.103056,1599 +alps_21054,JAUSENKOGEL,,47.830833,14.128889,1346 +alps_21055,HOCHEDL,,47.826944,14.090556,1424 +alps_21056,RIESERSCHNEID,,47.821111,14.096111,1390 +alps_21057,REITERSCHNEID,,47.818611,14.106389,1284 +alps_21058,BRENNET,,47.818889,14.141389,1249 +alps_21059,KIENBERG,,47.858889,14.179444,801 +alps_21060,WINDBERG,,47.825000,14.196944,1158 +alps_21061,SIEBENSTEIN,,47.815833,14.198056,1246 +alps_21062,RAMMELSPITZ,,47.870278,14.251389,1054 +alps_21063,EIBLING,,47.858056,14.252500,1108 +alps_21064,GROSSER SPITZBERG,,47.828611,14.226667,1396 +alps_21065,KLEINER SPITZBERG,,47.828333,14.235833,1366 +alps_21066,SCHWARZKOGEL,,47.814722,14.241944,1300 +alps_21067,ANNASBERG,,47.869167,14.298333,1172 +alps_21068,HOHER TRAILING,,47.854167,14.303611,1237 +alps_21069,RAMSAUER GROESSTENBERG,,47.828333,14.284722,1458 +alps,Gaberl,,47.10900,14.91521,1548 +# Nepal peaks from http://www.alpin-koordinaten.de +# +ASYTPP,Aasiya Tuppa,,30.06194,82.27806,6255 +ABI,Abi,,27.95833,86.79278,6081 +AMDBLM,Ama Dablam,,27.86167,86.86389,6812 +ANGOLE,Angole,,27.85778,86.55556,6941 +ANPBSC,Annapurna Basecamp,,28.53064,83.87842,4125 +ANPRNI,Annapurna I,,28.59583,83.82222,8091 +ANPRNI,Annapurna II,,28.53472,84.125,7937 +ANPRNI,Annapurna III,,28.58361,83.99194,7555 +ANPRNI,Annapurna IV,,28.53722,84.08389,7525 +ANPSGN,Annapurna Southa (Ganesh),,28.51778,83.80833,7219 +ARKMTS,Arakam Tse,,27.92,86.7675,6423 +ARNKCH,Araniko Chuli,,29.17639,83.65694,6034 +BRUNTS,Baruntse,,27.87194,86.98194,7129 +BAUDHA,Baudha,,28.37861,84.67722,6672 +BHRTKM,Bhairab Takura (Madija Peak),,28.19806,85.80778,6799 +BHMDMR,Bhemdang Ri (Morimoto),,28.27361,85.66556,6150 +BHRKTS,Bhrikuti Sail,,28.89361,84.21778,6364 +BHLLHS,Bhulau Lhasa,,29.44194,82.59389,6102 +BJHNCH,Bijora Hiunchuli,,29.29444,82.52583,6111 +BOBAYE,Bobaye,,29.95917,81.0225,6808 +BOKTOH,Boktoh,,27.62083,88.00611,6142 +CHAGO,Chago,,27.92611,87.05472,6893 +CHAKO,Chako,,28.88056,84.28694,6704 +CHMLNG,Chamalang,,27.775,86.94917,7319 +CHAMAR,Chamar,,28.07389,86.64139,7186 +CHNGDI,Changadi,,29.71861,82.79722,6623 +CHNGBU,Changbu,,28.27111,85.55361,6781 +CHANGL,Changla,,30.30306,82.12889,6563 +CHEO,Cheo,,28.76444,84.45167,6820 +CHBHML,Chhibu Himal,,28.87194,84.15833,6581 +CHHPUL,Chhopulu,,27.92083,86.98333,6675 +CHOAUI,Cho Aui,,28.07056,86.65278,7350 +CHLPSS,Cho La pass,,27.96183,86.75197,5370 +CHOQYU,Cho Qyu,,28.09361,86.66194,8201 +CHBUTS,Chobu Tse,,27.88056,86.4925,6685 +CHOLTS,Chola Tse,,27.885,86.77167,6440 +CHMPMR,Chomo Pamari,,28.05722,86.08972,6109 +CHPULU,Chopulu,,27.91917,86.98194,6711 +CHUGMG,Chugimago,,27.84472,86.45083,6256 +CHULUW,ChuluW,,28.74333,84.02556,6419 +CHRNES,Churen East,,28.74361,83.22972,7371 +CHRNWS,Churen West,,28.73194,83.2125,7371 +DNGKUR,Dang Kuru,,27.94222,86.53333,6129 +DNGNGR,DangnogRi,,27.93944,86.52444,6753 +DNPHSH,Danphe Shail,,29.67222,83.00889,6103 +DULGRI,Daulagiri I,,28.69611,83.49528,8167 +DHAPA,Dhapa,,28.79694,83.61583,6012 +DHLGRI,Dhaulagiri II,,28.76278,83.38944,7751 +DHLGRI,Dhaulagiri III,,28.75444,83.37944,7715 +DHLGRI,Dhaulagiri IV,,28.73611,83.31528,7661 +DHLGRV,Dhaulagiri V,,28.73444,83.36556,7618 +DHLGRV,Dhaulagiri VI,,28.70833,83.27556,7268 +DHORMI,Dhormo I,,27.81306,88.12083,6559 +DNGJNG,Dingjung Ri,,27.975,86.52083,6171 +DIWANR,Diwanare,,27.98278,86.74028,6050 +DOGPCH,Dog Pache,,28.25611,85.60833,6562 +DGRHML,Dogari Himal,,28.76667,83.1,6536 +DOMKNG,DomeKang,,27.87778,88.15111,7442 +DRJLKP,Dorje Lakpa,,28.17389,85.77917,6966 +DRGMRP,Dragmorpo,,28.325,85.66222,6204 +DROHMI,Drohmo II,,28.82361,88.0875,6886 +ESPNMN,East Pinnacle (Manaslu),,28.55444,84.56444,7992 +EVRBSC,Everest Basecamp,,28.00697,86.85986,5340 +FRNKPF,Firnkopf,,29.90111,81.45833,6736 +GNCHMP,Ganchimpo,,28.16889,85.68194,6387 +GNDHHR,Gandharva Chuli(Gabelhorn),,28.53778,83.9625,6248 +GNSSLS,Ganesh (Salasungo),,28.32778,85.175,6143 +GNSYNG,Ganesh I (Yangra),,28.39167,85.12722,7429.3 +GNSHII,Ganesh II,,28.37917,85.05889,7111 +GNSHIV,Ganesh IV,,28.37139,85.06194,6945 +GANSHV,Ganesh V,,28.34528,85.08694,6986 +GNGPRN,Gangapurna,,28.63833,83.95,7455 +GUGIRI,Gaugiri,,29.04583,84.18778,6110 +GRSHNK,Gauri Shankar,,27.96583,86.33528,7134.3 +GOJANG,Geojang,,28.785,84.03278,6111 +GHNGLR,Ghenge Liru,,28.24583,85.42278,6581 +GHDCHD,GhodChadi,,27.94556,86.31722,6009 +GHSTNS,Ghustang South,,28.66917,83.24556,6465 +GHSTNR,Ghustaung North,,28.68083,83.24639,6529 +GHSTNG,Ghustung,,28.66583,83.25333,6046 +GMTHTW,Gimmigila (TheTwins),,27.74083,88.16167,7350 +GMCHLS,Gumba Chuli (LaisPeak),,28.19167,85.81944,6256 +GNDNCH,Gundang (ChuluE),,28.73556,84.03611,6584 +GURJA,Gurja,,28.67389,83.27694,7193 +GRKRPR,Gurkarpo Ri,,28.21056,85.77722,6891 +GYCHNG,Gyachungkang,,28.09806,86.74222,7952 +GYLSTN,Gyalsten,,28.18333,85.83806,6151 +HMLCHL,Himal Chuli,,28.43556,84.64222,7893 +HMCHNR,Himal Chuli North,,28.44972,84.60639,7371 +HMLCHW,Himalchuli West,,28.43528,84.61861,7540 +HMLUNG,Himalung,,28.76944,84.42194,7126 +HUNCHL,Hiunchuli,,28.51083,83.85083,6441 +HONGDE,Hongde,,28.84278,83.49917,6556 +HNCPYR,Hongku Chuli (Pyramid),,27.81667,87.01139,6809 +HUNGCH,Hungchi,,28.03472,86.75833,7036 +IMTISL,Imja Tse (Island Peak),,27.92083,86.93528,6183 +JNKOTL,Janak (Outlier),,27.87222,88.09361,7035 +JASAMB,Jasamba,,28.08139,86.60639,7351 +JMSNHM,Jaumson Himal,,28.84222,84.14389,6120 +JTHBHR,Jethibahurani,,29.88222,81.04361,6850 +JIRBNG,Jirbang,,28.62361,83.45167,6062 +JOGSNG,Jogsang,,27.88111,88.13556,7483 +JYCHYN,Jyachhyunga,,30.10611,81.08528,6338 +KLHML,Kali Himal,,27.87778,86.975,6974 +KMBNPK,Kambon Peak,,28.65833,83.30694,6570 +KNCHLK,Kanchauni Lekh,,29.23722,82.79306,6444 +KNCHNJ,Kanchenjunga,,27.7025,88.15028,8586 +KNCHNC,Kanchenjunga Central,,27.70139,88.15694,8482 +KNCHNJ,Kanchenjunga South,,27.69194,88.15694,8476 +KNHNCH,Kande Hiunchuli,,29.41111,82.56028,6627 +KNDUMB,Kandumbu,,30.235,81.39167,6219 +KNGGUR,Kang Guru,,28.6575,84.30139,6981 +KNNYNT,Kang Nyung Than,,29.39222,82.755,6248 +KNGTKL,Kang Tokal,,28.80028,83.16806,6294 +KANGAT,Kangata,,27.95,87.84028,6242 +KNGBCH,Kangbachen,,27.71667,88.11333,7903 +KNGKUR,KangKuru,,27.98778,86.51389,6242 +KANGTG,Kangtega,,27.79222,86.81861,6779 +KNJROB,Kanjeroba,,29.23333,82.87639,6612 +KNJRMP,Kanjiroba Main Peak,,29.37889,82.64028,6883 +KNSHNM,Kanshung Tse (Makalu II),,27.91583,87.07889,7678 +KNSHRM,Kanshurm,,28.17139,85.74111,6078 +KNSDLP,Kansi Dalpha,,29.28333,82.55389,6386 +KPCHUL,Kap Chuli,,29.84778,81.04083,6467 +KARKO,Karko,,29.92056,81.2175,6015 +KRYLNG,Karyolung,,27.73194,86.61528,6511 +KAWAND,Kawande,,27.80028,86.63389,6011 +KHTMKL,Khabur (Tumaklung),,27.68806,87.995,6331 +KHMJNH,Khamjungar Himal,,28.88944,84.12778,6700 +KHNGSK,Khangsar Kang (Roc Noir),,28.61389,83.87472,7485 +KHATNG,Khatang,,27.75694,86.59722,6782 +KHTNKN,Khatung Kang,,28.7775,83.92139,6484 +KHAYNG,Khayang,,28.63333,84.70833,6186 +KHJNGS,Khojangsouth,,28.83028,85.14583,6049 +KHISLN,Khongma Tse (IslandPeak),,27.92083,86.93722,6160 +KHMBTK,Khumbatshay (Khumbu Tse),,28.02028,86.87306,6636 +KRCTNT,Kirat Chuli (TentPeak),,27.78611,88.19861,7365 +KKTHNG,Kokthang,,27.56389,88.08333,6147 +KMBKRJ,Kumbakarna (Jannu),,27.68278,88.04583,7710 +KSMKNG,Kusum Kanguru,,27.73056,86.79111,6367 +KYJORI,Kyajori,,27.90833,86.67444,6148 +KYASHR,Kyashar,,27.755,86.825,6767 +KYUNGR,Kyunga Ri,,28.29611,85.66806,6601 +LMJNHM,Lamjung Himal,,28.48944,84.19167,6983 +LNGDK,Lang Dak,,27.91667,86.5625,6336 +LANGPO,Langpo,,28.49778,85.10417,6668.3 +LNGPPK,Langpo Peak,,27.85417,88.19722,6954 +LNGSSR,Langsisa Ri,,28.21694,85.71361,6427 +LNGTLR,Langtang Lirung,,28.25611,85.51944,7234 +LRKGRN,Larkya (Granite),,28.64611,84.53333,6249 +LASA,Lasa,,30.13556,81.08306,6189 +LRBNPS,Laurebina pass,,28.07306,85.42953,4662 +LNGNWS,Leonpo Gang(West),,28.20278,85.81639,6733 +LHSHMM,Lhashamma,,29.22639,82.74722,6412 +LHOTSE,Lho Tse,,27.9625,86.93417,8516 +LHTSSH,Lhotse Shar,,27.95833,86.94306,8400 +LKCPHS,Likhu Chuli (Pig Pherago Shar),,27.80694,86.54222,6718 +LCWPHR,Likhu Chuli West (PheragoNup),,27.80417,86.52083,6660 +LNGTRN,Lingtren,,28.0275,86.85472,6714 +LPULKH,Lipu Lekh,,30.05222,81.09222,6644 +LOBUJE,Lobuje,,27.96889,86.78472,6119 +LBJWST,Lobuje West,,27.97222,86.77917,6145 +LNPGNG,Loenpo Gang,,28.19583,85.8,6979 +LURHML,Luri Himal,,28.26028,85.50083,6958 +MAKLUI,Makalu I,,27.88972,87.94306,8463 +MLNGPH,Malangphutang,,27.8075,86.87,6575 +MNPTHI,Manapathi,,28.64556,83.45833,6380 +MANSLU,Manaslu,,28.54944,84.56194,8163 +MNSNRH,Manaslu Norht Peak,,28.60389,84.77806,7157 +MANSIL,Mansail,,29.30194,83.81278,6235 +MERA,Mera,,27.77417,86.91111,6654 +MERRA,Merra,,27.74083,88.01667,6334 +MUKUT,Mukut,,28.81694,83.48222,6087 +MYGDMT,Mygdi Matha,,28.65972,83.3225,6273 +NGCHPK,Nagdi Chuli (Pk29),,28.50361,84.56917,7871 +NLKNKR,Nalakankar,,30.3575,81.39944,6062 +NAMPA,Nampa,,30.00833,81,6755 +NAULKH,Nau Lekh,,27.68722,86.90556,6358 +NPLPK,Nepal Peak,,27.77694,88.67528,6910 +NGJMKN,Ngojumba Kang,,28.10611,86.70611,7743 +NLGNRT,Nialgiri North,,28.68917,83.74667,7061 +NLGCNT,Nilgiri Central,,28.67917,83.73861,6940 +NLGRST,Nilgiri South,,28.65417,83.73278,6839 +NIRKHA,Nirekha,,27.97694,86.76528,6139 +NRBKNG,Norbukang,,29.11722,83.09278,6005 +NUMBUR,Numbur,,27.75417,86.57444,6957 +NUPTSE,Nup Tse,,27.96722,86.88722,7855 +OMKNGR,Omi Kang Ri,,27.89778,87.96417,6829 +PBGNSI,Pabil (Ganesh) IV,,28.33528,85.12194,7052 +PHTBPY,Pahtibhra (Pyramid),,27.82083,88.175,7123 +PTHMBG,Palta Thumba (Milchberg),,29.30056,82.60889,6126 +PAMLAK,Pamlaka,,27.94083,86.34528,6349 +PNLOTP,Panalotapa,,27.80472,86.57111,6696 +PNGBUK,Pangbuk,,28.00417,86.51944,6631 +PRCHMC,Parchemuche,,27.83056,86.54583,6187 +PSHUWO,Pashuwo,,28.53167,85.16778,6177 +PTHBPY,Pathibhara (Pyramid Peak),,27.82083,88.175,6837 +PTHBHS,Pathibharaast (Sphinx),,27.82361,88.19167,6837 +PATRLI,Patrali,,29.42278,82.5875,6450 +PTHNGT,Pethang Tse,,27.9575,87.01556,6739 +PSBTHN,Phole Sobithongje,,27.68694,88.01028,6645 +PSBTHN,Phole Sobithongje I,,27.68639,88.02833,6669 +PHNPCW,Phunphun Chuli (Wedge),,29.27139,82.77444,6102 +PHRCHY,Phurbo Chyachu,,28.13056,85.86944,6637 +PSNGPK,Pisang Peak,,29.64917,84.19028,6091 +PRVNHM,Purvung Himal,,28.13444,84.01972,6465 +PTHNCH,Putha Hiunchuli,,27.74889,83.14861,7246 +RMTHCH,Ramthang Chang (Wedge Peak),,27.78111,88.0875,6812 +RMTHKB,Ramthang Karpo Ri (Dom Blanc),,28.24889,85.74861,6865 +RMTHNG,Ramthong,,27.75,88.085,6700 +RNPLDP,Rani Peak (Lidania Peak),,28.46778,84.68417,6459 +RTHONG,Rathong,,27.59361,88.09083,6679 +RTNCHL,RatnaChuli,,28.86472,84.36722,7035 +SGRMEV,Sagarmatha (Mount Everest),,27.98806,86.92528,8848 +SAHSAR,Sahsar,,28.85167,84.20889,6188 +SAIPAL,Saipal,,29.88722,81.49528,7031 +SLSNGN,Salasungo (Ganesh) III,,28.34583,85.07972,7110 +SMPNGB,Samdo (PangBuki),,28.63583,84.69444,6335.1 +SAULA,Saula,,28.61389,84.75472,6235 +SENUP,Senup,,27.86556,87.77889,6257 +SRKDHL,Serku Dholma,,29.33917,82.76472,6227 +SHARTS,Shar Tse,,27.96556,86.98333,7459 +SHRPUI,Sharpu II,,27.73139,87.90722,6336 +SHRTP3,SharTse II (Peak-38),,27.95583,86.96556,7591 +SSHKJN,Shey Shikhar (Junction Peak),,29.28694,82.79639,6139 +SMNHME,Simnag Himal East,,28.51667,84.43694,6251 +SCFLTD,Singu Chuli (FlutedPeak),,28.5875,83.885,6501 +SINKOR,Sinkor,,27.93194,86.54639,6380 +STCHCH,Sita Chuchura,,28.78333,83.48528,6611 +SORBUN,Soribun,,28.88472,84.17278,6328 +SWLKHN,Swelokhang,,28.725,84.64444,6180 +TABASR,Tabasar,,28.58083,85.05889,6065 +TAKRGO,Takargo,,27.875,86.51167,6782 +TALUNG,Talung,,27.65417,88.13361,7349 +TNSHRP,Tanga (Sharphu),,27.75333,87.92083,6410 +TNGKNG,Tangkongma,,27.80833,88.07583,6224 +TARIKH,Tarikha,,27.79333,86.64583,6187 +TRKNGL,TarkeKang (Glacier Dome),,28.60694,83.89111,7193 +TSHKNG,Tashi Kang,,28.85167,83.63194,6386 +TAWACH,Tawache,,27.89667,86.78,6501 +THMSRK,Thamaserku,,27.78472,86.7875,6623 +THPLSC,ThapleShikhar (CrossPeak),,27.75083,88.15,6341 +THNGMC,Thengmuche,,27.80389,86.59806,6492 +TILTSO,Tilitso,,28.68278,83.81389,7134 +TONGU,Tongu,,28.865,83.50694,6197 +TRTHNG,Tripura Thumba (hanging Glacier),,29.32667,82.73694,6553 +TSARTS,Tsartse,,28.86028,83.64972,6343 +TSRBNG,Tsaurabong,,28.69167,83.37694,6395 +TSHKRK,TshoKarpo Kang,,29.36861,82.78167,6556 +TSOGAK,Tsogaka,,28.38333,85.6875,7193 +TSSIMA,Tssima,,27.87833,88.02861,6224 +TUKUCH,Tukuche,,28.74611,83.56194,6920 +UBRA,Ubra,,28.26833,85.57611,6266 +URKNMN,Urkinmang,,28.16861,85.71611,6151 +VRHSHF,VarahShikar (Fang),,28.57806,83.80333,7647 +YKWKNG,YakaWa Kang,,28.81028,83.94444,6482 +YLNGKN,Yalung Kang,,27.70417,88.14028,8505 +YNSTSN,Yansa Tsenji,,28.27083,85.63333,6690 +YASTHK,Yasa Thak,,27.84583,86.58111,6151 +YAUPA,Yaupa,,27.8375,87.14083,6424.3 +,GAISBERG,,47.80444,13.11206,1288 +,Cam Funtensee,,47.48649,12.9707,2474 +,Goeblberg,,48.09310,13.52639,798 +# sota + +DA/AL-001,Kleiner Rappenkopf,,47.28310013,10.24390030,2277 +DA/AL-002,Linkerskopf,,47.29109955,10.26309967,2455 +DA/AL-003,Wilder Mann,,47.28749847,10.27970028,2577 +DA/AL-004,Muttlerkopf,,47.31389999,10.34029961,2368 +DA/AL-005,Krottenspitzen,,47.31969833,10.34469986,2551 +DA/AL-006,Fuerschiesser,,47.32809830,10.32999992,2272 +DA/AL-007,Suedl.Hoellhorn,,47.35860062,10.38669968,2150 +DA/AL-008,Noerdl.Hoellhorn,,47.35940170,10.38720036,2140 +DA/AL-009,Vorderer Wilder,,47.37810135,10.41139984,2241 +DA/AL-010,Kreuzkopf,,47.38439941,10.42000008,2288 +DA/AL-011,Wiedemerkopf,,47.38999939,10.41689968,2165 +DA/AL-012,Kreuzspitze,,47.38389969,10.43109989,2370 +DA/AL-013,Kesselspitze,,47.40000153,10.43360043,2284 +DA/AL-014,Laerchwand,,47.40670013,10.43719959,2187 +DA/AL-015,Sattelkoepfe,,47.41559982,10.43889999,2097 +DA/AL-016,Schaenzlespitze,,47.42250061,10.45670033,2051 +DA/AL-017,Kastenkopf,,47.43190002,10.47109985,2129 +DA/AL-018,Kirchendach,,47.43529892,10.47389984,2013 +DA/AL-019,Aelpelekopf,,47.43889999,10.45470047,2023 +DA/AL-020,Knappenkopf,,47.44309998,10.47309971,2071 +DA/AL-021,Iseler,,47.49940109,10.41969967,1862 +DA/AL-022,Wildengundkopf,,47.31280136,10.29189968,2238 +DA/AL-023,Schmalhorn,,47.33390045,10.28750038,1952 +DA/AL-024,Vorderer Wildgundkopf,,47.34640121,10.28559971,1935 +DA/AL-025,Seilhenker,,47.37080002,10.36170006,1794 +DA/AL-026,Huettenkopf,,47.37419891,10.33419991,1949 +DA/AL-027,Hahnenkopf,,47.37919998,10.32439995,1735 +DA/AL-028,Himmelhorn,,47.38190079,10.37609959,2114 +DA/AL-029,Rotkopf,,47.39080048,10.38080025,2182 +DA/AL-030,Laufbacher Eck,,47.39329910,10.38080025,2178 +DA/AL-031,Salober,,47.39780045,10.38780022,2088 +DA/AL-032,Berggaechtle,,47.40750122,10.39420033,2006 +DA/AL-033,Giebel,,47.41310120,10.39890003,1949 +DA/AL-034,Grosser Seekopf,,47.40579987,10.35439968,2084 +DA/AL-035,Kleiner Seekopf,,47.40140152,10.35639954,2095 +DA/AL-036,Zeiger,,47.41030121,10.35079956,1994 +DA/AL-037,Nebelhorn,,47.42190170,10.34220028,2225 +DA/AL-038,Gundkopf,,47.42169952,10.33580017,2200 +DA/AL-039,Rubihorn,,47.42470169,10.31389999,1957 +DA/AL-040,Kleiner Daumen,,47.44689941,10.38609982,2191 +DA/AL-041,Breitenberg,,47.47000122,10.38249969,1887 +DA/AL-042,Heidelbeerkopf,,47.45470047,10.32970047,1767 +DA/AL-043,Sonnenkopf,,47.45859909,10.32999992,1713 +DA/AL-044,Gernkopf,,47.46939850,10.34280014,1566 +DA/AL-045,Wildengundkopf,,47.28829956,10.18420029,2197 +DA/AL-046,Liechelkopf,,47.29579926,10.17940044,2383 +DA/AL-047,Angerkopf,,47.29389954,10.18640041,2263 +DA/AL-048,Kemptner Kopf,,47.29750061,10.19890022,2192 +DA/AL-049,Noerdl.Hammerspitze,,47.32139969,10.20689964,2250 +DA/AL-050,Schuesser,,47.32640076,10.19939995,2170 +DA/AL-051,Warmatsgundkopf,,47.33470154,10.20779991,2059 +DA/AL-052,Schlappolt,,47.35810089,10.22360039,1986 +DA/AL-053,Soellereck,,47.37329865,10.23750019,1706 +DA/AL-054,Torkopf,,47.37939835,10.12919998,1930 +DA/AL-055,Unt.Gottesackerwand,,47.38470078,10.13689995,1848 +DA/AL-056,Beslerkopf,,47.42610168,10.18000031,1655 +DA/AL-057,Ragiswanger Horn,,47.47829819,10.20079994,1615 +DA/AL-058,Sigiswanger Horn,,47.48469925,10.20940018,1527 +DA/AL-059,Ofterschwanger Horn,,47.49359894,10.21249962,1407 +DA/AL-060,Dreifahnenkopf,,47.46189880,10.15439987,1628 +DA/AL-061,Haellritzer Eck,,47.46780014,10.14360046,1669 +DA/AL-062,Tennenmooskopf,,47.48500061,10.14190006,1626 +DA/AL-063,Heidenkopf,,47.48059845,10.11110020,1685 +DA/AL-064,Girenkopf,,47.48059845,10.10389996,1683 +DA/AL-065,Gelbhansenkopf,,47.45059967,10.10420036,1437 +DA/AL-066,Mittag,,47.53670120,10.21720028,1462 +DA/AL-067,Baerenkopf,,47.53030014,10.21030045,1479 +DA/AL-068,Steineberg,,47.52719879,10.19169998,1683 +DA/AL-069,Sederer Stuiben,,47.51419830,10.15310001,1737 +DA/AL-070,Guendeleskopf,,47.50640106,10.12390041,1748 +DA/AL-071,Selekopf,,47.49029922,10.06000042,1663 +DA/AL-072,Hohenfluhalpkopf,,47.48920059,10.04889965,1636 +DA/AL-073,Einegundkopf,,47.48889923,10.03829956,1641 +DA/AL-074,Falken,,47.48360062,10.02060032,1564 +DA/AL-075,Gschwender Horn,,47.55080032,10.16940022,1441 +DA/AL-076,Vorderer Prodel,,47.53670120,10.12310028,1487 +DA/AL-077,Denneberg,,47.52780151,10.08440018,1427 +DA/AL-078,Thaler Hoehe,,47.57640076,10.11670017,1166 +DA/AL-079,Schwarzer Grat,,47.69219971,10.12559986,1118 +DA/AL-080,Tiefenbacher Eck,,47.52830124,10.36719990,1569 +DA/AL-081,Jochschrofen,,47.52360153,10.39360046,1625 +DA/AL-082,Hirschberg,,47.51860046,10.37639999,1500 +DA/AL-083,Rottachberg,,47.59080124,10.29360008,1116 +DA/AL-084,Alpspitze,,47.59780121,10.49580002,1575 +DA/AL-085,Kappelkoepfl,,47.59859848,10.50310040,1461 +DA/AL-086,Einerkopf,,47.56809998,10.60060024,1260 +DA/AL-087,Hohenfreyberg,,47.61360168,10.58749962,1041 +DA/AL-088,Hochegg,,47.66360092,10.69419956,902 +DA/AL-089,Sulzberg,,47.65499878,10.65439987,921 +DA/AL-090,Upratsberg,,47.84170151,10.46420002,899 +DA/AL-091,Bergmangalpe,,47.82500076,10.56639957,855 +DA/AL-092,Ellenberg,,47.74470139,10.59220028,798 +DA/AL-093,Oberellegg,,47.62060165,10.39999962,1136 +DA/AL-094,Hohe Schulter,,47.74060059,10.44219971,941 +DA/AL-095,Mittelberg,,47.64030075,10.42689991,1092 +DA/AL-096,Oberschwarzenberg,,47.67190170,10.45779991,966 +DA/AL-097,Gehrenkopf,,47.46530151,10.45639992,1896 +DA/AL-098,Hinterer Wilder,,47.36669922,10.38889980,2359 +DA/AL-099,Mitteleck,,47.37559891,10.38059998,1835 +DA/AL-100,Musskopf,,47.29079819,10.24499989,1968 +DA/AL-101,Mutzenkopf,,47.28110123,10.23309994,1692 +DA/AL-102,Spaetengundkopf,,47.31859970,10.28919983,1993 +DA/AL-103,Stuibenkopf,,47.48580170,10.42829990,1830 +DA/AL-104,Traufberg,,47.33890152,10.31639957,1601 +DA/AL-105,Zerrerkoepfle,,47.47689819,10.46780014,1946 +DA/AL-106,Rosskopf,,47.42610168,10.43249989,1822 +DA/AL-107,Bolsterlanger Horn,,47.45920181,10.20829964,1588 +DA/AL-108,Gatterkopf,,47.38859940,10.15030003,1659 +DA/AL-109,Geissberg,,47.41529846,10.21860027,1372 +DA/AL-110,Geisswiedenkopf,,47.42689896,10.20250034,1544 +DA/AL-111,Grauenstein,,47.45830154,10.15690041,1640 +DA/AL-112,Hoernlein,,47.42610168,10.10719967,1549 +DA/AL-113,Kaehberg,,47.38000107,10.16889954,1528 +DA/AL-114,Kl. Ochsenkopf,,47.46670151,10.18000031,1571 +DA/AL-115,Mitteralpenkopf,,47.47109985,10.18309975,1443 +DA/AL-116,Rehkoepfl,,47.42670059,10.11110020,1477 +DA/AL-117,Rosskopf,,47.38000107,10.10280037,1958 +DA/AL-118,Schafkopf,,47.42580032,10.17420006,1585 +DA/AL-119,Schwarzenberg,,47.43059921,10.21059990,1385 +DA/AL-120,Hirscheck,,47.38029861,10.09749985,1922 +DA/AL-121,Riesenkopf,,47.41170120,10.11310005,1480 +DA/AL-122,Schatthalde,,47.42470169,10.22329998,1314 +DA/AL-123,Samstenberg,,47.46689987,10.06779957,1513 +DA/AL-124,Ostertalberg,,47.48559952,10.16689968,1383 +DA/AL-125,Wittelsbacher Hoehe,,47.49940109,10.25640011,884 +DA/AL-126,Blaessleskopf,,47.53310013,10.35140038,1320 +DA/AL-127,Gehrenkoepfle,,47.56610107,10.41609955,1504 +DA/AL-128,Geissruecken,,47.56439972,10.38440037,1220 +DA/AL-129,Gigglstein,,47.56060028,10.33500004,1497 +DA/AL-130,Kuehberg,,47.57939911,10.40030003,1290 +DA/AL-131,Rosskopf,,47.53419876,10.36830044,1596 +DA/AL-132,Starzlachberg,,47.55780029,10.40610027,1585 +DA/AL-133,Wolfsbuechel,,47.54000092,10.34080029,1085 +DA/AL-134,Holzenberg,,47.59080124,10.42420006,1283 +DA/AL-135,Kahlenberg,,47.48279953,10.31389999,1017 +DA/AL-136,Kuehberg,,47.48780060,10.31330013,986 +DA/AL-137,Elbkopf,,47.31940079,10.24079990,2102 +DA/AL-138,Haldenwangerkopf,,47.27500153,10.17329979,2002 +DA/AL-139,Schartenkopf,,47.38029861,10.25559998,1278 +DA/AL-140,Soellerkopf,,47.36169815,10.23309994,1910 +DA/AL-141,Ringang,,47.36220169,10.26080036,1022 +DA/AL-142,Sattelkopf,,47.37889862,10.24779987,1422 +DA/AL-143,Alpenrosenkoepfle,,47.49280167,10.37889957,1004 +DA/AL-144,Burgschrofen,,47.48939896,10.35579967,1334 +DA/AL-145,Gaissalphorn,,47.41939926,10.31890011,1953 +DA/AL-146,Gaissfuss,,47.41780090,10.32670021,1991 +DA/AL-147,Gehrenkopf,,47.46939850,10.34280014,1566 +DA/AL-148,Hengst,,47.44060135,10.39939976,1989 +DA/AL-149,Heubatspitz,,47.48360062,10.38169956,2008 +DA/AL-150,Laufbichelkirche,,47.43190002,10.38529968,2042 +DA/AL-151,Mittagspitz,,47.45280075,10.41559982,1662 +DA/AL-152,Oestl. Wengenkopf,,47.42559814,10.36060047,2207 +DA/AL-153,Schattenberg,,47.40000153,10.31439972,1798 +DA/AL-154,Sonthofer Hoernle,,47.47669983,10.33780003,1525 +DA/AL-155,Zwoelferkopf,,47.48780060,10.35029984,1855 +DA/AL-156,Pfannenhoelzer,,47.44860077,10.40310001,1908 +DA/AL-157,Lachekopf,,47.47109985,10.39420033,1488 +DA/AL-158,Eschers,,47.84780121,10.37670040,901 +DA/AL-159,Kreuzelspitz,,47.54669952,10.30169964,1496 +DA/AL-160,Imbergkamm,,47.51219940,10.02890015,1305 +DA/AL-161,Jochgern,,47.35969925,10.37080002,1448 +DA/AL-162,Hoefats Suedgipfel,,47.36500168,10.35309982,2257 +DA/AL-163,Hoefats Ostgipfel,,47.36610031,10.35060024,2259 +DA/AL-164,Hoefats Nordgipfel,,47.37170029,10.35000038,2257 +DA/AL-165,Huettenkopf,,47.37419891,10.33419991,1949 +DA/AL-166,Huendlekopf,,47.54059982,10.05780029,1112 +DA/AL-167,Huettenberg,,47.56529999,10.06970024,1103 +DA/AL-168,Kuehberg,,47.59749985,10.14330006,1035 +DA/AL-169,Stoffelberg,,47.63690186,10.22389984,1063 +DA/AL-170,Kalzhofener Hoehe,,47.58029938,10.06250000,1118 +DA/AL-171,Kalzhofner Berg,,47.57419968,10.03859997,1007 +DA/AL-172,Kuehberg,,47.59749985,10.14309978,1035 +DA/AL-173,Muttner Hoehe,,47.57780075,10.05169964,1067 +DA/AL-174,Brosisellegghoehe,,47.60029984,10.36110020,1117 +DA/AL-175,Auf´m Berg,,47.64889908,10.60060024,900 +DA/AL-176,Illasberg,,47.64830017,10.75559998,852 +DA/AL-177,Kuehberg,,47.40083313,10.29065990,912 +DA/AL-178,Hafner,,47.41402435,10.25501823,911 +DA/AL-179,Burgberg,,47.41845322,10.24868774,994 +DA/AM-001,Zahn,,47.58420181,11.02560043,1619 +DA/AM-002,Puerschling,,47.58280182,10.99330044,1566 +DA/AM-003,Dreisaeuler Kopf,,47.58500000,10.94400000,1629 +DA/AM-004,Brunnenkopf,,47.58359909,10.92469978,1718 +DA/AM-005,Kleine Klammspitze,,47.58390045,10.90890026,1882 +DA/AM-006,Firstberg,,47.57939911,10.85809994,1784 +DA/AM-007,Hasentalkopf,,47.56560135,10.87469959,1797 +DA/AM-008,Loesertalkopf,,47.55889893,10.87609959,1859 +DA/AM-009,Weitalpspitze,,47.54919815,10.86330032,1870 +DA/AM-010,Kenzenkopf,,47.56140137,10.84780025,1745 +DA/AM-011,Hochblasse,,47.54750061,10.83920002,1989 +DA/AM-012,Gabelschrofen,,47.55500031,10.82310009,1989 +DA/AM-013,Spitzigschroefle,,47.56579971,10.79389954,1652 +DA/AM-014,Pilgerschrofen,,47.53969955,10.74170017,1769 +DA/AM-015,Zunderkopf,,47.53060150,10.76720047,1726 +DA/AM-016,Duerrenberg,,47.52030182,10.76360035,1797 +DA/AM-017,Schlagstein,,47.53079987,10.78890038,1680 +DA/AM-018,Kuchelbergspitz,,47.54109955,10.94250011,2020 +DA/AM-019,Kuchelbergkopf,,47.53559875,10.92609978,2026 +DA/AM-020,Friederspitz,,47.51750183,10.95919991,2049 +DA/AM-021,Sunkenkopf,,47.50469971,10.93220043,1766 +DA/AM-022,Bruenstelskopf,,47.53939819,11.04720020,1814 +DA/AM-023,Windstierlkopf,,47.53139877,11.00809956,1824 +DA/AM-024,Kieneckspitze,,47.54579926,11.00500011,1943 +DA/AM-025,Ettaler Manndl,,47.58444595,11.11527824,1633 +DA/AM-026,Buchenberg,,47.60609818,10.81169987,1142 +DA/AM-027,Hochriesskopf,,47.62720108,10.85970020,1470 +DA/AM-028,Goergeleck,,47.62139893,10.84109974,1429 +DA/AM-029,Muehlschartenkopf,,47.61809921,10.83220005,1308 +DA/AM-030,Rohrkopf,,47.57059860,10.78059959,1361 +DA/AM-031,Hornburg,,47.57170105,10.76889992,1172 +DA/AM-032,Tegelberg,,47.55609894,10.77530003,1880 +DA/AM-033,Altenberg,,47.52170181,10.80280018,1751 +DA/AM-034,Aschauer Berg,,47.63029861,11.11110020,1231 +DA/AM-035,Aschlerberg,,47.64390182,11.08279991,1430 +DA/AM-036,Kleiner Aufacker,,47.61439896,11.10719967,1533 +DA/AM-037,Baumgartenkoepfl,,47.59220123,10.91810036,1489 +DA/AM-038,Bena Koepfl,,47.54719925,10.78359985,1593 +DA/AM-039,Herziges Bergel,,47.59809875,10.85859966,1152 +DA/AM-040,Birnkopf,,47.61809921,10.87720013,1372 +DA/AM-041,Brameck,,47.61029816,10.91189957,1162 +DA/AM-042,Brameckkoepfel,,47.60969925,10.89939976,1287 +DA/AM-043,Hoher Brand,,47.50059891,10.91310024,1764 +DA/AM-044,Brandjoch,,47.50609970,10.90890026,1957 +DA/AM-045,Bremeneck,,47.60125000,10.99711000,1410 +DA/AM-046,Bruckkoepfel,,47.64080048,10.86750031,1092 +DA/AM-047,Brunnberg,,47.58420181,11.04139996,1529 +DA/AM-048,Brunnenkoepfl,,47.55059814,10.96829987,1609 +DA/AM-049,Dreierkoepfel,,47.55469894,11.00389957,1748 +DA/AM-050,Dreimaennl,,47.56060028,10.80220032,1551 +DA/AM-051,Duereckkopf,,47.62919998,10.93999958,1422 +DA/AM-052,Felderkopf,,47.53170013,11.01860046,1818 +DA/AM-054,Geissberg,,47.64469910,11.06169987,1484 +DA/AM-055,Geisssprungkopf,,47.54000092,11.00139999,1934 +DA/AM-056,Gelber Wandschrofen,,47.56330109,10.77750015,1645 +DA/AM-057,Grosser Zunderkopf,,47.53469849,11.03419971,1895 +DA/AM-058,Gschwandkopf,,47.61000061,11.09720039,1480 +DA/AM-059,Gsimseck,,47.61579895,10.92780018,1152 +DA/AM-060,Haldemooseck,,47.65330124,10.94750023,1007 +DA/AM-061,Hennenkopf (2),,47.58779907,10.81280041,1356 +DA/AM-062,Heuberg,,47.54750061,11.10719967,999 +DA/AM-063,Hinterer Rappenkopf,,47.58499908,11.05000019,1389 +DA/AM-064,Hinterschergen,,47.62810135,10.97920036,1307 +DA/AM-065,Hintertoerle,,47.58190155,10.85190010,1674 +DA/AM-066,Hirschbichlruecken,,47.51530075,11.02750015,1683 +DA/AM-067,Hoher Trauchberg,,47.63970184,10.89500046,1456 +DA/AM-068,Hoellstein,,47.58919907,11.12500000,1435 +DA/AM-069,Mittleres Hoernle,,47.64015000,11.06194000,1496 +DA/AM-070,Vorderes Hoernle,,47.64356000,11.06057000,1484 +DA/AM-071,Hundsfaellkoepfe,,47.56610107,10.89719963,1536 +DA/AM-072,Jaufen,,47.58919907,10.89220047,1624 +DA/AM-073,Kenzenkoepfel,,47.56919861,10.85420036,1354 +DA/AM-074,Kirchenkopf,,47.55970001,10.94690037,1209 +DA/AM-075,Kleinwachsbichel,,47.62060165,10.98610020,1240 +DA/AM-076,Kleinwildfeuerberg,,47.63669968,10.93529987,1500 +DA/AM-077,Koepfel,,47.61280060,11.00580025,1196 +DA/AM-078,Krottenkoepfel,,47.51919937,11.00920010,1780 +DA/AM-079,Krottenstein,,47.59059906,10.88189983,1684 +DA/AM-080,Latschenkopf,,47.58670044,10.98610020,1740 +DA/AM-081,Lausbichel,,47.51330185,10.95810032,1952 +DA/AM-082,Lauskopf,,47.59809875,10.97169971,1363 +DA/AM-083,Manndlkoepfe,,47.58359909,11.11079979,1605 +DA/AM-084,Martinswand,,47.57609940,10.93309975,1352 +DA/AM-085,Maulkopf,,47.62810135,10.88969994,1517 +DA/AM-086,Mitterwachsbichel,,47.61470032,10.98610020,1316 +DA/AM-087,Muehlberg,,47.56969833,11.11530018,1350 +DA/AM-088,Nickelskopf,,47.59719849,10.89140034,1364 +DA/AM-089,Niederbleieck,,47.63560104,10.91279984,1589 +DA/AM-090,Niederstraussberg,,47.54859924,10.81529999,1877 +DA/AM-091,Ochsensitz,,47.55694580,11.08452797,1515 +DA/AM-092,Rabenkopf,,47.55279922,11.11470032,1107 +DA/AM-093,Rahmenstein,,47.56829834,10.82579994,1378 +DA/AM-094,Rauheck,,47.49530029,10.98279953,1636 +DA/AM-095,Rauhenstein,,47.49810028,10.98750019,1727 +DA/AM-096,Rehbreinkopf,,47.62279892,11.08500004,1416 +DA/AM-097,Rinneleck,,47.56330109,10.95810032,1112 +DA/AM-098,Weisser Risskopf,,47.57609940,10.80529976,1486 +DA/AM-099,Rosengarten,,47.60193000,11.00447000,1423 +DA/AM-100,Rosseck,,47.57500076,10.94110012,1305 +DA/AM-101,Rosskarkopf,,47.51419830,11.04419994,1712 +DA/AM-102,Roskopf,,47.60559845,10.95440006,1172 +DA/AM-103,Rossstallkopf,,47.58810043,10.86579990,1490 +DA/AM-104,Rossstallkoepfl,,47.58810043,10.85560036,1499 +DA/AM-105,Saueregg,,47.51689911,10.77750015,1703 +DA/AM-106,Schaeferblasse,,47.53860092,10.83969975,1764 +DA/AM-107,Schaffelberg,,47.58639908,11.09060001,1434 +DA/AM-108,Scharfeck,,47.50970078,10.96170044,1926 +DA/AM-109,Schartenkoepf,,47.60749817,11.00689983,1370 +DA/AM-110,Schelleck,,47.49530029,10.91940022,1479 +DA/AM-111,Schloessel,,47.55580139,10.86279964,1806 +DA/AM-112,Schoberkoepfl,,47.64830017,10.87639999,1001 +DA/AM-113,Schwabenkopf,,47.59560013,10.95470047,1346 +DA/AM-114,Schwarzeck,,47.63859940,10.90190029,1471 +DA/AM-115,Schwarzenkoepfel (1),,47.52939987,10.90859985,1897 +DA/AM-116,Schwarzenkoepfel (2),,47.61000061,10.87279987,1189 +DA/AM-117,Sefelwand,,47.57809830,10.91469955,1724 +DA/AM-118,Stierkopf,,47.63541000,11.07482000,1535 +DA/AM-119,Straussbergkoepfel,,47.54970169,10.79940033,1767 +DA/AM-120,Sulzeck,,47.57360077,10.92500019,1389 +DA/AM-121,Sunkenberg,,47.49969864,10.93640041,1301 +DA/AM-122,Tegelbergkopf,,47.55889893,10.76920033,1567 +DA/AM-123,Vorderer Ziegspitz,,47.50719833,11.01169968,1815 +DA/AM-124,Vordertoerle,,47.58190155,10.84140015,1373 +DA/AM-125,Wachsbichl,,47.60559845,10.98390007,1364 +DA/AM-126,Windstierleck,,47.52610016,11.00080013,1701 +DA/AM-127,Ziegelspitz,,47.55588913,11.07124710,1719 +DA/AM-128,Zunderkoepfel,,47.49829865,11.01060009,1656 +DA/AV-001,Wannenberg,,48.17050934,10.20851898,604 +DA/AV-002,Weissenberg,,48.06278992,10.21051979,652 +DA/AV-003,Gerstenberg,,48.17778778,10.23421955,588 +DA/AV-004,Schiesserkopf,,48.34553146,10.23510838,535 +DA/AV-005,Sattelberg,,48.06702423,10.24291134,649 +DA/AV-006,Lindenberg,,48.19297409,10.29906940,548 +DA/AV-007,Schellenberg,,48.10842133,10.36961365,640 +DA/AV-008,Eichberg,,48.37078094,10.39000320,535 +DA/AV-009,Sonnenberg ,,48.07383728,10.40459156,619 +DA/AV-010,Schlegelsberg,,47.81077576,10.45826435,887 +DA/AV-011,Doldenhausener Berg,,48.08660126,10.46339417,633 +DA/AV-012,Doerrenberg,,48.38889313,10.46828651,523 +DA/AV-013,Rosskopf,,47.97987366,10.48598862,705 +DA/AV-014,Lauinger Berg,,48.48968506,10.51815319,501 +DA/AV-015,Schabersberg,,48.50046539,10.54530811,503 +DA/AV-016,Moosberg,,47.93309784,10.56256962,733 +DA/AV-017,Kaltenberg,,48.46422958,10.56351948,501 +DA/AV-018,Ziegelberg,,48.45343781,10.57092190,498 +DA/AV-019,Klosterberg,,48.47700119,10.57113934,497 +DA/AV-020,Wallberg,,48.42577362,10.60291100,507 +DA/AV-021,Hutsberg,,48.47198486,10.60549736,498 +DA/AV-022,Uhlenberg,,48.36701584,10.60802746,543 +DA/AV-023,Kirchberg,,48.44058990,10.60851955,508 +DA/AV-024,Schindkuchenberg,,48.43238831,10.61097240,511 +DA/AV-025,Vogelberg,,48.44909286,10.61268044,511 +DA/AV-026,Buchkopf,,48.42784500,10.61832523,513 +DA/AV-027,Neubichel,,48.07752609,10.62370872,622 +DA/AV-028,Hochruecken,,48.43592834,10.62493038,531 +DA/AV-029,Spielberg,,48.45405960,10.62565804,512 +DA/AV-030,Pfaffenberg,,48.47813797,10.62771416,504 +DA/AV-031,Lerchenberg,,48.48396683,10.64128590,501 +DA/AV-032,Steinberg,,48.37951279,10.65271091,549 +DA/AV-033,Muehlbuehl,,48.49232101,10.65567493,497 +DA/AV-034,Geissberg,,48.15131378,10.66158295,617 +DA/AV-035,Foehrenberg,,48.16050720,10.67109203,589 +DA/AV-036,Riedelsberg,,48.46273041,10.68681431,501 +DA/AV-037,Nonnenberg,,48.21017075,10.69611073,605 +DA/AV-038,Lettenberg,,48.51437759,10.69684982,478 +DA/AV-039,Teufelsberg,,48.51707077,10.71261978,488 +DA/AV-040,Staufenberg ,,48.44819260,10.71746922,573 +DA/AV-041,Geiselberg,,48.53110123,10.72052193,488 +DA/AV-042,Schellenberg,,48.46096802,10.72208309,529 +DA/AV-043,Mittelbuehl,,48.36275101,10.72515011,550 +DA/AV-044,Kanzel,,47.88834381,10.72553921,783 +DA/AV-045,Weiherberg,,48.46850586,10.72845268,510 +DA/AV-046,Steineberg,,48.37652588,10.73439121,548 +DA/AV-047,Axtesberg ,,48.43137360,10.73742199,554 +DA/AV-048,Galgenberg,,48.27646255,10.74137783,567 +DA/AV-049,Griessberg,,48.39217377,10.74278069,538 +DA/AV-050,Hoellberg,,48.42060089,10.74329472,545 +DA/AV-051,Weiherberg,,48.50650406,10.74503040,493 +DA/AV-052,Foehrenberg,,48.37102509,10.74957752,538 +DA/AV-053,Ottilienberg,,48.52058411,10.75375271,498 +DA/AV-054,Lindenberg,,48.25313568,10.75494766,578 +DA/AV-055,Galgenberg,,47.87335968,10.75765514,806 +DA/AV-056,Buchkopf,,48.27118301,10.76036644,572 +DA/AV-057,Weihermahdkopf,,48.27526474,10.76767731,570 +DA/AV-058,Dachsberg,,48.38557053,10.76839447,535 +DA/AV-059,Heiglkopf,,48.32860565,10.78136349,548 +DA/AV-060,Sulzkopf,,48.32013702,10.79289150,558 +DA/AV-061,Pfaffenberg,,48.41048050,10.79359150,532 +DA/AV-062,Leitenberg,,48.28594589,10.79565239,560 +DA/AV-063,Heidkopf,,48.45560837,10.80043316,520 +DA/AV-064,Pruegelkopf,,48.33652115,10.80275822,550 +DA/AV-065,Oberer Riedberg,,48.05202484,10.80440521,686 +DA/AV-066,Riedberg,,48.06129074,10.80445862,639 +DA/AV-067,Jaegerhuettenkopf,,48.34217072,10.81004429,534 +DA/AV-068,Herrgottsberg,,48.34857178,10.82493877,541 +DA/AV-069,Reischberg,,47.87178802,10.82606983,786 +DA/AV-070,Stossberg,,47.88152695,10.87344456,745 +DA/AV-071,Gagelberg,,48.03546524,10.93586636,645 +DA/AV-072,Christlsberg,,48.04718399,10.97331715,678 +DA/AV-073,Nadelberg,,48.43915939,10.97354984,517 +DA/AV-074,Staffelberg,,48.43756485,10.98635578,524 +DA/AV-075,Blattenberg,,48.60095215,10.98966408,489 +DA/AV-076,Wippberg,,47.89080429,10.99118900,731 +DA/AV-077,Kramerberg,,48.00375366,11.00486660,656 +DA/AV-078,Ochsenberg,,47.92465210,11.01535034,721 +DA/AV-079,Rainberg,,47.96795654,11.01539993,663 +DA/AV-080,Schindelberg,,48.52795410,11.01846695,495 +DA/AV-081,Rossberg,,48.21645737,11.02113914,561 +DA/AV-082,Steiniger Berg,,48.18584442,11.02239418,596 +DA/AV-083,Rehberg,,48.06404495,11.02456951,625 +DA/AV-084,Schlossberg,,47.93949509,11.02597809,708 +DA/AV-085,Schellenberg,,48.11180496,11.04125786,615 +DA/AV-086,Schafberg,,47.92763138,11.04292774,706 +DA/AV-087,Jungfernberg,,47.94203186,11.05544472,694 +DA/AV-088,Gruberberg,,47.96081543,11.05905247,681 +DA/AV-089,Schatzberg,,47.92926025,11.08311081,677 +DA/AV-090,Lorenziberg,,48.63074493,11.08410549,469 +DA/AV-091,Eichberg,,48.62422943,11.08469677,499 +DA/AV-092,Gollenberg,,48.10042953,11.09134960,613 +DA/AV-093,Zigeunerberg,,48.12033081,11.09449196,623 +DA/AV-094,Hauserberg,,48.20053101,11.09731674,555 +DA/AV-095,Sonnenberg,,48.13173676,11.12116146,611 +DA/AV-096,Plattenberg,,48.43004608,11.13366127,502 +DA/AV-097,Jaudsberg,,48.03936386,11.14392185,617 +DA/AV-098,Kuehberg,,48.06033325,11.15799427,586 +DA/AV-099,Fuchsberg ,,48.45043945,11.16082478,507 +DA/AV-100,Hechenberg,,47.82401276,11.16322803,630 +DA/AV-101,Fuchsberg,,48.18972397,11.17275810,561 +DA/AV-102,Eichberg,,47.82055664,11.17596912,643 +DA/AV-103,Schlossberg,,48.16094971,11.18652821,587 +DA/AV-104,Weinberg,,48.40136337,11.18972492,517 +DA/AV-105,Hirschberg,,47.90498352,11.19155025,684 +DA/AV-106,Fuchsberg,,48.33825684,11.19976425,521 +DA/AV-107,Schweinsberg,,48.33825684,11.19976425,520 +DA/AV-108,Moosberg,,48.61641312,11.20039463,415 +DA/AV-109,Reitersberg,,48.26448441,11.20199203,543 +DA/AV-110,Schellerberg,,47.78816605,11.21291637,654 +DA/AV-112,Reisberg,,48.62326813,11.22341347,412 +DA/AV-113,Hohenberg,,48.60803986,11.22493649,418 +DA/AV-114,Fischberg,,47.84482574,11.22575283,653 +DA/AV-115,Sichelberg,,48.55822754,11.22644138,440 +DA/AV-116,Pollingerbichel,,47.79087448,11.22762203,686 +DA/AV-117,Badbichl,,48.03524017,11.22860241,648 +DA/AV-118,Rauhenberg,,48.01628113,11.23089695,658 +DA/AV-119,Hirschberg,,48.10003662,11.23448372,587 +DA/AV-120,Hoehenberg,,48.02176666,11.23771954,673 +DA/AV-121,Buchberg,,47.80435944,11.24043846,689 +DA/AV-122,Tannenberg,,48.58633423,11.24058342,452 +DA/AV-123,Osterberg,,48.02812958,11.24077797,664 +DA/AV-124,Johannes-Berg,,48.43338394,11.24327183,514 +DA/AV-125,Deutenberg,,47.92146301,11.24775791,735 +DA/AV-126,Ilkahoehe,,47.90191269,11.24917793,726 +DA/AV-127,Leitenbichel,,47.79427338,11.25246429,706 +DA/AV-128,Taubenbichel,,48.23572922,11.25258636,543 +DA/AV-129,Holzerberg,,47.81618500,11.25381947,671 +DA/AV-130,Klausbuehl,,48.05884552,11.25488091,612 +DA/AV-131,Salzberg,,48.34349060,11.25606918,520 +DA/AV-132,Hofberg,,48.46449280,11.25612736,503 +DA/AV-133,Buckelsberg,,47.80375671,11.25846958,693 +DA/AV-134,Pflegersberg,,48.44959259,11.26087475,525 +DA/AV-135,Aschberg,,48.00749588,11.26265812,702 +DA/AV-136,Muenchener Berg,,48.16361237,11.27534485,572 +DA/AV-137,Feichelberg,,48.38524246,11.28091145,533 +DA/AV-138,Hirschbuehl,,48.00619888,11.28505802,687 +DA/AV-139,Galgenberg,,48.00799179,11.29153347,688 +DA/AV-140,Mandelberg,,48.40330505,11.29321671,533 +DA/AV-141,Alersberg,,48.01305389,11.32557487,699 +DA/AV-142,Schusterberg,,48.62963867,11.35144997,467 +DA/AV-143,Schoenberg,,48.02744293,11.35709763,661 +DA/AV-144,Kellerberg,,48.59571457,11.36367798,427 +DA/AV-145,Roehrenberg,,47.79513931,11.36597538,620 +DA/AV-146,Kirschberg,,48.60487366,11.37813854,432 +DA/AV-147,Kirschberg,,48.65344238,11.37923908,434 +DA/AV-148,Moosberg,,48.56145096,11.38056946,488 +DA/AV-149,Kalvarienberg,,48.65880966,11.38304138,427 +DA/AV-150,Dachsberg,,48.55253220,11.38568878,517 +DA/AV-151,Sonnenberg,,48.02424622,11.38870811,661 +DA/AV-152,Hoehenberg,,47.90126419,11.39029121,608 +DA/AV-153,Meilenberg,,47.91547775,11.39948845,707 +DA/AV-154,Adelshauser Berg,,48.63949203,11.41116142,430 +DA/AV-155,Leitersberg,,48.62686539,11.41266632,451 +DA/AV-156,Schlossberg,,48.47372055,11.43188095,518 +DA/AV-157,Schoenthaler Berg ,,48.54614258,11.45592499,523 +DA/AV-158,Kirchberg,,48.63083649,11.49178028,426 +DA/AV-159,Schlachtberg,,48.33961487,11.50500011,499 +DA/AV-160,Kronberg,,48.59429550,11.51621151,474 +DA/AV-161,Kreuzberg,,48.35137177,11.52053928,498 +DA/AV-162,Kreuzberg,,47.93304825,11.52207470,685 +DA/AV-163,Schlagberg ,,48.49654007,11.52532768,490 +DA/AV-164,Fuchsberg,,48.52582169,11.52796364,484 +DA/AV-165,Steinlberg,,48.61089706,11.52906990,487 +DA/AV-166,Nebelberg,,47.95058060,11.53101635,680 +DA/AV-167,Kastlberg,,48.62939072,11.53174686,495 +DA/AV-168,Geissberg,,48.57975388,11.53362751,466 +DA/AV-169,Annesberg,,48.53895187,11.53901386,497 +DA/AV-170,Leitenberg,,48.46382904,11.54212761,517 +DA/AV-171,Olympiaberg,,48.16970062,11.55187798,564 +DA/AV-172,Hasenberg,,48.44331741,11.56312752,497 +DA/AV-173,Seeberg,,48.58440018,11.57194424,438 +DA/AV-174,Grabenberg,,48.45978165,11.57718372,498 +DA/AV-175,Lustberg,,48.56295013,11.58343887,497 +DA/AV-176,Streitberg,,47.81806183,11.59063339,752 +DA/AV-177,Schindelberg,,47.82482147,11.60814190,805 +DA/AV-178,Heuberg,,47.77121353,11.62008572,730 +DA/AV-179,Langenberg,,47.77932358,11.62456417,725 +DA/AV-180,Pfannenberg,,48.56725311,11.63197803,480 +DA/AV-181,Buechsenberg,,48.49610138,11.66976929,504 +DA/AV-182,Schindelberg ,,48.48065567,11.67866135,505 +DA/AV-183,Haselberg,,48.51357651,11.68122768,516 +DA/AV-184,Hohenberg,,48.50100708,11.68814182,519 +DA/AV-185,Heimberg,,48.55933762,11.69238853,497 +DA/AV-186,Hochberg,,48.50218201,11.70748329,513 +DA/AV-187,Pfaffenberg,,48.56127930,11.71385002,489 +DA/AV-188,Weissberg,,48.46638870,11.72472763,487 +DA/AV-189,Griessberg,,48.42705154,11.72899437,506 +DA/AV-190,Hoellersberg,,47.78281021,11.72935867,795 +DA/AV-191,Schlossberg,,48.56606293,11.76111126,522 +DA/AV-192,Wirtsberg,,48.46195984,11.77782536,488 +DA/AV-193,Birkelberg,,48.19592667,11.81946659,528 +DA/AV-194,Taferlberg,,47.99699402,11.81969166,630 +DA/AV-195,Obermaierberg,,48.00702667,11.82059479,638 +DA/AV-196,Fuchsberg,,48.75942612,11.82201099,411 +DA/AV-197,Krebsenberg,,48.21913910,11.82409477,524 +DA/AV-198,Neufarner Berg,,48.15187454,11.82869148,552 +DA/AV-199,Stuerzerberg,,48.12930298,11.82903576,557 +DA/AV-200,Turmhuegel,,48.14087296,11.83773041,561 +DA/AV-201,Fuchsberg,,48.44002914,11.83826637,485 +DA/AV-202,Eichberg,,47.93142319,11.84748936,628 +DA/AV-203,Bruckberg,,48.23248291,11.84928608,523 +DA/AV-204,Galgenberg,,48.82632446,11.85119152,406 +DA/AV-205,Laubberg,,47.96606445,11.85608864,606 +DA/AV-206,Kreuzberg,,48.24765015,11.85846710,522 +DA/AV-207,Linsberg,,48.83051300,11.85846710,407 +DA/AV-208,Grossberg,,48.62265778,11.86318588,508 +DA/AV-209,Wiegenberg,,48.18313217,11.86435795,539 +DA/AV-210,Taubenberg,,48.05956268,11.86602497,609 +DA/AV-211,Schlossberg,,48.63282776,11.86797523,502 +DA/AV-212,Kirchberg,,48.60662460,11.87807751,493 +DA/AV-213,Allmensberg,,48.04217529,11.87968349,599 +DA/AV-214,Haarberg,,47.96758652,11.89237785,586 +DA/AV-215,Schwabenleite,,48.78451157,11.89336395,437 +DA/AV-216,Hocksberg,,48.48874664,11.89533901,446 +DA/AV-217,Hoechenberg,,48.04174423,11.89993572,607 +DA/AV-218,Palmberg,,48.84759903,11.90276623,411 +DA/AV-219,Ameisenberg,,48.52333450,11.90657234,485 +DA/AV-220,Keckberg,,48.22742081,11.90751362,517 +DA/AV-221,Feichtenberg,,48.73146820,11.91080856,459 +DA/AV-222,Schlaghaeuselberg,,48.54208755,11.91086960,494 +DA/AV-223,Predigtstuhl,,48.76276779,11.91224766,442 +DA/AV-224,Indorfer Berg,,48.28831100,11.91582775,484 +DA/AV-225,Schneiderhaeuselberg,,48.53624725,11.91873360,510 +DA/AV-226,Koppenberg,,48.71579361,11.93237495,480 +DA/AV-227,Eichelberg,,48.75378799,11.93422794,462 +DA/AV-228,Goldberg,,48.78890991,11.94180298,452 +DA/AV-229,Salzberg,,48.50496674,11.94239998,489 +DA/AV-230,Hoehenberg,,47.97756195,11.94338894,587 +DA/AV-231,Sandberg,,48.69327927,11.95006371,484 +DA/AV-232,Schindberg,,48.71036530,11.95065880,480 +DA/AV-233,Schopfberg,,48.61594391,11.95671654,499 +DA/AV-234,Ludwigshoehe,,48.09012222,11.96038055,617 +DA/AV-235,Lehmberg,,48.15420151,11.96644688,541 +DA/AV-236,Weinberg,,48.59220505,11.96846390,486 +DA/AV-237,Schuhbichl,,48.79022598,11.97841072,454 +DA/AV-238,Turmberg,,48.79022598,11.97841072,475 +DA/AV-239,Engelsberg,,48.53937912,11.97885513,497 +DA/AV-240,Fuchsberg,,48.71181107,11.98523903,451 +DA/AV-241,Schlossberg,,48.06328201,11.98562527,585 +DA/AV-242,Sauberg,,48.11787033,11.98681927,601 +DA/AV-243,Galgenberg,,48.77219391,11.98875809,455 +DA/AV-244,Kirschberg,,48.80128479,11.99045277,448 +DA/AV-245,Eierbuehel,,48.07421112,11.99776649,568 +DA/AV-246,Leitenberg,,48.08851242,12.00468063,581 +DA/AV-247,Schirmberg,,48.38380432,12.00504398,478 +DA/AV-248,Sandberg,,48.21900177,12.03275013,564 +DA/AV-249,Burgstall,,48.39530945,12.03407764,518 +DA/AV-250,Taubenberg,,48.54040909,12.03410816,494 +DA/AV-251,Kirchberg,,48.27321243,12.06491375,497 +DA/AV-252,Schinderbuckel,,48.65274429,12.08670807,494 +DA/AV-253,Meierberg,,48.63555908,12.09692192,486 +DA/AV-254,Schellenberg,,48.62139130,12.10049152,478 +DA/AV-255,Klosterberg,,48.84875870,12.10986900,411 +DA/AV-256,Geissberg,,48.26908875,12.11030579,498 +DA/AV-257,Fuchsberg,,48.67060852,12.12156391,484 +DA/AV-258,Binshamer Hoehe,,48.50073242,12.12359428,496 +DA/AV-259,Franknerberg,,48.73687744,12.12478352,465 +DA/AV-260,Zuererhoehe,,48.69059372,12.14049149,490 +DA/AV-261,Kaiserberg,,48.81202698,12.14831924,431 +DA/AV-262,Deisenberg,,48.85607147,12.16091919,415 +DA/AV-263,Fuchsberg,,48.86010742,12.16822243,409 +DA/AV-264,Carossahoehe,,48.53979111,12.17040825,477 +DA/AV-265,Schedenberg,,48.20951843,12.17428875,619 +DA/AV-266,Bettelberg,,48.85452271,12.17522240,401 +DA/AV-267,Kleeberg,,48.81827164,12.18265247,419 +DA/AV-268,Galgenberg,,48.65199280,12.18910789,484 +DA/AV-269,Eichelberg,,48.52177429,12.19099426,501 +DA/AV-270,Rotbuckel,,48.85677719,12.19853306,406 +DA/AV-271,St. Wolfgangsberg,,48.62736511,12.20733070,462 +DA/AV-272,Waldskuchel,,48.85755539,12.21652508,400 +DA/AV-273,Poeschlberg,,48.64173508,12.21790600,475 +DA/AV-274,Veitsberg,,48.64449310,12.27328300,479 +DA/AV-275,Stoeckelberg,,48.64043808,12.27685833,470 +DA/AV-276,Schindelberg,,48.65556717,12.28705311,466 +DA/AV-277,Scheiberg,,47.91516495,12.30146408,564 +DA/AV-278,Doebelberg,,47.89542389,12.30315304,553 +DA/AV-279,Taeuberlberg,,48.64738464,12.30349445,462 +DA/AV-280,Buckberg,,48.59769821,12.30441666,473 +DA/AV-282,Gifthaler Berg,,48.36874008,12.32106972,498 +DA/AV-283,Taxberg,,48.21162796,12.32170010,554 +DA/AV-284,Enzelsberg,,48.60392380,12.32893085,440 +DA/AV-285,Schlossberg,,48.07193756,12.33035564,594 +DA/AV-286,Tannberg,,48.21690369,12.33330536,548 +DA/AV-287,Schloesselberg,,48.60781860,12.33532810,449 +DA/AV-288,Gesenderberg,,48.61140823,12.35345554,488 +DA/AV-289,Hunsruck,,48.40982437,12.38393593,492 +DA/AV-290,Fuchsberg,,48.54714966,12.43393612,483 +DA/AV-291,Hausberg,,48.48533249,12.45437527,512 +DA/AV-292,Wechselberg,,48.55995178,12.46059704,480 +DA/AV-293,Fuchsberg,,48.57659149,12.47050571,485 +DA/AV-294,Fuchsberg,,48.48723221,12.47427750,520 +DA/AV-295,Schneiderberg,,48.48263168,12.47748375,508 +DA/AV-296,Hainberg,,48.49407578,12.49389458,497 +DA/AV-297,Klosterberg,,48.58454514,12.50371933,469 +DA/AV-298,Gr. Gampersberg ,,48.58454514,12.50371933,487 +DA/AV-299,Kirchberg,,48.28951645,12.56475544,450 +DA/AV-300,Hampersberg,,48.29151917,12.57785034,471 +DA/AV-301,Schlossberg,,48.53608322,12.59565830,478 +DA/AV-302,Pfarrberg,,48.48701477,12.60651398,476 +DA/AV-303,Weinberg,,48.52837372,12.60869980,500 +DA/AV-304,Dachsberg,,48.36883163,12.62683868,487 +DA/AV-305,Lindach,,48.27550125,12.63101959,460 +DA/AV-306,Waldbichl,,48.28885651,12.63906670,458 +DA/AV-307,Weiherberg,,48.55041122,12.70973873,463 +DA/AV-308,Lehenberg,,48.66145706,12.80123043,425 +DA/AV-309,Adelsberg,,48.25623322,12.88692760,476 +DA/AV-310,Rehberg,,48.26053238,12.93986702,485 +DA/AV-311,Schellenberg,,48.29288101,13.03223610,549 +DA/AV-312,Freiberg,,48.34747314,13.11368084,538 +DA/AV-313,Steinberg,,48.47175217,13.13296700,510 +DA/AV-314,Aichberg,,48.32348251,13.15266991,482 +DA/AV-315,Klosterberg,,48.49326706,13.21029472,518 +DA/AV-316,Eichelberg,,48.59314346,13.21810246,419 +DA/AV-317,Galgenberg,,48.53902054,13.23339176,402 +DA/AV-318,Geissberg,,48.38435364,11.53683376,500 +DA/AV-319,Fuchsberg,,48.37349701,11.55448055,492 +DA/AV-320,Hackenberg,,48.39468384,11.51209736,503 +DA/AV-321,Riedberg,,48.12059021,11.02208900,507 +DA/AV-322,Vogelberg,,48.13165283,11.02725315,507 +DA/AV-323,Mauerner Berg,,48.10065842,11.20056915,611 +DA/AV-324,Bitterberg,,48.09561539,11.16144753,565 +DA/AV-325,Hoehenberg,,48.06114960,11.21627522,635 +DA/AV-326,Klasberg,,47.96029282,11.20421124,718 +DA/AV-327,Blumberg,,47.95088577,11.15897179,614 +DA/AV-328,Horn,,48.00471115,11.48623657,638 +DA/AV-329,Ludwidgshoehe,,47.96791840,11.51492500,690 +DA/AV-330,Perlacher Mugl,,48.06916046,11.57703876,587 +DA/AV-331,Kirchberg,,47.76509094,11.63166904,733 +DA/AV-332,Eiberg,,47.82220840,11.66304970,773 +DA/AV-333,Hoellenstein,,47.92419815,11.79886913,672 +DA/AV-334,Steinberg,,48.11298752,11.30580235,607 +DA/AV-335,Parsberg,,48.13214111,11.32804680,569 +DA/AV-336,Lindbuehel,,48.13964844,11.33473587,563 +DA/AV-337,Emmeringer Leite,,48.17401886,11.29247475,561 +DA/AV-338,Edelberg,,48.22650146,10.97700310,535 +DA/AV-339,Dachaer Berg,,48.02545929,10.96744728,668 +DA/AV-340,Schoenbuehl,,48.02075958,10.96030045,667 +DA/AV-341,Schilcherberg,,48.01994705,10.97995567,678 +DA/AV-342,Hackenberg,,48.39472961,11.51216412,508 +DA/AV-343,Geissberg,,48.38430786,11.53683376,500 +DA/AV-344,Fuchsberg,,48.37354279,11.55441093,490 +DA/AV-345,Weinberg,,48.39274216,11.47950554,496 +DA/AV-346,Eschlberg,,48.16471863,12.76889038,501 +DA/AV-347,Schlossberg,,48.26060104,12.95919991,460 +DA/AV-348,Peretshofer Hoehe,,47.85663986,11.52556038,729 +DA/AV-349,Rothenberg,,47.82439041,11.50415039,670.7 +DA/AV-350,Kalvarienberg,,47.76388931,11.55500031,704 +DA/AV-351,Hechenberg,,48.17409897,12.80778408,501 +DA/AV-352,Aidlinger Hoehe,,47.71606000,11.25443000,791 +DA/AV-353,Binsberg,,47.87900000,11.54750000,753 +DA/AV-354,Kreuzbichel,,47.84970000,11.58890000,714 +DA/AV-355,Wallersberg,,48.31500000,11.45500000,528 +DA/AV-356,Scheuerberg,,48.18590330,12.77044773,444 +DA/AV-357,Hoehenberg,,48.14327000,10.42042000,614 +DA/AV-358,Buschhorn,,48.16454000,10.41165000,602 +DA/BE-001,Blomberg,,47.73559952,11.50329971,1248 +DA/BE-002,Heigelkopf,,47.72859955,11.51469994,1205 +DA/BE-003,Enzenauerkopf,,47.72719955,11.46000004,1201 +DA/BE-004,Angerlkopf,,47.72359848,11.46829987,1266 +DA/BE-005,Stallauer Eck,,47.73500061,11.47970009,1216 +DA/BE-006,Demelspitze,,47.67029953,11.54559994,1158 +DA/BE-007,Brauneck,,47.66500092,11.52560043,1554 +DA/BE-008,Schroedelstein,,47.66279984,11.52079964,1548 +DA/BE-009,Stangeneck,,47.66059875,11.50860023,1646 +DA/BE-010,Vorderer Kirchstein,,47.66059875,11.50310040,1670 +DA/BE-011,Hinterer Kirchstein,,47.65890121,11.49470043,1667 +DA/BE-012,Probstenwand,,47.66249847,11.48560047,1589 +DA/BE-013,Altlachberg,,47.56969833,11.37779999,1235 +DA/BE-014,Anderlkopf,,47.61169815,11.56439972,1231 +DA/BE-015,Bergelskopf,,47.64281082,11.40102959,1413 +DA/BE-016,Blaickenberg,,47.65859985,11.54440022,1133 +DA/BE-017,Brandenberg,,47.67779922,11.46030045,1031 +DA/BE-018,Brandkoepfl,,47.65779877,11.45559978,1442 +DA/BE-019,Bruenstkopf,,47.59140015,11.51970005,1046 +DA/BE-020,Eibelskopf,,47.66310120,11.45890045,1418 +DA/BE-021,Eselauberg,,47.65250015,11.54419994,1041 +DA/BE-022,Fahrenberg,,47.53499985,11.29249954,1074 +DA/BE-023,Fahrtkopf,,47.71920013,11.46580029,1203 +DA/BE-024,Falkenwand,,47.58420181,11.50389957,1228 +DA/BE-025,Feuereck,,47.64970016,11.40499973,1462 +DA/BE-026,Galgenwurfkoepfl,,47.55749893,11.38580036,1143 +DA/BE-027,Gemskopf,,47.65829849,11.43169975,1372 +DA/BE-028,Goerglkoepfl,,47.69419861,11.48359966,1068 +DA/BE-029,Graseck,,47.63809967,11.37829971,1281 +DA/BE-030,Hochbergschneid,,47.62189865,11.56919956,1221 +DA/BE-031,Hochenkopf,,47.61439896,11.47970009,1100 +DA/BE-032,Altlacher Hochkopf,,47.55530167,11.35809994,1328 +DA/BE-033,Kaltwasserwand,,47.63690186,11.39529991,1262 +DA/BE-034,Katzenkopf,,47.65499878,11.51860046,1350 +DA/BE-035,Kesselkopf,,47.68190002,11.50189972,1248 +DA/BE-036,Klausenkopf (1),,47.55530167,11.32940006,1232 +DA/BE-037,Klausenkopf (2),,47.68640137,11.50389957,1151 +DA/BE-038,Kogelberg,,47.67580032,11.53470039,1234 +DA/BE-039,Kohlberg,,47.63970184,11.54609966,1042 +DA/BE-040,Stallauer Kopf,,47.72529984,11.48330021,1322 +DA/BE-041,Tiefentaler Koepfe,,47.66389847,11.47249985,1401 +DA/BE-042,Labelsberg,,47.62829971,11.45390034,1406 +DA/BE-043,Laengenberg,,47.67610168,11.49250031,1244 +DA/BE-044,Laengentalkopf,,47.66889954,11.51329994,1326 +DA/BE-045,Lusenkoepfel,,47.65859985,11.41440010,1299 +DA/BE-046,Mitterberg (2),,47.61690140,11.38420010,1240 +DA/BE-047,Mitterkopf,,47.61140060,11.55609989,1275 +DA/BE-048,Moosenbergkopf,,47.67969894,11.48890018,1244 +DA/BE-049,Paradieskoepfl,,47.60720062,11.55669975,1204 +DA/BE-050,Rautbergkopf,,47.58390045,11.42640018,1415 +DA/BE-051,Reineck,,47.59059906,11.48999977,1192 +DA/BE-052,Sagrinnenkoepfel,,47.59000015,11.41810036,1120 +DA/BE-053,Sattelkopf,,47.68500137,11.48079967,1202 +DA/BE-054,Schuerpfeneckberg,,47.56859970,11.43920040,1296 +DA/BE-055,Schuerpfenkopf,,47.57419968,11.44169998,1221 +DA/BE-056,Schwarzberg,,47.57469940,11.50170040,1172 +DA/BE-057,Schwarzeck,,47.65309906,11.41419983,1527 +DA/BE-058,Schwarzenbergkopf,,47.66669846,11.43080044,1232 +DA/BE-059,Sonnenspitz,,47.64080048,11.37749958,1269 +DA/BE-060,Vogelkopf,,47.68859863,11.48279953,1210 +DA/BE-061,Waxenstein (1),,47.66669846,11.54360008,1310 +DA/BE-062,Waxenstein (2),,47.68560028,11.49059963,1162 +DA/BE-063,Wespenkopf,,47.63420105,11.43109989,1127 +DA/BE-064,Windpasselkopf,,47.69810104,11.44830036,1146 +DA/BE-065,Hoher Zwiesler,,47.60169983,11.54080009,1374 +DA/BG-001,Mittelstaufen,,47.75640106,12.83530045,1615 +DA/BG-002,Kl. Weitschartenkopf,,47.63669968,12.79059982,1930 +DA/BG-003,Schottmalhorn,,47.61420059,12.83030033,2045 +DA/BG-004,Edelweisslahner,,47.61999893,12.83780003,1953 +DA/BG-005,Gr. Muehlsturzhorn,,47.59170151,12.79829979,2234 +DA/BG-006,Predigtstuhl,,47.69639969,12.87889957,1607 +DA/BG-007,Hochschlegel,,47.69110107,12.88389969,1688 +DA/BG-008,Dreisessel,,47.69110107,12.89750004,1680 +DA/BG-009,Toerlkopf,,47.67689896,12.89830017,1704 +DA/BG-010,Hirschangerkopf,,47.67689896,12.95559978,1768 +DA/BG-011,Achenkopf,,47.70140076,12.95359993,1577 +DA/BG-012,Ochsenkopf,,47.70940018,12.96249962,1780 +DA/BG-013,Mitterberg,,47.70780182,12.97500038,1840 +DA/BG-014,Gr. Rauhenkopf,,47.67890167,12.97360039,1658 +DA/BG-015,Karlkogel,,47.54579926,12.82250023,2195 +DA/BG-016,Kammerlingerhorn,,47.54499817,12.83250046,2484 +DA/BG-017,Hinterbergkopf,,47.55139923,12.85280037,2247 +DA/BG-018,Kl. Kalter,,47.57249832,12.86250019,2513 +DA/BG-019,Blaueisspitze,,47.57170105,12.86940002,2481 +DA/BG-020,Steinberg,,47.58580017,12.87749958,2065 +DA/BG-021,Wasserwandkopf,,47.57889938,12.86219978,2367 +DA/BG-022,Goetschenkopf,,47.63169861,12.93420029,1307 +DA/BG-023,Hocheck,,47.55830002,12.92389965,2651 +DA/BG-024,Gr. Palfelhorn,,47.52780151,12.86250019,2222 +DA/BG-025,Hundstodkendelkopf,,47.51779938,12.88440037,2396 +DA/BG-026,Glunkerer,,47.49750137,12.94670010,1928 +DA/BG-027,Feldkogel,,47.49530029,12.95779991,1880 +DA/BG-028,Stuhljoch,,47.49000168,12.96689987,2446 +DA/BG-029,Hochscheibe,,47.48809814,12.97439957,2462 +DA/BG-030,Ebenhorn,,47.49330139,12.97469997,2371 +DA/BG-031,Kuhscheibe,,47.50189972,12.97329998,2010 +DA/BG-032,Jaegerbrunntrog,,47.49420166,13.04780006,2248 +DA/BG-033,Hint. Kragenkopf,,47.51580048,13.04810047,2143 +DA/BG-034,Vord. Kragenkopf,,47.52140045,13.04689980,2174 +DA/BG-035,Hohes Brett,,47.58530045,13.05000019,2341 +DA/BG-036,Gr. Archenkopf,,47.58720016,13.07079983,2391 +DA/BG-037,Kehlstein,,47.61249924,13.04170036,1837 +DA/BG-038,Hennenkoepfl,,47.62670898,13.09270000,1551 +DA/BM-001,Bogenberg,,48.90190125,12.69639969,432 +DA/BM-002,Predigtstuhl,,49.00220108,12.84920025,1024 +DA/BM-003,Knogl,,48.99639893,12.85779953,1051 +DA/BM-004,Schopf,,48.95470047,12.84309959,925 +DA/BM-005,Klausenstein,,48.95029831,12.89669991,1048 +DA/BM-006,Rauher Kulm,,48.94419861,12.90190029,1002 +DA/BM-007,Burgstein,,48.93360138,12.90559959,833 +DA/BM-008,Buechelstein,,48.80810165,13.17529964,827 +DA/BM-009,Hirschpertberg,,49.13439941,12.81420040,647 +DA/BM-010,Maiberg,,49.09669876,12.62779999,589 +DA/BM-011,Geisskopf,,48.92359924,13.03750038,1097 +DA/BM-012,Breitenauriegel,,48.90639877,13.02970028,1116 +DA/BM-013,Ulrichsberg,,48.87080002,12.98190022,636 +DA/BM-014,Diebstein,,48.76079941,13.33580017,590 +DA/BM-015,Koenig-Max-Hoehe,,48.58530045,13.55609989,521 +DA/BM-016,Burgstall,,49.24919891,12.89080048,976 +DA/BM-017,Ahornriegel,,49.23469925,12.94359970,1050 +DA/BM-018,Lange Hoehe,,49.23220062,12.95610046,878 +DA/BM-019,Kagerstein,,49.23529816,12.96889973,793 +DA/BM-020,Kleiner Osser,,49.20140076,13.10280037,1266 +DA/BM-021,Oberer Kuehberg,,49.20029831,13.02670002,654 +DA/BM-022,Weisser Felsen,,49.16939926,12.78779984,562 +DA/BM-023,Plattenstein,,49.17670059,12.91110039,788 +DA/BM-024,Kreuzfelsen,,49.17639923,12.92249966,999 +DA/BM-025,Mittagstein,,49.17359924,12.94139957,1034 +DA/BM-026,Steinbuehler Gesenke,,49.17250061,12.95470047,1044 +DA/BM-027,Kleiner Riedelstein,,49.16080093,12.97500038,1042 +DA/BM-028,Stierwald,,49.15999985,12.98359966,915 +DA/BM-029,Kuehberg,,49.13919830,13.02530003,830 +DA/BM-030,Muehlriegel,,49.15670013,13.01529980,1080 +DA/BM-031,Fahrenberg,,49.22969818,13.03859997,893 +DA/BM-032,Enzian,,49.12360001,13.08310032,1287 +DA/BM-033,Bischofshaube,,49.05690002,13.12419987,940 +DA/BM-034,Brandtner Riegel,,49.05580139,13.13500023,930 +DA/BM-035,Hochzellberg,,49.07780075,13.13389969,1208 +DA/BM-036,Hahnenriegel,,49.06499863,13.16219997,1108 +DA/BM-037,Rote Hoehe,,49.05939865,13.17829990,1049 +DA/BM-038,Wagnerspitze,,49.13779831,13.14669991,1124 +DA/BM-039,Hennenkobel,,49.04499817,13.18169975,974 +DA/BM-040,Gesengetstein,,48.93249893,13.25780010,951 +DA/BM-041,Ruckwiesberg,,49.09469986,13.28250027,1269 +DA/BM-042,Schwarzbachriegel,,49.07830048,13.28719997,1145 +DA/BM-043,Hessenstein,,48.91469955,13.30420017,877 +DA/BM-044,Hoher Sachsen,,48.86169815,13.37170029,752 +DA/BM-045,Kaltenberg,,48.79940033,13.47939968,633 +DA/BM-046,Saussberg,,48.70439911,13.60610008,793 +DA/BM-047,Steinberg,,48.68220139,13.58749962,830 +DA/BM-048,Hochstein,,48.78440094,13.80280018,1333 +DA/BM-049,Habergrasberg,,48.78499985,13.78859997,1235 +DA/BM-050,Bayerischer Ploeckenstein,,48.77190018,13.82719994,1365 +DA/BM-051,Dachsriegel,,49.31809998,12.78890038,826 +DA/BM-052,Gibacht,,49.33330154,12.78059959,930 +DA/BM-053,Hoher Stein,,49.34469986,12.72780037,824 +DA/BM-054,Klammerfels,,49.34469986,12.73579979,848 +DA/BM-055,Zwirenzel,,49.34109879,12.68470001,701 +DA/BM-056,Galgenberg,,49.39830017,12.72719955,742 +DA/BM-057,Bleschenberg,,49.33219910,12.65559959,596 +DA/BM-058,Guettenberg,,49.38140106,12.54329967,546 +DA/BM-059,Kirchenbuehl,,49.29499817,12.66110039,651 +DA/BM-060,Riedbuehl,,49.28469849,12.54139996,591 +DA/BM-061,Kuernberg,,49.27360153,12.54529953,571 +DA/BM-062,Sattelberg,,49.26470184,12.54860020,586 +DA/BM-063,Traubenberg,,49.21170044,12.55830002,519 +DA/BM-064,Alter Thanstein,,49.38169861,12.44419956,635 +DA/BM-065,Platte,,49.38999939,12.42780018,616 +DA/BM-066,Pfieferlberg,,49.33720016,12.36610031,491 +DA/BM-067,Eulenberg,,49.54190063,12.59080029,818 +DA/BM-068,Wildenstein,,49.52080154,12.40810013,736 +DA/BM-069,Reichenstein,,49.51440048,12.62080002,874 +DA/BM-070,Fischerberg,,49.67359924,12.22389984,636 +DA/BM-071,Schellenberg,,49.73220062,12.39890003,809 +DA/BM-072,Pfaffenbuehl,,49.91139984,12.53750038,692 +DA/BM-073,Poppenreuther Berg,,49.90530014,12.49689960,781 +DA/BM-074,Kapellberg,,49.62440109,10.24890041,456 +DA/BM-075,Bullenheimer Berg,,49.61940002,10.25249958,455 +DA/BM-076,Hoher Landsberg,,49.59469986,10.29780006,498 +DA/BM-077,Schneckenberg,,49.62250137,10.28170013,438 +DA/BM-078,Schoenberg,,49.77610016,10.41329956,463 +DA/BM-079,Katzenberg,,49.81969833,10.44579983,475 +DA/BM-080,Iffigheimer Berg,,49.62139893,10.31719971,482 +DA/BM-081,Schlossberg,,49.69829941,10.32250023,487 +DA/BM-082,Kalbberg,,49.70309830,10.29360008,412 +DA/BM-083,Zabelstein,,49.94810104,10.44579983,475 +DA/BM-084,Knetzberg,,49.95940018,10.51690006,487 +DA/BM-085,Hirschberg,,49.84420013,10.63080025,403 +DA/BM-086,Schmerber Berg,,49.85390091,10.50940037,425 +DA/BM-087,Stollberg,,49.87469864,10.42829990,443 +DA/BM-088,Schellenberg,,49.81029892,10.81719971,325 +DA/BM-089,Hoehberg,,50.26720047,10.42389965,450 +DA/BM-090,Ochsenhuegel,,50.25640106,10.43690014,473 +DA/BM-091,Rosenberg,,50.24969864,10.44309998,476 +DA/BM-092,Grosser Breitenberg,,50.23809814,10.43939972,497 +DA/BM-093,Laubhuegel,,50.22219849,10.41889954,504 +DA/BM-094,Stiefenberg,,49.98749924,10.80580044,388 +DA/BM-095,Eichelberg,,50.07059860,10.78079987,388 +DA/BM-096,Tonberg,,50.05220032,10.73309994,458 +DA/BM-097,Stachel,,50.06499863,10.70419979,484 +DA/BM-098,Huehnerberg,,50.07830048,10.71940041,440 +DA/BM-099,Eichelberg,,50.12720108,10.64780045,427 +DA/BM-100,Schrottenberg,,50.16579819,10.66940022,385 +DA/BM-101,Roter Buehl,,50.06809998,10.68719959,445 +DA/BM-102,Haubeberg,,50.10889816,10.73610020,431 +DA/BM-103,Kleiner Hassberg,,50.23500061,10.50829983,426 +DA/BM-104,Schloessleinsbuck,,49.06809998,10.55780029,562 +DA/BM-105,Wachtlerberg,,49.03829956,10.67640018,587 +DA/BM-106,Muehlberg,,49.20190048,10.26720047,527 +DA/BM-107,Hundsberg,,49.22969818,10.40859985,509 +DA/BM-108,Buechelberg,,49.27750015,10.39309978,492 +DA/BM-109,Schwander Berg,,49.28810120,10.32530022,504 +DA/BM-110,Moenchsberg,,49.19499969,10.76389980,529 +DA/BM-111,Reinhardsberg,,49.31999969,10.18470001,438 +DA/BM-112,Schaefersberg,,49.36080170,10.26389980,496 +DA/BM-113,Eichelberg,,49.13859940,10.62110043,522 +DA/BM-114,Teufelshaeusel,,49.44110107,10.30309963,486 +DA/BM-115,Petersberg,,49.43669891,10.38059998,504 +DA/BM-116,Eberleinsberg,,49.17110062,10.49279976,485 +DA/BM-117,Deutscher Buehl,,49.39080048,10.42469978,526 +DA/BM-118,Kohlberg,,50.04190063,12.18669987,632 +DA/BM-119,Nusshart,,50.04079819,11.86439991,972 +DA/BM-120,Wartberg,,50.06110001,12.11859989,626 +DA/BM-121,Burgstein,,49.99829865,11.99359989,879 +DA/BM-122,Haberstein,,50.00109863,11.98470020,820 +DA/BM-123,Platte,,50.01860046,11.89140034,884 +DA/BM-124,Seehuegel,,50.03250122,11.87670040,953 +DA/BM-125,Hohe Heide,,50.07030106,11.80500031,848 +DA/BM-126,Rudolfstein,,50.07189941,11.87670040,866 +DA/BM-127,Drei Brueder,,50.06919861,11.87250042,834 +DA/BM-128,Buchberg,,50.11470032,11.93579960,674 +DA/BM-129,Epprechtstein,,50.14530182,11.91749954,776 +DA/BM-130,Hohe Warte,,50.04750061,11.66639996,547 +DA/BM-131,Saubadfelsen,,49.89220047,12.03689957,858 +DA/BM-132,Reiseneggerfelsen,,49.90000153,12.02719975,845 +DA/BM-133,Schramberg,,49.89080048,12.01000023,708 +DA/BM-134,Knockfelsen,,49.91189957,12.03610039,834 +DA/BM-135,Katzentroegel,,49.91220093,12.04749966,880 +DA/BM-136,Hackelstein,,49.91939926,12.11970043,723 +DA/BM-137,Ploessberg,,49.92309952,12.10029984,820 +DA/BM-138,Mascherberg,,49.95780182,12.05939960,631 +DA/BM-139,Guegl,,49.95169830,11.06169987,510 +DA/BM-140,Giechburg,,49.95500183,11.05080032,530 +DA/BM-141,Platte,,49.81499863,11.44579983,614 +DA/BM-142,Warenberg,,49.78359985,11.50059986,608 +DA/BM-143,Hohensteiner Berg,,49.58670044,11.42220020,624 +DA/BM-144,Hohe Leite,,49.80440140,11.40310001,561 +DA/BM-145,Neubuerg,,49.89080048,11.40250015,587 +DA/BM-146,Plankenstein,,49.89329910,11.34500027,482 +DA/BM-147,Heidelberg,,49.72829819,11.25669956,548 +DA/BM-148,Kohlberg,,49.72579956,11.28250027,582 +DA/BM-149,Zuckerhut,,49.78779984,11.21360016,515 +DA/BM-150,Wallerwarte,,49.77750015,11.20030022,498 +DA/BM-151,Kreuzberg,,49.77360153,11.19939995,498 +DA/BM-152,Pfaffenstein,,49.77920151,11.31560040,524 +DA/BM-153,Neideck,,49.80889893,11.23190022,399 +DA/BM-154,Hummerstein,,49.80440140,11.20390034,472 +DA/BM-155,Druidenstein,,49.79439926,11.18859959,498 +DA/BM-156,Walberla,,49.71969986,11.15139961,514 +DA/BM-157,Schwedenfelsen,,49.86970139,11.14309978,524 +DA/BM-158,Seigelstein,,49.88309860,11.10389996,548 +DA/BM-159,Heroldsstein,,49.90029907,11.14360046,516 +DA/BM-160,Greifenstein,,49.87419891,11.17249966,499 +DA/BM-161,Retterner Kanzel,,49.75419998,11.10939980,507 +DA/BM-162,Friesener Warte,,49.84579849,11.04640007,562 +DA/BM-163,Langer Berg,,49.67639923,11.37829971,612 +DA/BM-164,Schlossberg,,49.70830154,11.37059975,590 +DA/BM-165,Rothenberg,,49.55390167,11.35830021,559 +DA/BM-166,Glatzenstein,,49.54420090,11.37390041,572 +DA/BM-167,Schossberg,,49.55329895,11.55720043,534 +DA/BM-168,Koppe,,49.53969955,11.48139954,572 +DA/BM-169,Arzberg,,49.47969818,11.44029999,612 +DA/BM-170,Dietrichstein,,49.34170151,11.59469986,627 +DA/BM-171,Bromberg,,49.30970001,11.71640015,589 +DA/BM-172,Schlossberg,,49.29079819,11.79389954,513 +DA/BM-173,Hauberg,,49.28060150,11.80860043,518 +DA/BM-174,Moeningerberg,,49.23109818,11.31970024,527 +DA/BM-175,Mayersberg,,49.21810150,11.75609970,629 +DA/BM-176,Roeschberg,,49.14810181,11.36359978,564 +DA/BM-177,Kalvariberg,,49.36080170,11.67420006,586 +DA/BM-178,Laemmerberg,,49.10499954,11.29360008,525 +DA/BM-179,Katzenberg,,49.09420013,11.31779957,562 +DA/BM-180,Schlossberg,,49.09939957,11.78470039,555 +DA/BM-181,Kreuzberg,,49.04109955,11.58689976,481 +DA/BM-182,Vogtholz,,49.02030182,11.57279968,504 +DA/BM-183,Kohlplatte,,48.97940063,11.36579990,498 +DA/BM-184,Schellenburg,,48.99359894,11.36810017,494 +DA/BM-185,Steinplatte,,48.91609955,11.64330006,511 +DA/BM-186,Frauenberg,,48.88389969,11.18000031,505 +DA/BM-187,Ziegelhofer Berg,,48.89889908,11.20359993,532 +DA/BM-188,Stirnberg,,50.49110031,10.03919983,899 +DA/BM-189,Muenzkopf,,50.44250107,9.99720001,849 +DA/BM-190,Rother Kuppe,,50.48109818,10.10280037,711 +DA/BM-191,Gangolfsberg,,50.46580124,10.08580017,736 +DA/BM-192,Kaeulingsberg,,50.37530136,10.01000023,754 +DA/BM-193,Lindenberg,,50.02000046,9.30189991,402 +DA/BM-194,Steigkoppe,,50.04249954,9.30529976,502 +DA/BM-195,Zwercheck,,49.17330170,13.16559982,1333 +DA/BM-196,Blauberg,,49.36890030,12.66110039,637 +DA/BM-197,Grosser Hansgoergl,,49.52640152,11.39360046,601 +DA/BM-198,Zankelstein,,49.50389862,11.52330017,547 +DA/BM-199,Auf der Schanz,,49.25355148,13.04948425,758 +DA/BM-200,Dreitannenriegel,,48.89739990,13.02229977,1090 +DA/BM-201,Schwedenschanze,,50.17404175,10.51822376,471 +DA/BM-202,Hinterberg,,48.88911660,12.94624080,666 +DA/BM-203,Kuehberg,,48.89340600,12.94659990,650 +DA/BM-204,Rabenstein,,48.88502330,12.94457510,614 +DA/BM-205,Hausstein,,48.87138889,13.07055560,917 +DA/BM-206,Parkstein Basaltkegel,,49.73149570,12.06995260,595 +DA/BM-207,Saustein,,49.00719870,12.82845240,955 +DA/BM-208,Schuetzinger Berg,,48.82709630,13.02674150,609 +DA/BM-209,Kaesplatte,,49.03796370,12.80732860,978 +DA/BM-210,Waldhaeuserriegel,,48.92468000,13.48459860,1151 +DA/BM-211,Hetzleser Berg,,49.65557370,11.15331250,549 +DA/BM-212,Hohenstein Greising,,48.87270200,13.02297500,820 +DA/BM-213,Kanzel bei Parst,,48.84799900,13.02573000,728 +DA/BM-214,Horiberg,,48.63100000,13.13000000,440 +DA/BM-215,Hochoberndorfer Berg,,48.87810000,12.99375000,807 +DA/BM-216,Buechelberg,,50.26746400,10.58175400,430 +DA/BM-217,Altenburg(Bamberg),,49.88080080,10.86800000,386 +DA/BM-218,Heiligdreifaltigkeitsberg,,49.65300000,12.23400000,631 +DA/BM-219,Steinberg Sonnenwald,,48.82100000,13.19000000,894 +DA/BM-220,Mittagsplatzl,,49.09400000,13.14300000,1340 +DA/BM-221,Kapellenberg,,49.00350000,12.81600000,880 +DA/BM-222,Kadernberg,,48.84500000,13.32700000,693 +DA/BM-223,Schanzberg Liedholz,,48.85932200,13.19842200,787 +DA/BM-224,Eselsberg,,48.92300000,12.78800000,451 +DA/BM-225,Habsberg,,49.31400000,11.63200000,619 +DA/BM-226,Gessinger Stein,,48.86885000,13.06197000,874 +DA/BM-227,Vorholzberg,,48.56150000,13.72276000,745 +DA/BM-228,Breitenberg,,48.83752000,12.99484000,546 +DA/BM-229,Plasslberg,,48.86695000,13.50256000,832 +DA/BM-230,Kirchberg im Wald,,48.90370000,13.18164000,736 +DA/BM-231,Steinberg Kreuzfelsen,,48.91164000,13.00053000,999 +DA/BM-232,Schergenhoehe,,48.88200000,13.03425000,924 +DA/BM-233,Geissriegel,,48.90323000,13.00828000,1043 +DA/BM-234,Scheuerberg,,48.88480000,12.99593000,756 +DA/BM-235,Schlossberg Ruine Velburg,,49.23440000,11.67787000,622 +DA/BM-236,Birkenberg,,49.00624000,12.78650000,848 +DA/BM-237,Pfarrerberg,,49.02220000,12.77500000,911 +DA/BM-238,Hofberg,,49.07212000,12.39887000,653 +DA/BM-239,Gessinger Berg,,48.84060000,13.04768000,563 +DA/BM-240,Schlossberg Taennesberg,,49.53456000,12.33027000,692 +DA/BM-241,Kulm (Naabgebirge),,49.48164000,12.11115000,626 +DA/BW-001,Stuebenwasen,,47.86780167,7.97189999,1386 +DA/BW-002,Grafenmatt,,47.84809875,8.01920033,1377 +DA/BW-003,Toter Mann,,47.89189911,7.98999977,1321 +DA/BW-004,Hochkopf,,47.85860062,8.05720043,1308 +DA/BW-005,Bankgallihoehe,,47.91279984,8.03139973,1210 +DA/BW-006,Hinterwaldkopf,,47.91889954,8.01720047,1198 +DA/BW-007,Brend,,48.07920074,8.15719986,1149 +DA/BW-008,Steinbuehl,,47.73669815,7.96999979,1148 +DA/BW-009,Weiher,,47.80310059,7.77780008,1143 +DA/BW-010,Hornkopf,,48.07310104,8.07170010,1121 +DA/BW-011,Schwarzer Grat,,47.69250107,10.12559986,1118 +DA/BW-012,Bildstein,,47.84109879,8.13689995,1107 +DA/BW-013,Pflumberg,,47.85309982,8.19219971,1101 +DA/BW-014,Riesenbuehl,,47.82920074,8.17940044,1097 +DA/BW-015,Hundsruecken,,48.61750031,8.21940041,1080 +DA/BW-016,Schliffkopf,,48.53580093,8.21609974,1055 +DA/BW-017,Geissberg,,48.15639877,8.14470005,1047 +DA/BW-018,Feuerberg,,47.92720032,8.17220020,1039 +DA/BW-019,Glassberg,,47.99140167,8.13829994,1037 +DA/BW-020,Wegmannshoehe,,47.70859909,10.10359955,1032 +DA/BW-021,Oedlandkopf,,47.66249847,7.97079992,1026 +DA/BW-022,Tenneberg,,47.91859818,8.22719955,1024 +DA/BW-023,Muehleberg,,48.10810089,8.22189999,1023 +DA/BW-024,Pfaelzerkopf,,48.56309891,8.25170040,1012 +DA/BW-025,Sprigelsbacher Hoehe,,47.91609955,8.14360046,1009 +DA/BW-026,Wandbuehl,,48.16279984,8.80529976,1007 +DA/BW-027,Montschenloch,,48.16949844,8.79419994,1004 +DA/BW-028,Bol,,48.17110062,8.80529976,1002 +DA/BW-029,Hoher Fels,,48.21860123,8.83580017,996 +DA/BW-030,Kochelsberg,,48.10139847,8.78559971,993 +DA/BW-031,Leinkopf,,48.57580185,8.27859974,992 +DA/BW-032,Schafberg,,48.21170044,8.83390045,991 +DA/BW-033,Ortenberg,,48.17919922,8.80060005,985 +DA/BW-034,Oberer Berg,,48.20169830,8.94690037,982 +DA/BW-035,Hirnbuehl,,48.08359909,8.78170013,973 +DA/BW-036,Hoher Draberg,,48.69390106,8.39560032,970 +DA/BW-037,Lochenstein,,48.22029877,8.84939957,963 +DA/BW-038,Rossbuehl,,48.49390030,8.23970032,963 +DA/BW-039,Raichberg,,48.30580139,8.99250031,956 +DA/BW-040,Hoernle,,48.22190094,8.87889957,951 +DA/BW-041,Heimberg,,48.20199966,8.92080021,943 +DA/BW-042,Kolbenkopf,,48.16080093,8.21280003,934 +DA/BW-043,Hundsruecken,,48.28030014,8.92940044,931 +DA/BW-044,Schramberg,,48.65219879,8.39579964,922 +DA/BW-045,Irrenberg,,48.28110123,8.94390011,921 +DA/BW-046,Schnaitkopf,,48.10139847,8.96529961,920 +DA/BW-047,Kornbuehl,,48.35469818,9.09829998,886 +DA/BW-048,Mosswaldkopf,,48.24029922,8.30109978,879 +DA/BW-049,Ellbachkopf,,48.50080109,8.30640030,872 +DA/BW-050,Baerleichkopf,,48.42250061,8.31639957,872 +DA/BW-051,Schondelhoehe,,48.23749924,8.24359989,859 +DA/BW-052,Rossberg,,48.40169907,8.33469963,848 +DA/BW-053,Schoellkopf,,48.43500137,8.38920021,843 +DA/BW-054,Hohe Warte,,48.49250031,9.33139992,820 +DA/BW-055,Volkmarsberg,,48.79219818,10.08670044,743 +DA/BW-056,Nollenberg,,48.33219910,8.37689972,731 +DA/BW-057,Eggberg,,47.57780075,7.95419979,709 +DA/BW-058,Steinberg,,48.71310043,8.27750015,656 +DA/BW-059,Hohenkraehen,,47.79890060,8.82059956,643 +DA/BW-060,Nellenburger Berg,,47.85530090,8.99030018,624 +DA/BW-061,Kleiner Staufenberg,,48.75609970,8.28610039,623 +DA/BW-062,Hornberg,,49.01530075,10.18830013,570 +DA/BW-063,Wolfristkopf,,47.64810181,7.91279984,548 +DA/BW-064,Juxkopf,,49.03390121,9.43169975,533 +DA/BW-065,Kressberg,,49.14360046,10.24139977,528 +DA/BW-066,Steinknickle,,49.10829926,9.47920036,525 +DA/BW-067,Ruehrberg,,47.57030106,7.71190023,518 +DA/BW-068,Friedrichsberg,,49.18500137,9.66310024,514 +DA/BW-069,Theresienberg,,49.19079971,9.62530041,498 +DA/BW-070,Schafberg,,47.66199875,7.55310011,387 +DA/BW-071,Hintersberg,,49.11690140,9.27420044,364 +DA/BW-072,Luginsland,,47.80189896,7.61000013,343 +DA/BW-073,Steinsberg,,49.21440125,8.87779999,333 +DA/BW-074,Tuniberg,,47.97280121,7.68030024,314 +DA/BW-075,Limberg,,48.15029907,7.60580015,272 +DA/BW-076,Hornsberg,,48.90610123,10.22029972,587 +DA/BW-077,Burgberg,,49.12080002,9.97420025,534 +DA/BW-078,Hohenberg,,49.14609909,10.15530014,528 +DA/BW-079,Schliffkopf,,48.53530121,8.21469975,1053 +DA/BW-080,Buechelberg,,48.78440094,8.80939960,544 +DA/BW-081,Buechenbronner Hoehe,,48.84310150,8.64109993,608 +DA/BW-082,Erzkopf,,48.86780167,8.70580006,442 +DA/BW-083,Horn,,49.04499817,8.80809975,321 +DA/BW-084,Langenbrander Hoehe,,48.80419922,8.61810017,723 +DA/BW-085,Sandberg,,48.85860062,10.33500004,650 +DA/BW-086,Sandberg,,49.04449844,8.85079956,391 +DA/BW-087,Schwanner Warte,,48.83919907,8.54920006,472 +DA/BW-088,Sommerberg,,48.75059891,8.53750038,731 +DA/BW-089,Steinbuckel,,48.89139938,8.81219959,431 +DA/BW-090,Wallberg,,48.89580154,8.66530037,400 +DA/BW-091,Graebelesberg,,48.21060181,8.91829967,915 +DA/BW-092,Haertle,,48.19189835,8.86999989,947 +DA/BW-093,Hummelbuehl,,48.13970184,8.87969971,933 +DA/BW-094,Buchenberg,,48.12670135,8.83360004,943 +DA/BW-095,Steinenberg,,48.10969925,8.77530003,993 +DA/BW-096,Galgenberg,,48.09609985,8.79279995,991 +DA/BW-097,Alter Berg,,48.09220123,8.80529976,980 +DA/BW-098,Gehrn,,48.04750061,8.73419952,948 +DA/BW-099,Bruderwald,,48.01419830,8.62440014,888 +DA/BW-100,Hornenberg,,47.93579865,8.67860031,904 +DA/BW-101,Homberg,,47.88000107,8.52470016,860 +DA/BW-102,Wallenberg,,47.86780167,8.55029964,829 +DA/BW-103,Winterberg,,47.99330139,8.27079964,1097 +DA/BW-104,Kapf,,47.97060013,8.28610039,1025 +DA/BW-105,Fohrenbuehl,,47.97140121,8.30220032,1033 +DA/BW-106,Rufeneck,,48.01419830,8.26389980,1080 +DA/BW-107,Staufelberg,,48.06389999,8.70170021,807 +DA/BW-108,Winterhalde,,47.89469910,8.12170029,1027 +DA/BW-109,Bistenkopf,,47.90610123,8.06779957,1115 +DA/BW-110,Windeck,,47.89780045,8.07689953,1209 +DA/BW-111,Die Rau,,47.94419861,8.18190002,1077 +DA/BW-112,Mittelberg,,48.18249893,8.35079956,843 +DA/BW-113,Staufenberg,,48.11669922,8.89330006,955 +DA/BW-114,Willberg,,47.82559967,8.70359993,689 +DA/BW-115,Wannenberg,,47.82669830,8.66829967,760 +DA/BW-116,Sonnenberg,,48.06000137,8.21310043,1045 +DA/BW-117,Grosser Hausberg,,48.04079819,8.20189953,1031 +DA/BW-118,Amtenhauser Berg,,47.95059967,8.70330048,883 +DA/BW-119,Rossberg,,48.14670181,8.87500000,968 +DA/BW-120,Himmelberg,,47.99610138,8.65439987,941 +DA/BW-121,Wintersberg,,47.95500183,8.18360043,1064 +DA/BW-122,Buehlen,,48.21440125,8.86310005,952 +DA/BW-123,Oberer Berg,,48.20199966,8.94719982,982 +DA/BW-124,Schildhalde,,48.19309998,8.95470047,974 +DA/BW-125,Witterl,,48.13610077,8.85890007,962 +DA/BW-126,Koenigswang,,48.10889816,8.84309959,950 +DA/BW-127,Kohlberg,,47.98749924,8.67689991,923 +DA/BW-128,Ochsenberg,,48.04079819,8.32830048,974 +DA/BW-129,Dietschenberg,,47.94670105,8.14640045,1098 +DA/BW-130,Fuchsloch,,48.18170166,8.91079998,930 +DA/BW-131,Kohlberg,,47.97079849,8.67689991,923 +DA/BW-132,Wanne,,49.41830063,9.69690037,401 +DA/BW-133,Emerberg,,48.22779846,9.49919987,704 +DA/BW-134,Hochberg,,47.99219894,9.53310013,676 +DA/BW-135,Frauenberg,,49.54249954,9.71609974,323 +DA/BW-136,Dickbuckel,,49.71060181,9.57250023,351 +DA/BW-137,Heiligenberg,,49.58779907,9.61810017,347 +DA/BW-138,Schlossberg,,48.16419983,9.33829975,709 +DA/BW-139,Rotenberg,,49.02170181,9.04109955,420 +DA/BW-140,Habsberg,,48.17530060,9.34329987,732 +DA/BW-141,Reifersberg,,48.19189835,9.40719986,773 +DA/BW-142,Apfelberg,,49.67919922,9.61190033,380 +DA/BW-143,Schlierkopf,,49.03250122,8.93280029,450 +DA/BW-144,Hohe Reute,,49.01169968,9.02140045,439 +DA/BW-145,Eselsberg,,48.97470093,8.95919991,392 +DA/BW-146,Gosser Heidberg,,49.66669846,9.54559994,405 +DA/BW-147,Altenberg,,49.57199860,9.68439960,337 +DA/BW-148,Heidelberg,,49.10639954,9.07310009,336 +DA/BW-149,Eichbuehl,,49.11719894,9.03829956,335 +DA/BW-150,Mehlberg,,49.52750015,9.72309971,349 +DA/BW-151,Edelberg,,49.51530075,9.72060013,366 +DA/BW-152,Grosser Saukopf,,49.02140045,9.02390003,409 +DA/BW-153,Leiterholzspitze,,49.65079880,9.44470024,435 +DA/BW-154,Kreuzberg,,49.17079926,8.81579971,295 +DA/BW-156,Boernle,,48.12829971,8.81219959,964 +DA/BW-157,Dreifaltigkeitsberg,,48.08219910,8.76280022,985 +DA/BW-158,Ochsenberg,,48.00360107,8.42420006,803 +DA/BW-159,Tuernleberg,,48.04809952,8.56190014,799 +DA/BW-160,Kapf,,47.98310089,8.53190041,769 +DA/BW-161,Hochwald,,47.78139877,8.51640034,693 +DA/BW-162,Kohlwald,,47.88219833,8.48779964,806 +DA/BW-163,Oberhohenberg,,48.16389847,8.76080036,1011 +DA/BW-164,Oberlen,,48.05920029,8.58329964,778 +DA/BW-165,Kapf,,48.00080109,8.79109955,858 +DA/BW-166,Leutenberg,,47.98939896,8.84169960,799 +DA/BW-167,Homburg,,47.93140030,8.93640041,763 +DA/BW-168,Kirchberg,,48.02199936,8.94390011,796 +DA/BW-169,Wirtenbuehl,,48.00220108,8.89719963,818 +DA/BW-170,Wachtbuehl,,48.09579849,8.85420036,928 +DA/BW-171,Barblen,,48.14279938,8.85029984,983 +DA/BW-172,Fohlen,,48.15449905,8.85579967,978 +DA/BW-173,Baienberg,,48.19189835,8.89809990,967 +DA/BW-174,Kuessaburg,,47.60189819,8.35359955,634 +DA/BW-175,Schellenberg,,47.94749832,8.45829964,821 +DA/BW-176,Triberg,,47.93750000,8.42969990,776 +DA/BW-177,Gschwand,,48.00080109,8.33559990,913 +DA/BW-178,Muehleberg,,48.03720093,8.29689980,995 +DA/BW-179,Kesselberg,,48.02859879,8.27499962,1047 +DA/BW-180,Duerreberg,,48.02330017,8.30189991,1015 +DA/BW-181,Hohe Wart,,48.02080154,8.32859993,968 +DA/BW-182,Auf der Burg,,48.05110168,8.31830025,996 +DA/BW-183,Rotwald,,48.12500000,8.39999962,825 +DA/BW-184,Hohen Schramberg,,48.22689819,8.37080002,680 +DA/BW-185,Teufelskopf,,48.24560165,8.36610031,668 +DA/BW-186,Sattellege,,48.24829865,8.37940025,580 +DA/BW-187,Hohenreutenwald,,48.23920059,8.31169987,864 +DA/BW-188,Kahlenberg,,48.25780106,8.32330036,845 +DA/BW-189,Moosenkapf,,48.25640106,8.29640007,872 +DA/BW-190,Hasenkopf,,48.21419907,8.25829983,691 +DA/BW-191,Hauberg,,48.17309952,8.24720001,890 +DA/BW-192,Mosenberg,,48.10359955,8.24219990,1036 +DA/BW-193,Stoecklewald,,48.09140015,8.25389957,1076 +DA/BW-194,Bosberg,,48.05609894,8.23419952,1052 +DA/BW-195,Rappeneck,,48.05920029,8.26580048,1034 +DA/BW-196,Sommerberg,,48.03110123,8.24170017,1076 +DA/BW-197,Steinberg,,48.00030136,8.17249966,1141 +DA/BW-198,Hochberg,,47.97249985,8.20330048,1116 +DA/BW-199,Schneeberg,,47.96920013,8.17059994,1056 +DA/BW-200,Hinterberg,,47.93030167,8.10890007,1046 +DA/BW-201,Hirschkopf,,47.87939835,7.94250011,1254 +DA/BW-202,Spechtsboden,,47.84080124,7.96029997,1139 +DA/BW-203,Silberberg,,47.83779907,7.99639988,1358 +DA/BW-204,Sieppberg,,47.79859924,8.09420013,1220 +DA/BW-205,Habsberg,,47.80139923,8.12440014,1263 +DA/BW-206,Kuhkopf,,47.79059982,8.11170006,1094 +DA/BW-207,Kaiserberg,,47.80661011,8.05632019,1156 +DA/BW-208,Rechberg,,47.77859879,8.06110001,1086 +DA/BW-209,Oren,,47.76940155,8.03610039,1166 +DA/BW-210,Sackkoepfle,,47.77059937,8.05109978,1042 +DA/BW-211,Honeck,,47.77579880,7.84310007,1022 +DA/BW-212,Maistollen,,47.88063049,7.80292988,834 +DA/BW-213,Kohlernkopf,,47.92250061,7.82779980,734 +DA/BW-214,Hohfirst,,47.93889999,7.77920008,494 +DA/BW-215,Schwarzenberg,,48.16360092,7.96029997,685 +DA/BW-216,Hohe Eck,,48.19670105,7.94029999,601 +DA/BW-217,Bockenbuehl,,48.19219971,7.97189999,740 +DA/BW-218,Rotzeleck,,48.20669937,7.98829985,784 +DA/BW-219,Uhlsberg,,48.29719925,7.86359978,349 +DA/BW-220,Lauenberg,,48.31309891,7.92059994,440 +DA/BW-221,Niederbacher Eck,,48.31190109,8.00940037,499 +DA/BW-222,Geisskopf,,48.41749954,7.97499990,359 +DA/BW-223,Geigerskopf,,48.50559998,8.05640030,435 +DA/BW-224,Wolfenkopf,,48.48080063,8.06719971,504 +DA/BW-225,Schweinsberg,,49.11080170,9.24860001,373 +DA/BW-226,Sandberg,,49.11249924,9.30780029,386 +DA/BW-227,Fohlenberg,,49.04719925,9.31890011,381 +DA/BW-228,Rehbuehl,,49.02170181,9.35359955,408 +DA/BW-229,Koechersberg,,49.02310181,9.28940010,323 +DA/BW-230,Forstberg,,49.02949905,9.29969978,376 +DA/BW-231,Fuchsbuehl,,49.01750183,9.39920044,516 +DA/BW-232,Atzenberg,,49.04949951,9.33279991,316 +DA/BW-233,Braeunersberg,,49.04389954,9.35389996,380 +DA/BW-234,Tauzenbuehl,,49.06499863,9.33640003,419 +DA/BW-235,Aschenberg,,49.05440140,9.42189980,526 +DA/BW-236,Steinberg,,49.05970001,9.41779995,535 +DA/BW-237,Grosstierbuehl,,49.13190079,9.61419964,483 +DA/BW-238,Brenntenrain,,49.13779831,9.55249977,433 +DA/BW-239,Wartwald,,49.12720108,9.69060040,503 +DA/BW-240,Streiflesberg,,49.11439896,9.68420029,491 +DA/BW-241,Korber Kopf,,48.85279846,9.36610031,457 +DA/BW-242,Hohenstein,,48.83919907,9.47280025,460 +DA/BW-243,Koenigsbronn,,48.88420105,9.49359989,441 +DA/BW-244,Hoefenberg,,48.93719864,9.93669987,555 +DA/BW-245,Tautschbuch,,48.20029831,9.45969963,734 +DA/BW-246,Reichstein,,48.24940109,9.48919964,725 +DA/BW-247,Alter Hau,,48.24060059,9.50469971,698 +DA/BW-248,Hochberg,,48.25199890,9.56529999,661 +DA/BW-249,Oesterberg,,48.15919876,9.43640041,652 +DA/BW-250,Bozenberg,,48.16220093,9.30780029,754 +DA/BW-251,Scheinenberg,,48.13719940,9.23309994,774 +DA/BW-252,Schwarzer Berg,,47.83110046,9.94970036,713 +DA/BW-253,Hochberg,,48.00809860,9.45559978,634 +DA/BW-254,Schellenberg,,48.01449966,9.56690025,677 +DA/BW-255,Kaeferberg,,47.90390015,9.33670044,726 +DA/BW-256,Forstwald,,47.95470047,9.19999981,666 +DA/BW-257,Riesenberg,,47.69530106,9.17059994,485 +DA/BW-258,Taborberg,,47.69169998,9.16030025,473 +DA/BW-259,Homberg,,47.71920013,9.14080048,515 +DA/BW-260,Schoenenberg,,47.71860123,9.10859966,499 +DA/BW-261,Lettenberg,,47.73080063,9.05360031,466 +DA/BW-262,Homberg,,47.73720169,9.03359985,487 +DA/BW-263,Kirnberg,,47.81890106,8.93889999,632 +DA/BW-264,Kressberg,,47.68719864,8.86610031,624 +DA/BW-265,Brennten,,47.99309921,8.89080048,842 +DA/BW-266,Brand,,47.97890091,8.86670017,844 +DA/BW-267,Baneck,,48.05810165,8.81250000,904 +DA/BW-268,Mittlerer Berg,,48.01750183,8.74079990,913 +DA/BW-269,Stallberg,,48.13890076,8.63329983,839 +DA/BW-270,Reitersbuehl,,48.11830139,8.54940033,739 +DA/BW-271,Bettenberg,,48.26079941,8.67580032,680 +DA/BW-272,Hoernle,,48.23279953,8.72749996,694 +DA/BW-273,Withau,,48.25469971,8.73330021,688 +DA/BW-274,Bauberg,,48.28580093,8.62689972,674 +DA/BW-275,Weinberg,,48.33580017,8.73859978,573 +DA/BW-276,Owinger Berg,,48.35670090,8.85779953,622 +DA/BW-277,Hohwacht,,48.38999939,8.92360020,590 +DA/BW-278,Eichhalde,,48.35250092,8.42420006,688 +DA/BW-279,Reutiner Berg,,48.33829880,8.41279984,713 +DA/BW-280,Hengstberg,,48.79219818,8.59780025,717 +DA/BW-281,Heuberg,,48.80640030,8.54500008,709 +DA/BW-282,Teufelsmuehle,,48.75419998,8.40919971,908 +DA/BW-283,Schweizerkopf,,48.75999832,8.45530033,905 +DA/BW-284,Kornberg,,49.21419907,8.81250000,249 +DA/BW-285,Bettelberg,,49.20330048,8.79580021,259 +DA/BW-286,Schlehberg,,49.23559952,8.73390007,224 +DA/BW-287,Galgenberg,,49.25780106,8.69779968,243 +DA/BW-288,Letzenberg,,49.25109863,8.67860031,243 +DA/BW-289,Wallenberg,,49.27030182,8.74079990,238 +DA/BW-290,Schlosswald,,49.30670166,8.87440014,265 +DA/BW-291,Helmsberg,,49.30640030,8.85190010,232 +DA/BW-292,Hirschberg,,49.33390045,8.71170044,317 +DA/BW-293,Utzenberg,,49.27920151,9.06079960,286 +DA/BW-294,Buchwaldkopf,,49.44359970,8.82499981,460 +DA/BW-295,Gr.Admin.Wald,,49.39360046,8.89939976,368 +DA/BW-296,Weidach,,49.40940094,9.32139969,350 +DA/BW-297,Winterberg,,49.42219925,9.33689976,346 +DA/BW-298,Hohberg,,49.44720078,9.34560013,360 +DA/BW-299,Spitzenwald,,49.45579910,9.29279995,392 +DA/BW-300,Kandelberg,,49.41809845,9.38140011,314 +DA/BW-301,Eckenberg,,49.41249847,9.39360046,317 +DA/BW-302,Hahnberg,,49.43030167,9.46689987,371 +DA/BW-303,Wurmberg,,49.44779968,9.58279991,389 +DA/BW-304,Muehlberg,,49.47190094,9.67940044,351 +DA/BW-305,Eisenberg,,49.47389984,9.71059990,379 +DA/BW-306,Schalksberg,,49.48920059,9.69330025,372 +DA/BW-307,Neuberg,,49.50220108,9.69060040,359 +DA/BW-308,Vogelsberg,,49.53440094,9.75780010,343 +DA/BW-309,Turmberg,,49.54919815,9.75220013,370 +DA/BW-310,Altenberg,,49.50310135,9.80389977,345 +DA/BW-311,Katzenberg,,49.47169876,9.79580021,374 +DA/BW-312,Warte,,49.48080063,9.77719975,306 +DA/BW-313,Sailberg,,49.45199966,9.83360004,372 +DA/BW-314,Roeltersberg,,49.42580032,9.82779980,375 +DA/BW-315,Huettenberg,,49.43310165,9.79030037,369 +DA/BW-316,Schneitberg,,49.04249954,9.77060032,478 +DA/BW-317,Wolfsberg,,49.02610016,9.82310009,509 +DA/BW-318,Lehberg,,48.99810028,9.74860001,472 +DA/BW-319,Ebersberg,,49.00859833,9.73439980,485 +DA/BW-320,Steinbuehl,,49.03919983,9.72169971,484 +DA/BW-321,Dendelberg,,48.99580002,9.69890022,464 +DA/BW-322,Harnersberg,,48.99309921,9.65719986,483 +DA/BW-323,Felsenreute,,48.98389816,9.64560032,461 +DA/BW-324,Noblersberg,,48.95719910,9.56669998,539 +DA/BW-325,Utschberg,,49.00373077,9.52882004,429 +DA/BW-326,Springstein,,48.97219849,9.52639961,533 +DA/BW-327,Rohrberg,,48.84529877,9.58440018,462 +DA/BW-328,Suenchenberg,,48.82939911,9.52560043,392 +DA/BW-329,Sulzbuckel,,48.82939911,9.48309994,451 +DA/BW-330,Joergenbuehl,,48.37030029,9.41499996,761 +DA/BW-331,Wahlenberg,,48.37139893,9.35939980,753 +DA/BW-332,Eichelberg,,48.34439850,9.35309982,768 +DA/BW-333,Rommetsberg,,48.34030151,9.38389969,798 +DA/BW-334,Dachenstein,,48.33890152,9.29780006,829 +DA/BW-335,Schneeberg,,48.31940079,9.28719997,812 +DA/BW-336,Neubann,,48.27890015,9.23939991,811 +DA/BW-337,Mahdenhaeule,,48.02199936,9.05920029,756 +DA/BW-338,Bodenwald,,48.07030106,8.23250008,1055 +DA/BW-339,Schlegelberg,,48.08079910,8.28250027,1009 +DA/BW-340,Lomberg,,48.06000137,8.67560005,816 +DA/BW-341,Gifiz,,48.03219986,8.63109970,816 +DA/BW-342,Tanzbuehl,,48.00559998,8.62639999,884 +DA/BW-343,Hohe Nistler,,49.44580078,8.70779991,496 +DA/BW-344,Heiligenberg,,49.42580032,8.70639992,440 +DA/BW-345,Kolbel,,49.43889999,8.94309998,409 +DA/BW-346,Matzenberg,,49.43030167,9.02439976,467 +DA/BW-347,Hohe Warte,,49.49420166,8.98439980,552 +DA/BW-348,Buehl,,47.70970154,8.32639980,715 +DA/BW-349,Duxenberg,,47.69189835,8.34249973,619 +DA/BW-350,Kalter Wangen,,47.60749817,8.44279957,671 +DA/BW-351,Birnberg,,47.61420059,8.41940022,636 +DA/BW-352,Rueglihau,,47.58750153,8.36890030,626 +DA/BW-353,Schneehenberg,,47.62139893,8.56579971,495 +DA/BW-354,Kernenwieden,,47.59280014,8.33860016,492 +DA/BW-355,Homberg,,47.68579865,8.29170036,707 +DA/BW-356,Glockenberg,,47.63779831,8.26580048,432 +DA/BW-357,Stubenberg,,47.63890076,8.13169956,706 +DA/BW-358,Kuehbuck,,47.67449951,8.20310020,750 +DA/BW-359,Duttenberg,,47.57609940,7.92439985,417 +DA/BW-360,Fuerstenberg,,47.88999939,8.56219959,918 +DA/BW-361,Berchenwald,,47.60889816,8.32499981,530 +DA/BW-362,Hoehberg,,47.68439865,7.99310017,993 +DA/BW-363,Erlenberg,,47.69919968,7.99560022,989 +DA/BW-364,Hohe Muttlen,,47.73059845,7.95809984,1143 +DA/BW-365,Staufenkopf,,47.75830078,8.20359993,1037 +DA/BW-366,Labacher Berg,,47.74280167,8.17609978,958 +DA/BW-367,Lehenkopf,,47.75109863,8.12500000,1039 +DA/BW-368,Mittelberg,,48.08860016,9.08780003,752 +DA/BW-369,Benzenberg,,48.06999969,9.12609959,722 +DA/BW-370,Tiefe,,48.12939835,9.19719982,708 +DA/BW-371,Guckenberg,,48.20360184,9.57219982,657 +DA/BW-372,Hermannsberg,,49.23830032,8.78940010,243 +DA/BW-373,Kaisersberg,,49.25439835,8.81560040,253 +DA/BW-374,Schillinger Berg,,48.17559814,7.95389986,726 +DA/BW-375,Schlossberg,,48.07059860,7.62109995,352 +DA/BW-376,Hochbuck,,48.05970001,7.62529993,375 +DA/BW-377,Boeselsberg,,48.05609894,7.67859983,340 +DA/BW-378,Grenzertkopf,,48.76079941,8.41469955,891 +DA/BW-379,Lachsberg,,48.65610123,8.34309959,754 +DA/BW-380,Vorfeldkopf,,48.66809845,8.24670029,949 +DA/BW-381,Kaelbelskopf,,48.69699860,8.21329975,672 +DA/BW-382,Eberkopf,,48.70059967,8.26309967,602 +DA/BW-383,Eierkuchenberg,,48.69309998,8.29669952,909 +DA/BW-384,Hohberg,,48.71139908,8.32530022,714 +DA/BW-385,Gr.Schoellkopf,,48.72809982,8.37919998,514 +DA/BW-386,Hirschkopf,,48.50439835,8.39500046,826 +DA/BW-387,Rinkenkopf,,48.51530075,8.36359978,760 +DA/BW-388,Hoellkopf,,48.54169846,8.36690044,855 +DA/BW-389,Grosshahnberg,,48.57920074,8.34109974,938 +DA/BW-390,Eckkoepfle,,48.59199905,8.37030029,681 +DA/BW-391,Stuhlberg,,48.59999847,8.36610031,615 +DA/BW-392,Kienberg,,48.49670029,8.33250046,890 +DA/BW-393,Eichelberg,,48.46500015,8.28779984,917 +DA/BW-394,Heimenhoehe,,48.45470047,8.29720020,879 +DA/BW-395,Absbachhoehe,,48.43140030,8.28330040,921 +DA/BW-396,Gauschberg,,48.40280151,8.26920033,838 +DA/BW-397,Teuscheneck,,48.40219879,8.28579998,866 +DA/BW-398,Waberhoehe,,48.32640076,8.30420017,813 +DA/BW-399,Ruxenkopf,,48.31639862,8.30749989,792 +DA/BW-400,Ippicher Hoehe,,48.31940079,8.26529980,735 +DA/BW-401,Teisenkopf,,48.31779861,8.33440018,794 +DA/BW-402,Am Rifliz,,48.15000153,8.25440025,886 +DA/BW-403,Kroneck,,48.14059830,8.22169971,946 +DA/BW-404,Blindestein,,48.15000153,8.13920021,1049 +DA/BW-405,Braunhoernle,,48.13059998,8.09749985,1134 +DA/BW-406,Hoernleberg,,48.12749863,8.04580021,906 +DA/BW-407,Wachtbuehl,,48.16310120,8.04529953,542 +DA/BW-408,Stromberg,,48.16809845,8.02890015,566 +DA/BW-409,Wolfenbuehl,,48.15670013,8.00809956,554 +DA/BW-410,Hotzstein,,48.15530014,7.95139980,629 +DA/BW-411,Hohe Tag,,48.14970016,7.94110012,613 +DA/BW-412,Saisenberg,,48.17810059,7.92609978,589 +DA/BW-413,Ruhbuehl,,48.20780182,7.93970013,542 +DA/BW-414,Geissberg,,48.23310089,7.99609995,727 +DA/BW-415,Goldbuehl,,48.25889969,7.98169994,529 +DA/BW-416,Lindenbuehl,,48.27000046,7.97249985,506 +DA/BW-417,Eichberg,,48.13389969,7.86579990,369 +DA/BW-418,Schlechtberg,,48.13140106,7.91860008,454 +DA/BW-419,Erzbuck,,48.19530106,7.85559988,450 +DA/BW-420,Fohreneck,,48.20169830,7.82999992,326 +DA/BW-421,Schindlenbuehl,,48.25780106,7.87470007,486 +DA/BW-422,Rollberg,,48.20500183,7.89559984,434 +DA/BW-423,Heubachbuehl,,48.23279953,7.92080021,474 +DA/BW-424,Nimberg,,48.08779907,7.77610016,253 +DA/BW-425,Hochberg,,48.09500122,7.67360020,410 +DA/BW-426,Kaiserstuhl,,48.08359909,7.65360022,427 +DA/BW-427,Kirchberg,,48.08330154,7.61999989,296 +DA/BW-428,Haberberg,,48.10969925,7.59689999,291 +DA/BW-429,Katharinenberg,,48.11690140,7.68919992,492 +DA/BW-430,Hochberg,,48.12419891,7.62169981,289 +DA/BW-431,Eichert,,48.13029861,7.61390018,267 +DA/BW-432,Sulzberg,,48.31330109,7.87939978,387 +DA/BW-433,Ernet,,48.32329941,7.88219976,343 +DA/BW-434,Burghard,,48.33250046,7.88749981,331 +DA/BW-435,Hohberg,,48.32749939,7.90059996,354 +DA/BW-436,Mahlbuck,,48.35440063,7.91309977,433 +DA/BW-437,Schutterlindenberg,,48.34889984,7.85669994,297 +DA/BW-438,Steinfirst,,48.36949921,7.98110008,600 +DA/BW-439,Billibuch,,47.86780167,8.52000046,918 +DA/BW-440,Rossberg,,47.93830109,8.64330006,834 +DA/BW-441,Karlseichen,,47.95529938,8.61139965,736 +DA/BW-442,Kapf,,47.89699936,8.61419964,905 +DA/BW-443,Wiedberg,,47.87390137,8.63889980,787 +DA/BW-444,Schmiedsberg,,47.85580063,8.82559967,609 +DA/BW-445,Oberholz,,47.84420013,8.82470036,539 +DA/BW-446,Loh,,47.85139847,8.88829994,560 +DA/BW-447,Reschberg,,47.87139893,8.87829971,608 +DA/BW-448,Ballenberg,,47.85559845,8.74499989,710 +DA/BW-449,Kleinheppacher Kopf,,48.83449936,9.38420010,452 +DA/BW-450,Nonnenberg,,48.79029846,9.42940044,471 +DA/BW-451,Brennten,,48.77890015,9.52309990,503 +DA/BW-452,Frauenberg,,48.79109955,9.55580044,474 +DA/BW-453,Lemberg,,48.73749924,9.56719971,460 +DA/BW-454,Probst,,48.72280121,9.47809982,446 +DA/BW-455,Kernen,,48.78250122,9.31110001,513 +DA/BW-456,Frauenkopf,,48.76359940,9.20689964,462 +DA/BW-457,Warmbronner Kopf,,48.75640106,9.00500011,517 +DA/BW-458,Baumberg,,48.70389938,8.90750027,483 +DA/BW-459,Hochberg,,48.67530060,8.92169952,516 +DA/BW-460,Masenwald,,48.68439865,8.81250000,573 +DA/BW-461,Schneckenberg,,48.66749954,8.97280025,517 +DA/BW-462,Roetelberg,,48.61780167,8.93780041,556 +DA/BW-463,Steingart,,48.58079910,9.00440025,566 +DA/BW-464,Schoenbuchspitz,,48.56420135,8.97669983,546 +DA/BW-465,Alter Berg,,48.53639984,8.97060013,431 +DA/BW-466,Hornkopf,,48.54970169,9.01060009,515 +DA/BW-467,Heuberg,,48.54470062,9.03750038,498 +DA/BW-468,Kirnberg,,48.55810165,9.07390022,465 +DA/BW-469,Eichenfirst,,48.57669830,9.10560036,502 +DA/BW-470,Duerrenberg,,48.55189896,9.15639973,433 +DA/BW-471,Betzenberg,,48.61690140,9.14330006,500 +DA/BW-472,Uhlberg,,48.63529968,9.20580006,469 +DA/BW-473,Federlesmahd,,48.68170166,9.14080048,495 +DA/BW-474,Hohenwart,,48.68199921,9.09749985,498 +DA/BW-475,Schenkenburg,,48.26079941,8.61030006,589 +DA/BW-476,Kapf,,48.26580048,8.60779953,600 +DA/BW-477,Hummelberg,,48.31029892,8.61139965,616 +DA/BW-478,Hohberg,,48.43690109,8.58440018,653 +DA/BW-479,Altheimer Heiligenwald,,48.50469971,8.61579990,691 +DA/BW-480,Riedhalde,,48.46060181,8.57639980,714 +DA/BW-481,Tann,,48.53419876,8.64140034,614 +DA/BW-482,Kapf,,48.54109955,8.64939976,594 +DA/BW-483,Lemberg,,48.53810120,8.71500015,521 +DA/BW-484,Schlossberg,,48.55640030,8.71420002,533 +DA/BW-485,Huehnerberg,,49.23889923,8.97189999,290 +DA/BW-486,Wilhau,,49.26390076,8.72389984,245 +DA/BW-487,Schmeisenberg,,49.19419861,8.69139957,223 +DA/BW-488,Hohberg,,49.18690109,8.69079971,218 +DA/BW-489,Schwallenberg,,49.16080093,8.67920017,215 +DA/BW-490,Kallenberg,,49.17499924,8.65999985,176 +DA/BW-491,Waschloch,,49.17860031,8.77530003,235 +DA/BW-492,Strassberg,,49.26190186,9.00809956,289 +DA/BW-493,Kuehnberg,,49.30939865,8.91139984,231 +DA/BW-494,Reichertsberg,,49.30920029,9.11419964,294 +DA/BW-495,Mittelberg,,49.38999939,9.05529976,265 +DA/BW-496,Goldberg,,49.34199905,9.26420021,334 +DA/BW-497,Hermannsberg,,49.41170120,9.22249985,318 +DA/BW-498,Henschelberg,,49.36059952,9.13920021,288 +DA/BW-499,Hamberg,,49.35189819,9.12080002,270 +DA/BW-500,Dachsberg,,49.31000137,9.20359993,305 +DA/BW-501,Ottenberg,,47.95420074,8.04279995,1041 +DA/BW-502,Frauensteigfels,,47.95169830,8.00329971,783 +DA/BW-503,Sonneck,,47.94580078,7.98250008,758 +DA/BW-504,Roteck,,47.92110062,8.00529957,1156 +DA/BW-505,Hundsruecken,,47.91949844,7.90939999,1234 +DA/BW-506,Hasbacher Hoehe,,47.83140182,7.91720009,1149 +DA/BW-507,Rotspitz,,47.82780075,7.87419987,1236 +DA/BW-508,Dietschel,,47.83829880,7.85500002,1241 +DA/BW-509,Ruehgartenwald,,47.82720184,7.84329987,1246 +DA/BW-510,Kaibenkopf,,47.81529999,7.76609993,940 +DA/BW-511,Schneckenkopf,,47.77059937,7.91060019,997 +DA/BW-512,Gscheidkopf,,47.77000046,7.92189980,1064 +DA/BW-513,Hohe Zinken,,47.78310013,8.00419998,1242 +DA/BW-514,Haegelesberg,,48.54470062,9.89610004,634 +DA/BW-515,Kuhberg,,48.58639908,10.01920033,652 +DA/BW-516,Mittelberg,,48.59560013,10.00580025,655 +DA/BW-517,Hochberg,,48.66889954,10.10750008,645 +DA/BW-518,Schmittenberg,,48.68470001,10.16639996,588 +DA/BW-519,Bernhau,,48.64530182,10.17609978,597 +DA/BW-520,Kagberg,,48.59360123,10.21389961,510 +DA/BW-521,Rudelsberg,,48.72719955,10.18889999,645 +DA/BW-522,Wollenberg,,48.75830078,10.08170033,710 +DA/BW-523,Woellerstein,,48.85829926,10.17829990,723 +DA/BW-524,Heulenberg,,48.83190155,10.13720036,715 +DA/BW-525,Baerenberg,,48.76390076,9.97719955,755 +DA/BW-526,Rosenstein,,48.79579926,9.96609974,735 +DA/BW-527,Schoener Berg,,48.71329880,9.93249989,746 +DA/BW-528,Luetzelalb,,48.71139908,9.89439964,747 +DA/BW-529,Schoenberg,,48.73529816,9.83030033,629 +DA/BW-530,Galgenberg,,48.71860123,9.86999989,717 +DA/BW-531,Fraenkel,,48.64360046,9.74170017,681 +DA/BW-532,Tegelberg,,48.64329910,9.81560040,698 +DA/BW-533,Dalisberg,,48.63359833,9.73499966,746 +DA/BW-534,Nordalb,,48.61640167,9.71389961,762 +DA/BW-535,Duchstetten,,48.58860016,9.74610043,786 +DA/BW-536,Leimberg,,48.58890152,9.68109989,747 +DA/BW-537,Schlossberg,,48.58000183,9.70059967,717 +DA/BW-538,Hochbuch,,48.48170090,9.72309971,763 +DA/BW-539,Hugsbuch,,48.47689819,9.65579987,813 +DA/BW-540,Rosshaeuptle,,48.32720184,9.37670040,824 +DA/BW-541,Hausberg,,48.30830002,9.40250015,794 +DA/BW-542,Kohlberg,,48.27859879,9.68640041,571 +DA/BW-543,Doppberg,,48.26750183,9.65170002,589 +DA/BW-544,Egelsberg,,48.36140060,9.75360012,685 +DA/BW-545,Erzberg,,48.35329819,9.75360012,631 +DA/BW-546,Butzen,,48.54470062,9.72500038,781 +DA/BW-547,Dutzenberg,,48.55080032,9.74419975,740 +DA/BW-548,Floriansberg,,48.55329895,9.30889988,522 +DA/BW-549,Weinberg,,48.54109955,9.29860020,488 +DA/BW-550,Hofbuehl,,48.53860092,9.31250000,510 +DA/BW-551,Galgenberg,,48.50640106,9.34469986,827 +DA/BW-552,Hoernle,,48.54330063,9.35389996,707 +DA/BW-553,Jusiberg,,48.54999924,9.33920002,673 +DA/BW-554,Eichenfirst,,48.58079910,9.35669994,438 +DA/BW-555,Kleinbergle,,48.61859894,9.25920010,371 +DA/BW-556,Benzberg,,48.63999939,9.28310013,384 +DA/BW-557,Engelberg,,48.57780075,9.40859985,528 +DA/BW-558,Hohenneuffen,,48.55580139,9.39309978,743 +DA/BW-559,Uhlberg,,49.58449936,9.59560013,362 +DA/BW-560,Gissigheimer Hoehe,,49.60359955,9.59969997,370 +DA/BW-561,Hussenbacher Hoehe,,49.61029816,9.60079956,371 +DA/BW-562,Stammberg,,49.62530136,9.62940025,338 +DA/BW-563,Hoehberg,,49.61220169,9.65830040,308 +DA/BW-564,Seilingsberg,,49.59780121,9.75109959,339 +DA/BW-565,Hohe Hardt,,49.61750031,9.77250004,350 +DA/BW-566,Oberer Berg,,49.76219940,9.45639992,361 +DA/BW-567,Unterer Berg,,49.77249908,9.42580032,386 +DA/BW-568,Grosser Wald,,49.75719833,9.36060047,441 +DA/BW-569,Bulau,,49.53530121,9.29249954,411 +DA/BW-570,Buchenberg,,49.50419998,9.37360001,422 +DA/BW-571,Deusterberg,,49.51139832,9.40030003,387 +DA/BW-572,Sindolsheimer Hoehe,,49.50949860,9.47420025,394 +DA/BW-573,Geissberg,,48.84329987,8.85140038,509 +DA/BW-574,Dickenberg,,48.81499863,8.86919975,479 +DA/BW-575,Maiberg,,48.78110123,8.86530018,467 +DA/BW-576,Schallberg,,48.77140045,8.86859989,452 +DA/BW-577,Hoher Acker,,48.84059906,8.93970013,438 +DA/BW-578,Laengenbuehl,,48.78060150,8.96360016,480 +DA/BW-579,Eltinger Kopf,,48.77669907,8.98390007,519 +DA/BW-580,Lotterberg,,48.83140182,9.09749985,395 +DA/BW-581,Hart,,48.81060028,9.09560013,341 +DA/BW-582,Kaltenberg,,48.85189819,9.12969971,362 +DA/BW-583,Lemberg,,48.81719971,9.13080025,384 +DA/BW-584,Kupferhalden,,49.04970169,8.82190037,304 +DA/BW-585,Humsterberg,,49.08060074,8.82579994,245 +DA/BW-586,Altenberg,,49.08420181,8.87559986,324 +DA/BW-587,Eichelberg,,48.99639893,8.85079956,367 +DA/BW-588,Scheuelberg,,49.02059937,8.82750034,382 +DA/BW-589,Gleichenberg,,49.01110077,8.88749981,379 +DA/BW-590,Mettenberg,,49.02030182,8.87810040,377 +DA/BW-591,Teufelsberg,,49.00360107,9.03719997,402 +DA/BW-592,Dornberg,,49.10829926,9.27830029,345 +DA/BW-593,Reisberg,,49.11669922,9.29720020,378 +DA/BW-594,Foehrenberg,,49.11949921,9.33780003,288 +DA/BW-595,Wolfsberg,,49.09199905,9.33889961,377 +DA/BW-596,Kohlebene,,49.07889938,9.34749985,378 +DA/BW-597,Sandberg,,49.08919907,9.36970043,432 +DA/BW-598,Eisenberg,,49.10250092,9.36250019,369 +DA/BW-599,Horkenberg,,49.09529877,9.43750000,549 +DA/BW-600,Stangenberg,,49.08720016,9.45059967,559 +DA/BW-601,Railelberg,,49.07889938,9.45279980,561 +DA/BW-602,Steinberg,,49.07109833,9.46500015,566 +DA/BW-603,Hohbuehl,,49.02610016,9.58609962,547 +DA/BW-604,Heidenbuckel,,49.03110123,9.58059978,536 +DA/BW-605,Flinsberg,,49.02199936,9.63560009,535 +DA/BW-606,Muehlberg,,49.16719818,9.67000008,523 +DA/BW-607,Hirtenberg,,49.12699890,10.14220047,542 +DA/BW-608,Hornberg,,49.17419815,10.10499954,466 +DA/BW-609,Hohberg,,49.00669861,8.57610035,254 +DA/BW-610,Heulenberg,,49.00329971,8.55220032,207 +DA/BW-611,Hopfenberg,,48.99779892,8.52639961,266 +DA/BW-612,Stranzenberg,,48.97779846,8.56639957,274 +DA/BW-613,Wattkopf,,48.94079971,8.42749977,338 +DA/BW-614,Heustaett,,48.95809937,8.60219955,285 +DA/BW-615,Ebb,,48.94029999,8.61170006,304 +DA/BW-616,Oberwald,,48.91419983,8.57719994,286 +DA/BW-617,Kirchberg,,48.92359924,8.64669991,342 +DA/BW-618,Grundreisig,,49.01139832,8.66030025,286 +DA/BW-619,Loeschberg,,49.01250076,8.68780041,270 +DA/BW-620,Fraueneich,,49.02750015,8.60560036,254 +DA/BW-621,Schlohberg,,49.02640152,8.63669968,257 +DA/BW-622,Hinterwald,,49.03530121,8.61219978,263 +DA/BW-623,Hammberg,,49.05640030,8.73719978,266 +DA/BW-624,Kasselersberg,,47.81610107,10.04920006,727 +DA/BW-625,Herrenberg,,47.73389816,10.10169983,931 +DA/BW-626,Hokopf,,47.70249939,10.09939957,1035 +DA/BW-627,Silberfelsen,,47.83110046,8.08500004,1277 +DA/BW-628,Schindelberg,,47.63420105,7.70919991,418 +DA/BW-629,Mauerhaldenbuck,,47.63499832,7.78749990,493 +DA/BW-630,Hohe Flum,,47.62659836,7.81011486,536 +DA/BW-631,Welschberg,,47.62699890,7.81139994,520 +DA/BW-632,Schanze,,47.66609955,7.91419983,784 +DA/BW-633,Haeuleoekopf,,47.65689850,7.93359995,787 +DA/BW-634,Abhau,,47.65219879,7.96640015,1018 +DA/BW-635,Kraehenbuehl,,47.59360123,7.90530014,404 +DA/BW-636,Altenhau,,47.59859848,7.89559984,459 +DA/BW-637,Hornberg,,47.60860062,7.84030008,476 +DA/BW-638,Nettenberg,,47.57469940,7.75169992,445 +DA/BW-639,Eichberg,,47.57939911,7.73890018,478 +DA/BW-640,Roetelsteinfelsen,,47.55699921,7.67530012,434 +DA/BW-641,Homburg,,47.62110138,7.68580008,430 +DA/BW-642,Klaiser,,47.58190155,7.69220018,489 +DA/BW-643,Buttenberg,,47.59809875,7.69829988,485 +DA/BW-644,Mezelhoehe,,47.60919952,7.71190023,485 +DA/BW-645,Katzenberg,,47.67829895,7.58169985,393 +DA/BW-646,Holzeneinig,,47.68170166,7.63170004,371 +DA/BW-647,Stocken,,47.74140167,7.62529993,458 +DA/BW-648,Ruettenen,,47.74530029,7.64499998,543 +DA/BW-649,Steineck,,47.74250031,7.65719986,550 +DA/BW-650,Laubrain,,47.73809814,7.68919992,565 +DA/BW-651,Mohrensattel,,47.72470093,7.67329979,556 +DA/BW-652,Burgberg,,47.73720169,7.70170021,663 +DA/BW-653,Grossholz,,47.75360107,7.70359993,848 +DA/BW-654,Juchskopf,,47.70280075,7.68139982,572 +DA/BW-655,Koepfle,,47.70470047,7.75309992,759 +DA/BW-656,Nollen,,47.70529938,7.78189993,743 +DA/BW-657,Klaefferbuck,,47.70109940,7.81029987,660 +DA/BW-658,Tannenbuehl,,47.69810104,7.82280016,727 +DA/BW-659,Gebetsbuehl,,47.71440125,7.83529997,699 +DA/BW-660,Schloettleberg,,47.72859955,7.73969984,988 +DA/BW-661,Hoernle,,47.75080109,7.78859997,912 +DA/BW-662,Frommensried,,47.72940063,7.82969999,940 +DA/BW-663,Grueneck,,47.77030182,7.67189980,705 +DA/BW-664,Hurrberg,,47.77859879,7.59810019,371 +DA/BW-665,Steinacker,,47.77669907,7.61059999,439 +DA/BW-666,Lipberg,,47.78939819,7.66029978,461 +DA/BW-667,Eich,,47.79169846,7.64940023,386 +DA/BW-668,Lausberg,,47.81610107,7.70249987,689 +DA/BW-669,Katzenstuhl,,47.85639954,7.73110008,591 +DA/BW-670,Fohrenberg,,47.86029816,7.71080017,332 +DA/BW-671,Enggengruendler Kopf,,47.84719849,7.72779989,704 +DA/BW-672,Etzenbacher Hoehe,,47.87720108,7.76060009,725 +DA/BW-673,Roedelsburg,,47.87749863,7.78140020,773 +DA/BW-674,Ruine Staufen,,47.88639832,7.73190022,375 +DA/BW-675,Streilbanner Kopf,,47.90280151,7.81559992,698 +DA/BW-676,Kreuzkopf,,47.96469879,7.84609985,526 +DA/BW-677,Illenberg,,47.95059967,7.85529995,643 +DA/BW-678,Taubenkopf,,47.93420029,7.88999987,881 +DA/BW-679,Laubiskopf,,47.95080185,7.92469978,683 +DA/BW-680,Junghof,,47.95920181,7.91720009,557 +DA/BW-681,Uhlberg,,48.01890182,7.89309978,618 +DA/BW-682,Ruine Zaehringen,,48.02529907,7.88420010,478 +DA/BW-683,Hornbuehl,,48.01390076,7.92640018,727 +DA/BW-684,Flisserkopf,,48.04560089,7.91779995,506 +DA/BW-685,Lindenberg,,48.00329971,8.02110004,814 +DA/BW-686,Graetlewald,,47.99560165,7.99720001,687 +DA/BW-687,Langeck,,48.02220154,8.00609970,862 +DA/BW-688,Stalzenberg,,48.06809998,7.94999981,649 +DA/BW-689,Kranzkopf,,48.06330109,7.97170019,816 +DA/BW-690,Hornbuehl,,48.07360077,7.93809986,519 +DA/BW-691,Himmelberg,,48.25170135,7.99109983,547 +DA/BW-692,Brandbuehl,,48.25030136,7.96360016,443 +DA/BW-693,Windkapf,,48.18360138,8.29310036,926 +DA/BW-694,Burren,,48.00981903,9.34340954,625 +DA/BW-695,Egenhaeuser Kapf,,48.56417084,8.63333321,625 +DA/BW-696,Hohenasperg,,48.90948105,9.13918018,355 +DA/BW-697,Hoechsten,,47.82248000,9.40103000,833 +DA/BW-698,Horen,,48.11864090,9.00111008,903 +DA/BW-699,Eisenberg,,48.02774811,9.40336037,604 +DA/BW-700,Hasenried,,48.11645889,8.98169994,901 +DA/BW-701,Gausberg,,48.98963165,8.98526955,372 +DA/BW-702,Drehkopf,,47.86120987,8.08644962,1182 +DA/BW-703,Sandkopf,,48.79121017,9.09867954,452 +DA/BW-704,Donnersberg,,48.97389984,9.00621033,261 +DA/BW-705,Vogtberg,,49.05195999,8.93416023,278 +DA/BW-706,Neuerberg,,49.09880066,8.95096016,288 +DA/BW-707,Sazenberg,,49.09431076,8.96133041,251 +DA/BW-708,Endberg,,49.00775909,8.90044975,364 +DA/BW-709,Altkellerkopf,,49.03916168,8.85669994,386 +DA/BW-710,Ravensburg,,49.10079956,8.87609005,286 +DA/BW-711,Roettlersberg,,49.10990143,8.91374969,244 +DA/BW-712,Schloessaecker,,49.20476151,8.81439972,257 +DA/BW-713,Rotenberg,,48.98294067,8.96294022,305 +DA/BW-714,Attenberg ,,49.08465958,8.87716007,324 +DA/BW-715,Gugel,,47.67926407,8.02260017,996 +DA/BW-716,Bussenbergle,,48.21020126,9.40398979,766 +DA/BW-717,Klausenberg,,47.97895000,9.36062000,603 +DA/BW-718,Buch,,48.02115000,9.66392000,619 +DA/BW-719,Turmberg,,48.63161000,9.57272300,609 +DA/BW-720,Aichelberg,,48.63520000,9.57790000,564 +DA/BW-721,Hertenberg,,47.55588000,7.71854000,416 +DA/BW-722,Hohe Warte (Schwarzwald),,48.82534600,8.72370800,537 +DA/BW-723,Bernhartshoehe,,48.72858000,9.06525000,549 +DA/CG-001,Rossalpenkopf,,47.71360016,12.33329964,1762 +DA/CG-002,Aschentaler Waende,,47.72109985,12.33250046,1691 +DA/CG-003,Wandspitz,,47.70999908,12.32499981,1685 +DA/CG-004,Muehlhornwand,,47.70610046,12.31719971,1658 +DA/CG-005,Weitlahnerkopf,,47.72280121,12.34309959,1615 +DA/CG-006,Latschkogel,,47.71310043,12.34309959,1589 +DA/CG-007,Ahornkopf,,47.71559906,12.34889984,1540 +DA/CG-008,Muehlhoerndel,,47.70470047,12.29940033,1519 +DA/CG-009,Karkopf (Geigelstein),,47.68999863,12.33969975,1510 +DA/CG-010,Moosberg,,47.69779968,12.32079983,1396 +DA/CG-011,Wirtsalpkopf,,47.69110107,12.28530025,1244 +DA/CG-012,Weissgrabenkopf,,47.75080109,12.55780029,1578 +DA/CG-013,Groehrkopf,,47.74610138,12.56029987,1562 +DA/CG-014,Zwoelferspitz,,47.75139999,12.50030041,1633 +DA/CG-015,Hasenpoint,,47.74470139,12.51309967,1587 +DA/CG-016,Bischofsstuhl,,47.75030136,12.52470016,1516 +DA/CG-017,Mansurfer,,47.73749924,12.52579975,1514 +DA/CG-018,Zinnkopf (Hochgern),,47.77830124,12.52610016,1223 +DA/CG-019,Teufelstein,,47.74810028,12.40670013,1435 +DA/CG-020,Friedenrath,,47.75999832,12.40530014,1432 +DA/CG-021,Breitenberg,,47.78030014,12.40859985,1047 +DA/CG-022,Strehtrumpf,,47.77579880,12.42529964,973 +DA/CG-023,Klausenberg,,47.73860168,12.26669979,1554 +DA/CG-024,Heuraffelkopf,,47.74810028,12.27970028,1504 +DA/CG-025,Karkopf (Hochries),,47.73970032,12.23890018,1496 +DA/CG-026,Predigtstuhl (Hochries),,47.74330139,12.27219963,1494 +DA/CG-027,Spielberg,,47.75360107,12.26809978,1440 +DA/CG-028,Zellerhorn,,47.75439835,12.29170036,1396 +DA/CG-029,Laubenstein,,47.75780106,12.28890038,1350 +DA/CG-030,Heuberg,,47.72610092,12.18389988,1338 +DA/CG-031,Hammerstein,,47.76079941,12.29609966,1278 +DA/CG-032,Schwarzenberg,,47.77220154,12.27309990,1136 +DA/CG-033,Sonnwendwand,,47.74610138,12.33440018,1512 +DA/CG-034,Sulten,,47.76330185,12.36859989,1466 +DA/CG-035,Hemmerstein,,47.74610138,12.35859966,1413 +DA/CG-036,Brunnsteinkopf,,47.75780106,12.33829975,1224 +DA/CG-037,Eiberg,,47.77470016,12.36419964,1023 +DA/CG-038,Hoerndlwand,,47.70669937,12.58640003,1684 +DA/CG-039,Vorderer Rauschberg,,47.73249817,12.68389988,1646 +DA/CG-040,Streicher,,47.73609924,12.71080017,1594 +DA/CG-041,Sulzgrabenkopf,,47.71720123,12.59140015,1521 +DA/CG-042,Unternberg,,47.72859955,12.63920021,1425 +DA/CG-043,Durlachkopf,,47.72389984,12.61439991,1395 +DA/CG-044,Schachenberg,,47.71279907,12.29440022,1076 +DA/CG-045,Sandspitz,,47.68999863,12.35719967,1420 +DA/CG-046,Spitzberg,,47.71469879,12.35579967,1444 +DA/CG-047,Daxlberg,,47.83110046,12.61830044,740 +DA/CG-048,Reifelberg,,47.68220139,12.67780018,1883 +DA/CG-049,Hochgern (Sonntagshorn),,47.68080139,12.70499992,1740 +DA/CG-050,Fischbachkopf,,47.68080139,12.66580009,1694 +DA/CG-051,Ochsenhorn,,47.68920135,12.71889973,1615 +DA/CG-052,Augenstein,,47.69889832,12.71689987,1584 +DA/CG-053,Brandelberg,,47.71720123,12.25389957,1516 +DA/CG-054,Wildalphorn,,47.67559814,12.62860012,1690 +DA/CG-055,Lembergschneid,,47.67309952,12.59529972,1597 +DA/CG-056,Ochsenlahnerkopf,,47.67330170,12.63580036,1500 +DA/CG-057,Markkogel,,47.63059998,12.52499962,1598 +DA/CG-058,Lahnerkogel,,47.62829971,12.51970005,1595 +DA/CG-059,Steinwurfkogel,,47.62500000,12.49919987,1587 +DA/CG-060,Schellenberg,,47.81169891,12.58329964,823 +DA/CG-061,Hochberg,,47.84106064,12.65612030,774 +DA/CG-062,Guntramshuegl,,47.87400055,12.62985992,647 +DA/CG-063,Sulzbergschneid,,47.77576447,12.70158291,1159 +DA/CG-064,Kapelle Froschham,,47.94088364,12.67053318,608 +DA/EW-001,Henneneck,,47.54579926,11.17469978,1964 +DA/EW-002,Kareck,,47.54809952,11.17969990,2046 +DA/EW-003,Schindlerskopf,,47.55440140,11.19110012,1940 +DA/EW-004,Archtalkopf,,47.55749893,11.19419956,1927 +DA/EW-005,Zwoelferkoepfl,,47.57170105,11.21329975,1641 +DA/EW-006,Platteneck,,47.55720139,11.22669983,1804 +DA/EW-007,Wallgauer Eck,,47.54639816,11.22889996,1769 +DA/EW-008,Osterfeuerspitze,,47.60279846,11.21500015,1365 +DA/EW-009,Rauheck,,47.61360168,11.26249981,1590 +DA/EW-010,Fahrenbergkopf,,47.60639954,11.31420040,1627 +DA/EW-011,Martinskopf,,47.60919952,11.30780029,1674 +DA/EW-013,Sonnenspitze,,47.63690186,11.37720013,1271 +DA/EW-014,Alpenkopf,,47.62530136,11.28110027,1384 +DA/EW-015,Elferkoepfl,,47.57279968,11.21940041,1412 +DA/EW-016,Niederer Fricken,,47.53860092,11.15639973,1682 +DA/EW-017,Griessberg,,47.58860016,11.27390003,1405 +DA/EW-018,Griesskopf,,47.61080170,11.25809956,1452 +DA/EW-019,Grosser Illing,,47.62419891,11.26309967,1313 +DA/EW-020,Hinterer Kopf,,47.56689835,11.21389961,1501 +DA/EW-021,Kauserberg,,47.62559891,11.28139973,1384 +DA/EW-022,Kesselkoepfe,,47.55690002,11.24059963,1594 +DA/EW-023,Kirchelwand,,47.60580063,11.32670021,1155 +DA/EW-024,Krepelschrofen,,47.52640152,11.27719975,1160 +DA/EW-025,Kreuzturm,,47.57139969,11.20499992,1349 +DA/EW-026,Mitterberg,,47.53219986,11.26830006,1230 +DA/EW-027,Mitterkopf,,47.51470184,11.19419956,1529 +DA/EW-028,Neuglaugerkopf,,47.55220032,11.25889969,1491 +DA/EW-029,Ochsenberg,,47.52360153,11.14859962,1694 +DA/EW-030,Ohlstaedter Teilberg,,47.60810089,11.26500000,1457 +DA/EW-031,Oelrain,,47.60689926,11.24219990,1542 +DA/EW-032,Rauchkopf,,47.61140060,11.31999969,1426 +DA/EW-033,Rauchkoepfl,,47.61859894,11.28439999,1508 +DA/EW-034,Rauteck,,47.62889862,11.29920006,1096 +DA/EW-035,Rauteckkopf,,47.61890030,11.29920006,1509 +DA/EW-036,Schindlerskopf,,47.55469894,11.19169998,1940 +DA/EW-037,Simmersberg,,47.63639832,11.26609993,1052 +DA/EW-038,Teufelskapelle,,47.56639862,11.18190002,1069 +DA/EW-039,Unterrauheck,,47.53060150,11.20610046,1533 +DA/EW-040,Zundereck,,47.56919861,11.19359970,1478 +DA/EW-041,Zunderkopf 1,,47.56779861,11.19390011,1506 +DA/EW-042,Zunderkopf 2,,47.51639938,11.18309975,1611 +DA/EW-043,Eckenberg,,47.51205444,11.13955593,1749 +DA/EW-044,Ameisberg,,47.51169586,11.14469433,1724 +DA/EW-045,Rosswank,,47.50379944,11.15540028,1688 +DA/HE-001,Pferdskopf,,50.49190140,9.92220020,875 +DA/HE-002,Langenberg,,51.27719879,8.55920029,843 +DA/HE-003,Ettelsberg,,51.27780151,8.59780025,838 +DA/HE-004,Schafstein,,50.50279999,9.97500038,832 +DA/HE-005,Hopperkopf,,51.24860001,8.60000038,831 +DA/HE-006,Kleiner Feldberg,,50.22219849,8.44690037,825 +DA/HE-007,Simmelsberg,,50.43000031,9.93750000,818 +DA/HE-008,Ehrenberg,,50.51499939,9.99079990,817 +DA/HE-009,Eubeberg,,50.47890091,9.91810036,817 +DA/HE-010,Feldberg/Rhoen,,50.47190094,9.95079994,815 +DA/HE-011,Weiherberg,,50.51860046,9.91219997,786 +DA/HE-012,Meissner,,51.22809982,9.86390018,754 +DA/HE-013,Buchschirmberg,,50.57389832,10.02999973,740 +DA/HE-014,Teufelsstein,,50.51779938,9.89420033,729 +DA/HE-015,Maulkuppe,,50.52809906,9.87779999,706 +DA/HE-016,Rodenbacher Kuppe,,50.43719864,9.92529964,680 +DA/HE-017,Ebersberg,,50.47449875,9.85140038,689 +DA/HE-018,Wachtkueppel,,50.47000122,9.89169979,706 +DA/HE-019,Pferdskopf,,50.29109955,8.43529987,663 +DA/HE-020,Hohe Warte,,51.05419922,8.52999973,645 +DA/HE-021,Buchholz,,50.96080017,8.49110031,643 +DA/HE-022,Nordhoell,,50.86560059,8.26329994,641 +DA/HE-023,Widdehagen,,51.30920029,8.77250004,635 +DA/HE-024,Knuellkopf,,50.91469955,9.42969990,634 +DA/HE-025,Herzberg,,50.25830078,8.52890015,591 +DA/HE-026,Hainpracht,,50.93999863,8.52470016,631 +DA/HE-027,Hausfirste,,51.30699921,9.76889992,607 +DA/HE-028,Hainbacher Hoehe,,50.83940125,8.21140003,606 +DA/HE-029,Bilstein,,50.49689865,9.20359993,666 +DA/HE-030,Heidkueppel,,50.46390152,9.83080006,600 +DA/HE-031,Die Hoeh,,50.74079895,8.11030006,598 +DA/HE-032,Burg,,50.73970032,8.06690025,591 +DA/HE-033,Eschenburg,,50.78860092,8.34529972,589 +DA/HE-034,Koepfchen,,50.88579941,9.43190002,588 +DA/HE-035,Essigberg,,51.31499863,9.34720039,581 +DA/HE-036,Erbacher Kopf,,50.06890106,8.03559971,580 +DA/HE-037,Goldener Steinrueck,,50.60250092,9.24610043,578 +DA/HE-038,Langhals,,50.27890015,8.48830032,574 +DA/HE-039,Steinkopf,,50.19250107,8.43330002,570 +DA/HE-040,Talgang,,51.10969925,8.95639992,566 +DA/HE-041,Hemmrain,,50.78559875,8.26309967,561 +DA/HE-042,Grosser Nickus,,50.35139847,9.68939972,558 +DA/HE-043,Naxburg,,50.44969940,9.39220047,554 +DA/HE-044,Baerberg,,50.92610168,9.39140034,554 +DA/HE-045,Semmelberg,,50.92810059,9.50170040,553 +DA/HE-046,Horst,,50.46530151,9.39780045,553 +DA/HE-047,Roehrberg,,51.03559875,8.55220032,547 +DA/HE-048,Falkenberg,,49.54330063,9.02110004,546 +DA/HE-049,Lindenberg,,50.23529816,8.52140045,541 +DA/HE-050,Eschenberg,,50.92750168,9.46920013,535 +DA/HE-051,Kuhbett,,50.32920074,8.32859993,526 +DA/HE-052,Silberberg,,50.95280075,9.41889954,524 +DA/HE-053,Aschenberg,,50.99420166,9.50669956,521 +DA/HE-054,Rossert,,50.16439819,8.40110016,516 +DA/HE-055,Huenstein,,50.80390167,8.53499985,504 +DA/HE-056,Auerberg,,50.71640015,9.37440014,501 +DA/HE-057,Geiskopf,,50.97940063,9.60109997,497 +DA/HE-058,Gebrannter Kopf,,50.92390060,9.61559963,494 +DA/HE-059,Himmelsberg,,50.51279831,9.54220009,490 +DA/HE-060,Rehkopf,,51.00139999,9.60439968,488 +DA/HE-061,Ibrakuppe,,50.83499908,9.49969959,487 +DA/HE-062,Muehlberg,,50.56919861,9.39640045,486 +DA/HE-063,Heerhain,,50.53079987,9.37030029,486 +DA/HE-064,Hausberg,,50.41249847,8.61610031,486 +DA/HE-065,Geiersberg,,49.54029846,8.88669968,485 +DA/HE-066,Winterstein,,50.33390045,8.66720009,482 +DA/HE-067,Franzosenkopf,,50.14970016,9.22640038,481 +DA/HE-068,Brenzelshoehe,,50.97000122,9.67860031,481 +DA/HE-069,Plesse,,51.19079971,10.19750023,480 +DA/HE-070,Biberstein,,50.57310104,9.85029984,477 +DA/HE-071,Schreckenberg,,51.38359833,9.31719971,475 +DA/HE-072,Staufenberg,,51.50830078,9.56169987,472 +DA/HE-073,Landenhaeuser Stein,,50.57699966,9.45919991,469 +DA/HE-074,Rammelsberg,,51.09439850,9.76469994,467 +DA/HE-075,Allmutsberg,,51.00220108,9.45079994,463 +DA/HE-076,Spitzhuette,,50.98360062,9.93500042,462 +DA/HE-077,Selbergshoehe,,51.16579819,8.77859974,460 +DA/HE-078,Lohwald,,50.58560181,9.34720039,456 +DA/HE-079,Schwalbenkopf,,50.91749954,9.86310005,455 +DA/HE-080,Griechenkopf,,51.14170074,8.82030010,454 +DA/HE-081,Escheberg,,50.36389923,9.58469963,452 +DA/HE-082,Homberg,,50.72969818,9.32330036,450 +DA/HE-083,Karnberg,,51.16640091,10.20499992,447 +DA/HE-084,Orthberg,,51.05189896,9.13280010,447 +DA/HE-085,Haukuppe,,50.90919876,9.66860008,446 +DA/HE-086,Ziegenkueppel,,51.11000061,9.85830021,445 +DA/HE-087,Wolkenbrust,,50.61500168,9.14500046,445 +DA/HE-088,Alteburg,,50.67330170,8.38280010,445 +DA/HE-089,Hornungskuppe,,50.90639877,9.97970009,444 +DA/HE-090,Bracht,,51.11529922,8.89309978,442 +DA/HE-091,Gibgeskuppe,,50.75690079,9.53689957,438 +DA/HE-092,Roteberg,,50.87609863,9.81029987,434 +DA/HE-093,Kuehlestuhl,,51.34920120,9.76140022,433 +DA/HE-094,Koehlerberg,,50.46829987,8.52280045,425 +DA/HE-095,Spitzenberg,,51.13330078,9.99580002,423 +DA/HE-096,Wernerstein,,50.36059952,9.27939987,420 +DA/HE-097,Laerchenberg,,50.61080170,9.45059967,415 +DA/HE-098,Maeuseberg,,51.13359833,9.88560009,415 +DA/HE-099,Hauberg,,50.79420090,9.77560043,413 +DA/HE-100,Wasserberg,,50.96699905,8.79440022,412 +DA/HE-101,Kreuzberg,,50.56529999,8.25940037,411 +DA/HE-102,Hueppelsberg,,51.12530136,10.01809978,410 +DA/HE-103,Vier Fichten,,50.24969864,9.23970032,406 +DA/HE-104,Mardorfer Kuppe,,50.73500061,8.92889977,407 +DA/HE-105,Rehkuppe,,50.81829834,9.60939980,404 +DA/HE-106,Hesselkopf,,50.99810028,9.87829971,403 +DA/HE-107,Bilskuppe,,50.67580032,9.39309978,403 +DA/HE-108,Teufelsberg,,50.95309830,9.12720013,397 +DA/HE-109,Sebbel,,50.82059860,9.40110016,394 +DA/HE-110,Heiligenberg,,51.13359833,9.45919991,393 +DA/HE-111,Leidenhoefer Kopf,,50.70809937,8.81439972,393 +DA/HE-112,Galgenberg,,50.18809891,9.24969959,393 +DA/HE-113,Eichelkopf,,50.25439835,9.18999958,386 +DA/HE-114,Kretenberg,,50.72719955,9.17420006,384 +DA/HE-115,Hardtkueppel,,50.36029816,8.38780022,384 +DA/HE-116,Steinroede,,50.31529999,9.15190029,377 +DA/HE-117,Hoher Rain,,51.16830063,10.11559963,376 +DA/HE-118,Grosser Steinkopf,,50.93000031,9.82419968,375 +DA/HE-119,Noll,,50.65449905,8.93360043,371 +DA/HE-120,Kirchberg,,50.76639938,8.59109974,362 +DA/HE-121,Klingelskopf,,49.80390167,8.92889977,361 +DA/HE-122,Bieler Burg,,50.57310104,8.37779999,359 +DA/HE-123,Alte Hoehe,,49.85609818,8.98250008,358 +DA/HE-124,Koppe,,50.63750076,8.37500000,354 +DA/HE-125,Gerstenberg,,50.92890167,9.30420017,353 +DA/HE-126,Suessekopf,,50.56309891,9.02330017,350 +DA/HE-127,Grauenstein,,50.47610092,8.35750008,349 +DA/HE-128,Koenigstuhl,,50.61140060,8.57030010,348 +DA/HE-129,Nellenberg,,50.83860016,9.11779976,345 +DA/HE-130,Globerg,,50.74530029,9.13580036,344 +DA/HE-131,Ziegenberg,,50.99000168,9.81669998,333 +DA/HE-132,Hermanskopf,,50.71360016,8.99440002,331 +DA/HE-133,Nollig,,50.05189896,7.79530001,331 +DA/HE-134,Kanzel,,50.47529984,8.42440033,326 +DA/HE-135,Stein,,50.89699936,8.79419994,306 +DA/HE-136,Hangelstein,,50.63109970,8.72830009,305 +DA/HE-137,Steinbuegel,,50.50690079,8.99499989,295 +DA/HE-138,Hubberg,,50.49079895,8.98279953,289 +DA/HE-139,Batzenberg,,51.01610184,9.34169960,276 +DA/HE-140,Herkules,,51.31639862,9.39280033,535 +DA/HE-141,Huettenberg,,51.31309891,9.39529991,555 +DA/HE-142,Brasselsberg,,51.29000092,9.40750027,434 +DA/HE-143,Hirzstein,,51.28749847,9.37530041,502 +DA/HE-144,Baunsberg,,51.26890182,9.40919971,410 +DA/HE-145,Schauenburg,,51.28469849,9.33310032,500 +DA/HE-146,Saukopf,,51.27030182,9.32610035,511 +DA/HE-147,Grosser Gudenberg,,51.36669922,9.27140045,569 +DA/HE-148,Kleiner Gudenberg,,51.36970139,9.26609993,532 +DA/HE-149,Grosser Schreckenberg,,51.37810135,9.30830002,450 +DA/HE-150,Kleiner Schreckenberg,,51.38330078,9.26609993,475 +DA/HE-151,Schartenberg,,51.39220047,9.31110001,404 +DA/HE-152,Elfbuchen,,51.33029938,9.39330006,535 +DA/HE-153,Grosser Steinhaufen,,51.31499863,9.36139965,597 +DA/HE-154,Rosenberg,,51.33029938,9.26889992,472 +DA/HE-155,Hasungen Berg,,51.32387161,9.27017975,480 +DA/HE-156,Helfenstein,,51.36220169,9.34860039,510 +DA/HE-157,Hohlestein,,51.35079956,9.36390018,477 +DA/HE-158,Grosser Auskopf,,51.32830048,9.34029961,513 +DA/HE-159,Igelsburg,,51.33580017,9.36859989,466 +DA/HE-160,Grosser Steinberg,,51.35699844,9.70189953,542 +DA/HE-161,Kleiner Steinberg,,51.36610031,9.69919968,477 +DA/HE-162,Franzosentriesch,,51.22529984,9.61610031,484 +DA/HE-163,Breiter Berg,,51.18470001,9.67860031,533 +DA/HE-164,Warpel,,51.22579956,9.53439999,439 +DA/HE-165,Schorn,,51.22389984,9.52390003,457 +DA/HE-166,Dennhaeuser Huette,,51.24000168,9.49860001,325 +DA/HE-167,Niedensteiner Kopf,,51.23529816,9.32079983,475 +DA/HE-168,Sengelsberg,,51.24470139,9.31939983,449 +DA/HE-169,Steinberg,,51.25220108,9.93830013,419 +DA/HE-170,Falkenstein,,51.25389862,9.29580021,422 +DA/HE-171,Emser Berg,,51.23640060,9.27439976,447 +DA/HE-172,Bilstein,,51.22689819,9.35470009,459 +DA/HE-173,Stellberg,,51.21829987,9.57359982,476 +DA/HE-174,Gutsberg,,51.21920013,9.78110027,517 +DA/HE-175,Kalbe,,51.21640015,9.87419987,720 +DA/HE-176,Seesteine,,51.19469833,9.85499954,695 +DA/HE-177,Breiter Berg,,51.18610001,9.67920017,533 +DA/HE-178,Grosser Suettelsberg,,51.18249893,9.64080048,490 +DA/HE-179,Kesselstein,,50.44499969,9.96829987,799 +DA/HE-180,Bremerkopf,,50.41419983,9.86439991,797 +DA/HE-181,Ottersteine,,50.41080093,9.86190033,821 +DA/HE-182,Beilstein,,50.40330124,9.89109993,865 +DA/HE-183,Dalherda Kuppe,,50.41080093,9.82689953,801 +DA/HE-184,Salmsbachs Kopf,,51.16859818,9.64169979,493 +DA/HE-185,Kohlberg,,51.17670059,9.58390045,426 +DA/HE-186,Rambachs Koepfchen,,51.17309952,9.17580032,413 +DA/HE-187,Elmsberg,,51.15250015,9.03890038,527 +DA/HE-188,Ochsenwurzelkopf,,51.16640091,9.02359962,542 +DA/HE-189,Schloss Waldeck,,51.20360184,9.05580044,381 +DA/HE-190,Pentersrueck,,51.16690063,9.68920040,562 +DA/HE-191,Hellkopf,,51.17029953,9.74030018,466 +DA/HE-192,Petershoehe,,51.13359833,9.77919960,441 +DA/HE-193,Grosse Steine,,51.15140152,9.79220009,533 +DA/HE-194,Beisenberg,,51.06169891,9.53530025,427 +DA/HE-195,Eichelberg,,51.04219818,9.55970001,480 +DA/HE-196,Trieschkopf,,51.22829819,9.60750008,480 +DA/HE-197,Kleiner Belgerkopf,,51.24079895,9.63220024,470 +DA/HE-198,Grosser Belgerkopf,,51.24969864,9.63169956,497 +DA/HE-199,St.Ottielienberg,,51.21969986,9.63169956,452 +DA/HE-200,Ottilienstein,,50.46860123,9.99170017,846 +DA/HE-201,Steinkopf,,50.47779846,10.01939964,888 +DA/HE-202,Abtsroder Kuppe,,50.50389862,9.93830013,905 +DA/HE-203,Fuchsstein,,50.48329926,9.95940018,816 +DA/HE-204,Schneeberg,,50.46920013,9.94470024,684 +DA/HE-205,Weiherberg,,50.51860046,9.91219997,786 +DA/HE-206,Heiligenberg,,50.51750183,9.92580032,650 +DA/HE-207,Stockmiesen,,50.50310135,9.95639992,844 +DA/HE-208,Mathesberg,,50.48749924,9.97780037,832 +DA/HE-209,Mostberg,,50.46390152,9.96640015,807 +DA/HE-210,Hachtkopf,,50.46829987,9.96469975,824 +DA/HE-211,Teufelsberg,,50.42139816,9.94859982,844 +DA/HE-212,Himmeldunkberg,,50.42309952,9.95890045,888 +DA/HE-213,Schwarzenhauck,,50.50559998,9.89280033,663 +DA/HE-214,Stellberg,,50.53810120,9.87390041,727 +DA/HE-215,Bubenbader,,50.53919983,9.91110039,759 +DA/HE-216,Hauenstein,,50.53810120,9.86559963,597 +DA/HE-217,Heidigskuppe,,50.51499939,9.90310001,702 +DA/HE-218,Steinwand,,50.52220154,9.86559963,647 +DA/HE-219,St.Ganggolf,,50.54449844,9.89780045,835 +DA/HE-220,Fuchskueppel,,50.52220154,9.91689968,775 +DA/HE-221,Bodenhofkueppel,,50.46469879,9.88249969,685 +DA/HE-222,Koenigsstein,,50.50920105,9.95580006,788 +DA/HE-223,Hoherodskopf,,50.51190186,9.22830009,764 +DA/HE-224,Nesselberg,,50.52080154,9.27140045,716 +DA/HE-225,Gackerstein,,50.51470184,9.20330048,663 +DA/HE-226,Rehberg,,50.49420166,9.24890041,670 +DA/HE-227,Herchenhainer Hoehe,,50.48720169,9.27690029,733 +DA/HE-228,Muehlberg,,50.48559952,9.23639965,611 +DA/HE-229,Ernstberg,,50.47499847,9.25389957,626 +DA/HE-230,Kleekopf,,50.50809860,9.31560040,555 +DA/HE-231,Burg,,50.50640106,9.29389954,588 +DA/HE-232,Kloeshorst,,50.50579834,9.32439995,560 +DA/HE-233,Mosenberg,,51.05920029,9.42169952,437 +DA/HE-234,Haeuschensberg,,51.38970184,9.51329994,301 +DA/HE-235,Speeler Kopf,,51.39310074,9.59809971,316 +DA/HE-236,Staufenkueppel,,51.41809845,9.62749958,334 +DA/HE-237,Sababurg,,51.54449844,9.53559971,352 +DA/HE-238,Wattberg,,51.48669815,9.32359982,353 +DA/HE-239,Muehlenberg,,51.47689819,9.57250023,439 +DA/HE-240,Gahrenberg,,51.44329834,9.57110023,472 +DA/HE-241,Malsburg,,51.41080093,9.26029968,406 +DA/HE-242,Kleiner Doernberg,,51.36500168,9.33189964,482 +DA/HE-243,Rohrberg,,51.34170151,9.27390003,517 +DA/HE-244,Ofenberg,,51.32749939,9.18999958,372 +DA/HE-245,Auerbacher Schloss,,49.70890045,8.63169956,346 +DA/HE-246,Darsberg,,49.73889923,8.64500046,374 +DA/HE-247,Tannenberg,,49.75640106,8.65639973,339 +DA/HE-248,Schlossberg,,49.64609909,8.64780045,295 +DA/HE-249,Lindenstein,,49.66139984,8.67529964,455 +DA/HE-250,Kesselberg,,49.67779922,8.70580006,531 +DA/HE-251,Grosser Staufenberg,,51.36109924,9.63809967,403 +DA/HE-252,Hohe Wand,,51.36500168,9.71669960,478 +DA/HE-253,Haeringsnase,,51.34889984,9.72140026,508 +DA/HE-254,Hundsberg,,51.30830002,9.28359985,496 +DA/HE-255,Seilerberg,,51.31470108,9.32499981,495 +DA/HE-256,Lindenberg,,51.29830170,9.31499958,486 +DA/HE-257,Grosser Schoenberg,,51.29280090,9.30420017,483 +DA/HE-258,Bilsteinklippen,,51.29330063,9.40110016,400 +DA/HE-259,Huehnerberg,,51.33580017,9.39249992,496 +DA/HE-260,Hunrodsberg,,51.30609894,9.40939999,436 +DA/HE-261,Muehlenstein,,51.30500031,9.76749992,607 +DA/HE-262,Muehlenberg,,51.31809998,9.61999989,352 +DA/HE-263,Gerholdsberg,,51.30530167,9.64500046,352 +DA/HE-264,Salzleckerkopf,,51.32749939,9.68470001,412 +DA/HE-265,Zollstock,,51.28609848,9.70969963,549 +DA/HE-266,Kleine Kappe,,51.29449844,9.80970001,464 +DA/HE-267,Rendskopf,,51.25690079,9.30169964,421 +DA/HE-268,Halmskopf,,51.25859833,9.32559967,452 +DA/HE-269,Kriegsberg,,51.27750015,9.33440018,491 +DA/HE-270,Grosser Schoenberg,,51.29280090,9.32079983,483 +DA/HE-271,Birkenkopf,,51.28250122,9.39939976,360 +DA/HE-272,Stupberg,,51.27140045,9.69939995,477 +DA/HE-273,Giesenberg,,51.26750183,9.74610043,527 +DA/HE-274,Schwarzenberg,,51.27949905,9.75139999,517 +DA/HE-275,Steinberg,,51.27109909,9.77690029,570 +DA/HE-276,Langenberg,,51.27579880,9.81439972,565 +DA/HE-277,Kahlenberg,,51.26449966,9.81190014,470 +DA/HE-278,Hohekopf,,51.24610138,9.79940033,539 +DA/HE-279,Grosse Kappe,,51.28390121,9.80329990,571 +DA/HE-280,Roggenberg,,51.28749847,9.87110043,507 +DA/HE-281,Krueckenkopf,,51.27360153,9.87139988,519 +DA/HE-282,Haesselkuppe,,51.25949860,9.85830021,515 +DA/HE-283,Ruesskopf,,51.27719879,9.75310040,482 +DA/HE-284,Erzeberg,,51.25970078,9.25689983,437 +DA/HE-285,Remmenhausener Kopf,,51.26969910,9.27280045,428 +DA/HE-286,Laufskopf,,51.24079895,9.34189987,535 +DA/HE-287,Badenstein,,51.20140076,9.56169987,442 +DA/HE-288,Steinkopf,,51.20560074,9.57559967,427 +DA/HE-289,Koenigsberg,,51.21609879,9.65330029,410 +DA/HE-290,Roesberg,,51.22470093,9.75749969,528 +DA/HE-291,Eisenberg,,51.21469879,9.75329971,485 +DA/HE-292,Exberg,,51.23469925,9.78279972,506 +DA/HE-293,Meinetsberg,,51.21720123,9.81690025,502 +DA/HE-294,Metzberg,,51.18579865,9.78530025,422 +DA/HE-295,Kesselberg,,51.19609833,9.82330036,516 +DA/HE-296,Steinberg,,51.20330048,9.80329990,478 +DA/HE-297,Rettenberg,,51.18579865,9.82779980,450 +DA/HE-298,Hoellenrueck,,51.18830109,9.86810017,519 +DA/HE-299,Heiligenberg,,51.24060059,9.84669971,583 +DA/HE-300,Karlsstollen,,51.20500183,9.86579990,623 +DA/HE-301,Frau Holle,,51.21920013,9.86999989,623 +DA/HE-302,Hermannsberg,,51.30530167,8.65279961,705 +DA/HE-303,Hoehekopf,,51.31610107,8.64249992,622 +DA/HE-304,Schwalenburg,,51.31573105,8.62506962,579 +DA/HE-305,Dreiskopf,,51.32490158,8.60761642,781 +DA/HE-306,Hegekopf,,51.33060074,8.65170002,641 +DA/HE-307,Eideler Berg,,51.29330063,8.63609982,743 +DA/HE-308,Schneeberg,,51.28359985,8.64029980,726 +DA/HE-309,Emmel,,51.26919937,8.64249992,742 +DA/HE-310,Grosse Grube,,51.27199936,8.59889984,798 +DA/HE-311,Krutenberg,,51.25529861,8.61750031,762 +DA/HE-312,Auf`m Knoll,,51.26359940,8.64140034,738 +DA/HE-313,Musenberg,,51.27310181,8.62500000,740 +DA/HE-314,Mittelsberg,,51.27610016,8.58329964,801 +DA/HE-315,Kalied,,51.26219940,8.67109966,745 +DA/HE-316,Hillekopf,,51.23970032,8.59939957,801 +DA/HE-317,Kessel,,51.15330124,9.52169991,368 +DA/HE-318,Schlossberg,,51.16220093,9.63220024,452 +DA/HE-319,Ruine Reichenbach,,51.16889954,9.75360012,522 +DA/HE-320,Grosser Rohrberg,,51.16719818,9.77309990,496 +DA/HE-321,Hahnberg,,51.10359955,9.06309986,512 +DA/HE-322,Ahornkopf,,51.12810135,8.96940041,604 +DA/HE-323,Ochsenwurzelskopf,,51.16719818,9.02530003,542 +DA/HE-325,Schilling,,51.00859833,9.55889988,468 +DA/HE-326,Waltersberg,,51.01390076,9.55749989,466 +DA/HE-327,Ruine Rodenberg,,51.01060104,9.73639965,418 +DA/HE-328,Grosser Steinkopf,,51.02280045,9.72830009,446 +DA/HE-329,Kleiner Steinkopf,,51.02439880,9.73779964,454 +DA/HE-330,Nenterberg,,50.98109818,9.55580044,525 +DA/HE-331,Hasenkopf,,50.97140121,9.53829956,502 +DA/HE-332,Klosterstein,,50.96969986,9.55000019,528 +DA/HE-333,Stellberg,,50.53810120,9.88169956,727 +DA/HE-334,Tannenfels,,50.54389954,9.96609974,669 +DA/HE-335,Krautberg,,50.53329849,9.99279976,624 +DA/HE-336,Giebelrain,,50.50329971,9.83189964,588 +DA/HE-337,Haimberg,,50.50000000,9.82059956,568 +DA/HE-338,Kleiner Nallenberg,,50.43579865,9.88029957,704 +DA/HE-339,Reesberg,,50.41949844,9.92169952,851 +DA/HE-340,Rommerser Berg,,50.41439819,9.90719986,850 +DA/HE-341,Allberg,,50.79919815,8.53390026,528 +DA/HE-342,Hilsberg,,50.80390167,8.50469971,526 +DA/HE-343,Daubhaus,,50.79499817,8.53139973,552 +DA/HE-344,Schindeberg,,50.78030014,8.46669960,553 +DA/HE-345,Huelsberg,,50.77030182,8.47080040,503 +DA/HE-346,Ebersberg,,50.77500153,8.48419952,508 +DA/HE-347,Wuergeloh,,50.77470016,8.45170021,564 +DA/HE-348,Hirschhohl,,50.75780106,8.43920040,502 +DA/HE-349,Hornberg,,50.83919907,8.55720043,451 +DA/HE-350,Kappe,,50.84000015,8.60190010,494 +DA/HE-351,Kronenberg,,50.83560181,8.58689976,454 +DA/HE-352,Eichelhardt,,50.83720016,8.57219982,465 +DA/HE-353,Loewenburg,,51.31219864,9.41559982,300 +DA/HE-354,Schloss Wilhelmshoehe,,51.31809998,9.41559982,305 +DA/HE-355,Hermannsberg,,50.93000031,9.43809986,526 +DA/HE-356,Wilsberg,,50.90499878,9.41110039,598 +DA/HE-357,Bornstrauchkoppe,,50.89419937,9.39809990,550 +DA/HE-358,Ellersberg,,50.53679800,9.26531800,621 +DA/HE-359,Herrhain,,50.52999878,9.36919975,486 +DA/HE-360,Feldkruecker Hoehe,,50.53810120,9.18560028,640 +DA/HE-361,Roellberg,,50.46310043,9.43389988,481 +DA/HE-362,Steinmauer,,50.40779877,9.45279980,451 +DA/HE-363,Kaupe,,50.40079880,9.44110012,472 +DA/HE-364,Weiperzberg,,50.29999924,9.59689999,504 +DA/HE-365,Leimberg,,50.29219818,9.58670044,503 +DA/HE-366,Schnepfenkopf,,50.27310181,9.45750046,490 +DA/HE-367,Lindenberg,,50.02000046,9.31859970,402 +DA/HE-368,Steigkoppe,,50.04249954,9.30529976,502 +DA/HE-369,Rabenkopf,,50.04059982,7.98999977,523 +DA/HE-370,Mittelberg,,49.58470154,9.04109955,507 +DA/HE-371,Elseberg,,49.57669830,9.00689983,518 +DA/HE-372,Krappenbuckel,,49.57920074,8.95189953,487 +DA/HE-373,Hoher Zorn,,49.69829941,8.92189980,495 +DA/HE-374,Kottenberg,,49.55059814,8.82940006,551 +DA/HE-375,Toter Mann,,49.54389954,8.83749962,554 +DA/HE-376,Goetzenstein,,49.55329895,8.76939964,522 +DA/HE-377,Hohberg,,49.53639984,8.77859974,537 +DA/HE-378,Waldskopf,,49.54000092,8.76970005,538 +DA/HE-379,Galgenberg,,50.18690109,8.86359978,188 +DA/HE-380,Schulzenberg,,50.55720139,9.61830044,370 +DA/HE-381,Haimberg,,50.54859924,9.59780025,409 +DA/HE-382,Roter Buckel,,49.64310074,9.07079983,540 +DA/HE-383,Erzberg,,49.65449905,8.81690025,485 +DA/HE-384,Hoschbachshoehe,,49.68439865,8.89999962,474 +DA/HE-385,Lannertskopf,,49.54970169,8.86419964,472 +DA/HE-386,Eichelberg,,50.14110184,8.20110035,535 +DA/HE-387,Galgen,,49.77420044,8.66329956,375 +DA/HE-388,Meisenberg,,49.58029938,8.86060047,538 +DA/HE-389,Schlossberg,,8.66810036,381,Ruine Frankenstein +DA/HE-390,Atzelberg,,50.17530060,8.38809967,507 +DA/HE-391,Rinke,,49.51720047,8.84560013,489 +DA/HE-392,Schnappgalgen,,49.60749817,8.93939972,462 +DA/HE-393,Geisberg,,49.63280106,8.95170021,441 +DA/HE-394,Veste Otzberg,,49.81940079,8.91110039,368 +DA/HE-395,Rassel,,50.14500046,8.25559998,539 +DA/HE-396,Gickelsberg,,49.53749847,8.99250031,554 +DA/HE-397,Altscheuer,,49.76449966,8.79220009,376 +DA/HE-398,Schildenberg,,49.52890015,9.09829998,552 +DA/HE-399,Bacharacher Kopf,,50.00080109,7.87080002,342 +DA/HE-400,Fichtenkopf,,49.98360062,7.89139986,348 +DA/HE-401,Schlaeferskopf,,50.10810089,8.16689968,454 +DA/HE-402,Weilsberg,,50.23170090,8.43000031,701 +DA/HE-403,Floersbacher Hoehe,,50.13219833,9.43389988,531 +DA/HE-404,Breuberg,,49.81999969,9.03999996,337 +DA/HE-405,Kolbenberg,,50.24219894,8.49610043,684 +DA/HE-406,Kirschenhell,,50.33000183,8.41609955,467 +DA/HE-407,Wolfskueppel,,50.30500031,8.41250038,545 +DA/HE-408,Eichkopf,,50.18610001,8.41499996,563 +DA/HE-409,Romberg,,50.19390106,8.45330048,541 +DA/HE-410,Knodener Kopf,,49.69670105,8.71080017,511 +DA/HE-411,Laermfeuer,,49.66559982,8.89500046,502 +DA/HE-412,Grossersloh,,50.86500168,8.45499992,548 +DA/HE-413,Steinfirst,,49.61000061,8.87419987,566 +DA/HE-415,Breiter Stein,,51.37158585,9.48769379,248 +DA/HE-416,Eichholzkopf,,50.85305405,8.28999996,610 +DA/HE-417,Stiete,,50.84989929,8.36433029,545 +DA/HE-418,Eichwaeldchen,,50.86128998,8.31943989,608 +DA/HE-419,Osterkopf,,51.28939056,8.67183971,708 +DA/HE-420,Orenberg,,51.29177856,8.62071037,702 +DA/HE-421,Sasenberg (Tuermchen),,50.82907867,8.32528973,442 +DA/HE-422,Entenberg,,50.91796112,8.43367958,535 +DA/HE-423,Rothekopf,,51.33680344,8.62126446,681 +DA/HE-424,Hegekopf 2,,51.26969910,8.58864784,843 +DA/HE-425,Goldgrube,,50.22776031,8.52468967,492 +DA/HE-426,Stahlberg,,51.37186050,9.42704964,348 +DA/HE-427,Hohe Burg Homberg,,51.03674200,9.40629200,376 +DA/HE-428,Firnskuppe,,51.35162000,9.42460000,314 +DA/HE-429,Baunsberg,,0.00000000,0.00000000,413.4 +DA/HE-430,Wurmberg,,51.00000000,9.00000000,485 +DA/IS-001,Uwe Duene,,8.33047300,52.5,Sylt +DA/IS-002,Olde Duene,,53.60987000,6.71950000,21 +DA/IS-003,Hohe Duene / Wasserturm,,53.67983700,6.99822500,22 +DA/IS-004,Walter-Grossmann-Duene,,53.71928000,7.19527000,25 +DA/IS-005,Aussichtsduene Baltrum,,53.72726000,7.39361000,19 +DA/IS-006,Melkhoernduene,,53.75271000,7.53579000,21 +DA/IS-007,Weisse Duene,,53.77701000,7.68888000,24 +DA/IS-008,Aussichtsduene Wangerroge,,53.79048500,7.89325000,19 +DA/IS-009,Aussichtsduene Amrum,,54.67482000,8.32712000,32 +DA/IS-010,Pinneberg,,54.18659900,7.87546200,61.3 +DA/IS-011,Aussichtsduene,,7.91143000,6,Die Duene +DA/IS-012,Hinrichsberg,,54.42447000,11.28124000,28 +DA/IS-013,Bakenberg,,54.59741000,13.11678000,72 +DA/IS-014,Golm,,53.88659000,14.19961000,69 +DA/IS-015,Kickelberg,,54.00231200,11.42542000,25 +DA/IS-016,Schoeninselberg,,53.76014900,12.16522800,24 +DA/IS-017,Werder Gipfelkreuz,,53.49015700,12.33046100,95 +DA/IS-018,Scherbelsberg,,52.10977130,11.64893360,49 +DA/KW-001,Brunnsteinspitze,,47.40560150,11.28719997,2180 +DA/KW-002,Rotwandlspitze,,47.40689850,11.28919983,2190 +DA/KW-003,Kirchlespitze,,47.41559982,11.29279995,2302 +DA/KW-004,Suedl. Linderspitze,,47.42219925,11.29030037,2305 +DA/KW-005,Noerdl. Linderspitze,,47.42810059,11.29310036,2374 +DA/KW-006,Gerberkreuz,,47.42689896,11.28689957,2303 +DA/KW-007,Karwendelkoepfe,,47.43579865,11.29720020,2365 +DA/KW-008,Viererspitze,,47.43809891,11.29500008,2053 +DA/KW-009,Kreuzwand,,47.43690109,11.30140018,2132 +DA/KW-010,Drei Kirchln,,47.43000031,11.30580044,2245 +DA/KW-011,Grosskarspitzen,,47.44720078,11.33440018,2426 +DA/KW-012,Baeralpkopf,,47.44689941,11.39029980,2337 +DA/KW-013,Schlichtenkarspitze,,47.44689941,11.40439987,2477 +DA/KW-014,Feldernkreuz,,47.49140167,11.32940006,2048 +DA/KW-015,Feldernkopf,,47.48360062,11.33580017,2071 +DA/KW-016,Soiernschneid,,47.48170090,11.34109974,2174 +DA/KW-017,Reissende Lahnspitze,,47.48030090,11.34440041,2209 +DA/KW-018,Dreierspitze,,47.49689865,11.38109970,1953 +DA/KW-019,Baierkarspitze,,47.50249863,11.38609982,1909 +DA/KW-020,Fermerskopf,,47.48860168,11.38000011,1850 +DA/KW-021,Galgenstangenkopf,,47.51190186,11.40359974,1805 +DA/KW-022,Westl.Torjoch,,47.50640106,11.50279999,1833 +DA/KW-023,Oestl.Torjoch,,47.50999832,11.54109955,1818 +DA/MF-001,Muehltahleck,,47.65560150,11.65999985,1518 +DA/MF-002,Silberkopf,,47.65530014,11.70059967,1540 +DA/MF-003,Daffenstein,,47.64279938,11.78030014,1538 +DA/MF-004,Brandkopf,,47.65610123,11.65279961,1569 +DA/MF-005,Sonnberg,,47.62919998,11.67469978,1572 +DA/MF-006,Rieselsberg,,47.59439850,11.84969997,1574 +DA/MF-007,Spitzkamp,,47.65890121,11.65439987,1603 +DA/MF-008,Ochsenkamp,,47.66609955,11.66609955,1594 +DA/MF-009,Schildenstein,,47.59529877,11.72469997,1613 +DA/MF-010,Lahnerkopf,,47.63809967,11.82330036,1628 +DA/MF-011,Grubereck,,47.63940048,11.78530025,1671 +DA/MF-012,Rotkogel,,47.60919952,11.85499954,1687 +DA/MF-013,Rossstein,,47.63389969,11.67609978,1698 +DA/MF-014,Blankenstein,,47.64080048,11.80280018,1768 +DA/MF-015,Blaubergkopf,,47.59000015,11.76720047,1787 +DA/MF-016,Riederstein,,47.70420074,11.79389954,1207 +DA/MF-017,Rainerkopf,,47.68560028,11.84220028,1464 +DA/MF-018,Stuempfling,,47.66220093,11.85610008,1506 +DA/MF-019,Wasserspitz,,47.68000031,11.83530045,1552 +DA/MF-020,Rinnerspitz,,47.67440033,11.83419991,1611 +DA/MF-021,Steilenberg,,47.66030121,11.95829964,1503 +DA/MF-022,Nagelspitz,,47.68470001,11.90810013,1554 +DA/MF-023,Kreuzbergspitzl,,47.61780167,11.93529987,1567 +DA/MF-024,Heissenplatte,,47.68310165,11.93060017,1583 +DA/MF-025,Auerberg,,47.63690186,11.94610023,1666 +DA/MF-026,Maroldschneid,,47.64360046,11.96669960,1688 +DA/MF-027,Taubenstein,,47.65859985,11.92080021,1692 +DA/MF-028,Benzingspitz,,47.67309952,11.91189957,1736 +DA/MF-029,Ruchenkoepfe,,47.64860153,11.94859982,1805 +DA/MF-030,Eibelkopf,,47.72750092,11.99170017,1312 +DA/MF-031,Sudelfeldkopf,,47.66500092,12.04279995,1436 +DA/MF-032,Schweinsberg,,47.71310043,11.98750019,1511 +DA/MF-033,Kirchelwand,,47.71360016,12.01669979,1521 +DA/MF-034,Bruennsteinschanze,,47.65169907,12.08139992,1547 +DA/MF-035,Vogelsang,,47.66189957,12.03390026,1563 +DA/MF-036,Jaegerwand,,47.65079880,12.04609966,1603 +DA/MF-037,Hochsalwand,,47.71670151,12.03559971,1624 +DA/MF-038,Kl. Traithen,,47.65470123,12.03579998,1722 +DA/MF-039,Steilner Joch,,47.64559937,12.05440044,1747 +DA/MF-040,Unterbergerjoch,,47.64390182,12.04389954,1829 +DA/MF-041,Semmelberg,,47.71250153,11.69559956,1102 +DA/MF-042,Fentberg,,47.84389877,11.78859997,807 +DA/MF-043,Wattenburger Kogel,,47.74560165,11.79749966,938 +DA/MF-044,Rainerberg,,47.73310089,11.82530022,1169 +DA/MF-045,Stadlberg,,47.76779938,11.85439968,924 +DA/MF-046,Buchbichl,,47.76190186,11.90359974,824 +DA/MF-047,Irschenberg,,47.83110046,11.92000008,743 +DA/MF-048,Hocheck,,47.77249908,11.97719955,899 +DA/ND-001,Helpter Berge,,53.48609924,13.60890007,179 +DA/ND-002,Ruhner Berge,,53.29719925,11.90499973,176 +DA/ND-003,Piekberg,,54.55329895,13.62810040,161 +DA/ND-004,Hagelberg,,52.13830185,12.51690006,200 +DA/ND-005,Wacheberge,,52.08670044,12.35470009,173 +DA/ND-006,Meuselberge,,52.11920166,14.56830025,159 +DA/ND-007,Rauener Berge,,52.32030106,14.03919983,153 +DA/ND-008,Dubrower Berge,,52.31359863,14.11030006,150 +DA/ND-009,Bungsberg,,54.20940018,10.72439957,168 +DA/ND-010,Golmberg,,52.01580048,13.34280014,178 +DA/ND-011,Kutschenberg,,51.36470032,13.72669983,200 +DA/ND-012,Hoher Berg,,51.61220169,14.57719994,183 +DA/ND-013,Lange Berge,,52.66749954,13.88889980,151 +DA/ND-014,Hutberg,,52.11439896,14.53670025,162 +DA/ND-015,Eichberge,,52.09059906,14.52029991,166 +DA/ND-016,Katzenberg,,52.12419891,12.38189983,178 +DA/ND-017,Gorrenberge,,52.05780029,12.35169983,173 +DA/ND-018,Frauenberg,,52.04359818,12.43190002,168 +DA/ND-019,Garrenberge,,52.03110123,12.53530025,188 +DA/ND-020,Schwarzer Berg,,52.03639984,12.40110016,160 +DA/ND-021,Brandberg,,51.59529877,14.54940033,175 +DA/ND-022,Spitzberg,,51.58639908,14.47719955,161 +DA/ND-023,Lissberg,,51.61080170,14.72719955,150 +DA/ND-024,Horlitzaberg,,51.58029938,14.54279995,168 +DA/ND-025,Felixturm,,51.61669922,14.54810047,163 +DA/ND-026,Spuelenberg,,52.08140182,12.37889957,166 +DA/ND-027,Kesselberg,,51.70420074,13.94530010,161 +DA/ND-028,Heidehoehe,,51.38470078,13.57559967,201 +DA/ND-029,Huettenberg,,52.12670135,12.42920017,179 +DA/ND-030,Waldkuppe,,52.15190125,12.49499989,187 +DA/ND-031,Grosser Hahnheider Berg,,53.61477280,10.45876408,126 +DA/ND-032,Pilsberg-Hessenstein,,54.32799911,10.54559994,126 +DA/ND-033,Strezerberg,,54.31069946,10.54749966,127 +DA/ND-034,Vossberg,,54.21910095,10.68169975,116 +DA/ND-035,Sternberg,,54.22420120,10.67469978,107 +DA/ND-036,Rabensberg,,54.21910095,10.69649982,103 +DA/ND-037,Hasselbrack,,53.43022156,9.86264038,116 +DA/ND-038,Scheelsberg,,54.42979813,9.65600014,106 +DA/ND-039,Kaltenborner Berge (Kahle Glatze),,51.92763138,14.66020966,116 +DA/ND-040,Briesener Berge,,52.25475693,12.52099705,103 +DA/ND-041,Goetzer Berg,,52.43590164,12.72715664,109 +DA/ND-042,Vorderer Loewendorfer Berg,,52.21914291,13.18832493,103 +DA/ND-043,Kleiner Hahnheider Berg,,53.62316513,10.44581985,100 +DA/ND-044,Weinberg,,52.06980133,14.56311035,136 +DA/ND-045,Diedrichshagener Berg,,54.10657883,11.76391029,129 +DA/ND-046,Springberg,,52.09822083,14.55832005,147 +DA/ND-047,Grosser Mueggelberg,,52.41645050,13.64192963,115 +DA/ND-048,Teufelsberg,,52.49743271,13.24100685,115 +DA/ND-049,Ahrensfelder Berge,,52.55638885,13.58166695,114 +DA/ND-050,Schaeferberg,,52.41722107,13.12749958,103 +DA/ND-051,Kienberg (Hellersdorfer Berg),,52.53472137,13.58111095,102 +DA/ND-052,Gollenberg,,52.74565887,12.39486313,109 +DA/ND-053,Krugberg,,52.58708954,14.08276939,129 +DA/ND-055,Langer Berg und Hohe Burg,,53.86265945,11.82933903,147.4 +DA/ND-057,Schmooksberg,,53.83805466,12.38277817,127 +DA/ND-058,Kraehenberge,,53.08315659,12.86710358,116 +DA/ND-059,Blocksberge,,53.11693954,12.75082970,118 +DA/ND-060,Eichholzberge,,53.13932037,12.75967979,111 +DA/ND-061,Kalkberge,,53.60162354,12.62154102,128 +DA/ND-062,Borgsberg,,53.59404373,12.68978500,110 +DA/ND-063,Heidberge,,53.79019547,12.54059029,100 +DA/ND-064,Luenenberg,,53.94866180,11.76544571,118 +DA/ND-065,Boner Berg,,54.53867722,13.60820007,147 +DA/ND-066,Tenzer Berg,,54.54097748,13.64153385,150 +DA/ND-067,Erdbeerberg,,54.54493713,13.66133308,134 +DA/ND-068,Magelowberg,,54.57060242,13.61849499,117 +DA/ND-069,Kalkberg,,54.10907745,11.77117634,112 +DA/ND-070,Grosser Jaegerberg,,54.11517334,11.76518822,110 +DA/ND-071,Jaegerberg,,54.11289978,11.75811481,100 +DA/ND-072,Zimmerberg,,54.11973190,11.74629688,110 +DA/ND-073,Wehlaberg,,52.05950928,13.80263042,144 +DA/ND-074,Kranichsberg,,52.44483185,13.77622986,104.5 +DA/ND-075,Tabaksberg,,53.70188522,12.45881176,106 +DA/ND-076,Tannenberg,,53.70826340,12.47896481,107 +DA/ND-077,Buchenberg,,53.69912338,12.53618145,103 +DA/ND-078,Schmiedeberg,,53.73850632,12.60578156,105 +DA/ND-079,Huetteberge,,53.73735809,12.60088539,100 +DA/ND-080,Kahler Berg,,53.73120880,12.63742542,104 +DA/ND-081,Adlersberg,,53.74124908,12.64895439,104 +DA/ND-082,Ostberg,,53.74246979,12.63864803,115 +DA/ND-083,Gralberg,,54.52882004,13.63599682,127 +DA/ND-084,Hoch Selow,,54.55310059,13.59364414,137 +DA/ND-085,Koenigsberg,,54.55785751,13.59629154,140 +DA/ND-086,Langer Berg,,54.56086349,13.58397007,130 +DA/ND-087,Kikberg,,54.55799484,13.58033085,131 +DA/ND-088,Mattowberg,,54.55610275,13.60701084,150 +DA/ND-089,Kollicker Berge,,54.55896378,13.66286373,116 +DA/ND-090,Hardtberg,,53.79494858,12.69573021,124 +DA/ND-091,Harkenberg,,53.77141571,12.73057938,108 +DA/ND-092,Bobenberg,,53.78049469,12.71547318,107 +DA/ND-093,Trudelberg,,53.09933472,12.82030773,100 +DA/ND-094,Kaeflingsberge,,53.42912292,12.85831738,100 +DA/ND-095,Butterberg,,53.96114731,11.75464153,114 +DA/ND-096,Rotemoorberg,,53.27494812,13.00438309,105 +DA/ND-097,Semmelsberg,,52.74132919,13.96207809,158 +DA/ND-098,Kleiner Ravensberg,,52.36137009,13.06666946,114 +DA/ND-099,Grosser Ravensberg,,52.35083389,13.06660748,108 +DA/ND-100,Tempelberg,,54.38056946,13.62727928,107 +DA/ND-101,Wietkikenberg,,52.30767822,12.94997978,125 +DA/ND-102,Raeuberberg,,52.18841934,12.58076000,130 +DA/ND-103,Hansjuergenberg,,52.17287064,12.54020023,138 +DA/ND-104,Bosdorfer Berg,,52.17623901,12.54037952,134 +DA/ND-105,Granziner Heidberge,,53.45291138,10.83615971,103 +DA/ND-106,Katenberg,,53.37634000,12.33858000,101 +DA/ND-107,Hirschberg,,53.36647000,12.39652000,106 +DA/ND-110,Dusterholzberg,,53.39597800,12.46417200,120 +DA/ND-111,Windmuehlenberg,,53.87406400,11.61353600,102 +DA/ND-112,Kerberg,,53.87091400,11.23088900,100 +DA/ND-113,Weinberge,,53.45377400,12.37870900,101 +DA/ND-114,Kraehenberg,,53.97673900,11.79587200,110 +DA/ND-115,Hellberg,,53.98066400,11.80224500,103 +DA/ND-116,Spitzer Berg,,51.63184000,14.69662000,155 +DA/ND-117,Weinberg(Wolfshuegel),,51.61978000,14.71087000,152 +DA/ND-118,Scholverberg,,53.34626600,13.45443200,115 +DA/ND-119,Reiherberg,,53.35613400,13.43851100,143 +DA/ND-120,Schlossberg,,53.35540900,13.45087500,121 +DA/ND-121,Wartberg,,53.06360100,12.78813600,112 +DA/ND-122,Steiler Hagen,,52.03511100,12.57892500,153 +DA/NI-001,Wolfswarte,,51.79029846,10.50249958,918 +DA/NI-002,Quietschenberg,,51.79639816,10.57830048,882 +DA/NI-003,Grosse Klippe,,51.74829865,10.61419964,824 +DA/NI-004,Lerchenkoepfe,,51.80170059,10.53279972,821 +DA/NI-005,Abbenstein,,51.81359863,10.56219959,769 +DA/NI-006,Bocksberg,,51.85639954,10.35610008,723 +DA/NI-007,Altestalkopf,,51.85060120,10.41030025,693 +DA/NI-008,Ravensberg,,51.62110138,10.52670002,659 +DA/NI-009,Hasselkopf,,51.71189880,10.61719990,612 +DA/NI-010,Bockwieser Hoehe,,51.82360077,10.33419991,610 +DA/NI-011,Blockkoetenkopf,,51.75579834,10.33860016,585 +DA/NI-012,Hoheharz,,51.63529968,10.64529991,584 +DA/NI-013,Burgberg,,51.87170029,10.56669998,483 +DA/NI-014,Steinberg,,51.90689850,10.40559959,472 +DA/NI-015,Eichenberg,,51.61750031,10.60719967,460 +DA/NI-016,Heidberg,,52.21670151,7.94969988,165 +DA/NI-017,Silberberg,,52.20999908,7.95310020,180 +DA/NI-018,Heidhornberg,,52.22579956,7.95720005,180 +DA/NI-019,Borgberg,,52.18109894,7.96470022,225 +DA/NI-021,Heidhornberg,,52.17610168,8.00720024,202 +DA/NI-023,Kahle Berg,,52.15890121,8.01249981,211 +DA/NI-024,Nottberg,,52.18310165,8.01609993,241 +DA/NI-025,Baumannsknollen,,52.19405000,8.01808000,245 +DA/NI-026,Grafensundern,,52.18109894,8.03279972,314 +DA/NI-027,Bardinghaussundern,,52.19250107,8.03359985,219 +DA/NI-028,Rehremberg,,52.18920135,8.05109978,243 +DA/NI-029,Hochholz,,52.18000031,8.06830025,263 +DA/NI-030,Kleiner Freeden,,52.15689850,8.07610035,200 +DA/NI-031,Grosser Freeden,,52.15890121,8.09060001,269 +DA/NI-032,Musenberg,,52.18080139,8.09189987,256 +DA/NI-033,Dornsberg,,52.38420105,8.09220028,151 +DA/NI-034,Hohnsberg,,52.16360092,8.10309982,242 +DA/NI-035,Schmittenhoehe / Kalkrieser Berg,,52.39609909,8.11750031,157 +DA/NI-036,Luedenstein,,52.11389923,8.12749958,208 +DA/NI-037,Venner Egge,,52.36000061,8.15670013,158 +DA/NI-038,Evensbrink,,52.15330124,8.16250038,235 +DA/NI-039,Huelsberg,,52.15470123,8.16779995,254 +DA/NI-040,Hohnangel,,52.14390182,8.17529964,262 +DA/NI-041,Wehdeberg,,52.13970184,8.17940044,258 +DA/NI-042,Borgloher Egge,,52.15530014,8.18529987,242 +DA/NI-043,Asberg,,52.13750076,8.18999958,244 +DA/NI-044,Lohnberg,,52.15719986,8.20110035,213 +DA/NI-045,Petersbrink,,52.13020000,8.20190000,212 +DA/NI-046,Steinbrink,,52.14580154,8.20189953,191 +DA/NI-047,Schollegge,,52.12939835,8.21189976,252 +DA/NI-048,Sahlbrink,,52.13439941,8.22280025,244 +DA/NI-049,Steinegge,,52.12810135,8.22280025,266 +DA/NI-052,Stirper Berg,,52.33000183,8.28639984,154 +DA/NI-053,Neuenkirchener Berg,,52.12580109,8.29780006,220 +DA/NI-055,Sonnenbrink,,52.31436000,8.32695000,175 +DA/NI-056,Born,,52.30921400,8.34287000,190 +DA/NI-058,Meller Berge / Diedrichsburg,,52.23189926,8.35109997,218 +DA/NI-063,Linner Berg,,52.28475000,8.39279000,182 +DA/NI-066,Kleiner Kellenberg,,52.27389908,8.42329979,161 +DA/NI-068,Grosser Kellenberg,,52.26440048,8.44859982,211 +DA/NI-069,Hans-Kuehnenburg,,51.72779846,10.40279961,811 +DA/NI-070,Grosser Sonnenberg,,51.75579834,10.51669979,853 +DA/NI-071,Matthias-Schmidt-Berg,,51.70360184,10.52499962,653 +DA/NI-072,Glockenberg,,51.70579910,10.51280022,627 +DA/NI-073,Beerberg,,51.70920181,10.53110027,658 +DA/NI-074,Kuppe,,51.72560120,10.50889969,729 +DA/NI-075,Mittelberg,,51.80690002,10.50469971,667 +DA/NI-076,Grosser Wiesenberg,,51.84640121,10.42280006,645 +DA/NI-077,Kleintalsberg,,51.85919952,10.41189957,677 +DA/NI-078,Dicker Kopf,,51.86940002,10.43330002,678 +DA/NI-079,Brautstein,,51.87939835,10.45470047,648 +DA/NI-080,Kaesteklippe,,51.86809921,10.48330021,605 +DA/NI-081,Nordberg,,51.90969849,10.38829994,458 +DA/NI-082,Hasenberg,,51.82830048,10.25389957,572 +DA/NI-083,Strutberg,,51.69250107,9.60560036,444 +DA/NI-084,Moosberg,,51.75310135,9.55189991,509 +DA/NI-085,Kleiner Sonnenberg,,51.74969864,10.52690029,853 +DA/NI-086,Balos,,51.69029999,9.81809998,379 +DA/NI-087,Hengstruecken,,51.68690109,9.71829987,424 +DA/NI-088,Tonkuhlenkopf,,51.74079895,9.57970047,470 +DA/NI-089,Scheerenberg,,51.74499893,10.30189991,487 +DA/NI-090,Grosser Staufenberg,,51.36109924,9.63809967,403 +DA/NI-091,Vorderer Ebersberg,,51.68000031,10.64780045,679 +DA/NI-092,Hohe Warte,,52.25669861,9.48390007,379 +DA/NI-093,Kalenberg,,51.68000031,9.59640026,310 +DA/NI-094,Schwarzer Brink,,52.29140091,8.44530010,211 +DA/NI-095,Eschenberg,,53.05054855,10.48021030,100 +DA/NI-096,Venner Berg,,52.39083862,8.13142014,158 +DA/NI-097,Schleptruper Egge,,52.37356949,8.03139019,178 +DA/NI-098,Penter Knapp,,52.38219070,7.99720001,108 +DA/NI-099,Steinberg,,52.36751938,8.08399963,140 +DA/NI-100,Westerberg,,52.32508850,8.29829979,156 +DA/NI-101,Osterberg,,52.31684000,8.32164000,172 +DA/NI-102,Westerberg,,52.30335999,8.35676956,195 +DA/NI-103,Osterberg,,52.29008000,8.38107000,187 +DA/NI-104,Haster Berg,,52.31895828,8.05873013,120 +DA/NI-105,Steinbrink,,52.30223846,8.43785000,161 +DA/NI-106,Holzhauser Berg,,52.25373840,8.34755039,229 +DA/NI-107,Oldendorfer Berg,,52.25168991,8.32190037,220 +DA/NI-108,Westerhauser Berg,,52.25233841,8.30408001,192 +DA/NI-109,Adolfsberg,,52.23347855,8.36182022,220 +DA/NI-110,Eickener Egge,,52.22970963,8.36973953,206 +DA/NI-111,Grosser Zuschlag,,52.26931000,8.26710987,165 +DA/NI-112,Langerke,,52.25996017,8.28923988,166 +DA/NI-113,Dicker Brink,,52.27262878,8.29533005,174 +DA/NI-114,Eimkenort,,52.27067184,8.31412029,208 +DA/NI-115,Lohbrink,,52.29561996,8.27789021,130 +DA/NI-116,Alt Schledehausener Berg,,52.29248810,8.23097038,124 +DA/NI-117,Wulfter Berg,,52.29764175,8.22128010,114 +DA/NI-118,Dingelrott,,52.31071091,8.21319962,141 +DA/NI-119,Wellinger Berg,,52.29124069,8.19126987,135 +DA/NI-120,Halter Berg,,52.29647827,8.16368961,135 +DA/NI-121,Lechtenbrink,,52.27864075,8.16351986,146 +DA/NI-122,Gattberg,,52.32341003,8.12812996,128 +DA/NI-123,Auf dem Horn,,52.37971115,8.13313007,143 +DA/NI-124,Westerberg,,52.37588882,8.07843971,140 +DA/NI-125,Laerchenberg,,52.36425018,8.13747978,109 +DA/NI-126,Icker Egge,,52.36074829,8.12903023,144 +DA/NI-127,Vossberg,,52.36648178,8.03573990,109 +DA/NI-128,Kettelsberg,,52.44054031,7.90473986,104 +DA/NI-129,Queckenberg,,52.53968048,7.76113987,131 +DA/NI-130,Trillenberg,,52.50397873,7.84175014,141 +DA/NI-131,Krippenfeldberg,,52.52420044,7.78650999,123 +DA/NI-132,Kolkenberg,,52.52008057,7.79790020,120 +DA/NI-133,Lehmberg,,52.56219864,7.75559998,108 +DA/NI-134,Hohes Haus,,52.56108093,7.72178984,100 +DA/NI-135,Schnaatberg,,52.54499817,7.73905993,122 +DA/NI-136,Spatelsberg,,52.53089905,7.77490997,126 +DA/NI-137,Pennigsberg,,52.53924179,7.79442978,111 +DA/NI-138,Wellenberg,,52.52782059,7.77240992,115 +DA/NI-139,Bramberg,,52.52080917,7.74270010,100 +DA/NI-140,Steinberg,,52.51461029,7.77907991,117 +DA/NI-141,Kuhberg,,52.51293945,7.78483009,122 +DA/NI-142,Hamberg,,52.51005173,7.78801012,116 +DA/NI-143,Boberg,,52.50899887,7.80364990,116 +DA/NI-144,Weserberg,,52.50291061,7.82428980,112 +DA/NI-145,Schillerberg,,52.51179886,7.82766008,133 +DA/NI-146,Rocksberg,,52.49539185,7.81351995,107 +DA/NI-147,Wakesberg,,52.50817871,7.85727978,122 +DA/NI-148,Kraehenberg,,52.51808167,7.87241983,104 +DA/NI-149,Glinsberg,,52.48003006,7.84257984,111 +DA/NI-150,Frettberg,,52.42575836,7.92958021,105 +DA/NI-151,Hoehneberg,,52.18700027,7.92369986,153 +DA/NI-152,Hohler Berg,,52.19966888,7.91351986,131 +DA/NI-153,Mittelberg,,52.19141006,7.93871021,169 +DA/NI-154,Dickner Berg,,52.23509979,7.93942022,108 +DA/NI-155,Ortenbrink,,52.23081970,7.96360016,121 +DA/NI-156,Roter Berg,,52.22872925,7.94111013,108 +DA/NI-157,Domprobst Sundern,,52.21630859,7.99561977,155 +DA/NI-158,Holzhauser Berg,,52.20782089,8.01723957,183 +DA/NI-159,Lammersbrink,,52.19818878,8.03207970,187 +DA/NI-160,Urberg,,52.17052078,8.02215004,216 +DA/NI-161,Barenbrink,,52.18035889,8.04380035,280 +DA/NI-162,Twalsbrink,,52.17985916,8.06011009,240 +DA/NI-163,Vossbrink,,52.18458176,8.07703972,151 +DA/NI-164,Limberg,,52.16793823,8.08673954,197 +DA/NI-165,Langer Berg,,52.16001129,8.02363014,204 +DA/NI-166,Heidbrink,,52.15538025,8.14391041,225 +DA/NI-167,Aschendorfer Berg,,52.11019135,8.13469982,176 +DA/NI-168,Rudolfshoehe,,52.22735977,8.16792011,158 +DA/NI-169,Holter Berg,,52.22343826,8.19198990,189 +DA/NI-170,Selberg,,52.22533035,8.16707993,164 +DA/NI-171,Hollenberg,,52.18603897,8.18447971,166 +DA/NI-172,Hasberg,,52.17210007,8.18348980,159 +DA/NI-173,Weinberg,,52.21010971,8.20151997,190 +DA/NI-174,Asberg,,52.20344162,8.21926975,158 +DA/NI-177,Rechenbrink,,52.14303970,8.21061039,205 +DA/NI-178,Timmer Egge,,52.13489914,8.19060040,233 +DA/NI-179,Beutling,,52.14601135,8.26716995,219 +DA/NI-180,Bietendorfer Berg,,52.14456940,8.24571991,165 +DA/NI-181,Kerssenbrocker Berg,,52.13269043,8.27126026,185 +DA/NI-182,Hanstedter Berge,,53.22732162,9.97161007,125 +DA/NI-183,Hingstberg,,53.20568848,9.95188999,125 +DA/NI-184,Holzberg,,53.15628815,9.97681046,116 +DA/NI-185,Hoellenberg,,53.30062866,9.84974957,101 +DA/NI-186,Brunsberg,,53.29985809,9.83195972,127 +DA/NI-187,Sproetzer Hoehe,,53.30197144,9.81805038,110 +DA/NI-188,Lohberge,,53.28128052,9.81577969,113 +DA/NI-189,Hummelsberg,,53.26126099,9.95732021,106 +DA/NI-190,Dreiahnenberg,,53.23881912,10.05111027,109 +DA/NI-191,Ahrberg,,53.22959137,10.05268002,142 +DA/NI-192,Haskatersberg,,53.21855927,10.08804989,108 +DA/NI-193,Kraehenberg,,53.20264053,10.07289028,123 +DA/NI-194,Rothberg,,53.19324875,10.04722023,106 +DA/NI-195,Klinkenberg,,53.19132996,10.04059029,100 +DA/NI-196,Sommerberg,,53.17911148,10.11956978,120 +DA/NI-197,Heidberg,,53.17441177,10.14136028,111 +DA/NI-198,Hasenberg,,53.16802979,10.11270046,110 +DA/NI-199,Repenberg,,53.17129898,10.08026028,102 +DA/NI-200,Worthberg,,53.12696075,10.05957985,114 +DA/NI-201,Huetzeler Berg,,53.08237839,10.06087017,111 +DA/NI-202,Muetzenberg,,53.05447006,9.99874020,114 +DA/NI-203,Schellberge,,53.00251007,9.94606972,106 +DA/NI-204,Hellkuhlenberg,,53.10395050,10.39116955,107 +DA/NI-205,Hengelsberg,,53.08319092,10.33802032,100 +DA/NI-206,Kraehenberg,,53.11352158,10.31013966,106 +DA/NI-207,Timpenberg,,53.12186050,10.27231979,114 +DA/NI-208,Tellmer Berg,,53.09843826,10.31529999,113 +DA/NI-209,Suttberge,,53.08848190,10.29759979,102 +DA/NI-210,Westberg,,53.06423950,10.26562023,105 +DA/NI-211,Wietzer Berg,,52.87094879,10.08366013,102 +DA/NI-212,Luessberg,,52.83393097,10.33870983,131 +DA/NI-213,Schillohsberg,,52.82984924,10.23406029,112 +DA/NI-214,Hesterberg,,52.84310150,10.20800972,106 +DA/NI-215,Hausselberg,,52.85779953,10.18474007,115 +DA/NI-216,Eicksberg,,52.80852890,10.16026020,105 +DA/NI-217,Blauer Berg,,52.87860107,10.48550987,127 +DA/NI-218,Hoher Berg,,52.86819839,10.63256741,136 +DA/NI-219,Hoher Mechtin,,53.04410172,10.90962982,142 +DA/NI-220,Sareitzer Berg,,53.02997971,10.95487976,105 +DA/NI-221,Pampower Berg,,53.02508926,10.90480042,138 +DA/NI-222,Weisser Berg,,53.21076965,10.92115021,105 +DA/NI-223,Stadtberg,,53.21591187,10.80362034,106 +DA/NI-224,Kronsberg,,52.94498825,10.87252045,105 +DA/NI-225,Fuchsberge,,52.92134094,10.83574009,116 +DA/NI-226,Ledigsberg,,52.92531967,10.89457989,123 +DA/NI-227,Juchterberg,,52.87448883,10.82711029,110 +DA/NI-228,Koerberg,,52.85456085,10.83786011,109 +DA/NI-229,Pugelatz,,52.85570145,10.80747032,122 +DA/NI-230,Huelseberg,,52.52214813,8.13247013,115 +DA/NI-231,Wellenberg,,52.50922012,8.14068031,116 +DA/NI-232,Sproekelnberg,,52.51277161,8.14002037,121 +DA/NI-233,Kreuzberg,,52.50793076,8.12339973,117 +DA/NI-234,Kattenberg,,52.51438904,8.12924004,126 +DA/NI-235,Dreesberg,,52.50123978,8.10019016,100 +DA/NI-236,Steigenberg,,52.51137924,8.09844017,106 +DA/NI-237,Habichtsberg,,52.52885818,8.13535976,112 +DA/NI-238,Mordkuhlenberg,,52.54970169,8.21699047,142 +DA/NI-239,Stappenberg,,52.56232834,8.22576046,123 +DA/NI-240,Kronenberg,,52.53924179,8.18601036,124 +DA/NI-241,Gmeinenberge,,52.55318832,8.23536015,110 +DA/NI-243,Krebsburg,,52.34960938,8.17827034,146 +DA/NI-244,Lemfoerder Berg,,52.44715118,8.38362026,126 +DA/NI-245,Klei,,52.45444870,8.41308022,116 +DA/NI-246,Feldbrink,,52.45301819,8.43391991,126 +DA/NI-247,Nuppenberg,,53.35911942,9.86021996,115 +DA/NI-248,Stucksberg,,53.35992813,9.87759018,101 +DA/NI-249,Gannaberg,,53.40042877,9.86931992,149 +DA/NI-251,Kiekeberg,,53.43614960,9.89807034,125 +DA/NI-252,Huelsenberg,,53.40887833,9.86795044,155 +DA/NI-253,Fistelberge,,53.43183899,9.87368011,107 +DA/NI-254,Oesel,,52.12861252,10.59222221,156 +DA/NI-255,Kumpberg,,52.83345032,10.55251980,104 +DA/NI-256,Kalenberg,,52.23361969,9.59897804,310 +DA/NI-257,Lindenberg,,53.05208969,10.54214001,100 +DA/NI-258,Sangenberg,,51.92683029,10.27569008,566 +DA/NI-259,Wellenberg,,52.55987930,7.77273989,102 +DA/NI-260,Besterberg,,52.53342056,7.76042986,121 +DA/NI-261,Piusberg,,52.35034180,8.05486965,104 +DA/NI-262,Rammelsberg,,51.88742065,10.43157005,635 +DA/NI-263,Frickenberg,,51.92955399,10.30174255,461 +DA/NI-264,Lageswarte,,51.91478348,10.25131702,571 +DA/NI-265,Heimberg,,51.91287900,10.32885800,352 +DA/NI-266,Oberer Grosser Balkenberg,,51.92498779,10.25872040,573 +DA/NI-268,Kronsberg,,52.33599854,9.84360027,118 +DA/NI-269,Bolterberg,,53.16131100,9.93571000,160 +DA/NI-270,Stattberg,,53.15866000,9.93188400,145 +DA/NI-271,Galgenberg,,52.00817600,10.40285600,215 +DA/NI-272,Baerenkopf,,52.01893600,10.39748000,307 +DA/NI-273,Ellenberg,,52.19704000,7.99914000,175 +DA/NI-274,Teckelhagen,,52.19198000,8.04240000,195 +DA/NI-275,Kleeberg,,52.31509000,8.09990000,122 +DA/NI-276,Gramling,,52.31534000,8.17784000,133 +DA/NI-277,Friedeberg,,52.29422000,8.37186000,193 +DA/NI-278,Wittenberg,,51.59978689,9.97051656,386 +DA/NI-279,testberg 0,,52.00000000,8.00000000,222 +DA/NI-280,Hanfelder Huegel,,52.32425000,8.08780000,115 +DA/NI-281,Schinkelberg,,52.29508000,8.10445000,123 +DA/NI-282,Schoelerberg,,52.25176000,8.07413000,127 +DA/NI-283,Halterdaren,,52.31530000,8.19419000,151 +DA/NI-284,Harderberg,,52.23476000,8.05805000,155 +DA/NI-285,Grosse Egge,,52.21463000,8.09755000,167 +DA/NI-286,Dueingberg,,52.21764000,8.42221000,133 +DA/NI-287,Gesmoldsberg,,52.24025000,7.99422000,109 +DA/NI-288,Werscher Berg,,52.24476000,8.19865000,136 +DA/NI-289,Achelrieder Berg,,52.24174000,8.18451000,122 +DA/NI-290,Stockumer Berg,,52.24932000,8.17668000,133 +DA/NI-291,Eistruper Berg,,52.24487000,8.14041000,122 +DA/NI-292,Sandforter Berg,,52.25017000,8.12680000,139 +DA/NI-293,Haller Berg,,52.23986000,8.23206000,109 +DA/NI-294,Holtingbaenken,,52.22420000,8.21520000,147 +DA/NI-295,Hengelsberg,,52.22970000,8.11967000,142 +DA/NI-297,Benther Berg,,52.33816000,9.61641000,173 +DA/NW-001,Petersberg,,50.68640137,7.20830011,322 +DA/NW-002,Drachenfels,,50.66439819,7.21000004,321 +DA/NW-003,Wolkenburg,,50.66859818,7.21560001,324 +DA/NW-004,Lohrberg,,50.67190170,7.24940014,432 +DA/NW-005,Nonnenstromberg,,50.68560028,7.21969986,335 +DA/NW-006,Himmerich,,50.64390182,7.27330017,366 +DA/NW-007,Leyberg,,50.63249969,7.26639986,359 +DA/NW-008,Broderkonsberg,,50.64170074,7.28439999,354 +DA/NW-009,Grosser Breiberg,,50.66279984,7.23000002,313 +DA/NW-010,Hirschberg,,50.67330170,7.20919991,244 +DA/NW-011,Geisberg,,50.67060089,7.23140001,324 +DA/NW-012,Margarethenhoehe,,50.67720032,7.24940014,322 +DA/NW-013,Stenzelberg,,50.69139862,7.22580004,266 +DA/NW-014,Hohenhonnef,,50.65397000,7.24510000,235 +DA/NW-015,Dachsberg,,50.65140152,7.34359980,344 +DA/NW-016,Breselberg,,50.98139954,7.70809984,363 +DA/NW-017,Auf dem Huppen,,50.98059845,7.78609991,471 +DA/NW-018,Balzenberg,,50.98469925,7.87389994,434 +DA/NW-019,Martinshardt,,50.98749924,8.02029991,592 +DA/NW-020,Wilder Stein,,50.98030090,8.01109982,479 +DA/NW-021,Kleine Rausche,,50.81250000,8.05000019,443 +DA/NW-022,Kappenkopf,,51.12580109,7.74249983,549 +DA/NW-023,Bremberg,,51.19029999,8.49499989,809 +DA/NW-024,Poppenberg,,51.19279861,8.50889969,746 +DA/NW-025,Molbecke,,51.18140030,8.53279972,723 +DA/NW-026,Ruhrkopf,,51.21189880,8.55529976,696 +DA/NW-027,Langeberg,,51.17330170,8.54940033,662 +DA/NW-028,Katerkopf,,51.17580032,8.56309986,691 +DA/NW-029,Lagerstein,,51.17219925,8.57219982,732 +DA/NW-030,Hohe Seite,,51.17559814,8.59080029,682 +DA/NW-031,Hillekopf,,51.23970032,8.59939957,801 +DA/NW-032,Roesberg,,51.20560074,8.59640026,781 +DA/NW-033,Junge Grimme,,51.20470047,8.61610031,782 +DA/NW-034,Hopperkopf,,51.24750137,8.59920025,831 +DA/NW-035,Rimberg,,51.24689865,8.53719997,763 +DA/NW-036,Egge,,51.22389984,8.57470036,681 +DA/NW-037,Mosenberg,,51.23220062,8.57170010,675 +DA/NW-038,Grosser Hoecher Kopf,,51.21170044,8.61079979,764 +DA/NW-039,Teukelberg,,51.16360092,8.61170006,749 +DA/NW-040,Grosser Bromberg,,51.17580032,8.59080029,752 +DA/NW-041,Baerenberg,,51.17079926,8.51500034,744 +DA/NW-042,Burgberg,,50.69469833,6.44220018,401 +DA/NW-043,Steling,,50.57780075,6.21280003,656 +DA/NW-044,Klotenberg,,52.23669815,7.74580002,158 +DA/NW-045,Luetke Berg,,52.21860123,7.84919977,182 +DA/NW-046,Leedener Berg,,52.21559906,7.87190008,202 +DA/NW-047,Hohner Berg,,52.17419815,7.91389990,202 +DA/NW-049,Johannisegge (Luisenturm),,52.10749817,8.28499985,291 +DA/NW-050,Barenberg,,52.08440018,8.31999969,259 +DA/NW-051,Riesberg,,52.09360123,8.32330036,221 +DA/NW-052,Sundern,,52.10559845,8.32470036,178 +DA/NW-054,Linkenberg,,52.29940033,8.47169971,157 +DA/NW-055,Huenenburg,,52.01470184,8.47529984,302 +DA/NW-056,Jostberg,,52.01440048,8.48779964,286 +DA/NW-057,Kahler Berg,,52.01670074,8.50469971,248 +DA/NW-058,Limberg,,52.28189850,8.51389980,190 +DA/NW-059,Kaeseberg,,51.99000168,8.52579975,267 +DA/NW-060,Auf der Egge,,51.99470139,8.53310013,243 +DA/NW-061,Togdrang,,51.98080063,8.55360031,295 +DA/NW-062,Gloesinghauser Berg,,52.26491000,8.55945000,289 +DA/NW-063,Altes Verbrenn,,52.27015000,8.56665000,290 +DA/NW-064,Ebberg / Eiserner Anton,,51.97859955,8.58329964,303 +DA/NW-065,Kahlewart,,52.26980000,8.59500000,262 +DA/NW-066,Breitenbrink,,52.27456000,8.60499000,287 +DA/NW-067,Kniebrink,,52.27999878,8.61750031,315 +DA/NW-068,Ubbedisser Berg,,51.97750092,8.63000011,263 +DA/NW-069,Brunsberg,,51.95830154,8.64169979,242 +DA/NW-070,Schweichler Berg,,52.15530014,8.65110016,168 +DA/NW-071,Barkhauser Berge,,51.94609833,8.67609978,293 +DA/NW-072,Nettelstedter Berg,,52.29557000,8.68189000,288 +DA/NW-073,Homberg,,52.15110016,8.69690037,201 +DA/NW-074,Ravensberg,,51.94029999,8.69750023,305 +DA/NW-075,Hunneckenkammer,,51.94440079,8.70639992,326 +DA/NW-076,Heuberg,,52.14530182,8.70829964,172 +DA/NW-077,Schnathorster Berg / Eickhorster Berg,,52.28658000,8.71588000,247 +DA/NW-078,Eggeberg,,52.14440155,8.72220039,233 +DA/NW-079,Obernberg,,52.10390091,8.73560047,210 +DA/NW-080,Hermannsberg,,51.93140030,8.73830032,364 +DA/NW-081,Schwarzen Moor,,52.14310074,8.74310017,238 +DA/NW-082,Esbatzen,,51.93470001,8.74639988,278 +DA/NW-083,Elfter Kopf,,52.27580000,8.74653000,230 +DA/NW-084,Hoerster Berg,,51.92829895,8.75059986,308 +DA/NW-085,Kleiner Ehberg,,51.93330002,8.76140022,217 +DA/NW-086,Bergkirchener Kopf,,52.27046000,8.76352000,255 +DA/NW-087,Grosser Ehberg,,51.92419815,8.78030014,340 +DA/NW-088,Allhornberg,,51.92190170,8.79059982,315 +DA/NW-089,Haddenhauser Berg,,52.26250076,8.79139996,261 +DA/NW-090,Kahler Eberg,,51.92610168,8.81190014,224 +DA/NW-091,Lutternsche Egge,,52.25844000,8.81334000,262 +DA/NW-092,Zedling,,51.93109894,8.81420040,226 +DA/NW-093,Boberg,,52.09109879,8.81639957,267 +DA/NW-095,Eidinghauser Berg,,52.25423000,8.83730000,247 +DA/NW-096,Klusberg,,52.15499878,8.83749962,196 +DA/NW-097,Kortewebelshals,,51.88639832,8.83749962,386 +DA/NW-098,Hermansdenkmal,,51.91139984,8.83940029,386 +DA/NW-099,Allarstein,,51.91439819,8.84169960,356 +DA/NW-100,Ebenoede,,52.17530060,8.84189987,237 +DA/NW-101,Hellberg,,51.90470123,8.84389973,346 +DA/NW-102,Steinberg,,52.18080139,8.84939957,196 +DA/NW-103,Eiberg,,52.13309860,8.84939957,230 +DA/NW-104,Moenkeberg,,52.06280136,8.84889984,224 +DA/NW-105,Duesterlau,,51.88190079,8.85330009,417 +DA/NW-106,Bickplecken,,52.10419846,8.85439968,276 +DA/NW-107,Rotenberg,,51.97829819,8.85919952,244 +DA/NW-108,Hahnberg,,51.89580154,8.86499977,325 +DA/NW-109,Grosser Gausekoeterberg,,51.86690140,8.86499977,367 +DA/NW-110,Limberg,,51.98440170,8.87360001,215 +DA/NW-111,Haverstaedter Berg,,52.24891000,8.87586000,268 +DA/NW-112,Falkenburg,,51.87580109,8.87969971,373 +DA/NW-113,Saalegge,,52.14310074,8.88329983,300 +DA/NW-114,Ruschberg,,52.15140152,8.88780022,295 +DA/NW-115,Stemberg,,51.87810135,8.88969994,402 +DA/NW-116,Gretberg,,51.98749924,8.89330006,253 +DA/NW-117,Falkenberg,,51.87080002,8.89360046,346 +DA/NW-118,Oberer Langenberg,,51.86360168,8.89000034,418 +DA/NW-119,Baerenstein,,51.87110138,8.91189957,316 +DA/NW-120,Toensberg,,51.95330048,8.67609978,333 +DA/NW-121,Reischlagsberg,,51.67079926,8.88809967,362 +DA/NW-122,Kleeberg,,52.06389999,8.98060036,360 +DA/NW-123,Hesseler Berge,,52.07249832,8.34920025,240 +DA/NW-125,Knuell,,52.07080078,8.37310028,254 +DA/NW-126,Storkenberg,,52.06689835,8.38189983,234 +DA/NW-127,Gartnischberg,,52.05640030,8.38329983,228 +DA/NW-129,Jakobsberg,,52.03310013,8.41279984,217 +DA/NW-131,Bussberg,,52.03310013,8.43190002,306 +DA/NW-133,Die Hoeh,,50.73860168,8.10779953,598 +DA/NW-134,Katzenknipp,,50.75329971,6.38280010,371 +DA/NW-135,Gieschhardt,,50.72439957,6.41860008,357 +DA/NW-136,Heidkopf,,50.68190002,6.45219994,361 +DA/NW-137,Mausauel,,50.70859909,6.45669985,388 +DA/NW-138,Roedelsberg,,50.65689850,6.50829983,362 +DA/NW-139,Sonnenberg,,50.64139938,6.48829985,393 +DA/NW-140,Wildbretshuegel,,50.61610031,6.42059994,525 +DA/NW-141,Rossberg,,50.67169952,6.45809984,384 +DA/NW-142,Wolfsberg,,50.50189972,6.44859982,528 +DA/NW-143,Pferdekopf,,50.51940155,6.53940010,527 +DA/NW-144,Kindshardt,,50.53919983,6.52309990,530 +DA/NW-145,Rathberg,,50.54719925,6.50670004,493 +DA/NW-146,Viriolsberg,,50.50360107,6.41190004,543 +DA/NW-147,Alteburg,,50.44499969,6.74669981,529 +DA/NW-148,Heidbusch,,50.41529846,6.66610003,524 +DA/NW-149,Stromberg,,50.39419937,6.63689995,559 +DA/NW-150,Hirnberg,,50.55810165,6.73500013,456 +DA/NW-151,Giersberg,,50.56420135,6.78109980,420 +DA/NW-152,Fanisberg,,50.53919983,6.79250002,507 +DA/NW-153,Hoehenberg,,50.37060165,6.45669985,600 +DA/NW-154,Buddelberg,,52.16500092,8.01189995,167 +DA/NW-155,Hohe Poen,,51.26670074,8.62279987,793 +DA/NW-156,Wellershoehe,,51.11830139,8.53310013,812 +DA/NW-158,Donoer Berg,,52.26081000,8.54609000,242 +DA/NW-159,Babilonie,,52.27414000,8.57760000,256 +DA/NW-160,Reineberg,,52.29405000,8.62981000,274 +DA/NW-161,Gehlenbecker Berg,,52.29699000,8.65850000,263 +DA/NW-164,Broederhauser Berg,,52.28141000,8.73474000,237 +DA/NW-165,Jacobsberg,,52.24148941,8.93599033,233 +DA/NW-166,Koenigsberg,,52.24087143,8.94981956,220 +DA/NW-167,Roter Brink,,52.23857880,8.96496964,236 +DA/NW-168,Papenbrink,,52.22052002,9.04883003,301 +DA/NW-169,Rote Klippe,,52.22698975,9.03201008,218 +DA/NW-170,NammerKopf,,52.23472977,8.99337006,266 +DA/NW-171,Offelter Berg,,52.28868103,8.50387955,175 +DA/NW-172,Bergeshoeveder Berg,,52.27566910,7.61474991,115 +DA/NW-173,Riesenbecker Berg,,52.27162933,7.62658978,132 +DA/NW-174,Lager Berg,,52.26581955,7.64443016,126 +DA/NW-175,Bigter Berg,,52.26403046,7.65751982,131 +DA/NW-176,Dreihasenstein,,52.25706863,7.67779016,142 +DA/NW-177,Doerenther Klippen,,52.24184036,7.71835995,166 +DA/NW-178,Dreikaiserstuhl,,52.23603058,7.73814011,132 +DA/NW-179,Strubberg,,52.20809937,7.82283020,149 +DA/NW-180,Kleeberg,,52.20347977,7.84708977,177 +DA/NW-181,Hupenberg,,52.24639893,7.83302021,139 +DA/NW-182,Hagenberg,,52.25799942,7.89049006,130 +DA/NW-183,Hoher Huegel,,52.25370026,7.89674997,123 +DA/NW-184,Looser Berg,,52.23778915,7.91062021,138 +DA/NW-185,Hohe Horst,,52.20859909,7.86912012,130 +DA/NW-186,Fangberg,,52.20814133,7.89225006,132 +DA/NW-187,Klausberg,,52.20452118,7.89929008,115 +DA/NW-188,Galgenknapp,,52.18780136,7.87506008,132 +DA/NW-189,Intruper Berg,,52.18550873,7.88484001,153 +DA/NW-190,Finkenberge,,52.18494034,7.89539003,175 +DA/NW-191,Aldruper Berg,,52.16748047,7.95668983,220 +DA/NW-192,Westerbecker Berg,,52.16899872,7.94064999,236 +DA/NW-193,Ravensberg,,52.08282852,8.29767036,204 +DA/NW-194,Klusebrink,,52.12184143,8.29078007,227 +DA/NW-195,Hollandskopf,,52.11468887,8.28285980,306 +DA/NW-196,Kleeberg,,52.08665848,8.36252975,223 +DA/NW-197,Blotenberg,,52.06560135,8.41765976,176 +DA/NW-198,Werther Egge,,52.08010101,8.38757038,223 +DA/NW-199,Grosser Berg,,52.04618073,8.39904022,228 +DA/NW-200,Hoveberg,,52.02505875,8.47303963,198 +DA/NW-201,Stecklenbrink,,52.03131866,8.48754025,210 +DA/NW-202,Palsterkamper Berg,,52.02806854,8.43453979,264 +DA/NW-203,Hengeberg,,52.11439896,8.30469990,208 +DA/NW-204,Vicarienkopf,,52.11940002,8.26809978,270 +DA/NW-205,Schornstein,,52.12060165,8.27579975,273 +DA/NW-206,Sparrenberg,,52.01478958,8.52696991,177 +DA/NW-207,Ostenberg,,52.45523071,8.46403980,126 +DA/NW-208,Dorenberg,,52.45009995,8.44293022,140 +DA/NW-209,Kahler Huegel,,52.44433975,8.44211960,150 +DA/NW-210,Schlichter Brink,,52.44229889,8.42794991,172 +DA/NW-211,Scharfer Berg,,52.43740845,8.42109966,180 +DA/NW-212,Lienener Berg,,52.16109848,7.98780012,225 +DA/NW-213,Maschberg,,52.26488000,8.50760000,189 +DA/NW-214,Beuelskopf,,50.60835648,6.91864729,292 +DA/NW-215,Michelsberg,,50.51259232,6.82413006,566 +DA/NW-216,Schoeppinger Berg,,52.09312057,7.27110004,157 +DA/NW-217,Buchenberg,,52.14028168,7.38448000,110 +DA/NW-218,Harkortberg,,51.39888382,7.39379883,232 +DA/NW-219,Ehrenberg,,51.26786423,7.26406574,345 +DA/NW-220,Scharpenacker Berg,,51.25305557,7.21555614,326 +DA/NW-221,Burggrafenberg,,51.22430420,7.11888885,282 +DA/NW-222,Nuetzenberg,,51.25472260,7.12027788,259 +DA/NW-223,Wahlberg,,51.10105515,7.48252630,406 +DA/NW-224,Wasserfall,,50.67889404,7.23921824,338 +DA/NW-225,Friedrichsberg,,51.24166870,7.13972187,276 +DA/NW-226,Waldbeerenberg,,51.76581955,7.11850023,146 +DA/NW-227,Kleiner Ahlertsberg,,50.89804077,8.37817955,595 +DA/NW-228,Huettenkopf,,51.33575821,8.59332561,681 +DA/NW-229,Fohrenkopf,,51.33353424,8.60165119,704 +DA/NW-230,Entenberg,,50.91796112,8.43367958,535 +DA/NW-231,Rosenau,,50.68381000,7.23065000,323 +DA/NW-232,Stockert,,50.57019043,6.72285986,435 +DA/NW-233,Pflugberg,,50.56209946,6.62410021,499 +DA/NW-234,Jakob-Kneip-Berg ,,50.53870010,6.69411993,438 +DA/NW-235,Herkelstein,,50.57424927,6.70529985,435 +DA/NW-236,Willenberg,,50.51401901,6.64266014,544 +DA/NW-237,Vogelsang,,50.49243164,6.61132002,531 +DA/NW-238,Brehberg,,50.53292084,6.63706017,525 +DA/NW-239,Schierckes Tempel (Blasheimer Berg),,52.26786000,8.57869000,287 +DA/NW-240,Heidkopf,,52.29618000,8.63456000,272 +DA/NW-241,Mesenkopf,,52.29376000,8.62483000,226 +DA/NW-243,Preussisch Oldendorfer Berg / Egge,,52.28929200,8.46462500,204 +DA/NW-244,Knollen,,51.03885100,7.65716400,450 +DA/NW-245,Muesauelsberg,,50.54581000,6.37242000,577 +DA/NW-246,Gilberg,,51.09896200,7.87457700,360 +DA/NW-247,Kaisberg,,51.38991700,7.42558300,185 +DA/NW-248,Schafberg,,52.30027800,7.77666700,176 +DA/NW-249,Paulsberg (Wuppertal),,51.24944400,7.26222200,293 +DA/NW-250,Kiesberg,,51.24499000,7.12092000,282 +DA/RP-001,Scharteberg,,50.21829987,6.75279999,691 +DA/RP-002,Rassberg,,50.38919830,7.06279993,664 +DA/RP-003,Seimersberg,,50.25279999,6.50640011,663 +DA/RP-004,Doehmberg,,50.26359940,6.76030016,653 +DA/RP-005,Goldberg,,50.33470154,6.45940018,649 +DA/RP-006,Langer Stein,,50.27610016,6.52029991,640 +DA/RP-007,Rote Heck,,50.31140137,6.94029999,639 +DA/RP-008,Schwirzheimer Kopf,,50.24420166,6.52670002,638 +DA/RP-009,Lehberg,,50.21279907,6.73500013,636 +DA/RP-010,Auf dem Gericht,,50.34000015,6.40749979,633 +DA/RP-011,Vogelsheck,,50.19670105,6.55249977,623 +DA/RP-012,Hardt,,50.23669815,6.47109985,627 +DA/RP-013,Auf der Wacht,,50.23360062,6.78249979,624 +DA/RP-014,Braenkekopf,,50.32609940,6.94829988,622 +DA/RP-015,Saberg,,50.37329865,7.09579992,621 +DA/RP-016,Weidenhoechst,,50.33720016,6.42080021,620 +DA/RP-017,Eselsberg,,50.24140167,6.78499985,620 +DA/RP-018,Hohlscheid,,50.26309967,6.48420000,619 +DA/RP-019,Dietzenley,,50.20249939,6.67810011,618 +DA/RP-020,Cotenickelchen,,50.33190155,6.95279980,618 +DA/RP-021,Schlehnenheck,,50.30139923,6.44999981,617 +DA/RP-022,Auf der Kopp,,50.18280029,6.53219986,616 +DA/RP-023,Glasfeld,,50.30250168,6.49170017,614 +DA/RP-024,Radersberg,,50.27330017,6.82000017,610 +DA/RP-025,Weitersberg,,50.30670166,6.55079985,609 +DA/RP-026,Wilpert,,50.31140137,6.40030003,608 +DA/RP-027,Huscheid,,50.29079819,6.37440014,608 +DA/RP-028,Welfsberg,,50.38029861,7.06389999,606 +DA/RP-029,Elsberg,,50.31000137,6.92670012,605 +DA/RP-030,Hilz,,50.31560135,6.52670002,603 +DA/RP-031,Barsberg,,50.29359818,6.84719992,600 +DA/RP-032,Nerother Kopf,,50.19359970,6.76030016,600 +DA/RP-033,Steinbuechel,,50.32830048,6.56029987,597 +DA/RP-034,Bodert,,50.27529907,6.49560022,596 +DA/RP-035,Vogelsherdchen,,50.35060120,6.95559978,596 +DA/RP-036,Steinberg,,50.31330109,6.39060020,592 +DA/RP-037,Muensterberg,,50.22919846,6.42059994,592 +DA/RP-038,Roedelkaul,,50.16889954,6.65609980,592 +DA/RP-039,Wippermann,,50.37810135,7.00470018,592 +DA/RP-040,Kapp,,50.23310089,6.89169979,590 +DA/RP-041,Hahnenberg,,50.37310028,6.58939981,589 +DA/RP-042,Daxelberg,,50.12080002,6.66279984,589 +DA/RP-043,Auf dem Hardt,,50.33330154,6.43970013,588 +DA/RP-044,Kalberberg,,50.26969910,6.46829987,588 +DA/RP-045,Alter Voss,,50.24580002,6.72139978,588 +DA/RP-046,Bradscheid,,50.11780167,6.64029980,588 +DA/RP-047,Beilstein,,50.28689957,6.97030020,588 +DA/RP-048,Boxert,,50.16529846,6.52640009,585 +DA/RP-049,Kretscheid,,50.14390182,6.72139978,585 +DA/RP-050,Dickenberg,,50.24219894,6.40280008,583 +DA/RP-051,Otzert,,50.29669952,6.36439991,582 +DA/RP-052,Ooser Nase,,50.23139954,6.59469986,580 +DA/RP-053,Bittberg,,50.25999832,6.96110010,580 +DA/RP-054,Denskopf,,50.35329819,7.10750008,573 +DA/RP-055,Schwedenkreuz,,50.35499954,6.92749977,572 +DA/RP-056,Afelskreuz,,50.25749969,6.90439987,572 +DA/RP-057,Kantenkopf,,50.30360031,6.36889982,571 +DA/RP-058,Radsberg,,50.29249954,6.34390020,570 +DA/RP-059,Hoenselberg,,50.30139923,6.74720001,570 +DA/RP-060,Froehn,,50.23830032,6.37109995,570 +DA/RP-061,Schmitzkopf,,50.38940048,7.20389986,570 +DA/RP-062,Deichelsberg,,50.36890030,6.41690016,569 +DA/RP-063,Kalvarienberg,,50.20940018,6.40719986,569 +DA/RP-064,Pruemer Berg,,50.15439987,6.57170010,567 +DA/RP-065,Kopnig,,50.26499939,6.45970011,566 +DA/RP-066,Steingert,,50.24580002,6.42420006,566 +DA/RP-067,Mohrsberg,,50.37279892,7.13439989,564 +DA/RP-068,Weinschiedsberg,,50.22309875,6.40689993,562 +DA/RP-069,Schnapert,,50.30920029,6.36189985,561 +DA/RP-070,Rother Kopf,,50.24639893,6.61889982,561 +DA/RP-071,Maeuseberg,,50.17559814,6.84189987,561 +DA/RP-072,Hundsberg,,50.17689896,6.56529999,560 +DA/RP-073,Struthberg,,50.27220154,6.78749990,560 +DA/RP-074,Saengscheid,,50.34439850,6.55499983,559 +DA/RP-075,Am Kopp,,50.22560120,6.38030005,558 +DA/RP-076,Wolfsberg,,50.22330093,7.09469986,558 +DA/RP-077,Steineberger Ley,,50.17779922,6.91830015,558 +DA/RP-078,Auf der Hardt,,50.18500137,6.86359978,558 +DA/RP-079,Alte Schanze,,50.24470139,7.06890011,557 +DA/RP-080,Auf der Aarley,,50.15829849,6.79390001,557 +DA/RP-081,Herchenberg,,50.15330124,6.51359987,556 +DA/RP-082,Asberg,,50.36294937,6.52073479,551 +DA/RP-083,Weinberg,,50.31359863,6.71140003,554 +DA/RP-084,Ehlert,,50.22639847,6.89529991,553 +DA/RP-085,Die Hoehe,,50.22719955,7.06720018,553 +DA/RP-086,Hoelgertberg,,50.32830048,7.03560019,551 +DA/RP-087,Bremelichenberg,,50.36220169,6.44420004,549 +DA/RP-088,Hoher List,,50.16249847,6.84810019,549 +DA/RP-089,Dachsberg,,50.16889954,6.60139990,548 +DA/RP-090,Witzenberg,,50.36280060,6.57140017,547 +DA/RP-091,Zanderberg,,50.18690109,6.57779980,547 +DA/RP-092,Baumberg,,50.34560013,6.64779997,545 +DA/RP-093,Dreeskopf,,50.09560013,6.53669977,544 +DA/RP-094,Eichert,,50.36140060,6.92080021,544 +DA/RP-095,Holzbeuel,,50.08079910,6.74440002,544 +DA/RP-096,Warmendell,,50.21170044,6.37830019,542 +DA/RP-097,Schafberg,,50.33330154,7.08249998,540 +DA/RP-098,Verschneiderberg,,50.31000137,6.34000015,539 +DA/RP-099,Wiekert,,50.12969971,6.51639986,539 +DA/RP-100,Riedener Berg,,50.40359879,7.15939999,538 +DA/RP-101,Schlaefriger Berg,,50.23189926,6.44579983,536 +DA/RP-102,Kyller Hoehe,,50.27939987,6.68389988,535 +DA/RP-103,Kirschkaul,,50.17860031,6.64720011,535 +DA/RP-104,Huersnueck,,50.42060089,6.88250017,534 +DA/RP-105,Geisshecke,,50.22610092,6.70830011,533 +DA/RP-106,Wolfsbeuel,,50.25830078,6.63889980,531 +DA/RP-107,Gossberg,,50.27249908,6.70310020,530 +DA/RP-108,Auf der Held,,50.06919861,6.62169981,529 +DA/RP-109,Buerberg,,50.13330078,6.75139999,528 +DA/RP-110,Eich,,50.21829987,6.35939980,525 +DA/RP-111,Hohe Warte,,50.35189819,7.07110023,523 +DA/RP-112,Buberg,,50.30059814,6.69829988,519 +DA/RP-113,Grosser Schimmel,,50.13579941,6.57719994,512 +DA/RP-114,Mosenberg,,50.08140182,6.78030014,517 +DA/RP-115,Kockelsberg,,50.35779953,6.53830004,516 +DA/RP-116,Kreuzberg,,50.22359848,6.94579983,516 +DA/RP-117,Katzenberg,,50.29579926,6.60640001,515 +DA/RP-118,Auf Erbenschell,,50.26689911,6.72079992,512 +DA/RP-119,Hatzert,,50.36439896,6.89249992,509 +DA/RP-120,Heiserberg,,50.30189896,6.68060017,508 +DA/RP-121,Acht,,50.27500153,6.59110022,503 +DA/RP-122,Hanert,,50.15420151,6.62470007,502 +DA/RP-123,Wadt,,50.35670090,6.88940001,502 +DA/RP-124,Moeschelberg,,50.32030106,6.60500002,498 +DA/RP-125,Heidenkoepfchen,,50.09059906,6.58970022,498 +DA/RP-126,Bunesnueck,,50.41329956,6.84609985,496 +DA/RP-127,Hoemmerich,,50.36529922,6.87029982,496 +DA/RP-128,Ebenserberg,,50.30640030,6.67329979,492 +DA/RP-129,Ahlert,,50.34189987,7.13719988,492 +DA/RP-130,Schaelkopf,,50.34469986,7.16169977,492 +DA/RP-131,Ettringer Bellberg,,50.35029984,7.22809982,487 +DA/RP-132,Kauligenberg,,50.36169815,6.67140007,485 +DA/RP-133,Eulenkopf,,50.42060089,6.85780001,467 +DA/RP-134,Schrack,,50.03499985,6.93559980,442 +DA/RP-135,Taubenberg,,50.03969955,6.57000017,438 +DA/RP-136,Schafstall,,50.10110092,7.09719992,423 +DA/RP-137,Falkenlay,,50.08332062,7.02175999,414 +DA/RP-138,Sollig,,50.06250000,7.11829996,398 +DA/RP-139,Flemmert,,50.01720047,6.84110022,392 +DA/RP-140,Calmont,,50.10889816,7.12559986,378 +DA/RP-141,Hochheid,,50.08000183,7.10780001,372 +DA/RP-142,Obergein,,50.30810165,7.27939987,361 +DA/RP-143,Sammetzkopf,,50.25889969,7.28499985,342 +DA/RP-144,Sandkopf,,49.73279953,7.09829998,802 +DA/RP-145,Springenkopf,,49.72190094,7.07079983,784 +DA/RP-146,Steingeruettelkopf,,49.81000137,7.18389988,757 +DA/RP-147,Sandkopf (Neuhuetten),,49.67810059,7.02720022,757 +DA/RP-148,Idarkopf,,49.86109924,7.27139997,746 +DA/RP-149,Diebskopf,,49.67219925,7.00360012,739 +DA/RP-150,Sensweiler Hoehe,,49.79309845,7.15579987,734 +DA/RP-151,Usarkopf,,49.78219986,7.13719988,725 +DA/RP-152,Viehauskopf,,49.71640015,7.05579996,720 +DA/RP-153,Butterhecker Steinkoepfe,,49.73463821,7.17422485,722 +DA/RP-154,Ringelkopf,,49.72890091,7.14499998,712 +DA/RP-155,Friedrichskopf,,49.65969849,7.05999994,707 +DA/RP-156,Steinkopf,,49.71060181,7.00860023,683 +DA/RP-157,Pfannenfelskopf,,49.74610138,7.19969988,680 +DA/RP-158,Hasselsang,,49.77109909,7.12580013,674 +DA/RP-159,Hohe Wurzel,,49.70470047,6.86219978,669 +DA/RP-160,Sandkopf (Kirschweiler),,49.77080154,7.24970007,665 +DA/RP-161,Simmerkopf,,49.93690109,7.59499979,653 +DA/RP-162,Hochsteinchen,,49.97890091,7.68310022,648 +DA/RP-163,Moerschieder Burr,,49.78559875,7.27780008,646 +DA/RP-164,Schanzerkopf,,49.95940018,7.63689995,643 +DA/RP-165,Roederberg,,49.73109818,7.03170013,641 +DA/RP-166,Oedesborner Hoehe,,49.91719818,7.62190008,638 +DA/RP-167,Ranzenkopf,,49.83810043,7.02939987,637 +DA/RP-168,Ginsterkopf,,49.94499969,7.60419989,633 +DA/RP-169,Ochsenbaumer Hoehe,,49.95500183,7.61579990,632 +DA/RP-170,Wildburghoehe,,49.90969849,7.56029987,629 +DA/RP-171,Salzkopf,,49.99810028,7.78079987,628 +DA/RP-172,Silberich,,49.75859833,7.22690010,623 +DA/RP-173,Alteburg,,49.87969971,7.54640007,620 +DA/RP-174,Hoelzerkopf,,49.92309952,7.63360023,603 +DA/RP-175,Herzeter Hecke,,49.75673676,7.10232878,604 +DA/RP-176,Auerhahnkopf,,49.98249817,7.77890015,574 +DA/RP-177,Luftekopf,,50.08670044,7.62220001,551 +DA/RP-178,Klepp,,49.88000107,7.18809986,551 +DA/RP-179,Koppensteiner Hoehe,,49.87670135,7.48969984,539 +DA/RP-180,Guellheck,,50.17610168,7.60750008,534 +DA/RP-181,Katzenstein,,49.86059952,7.45940018,533 +DA/RP-182,Fleckertshoehe,,50.18640137,7.60500002,530 +DA/RP-183,Hochfels,,49.96969986,7.69969988,530 +DA/RP-184,Scheidling,,49.77939987,7.08830023,519 +DA/RP-185,Hoher Stein,,50.12279892,7.64359999,504 +DA/RP-186,Graskopf,,50.19359970,7.59469986,502 +DA/RP-187,Steinerner Mann,,49.60469818,7.20639992,496 +DA/RP-188,Rossel,,49.97330093,7.80310011,495 +DA/RP-189,Hohe Buch,,50.05830002,7.44080019,486 +DA/RP-190,Adamsberg,,49.77330017,7.06559992,481 +DA/RP-191,Oderter Kopf,,49.78419876,7.06279993,480 +DA/RP-192,Goettschieder Berg,,49.71670151,7.33610010,473 +DA/RP-193,Horstkopf,,50.24029922,7.51609993,463 +DA/RP-194,Thonhuegel,,50.06499863,7.31890011,463 +DA/RP-195,Eichen-Berg,,50.16640091,7.58419991,459 +DA/RP-196,Mehringerberg,,49.77719879,6.84719992,455 +DA/RP-197,Auf der Huette,,50.04690170,7.30219984,452 +DA/RP-198,Rothekopf,,50.05830002,7.20580006,438 +DA/RP-199,Alte Schanzen,,49.92110062,7.09779978,436 +DA/RP-200,Waldeck,,50.06219864,7.27279997,434 +DA/RP-201,Kuppensteiner Wild,,49.70249939,6.70830011,427 +DA/RP-202,Bummkopf,,50.00170135,7.16330004,421 +DA/RP-203,Homberg,,49.85530090,7.69029999,418 +DA/RP-204,Kohlenberg,,49.94609833,7.74469995,417 +DA/RP-205,Spitzenstein,,50.12829971,7.69469976,412 +DA/RP-206,Dickenberg,,50.25690079,7.47030020,404 +DA/RP-207,Wolfer Berg,,49.95309830,7.08559990,400 +DA/RP-208,Maulbeerkopf,,50.28670120,7.57060003,398 +DA/RP-209,Rabenkopf,,50.04890060,7.75250006,395 +DA/RP-210,Auf Soell,,49.80139923,6.86749983,395 +DA/RP-211,Stoekert,,49.96329880,7.84859991,387 +DA/RP-212,Spitzenkopf,,49.76670074,7.42579985,386 +DA/RP-213,Kuehkopf,,50.30939865,7.56920004,382 +DA/RP-214,Endeler Koepfe,,49.96170044,7.15500021,382 +DA/RP-215,Hurtskopf,,50.15219879,7.30469990,378 +DA/RP-216,Schafberg,,50.23830032,7.45809984,370 +DA/RP-217,Hellberg,,49.79219818,7.49639988,366 +DA/RP-218,In den Hecken,,49.67470169,6.49469995,365 +DA/RP-219,Kalkberg,,50.10329819,7.25500011,347 +DA/RP-220,Geisenkopf,,50.03829956,7.18419981,346 +DA/RP-221,Wischkopf,,49.89920044,7.03140020,339 +DA/RP-222,Welschberg,,49.82669830,7.71810007,336 +DA/RP-223,Beierberg,,50.20999908,7.40920019,317 +DA/RP-224,Valwigerberg,,50.15250015,7.21640015,316 +DA/RP-225,Muensterer Kopf,,49.94779968,7.87690020,301 +DA/RP-226,Forstberg,,50.27939987,7.47690010,286 +DA/RP-227,Felcheskopf,,50.18030167,7.31780005,261 +DA/RP-228,Prinzenkopf,,50.04690170,7.12890005,238 +DA/RP-229,Carolahoehe,,50.31389999,7.52920008,235 +DA/RP-230,Dommelberg,,50.31859970,7.58389997,223 +DA/RP-231,Schwedenschanze,,50.32469940,7.55970001,215 +DA/RP-232,Muehlberg,,49.91609955,8.22329998,243 +DA/RP-233,Grabenkopf,,49.80810165,7.87750006,298 +DA/RP-234,Petersberg,,49.79439926,8.20390034,246 +DA/RP-235,Horn,,49.79420090,7.93499994,271 +DA/RP-236,Schlossberg,,49.78749847,7.86000013,336 +DA/RP-237,Kohlbusch,,49.67940140,7.89169979,444 +DA/RP-238,Stolzenberg,,49.67890167,7.80970001,340 +DA/RP-239,Molleberg,,49.67029953,7.48110008,454 +DA/RP-240,Dreiherrenstein,,49.66690063,7.38469982,581 +DA/RP-241,Mahlbergskopf,,49.68389893,7.37890005,596 +DA/RP-242,Radeberg,,49.68330002,7.30919981,434 +DA/RP-243,Steinberg,,49.67139816,7.33109999,547 +DA/RP-244,Wilsenberg,,49.67969894,7.43109989,545 +DA/RP-245,Kindelhell,,49.64170074,7.45190001,490 +DA/RP-246,Steinberg,,49.60279846,7.84170008,438 +DA/RP-247,Bickberg,,49.59999847,7.88110018,559 +DA/RP-248,Hohenfels,,49.60219955,7.89279985,544 +DA/RP-249,Reiserberg,,49.55500031,7.73280001,460 +DA/RP-250,Kiefernkopf,,49.55530167,7.53310013,533 +DA/RP-251,Steinerner Mann,,49.55720139,7.51859999,497 +DA/RP-252,Eulenberg,,49.36719894,7.83830023,490 +DA/RP-253,Mueckenberg,,49.36579895,7.86499977,516 +DA/RP-254,Vorderer Gleisberg,,49.37279892,7.98939991,463 +DA/RP-255,Hinterer Gleisberg,,49.36560059,8.00440025,468 +DA/RP-256,Unterstaedter Berg,,49.37919998,8.02919960,422 +DA/RP-257,Kaisergarten,,49.35499954,8.05169964,519 +DA/RP-258,Nollenkopf,,49.34420013,8.11330032,490 +DA/RP-259,Platte,,49.34030151,8.06029987,561 +DA/RP-260,Jakobshoehe,,49.33330154,8.03579998,517 +DA/RP-261,Kanzelkopf,,49.32500076,8.01140022,488 +DA/RP-262,Judenkopf,,49.33169937,8.00170040,430 +DA/RP-263,Gruenberg,,49.33610153,7.96439981,425 +DA/RP-264,Brogberg,,49.33029938,7.89690018,566 +DA/RP-265,Am Piquet,,49.31719971,7.67250013,429 +DA/RP-266,Steinberg,,49.32059860,7.82280016,528 +DA/RP-267,Schindhuebel,,49.32669830,7.87529993,571 +DA/RP-268,Geiskopf,,49.31029892,7.92670012,567 +DA/RP-269,Rothsolberg,,49.31809998,8.05080032,607 +DA/RP-270,Schafkopf,,49.31250000,8.04780006,616 +DA/RP-271,Sommerberg,,49.32189941,8.10560036,502 +DA/RP-272,Hohe Loog,,49.33250046,8.09500027,619 +DA/RP-273,Steigerkopf,,49.29690170,8.02610016,614 +DA/RP-274,Erlenkopf,,49.29280090,7.93809986,552 +DA/RP-275,Mosisberg,,49.29999924,7.85440016,609 +DA/RP-276,Ringelsberg,,49.23389816,8.04829979,462 +DA/RP-277,Kehrenkopf,,49.23080063,7.94859982,530 +DA/RP-278,Spitze Boll,,49.23189926,7.81419992,540 +DA/RP-279,Dickenberg,,49.13389969,7.80999994,356 +DA/RP-280,Dretschberger Kopf,,49.11640167,7.75419998,460 +DA/RP-281,Kahlenberg,,49.10329819,7.93669987,405 +DA/RP-282,Hohenberg,,49.07720184,7.95109987,420 +DA/RP-283,Schlossberg,,49.07720184,7.92080021,503 +DA/RP-284,Schmobberg,,49.07080078,7.77220011,524 +DA/RP-285,Kuehfelderstein,,50.69110107,8.05529976,697 +DA/RP-286,Salzburger Kopf,,50.67110062,8.05360031,654 +DA/RP-287,Stegskopf,,50.70169830,8.02359962,654 +DA/RP-288,Altenberg,,50.65079880,8.11079979,651 +DA/RP-289,Galgenberg,,50.66970062,8.04279995,649 +DA/RP-290,Homberg,,50.64250183,8.10109997,634 +DA/RP-291,Hoellenkopf,,50.70920181,8.03940010,628 +DA/RP-292,Troedelsteine,,50.72779846,8.03689957,613 +DA/RP-293,Marienberger Hoehe,,50.65999985,7.93940020,568 +DA/RP-294,Stirnskopf,,50.71329880,8.01720047,555 +DA/RP-295,Koeppel,,50.43059921,7.75080013,540 +DA/RP-296,Lippersberg,,50.41939926,7.74669981,535 +DA/RP-297,Seltersberg,,50.72060013,8.01000023,532 +DA/RP-298,Hommelshahn,,50.74330139,7.99809980,518 +DA/RP-299,Hohenseelbachskopf,,50.75640106,7.98920012,504 +DA/RP-300,Steinkopf (Ww),,50.73419952,7.91079998,500 +DA/RP-301,Schimmerich,,50.71860123,7.97669983,493 +DA/RP-302,Ziest,,50.65919876,7.91470003,489 +DA/RP-303,Auf der Burg,,50.73139954,7.95190001,488 +DA/RP-304,Beulstein,,50.51860046,7.85970020,483 +DA/RP-305,Knoepfchen,,50.92969894,7.77720022,480 +DA/RP-306,Hartenfelser Kopf,,50.61360168,7.76779985,479 +DA/RP-307,Unterer Kopf,,50.65079880,7.86030006,475 +DA/RP-308,Girkenrother Kopf,,50.51810074,7.97889996,461 +DA/RP-309,Weisser Stein,,50.36610031,7.76690006,458 +DA/RP-310,Scharfenstein,,50.63719940,7.91169977,455 +DA/RP-311,Haeuscher,,50.34749985,7.74329996,454 +DA/RP-312,Spitzheckerrueck,,50.35530090,7.80140018,451 +DA/RP-313,Kohlenberg,,50.75920105,7.94969988,447 +DA/RP-314,Zipfen,,50.44419861,7.73670006,446 +DA/RP-315,Ziehenberg,,50.56309891,8.00279999,435 +DA/RP-316,Hohe Hahnscheid,,50.55500031,8.03670025,433 +DA/RP-317,Gruener Hahn,,50.66249847,7.85610008,432 +DA/RP-318,Arsberg,,50.76720047,7.88969994,430 +DA/RP-319,Hachenburger Hoehe,,50.76079941,7.93639994,430 +DA/RP-320,Meerberg,,50.60639954,7.29689980,422 +DA/RP-321,Kohlhack,,50.54140091,8.06079960,410 +DA/RP-322,Wasserberg,,50.78279877,7.92030001,407 +DA/RP-323,Niessling,,50.40110016,7.73059988,407 +DA/RP-324,Hollenstein,,50.88999939,7.76359987,406 +DA/RP-325,Huemerich,,50.76810074,7.81500006,399 +DA/RP-326,Hoelzberg,,50.47560120,7.72109985,391 +DA/RP-327,Eisenkauten,,50.32780075,7.81829977,376 +DA/RP-328,Hohenmalberg,,50.31809998,7.70389986,376 +DA/RP-329,Horchheimer Hoehe,,50.33110046,7.62970018,357 +DA/RP-330,Bertenauer Kopf,,50.61360168,7.43940020,352 +DA/RP-331,Geierkopf,,50.32889938,7.65829992,318 +DA/RP-332,Schnatzberg,,50.43389893,7.59940004,268 +DA/RP-333,Friedrichsthaler Kopf,,50.50059891,7.42859983,268 +DA/RP-334,Kronenberg,,50.52389908,7.32859993,211 +DA/RP-337,Heisebaeumchen,,50.25085831,7.73373604,409 +DA/RP-338,Schneeberg,,50.31541443,7.00980282,557 +DA/RP-339,Teufelsley,,50.46133041,6.96618986,496 +DA/RP-340,Auf der Wurst,,50.43333435,7.05000019,615 +DA/RP-341,Hundsburgskopf,,50.43438339,6.98210907,583 +DA/RP-342,Luetzelacht,,50.39742661,7.00455713,592 +DA/RP-343,Jakobsberg,,50.23408508,6.98017406,549 +DA/RP-344,Katzley,,50.52760696,7.07022715,239 +DA/RP-345,Bunte Kuh,,50.53131104,7.07139778,236 +DA/RP-346,Hofberg,,50.17589188,6.99831009,469 +DA/RP-347,Martberg,,50.17921829,7.28870010,270 +DA/RP-348,Grosskopp,,50.14847946,6.98175001,419 +DA/RP-349,Antoniuskreuz,,50.20684052,6.99347019,503 +DA/RP-350,Galgenkoepfchen,,50.15102005,7.12061977,413 +DA/RP-351,Blinzberg,,50.11933517,7.05903006,429 +DA/RP-352,Landesblick,,50.10642624,6.75754213,515 +DA/RP-353,Steckenberg,,50.51829529,7.13147497,370 +DA/RP-354,Thonhuegel (Auf der Acht),,50.11309052,7.00966883,435 +DA/RP-355,Veitskopf,,50.42996979,7.26431608,428 +DA/RP-356,Auf Hilgerath,,50.25611115,6.88090992,532 +DA/RP-357,Schillberg,,50.27209091,6.85109997,620 +DA/RP-358,Auf Heilert,,50.26155853,6.53152514,615 +DA/RP-359,Wachtbaeumchen,,50.17970657,6.95232677,471 +DA/RP-360,Wettau,,50.26689148,7.15014505,531 +DA/RP-361,Nassenberg,,50.18900299,7.04343319,465 +DA/RP-362,Zillesberg,,50.17753601,7.30444384,201 +DA/RP-363,Roemerberg,,50.12430573,6.92667103,473 +DA/RP-364,Geisberg,,50.28754807,6.97841787,572 +DA/RP-365,Auf der Schildwacht,,50.29220581,6.95725107,630 +DA/RP-366,Hardtkopf (Eifel),,50.17257309,6.42006207,600 +DA/RP-367,Krausberg,,50.52811813,7.05173922,360 +DA/RP-368,Bei der Buche,,50.16175842,7.01579809,445 +DA/RP-369,Auf dem Waldfrieden,,50.19433975,7.01128483,486 +DA/RP-370,Hinnig,,50.16843033,6.97578382,452 +DA/RP-371,Aufm Hoestchen,,50.10115051,6.67805099,529 +DA/RP-372,Junkerberg,,50.14933777,6.92667007,485 +DA/RP-373,Arenberg,,50.24043655,7.23929405,397 +DA/RP-374,Kulm,,50.24854279,7.24060678,409 +DA/RP-375,Teufelsfels,,49.84217072,7.42680979,568 +DA/RP-376,Grosser Humberg (Kaiserslautern),,49.41503906,7.77988005,428 +DA/RP-377,Auf Schloscheid,,50.24100113,6.89630985,602 +DA/RP-378,Foersterheid,,50.19112015,6.97633791,470 +DA/RP-379,Muehlenberg,,50.16876602,6.87540388,481 +DA/RP-380,Hochwinkel,,49.99981308,6.58992720,386 +DA/RP-381,Kalteisen,,50.17883682,7.08007813,476 +DA/RP-382,Niveligsberg,,50.34526825,6.98925018,540 +DA/RP-383,Rollsbueschberg,,50.16041183,6.98378277,429 +DA/RP-384,Weiselstein,,50.47840118,7.14115000,475 +DA/RP-385,Heideberg (Am Roemerturm),,50.23063200,7.14891900,463 +DA/RP-386,Horatherhoeh,,49.82505700,6.99296900,587 +DA/RP-387,Engelsley,,50.51187000,6.99803000,230 +DA/RP-388,Schrock,,50.50908000,7.00696000,400 +DA/RP-389,Uemerich,,50.52076000,7.01193000,311 +DA/RP-390,Hornberg,,50.50532000,6.99012000,388 +DA/RP-391,Birker Ley,,50.83436900,7.96814000,377 +DA/SA-001,Koenigsberg,,51.78860092,10.59809971,1023 +DA/SA-002,Grosse Zeterklippe,,51.80310059,10.64249992,930 +DA/SA-003,Grosser Winterberg,,51.76060104,10.62440014,907 +DA/SA-004,Grenzklippen,,51.78290176,10.68986988,886 +DA/SA-005,Hoellenklippen,,51.78639984,10.67969990,880 +DA/SA-006,Schlungsklippe,,51.77859879,10.65970039,854 +DA/SA-007,Baerenklippen,,51.77830124,10.69470024,850 +DA/SA-008,Erdbeerkopf,,51.77360153,10.67829990,848 +DA/SA-009,Kleiner Winterberg,,51.75609970,10.63440037,836 +DA/SA-010,Ahrensklint,,51.77310181,10.66689968,822 +DA/SA-011,Landmannklippe,,51.78921127,10.67763996,805 +DA/SA-012,Hohnekopf,,51.77560043,10.69890022,835 +DA/SA-013,Feuersteinklippe,,51.76670074,10.67720032,761 +DA/SA-014,Grosser Jaegerkopf,,51.81439972,10.66609955,746 +DA/SA-015,Kleiner Jaegerkopf,,51.81169891,10.67080021,725 +DA/SA-016,Hohensteinklippen,,51.79309845,10.70720005,656 +DA/SA-017,Birkenkopf,,51.60279846,10.89719963,600 +DA/SA-018,Kantorberg,,51.83280182,10.69390011,572 +DA/SA-019,Eichenforst,,51.55390167,10.92440033,495 +DA/SA-020,Armeleuteberg,,51.81639862,10.78110027,478 +DA/SA-021,Harburg,,51.81829834,10.78829956,475 +DA/SA-022,Eichenberg,,51.79249954,10.92940044,416 +DA/SA-023,Ziegenkopf,,51.78779984,10.93389988,407 +DA/SA-024,Agnesberg,,51.83000183,10.79860020,395 +DA/SA-025,Teufelsmauer,,51.78530121,10.97140026,324 +DA/SA-026,Ziegenberg,,51.82389832,10.89830017,316 +DA/SA-027,Regenstein,,51.81280136,10.96220016,294 +DA/SA-028,Horstberg,,51.84109879,10.82030010,288 +DA/SA-029,Gegensteine,,51.73690033,11.22690010,244 +DA/SA-030,Schnarcherklippe,,51.75690079,10.66359997,671 +DA/SA-031,Spiegelsberge,,51.87360001,11.04310036,180 +DA/SA-032,Grosser Rodenberg,,52.19860077,11.07779980,207 +DA/SA-033,Kahler Berg,,52.09780121,11.21500015,208 +DA/SA-034,Scharfensteinklippe,,51.83219910,10.60000038,698 +DA/SA-035,Untere Zeterklippe,,51.80810165,10.64280033,827 +DA/SA-036,Trudenstein,,51.77217102,10.69647980,741 +DA/SA-037,Sonnenklippe,,51.81420135,10.65810013,749 +DA/SA-038,Wolfsklippe,,51.81890106,10.67280006,723 +DA/SA-039,Grosser Birkenkopf,,51.81140137,10.68439960,665 +DA/SA-040,Brandhai,,51.60940170,10.87500000,558 +DA/SA-041,Carlshausturm,,51.65639877,10.79640007,626 +DA/SA-042,Viktorshoehe,,51.68610001,11.08390045,582 +DA/SA-043,Halberstaedter Berg,,51.84249878,10.68889999,571 +DA/SA-044,Stapenberg,,51.82580185,10.84689999,443 +DA/SA-045,Henkersberg,,51.81169891,10.82110023,478 +DA/SA-046,Haltberg,,51.62609863,11.91419983,185 +DA/SA-047,Michelsberg,,51.95430374,12.67171001,185 +DA/SA-048,Frau Harkenberg,,52.73140717,12.12980747,109 +DA/SA-049,Windmuehlenberge,,52.00668716,12.47209930,181 +DA/SA-050,Hubertusberg,,51.90980911,12.51686573,142 +DA/SA-051,Langer Berg,,52.57749939,11.29329586,160 +DA/SA-052,Kleiner Brocken,,51.80941010,10.60669994,1018 +DA/SA-053,Grosser Wartberg,,52.15126038,11.48456955,146 +DA/SA-054,Apollensberg,,51.88286700,12.53671900,127 +DA/SA-055,Hirseberg,,51.97109000,12.64417000,187 +DA/SA-056,Wurzelberg,,51.67118120,12.00000000,181 +DA/SA-057,Hohe Gieck,,51.68057300,12.59912180,193.4 +DA/SA-058,Schoene Aussicht,,51.66980620,12.69115910,181 +DA/SA-059,Gollmer Berg,,51.72081900,12.75381900,133 +DA/SA-060,Ochsenkopf,,51.71001700,12.57752200,185 +DA/SR-001,Dollberg,,49.63249969,7.01830006,695 +DA/SR-002,Schimmelkopf,,49.58919907,6.80579996,695 +DA/SR-003,Turmschneise,,49.57920074,6.75220013,659 +DA/SR-004,Weissfels,,49.62969971,7.03439999,624 +DA/SR-005,Hunnenring,,49.62080002,7.00250006,620 +DA/SR-006,Benkelberg,,49.60969925,6.90000010,564 +DA/SR-007,Kahlenberg,,49.61249924,6.98530006,564 +DA/SR-008,Leyenberg,,49.62110138,6.94670010,551 +DA/SR-009,Schankelberg,,49.62360001,6.96439981,550 +DA/SR-010,Felsenberg,,49.60329819,6.89029980,537 +DA/SR-011,Huebelberg,,49.57809830,6.82310009,522 +DA/SR-012,Losenberg,,49.52920151,7.06220007,512 +DA/SR-013,Heidenkopf,,49.56719971,7.14029980,505 +DA/SR-014,Fallenseifenberg,,49.60079956,6.87080002,499 +DA/SR-015,Trausberg,,49.50439835,6.98420000,499 +DA/SR-016,Bosenberg,,49.47499847,7.19859982,485 +DA/SR-017,Donnerhuebel,,49.46139908,6.93970013,452 +DA/SR-018,Wintersteinchen,,49.52719879,6.56360006,447 +DA/SR-019,Steinhuegel,,49.50279999,7.25110006,444 +DA/SR-020,Kemelsberg,,49.46670151,6.50000000,442 +DA/SR-021,Vogelsfelsen,,49.52330017,6.61749983,430 +DA/SR-022,Hoehnenberg,,49.39920044,7.19329977,427 +DA/SR-023,Lutwinusschneise,,49.51470184,6.57329988,416 +DA/SR-024,Grosser Elmersberg,,49.40250015,6.99970007,414 +DA/SR-025,Leukerkopf,,49.50780106,6.56470013,414 +DA/SR-026,Kirschholzberg,,49.48500061,6.90390015,408 +DA/SR-027,Renglischberg,,49.52220154,6.44829988,408 +DA/SR-028,Bueschfelder Hecken,,49.50139999,6.88969994,405 +DA/SR-029,Peterkopf,,49.50830078,6.64219999,403 +DA/SR-030,Dilsberg,,49.54000092,6.91529989,402 +DA/SR-031,Galgenberg,,49.50000000,6.73810005,401 +DA/SR-032,Kahlenberg,,49.18610001,7.27309990,401 +DA/SR-033,Schallenberg,,49.49169922,6.80189991,401 +DA/SR-034,Weidenberg,,49.25669861,7.14169979,401 +DA/SR-035,Oppener Kuppe,,49.46189880,6.78719997,388 +DA/SR-036,Hardt,,49.15689850,7.18219995,386 +DA/SR-037,Totenkopf,,49.13059998,7.24139977,386 +DA/SR-038,Hohberg,,49.46419907,6.77470016,382 +DA/SR-039,Hirschberg,,49.28499985,7.24580002,381 +DA/SR-040,Gallenberg,,49.33530045,6.64330006,377 +DA/SR-041,Sauberg,,49.28170013,6.68389988,377 +DA/SR-042,Hoher Kopf,,49.29359818,7.25500011,373 +DA/SR-043,Hannock,,49.16669846,7.18809986,372 +DA/SR-044,Saarlouiser Berg,,49.42969894,6.67189980,372 +DA/SR-045,Kahlenberg,,49.27000046,7.14610004,371 +DA/SR-046,Klosterberg,,49.28720093,7.29330015,370 +DA/SR-047,Ransbacher Berg,,49.17720032,7.08640003,368 +DA/SR-048,Kahler Berg,,49.20000076,7.27220011,364 +DA/SR-049,Hoheberg,,49.43140030,6.65000010,362 +DA/SR-050,Auberg,,49.16970062,7.06029987,360 +DA/SR-051,Bartenberg,,49.25780106,7.05970001,359 +DA/SR-052,Limberg,,49.34469986,6.68809986,359 +DA/SR-053,Hirnberg,,49.33359909,6.61940002,356 +DA/SR-054,Gischberg,,49.44440079,6.81669998,350 +DA/SR-055,Geisberg,,49.40280151,6.63000011,348 +DA/SR-056,Neuenberg,,49.37500000,6.62690020,337 +DA/SR-057,Hoesberg,,49.35779953,6.68109989,326 +DA/SR-058,Eisenkopf,,49.51470184,6.59359980,317 +DA/SX-001,Lugstein,,50.73189926,13.74580002,893 +DA/SX-002,Hirtstein,,50.53530121,13.19330025,890 +DA/SX-003,Hemmschuh,,50.72309875,13.69390011,845 +DA/SX-004,Altes Raupennest,,50.75859833,13.75469971,827 +DA/SX-005,Geisingberg,,50.77170181,13.77330017,824 +DA/SX-006,Drachenkopf,,50.74359894,13.60140038,805 +DA/SX-007,Scharspitze,,50.75080109,13.77250004,805 +DA/SX-008,Schwartenberg,,50.65890121,13.46500015,789 +DA/SX-009,Kohlhaukuppe,,50.74359894,13.79310036,786 +DA/SX-010,Tellkoppe,,50.80720139,13.68750000,756 +DA/SX-011,Totenstein,,50.82500076,12.77830029,483 +DA/SX-012,Saydaer Hoehe,,50.72669983,13.42220020,728 +DA/SX-013,Greifensteine,,50.64889908,12.93029976,731 +DA/SX-014,Burg Frauenstein,,50.80080032,13.53610039,651 +DA/SX-015,Oelsener Hoehe,,50.79610062,13.92889977,644 +DA/SX-016,Burgberg,,50.81280136,13.46109962,622 +DA/SX-017,Toepfer,,50.84939957,14.75940037,582 +DA/SX-018,Luchberg,,50.86809921,13.72889996,576 +DA/SX-019,Zeisigstein,,50.82419968,13.99940014,551 +DA/SX-020,Breiteberg,,50.89220047,14.70470047,510 +DA/SX-021,Helleberg,,50.84999847,13.93140030,496 +DA/SX-022,Wachberg,,50.94609833,14.34140015,496 +DA/SX-023,Schlechteberg,,50.99860001,14.58969975,485 +DA/SX-024,Katzstein,,50.87030029,14.09920025,474 +DA/SX-025,Weifberg,,50.93610001,14.36530018,473 +DA/SX-026,Sybillenstein,,51.18220139,14.11250019,449 +DA/SX-027,Moenchswalder Berg,,51.11330032,14.41250038,447 +DA/SX-028,Gohrisch,,50.90169907,14.11030006,440 +DA/SX-029,Panoramahoehe,,50.86439896,13.95219994,437 +DA/SX-030,Landberg,,50.99390030,13.51220036,426 +DA/SX-031,Lerchenberg,,50.95719910,13.68470001,425 +DA/SX-032,Schwedenstein,,51.19219971,14.05609989,420 +DA/SX-033,Schrammsteinaussicht,,50.91249847,14.20470047,417 +DA/SX-034,Grosser Teichstein,,50.91310120,14.29720020,413 +DA/SX-035,Schanzberg,,50.97389984,14.12110043,392 +DA/SX-036,Finckenfang,,50.92079926,13.79749966,394 +DA/SX-037,Cottaer Spitzberg,,50.89830017,13.96829987,391 +DA/SX-038,Labyrinth,,50.88830185,14.03170013,390 +DA/SX-039,Hinteres Raubschloss,,50.91059875,14.27999973,390 +DA/SX-040,Zirkelstein,,50.87860107,14.22080040,385 +DA/SX-041,Butterberg,,51.15579987,14.18470001,384 +DA/SX-042,Triebenberg,,51.02690125,13.92329979,383 +DA/SX-043,Borsberg,,51.01279831,13.90359974,362 +DA/SX-044,Burg Stolpen,,51.04779816,14.08419991,357 +DA/SX-045,Windberg,,50.99753000,13.66014000,356 +DA/SX-046,Heinrichseck,,50.97969818,13.57670021,351 +DA/SX-047,Kaiserkrone,,50.88389969,14.21809959,351 +DA/SX-048,Rochlitzer Berg,,51.02610016,12.77079964,349 +DA/SX-049,Babisnauer Pappel,,50.97579956,13.74969959,329 +DA/SX-050,Kleiner Baerenstein,,50.94219971,14.04500008,338 +DA/SX-051,Neuer Wildenstein,,50.92559814,14.25780010,337 +DA/SX-052,Breiter Stein,,51.01810074,14.00889969,325 +DA/SX-053,Schoene Hoehe,,51.02830124,13.98279953,327 +DA/SX-054,Brand,,50.95579910,14.12670040,317 +DA/SX-055,Hutberg,,51.27360153,14.08030033,294 +DA/SX-056,Rauensteine,,50.95190048,14.06190014,308 +DA/SX-057,Monumentberg,,51.25809860,14.70580006,293 +DA/SX-058,Halde Trages,,51.18059921,12.51580048,250 +DA/SX-059,Loebenberg,,51.42029953,12.79529953,240 +DA/SX-060,Schildberg,,51.44079971,12.88969994,217 +DA/SX-061,Muehle Duerrenberg,,51.35279846,13.13389969,197 +DA/SX-062,Boselspitze,,51.14170074,13.51140022,192 +DA/SX-063,Schellenberg,,50.81309891,13.09939957,511 +DA/SX-064,Langer Stein,,50.71670151,13.14249992,604 +DA/SX-065,Lauterbacher Knochen,,50.69060135,13.16639996,683 +DA/SX-066,Dreibruederhoehe,,50.65670013,13.12500000,688 +DA/SX-067,Morgensternhoehe,,50.64580154,13.24499989,711 +DA/SX-068,Steinhuebel,,50.61470032,13.27250004,817 +DA/SX-069,Adelsberg,,50.81110001,13.01560020,509 +DA/SX-070,Oberbecken,,50.51060104,12.86779976,848 +DA/SX-071,Kuhberg,,50.59939957,12.22189999,510 +DA/SX-072,Laubberg,,50.50389862,12.47220039,767 +DA/SX-073,Steinberg,,50.54359818,12.46529961,661 +DA/SX-074,Hoher Brand,,50.34030151,12.39000034,802 +DA/SX-075,Hinterer Kegelberg,,50.31579971,12.40030003,755 +DA/SX-076,Brunnenberg,,50.28419876,12.25580025,610 +DA/SX-077,Plattenberg,,50.25609970,12.26860046,683 +DA/SX-078,Goldene Hoehe,,50.48559952,12.44970036,733 +DA/SX-079,Eselsberg,,50.48080063,12.67689991,867 +DA/SX-080,Tangelberg,,50.49029922,12.63029957,714 +DA/SX-081,Ochsenkopf,,50.50109863,12.70279980,823 +DA/SX-082,Morgenleithe,,50.52560043,12.73169994,811 +DA/SX-083,Rabenberg,,50.45220184,12.75469971,912 +DA/SX-084,Buchberg,,50.51390076,12.67000008,783 +DA/SX-085,Eisenberg,,50.44169998,12.97140026,1028 +DA/SX-086,Katzenstein,,50.65470123,12.75829983,627 +DA/SX-087,Gleesberg,,50.59030151,12.65939999,593 +DA/SX-088,Frohnberg,,50.50500107,12.34309959,587 +DA/SX-089,Knock,,50.49860001,12.53139973,725 +DA/SX-090,Stangenhoehe,,50.40670013,12.60190010,963 +DA/SX-091,Wartberg,,50.46139908,12.00220013,558 +DA/SX-092,Hohe Reuth,,50.44969940,12.26560020,629 +DA/SX-093,Kiel,,50.40689850,12.46889973,943 +DA/SX-094,Grosser Rammelsberg,,50.40250015,12.52579975,963 +DA/SX-095,Stephanshoehe,,50.77669907,13.68360043,804 +DA/SX-096,Wuesteberg,,51.25059891,14.05249977,351 +DA/SX-097,Jonsberg,,50.84920120,14.71640015,653 +DA/SX-098,Napoleonstein,,51.05690002,13.91329956,342 +DA/SX-099,Thierberg,,50.44720078,12.44470024,784 +DA/SX-100,Runder Huebel,,50.42553600,12.44523200,837 +DA/SX-101,Schneehuebel,,50.42750168,12.57559967,974 +DA/SX-102,Brueckenberg,,50.45420074,12.60999966,963 +DA/SX-103,Koernerberg,,50.35829926,12.48439980,738 +DA/SX-104,Pilzhuebel,,50.72669983,13.09829998,598 +DA/SX-105,Zeisighuebel,,50.69639969,13.11610031,643 +DA/SX-106,Lautaer Hoehe,,50.66170120,13.14890003,656 +DA/SX-107,Hoher Stein,,50.75780106,13.13780022,578 +DA/SX-108,Dittersdorfer Hoehe,,50.76279831,13.00720024,553 +DA/SX-109,Saidenberg,,50.74969864,13.34329987,700 +DA/SX-110,Bismarckhoehe,,50.52220154,13.15810013,857 +DA/SX-111,Altes Gericht,,50.61940002,13.15390015,742 +DA/SX-112,Adlerstein,,50.69889832,13.16329956,674 +DA/SX-113,Galgenberg,,50.74390030,13.16720009,545 +DA/SX-114,Ulmknochen,,50.69720078,13.18809986,645 +DA/SX-115,Brandhuebel,,50.68809891,13.20189953,609 +DA/SX-116,Spitzberg,,50.78110123,13.02439976,504 +DA/SX-117,Scheffelsberg,,50.76060104,13.15439987,500 +DA/SX-118,Hilmersdorfer Hofhoehe,,50.66640091,13.12310028,645 +DA/SX-119,Fuchsgaloppe,,50.59830093,13.17500019,758 +DA/SX-120,Goetzhoehe,,50.76720047,13.07139969,494 +DA/SX-121,Plauberg,,50.83280182,13.09140015,437 +DA/SX-122,Katzenberg,,50.82559967,13.04080009,473 +DA/SX-123,Amtsberg,,50.74470139,13.02140045,503 +DA/SX-124,Waltersdorfer Hoehe,,50.77190018,13.27939987,590 +DA/SX-125,Granitzhuebel,,50.70500183,13.41359997,648 +DA/SX-126,Koenig-Friedrich-August-Hoehe,,50.70859909,13.45810032,735 +DA/SX-127,Schickels Hoehe,,50.74499893,13.63780022,805 +DA/SX-128,Geiersberg,,50.75000000,12.94309998,533 +DA/SX-129,Broednerhoehe,,50.68109894,13.18330002,615 +DA/SX-130,Rungstock,,50.65169907,13.31280041,618 +DA/SX-131,Goldkrone,,50.62360001,13.23029995,768 +DA/SX-132,Wolfsberg,,50.67670059,13.08920002,562 +DA/SX-133,Duerrer Berg,,50.63890076,13.30249977,733 +DA/SX-134,Annahoehe,,50.66859818,13.24689960,684 +DA/SX-135,Steinhuebel,,50.71580124,13.29310036,596 +DA/SX-136,Hexenberg,,50.70280075,13.42109966,679 +DA/SX-137,Teichhuebel,,50.65000153,13.50780010,818 +DA/SX-138,Vorderer Stangenberg,,50.68249893,13.50059986,703 +DA/SX-139,Steinberg,,50.70249939,13.49470043,625 +DA/SX-140,Steinberg,,50.71860123,13.50170040,707 +DA/SX-141,Goldhuebel,,50.68249893,13.48639965,648 +DA/SX-142,Steinberg,,50.68330002,13.36890030,661 +DA/SX-143,Spitzberg,,50.64609909,13.42469978,713 +DA/SX-144,Zaunhuebel,,50.61920166,13.45139980,735 +DA/SX-145,Reicheltberg,,50.64250183,13.44499969,741 +DA/SX-146,Spitzer Berg,,50.63420105,13.33670044,722 +DA/SX-147,Strohhuebel,,50.60810089,13.30280018,756 +DA/SX-148,Sophienstein,,50.63029861,13.36830044,703 +DA/SX-149,Wolfsstein,,50.63499832,13.27060032,736 +DA/SX-150,Steinberg,,50.70940018,13.35560036,617 +DA/SX-151,Schuetzenberg,,50.76440048,13.38189983,626 +DA/SX-152,Rabenberg,,50.62080002,13.25689983,801 +DA/SX-153,Alpstein,,50.81689835,13.35999966,542 +DA/SX-154,Baeyerhoehe,,51.07440186,13.46609974,321 +DA/SX-155,Bernhardshoehe,,50.82059860,13.38809967,544 +DA/SX-156,Karolinenhoehe,,50.87360001,13.13280010,499 +DA/SX-157,Kollmer Dubrau,,51.26359940,14.69779968,303 +DA/SX-158,Lips Tulian Felsen,,50.92810059,13.46749973,450 +DA/SX-159,Markgrafenstein,,50.95249939,13.56140041,413 +DA/SX-160,Poebelknochen,,50.75749969,13.71059990,833 +DA/SX-161,Radewitzer Hoehe,,51.09719849,13.31890011,304 +DA/SX-162,Ranisberg,,50.85670090,13.21329975,518 +DA/SX-163,Schneckenberg,,50.77439880,12.82610035,416 +DA/SX-164,Seeghuebel,,51.03749847,13.39939976,326 +DA/SX-165,Spitzer Stein,,50.87810135,14.09189987,409 +DA/SX-166,Steinkuppe,,50.71939850,13.59920025,805 +DA/SX-167,Taennicht,,50.92639923,13.46000004,461 +DA/SX-168,Mausberg,,50.54999924,12.48999977,639 +DA/SX-169,Liebenstein,,50.52610016,12.95689964,756 +DA/SX-170,Kammerstein,,50.48059845,12.73560047,722 +DA/SX-171,Koenigshuebel,,50.41609955,12.49470043,891 +DA/SX-172,Grosser Stein,,50.66999817,12.79689980,611 +DA/SX-173,Baerenloher Hoehe,,50.28810120,12.20359993,648 +DA/SX-174,Blosenberg,,50.36890030,11.98470020,591 +DA/SX-175,Culmberg,,50.44689941,12.16829967,529 +DA/SX-176,Eisenberg,,50.54890060,12.17749977,433 +DA/SX-177,Gemeinberg,,50.33250046,12.40890026,776 +DA/SX-178,Hahnenpfalz,,50.20080185,12.31890011,702 +DA/SX-179,Kanzelstein,,50.45470047,12.71280003,819 +DA/SX-180,Muehlberg,,50.48279953,12.57670021,825 +DA/SX-181,Scheibenberg,,50.39500046,12.48810005,864 +DA/SX-182,Toskabank,,50.46810150,13.00440025,887 +DA/SX-183,Walfischkopf,,50.49829865,12.55860043,700 +DA/SX-184,Kohlberg,,50.67110062,13.52029991,837 +DA/SX-185,Spitzer Berg,,50.68719864,13.51140022,735 +DA/SX-186,Traugotthoehe,,50.73080063,13.82110023,806 +DA/SX-187,Doehlener Hoehe,,51.12170029,14.50310040,514 +DA/SX-188,Kuppritzer Berg,,51.12080002,14.57919979,505 +DA/SX-189,Hochstein,,51.11420059,14.57310009,533 +DA/SX-190,Buchberg,,50.85499954,14.67440033,651 +DA/SX-191,Scharfenstein,,50.84080124,14.75829983,569 +DA/SX-192,Quirl,,50.90530014,14.06669998,350 +DA/SX-193,Strobelberg,,50.46080017,12.82750034,774 +DA/SX-194,Fuchskanzel,,50.83140182,14.79580021,532 +DA/SX-195,Grosser Hemmberg,,50.49060059,12.89500046,829 +DA/SX-196,Raunerberg,,50.34500122,12.37279987,739 +DA/SX-197,Schoene Aussicht,,50.44079971,12.63029957,883 +DA/SX-198,Zeisiggesang,,50.45859909,12.58030033,922 +DA/SX-199,Rotstein,,50.86029816,14.09169960,458 +DA/SX-200,Gamrig,,50.95809937,14.09669971,253 +DA/SX-202,Carolafelsen,,50.91260147,14.23729992,458 +DA/SX-203,Kleinhennersdorfer Stein,,50.90841675,14.12966728,392 +DA/SX-204,Kohlberg,,50.87139893,14.06519985,443 +DA/SX-205,Kohlbornstein,,50.89889908,14.15769958,372 +DA/SX-206,Koenigsplatz,,50.90859985,14.36209965,436 +DA/SX-207,Lampertsstein,,50.87760162,14.07180023,425 +DA/SX-208,Waitzdorfer Hoehe,,50.96170044,14.14239979,414 +DA/SX-209,Hohburkersdorfer Rundblick (Napoleonslinde),,50.99489975,14.07139969,401 +DA/SX-210,Kleines Pohlshorn,,50.92229843,14.32209969,417 +DA/SX-211,Heiliger Berg,,51.23649979,14.07219982,354 +DA/SX-212,Heideberg,,51.38479996,13.57540035,202 +DA/SX-213,Gickelsberg,,50.96170044,14.16740036,414 +DA/SX-214,Morgensterns Kuppe,,50.74190140,13.15130043,556 +DA/SX-215,Lunapark,,50.98310089,13.71870041,386 +DA/SX-216,Kupferberg,,51.28089905,13.54339981,157 +DA/SX-217,Deditzhoehe,,51.24570084,12.81389999,232 +DA/SX-218,Neuberzdorfer Hoehe,,51.08453369,14.90828609,350 +DA/SX-219,Langenauer Taennicht,,50.81647110,13.30286980,591 +DA/SX-220,Eichberg,,51.32726288,14.38206387,160 +DA/SX-221,Eierberg,,51.17411041,13.98919964,353 +DA/SX-222,Pfarrberg,,50.81010056,13.89480019,603 +DA/SX-223,Kesselberg,,51.16180038,14.10426044,406 +DA/SX-224,Eichberg,,51.18291855,13.96784019,353 +DA/SX-225,Taennchenberg,,51.18709946,13.95979023,330 +DA/SX-226,Karolinenhoehe,,51.15560150,14.07153034,341 +DA/SX-227,Fabrikberg,,50.72395325,13.12655926,593 +DA/SX-228,Hartenstein AP,,50.83018875,13.99302006,540 +DA/SX-229,Bernhardstein,,50.88169861,14.03433990,425 +DA/SX-230,Haselberg/Wettinhoehe AP,,51.28930664,13.88488865,190 +DA/SX-231,Hutberg,,51.27190399,13.95941734,231 +DA/SX-232,Hankehuebel,,50.94951000,14.17060000,330 +DA/SX-233,Bruedersteine,,50.91088000,14.34299000,346 +DA/SX-234,Grossstein,,50.92909000,14.27291000,360 +DA/SX-235,Grosses Pohlshorn,,50.91878000,14.31484000,379 +DA/SX-236,Finkenberg,,50.97967911,14.26718044,416 +DA/SX-237,Goetzinger Hoehe,,51.01132500,14.20656700,425 +DA/SX-238,Nonnenfelsen,,50.85057000,14.68336000,537 +DA/SX-239,Johannisstein,,50.83497000,14.71870000,604 +DA/SX-240,Berg Oybin,,50.84447000,14.74332000,514 +DA/SX-241,Kahle Hoehe,,50.76795100,13.65467500,739 +DA/SX-242,Harter Stein,,50.79834000,13.63575000,710 +DA/SX-243,Sachsenhoehe,,50.78795100,13.80054500,632 +DA/SX-244,Boehmens Berg,,51.00646400,14.04846700,371 +DA/SX-245,Spiegelwald,,50.57612000,12.79208000,728 +DA/SX-246,Heidelberg,,50.81057000,12.75513000,444 +DA/SX-247,Schneckenstein,,50.41354200,12.45109000,883 +DA/SX-248,Kleiner Rammelsberg,,50.40164100,12.54539600,943 +DA/SX-249,Grosser Stein,,50.94208000,14.65896600,471 +DA/SX-250,Hutungsberg,,50.96947920,14.59746780,474 +DA/SX-251,Windmuehlberg,,50.94254000,14.60283000,421 +DA/SX-252,Grosser Berg,,50.97632000,14.79901000,438 +DA/SX-253,Pfarrberg,,51.02871000,14.62830000,435 +DA/SX-254,Beckenberg,,50.98328000,14.67155000,408 +DA/SX-255,Stumpfeberg,,50.96697000,14.68603000,439 +DA/SX-256,Thuemmelsberg,,51.10503300,13.78218400,225 +DA/SX-257,Wolfshuegel,,51.06977700,13.80503500,215 +DA/SX-258,Schlossberg,,50.92021000,14.15466000,222 +DA/TH-001,Schneekopf,,50.66690063,10.76329994,978 +DA/TH-002,Grosser Eisenberg,,50.62220001,10.78170013,907 +DA/TH-003,Greifenberg,,50.71360016,10.67469978,901 +DA/TH-004,Gebrannter Stein,,50.68970108,10.67000008,896 +DA/TH-005,Donnershauk,,50.72249985,10.63889980,893 +DA/TH-006,Neuhaeuser Huegel,,50.60329819,10.76809978,890 +DA/TH-007,Hohe Moest,,50.71250153,10.63580036,887 +DA/TH-008,Spitzer Berg,,50.67419815,10.70279980,881 +DA/TH-009,Ruppberg,,50.68420029,10.63939953,866 +DA/TH-010,Eisenberg,,50.48780060,11.11390018,852 +DA/TH-011,Adlersberg,,50.59140015,10.76640034,849 +DA/TH-012,Eselsberg,,50.51060104,10.96969986,841 +DA/TH-013,Hohe Scharte,,50.82139969,10.48169994,813 +DA/TH-014,Grosser Buchenberg,,50.75109863,10.63309956,812 +DA/TH-015,Stiefelkopf,,50.61920166,11.01469994,807 +DA/TH-016,Aschenbergstein,,50.85547100,10.50293000,653 +DA/TH-017,Sommerberg,,50.50189972,10.96220016,800 +DA/TH-018,Simmersberg,,50.50249863,10.89360046,780 +DA/TH-019,Schwefelkopf,,50.54560089,10.90779972,773 +DA/TH-020,Sieglitzberg,,50.42610168,11.60859966,733 +DA/TH-021,Kulmberg,,50.40859985,11.60060024,726 +DA/TH-022,Hohe Warth,,50.50389862,10.86610031,718 +DA/TH-023,Loosbrand,,50.39670181,11.17669964,700 +DA/TH-024,Steinhuegel,,50.38809967,11.23719978,699 +DA/TH-025,Bocksberg,,50.41279984,11.21310043,696 +DA/TH-026,Kahle Koppe,,50.88190079,10.40939999,690 +DA/TH-027,Kissel,,50.87189865,10.32250023,648 +DA/TH-028,Hessenhoehe,,50.38470078,11.20969963,647 +DA/TH-029,Ringberg,,50.90499878,10.35610008,638 +DA/TH-030,Grosser Ehrenberg,,51.63439941,10.68610001,635 +DA/TH-031,Stoffelskuppe,,50.72859955,10.21860027,620 +DA/TH-032,Poppenberg,,51.58810043,10.82779980,600 +DA/TH-033,Carolinenhoehe,,50.89440155,10.35560036,596 +DA/TH-034,Grosser Wartberg,,50.90079880,10.43080044,568 +DA/TH-035,Koenigsberg,,50.57609940,11.87689972,548 +DA/TH-036,Passberg,,50.64609909,10.57330036,530 +DA/TH-037,Warteberg,,51.32279968,10.18640041,516 +DA/TH-038,Riechheimer Berg,,50.88169861,11.12829971,512 +DA/TH-039,Junkerkuppe,,51.33169937,9.95219994,508 +DA/TH-040,Heldrastein,,51.11000061,10.18830013,504 +DA/TH-041,Trogberg,,51.47499847,10.32940006,502 +DA/TH-042,Kapellenberg,,50.47829819,10.66609955,492 +DA/TH-043,Scharfenstein,,51.36360168,10.26749992,480 +DA/TH-044,Gebraer Kopf,,51.42419815,10.56169987,446 +DA/TH-045,Kyffhaeuserberg,,51.41360092,11.10999966,440 +DA/TH-046,Grosser Seeberg,,50.92440033,10.78719997,409 +DA/TH-047,Buchberg,,50.78170013,11.50249958,408 +DA/TH-048,Leuchtenburg,,50.80390167,11.61250019,400 +DA/TH-049,Fuchsturm,,50.92419815,11.62559986,391 +DA/TH-050,Monraburg,,51.23749924,11.29139996,377 +DA/TH-051,Burg Gleichen,,50.88059998,10.83889961,369 +DA/TH-052,Koenigskopf,,51.52719879,10.90890026,358 +DA/TH-053,Grosser Herrnkopf,,51.38330078,11.05830002,330 +DA/TH-054,Muehlberg,,51.18389893,11.43470001,310 +DA/TH-055,Schlachtberg,,51.36830139,11.10439968,271 +DA/TH-056,Katzenburg,,51.40219879,10.57750034,477 +DA/TH-057,Birkenberg,,51.46310043,10.40279961,533 +DA/TH-058,Hockelrain,,51.34830093,10.27859974,515 +DA/TH-059,Rain,,51.23389816,10.27830029,517 +DA/TH-060,Hohe Warte,,50.69580078,10.83110046,765 +DA/TH-061,Rumpelsberg,,50.68750000,10.84029961,799 +DA/TH-062,Gabelsbachskopf,,50.67219925,10.80560017,772 +DA/TH-063,Sommersbachskopf,,50.66500092,10.72809982,943 +DA/TH-064,Wildekopf,,50.66189957,10.72529984,943 +DA/TH-065,Sachsenstein,,50.65250015,10.79189968,915 +DA/TH-066,Finsterbachkopf,,50.70690155,10.64859962,898 +DA/TH-067,Brand,,50.66830063,10.78030014,887 +DA/TH-068,Schuetzenberg,,50.69499969,10.68610001,878 +DA/TH-069,Saukopf,,50.72639847,10.67220020,869 +DA/TH-070,Salzberg,,50.61999893,10.76420021,866 +DA/TH-071,Brandleite,,50.68470001,10.72469997,862 +DA/TH-072,Duerre Fichte,,50.46360016,11.04640007,861 +DA/TH-073,Hoher Stein,,50.69689941,10.64439964,860 +DA/TH-074,Reinhardsberg,,50.86640167,10.57359982,483 +DA/TH-075,Oberlautenberg,,50.73580170,10.58969975,855 +DA/TH-076,Schorn,,50.73159500,10.62717600,854 +DA/TH-077,Breitenberg,,50.44169998,11.09189987,844 +DA/TH-078,Doerrkopf,,50.68109894,10.75389957,844 +DA/TH-079,Fellberg,,50.43560028,11.12720013,842 +DA/TH-080,Datenberg,,50.86859894,10.49919987,841 +DA/TH-081,Grosser Erleshuegel,,50.61360168,10.74470043,839 +DA/TH-082,Pechleite,,50.47809982,10.98890018,839 +DA/TH-083,Grosser Dreiherrenstein,,50.60609818,10.89830017,838 +DA/TH-084,Fehrenberg,,50.51689911,10.95079994,835 +DA/TH-085,Pappenheimer Berg,,50.48389816,11.18060017,835 +DA/TH-086,Buhler,,50.41809845,11.08720016,829 +DA/TH-087,Grosser Helmsberg,,50.62220001,10.88749981,828 +DA/TH-088,Buchskopf,,50.69390106,10.73670006,825 +DA/TH-089,Kalte Heide,,50.82720184,10.49059963,825 +DA/TH-090,Grosser Hundskopf,,50.60889816,10.87189960,824 +DA/TH-091,Grosser Mittelberg,,50.42419815,11.08720016,822 +DA/TH-092,Ruettelsberg,,50.46640015,11.02079964,822 +DA/TH-093,Reischelberg,,50.59030151,10.95499992,821 +DA/TH-094,Grosser Zigeunerberg,,50.48889923,11.13059998,820 +DA/TH-095,Wurzelberg,,50.52420044,11.04920006,820 +DA/TH-096,Fuerstenberg,,50.61830139,10.91829967,818 +DA/TH-097,Grosser Burgberg,,50.59170151,10.90719986,817 +DA/TH-098,Eckardtskopf,,50.70109940,10.75220013,815 +DA/TH-099,Dreiherrenstein,,50.61080170,10.88939953,814 +DA/TH-100,Hinterer Hoehenberg,,50.79059982,10.53059959,814 +DA/TH-101,Rotebachhoeg,,50.74530029,10.59109974,814 +DA/TH-102,Hintere Haube,,50.57690048,10.95189953,811 +DA/TH-103,Kleiner Mittelberg,,50.43470001,11.06939983,811 +DA/TH-104,Tanzbuche,,50.84249878,10.52420044,810 +DA/TH-105,Beerberg,,50.60469818,10.73530006,808 +DA/TH-106,Hettstaedt,,50.55170059,11.13469982,808 +DA/TH-107,Kallenberg,,50.43420029,11.08640003,808 +DA/TH-108,Trockenberg,,50.83969879,10.49170017,808 +DA/TH-109,Grosser Tierberg,,50.45500183,11.16170025,806 +DA/TH-110,Hohe Tanne,,50.64749908,10.87670040,806 +DA/TH-111,Mittelberg,,50.51190186,11.19279957,804 +DA/TH-112,Loeschleitenberg,,50.49860001,11.06579971,801 +DA/TH-113,Hellenberg,,50.72809982,10.60579967,799 +DA/TH-114,Roter Berg,,50.49420166,11.23530006,799 +DA/TH-115,Wasserberg,,50.41360092,11.09669971,798 +DA/TH-116,Limberg,,50.47669983,11.20359993,793 +DA/TH-117,Vorderer Hoehenberg,,50.77610016,10.52000046,793 +DA/TH-118,Heuberg,,50.46939850,10.98250008,792 +DA/TH-119,Frohnberg,,50.47940063,10.95750046,791 +DA/TH-120,Goerlitzberg,,50.46860123,11.12559986,791 +DA/TH-121,Kohlhieb,,50.56499863,10.93389988,790 +DA/TH-122,Naehertalskopf,,50.74140167,10.64420033,789 +DA/TH-123,Grendel,,50.47829819,10.93859959,787 +DA/TH-124,Koppe,,50.57310104,11.10859966,786 +DA/TH-125,Steinhauk,,50.69139862,10.61999989,786 +DA/TH-126,Apelsberg,,50.51530075,11.15579987,785 +DA/TH-127,Kirchberg,,50.57640076,11.14970016,784 +DA/TH-128,Leimbuehl,,50.67029953,10.82470036,784 +DA/TH-129,Schmiedswiesenkopf,,50.55530167,10.86060047,784 +DA/TH-130,Sieger,,50.43830109,11.03890038,784 +DA/TH-131,Breiter Berg,,50.45280075,11.17500019,783 +DA/TH-132,Bloessberg,,50.44689941,11.05440044,782 +DA/TH-133,Hoeheberg,,50.51060104,10.90810013,780 +DA/TH-134,Grosser Muenzeberg,,50.74029922,10.68190002,774 +DA/TH-135,Himmelsleiter,,50.56689835,11.13720036,774 +DA/TH-136,Kienberg,,50.65029907,10.93109989,774 +DA/TH-137,Wadeberg,,50.72109985,10.72169971,773 +DA/TH-138,Hirschkopf,,50.66690063,10.83829975,772 +DA/TH-139,Himmelreichskopf,,50.68080139,10.82279968,771 +DA/TH-140,Silberberg,,50.61439896,10.95530033,771 +DA/TH-141,Kalter Staudenkopf,,50.54000092,10.85499954,768 +DA/TH-142,Kramerod,,50.76559830,10.56219959,765 +DA/TH-143,Brandkuppe,,50.44440079,11.07139969,764 +DA/TH-144,Grauer Stuhl,,50.81610107,10.49919987,763 +DA/TH-145,Laerchenkopf,,50.72249985,10.73999977,762 +DA/TH-146,Nesselberg,,50.78059700,10.56327400,747.3 +DA/TH-147,Rodeberg,,50.50640106,11.22439957,761 +DA/TH-148,Eckardtsberg,,50.47140121,10.92720032,760 +DA/TH-149,Eisfelder,,50.45280075,10.98719978,760 +DA/TH-150,Schanze,,50.56190109,11.14920044,760 +DA/TH-151,Oelberg,,50.74420166,10.63609982,760 +DA/TH-152,Trockentalskopf,,50.75220108,10.67420006,759 +DA/TH-153,Steinberg,,50.63529968,10.94060040,758 +DA/TH-154,Jungferbornskopf,,50.51219940,11.04669952,758 +DA/TH-155,Hammerleite,,50.43780136,11.25059986,757 +DA/TH-156,Schnetter Berg,,50.51250076,10.89309978,757 +DA/TH-157,Strassenberg,,50.42689896,11.05220032,756 +DA/TH-158,Hirschstein,,50.51440048,11.23309994,755 +DA/TH-159,Drehberg,,50.85359955,10.43640041,754 +DA/TH-160,Kernberg,,50.74190140,10.55080032,752 +DA/TH-161,Koehlerberg,,50.63169861,10.91670036,751 +DA/TH-162,Lindenberg,,50.66690063,10.90690041,749 +DA/TH-163,Spiessberg,,50.82139969,10.53919983,749 +DA/TH-164,Dreiherrnstein,,50.84939957,10.41639996,747 +DA/TH-165,Lautersberg,,50.63190079,10.84360027,747 +DA/TH-166,Grosser Roedel,,50.66139984,10.82999992,746 +DA/TH-167,Unterer Geiersberg,,50.64530182,10.73390007,746 +DA/TH-168,Kleiner Buchenberg,,50.75249863,10.62110043,745 +DA/TH-169,Ringberg,,50.61669922,10.72220039,745 +DA/TH-170,Steinbiel,,50.53359985,11.13969994,745 +DA/TH-171,Spitze,,50.77080154,10.67360020,742 +DA/TH-172,Glashuegel,,50.48809814,11.28499985,741 +DA/TH-173,Holzberg,,50.52420044,10.91329956,740 +DA/TH-174,Auerhahnsbalze,,50.78079987,10.66639996,739 +DA/TH-175,Lindigkopf,,50.52690125,11.08310032,739 +DA/TH-176,Mittelberg,,50.68809891,10.81420040,739 +DA/TH-177,Koenigsknuebel,,50.65610123,10.70890045,738 +DA/TH-178,Fichteberg,,50.44469833,11.47169971,737 +DA/TH-179,Goldberg,,50.50389862,10.99139977,736 +DA/TH-180,Hammerbuehl,,50.47779846,11.27250004,735 +DA/TH-181,Hohe Schlaufe,,50.67530060,10.89190006,735 +DA/TH-182,Oberer Pirschhauskopf,,50.80469894,10.54810047,735 +DA/TH-183,Regenberg,,50.84140015,10.53719997,734 +DA/TH-184,Siegelberg,,50.76580048,10.75920010,734 +DA/TH-185,Langenbachsberg,,50.48809814,11.00749969,733 +DA/TH-186,Schauenburg,,50.84640121,10.55249977,733 +DA/TH-187,Tragberg,,50.71170044,10.77110004,731 +DA/TH-188,Rennwegskopf,,50.82500076,10.40610027,730 +DA/TH-189,Gerberstein,,50.85940170,10.39330006,729 +DA/TH-190,Tenneberg,,50.84690094,10.51189995,729 +DA/TH-191,Zapfenberg,,50.51779938,11.25940037,729 +DA/TH-192,Matteboehlar,,50.75780106,10.68389988,728 +DA/TH-193,Hinterer Brandkopf,,50.63809967,10.97220039,727 +DA/TH-194,Finkenberg,,50.42499924,11.51860046,726 +DA/TH-195,Volkmarskopf,,50.58610153,10.81890011,726 +DA/TH-196,Vorderer Mondhuegel,,50.47000122,11.29279995,726 +DA/TH-197,Beerhuegel,,50.51110077,11.31939983,725 +DA/TH-198,Kleiner Weissenberg,,50.86330032,10.41059971,725 +DA/TH-199,Geiersberg,,50.41970062,11.11999989,724 +DA/TH-200,Hinterer Mondhuegel,,50.45640182,11.27830029,723 +DA/TH-201,Kiesslich,,50.45000076,11.42389965,723 +DA/TH-202,Wilhelmsleite,,50.65940094,10.83860016,723 +DA/TH-203,Kienberg,,50.77890015,10.74170017,720 +DA/TH-204,Rehhecke,,50.56829834,11.18529987,720 +DA/TH-205,Heuberg,,50.82920074,10.52779961,719 +DA/TH-206,Gaensberg,,50.81470108,10.45530033,718 +DA/TH-207,Kohlberg,,50.49530029,10.88640022,718 +DA/TH-208,Birkenheide,,50.86389923,10.35169983,717 +DA/TH-209,Oberschaar,,50.39670181,11.13780022,716 +DA/TH-210,Rosenberg,,50.54779816,11.08310032,716 +DA/TH-211,Steinruecke,,50.64670181,10.62689972,716 +DA/TH-212,Ebershuegel,,50.47109985,11.31499958,714 +DA/TH-213,Grosser Muehlberg,,50.40470123,11.13280010,714 +DA/TH-214,Simmetsberg,,50.85060120,10.52309990,713 +#DA/TH-215,Ãœbelberg,,50.86000061,10.51580048,713 +DA/TH-216,Grosser Boehler,,50.74750137,10.70440006,712 +DA/TH-217,Hammerberg,,50.45439911,11.22500038,712 +DA/TH-218,Judenkopf,,50.81779861,10.40670013,712 +DA/TH-219,Sommerberg,,50.54919815,10.83940029,712 +DA/TH-220,Unterer Beerberg,,50.83580017,10.40859985,711 +DA/TH-221,Geuserberg,,50.25000000,11.46560001,708 +DA/TH-222,Kleiner Inselsberg,,50.86059952,10.46249962,706 +DA/TH-223,Regenberg,,50.64920044,10.64690018,706 +DA/TH-224,Mommelstein,,50.80279922,10.44499969,704 +DA/TH-225,Sonneberger Berg,,50.41859818,11.14579964,704 +DA/TH-226,Poppenberg,,50.56029892,11.17329979,703 +DA/TH-227,Brand,,50.68579865,10.60939980,702 +DA/TH-228,Hangeberg,,50.68809891,10.88169956,702 +DA/TH-229,Audeberg,,50.55500031,10.80780029,701 +DA/TH-230,Gemeindekuppe,,50.50970078,11.26580048,701 +DA/TH-231,Waldsberg,,50.72689819,10.77470016,701 +DA/TH-232,Streitberg,,50.76610184,10.70059967,699 +DA/TH-233,Hoher Berg,,50.71829987,10.56779957,698 +DA/TH-234,Oelzer Rain,,50.54970169,11.00279999,698 +DA/TH-235,Wagenberg,,50.56439972,10.80720043,698 +DA/TH-236,Reuster Berg,,50.83110046,12.19439983,370 +DA/TH-237,Falkenhuegel,,50.59059906,11.13640022,697 +DA/TH-238,Huebelskopf,,50.86780167,10.47920036,695 +DA/TH-239,Steiniger Berg,,50.79140091,10.71889973,694 +DA/TH-240,Vitzberg,,50.57189941,11.02169991,693 +DA/TH-241,Duerrberg,,50.63499832,10.65470028,692 +DA/TH-242,Mittelberg,,50.67419815,10.61830044,691 +DA/TH-243,Blassenberg,,50.49060059,10.92560005,690 +DA/TH-244,Glashuegel,,50.43750000,11.51420021,688 +DA/TH-245,Grosser Mittelberg,,50.40439987,11.16689968,688 +DA/TH-246,Grosser Foerst,,50.43529892,11.20720005,688 +DA/TH-247,Kirchhuegel,,50.42309952,11.55309963,688 +DA/TH-248,Steinkopf,,50.79309845,10.67420006,688 +DA/TH-249,Arnsberg,,50.70920181,10.58139992,685 +DA/TH-250,Krippenkopf,,50.75469971,10.73079967,684 +DA/TH-251,Unterlautenberg,,50.72190094,10.59329987,684 +DA/TH-252,Bock,,50.62810135,10.65970039,682 +DA/TH-253,Grosser Brand,,50.40689850,11.48670006,682 +DA/TH-254,Ziegenrueck,,50.57329941,10.78829956,682 +DA/TH-255,Vogelberg,,50.44469833,11.53969955,681 +DA/TH-256,Abtsberg,,50.85440063,10.53810024,679 +DA/TH-257,Dicker Berg,,50.69469833,10.59280014,679 +DA/TH-258,Dreiherrenstein,,50.70092000,10.70625800,903.8 +DA/TH-259,Schwarzberg,,50.67470169,10.65330029,678 +DA/TH-260,Borzelberg,,50.73939896,10.76939964,677 +DA/TH-261,Klingenberg,,50.46360016,10.90079975,677 +DA/TH-262,Milchberg,,50.59809875,11.03890038,676 +DA/TH-263,Kleiner Hermannsberg,,50.70999908,10.60330009,674 +DA/TH-264,Ziegelberg,,50.80059814,10.67920017,673 +DA/TH-265,Brandkopf,,50.80440140,10.67109966,672 +DA/TH-266,Mittelberg,,50.41109848,11.51029968,672 +DA/TH-267,Grosser Mittelberg,,50.41859818,11.18579960,671 +DA/TH-268,Moosbachskopf,,50.67060089,10.84920025,671 +DA/TH-269,Winsberg,,50.85219955,10.34889984,671 +DA/TH-270,Grosser Herrenhuegel,,50.58470154,10.79559994,669 +DA/TH-271,Loebesberg,,50.81470108,10.50669956,669 +DA/TH-272,Boehmer Berg,,50.63529968,10.66829967,668 +DA/TH-273,Beerberg,,50.59859848,11.05560017,667 +DA/TH-274,Gloeckner,,50.86300000,10.37340000,702 +DA/TH-275,Barigauer Hoehe,,50.62969971,11.10750008,665 +DA/TH-276,Lerchenhuegel,,50.38940048,11.50249958,665 +DA/TH-277,Wiesenberg,,50.75859833,10.54170036,665 +DA/TH-278,Heinersdorfer Hoehe,,50.41889954,11.28719997,664 +DA/TH-279,Totenkopf,,50.39749908,11.47560024,664 +DA/TH-280,Vogelherdskopf,,50.79359818,10.65639973,663 +DA/TH-281,Grosser Mittelrain,,50.77939987,10.58329964,662 +DA/TH-282,Grosser Klettnitzberg,,50.40919876,11.25139999,660 +DA/TH-283,Hirschbalz,,50.80889893,10.52779961,660 +DA/TH-284,Weissenberg,,50.79919815,10.51529980,660 +DA/TH-285,Die Fals,,50.39110184,11.53919983,659 +DA/TH-286,Hexenstein,,50.64810181,10.96080017,659 +DA/TH-287,Turmberg,,50.76810074,10.74030018,659 +DA/TH-288,Ehrenberg,,50.57809830,10.63169956,658 +DA/TH-289,Sommerberg,,50.56919861,10.68280029,656 +DA/TH-290,Metze,,50.66419983,10.61890030,655 +DA/TH-291,Heinersberg,,50.37810135,11.54559994,653 +DA/TH-292,Kirchberg,,50.57279968,10.64060020,652 +DA/TH-293,Arlesberg,,50.71220016,10.81029987,651 +DA/TH-294,Bloecherhuegel,,50.36890030,11.54580021,649 +DA/TH-295,Arnsberg,,50.86470032,10.32830048,648 +DA/TH-296,Friedlersberg,,50.51060104,11.30469990,646 +DA/TH-297,Stiller Stein,,50.70830154,10.51500034,646 +DA/TH-298,Kesselberg,,50.56330109,10.62969971,644 +DA/TH-299,Wirtsberg,,50.38560104,11.47749996,644 +DA/TH-300,Salzleckenkopf,,50.52830124,10.82439995,640 +DA/TH-301,Hohe Schlaufe,,50.77920151,10.65170002,639 +DA/TH-302,Flossberg,,50.67110062,10.91860008,638 +DA/TH-303,Saarsknock,,50.36669922,11.45810032,636 +DA/TH-304,Kleiner Mittelberg,,50.43170166,11.18999958,634 +DA/TH-305,Koernberg,,50.84809875,10.57170010,633 +DA/TH-306,Totenkopf,,50.80860138,10.66250038,633 +DA/TH-307,Galgenberg,,50.56330109,10.62189960,632 +DA/TH-308,Weisser Stein,,50.73139954,10.86330032,632 +DA/TH-309,Hasenberg,,50.61560059,11.06610012,631 +DA/TH-310,Hesselkopf,,50.87889862,10.41499996,631 +DA/TH-311,Fichtig,,50.61780167,11.08500004,629 +DA/TH-312,Zimmerberg,,50.86529922,10.51939964,628 +DA/TH-313,Buckenberg,,50.38669968,11.51690006,627 +DA/TH-314,Roter Steinberg,,50.59999847,11.15079975,627 +DA/TH-315,Silberbacher Kuppe,,50.53969955,10.79440022,627 +DA/TH-316,Winterberg,,50.47999954,11.40559959,627 +DA/TH-317,Donnersberg,,50.54470062,10.69999981,625 +DA/TH-318,Galgenberg,,50.38970184,11.39000034,625 +DA/TH-319,Doernberg,,50.71189880,10.51169968,624 +DA/TH-320,Kammerkuppe,,50.77560043,10.44579983,623 +DA/TH-321,Mittelrain,,50.78689957,10.65190029,623 +DA/TH-322,Heftenberg,,50.71500015,10.52719975,620 +DA/TH-323,Arzberg,,50.70439911,10.55360031,618 +DA/TH-324,Bergmannskopf,,50.73749924,10.78359985,616 +DA/TH-325,Eichenberg,,50.56750107,10.60499954,613 +DA/TH-326,Auberg,,50.58499908,10.61999989,609 +DA/TH-327,Regenberg,,50.36360168,11.51109982,609 +DA/TH-328,Knock,,50.34109879,11.47579956,608 +DA/TH-329,Scheffelsberg,,50.55810165,11.04559994,607 +DA/TH-330,Lichtenhainer Hoehe,,50.59920120,11.12110043,606 +DA/TH-331,Weinberg,,50.78440094,10.44190025,605 +DA/TH-332,Eulenberg,,50.47389984,11.36139965,604 +DA/TH-333,Hainberg,,50.55830002,11.07219982,602 +DA/TH-334,Gipfel,,50.41189957,11.41749954,601 +DA/TH-335,Heckenberg,,50.56719971,11.07810020,601 +DA/TH-336,Bromberg,,50.33140182,11.47140026,598 +DA/TH-337,Heidelberg,,50.67330170,10.59000015,594 +DA/TH-338,Johannisberg,,50.63079834,11.12689972,592 +DA/TH-339,Hirschberg,,50.65029907,11.25109959,589 +DA/TH-340,Kleiner Gieselsberg,,50.77190018,10.43420029,589 +DA/TH-341,Stinberg,,50.61330032,11.11940002,587 +DA/TH-342,Haselkoppe,,50.78329849,10.95829964,586 +DA/TH-343,Reuterkoepfe,,50.53969955,10.72690010,584 +DA/TH-344,Hainberg,,50.66139984,11.27250004,583 +DA/TH-345,Biberschlag,,50.49309921,10.87310028,580 +DA/TH-346,Todemann,,50.90530014,10.33829975,580 +DA/TH-347,Solaberg,,50.46110153,10.82250023,577 +DA/TH-348,Hohe Klinge,,50.81689835,10.39280033,575 +DA/TH-349,Rohrhammer,,50.55139923,11.04469967,575 +DA/TH-350,Curau,,50.59189987,11.09189987,573 +DA/TH-351,Dittersdorfer Hoehe,,50.65110016,11.23110008,572 +DA/TH-352,Eichkoepfe,,50.65560150,11.29860020,572 +DA/TH-353,Stelzener Berg,,50.43999863,10.96360016,571 +DA/TH-354,Heuberg,,50.82559967,10.57359982,570 +DA/TH-355,Pfefferberg,,50.80440140,10.48110008,570 +DA/TH-356,Doerrberg,,50.72940063,10.79640007,568 +DA/TH-357,Gaertleser Hoehe,,50.52920151,10.57970047,565 +DA/TH-358,Schauberg,,50.36439896,11.48919964,565 +DA/TH-359,Thielberg,,50.87810135,10.43420029,565 +DA/TH-360,Drosselleite,,50.64059830,10.45440006,564 +DA/TH-361,Hirschberg,,50.71889877,10.50469971,562 +DA/TH-362,Henneberger Leite,,50.70470047,10.88440037,560 +DA/TH-363,Haardt,,50.59140015,10.65810013,558 +DA/TH-364,Ziegenhoehler,,50.78810120,10.70610046,558 +DA/TH-365,Zipptannskuppe,,50.63890076,11.29310036,657 +DA/TH-366,Aschenkopf,,50.62829971,10.62639999,556 +DA/TH-367,Hohe Roch,,50.72470093,10.51640034,556 +DA/TH-368,Diestel,,50.58420181,10.66390038,552 +DA/TH-369,Feldstein,,50.52859879,10.63420010,552 +DA/TH-370,Mittelberg,,50.45970154,10.77219963,552 +DA/TH-371,Veronikaberg,,50.72969818,10.90499973,552 +DA/TH-372,Duerrenberg,,50.63999939,10.43280029,549 +DA/TH-373,Schneeberg,,50.63330078,10.42169952,547 +DA/TH-374,Vorderer Breitenberg,,50.63219833,11.32470036,547 +DA/TH-375,Kirchberg,,50.69309998,10.57579994,545 +DA/TH-376,Gottlobsberg,,50.77809906,10.98169994,544 +DA/TH-377,Oberer Beerberg,,50.84573200,10.44747200,831.1 +DA/TH-378,Vogelherd,,50.66360092,10.58920002,537 +DA/TH-379,Kahler Berg,,50.75220108,10.91110039,536 +DA/TH-380,Mittelberg,,50.47829819,10.72609997,536 +DA/TH-381,Schlossberg,,50.31999969,11.50389957,534 +DA/TH-382,Eichenberg,,50.71030045,10.98309994,533 +DA/TH-383,Sandberg,,50.55080032,10.64309978,533 +DA/TH-384,Silbachshoehe,,50.58720016,10.57390022,531 +DA/TH-385,Windberg,,50.58280182,10.58419991,530 +DA/TH-386,Kuppe,,50.42750168,10.59469986,529 +DA/TH-387,Meisenstein,,50.89300000,10.43180000,559 +DA/TH-388,Grosser Hund,,50.76530075,11.11830044,526 +DA/TH-389,Oelberg,,50.83890152,10.60330009,526 +DA/TH-390,Hainberg,,50.63029861,10.43889999,525 +DA/TH-391,Honigsberg,,50.48030090,10.47669983,525 +DA/TH-392,Huehnberg,,50.78170013,10.43060017,524 +DA/TH-393,Kammberg,,50.74280167,10.82940006,524 +DA/TH-394,Lindenberg,,50.68610001,10.44750023,523 +DA/TH-395,Geiersberg,,50.64139938,11.13749981,522 +DA/TH-396,Herrenkuppe,,50.69309998,10.43970013,522 +DA/TH-397,Hoehnberg,,50.80030060,10.40830040,522 +DA/TH-398,Kesselberg,,50.70080185,11.26280022,522 +DA/TH-399,Kleiner Wartberg,,50.90530014,10.42029953,522 +DA/TH-400,Eichenkopf,,50.79190063,10.42109966,521 +DA/TH-401,Silberberg,,50.67559814,11.24079990,521 +DA/TH-402,Finstere Tanne,,50.87580109,10.54249954,520 +DA/TH-403,Knoepfelsberg,,50.80970001,10.69939995,519 +DA/TH-404,Schwanberg,,50.43719864,10.57940006,519 +DA/TH-405,Wiesenberg,,50.53829956,10.64249992,518 +DA/TH-406,Laubberg,,50.43970108,10.67940044,515 +DA/TH-407,Heiligenberg,,50.62440109,10.41170025,514 +DA/TH-408,Heiliger Berg,,50.61169815,10.64999962,513 +DA/TH-409,Schwabhaeuser Berg,,50.42810059,10.57279968,511 +DA/TH-410,Sandersberg,,50.60940170,10.61499977,510 +DA/TH-411,Steinkopf,,50.75469971,10.43500042,509 +DA/TH-412,Kunitzberg,,50.74110031,11.23859978,508 +DA/TH-413,Moenchberg,,50.69250107,10.42140007,508 +DA/TH-414,Queienberg,,50.45029831,10.47360039,508 +DA/TH-415,Burgberg,,50.53219986,10.66189957,506 +DA/TH-416,Haunberg,,50.77529907,11.11170006,506 +DA/TH-417,Rabenhuegel,,50.63940048,11.16059971,506 +DA/TH-418,Dietrich,,50.44499969,10.51060009,505 +DA/TH-419,Heitzberg,,50.67860031,10.41469955,505 +DA/TH-420,Hohe Wart,,50.40309906,10.77029991,505 +DA/TH-421,Hummelsberg,,50.78559875,11.36310005,504 +DA/TH-422,Hoelschberg,,50.56079865,10.52330017,503 +DA/TH-423,Katzenberg,,50.52000046,10.65919971,503 +DA/TH-424,Kienberg,,50.71329880,10.95750046,503 +DA/TH-425,Maeuseberg,,50.77310181,10.98810005,503 +DA/TH-426,Langer Berg,,50.51689911,10.46689987,502 +DA/TH-427,Roderberg,,50.64440155,11.17420006,502 +DA/TH-428,Willinger Berg,,50.75939941,11.01029968,502 +DA/TH-429,Frohnberg,,50.51860046,10.48639965,501 +DA/TH-430,Platte,,50.44079971,10.52190018,501 +DA/TH-431,Michelsdorf,,50.51940155,10.51420021,496 +DA/TH-432,Stadtberg,,50.41640091,10.72189999,496 +DA/TH-433,Ahlberg,,50.48830032,10.45219994,495 +DA/TH-434,Zimmerberg,,50.67079926,10.42189980,495 +DA/TH-435,Alter Berg,,51.05189896,10.45750046,494 +DA/TH-436,Haelsberg,,50.53779984,10.48690033,494 +DA/TH-437,Edelmannsberg,,50.75609970,11.08670044,492 +DA/TH-438,Hetzert,,50.55749893,10.53110027,491 +DA/TH-439,Dachsberg,,50.86109924,10.59440041,490 +DA/TH-440,Wallingsberg,,51.34059906,10.46310043,490 +DA/TH-441,Rossbachhoehe,,50.69919968,10.43529987,489 +DA/TH-442,Schlotberg,,50.46580124,10.48719978,489 +DA/TH-443,Katzenberg,,50.88890076,11.13939953,488 +DA/TH-444,Krautberg,,50.41439819,10.73359966,488 +DA/TH-445,Schweinskopf,,50.79579926,11.09720039,488 +DA/TH-446,Moeckser Hoehe,,50.68719864,10.40719986,487 +DA/TH-447,Sollstedter Warte,,51.31470108,10.48309994,487 +DA/TH-448,Schweinsberg,,50.79309845,10.89920044,486 +DA/TH-449,Wiederkomms Hoeg,,50.83795166,10.64619732,486 +DA/TH-450,Kuhberg,,50.79859924,10.96500015,485 +DA/TH-451,Ziegenberg,,50.77470016,10.85610008,485 +DA/TH-452,Geroder Berg,,50.56529999,10.51140022,484 +DA/TH-453,Craulaer Hausmassen,,51.06969833,10.45530033,483 +DA/TH-454,Kohlberg,,50.52170181,10.49829960,483 +DA/TH-455,Quingerberg,,50.90499878,11.18669987,483 +DA/TH-456,Bitthaeuser Berg,,50.55310059,10.48970032,482 +DA/TH-457,Reitzenberg,,50.90999985,10.44970036,482 +DA/TH-458,Stedtberg,,50.54029846,10.51080036,482 +DA/TH-459,Doerrberg,,50.39780045,10.77110004,481 +DA/TH-460,Doettberg,,50.51860046,10.45030022,479 +DA/TH-461,Rothkuppe,,50.74190140,10.42360020,479 +DA/TH-462,Wolfsberg,,50.89220047,11.11610031,478 +DA/TH-463,Kolmberg,,50.71310043,11.23530006,477 +DA/TH-464,Eichelberg,,50.51250076,10.44750023,476 +DA/TH-465,Galgenberg,,50.87559891,11.35809994,476 +DA/TH-466,Kaltenberg,,50.41220093,10.70580006,476 +DA/TH-467,Kalter Berg,,51.30690002,10.47309971,476 +DA/TH-468,Mittelberg,,50.51029968,10.50969982,476 +DA/TH-469,Steinberg,,50.79420090,11.31809998,476 +DA/TH-470,Sanertberg,,50.50469971,10.47749996,475 +DA/TH-471,Trippstein,,50.65219879,11.18579960,475 +DA/TH-472,Weimarberg,,50.70610046,10.43080044,474 +DA/TH-473,Grosser Eller,,50.54029846,10.61970043,473 +DA/TH-474,Renn,,51.04750061,10.47360039,473 +DA/TH-475,Eichberg,,50.89390182,11.15810013,471 +DA/TH-476,Kesselberg,,50.90470123,11.22169971,471 +DA/TH-477,Vogelherd,,50.90060043,11.32859993,471 +DA/TH-478,Eisenberg,,50.89170074,10.31389999,470 +DA/TH-479,Ruettelsberg,,50.91419983,11.20750046,470 +DA/TH-480,Schossberg,,50.90919876,10.39500046,470 +DA/TH-481,Treppendorfer Berg,,50.81969833,11.27169991,470 +DA/TH-482,Buchenberg,,50.75419998,11.19079971,469 +DA/TH-483,Holzberg,,50.87810135,11.38939953,469 +DA/TH-484,Zeiberg,,50.42610168,10.63780022,469 +DA/TH-485,Loehberg,,51.05419922,10.42889977,468 +DA/TH-486,Winterstein,,51.14609909,10.35359955,468 +DA/TH-487,Otterbuehl,,51.07329941,10.42940044,466 +DA/TH-488,Bombenberg,,50.87189865,11.36559963,465 +DA/TH-489,Forstberg,,50.71860123,11.20390034,465 +DA/TH-490,Wachenberg,,50.86500168,11.40190029,465 +DA/TH-491,Harnisch,,51.30580139,10.53579998,464 +DA/TH-492,Hirschstein,,50.92750168,10.32079983,464 +DA/TH-493,Schwallunger Berg,,50.66529846,10.40610027,464 +DA/TH-494,Kesselberg,,50.84719849,11.41749954,463 +DA/TH-495,Milmesberg,,50.90689850,10.25469971,461 +DA/TH-496,Sommerstein,,51.15219879,10.33440018,461 +DA/TH-498,Kirschberg,,50.71889877,11.25139999,460 +DA/TH-499,Reinhardtsberg,,50.84780121,11.16110039,460 +DA/TH-500,Grosser Wolfskuppe,,50.79219818,10.37689972,459 +DA/TH-501,Buchberg,,50.76639938,11.07779980,458 +DA/TH-502,Grosser Kroetenkopf,,50.84690094,10.32610035,457 +DA/TH-503,Grosser Zimmerberg,,51.06420135,10.44110012,456 +DA/TH-504,Gebrannter Kopf,,51.13809967,10.35359955,455 +DA/TH-505,Linkberg,,50.42720032,10.62189960,455 +DA/TH-506,Ringelsberg,,50.65610123,10.40219975,455 +DA/TH-507,Eichberg,,50.90060043,10.28829956,454 +DA/TH-508,Geiersberg,,50.82030106,11.29440022,454 +DA/TH-509,Kambuehl,,50.92250061,10.45639992,454 +DA/TH-510,Wachstein,,50.91440000,10.33900000,496 +DA/TH-511,Zollberg,,50.55030060,10.50440025,453 +DA/TH-512,Der Berg,,51.41059875,10.64669991,451 +DA/TH-513,Haardt,,51.10189819,10.38220024,451 +DA/TH-514,Starkenberg,,50.54059982,10.56029987,451 +DA/TH-515,Vorwerkshuegel,,50.82080078,11.45030022,451 +DA/TH-516,Ziegenschneller,,50.80640030,11.43970013,451 +DA/TH-517,Kottenhainer Hoehe,,50.83359909,11.38829994,449 +DA/TH-518,Steiger,,51.08470154,10.40830040,449 +DA/TH-519,Wipferkopf,,50.72249985,10.95779991,449 +DA/TH-520,Wuester Weinberg,,50.82889938,11.30140018,449 +DA/TH-521,Arnstein,,50.52690125,10.56719971,448 +DA/TH-522,Knollenberg,,50.57970047,10.54640007,448 +DA/TH-523,Stiebelskuppe,,50.96500015,10.24919987,448 +DA/TH-524,Kleine Wolfskuppe,,50.78670120,10.38360023,447 +DA/TH-525,Zimmritzer Hoehe,,50.85110092,11.50780010,447 +DA/TH-526,Buchberge,,50.78170013,11.48060036,446 +DA/TH-527,Seelig,,50.39329910,10.73060036,446 +DA/TH-528,Alter Busch,,51.04109955,10.44219971,445 +DA/TH-529,Gruebelsberg,,50.89530182,10.49530029,444 +DA/TH-530,Hangleite,,50.38859940,10.73919964,444 +DA/TH-531,Nuesslerliefe,,50.76219940,10.40919971,444 +DA/TH-532,Ruesselskopf,,50.95669937,10.25220013,444 +DA/TH-533,Wachenberg,,50.85559845,11.43360043,444 +DA/TH-534,Windberg,,50.52059937,10.61830044,444 +DA/TH-535,Sandberg,,50.88980000,10.47990000,415 +DA/TH-536,Hopfberg,,50.79999924,11.47360039,443 +DA/TH-537,Neuenstein,,51.08779907,10.39500046,443 +DA/TH-538,Teilberg,,51.40309906,10.71329975,443 +DA/TH-539,Hexenberg,,50.91439819,11.27190018,442 +DA/TH-540,Kugelberg,,50.79940033,11.50329971,442 +DA/TH-541,Pfaffenberg,,50.89559937,10.28670025,442 +DA/TH-542,Rittergasserberg,,51.04140091,10.49059963,442 +DA/TH-543,Steinberg,,50.89720154,11.18669987,439 +DA/TH-544,Eisenhuegel,,50.43579865,10.53579998,438 +DA/TH-545,Hehlig,,50.56330109,10.56919956,436 +DA/TH-546,Kleiner Hoerselberg,,50.96390152,10.40579987,436 +DA/TH-547,Dudelberg,,51.13779831,10.31610012,435 +DA/TH-548,Haeselberg,,50.70360184,10.41689968,435 +DA/TH-549,Hummelreich,,50.84439850,11.44750023,434 +DA/TH-550,Totenkopf,,51.09560013,10.39330006,434 +DA/TH-551,Polarskopf,,50.90859985,10.49580002,433 +DA/TH-552,Possen,,51.33890152,10.85779953,432 +DA/TH-553,Rehn,,50.86389923,11.44999981,432 +DA/TH-554,Pfennigsberg,,50.83750153,10.90970039,431 +DA/TH-555,Salkopf,,50.93640137,10.30780029,430 +DA/TH-556,Wartenberg,,51.03390121,10.45310020,430 +DA/TH-557,Woebelsburg,,51.40919876,10.70419979,429 +DA/TH-558,Jaegersberg,,50.84329987,11.47329998,428 +DA/TH-559,Krayenberg,,50.53189850,10.53940010,428 +DA/TH-560,Galgenkopf,,50.89920044,10.45919991,426 +DA/TH-561,Saarkopf,,50.77830124,10.38169956,426 +DA/TH-562,Breitenberg,,50.92079926,11.26169968,424 +DA/TH-563,Karthaeuserberg,,50.92580032,10.30389977,424 +DA/TH-564,Lohberg,,51.04330063,10.41810036,424 +DA/TH-565,Steckenberg,,51.40140152,10.68140030,424 +DA/TH-566,Steiler Huegel,,50.73970032,10.39560032,424 +DA/TH-567,Eichberg,,51.06330109,10.40499973,422 +DA/TH-568,Rodberg,,50.86309814,11.12390041,422 +DA/TH-569,Bock,,50.82360077,11.43060017,421 +DA/TH-570,Schlegelsberg,,50.79719925,10.37189960,421 +DA/TH-571,Wachsenburg,,50.85860062,10.87609959,421 +DA/TH-572,Ingelstedter Berg,,51.34280014,10.64190006,420 +DA/TH-573,Langer Berg,,50.72940063,10.39970016,420 +DA/TH-574,Fichtenkopf,,50.65060043,10.77029991,944 +DA/TH-575,Teufelskanzel,,50.66889954,10.76560020,935 +DA/TH-576,Farmenfleck,,50.67689896,10.71580029,890 +DA/TH-577,Unterer Beerberg,,50.65390015,10.73690033,890 +DA/TH-578,Finsterberger Koepfchen,,50.64189911,10.80640030,875 +DA/TH-579,Jaegerhausberg,,50.70190048,10.66419983,874 +DA/TH-580,Goldlauterberg,,50.64080048,10.77169991,874 +DA/TH-581,Schuesslers Hoehe,,50.59609985,10.76970005,858 +DA/TH-582,Alter Berg,,50.72060013,10.68470001,852 +DA/TH-583,Bornberg,,50.50080109,11.13669968,846 +DA/TH-584,Sternberg,,50.68579865,10.69439983,840 +DA/TH-585,Schlossbergkopf,,50.71250153,10.72859955,827 +DA/TH-586,Schnitzersberg,,50.55830002,10.07999992,816 +DA/TH-587,Ellenbogen,,50.57279968,10.08170033,813 +DA/TH-588,Grabenberg,,50.52939987,10.06639957,796 +DA/TH-589,Kleiner Muenzeberg,,50.73360062,10.68889999,794 +DA/TH-590,Spielmannsleite,,50.65420151,10.80860043,784 +DA/TH-591,Unterer Alsbachsberg,,50.48310089,11.04580021,782 +DA/TH-592,Petersberg,,50.72219849,10.61810017,774 +DA/TH-593,Heidelberg,,50.68859863,10.85669994,769 +DA/TH-594,Wuestrumnei,,50.68360138,10.80609989,751 +DA/TH-595,Wurmberg,,50.57889938,11.15639973,749 +DA/TH-596,Kaffberg,,50.88302400,10.83196000,399 +DA/TH-597,Steufelsberg,,50.56969833,10.11250019,740 +DA/TH-598,Grosser Droehberg,,50.59170151,10.73890018,729 +DA/TH-599,Weidberg,,50.58969879,10.08390045,725 +DA/TH-600,Neidhardskopf,,50.57529831,10.26580048,721 +DA/TH-601,Sachsenburg,,50.71310043,10.07689953,720 +DA/TH-602,Fuchssteine,,50.64559937,10.65170002,709 +DA/TH-603,Haderholzstein,,50.78749847,10.49689960,708 +DA/TH-604,Hoher Rain,,50.66889954,10.17860031,702 +DA/TH-605,Moenchstein,,50.76440048,10.51500034,701 +DA/TH-606,Umpfen,,50.64440155,10.16689968,700 +DA/TH-607,Mannsberg,,50.70579910,10.03890038,698 +DA/TH-608,Hoher Stern,,50.71749878,10.04920006,697 +DA/TH-609,Mittelberg,,50.57809830,11.11890030,697 +DA/TH-610,Ausgebrannter Stein,,50.70420074,10.77639961,695 +DA/TH-611,Galgenhuegel,,50.58309937,11.13469982,695 +DA/TH-612,Steinkopf,,50.69689941,10.08580017,694 +DA/TH-613,Rossberg,,50.68220139,10.01720047,693 +DA/TH-614,Zeller Kopf,,50.70309830,10.07610035,693 +DA/TH-615,Roederburg,,50.71580124,10.07499981,691 +DA/TH-616,Domberg,,50.61719894,10.68579960,674 +DA/TH-617,Waltersberg,,50.68420029,10.09140015,673 +DA/TH-618,Steinbruchsberg,,50.58140182,11.12440014,671 +DA/TH-619,Glaeserberg,,50.69250107,10.09969997,670 +DA/TH-620,Kleine Hohe Warte,,50.73311234,10.76724529,666 +DA/TH-621,Horbel,,50.65560150,10.08059978,665 +DA/TH-622,Stellberg,,50.55860138,10.14060020,663 +DA/TH-623,Reisinger Stein,,50.66109848,10.63140011,662 +DA/TH-624,Pinzler,,50.63610077,10.09920025,661 +DA/TH-625,Arnsberg,,50.68920135,10.06470013,661 +DA/TH-626,Hammerberg,,50.47779846,10.88860035,653 +DA/TH-627,Hoellkopf,,50.87749863,10.34529972,646 +DA/TH-628,Altes Schloss,,50.70529938,10.08969975,645 +DA/TH-629,Kuhberg,,50.69359970,10.05749989,642 +DA/TH-630,Grosser Huflar,,50.62080002,10.08670044,640 +DA/TH-631,Henneberg,,50.53390121,10.24470043,639 +DA/TH-632,Geriswiesenkopf,,50.62559891,10.22109985,634 +DA/TH-633,Schaefersberg,,50.63999939,10.62689972,632 +DA/TH-634,Katzenstein,,50.67250061,10.06890011,627 +DA/TH-635,Priemaeusel,,50.47829819,10.86030006,624 +DA/TH-636,Hemschenberg,,50.59830093,10.13529968,613 +DA/TH-637,Windberg,,50.64469910,10.13140011,608 +DA/TH-638,Hausberg,,50.67419815,10.15939999,604 +DA/TH-639,Reinsburg,,50.76860046,10.93750000,604 +DA/TH-640,Kruecke,,50.63560104,10.23470020,603 +DA/TH-641,Bildstein,,50.60309982,10.26640034,595 +DA/TH-642,Masskopf,,50.76829910,10.49110031,588 +DA/TH-643,Lehmberg,,50.63560104,9.95689964,587 +DA/TH-644,Rabenberg,,50.75889969,10.93080044,584 +DA/TH-645,Wunschberg,,50.60609818,10.21389961,578 +DA/TH-646,Hundsrueck,,50.78310013,10.47579956,577 +DA/TH-647,Gartenkuppe,,50.61830139,11.34389973,577 +DA/TH-648,Gotteskopf,,50.67689896,10.21809959,576 +DA/TH-649,Schorn,,50.62440109,10.59309959,573 +DA/TH-650,Gretiberg,,50.61529922,10.18999958,563 +DA/TH-651,Roter Buehl,,50.54309845,10.25720024,563 +DA/TH-652,Schorn,,50.73500061,10.07330036,559 +DA/TH-653,Baerenkopf,,50.67309952,10.45750046,559 +DA/TH-654,Ohrberg,,50.58029938,10.17500019,556 +DA/TH-655,Ahlstaedter Berg,,50.52360153,10.70419979,556 +DA/TH-656,Heckenbuehl,,50.45750046,10.79580021,550 +DA/TH-657,Glasberg,,50.65499878,10.23060036,548 +DA/TH-658,Tannenberg,,50.63389969,9.93690014,543 +DA/TH-659,Waldauer Hoehe,,50.50279999,10.80249977,543 +DA/TH-660,Hinterer Thalkopf,,50.65060043,10.46809959,543 +DA/TH-661,Schlossberg,,50.80189896,10.71220016,542 +DA/TH-662,Emberg,,50.73139954,10.09189987,541 +DA/TH-663,Mittelberg,,50.77970123,10.97189999,540 +DA/TH-664,Hoher Berg,,50.58420181,10.30220032,539 +DA/TH-665,Nebelberg,,50.70000076,10.19499969,532 +DA/TH-666,Ahornsberg,,50.46939850,10.83860016,532 +DA/TH-667,Heiliger Berg,,50.49670029,10.36559963,530 +DA/TH-668,Schleusenberg,,50.46920013,10.81750011,530 +DA/TH-669,Steinruecke,,50.65750122,10.53439999,528 +DA/TH-670,Pletzelstein,,50.66469955,9.88720036,527 +DA/TH-671,Burg Henneberg,,50.49140167,10.36139965,527 +DA/TH-672,Eppersberg,,50.71749878,10.09500027,525 +DA/TH-673,Weidebrunner Kuppe,,50.74779892,10.45059967,525 +DA/TH-674,Klausberg,,50.56250000,10.17940044,523 +DA/TH-675,Steinkopf,,50.54169846,10.21189976,523 +DA/TH-676,Buchenberg,,50.53639984,10.32279968,523 +DA/TH-677,Schwarzer Berg,,50.61280060,11.35330009,523 +DA/TH-678,Dicker Berg,,50.66389847,10.51609993,522 +DA/TH-679,Kleiner Dolmar,,50.67060089,10.50780010,522 +DA/TH-680,Wallenberge,,50.57170105,10.22360039,521 +DA/TH-681,Rudelsberg,,50.53219986,10.30609989,519 +DA/TH-682,Ebanotte,,50.80440140,10.87139988,518 +DA/TH-683,Karl-Friedrich-Stein,,50.70780182,10.11190033,517 +DA/TH-684,Silbacher Berg,,50.52560043,10.78030014,515 +DA/TH-685,Kuechenberg,,50.74499893,10.27420044,514 +DA/TH-686,Ransberg,,50.47579956,10.40139961,514 +DA/TH-687,Ermelsberg,,50.44440079,10.60140038,514 +DA/TH-688,Beckenschlagskopf,,50.64189911,10.50749969,513 +DA/TH-689,Hoehnberg,,50.44639969,10.65919971,513 +DA/TH-690,Eulskopf,,50.61190033,10.60190010,513 +DA/TH-691,Haselberg,,50.52529907,10.33440018,512 +DA/TH-692,Dornkopf,,50.54999924,10.32499981,512 +DA/TH-693,Iltenberg,,50.48500061,10.62279987,512 +DA/TH-694,Roedelsberg,,50.68920135,10.54189968,512 +DA/TH-695,Hoehn,,50.65560150,10.11890030,511 +DA/TH-696,Kleine Geba,,50.57440186,10.31309986,510 +DA/TH-697,Albrechtser Berg,,50.63779831,10.60359955,510 +DA/TH-698,Wolfsberg,,50.48419952,10.35439968,505 +DA/TH-699,Hausberg,,50.47610092,10.39220047,505 +DA/TH-700,Meisenbachskopf,,50.60919952,10.54139996,505 +DA/TH-701,Schleidsberg,,50.70830154,9.97420025,503 +DA/TH-702,Ochsenbachskopf,,50.64419937,10.53250027,502 +DA/TH-703,Teufelsberg,,50.67580032,9.88939953,501 +DA/TH-704,Galgenhoeh,,50.45780182,10.60859966,501 +DA/TH-705,Thomasberg,,50.42689896,10.85719967,501 +DA/TH-706,Kuhberg,,50.50999832,10.69169998,499 +DA/TH-707,Hohe Maas,,50.56219864,10.45860004,497 +DA/TH-708,Steinerner Berg,,50.50139999,10.59609985,497 +DA/TH-709,Ripperts,,50.73939896,10.29080009,496 +DA/TH-710,Buchberg,,50.59360123,10.57470036,494 +DA/TH-711,Kuppe,,50.64390182,10.31110001,493 +DA/TH-712,Bornkopf,,50.79000092,10.15970039,492 +DA/TH-713,Kuechenberg,,50.56779861,10.46860027,492 +DA/TH-714,Mehmelsfelder Berg,,50.50999832,10.38720036,491 +DA/TH-715,Kuesselberg,,50.46500015,10.51609993,491 +DA/TH-716,Hahnkopf,,50.79190063,10.03439999,489 +DA/TH-717,Bettstall,,50.63330078,10.57359982,489 +DA/TH-718,Uhlberg,,50.47969818,10.56750011,488 +DA/TH-719,Brunnenberg,,50.44250107,10.81750011,488 +DA/TH-720,Koehlersberg,,50.73559952,10.30830002,487 +DA/TH-721,Kahler Berg,,50.56280136,10.33440018,487 +DA/TH-722,Auf der Schanz,,50.55749893,10.43640041,486 +DA/TH-723,Drachenberg,,50.58029938,10.44279957,486 +DA/TH-724,Eschberg,,50.61719894,10.40670013,486 +DA/TH-725,Lochberg,,50.56280136,10.19219971,486 +DA/TH-726,Koepfchen,,50.61690140,10.26609993,485 +DA/TH-727,Neuberg,,50.53139877,10.35309982,484 +DA/TH-728,Eulenkopf,,50.50640106,10.39809990,483 +DA/TH-729,Maselsbacher Berg,,50.77529907,10.17720032,481 +DA/TH-730,Salzunger Berg,,50.78440094,10.16059971,481 +DA/TH-731,Schwarzbacher Kopf,,50.48080063,10.82470036,480 +DA/TH-732,Bornkopf,,50.76860046,10.10579967,479 +DA/TH-733,Spielberg,,50.51530075,10.40030003,478 +DA/TH-734,Koppe,,50.58720016,10.47169971,478 +DA/TH-735,Hexenberg,,50.54499817,10.43280029,478 +DA/TH-736,Oberer Berg,,50.59109879,10.37639999,478 +DA/TH-737,Lotzenhack,,50.56499863,10.35140038,476 +DA/TH-738,Holzkopf,,50.54059982,10.59749985,476 +DA/TH-739,Rothenberg,,50.72890091,10.27169991,475 +DA/TH-740,Rangenberg,,50.48419952,10.51329994,474 +DA/TH-741,Dippersberg,,50.54639816,10.35610008,473 +DA/TH-742,Bremer Berg,,50.73310089,10.02470016,472 +DA/TH-743,Ziegenberg,,50.53860092,10.44470024,472 +DA/TH-744,Schnorr,,50.47529984,10.53330040,472 +DA/TH-745,Hengstberg,,50.67750168,10.30580044,471 +DA/TH-746,Hutsberg,,50.47529984,10.62469959,471 +DA/TH-747,Hohenrod,,50.55139923,10.54780006,471 +DA/TH-748,Kohlberg,,50.73109818,10.25440025,470 +DA/TH-749,Galgenberg,,50.79940033,10.13140011,470 +DA/TH-750,Gickelberg,,50.60419846,10.53439999,470 +DA/TH-751,Koepfel,,50.69079971,10.16860008,470 +DA/TH-752,Eichigkopf,,50.59170151,10.31999969,469 +DA/TH-753,Kirchberg,,50.45330048,10.56110001,469 +DA/TH-754,Mittelberg,,50.73749924,10.27919960,467 +DA/TH-755,Hessenkoppe,,50.57939911,10.46220016,466 +DA/TH-756,Johannisberg,,50.59609985,10.46080017,465 +DA/TH-757,Oberer Vogelherd,,50.69329834,10.27330017,465 +DA/TH-758,Kohlkoepfchen,,50.71220016,10.20219994,465 +DA/TH-759,Rother Kopf,,50.39329910,10.60750008,465 +DA/TH-760,Schlossberg,,50.81669998,10.36359978,462 +DA/TH-761,Mittelberg,,50.70830154,9.98999977,460 +DA/TH-762,Arnsberg,,50.46810150,10.42500019,460 +DA/TH-763,Hemmkopf,,50.46640015,10.56000042,460 +DA/TH-764,Gehegter Berg,,50.49580002,10.61610031,460 +DA/TH-765,Fixleite,,50.55609894,10.46669960,459 +DA/TH-766,Vorderberg,,50.62310028,10.27670002,459 +DA/TH-767,Schienberg,,50.69250107,10.47029972,458 +DA/TH-768,Pfaffenkopf,,50.40140152,10.72809982,458 +DA/TH-769,Grosser Breitberg,,50.44110107,10.62139988,457 +DA/TH-770,Hundsruecken,,50.71170044,10.32279968,456 +DA/TH-771,Kiliansberg,,50.60029984,10.43029976,455 +DA/TH-772,Aschenberg,,50.80670166,10.36079979,452 +DA/TH-773,Kirchberg,,50.70920181,10.33360004,450 +DA/TH-774,Adelsberg,,50.90219879,11.30029964,416 +DA/TH-775,Pferdeberg,,50.64030075,10.90499973,805 +DA/TH-776,Kuppe,,50.85689926,11.54720020,438 +DA/TH-777,Schlossberg,,50.85290000,10.62270000,446 +DA/TH-778,Wernburg,,50.63560104,11.43360043,449 +DA/TH-779,Moenchsberg,,50.55670166,11.47859955,572 +DA/TH-780,Beerhuegel,,50.58359909,11.30440044,677 +DA/TH-781,Henneberg,,50.49919891,11.50809956,701 +DA/TH-782,Hinterer Breiteberg,,50.62390137,11.32139969,551 +DA/TH-783,Kolditzberg,,50.55390167,11.36779976,583 +DA/TH-784,Vogelherd,,50.60189819,11.46170044,565 +DA/TH-785,Schmittenberg,,50.59939957,11.42669964,529 +DA/TH-786,Spitzer Berg,,50.55360031,11.19029999,790 +DA/TH-787,Kirchberg,,50.56919861,11.23169994,725 +DA/TH-788,Sommerberg,,50.61940002,11.29279995,669 +DA/TH-789,Rueckersbiel,,50.52560043,11.16219997,756 +DA/TH-790,Pechseifenberg,,50.50059891,11.02359962,794 +DA/TH-791,Brandhuegel,,50.64440155,11.26420021,623 +DA/TH-792,Frauenberg,,51.37720108,10.83390045,411 +DA/TH-793,Sankt Georgsberg,,50.82780075,10.62530041,481 +DA/TH-794,Napoleonstein,,50.94530106,11.57170010,362 +DA/TH-795,Spiessberg,,50.59389877,10.72519970,642 +DA/TH-796,Schoenleite,,50.85900116,10.48569965,736 +DA/TH-797,Goldberg,,50.82080841,10.74629498,454 +DA/TH-798,Johannisberg,,50.83250046,10.62339973,502 +DA/TH-799,Gottlob,,50.85139847,10.56289959,520 +DA/TH-800,Staufelsberg,,50.60169983,10.04679966,644 +DA/TH-801,Hoel,,50.56039810,10.05410004,791 +DA/TH-802,Schafkueppel,,50.57640076,10.08839989,806 +DA/TH-803,Steinkoepfchen,,50.58420181,10.09480000,782 +DA/TH-804,Dungberg,,50.52870178,10.03820038,770 +DA/TH-805,Hahnberg,,50.65869904,10.20610046,687 +DA/TH-806,Rasdorfer Berg,,50.72520065,9.93780041,411 +DA/TH-807,Ulsterberg,,50.79339981,9.98503971,487 +DA/TH-808,Kraynberg,,50.83689880,10.12950039,428 +DA/TH-809,Muehlberg,,50.25130081,10.70950031,333 +DA/TH-810,Heidhuegel,,50.37189865,10.72389984,372 +DA/TH-811,Abendsberg,,50.69940186,9.93640041,401 +DA/TH-812,Bocksberg,,50.69680023,9.94060040,422 +DA/TH-813,Rockenstuhl,,50.68239975,9.94900036,502 +DA/TH-814,Suchenberg,,50.64799881,9.89239979,583 +DA/TH-815,Alter Berg,,50.63700104,9.89070034,540 +DA/TH-816,Seelesberg,,50.64130020,9.96819973,671 +DA/TH-817,Tannenkueppel,,50.62969971,9.95129967,606 +DA/TH-818,Grosser Olmersberg,,50.73910141,9.99670029,450 +DA/TH-819,Standorfsberg,,50.75579834,9.93929958,386 +DA/TH-820,Michelsberg,,50.75730133,9.96959972,431 +DA/TH-821,Hubenberg,,50.76639938,9.97259998,418 +DA/TH-822,Wachkoppe,,50.76190186,9.98530006,418 +DA/TH-823,Langer Berg,,50.76419830,9.99639988,419 +DA/TH-824,Buchenberg,,50.76559830,10.00179958,441 +DA/TH-825,Sattelberg,,50.76240158,10.01900005,464 +DA/TH-826,Straufhain,,50.34000015,10.71560001,449 +DA/TH-827,Feste Heldburg,,50.28879929,10.72840023,403 +DA/TH-828,Dreiloecherstein,,50.26369858,10.85159969,398 +DA/TH-829,Dreiherrenstein,,50.25139999,10.85179996,375 +DA/TH-830,Moenchsberg,,50.24209976,10.82289982,320 +DA/TH-831,Eichenbuehl,,50.24929810,10.80580044,352 +DA/TH-832,Wartberg,,50.24739838,10.75189972,322 +DA/TH-833,Grosser Pfadelsberg,,50.22700119,10.67749977,410 +DA/TH-834,Harth,,50.25370026,10.72980022,350 +DA/TH-835,Lehnberg,,50.22900009,10.61229992,400 +DA/TH-836,Alleekopf,,50.31269836,10.60779953,420 +DA/TH-837,Spanshuegel,,50.32320023,10.59700012,444 +DA/TH-838,Kornberg,,50.33700180,10.61120033,420 +DA/TH-839,Warthuegel,,50.36280060,10.51070023,333 +DA/TH-840,Rothberg,,50.41159821,10.44110012,373 +DA/TH-841,Hexenhuegel,,50.34680176,10.63930035,417 +DA/TH-842,Gleisberg/Ruine Kunitzburg,,50.96089935,11.64770031,365 +DA/TH-843,Alter Gleisberg,,50.95709991,11.70189953,343 +DA/TH-844,Burgrabis/Luftschiff,,50.90930176,11.66870022,405 +DA/TH-845,Culmberg,,50.89179993,11.66390038,369 +DA/TH-846,Sattelberg,,50.67330170,10.59749985,595 +DA/TH-847,Goerzenberg,,50.38249969,11.10190010,519 +DA/TH-848,Schaumburg,,50.39390182,10.98919964,492 +DA/TH-849,Doellberg,,50.60520172,10.72399998,755 +DA/TH-850,Krahnberg-Buergerturm,,50.96025848,10.66625690,431 +DA/TH-851,Schlossberg,,50.94577026,10.70458984,334 +DA/TH-852,Muehlburg,,50.86920547,10.83193684,375 +DA/TH-853,Hohe Warte,,50.79460144,10.47982025,583 +DA/TH-854,Scharfenberg,,50.91466522,10.39692879,396 +DA/TH-855,Bienstaedter Warte,,51.02385712,10.83211708,433 +DA/TH-856,Katzenstein,,50.67044830,10.07779026,612 +DA/TH-857,Grenzadler,,50.70629883,10.69458961,836 +DA/TH-858,Heideberg,,51.51267242,10.72478676,258 +DA/TH-859,Buchholzer Berg,,51.53937149,10.85315037,350 +DA/TH-860,Kalte Heide,,50.83276900,10.49444700,832 +DA/TH-861,Roter Berg,,50.60282800,10.85124700,794 +DA/WS-001,Zugspitzeck,,47.41690063,10.97140026,2820 +DA/WS-002,Wetterspitzen,,47.40029907,10.97000027,2746 +DA/WS-003,Wetterwandeck,,47.39810181,10.97719955,2698 +DA/WS-004,Oestliche Gatterlkoepfe,,47.39390182,11.00749969,2475 +DA/WS-005,Grosse Riffelwandspitze,,47.42779922,10.99190044,2626 +DA/WS-006,Kleine Riffelwandspitze,,47.42890167,10.99639988,2543 +DA/WS-007,Riffelkoepfe,,47.43000031,11.00249958,2388 +DA/WS-008,Zwoelferkopf,,47.44749832,11.02690029,2226 +DA/WS-009,Vorderer Waxenstein,,47.44720078,11.03250027,2163 +DA/WS-010,Aeussere Hoellentalspitze,,47.42079926,11.02779961,2720 +DA/WS-011,Grosser Kirchturm,,47.41609955,11.02999973,2514 +DA/WS-012,Kleiner Wanner,,47.39530182,11.04139996,2480 +DA/WS-013,Schuesselkarspitze,,47.39670181,11.11919975,2553 +DA/WS-014,Partenk. Dreitorspitze,,47.40639877,11.12250042,2605 +DA/WS-015,Rotplattenspitze,,47.42419815,11.17669964,2399 +DA/WS-016,Obere Wettersteinspitze,,47.42689896,11.19079971,2296 +DA/WS-017,Untere Wettersteinspitze,,47.42750168,11.19859982,2152 +DA/WS-018,Eckbauer,,47.46640015,11.13389969,1237 +DA/WS-019,Osterfelderkopf,,47.43920135,11.05109978,2004 +DA/WS-020,Achterkoepfe,,47.40169907,11.22420025,2023 +DA/WS-021,Baernheimatkopf,,47.44919968,11.01080036,1617 +DA/WS-022,Bergl,,47.42390060,11.00559998,2272 +DA/WS-023,Burgberg,,47.43170166,11.25080013,1194 +DA/WS-024,Mittlere Dreitorspitz,,47.40639877,11.12279987,2627 +DA/WS-025,Nordoestliche Dreitorspitz,,47.40639877,11.12559986,2605 +DA/WS-026,Frauenalplkopf,,47.41669846,11.12810040,2351 +DA/WS-027,Frauenalplspitz,,47.42060089,11.12500000,2369 +DA/WS-028,Hoher Gaifkopf,,47.42419815,11.08559990,1863 +DA/WS-029,Untere Gatterlkoepfe,,47.39469910,11.00030041,2483 +DA/WS-030,Grosse Hundstallkoepfe,,47.39580154,11.09360027,2532 +DA/WS-031,Grosser Zwoelferkopf,,47.44609833,11.02330017,2276 +DA/WS-032,Henneneck,,47.45309830,11.05309963,1492 +DA/WS-033,Hirschbichlkopf,,47.41780090,11.14029980,2276 +DA/WS-034,Hirzeneck,,47.48030090,11.20279980,1186 +DA/WS-035,Hohe Riffel,,47.43470001,10.99829960,2236 +DA/WS-036,Hoher Kamm,,47.39360046,11.02939987,2375 +DA/WS-037,Hoellentorkoepfl,,47.43830109,11.04720020,2150 +DA/WS-038,Kleiner Hundstallkopf,,47.40219879,11.08329964,2338 +DA/WS-039,Grosser/Oberer Hundstallkopf,,47.39580154,11.09420013,2586 +DA/WS-040,Jungfernkarkoepfe,,47.40169907,11.07419968,2355 +DA/WS-041,Kaemikopf,,47.43249893,11.16390038,1821 +DA/WS-042,Keilschrofen,,47.43690109,11.13109970,1548 +DA/WS-043,Kirchturm,,47.41389847,11.03139973,2368 +DA/WS-044,Kleiner Kranzberg,,47.45809937,11.20250034,1259 +DA/WS-045,Kleiner oestlicher Wanner,,47.39419937,11.04969978,2572 +DA/WS-046,Kleiner Wanner,,47.39609909,11.04170036,2548 +DA/WS-047,Riesserkopf,,47.47309875,11.08860016,1127 +DA/WS-048,Kratzenkoepfl,,47.44499969,11.24030018,1115 +DA/WS-049,Kreuzeck,,47.45280075,11.06690025,1650 +DA/WS-050,Leutascher,,47.40060043,11.12220001,2681 +DA/WS-051,Maennl,,47.44919968,11.03499985,1889 +DA/WS-052,Mittlere Plattspitze,,47.39609909,10.98999977,2674 +DA/WS-053,Mittlere Toerlspitzen,,47.41279984,11.13529968,2444 +DA/WS-054,Noerdliche Riffelspitze,,47.43830109,11.00580025,2242 +DA/WS-055,Noerdliche Wetterspitzen,,47.40359879,10.97029972,2746 +DA/WS-056,Oestliche Plattspitze,,47.39749908,10.99390030,2680 +DA/WS-057,Oestliche Toerlspitzen,,47.41279984,11.13560009,2475 +DA/WS-058,Oestliche Wetterspitzen,,47.39780045,10.97669983,2668 +DA/WS-059,Westliche Plattspitze,,47.39580154,10.98810005,2676 +DA/WS-060,Rautkopf,,47.45389938,11.06169987,1621 +DA/WS-061,Riedkopf,,47.40779877,11.23060036,1860 +DA/WS-062,Schachentorkopf,,47.42419815,11.12749958,1957 +DA/WS-063,Schindeltalschrofen,,47.44530106,11.11559963,1124 +DA/WS-064,Schwarzenkopf,,47.44469833,11.04860020,1818 +DA/WS-065,Steilenberg,,47.43140030,11.13580036,1770 +DA/WS-066,Stuibenkopf,,47.42440033,11.07919979,1924 +DA/WS-067,Teufelskopf,,47.39469910,11.10079956,2440 +DA/WS-068,Westliche Toerlspitzen,,47.41249847,11.13440037,2372 +DA/WS-069,Vollkarspitze,,47.42169952,11.03470039,2618 +DA/WS-070,Vorderer Zwoelferkopf,,47.44670105,11.03030014,2136 +DA/WS-071,Kleiner Wanner,,47.39559937,11.04139996,2480 +DA/WS-072,Wettersteinkopf,,47.42139816,11.15970039,2433 +DA/WS-073,Zirmerskopf,,47.47190094,10.97859955,1108 +DA/WS-074,Zotzenberg,,47.47969818,11.18640041,1205 +DA/WS-075,Zundernkamm,,47.41189957,11.09920025,1793 +DA/WS-076,Zundernkoepfe,,47.40280151,11.09329987,2278 +DA/WS-077,Eckbauerkreuz,,47.46939850,11.14356995,1222 +DA/WS-078,Kochelberg,,47.47999000,11.10652000,863 + + +DL/AL-001,Biberkopf,,47.27030182,10.23219967,2599 +DL/AL-002,Kleiner Rappenkopf,,47.2831,10.2439,2277 +DL/AL-003,Hochrappenkopf,,47.28030014,10.24559975,2425 +DL/AL-004,Rappenseekopf,,47.28110123,10.25440025,2468 +DL/AL-005,Hochgundspitze,,47.28440094,10.26249981,2460 +DL/AL-006,Rotgundspitze,,47.28779984,10.26560020,2485 +DL/AL-007,Linkerskopf,,47.2911,10.2631,2455 +DL/AL-008,Wilder Mann,,47.2875,10.2797,2577 +DL/AL-009,Bockkarkopf,,47.29190063,10.28750038,2609 +DL/AL-010,Hochfrottspitze,,47.29690170,10.29310036,2649 +DL/AL-011,Maedelegabel,,47.29970169,10.29559994,2645 +DL/AL-012,Trettachspitze,,47.30360031,10.29559994,2596 +DL/AL-013,Kratzer,,47.30640030,10.31779957,2428 +DL/AL-014,Muttlerkopf,,47.3139,10.3403,2368 +DL/AL-015,Oefnerspitze,,47.31719971,10.34860039,2575 +DL/AL-016,Krottenspitzen,,47.3197,10.3447,2551 +DL/AL-017,Fuerschiesser,,47.3281,10.3300,2272 +DL/AL-018,Kegelkopf,,47.35530090,10.32670021,1960 +DL/AL-019,Kreuzeck,,47.33689880,10.35669994,2375 +DL/AL-020,Rauheck,,47.34439850,10.36810017,2384 +DL/AL-021,Jochspitze,,47.35419846,10.38329983,2332 +DL/AL-022,Suedl.Hoellhorn,,47.3586,10.3867,2150 +DL/AL-023,Noerdl.Hoellhorn,,47.3594,10.3872,2140 +DL/AL-024,Kleiner Wilder,,47.36280060,10.38609982,2309 +DL/AL-025,Grosser Wilder,,47.36999893,10.38889980,2379 +DL/AL-026,Vorderer Wilder,,47.3781,10.4114,2241 +DL/AL-027,Kreuzkopf,,47.3844,10.4200,2288 +DL/AL-028,Wiedemerkopf,,47.3900,10.4169,2165 +DL/AL-029,Kreuzspitze,,47.3839,10.4311,2370 +DL/AL-030,Hochvogel,,47.38059998,10.43669987,2593 +DL/AL-031,Fuchskarspitze,,47.39080048,10.42920017,2314 +DL/AL-032,Kesselspitze,,47.4000,10.4336,2284 +DL/AL-033,Glasfelderkopf,,47.40280151,10.43140030,2271 +DL/AL-034,Laerchwand,,47.4067,10.4372,2187 +DL/AL-035,Sattelkoepfe,,47.4156,10.4389,2097 +DL/AL-036,Schaenzlekopf,,47.41780090,10.45250034,2069 +DL/AL-037,Schaenzlespitze,,47.4225,10.4567,2051 +DL/AL-038,Lahnerkopf,,47.42919922,10.46280003,2121 +DL/AL-039,Kastenkopf,,47.4319,10.4711,2129 +DL/AL-040,Kaelbelespitze,,47.43140030,10.47529984,2134 +DL/AL-041,Kirchendach,,47.4353,10.4739,2013 +DL/AL-042,Aelpelekopf,,47.4389,10.4547,2023 +DL/AL-043,Knappenkopf,,47.4431,10.4731,2071 +DL/AL-044,Kugelhorn,,47.44829941,10.47029972,2126 +DL/AL-045,Rauhhorn,,47.45830154,10.46780014,2240 +DL/AL-046,Ponten,,47.48559952,10.45110035,2050 +DL/AL-047,Bschiesser,,47.48780060,10.44060040,1996 +DL/AL-048,Iseler,,47.4994,10.4197,1862 +DL/AL-049,Kuehgundkopf,,47.50389862,10.43109989,1908 +DL/AL-050,Wildengundkopf,,47.3128,10.2919,2238 +DL/AL-051,Schmalhorn,,47.3339,10.2875,1952 +DL/AL-052,Hinterer Wildgundkopf,,47.33940125,10.28719997,1955 +DL/AL-053,Vorderer Wildgundkopf,,47.3464,10.2856,1935 +DL/AL-054,Himmelschrofen,,47.36420059,10.28250027,1791 +DL/AL-055,Hoefats,,47.3672,10.3492,2269 +DL/AL-056,Kleine Hoefats,,47.36809921,10.35439968,2073 +DL/AL-057,Seilhenker,,47.3708,10.3617,1794 +DL/AL-058,Huettenkopf,,47.3742,10.3342,1949 +DL/AL-059,Hahnenkopf,,47.3792,10.3244,1735 +DL/AL-060,Riffenkopf,,47.37919998,10.31719971,1748 +DL/AL-061,Schneck,,47.38470078,10.38169956,2269 +DL/AL-062,Himmelhorn,,47.3819,10.3761,2114 +DL/AL-063,Rotkopf,,47.3908,10.3808,2182 +DL/AL-064,Laufbacher Eck,,47.3933,10.3808,2178 +DL/AL-065,Salober,,47.3978,10.3878,2088 +DL/AL-066,Berggaechtle,,47.4075,10.3942,2006 +DL/AL-067,Giebel,,47.4131,10.3989,1949 +DL/AL-068,Lachenkopf,,47.39500046,10.37170029,2111 +DL/AL-069,Schochen,,47.39419937,10.36060047,2100 +DL/AL-070,Grosser Seekopf,,47.4058,10.3544,2084 +DL/AL-071,Kleiner Seekopf,,47.4014,10.3564,2095 +DL/AL-072,Zeiger,,47.4103,10.3508,1994 +DL/AL-073,Nebelhorn,,47.4219,10.3422,2225 +DL/AL-074,Gundkopf,,47.4217,10.3358,2200 +DL/AL-075,Rubihorn,,47.4247,10.3139,1957 +DL/AL-076,Wengenkopf,,47.42309952,10.34969997,2235 +DL/AL-077,Grosser Daumen,,47.44110107,10.37580013,2280 +DL/AL-078,Kleiner Daumen,,47.4469,10.3861,2191 +DL/AL-079,Rotspitze,,47.45940018,10.36919975,2033 +DL/AL-080,Breitenberg,,47.4700,10.3825,1887 +DL/AL-081,Entschenkopf,,47.43669891,10.33110046,2043 +DL/AL-082,Schnippenkopf,,47.45080185,10.32719994,1833 +DL/AL-083,Heidelbeerkopf,,47.4547,10.3297,1767 +DL/AL-084,Sonnenkopf,,47.4586,10.3300,1713 +DL/AL-085,Gernkopf,,47.4694,10.3428,1566 +DL/AL-086,Imberger Horn,,47.48419952,10.35669994,1656 +DL/AL-087,Geishorn,,47.28779984,10.17529964,2367 +DL/AL-088,Wildengundkopf,,47.2883,10.1842,2197 +DL/AL-089,Liechelkopf,,47.2958,10.1794,2383 +DL/AL-090,Angerkopf,,47.2939,10.1864,2263 +DL/AL-091,Kemptner Kopf,,47.2975,10.1989,2192 +DL/AL-092,Schafalpenkopf,,47.31060028,10.21669960,2321 +DL/AL-093,Suedl.Hammerspitze,,47.31940079,10.20940018,2258 +DL/AL-094,Noerdl.Hammerspitze,,47.3214,10.2069,2250 +DL/AL-095,Schuesser,,47.3264,10.1994,2170 +DL/AL-096,Warmatsgundkopf,,47.3347,10.2078,2059 +DL/AL-097,Fellhorn,,47.35060120,10.21780014,2037 +DL/AL-098,Schlappolt,,47.3581,10.2236,1986 +DL/AL-099,Soellereck,,47.3733,10.2375,1706 +DL/AL-100,Hoher Ifen,,47.35419846,10.09969997,2230 +DL/AL-101,Ob.Gottesackerwand,,47.37670135,10.11579990,2035 +DL/AL-102,Torkopf,,47.3794,10.1292,1930 +DL/AL-103,Unt.Gottesackerwand,,47.3847,10.1369,1848 +DL/AL-104,Kackenkoepfe,,47.39889908,10.18669987,1560 +DL/AL-105,Besler,,47.42530060,10.18809986,1679 +DL/AL-106,Beslerkopf,,47.4261,10.1800,1655 +DL/AL-107,Piesenkopf,,47.41609955,10.13280010,1630 +DL/AL-108,Riedberger Horn,,47.45140076,10.15919971,1787 +DL/AL-109,Wannenkopf,,47.44810104,10.19219971,1712 +DL/AL-110,Ochsenkopf,,47.46390152,10.18060017,1662 +DL/AL-111,Weiherkopf,,47.46500015,10.20110035,1665 +DL/AL-112,Ragiswanger Horn,,47.4783,10.2008,1615 +DL/AL-113,Sigiswanger Horn,,47.4847,10.2094,1527 +DL/AL-114,Ofterschwanger Horn,,47.4936,10.2125,1407 +DL/AL-115,Bleicher Horn,,47.47000122,10.14029980,1669 +DL/AL-116,Dreifahnenkopf,,47.4619,10.1544,1628 +DL/AL-117,Haellritzer Eck,,47.4678,10.1436,1669 +DL/AL-118,Sipplingerkopf,,47.48030090,10.12580013,1746 +DL/AL-119,Tennenmooskopf,,47.4850,10.1419,1626 +DL/AL-120,Heidenkopf,,47.4806,10.1111,1685 +DL/AL-121,Girenkopf,,47.4806,10.1039,1683 +DL/AL-122,Gelbhansenkopf,,47.4506,10.1042,1437 +DL/AL-123,Hochschelpen,,47.43420029,10.10919952,1552 +DL/AL-124,Mittag,,47.5367,10.2172,1462 +DL/AL-125,Baerenkopf,,47.5303,10.2103,1479 +DL/AL-126,Steineberg,,47.5272,10.1917,1683 +DL/AL-127,Stuiben,,47.51720047,10.16110039,1749 +DL/AL-128,Sederer Stuiben,,47.5142,10.1531,1737 +DL/AL-129,Buralpkopf,,47.51139832,10.13109970,1772 +DL/AL-130,Guendeleskopf,,47.5064,10.1239,1748 +DL/AL-131,Rindalphorn,,47.50500107,10.10779953,1822 +DL/AL-132,Hochgrat,,47.49530029,10.07859993,1833 +DL/AL-133,Selekopf,,47.4903,10.0600,1663 +DL/AL-134,Hohenfluhalpkopf,,47.4892,10.0489,1636 +DL/AL-135,Einegundkopf,,47.4889,10.0383,1641 +DL/AL-136,Falken,,47.4836,10.0206,1564 +DL/AL-137,Hochhaedrich,,47.48170090,10.00310040,1565 +DL/AL-138,Immenstaedter Horn,,47.55360031,10.18690014,1490 +DL/AL-139,Gschwender Horn,,47.5508,10.1694,1441 +DL/AL-140,Vorderer Prodel,,47.5367,10.1231,1487 +DL/AL-141,Denneberg,,47.5278,10.0844,1427 +DL/AL-142,Salmaser Hoehe,,47.57080078,10.09140015,1254 +DL/AL-143,Thaler Hoehe,,47.5764,10.1167,1166 +DL/AL-144,Staufen,,47.55440140,10.03610039,1032 +DL/AL-145,Hauchenberg,,47.62440109,10.17310047,1242 +DL/AL-146,Sonneneck,,47.66170120,10.15690041,1106 +DL/AL-147,Schwarzer Grat,,47.6922,10.1256,1118 +DL/AL-148,Riedberger Kugel,,47.63750076,10.06330013,1069 +DL/AL-149,Blender,,47.72919846,10.22529984,1072 +DL/AL-150,Gruenten,,47.55469894,10.31970024,1738 +DL/AL-151,Wertacher Hoernle,,47.54610062,10.38969994,1684 +DL/AL-152,Tiefenbacher Eck,,47.5283,10.3672,1569 +DL/AL-153,Spiesser,,47.52640152,10.38360023,1651 +DL/AL-154,Jochschrofen,,47.5236,10.3936,1625 +DL/AL-155,Hirschberg,,47.5186,10.3764,1500 +DL/AL-156,Rottachberg,,47.5908,10.2936,1116 +DL/AL-157,Aggenstein,,47.53689957,10.55720043,1985 +DL/AL-158,Breitenberg,,47.54830170,10.55220032,1838 +DL/AL-159,Schoenkahler,,47.54029846,10.48859978,1688 +DL/AL-160,Sorgschrofen,,47.55580139,10.45419979,1635 +DL/AL-161,Edelsberg,,47.59189987,10.49639988,1630 +DL/AL-162,Alpspitze,,47.5978,10.4958,1575 +DL/AL-163,Reuterwanne,,47.59030151,10.46000004,1542 +DL/AL-164,Kienberg,,47.56610107,10.51389980,1535 +DL/AL-165,Kappelkoepfl,,47.5986,10.5031,1461 +DL/AL-166,Zwoelferkopf,,47.56689835,10.60529995,1287 +DL/AL-167,Falkenstein,,47.56940079,10.59109974,1267 +DL/AL-168,Einerkopf,,47.5681,10.6006,1260 +DL/AL-169,Auerberg,,47.73559952,10.73579979,1055 +DL/AL-170,Zwieselberg,,47.64329910,10.69110012,1055 +DL/AL-171,Eisenberg,,47.61280060,10.59000015,1055 +DL/AL-172,Senkelekopf,,47.63560104,10.65830040,1047 +DL/AL-173,Hohenfreyberg,,47.6136,10.5875,1041 +DL/AL-174,Hochegg,,47.6636,10.6942,902 +DL/AL-175,Sulzberg,,47.6550,10.6544,921 +DL/AL-176,Upratsberg,,47.8417,10.4642,899 +DL/AL-177,Bergmangalpe,,47.8250,10.5664,855 +DL/AL-178,Ellenberg,,47.7447,10.5922,798 +DL/AL-179,Weichberg,,47.77280045,10.77110004,967 +DL/AL-180,Oberellegg,,47.6206,10.4000,1136 +DL/AL-181,Burgkranzegger Horn,,47.63000107,10.40690041,1150 +DL/AL-182,Hohe Schulter,,47.7406,10.4422,941 +DL/AL-183,Mittelberg,,47.6403,10.4269,1092 +DL/AL-184,Oberschwarzenberg,,47.6719,10.4578,966 +DL/AL-185,Gehrenkopf,,47.4653,10.4564,1896 +DL/AL-186,Hinterer Wilder,,47.3667,10.3889,2359 +DL/AL-187,Mitteleck,,47.3756,10.3806,1835 +DL/AL-188,Musskopf,,47.2908,10.2450,1968 +DL/AL-189,Mutzenkopf,,47.2811,10.2331,1692 +DL/AL-190,Rosskopf,,47.42860031,10.43249989,1822 +DL/AL-191,Spaetengundkopf,,47.3186,10.2892,1993 +DL/AL-192,Stuibenkopf,,47.4858,10.4283,1830 +DL/AL-193,Traufberg,,47.3389,10.3164,1601 +DL/AL-194,Zerrerkoepfle,,47.4769,10.4678,1946 +DL/AL-195,Rosskopf,,47.4261,10.4325,1822 +DL/AL-196,Bolsterlanger Horn,,47.4592,10.2083,1588 +DL/AL-197,Engenkopf,,47.39390182,10.22029972,1282 +DL/AL-198,Gatterkopf,,47.3886,10.1503,1659 +DL/AL-199,Geissberg,,47.4153,10.2186,1372 +DL/AL-200,Geisswiedenkopf,,47.4269,10.2025,1544 +DL/AL-201,Grauenstein,,47.4583,10.1569,1640 +DL/AL-202,Hoernlein,,47.4261,10.1072,1549 +DL/AL-203,Kaehberg,,47.3800,10.1689,1528 +DL/AL-204,Kl. Ochsenkopf,,47.4667,10.1800,1571 +DL/AL-205,Mitteralpenkopf,,47.4711,10.1831,1443 +DL/AL-206,Ochsenberg,,47.42779922,10.24940014,1179 +DL/AL-207,Rehkoepfl,,47.4267,10.1111,1477 +DL/AL-208,Rosskopf,,47.3800,10.1028,1958 +DL/AL-209,Schafkopf,,47.4258,10.1742,1585 +DL/AL-210,Schwarzenberg,,47.4306,10.2106,1385 +DL/AL-211,Hirscheck,,47.3803,10.0975,1922 +DL/AL-212,Riesenkopf,,47.4117,10.1131,1480 +DL/AL-213,Schatthalde,,47.4247,10.2233,1314 +DL/AL-214,Samstenberg,,47.4669,10.0678,1513 +DL/AL-215,Ostertalberg,,47.4856,10.1669,1383 +DL/AL-216,Wittelsbacher Hoehe,,47.4994,10.2564,884 +DL/AL-217,Blaessleskopf,,47.5331,10.3514,1320 +DL/AL-218,Gehrenkoepfle,,47.5661,10.4161,1504 +DL/AL-219,Geissruecken,,47.5644,10.3844,1220 +DL/AL-220,Gigglstein,,47.5606,10.3350,1497 +DL/AL-221,Kuehberg,,47.5794,10.4003,1290 +DL/AL-222,Rosskopf,,47.5342,10.3683,1596 +DL/AL-223,Starzlachberg,,47.5578,10.4061,1585 +DL/AL-224,Wolfsbuechel,,47.5400,10.3408,1085 +DL/AL-225,Holzenberg,,47.5908,10.4242,1283 +DL/AL-226,Kahlenberg,,47.4828,10.3139,1017 +DL/AL-227,Kuehberg,,47.4878,10.3133,986 +DL/AL-228,Elbkopf,,47.3194,10.2408,2102 +DL/AL-229,Griessgundkopf,,47.32360077,10.23970032,2159 +DL/AL-230,Haldenwangerkopf,,47.2750,10.1733,2002 +DL/AL-231,Schartenkopf,,47.3803,10.2556,1278 +DL/AL-232,Soellerkopf,,47.3617,10.2331,1910 +DL/AL-233,Ringang,,47.3622,10.2608,1022 +DL/AL-234,Sattelkopf,,47.3789,10.2478,1422 +DL/AL-235,Alpenrosenkoepfle,,47.4928,10.3789,1004 +DL/AL-236,Burgschrofen,,47.4894,10.3558,1334 +DL/AL-237,Gaissalphorn,,47.4194,10.3189,1953 +DL/AL-238,Gaissfuss,,47.4178,10.3267,1991 +DL/AL-239,Gehrenkopf,,47.4694,10.3428,1566 +DL/AL-240,Hengst,,47.4406,10.3994,1989 +DL/AL-241,Heubatspitz,,47.4836,10.3817,2008 +DL/AL-242,Laufbichelkirche,,47.4319,10.3853,2042 +DL/AL-243,Mittagspitz,,47.4528,10.4156,1662 +DL/AL-244,Oestl. Wengenkopf,,47.4256,10.3606,2207 +DL/AL-245,Schattenberg,,47.4000,10.3144,1798 +DL/AL-246,Sonthofer Hoernle,,47.4767,10.3378,1525 +DL/AL-247,Zwoelferkopf,,47.4878,10.3503,1855 +DL/AL-248,Pfannenhoelzer,,47.4486,10.4031,1908 +DL/AL-249,Lachekopf,,47.4711,10.3942,1488 +DL/AL-250,Eschers,,47.8478,10.3767,901 +DL/AL-251,Kreuzelspitz,,47.5467,10.3017,1496 +DL/AL-252,Imbergkamm,,47.5122,10.0289,1305 +DL/AL-253,Jochgern,,47.3597,10.3708,1448 +DL/AL-254,Hoefats Suedgipfel,,47.3650,10.3531,2257 +DL/AL-255,Hoefats Ostgipfel,,47.3661,10.3506,2259 +DL/AL-256,Hoefats Nordgipfel,,47.3717,10.3500,2257 +DL/AL-257,Huettenkopf,,47.3742,10.3342,1949 +DL/AL-258,Am roten Kopf,,47.54140091,10.17640018,1481 +DL/AL-259,Huendlekopf,,47.5406,10.0578,1112 +DL/AL-260,Huettenberg,,47.5653,10.0697,1103 +DL/AL-261,Kuehberg,,47.5975,10.1433,1035 +DL/AL-262,Stoffelberg,,47.6369,10.2239,1063 +DL/AL-263,Kalzhofener Hoehe,,47.5803,10.0625,1118 +DL/AL-264,Kalzhofner Berg,,47.5742,10.0386,1007 +DL/AL-265,Kuehberg,,47.5975,10.1431,1035 +DL/AL-266,Muttner Hoehe,,47.5778,10.0517,1067 +DL/AL-267,Ochsenberg,,47.60079956,10.09829998,1126 +DL/AL-268,Brosisellegghoehe,,47.6003,10.3611,1117 +DL/AL-269,Auf´m Berg,,47.6489,10.6006,900 +DL/AL-270,Illasberg,,47.6483,10.7556,852 +DL/AL-271,Auf dem Falken,,47.59140015,10.29310036,1116 +DL/AL-272,Altringenberg,,47.66189957,10.01169968,844 +DL/AL-273,Laubenberg,,47.62020111,10.02350044,919 +DL/AL-274,Fernberg,,47.59960175,10.04669952,1012 +DL/AL-275,Gehaeuenholz,,47.56439972,9.98639965,981 +DL/AL-276,Attensberg,,47.54930115,10.00329971,998 +DL/AL-277,Auf dem Hochstraess,,47.53319931,9.93509960,1041 +DL/AL-278,Fluh,,47.50659943,10.00419998,1391 +DL/AL-279,Gruener,,47.27519989,10.20790005,1913 +DL/AL-280,Eckhalde,,47.54180145,10.14169979,1491 +DL/AL-281,Ursersberg,,47.71260071,10.18500042,1129 +DL/AL-282,Steig,,47.79359818,10.38529968,916 +DL/AL-283,Vilser Berg,,47.55929947,10.65590000,1026 +DL/AM-001,Peissenberg,,47.80080032,11.01280022,988 +DL/AM-002,Hohe Bleick,,47.63000107,10.90750027,1638 +DL/AM-003,Wolfskopf,,47.63109970,10.86750031,1526 +DL/AM-004,Kofel,,47.58670044,11.05939960,1341 +DL/AM-005,Zahn,,47.5842,11.0256,1619 +DL/AM-006,Sonnenberg,,47.58420181,11.01640034,1622 +DL/AM-007,Puerschling,,47.5828,10.9933,1566 +DL/AM-008,Teufelstaettkopf,,47.58750153,10.98690033,1755 +DL/AM-009,Hennenkopf,,47.58610153,10.96059990,1768 +DL/AM-010,Dreisaeulerl Kopf,,47.5864,10.9458,1629 +DL/AM-011,Brunnenkopf,,47.5836,10.9247,1718 +DL/AM-012,Grosse Klammspitz,,47.58029938,10.90750027,1924 +DL/AM-013,Kleine Klammspitze,,47.5839,10.9089,1882 +DL/AM-014,Feigenkopf,,47.57939911,10.89109993,1867 +DL/AM-015,Grubenkopf,,47.57860184,10.86890030,1847 +DL/AM-016,Firstberg,,47.5794,10.8581,1784 +DL/AM-017,Scheinbergspitze,,47.55500031,10.88780022,1926 +DL/AM-018,Vorderscheinberg,,47.56420135,10.86779976,1827 +DL/AM-019,Hasentalkopf,,47.5656,10.8747,1797 +DL/AM-020,Loesertalkopf,,47.5589,10.8761,1859 +DL/AM-021,Weitalpspitze,,47.5492,10.8633,1870 +DL/AM-022,Hochplatte,,47.55220032,10.84189987,2082 +DL/AM-023,Kenzenkopf,,47.5614,10.8478,1745 +DL/AM-024,Hochblasse,,47.5475,10.8392,1989 +DL/AM-025,Kraehe,,47.55310059,10.82559967,2010 +DL/AM-026,Gabelschrofen,,47.5550,10.8231,1989 +DL/AM-027,Gumpenkarspitze,,47.55860138,10.82810020,1918 +DL/AM-027,Gumpenkarspitze,,47.5586,10.8281,1918 +DL/AM-028,Geiselstein,,47.56190109,10.82999992,1881 +DL/AM-029,Hoher Straussberg,,47.54389954,10.79440022,1933 +DL/AM-030,Ahornspitze,,47.55310059,10.79829979,1784 +DL/AM-031,Branderschrofen,,47.55970001,10.78719997,1880 +DL/AM-032,Spitzigschroefle,,47.5658,10.7939,1652 +DL/AM-033,Schoenleitenschrofen,,47.57170105,10.80889988,1707 +DL/AM-034,Saeuling,,47.53499985,10.75389957,2047 +DL/AM-035,Pilgerschrofen,,47.5397,10.7417,1769 +DL/AM-036,Zunderkopf,,47.5306,10.7672,1726 +DL/AM-037,Duerrenberg,,47.5203,10.7636,1797 +DL/AM-038,Schlagstein,,47.5308,10.7889,1680 +DL/AM-039,Kreuzkopf,,47.52030182,10.81309986,1909 +DL/AM-040,Ochsenaelpeleskopf,,47.52750015,10.81420040,1905 +DL/AM-041,Kuchelbergspitz,,47.5411,10.9425,2020 +DL/AM-042,Kuchelbergkopf,,47.5356,10.9261,2026 +DL/AM-043,Kreuzspitze,,47.52640152,10.91779995,2185 +DL/AM-044,Friederspitz,,47.5175,10.9592,2049 +DL/AM-045,Frieder,,47.52310181,10.96140003,2053 +DL/AM-046,Schellschlicht,,47.50920105,10.91639996,2053 +DL/AM-047,Sunkenkopf,,47.5047,10.9322,1766 +DL/AM-048,Schellkopf,,47.49720001,10.88829994,1832 +DL/AM-049,Notkarspitze,,47.55360031,11.05529976,1888 +DL/AM-050,Bruenstelskopf,,47.5394,11.0472,1814 +DL/AM-051,Vorderer Felderkopf,,47.53030014,11.02939987,1928 +DL/AM-052,Kienjoch,,47.54079819,10.99890041,1953 +DL/AM-053,Windstierlkopf,,47.5314,11.0081,1824 +DL/AM-054,Kieneckspitze,,47.5458,11.0050,1943 +DL/AM-055,Hirschbuehel,,47.51440048,11.01189995,1934 +DL/AM-056,Kramerspitz,,47.50719833,11.04720020,1985 +DL/AM-057,Hoher Ziegspitz,,47.50170135,11.00329971,1864 +DL/AM-058,Hinteres Hoernle,,47.63890076,11.07439995,1548 +DL/AM-059,Ettaler Manndl,,47.5856,11.1308,1633 +DL/AM-060,Laber,,47.58580017,11.10330009,1686 +DL/AM-061,Buchenberg,,47.6061,10.8117,1142 +DL/AM-062,Hochriesskopf,,47.6272,10.8597,1470 +DL/AM-063,Goergeleck,,47.6214,10.8411,1429 +DL/AM-064,Muehlschartenkopf,,47.6181,10.8322,1308 +DL/AM-065,Rohrkopf,,47.5706,10.7806,1361 +DL/AM-066,Hornburg,,47.5717,10.7689,1172 +DL/AM-067,Tegelberg,,47.5561,10.7753,1880 +DL/AM-068,Altenberg,,47.5217,10.8028,1751 +DL/AM-069,Aschauer Berg,,47.6303,11.1111,1231 +DL/AM-070,Aschlerberg,,47.6439,11.0828,1430 +DL/AM-071,Grosser Aufacker,,47.61389923,11.09749985,1542 +DL/AM-072,Kleiner Aufacker,,47.6144,11.1072,1533 +DL/AM-073,Baumgartenkoepfl,,47.5922,10.9181,1489 +DL/AM-074,Bena Koepfl,,47.5472,10.7836,1593 +DL/AM-075,Herziges Bergel,,47.5981,10.8586,1152 +DL/AM-076,Birnkopf,,47.6181,10.8772,1372 +DL/AM-077,Brameck,,47.6103,10.9119,1162 +DL/AM-078,Brameckkoepfel,,47.6097,10.8994,1287 +DL/AM-079,Hoher Brand,,47.5006,10.9131,1764 +DL/AM-080,Brandjoch,,47.5061,10.9089,1957 +DL/AM-081,Bremeneck,,47.6022,10.9983,1410 +DL/AM-082,Bruckkoepfel,,47.6408,10.8675,1092 +DL/AM-083,Brunnberg,,47.5842,11.0414,1529 +DL/AM-084,Brunnenkoepfl,,47.5506,10.9683,1609 +DL/AM-085,Dreierkoepfel,,47.5547,11.0039,1748 +DL/AM-086,Dreimaennl,,47.5606,10.8022,1551 +DL/AM-087,Duereckkopf,,47.6292,10.9400,1422 +DL/AM-088,Felderkopf,,47.5317,11.0186,1818 +DL/AM-089,G'hoerigenkoepf,,47.5533,10.9456,1298 +DL/AM-090,Geissberg,,47.6447,11.0617,1484 +DL/AM-091,Geisssprungkopf,,47.5400,11.0014,1934 +DL/AM-092,Gelber Wandschrofen,,47.5633,10.7775,1645 +DL/AM-093,Grosser Laber,,47.57780075,11.11890030,1466 +DL/AM-094,Grosser Zunderkopf,,47.5347,11.0342,1895 +DL/AM-095,Gschwandkopf,,47.6100,11.0972,1480 +DL/AM-096,Gsimseck,,47.6158,10.9278,1152 +DL/AM-097,Haldemooseck,,47.6533,10.9475,1007 +DL/AM-098,Hennenkopf (2),,47.5878,10.8128,1356 +DL/AM-099,Heuberg,,47.5475,11.1072,999 +DL/AM-100,Hinterer Rappenkopf,,47.5850,11.0500,1389 +DL/AM-101,Hinterschergen,,47.6281,10.9792,1307 +DL/AM-102,Hintertoerle,,47.5819,10.8519,1674 +DL/AM-103,Hirschbichlruecken,,47.5153,11.0275,1683 +DL/AM-104,Hochschergen,,47.63029861,10.99219990,1395 +DL/AM-105,Hochwildfeuerberg,,47.63389969,10.93920040,1541 +DL/AM-106,Hoher Trauchberg,,47.6397,10.8950,1456 +DL/AM-107,Hoellstein,,47.5892,11.1250,1435 +DL/AM-108,Mittleres Hoernle,,47.6411,11.0631,1496 +DL/AM-109,Voderes Hoernle,,47.6447,11.0617,1484 +DL/AM-110,Hundsfaellkoepfe,,47.5661,10.8972,1536 +DL/AM-111,Jaufen,,47.5892,10.8922,1624 +DL/AM-112,Jochberg,,47.52280045,10.76220036,1861 +DL/AM-113,Kenzenkoepfel,,47.5692,10.8542,1354 +DL/AM-114,Kirchenkopf,,47.5597,10.9469,1209 +DL/AM-115,Kleinwachsbichel,,47.6206,10.9861,1240 +DL/AM-116,Kleinwildfeuerberg,,47.6367,10.9353,1500 +DL/AM-117,Koepfel,,47.6128,11.0058,1196 +DL/AM-118,Kreuzspitzl,,47.51829910,10.91720009,2089 +DL/AM-119,Krottenkoepfel,,47.5192,11.0092,1780 +DL/AM-120,Krottenstein,,47.5906,10.8819,1684 +DL/AM-121,Latschenkopf,,47.5867,10.9861,1740 +DL/AM-122,Laubeneck,,47.58750153,10.97970009,1758 +DL/AM-123,Lausbichel,,47.5133,10.9581,1952 +DL/AM-124,Lauskopf,,47.5981,10.9717,1363 +DL/AM-125,Manndlkoepfe,,47.5836,11.1108,1605 +DL/AM-126,Martinswand,,47.5761,10.9331,1352 +DL/AM-127,Maulkopf,,47.6281,10.8897,1517 +DL/AM-128,Mitterwachsbichel,,47.6147,10.9861,1316 +DL/AM-129,Muehlberg,,47.5697,11.1153,1350 +DL/AM-130,Nickelskopf,,47.5972,10.8914,1364 +DL/AM-131,Niederbleieck,,47.6356,10.9128,1589 +DL/AM-132,Niederstraussberg,,47.5486,10.8153,1877 +DL/AM-133,Ochsensitz,,47.5578,11.0856,1515 +DL/AM-134,Ofenberg,,47.48500061,10.95810032,1173 +DL/AM-135,Rabenkopf,,47.5528,11.1147,1107 +DL/AM-136,Rahmenstein,,47.5683,10.8258,1378 +DL/AM-137,Rauheck,,47.4953,10.9828,1636 +DL/AM-138,Rauhenstein,,47.4981,10.9875,1727 +DL/AM-139,Rehbreinkopf,,47.6228,11.0850,1416 +DL/AM-140,Rinneleck,,47.5633,10.9581,1112 +DL/AM-141,Weisser Risskopf,,47.5761,10.8053,1486 +DL/AM-142,Rosengarten,,47.6025,11.0058,1423 +DL/AM-143,Rosseck,,47.5750,10.9411,1305 +DL/AM-144,Rosskarkopf,,47.5142,11.0442,1712 +DL/AM-145,Roskopf,,47.6056,10.9544,1172 +DL/AM-146,Rossstallkopf,,47.5881,10.8658,1490 +DL/AM-147,Rossstallkoepfl,,47.5881,10.8556,1499 +DL/AM-148,Saueregg,,47.5169,10.7775,1703 +DL/AM-149,Schaeferblasse,,47.5386,10.8397,1764 +DL/AM-150,Schaffelberg,,47.5864,11.0906,1434 +DL/AM-151,Schafkopf,,47.54420090,11.09060001,1380 +DL/AM-152,Scharfeck,,47.5097,10.9617,1926 +DL/AM-153,Schartenkoepf,,47.6075,11.0069,1370 +DL/AM-154,Schelleck,,47.4953,10.9194,1479 +DL/AM-155,Schloessel,,47.5558,10.8628,1806 +DL/AM-156,Schneidberg,,47.66249847,10.90690041,1012 +DL/AM-157,Schoberkoepfl,,47.6483,10.8764,1001 +DL/AM-158,Schwabenkopf,,47.5956,10.9547,1346 +DL/AM-159,Schwarzeck,,47.6386,10.9019,1471 +DL/AM-160,Schwarzenkopf,,47.58860016,10.88220024,1684 +DL/AM-161,Schwarzenkoepfel (1),,47.5294,10.9086,1897 +DL/AM-162,Schwarzenkoepfel (2),,47.6100,10.8728,1189 +DL/AM-163,Sefelwand,,47.5781,10.9147,1724 +DL/AM-164,Stierkopf,,47.6358,11.0769,1535 +DL/AM-165,Straussbergkoepfel,,47.5497,10.7994,1767 +DL/AM-166,Sulzeck,,47.5736,10.9250,1389 +DL/AM-167,Sunkenberg,,47.4997,10.9364,1301 +DL/AM-168,Tegelbergkopf,,47.5589,10.7692,1567 +DL/AM-169,Vorderer Ziegspitz,,47.5072,11.0117,1815 +DL/AM-170,Vordertoerle,,47.5819,10.8414,1373 +DL/AM-171,Wachsbichl,,47.6056,10.9839,1364 +DL/AM-172,Windstierleck,,47.5261,11.0008,1701 +DL/AM-173,Ziegelspitz,,47.5567,11.0722,1719 +DL/AM-174,Zunderkoepfel,,47.4983,11.0106,1656 +DL/AM-175,Kienberg,,47.56259918,10.71189976,996 +DL/AM-176,Rentschen,,47.71530151,10.90939999,958 +DL/AM-177,Kirnberg,,47.72740173,11.03149986,949 +DL/AM-178,Ammerleite,,47.76559830,10.96730042,901 +DL/AM-179,Hoehenberg,,47.58169937,11.15979958,956 +DL/AM-180,Berndorfer Buchet,,47.91680145,11.21879959,760 +DL/BE-001,Blomberg,,47.7356,11.5033,1248 +DL/BE-002,Heigelkopf,,47.7286,11.5147,1205 +DL/BE-003,Zwieselberg,,47.72470093,11.48939991,1348 +DL/BE-004,Enzenauerkopf,,47.7272,11.4600,1201 +DL/BE-005,Angerlkopf,,47.7236,11.4683,1266 +DL/BE-006,Stallauer Eck,,47.7350,11.4797,1216 +DL/BE-007,Demelspitze,,47.6703,11.5456,1158 +DL/BE-008,Brauneck,,47.6650,11.5256,1554 +DL/BE-009,Schroedelstein,,47.6628,11.5208,1548 +DL/BE-010,Stangeneck,,47.6606,11.5086,1646 +DL/BE-011,Vorderer Kirchstein,,47.6606,11.5031,1670 +DL/BE-012,Hinterer Kirchstein,,47.6589,11.4947,1667 +DL/BE-013,Latschenkopf (1),,47.65639877,11.49860001,1711 +DL/BE-014,Probstenwand,,47.6625,11.4856,1589 +DL/BE-015,Achselkoepfe,,47.65330124,11.48560047,1709 +DL/BE-015,Achselkoepfe,,47.6533,11.4856,1709 +DL/BE-016,Benediktenwand,,47.65309906,11.46529961,1800 +DL/BE-017,Glaswand,,47.65390015,11.43750000,1496 +DL/BE-018,Rabenkopf,,47.65110016,11.41329956,1555 +DL/BE-019,Hirschhoernlkopf,,47.62779999,11.40690041,1513 +DL/BE-020,Altacher Hochkopf,,47.55530167,11.35809994,1328 +DL/BE-021,Staffel,,47.58639908,11.46889973,1532 +DL/BE-022,Hoher Zwiesler,,47.60169983,11.54080009,1374 +DL/BE-023,Altlachberg,,47.5697,11.3778,1235 +DL/BE-024,Anderlkopf,,47.6117,11.5644,1231 +DL/BE-025,Bergelskopf,,47.6436,11.4022,1413 +DL/BE-026,Blaickenberg,,47.6586,11.5444,1133 +DL/BE-027,Brandenberg,,47.6778,11.4603,1031 +DL/BE-028,Brandkopf,,47.61330032,11.52390003,1152 +DL/BE-029,Brandkoepfl,,47.6578,11.4556,1442 +DL/BE-030,Brunnenberg,,47.60829926,11.46249962,1102 +DL/BE-031,Bruenstkopf,,47.5914,11.5197,1046 +DL/BE-032,Buchenauer Kopf,,47.69309998,11.46689987,1225 +DL/BE-033,Eibelskopf,,47.6631,11.4589,1418 +DL/BE-034,Eselauberg,,47.6525,11.5442,1041 +DL/BE-035,Fahrenberg,,47.5350,11.2925,1074 +DL/BE-036,Fahrtkopf,,47.7192,11.4658,1203 +DL/BE-037,Falkenwand,,47.5842,11.5039,1228 +DL/BE-038,Feuereck,,47.6497,11.4050,1462 +DL/BE-039,Fischberg,,47.60079956,11.39220047,1164 +DL/BE-040,Galgenwurfkoepfl,,47.5575,11.3858,1143 +DL/BE-041,Gemskopf,,47.6583,11.4317,1372 +DL/BE-042,Goerglkoepfl,,47.6942,11.4836,1068 +DL/BE-043,Graseck,,47.6381,11.3783,1281 +DL/BE-044,Hahnberg,,47.63420105,11.49190044,1321 +DL/BE-045,Hochbergschneid,,47.6219,11.5692,1221 +DL/BE-046,Hochenkopf,,47.6144,11.4797,1100 +DL/BE-047,Altlacher Hochkopf,,47.5553,11.3581,1328 +DL/BE-048,Risser Hochkopf,,47.56359863,11.42109966,1348 +DL/BE-049,Hochtannenkopf,,47.70140076,11.49670029,1184 +DL/BE-050,Jochberg,,47.62670135,11.37250042,1565 +DL/BE-051,Kaltwasserwand,,47.6369,11.3953,1262 +DL/BE-052,Katzenkopf,,47.6550,11.5186,1350 +DL/BE-053,Kesselkopf,,47.6819,11.5019,1248 +DL/BE-054,Klausenkopf (1),,47.5553,11.3294,1232 +DL/BE-055,Klausenkopf (2),,47.6864,11.5039,1151 +DL/BE-056,Kogelberg,,47.6758,11.5347,1234 +DL/BE-057,Kohlberg,,47.6397,11.5461,1042 +DL/BE-058,Stallauer Kopf,,47.7253,11.4833,1322 +DL/BE-059,Tiefentaler Koepfe,,47.6639,11.4725,1401 +DL/BE-060,Labelsberg,,47.6283,11.4539,1406 +DL/BE-061,Laengenberg,,47.6761,11.4925,1244 +DL/BE-062,Laengentalkopf,,47.6689,11.5133,1326 +DL/BE-063,Latschenkopf (2),,47.63190079,11.46469975,1488 +DL/BE-064,Lettnerberg,,47.62139893,11.54249954,1052 +DL/BE-065,Lusenkoepfel,,47.6586,11.4144,1299 +DL/BE-066,Mitterberg,,47.56439972,11.39970016,1313 +DL/BE-067,Mitterberg (2),,47.6169,11.3842,1240 +DL/BE-068,Mitterkopf,,47.6114,11.5561,1275 +DL/BE-069,Moosenbergkopf,,47.6797,11.4889,1244 +DL/BE-070,Paradieskoepfl,,47.6072,11.5567,1204 +DL/BE-071,Rautbergkopf,,47.5839,11.4264,1415 +DL/BE-072,Reineck,,47.5906,11.4900,1192 +DL/BE-073,Rotwand,,47.59999847,11.50329971,1104 +DL/BE-074,Sagrinnenkoepfel,,47.5900,11.4181,1120 +DL/BE-075,Sattelkopf,,47.6850,11.4808,1202 +DL/BE-076,Schindelberg,,47.57889938,11.52029991,1145 +DL/BE-077,Schuerpfeneckberg,,47.5686,11.4392,1296 +DL/BE-078,Schuerpfenkopf,,47.5742,11.4417,1221 +DL/BE-079,Schwarzberg,,47.5747,11.5017,1172 +DL/BE-080,Schwarzeck,,47.6531,11.4142,1527 +DL/BE-081,Schwarzenbergkopf,,47.6667,11.4308,1232 +DL/BE-082,Sonnenspitz,,47.6408,11.3775,1269 +DL/BE-083,Spitzberg,,47.57220078,11.45919991,1366 +DL/BE-084,Talkopf,,47.61809921,11.56219959,1273 +DL/BE-085,Vogelkopf,,47.6886,11.4828,1210 +DL/BE-086,Waxenstein (1),,47.6667,11.5436,1310 +DL/BE-087,Waxenstein (2),,47.6856,11.4906,1162 +DL/BE-088,Wespenkopf,,47.6342,11.4311,1127 +DL/BE-089,Windpasselkopf,,47.6981,11.4483,1146 +DL/BE-090,Hoher Zwiesler,,47.6017,11.5408,1374 +DL/BE-091,Zwoelferkoepfl,,47.58390045,11.42969990,1437 +DL/BE-092,Niederskopf,,47.57669830,11.50329971,1289 +DL/BE-093,Buchberg,,47.75310135,11.50640011,858 +DL/BE-094,Irschenhausen,,47.97370148,11.42780018,726 +DL/BG-001,Zwiesel,,47.75669861,12.81470013,1782 +DL/BG-002,Mittelstaufen,,47.7564,12.8353,1615 +DL/BG-003,Hochstaufen,,47.75579834,12.85000038,1771 +DL/BG-004,Pflasterbachhoerndl,,47.70109940,12.82919979,1270 +DL/BG-005,Kl. Weitschartenkopf,,47.6367,12.7906,1930 +DL/BG-006,Schottmalhorn,,47.6142,12.8303,2045 +DL/BG-007,Edelweisslahner,,47.6200,12.8378,1953 +DL/BG-008,Wagendrischelhorn,,47.59970093,12.79310036,2251 +DL/BG-009,Stadelhorn,,47.59389877,12.79640007,2287 +DL/BG-010,Gr. Muehlsturzhorn,,47.5917,12.7983,2234 +DL/BG-011,Predigtstuhl,,47.6964,12.8789,1607 +DL/BG-012,Hochschlegel,,47.6911,12.8839,1688 +DL/BG-013,Dreisessel,,47.6911,12.8975,1680 +DL/BG-014,Karkopf,,47.68610001,12.89220047,1738 +DL/BG-015,Toerlkopf,,47.6769,12.8983,1704 +DL/BG-016,Hirschangerkopf,,47.6769,12.9556,1768 +DL/BG-017,Achenkopf,,47.7014,12.9536,1577 +DL/BG-018,Ochsenkopf,,47.7094,12.9625,1780 +DL/BG-019,Mitterberg,,47.7078,12.9750,1840 +DL/BG-020,Berchtesgadener Hochthron,,47.69639969,12.98690033,1972 +DL/BG-021,Gr. Rauhenkopf,,47.6789,12.9736,1658 +DL/BG-022,Kneifelspitze,,47.65829849,13.01939964,1189 +DL/BG-023,Ahornbuechsenkopf,,47.61940002,13.08170033,1604 +DL/BG-024,Karlkogel,,47.5458,12.8225,2195 +DL/BG-025,Kammerlingerhorn,,47.5450,12.8325,2484 +DL/BG-026,Hocheisspitz,,47.54690170,12.84280014,2523 +DL/BG-027,Hinterbergkopf,,47.5514,12.8528,2247 +DL/BG-028,Steintalhoernl,,47.56000137,12.85529995,2468 +DL/BG-029,Ofentalhoernl,,47.56250000,12.86219978,2513 +DL/BG-030,Hochkalter,,47.56940079,12.86579990,2607 +DL/BG-031,Kl. Kalter,,47.5725,12.8625,2513 +DL/BG-032,Blaueisspitze,,47.5717,12.8694,2481 +DL/BG-033,Schaertenspitze,,47.58169937,12.87469959,2153 +DL/BG-034,Steinberg,,47.5858,12.8775,2065 +DL/BG-035,Wasserwandkopf,,47.5789,12.8622,2367 +DL/BG-036,Goetschenkopf,,47.6317,12.9342,1307 +DL/BG-037,Toter Mann,,47.63109970,12.92329979,1391 +DL/BG-038,Hocheck,,47.5583,12.9239,2651 +DL/BG-039,Watzmann Mittelspitze,,47.55440140,12.92220020,2713 +DL/BG-040,Watzmann Suedspitze,,47.54809952,12.91689968,2712 +DL/BG-041,Gr. Palfelhorn,,47.5278,12.8625,2222 +DL/BG-042,Hundstodkendelkopf,,47.5178,12.8844,2396 +DL/BG-043,Gr. Hundstod,,47.51250076,12.88560009,2593 +DL/BG-044,Schneiber,,47.51079941,12.91189957,2330 +DL/BG-045,Gjaidkopf,,47.51610184,12.91110039,2268 +DL/BG-046,Glunkerer,,47.4975,12.9467,1928 +DL/BG-047,Grieskogel,,47.47470093,12.97309971,2543 +DL/BG-048,Feldkogel,,47.4953,12.9578,1880 +DL/BG-049,Funtenseetauern,,47.48469925,12.97749996,2578 +DL/BG-050,Stuhljoch,,47.4900,12.9669,2446 +DL/BG-051,Hochscheibe,,47.4881,12.9744,2462 +DL/BG-052,Ebenhorn,,47.4933,12.9747,2371 +DL/BG-053,Kuhscheibe,,47.5019,12.9733,2010 +DL/BG-054,Kl. Teufelshorn,,47.48780060,13.03279972,2283 +DL/BG-055,Gr. Teufelshorn,,47.49000168,13.03779984,2361 +DL/BG-056,Jaegerbrunntrog,,47.4942,13.0478,2248 +DL/BG-057,Wildalmriedl,,47.49890137,13.04969978,2268 +DL/BG-058,Hint. Kragenkopf,,47.5158,13.0481,2143 +DL/BG-059,Vord. Kragenkopf,,47.5214,13.0469,2174 +DL/BG-060,Kahlersberg,,47.53219986,13.03310013,2350 +DL/BG-061,Schneibstein,,47.56309891,13.05830002,2275 +DL/BG-062,Jenner,,47.57640076,13.02140045,1874 +DL/BG-063,Hohes Brett,,47.5853,13.0500,2341 +DL/BG-064,Gr. Archenkopf,,47.5872,13.0708,2391 +DL/BG-065,Hoher Goell,,47.59500122,13.06779957,2528 +DL/BG-066,Kehlstein,,47.6125,13.0417,1837 +DL/BG-067,Kleiner Watzmann,,47.55889893,12.94250011,2307 +DL/BG-068,Eckberg,,47.68579865,13.02250004,1017 +DL/BG-069,Kienberg,,47.67670059,12.80420017,1026 +DL/BG-070,Hirschwiese,,47.52939987,12.91639996,2114 +DL/BG-071,Graskopf,,47.48189926,12.98330021,2519 +DL/BG-072,Simetsberg,,47.51029968,12.95189953,1884 +DL/BG-073,Viekogel,,47.48809814,12.93280029,2158 +DL/BG-074,Hirsch,,47.49810028,12.92029953,1993 +DL/BG-075,Kl. Regenbergl,,47.52280045,12.99639988,1670 +DL/BG-076,Gruenstein,,47.59420013,12.96560001,1304 +DL/BG-077,Stanglahnerkopf,,47.57920074,12.89000034,1791 +DL/BG-078,Alpenhorn,,47.53609848,12.84939957,2254 +DL/BG-079,Windschartenkopf,,47.55030060,13.04440022,2210 +DL/BG-080,Hirscheck,,47.65250015,12.81079960,1782 +DL/BG-081,Gebersberg,,47.70000076,12.81359959,1051 +DL/BG-082,Salz. Hochthron,,47.71780014,13.00500011,1852 +DL/BG-083,Pfaffenbichel,,47.64530182,12.89500046,1428 +DL/BG-084,Moosenkopf,,47.65750122,12.86470032,1504 +DL/BG-085,Zirbeneck,,47.62749863,12.83220005,1810 +DL/BG-086,Eisberg,,47.62580109,12.84749985,1800 +DL/BG-087,Toertlschneid,,47.65589905,12.88300037,1662 +DL/BG-088,Kaelberstein,,47.63529968,12.99260044,781 +DL/BG-089,Braendelberg,,47.66400146,13.04689980,934 +DL/BG-090,Lercheck,,47.66149902,13.06789970,1049 +DL/BG-090,Lercheck,,47.6615,13.0679,1049 +DL/BG-091,Hochzinken,,47.69469833,13.03450012,923 +DL/BG-092,Hohe Goetschen,,47.69570160,13.06359959,903 +DL/CG-001,Geigelstein,,47.70750046,12.33440018,1808 +DL/CG-002,Rossalpenkopf,,47.7136,12.3333,1762 +DL/CG-004,Wandspitz,,47.7100,12.3250,1685 +DL/CG-005,Breitenstein,,47.69689941,12.33810043,1661 +DL/CG-005,Breitenstein,,47.6969,12.3381,1661 +DL/CG-006,Muehlhornwand,,47.7061,12.3172,1658 +DL/CG-007,Weitlahnerkopf,,47.7228,12.3431,1615 +DL/CG-008,Latschkogel,,47.7131,12.3431,1589 +DL/CG-009,Ahornkopf,,47.7156,12.3489,1540 +DL/CG-010,Muehlhoerndel,,47.7047,12.2994,1519 +DL/CG-011,Karkopf (Geigelstein),,47.6900,12.3397,1510 +DL/CG-012,Moosberg,,47.6978,12.3208,1396 +DL/CG-013,Wirtsalpkopf,,47.6911,12.2853,1244 +DL/CG-014,Hochfelln,,47.76190186,12.55939960,1664 +DL/CG-015,Haaralmschneid,,47.74190140,12.56060028,1594 +DL/CG-016,Weissgrabenkopf,,47.7508,12.5578,1578 +DL/CG-017,Groehrkopf,,47.7461,12.5603,1562 +DL/CG-018,Hochgern,,47.75059891,12.51580048,1744 +DL/CG-019,Zwoelferspitz,,47.7514,12.5003,1633 +DL/CG-020,Hasenpoint,,47.7447,12.5131,1587 +DL/CG-021,Bischofsstuhl,,47.7503,12.5247,1516 +DL/CG-022,Mansurfer,,47.7375,12.5258,1514 +DL/CG-023,Zinnkopf (Hochgern),,47.7783,12.5261,1223 +DL/CG-024,Hochplatte,,47.75109863,12.40499973,1587 +DL/CG-025,Teufelstein,,47.7481,12.4067,1435 +DL/CG-026,Friedenrath,,47.7600,12.4053,1432 +DL/CG-027,Gross Staffen,,47.77059937,12.41139984,1283 +DL/CG-028,Breitenberg,,47.7803,12.4086,1047 +DL/CG-029,Strehtrumpf,,47.7758,12.4253,973 +DL/CG-030,Hochries,,47.74689865,12.24860001,1568 +DL/CG-031,Zinnenberg,,47.73249817,12.26500034,1565 +DL/CG-032,Klausenberg,,47.7386,12.2667,1554 +DL/CG-033,Feichteck,,47.73469925,12.23079967,1514 +DL/CG-034,Heuraffelkopf,,47.7481,12.2797,1504 +DL/CG-035,Karkopf (Hochries),,47.7397,12.2389,1496 +DL/CG-036,Predigtstuhl (Hochries),,47.7433,12.2722,1494 +DL/CG-037,Riesenberg,,47.75970078,12.26920033,1449 +DL/CG-038,Spielberg,,47.7536,12.2681,1440 +DL/CG-039,Kitzstein,,47.7231,12.1883,1398 +DL/CG-040,Zellerhorn,,47.7544,12.2917,1396 +DL/CG-041,Kranzhorn,,47.70059967,12.18420029,1365 +DL/CG-042,Laubenstein,,47.7578,12.2889,1350 +DL/CG-043,Heuberg,,47.7261,12.1839,1338 +DL/CG-044,Hammerstein,,47.7608,12.2961,1278 +DL/CG-045,Schwarzenberg,,47.7722,12.2731,1136 +DL/CG-046,Kampenwand,,47.75579834,12.36779976,1668 +DL/CG-047,Scheibenwand,,47.75139999,12.34809971,1598 +DL/CG-048,Sonnwendwand,,47.7461,12.3344,1512 +DL/CG-049,Sulten,,47.7633,12.3686,1466 +DL/CG-050,Hemmerstein,,47.7461,12.3586,1413 +DL/CG-051,Gedererwand,,47.76779938,12.38220024,1398 +DL/CG-052,Brunnsteinkopf,,47.7578,12.3383,1224 +DL/CG-053,Haindorfer Berg,,47.78030014,12.35190010,1123 +DL/CG-054,Eiberg,,47.7747,12.3642,1023 +DL/CG-055,Gurnwandkopf,,47.70529938,12.57830048,1691 +DL/CG-056,Hoerndlwand,,47.7067,12.5864,1684 +DL/CG-057,Hinterer Rauschberg,,47.73310089,12.69670010,1671 +DL/CG-058,Vorderer Rauschberg,,47.7325,12.6839,1646 +DL/CG-059,Zenokopf,,47.73440170,12.71940041,1603 +DL/CG-060,Streicher,,47.7361,12.7108,1594 +DL/CG-061,Sulzgrabenkopf,,47.7172,12.5914,1521 +DL/CG-062,Eisenberg,,47.72890091,12.62110043,1488 +DL/CG-063,Unternberg,,47.7286,12.6392,1425 +DL/CG-064,Durlachkopf,,47.7239,12.6144,1395 +DL/CG-065,Zinnkopf (Ruhpolding),,47.78110123,12.67720032,1227 +DL/CG-066,Schachenberg,,47.7128,12.2944,1076 +DL/CG-067,Rudersburg,,47.68470001,12.36999989,1430 +DL/CG-068,Sandspitz,,47.6900,12.3572,1420 +DL/CG-069,Spitzberg,,47.7147,12.3558,1444 +DL/CG-070,Rauhe-Nadel,,47.69889832,12.44060040,1366 +DL/CG-071,Daxlberg,,47.8311,12.6183,740 +DL/CG-072,Sonntagshorn,,47.68220139,12.69579983,1981 +DL/CG-073,Reifelberg,,47.6822,12.6778,1883 +DL/CG-074,Aibleck,,47.68970108,12.70810032,1756 +DL/CG-075,Hochgern (Sonntagshorn),,47.6808,12.7050,1740 +DL/CG-076,Fischbachkopf,,47.6808,12.6658,1694 +DL/CG-077,Ochsenhorn,,47.6892,12.7189,1615 +DL/CG-078,Augenstein,,47.6989,12.7169,1584 +DL/CG-079,Ristfeuchthorn,,47.69440079,12.78139973,1569 +DL/CG-080,Spitzstein,,47.71060181,12.24670029,1596 +DL/CG-081,Brandelberg,,47.7172,12.2539,1516 +DL/CG-082,Duerrnbachhorn,,47.67330170,12.60579967,1776 +DL/CG-083,Wildalphorn,,47.6756,12.6286,1690 +DL/CG-084,Lembergschneid,,47.6731,12.5953,1597 +DL/CG-085,Ochsenlahnerkopf,,47.6733,12.6358,1500 +DL/CG-086,Markkogel,,47.6306,12.5250,1598 +DL/CG-087,Lahnerkogel,,47.6283,12.5197,1595 +DL/CG-088,Steinwurfkogel,,47.6250,12.4992,1587 +DL/CG-089,Hochscharten,,47.70190048,12.53719997,1474 +DL/CG-090,Rachelspitz,,47.70920181,12.52330017,1415 +DL/CG-091,Schellenberg,,47.8117,12.5833,823 +DL/CG-092,Erlbergkopf,,47.77830124,12.37639999,1134 +DL/CG-093,Aschauer Kopf,,47.78030014,12.29810047,1076 +DL/CG-094,Ratzinger Hoehe,,47.87810135,12.30469990,694 +DL/CG-095,Seekopf,,47.70560074,12.62310028,1179 +DL/CG-096,Kl. Rechenberg,,47.72560120,12.51780033,1463 +DL/CG-097,Gruendberg,,47.72529984,12.56110001,1225 +DL/CG-098,Wendelberg,,47.67499924,12.77390003,959 +DL/CG-099,Sondersberg,,47.65190125,12.55720043,1242 +DL/CG-100,Dandlberg,,47.76639938,12.17689991,910 +DL/CG-101,Sattelberg,,47.75139999,12.16969967,820 +DL/CG-102,Teisenbergkopf,,47.80580139,12.76830006,1327 +DL/CG-103,Falkenstein,,47.74689865,12.75720024,1181 +DL/CG-104,Kienbergl,,47.74639893,12.74170017,1135 +DL/CG-105,Auer Berg,,47.75920105,12.70030022,903 +DL/CG-106,Zeller Berg,,47.76499939,12.67029953,1065 +DL/CG-107,Ullrichshoegl,,47.80810165,12.89970016,827 +DL/CG-108,Hirscheck,,47.68220139,12.68389988,1895 +DL/CG-109,Steilenberg,,47.71630096,12.43449974,1200 +DL/CG-110,Walmberg,,47.68370056,12.49409962,1062 +DL/CG-111,Muehlprachkopf,,47.66920090,12.52589989,1332 +DL/CG-112,Stuhlkopf,,47.68809891,12.54290009,1264 +DL/CG-113,Sauruesselkopf ,,47.69689941,12.64929962,1270 +DL/CG-114,Sessseekopf,,47.71620178,12.71420002,1153 +DL/CG-115,Gamersberg,,47.67710114,12.75220013,1035 +DL/CG-116,Mehrentaler Wand,,47.77209854,12.52340031,1309 +DL/CG-117,Gleichenberg,,47.77690125,12.57180023,1156 +DL/CG-118,Scheichenberg,,47.77740097,12.59860039,1243 +DL/CG-119,Haargassberg,,47.77379990,12.62139988,1210 +DL/CG-120,Grosswald,,47.78499985,12.81760025,1073 +DL/EW-001,Wank,,47.50749969,11.14500046,1780 +DL/EW-002,Hoher Fricken,,47.53189850,11.15390015,1940 +DL/EW-003,Bischof,,47.54029846,11.17560005,2033 +DL/EW-004,Henneneck,,47.5458,11.1747,1964 +DL/EW-005,Kareck,,47.5481,11.1797,2046 +DL/EW-006,Oberer Risskopf,,47.54859924,11.18579960,2049 +DL/EW-007,Krottenkopf,,47.54420090,11.19139957,2086 +DL/EW-008,Schindlerskopf,,47.5544,11.1911,1940 +DL/EW-009,Archtalkopf,,47.5575,11.1942,1927 +DL/EW-010,Hohe Kisten,,47.56110001,11.20810032,1922 +DL/EW-011,Zwoelferkoepfl,,47.5717,11.2133,1641 +DL/EW-012,Platteneck,,47.5572,11.2267,1804 +DL/EW-013,Klaffen,,47.54610062,11.21560001,1829 +DL/EW-014,Wallgauer Eck,,47.5464,11.2289,1769 +DL/EW-015,Simetsberg,,47.56639862,11.25469971,1836 +DL/EW-016,Osterfeuerspoitze,,47.6028,11.2150,1365 +DL/EW-017,Hirschberg,,47.60079956,11.24139977,1659 +DL/EW-018,Rauheck,,47.6136,11.2625,1590 +DL/EW-019,Roetelstein,,47.63109970,11.28470039,1400 +DL/EW-020,Rotwandkopf,,47.60359955,11.28110027,1518 +DL/EW-021,Heimgarten,,47.61280060,11.28059959,1790 +DL/EW-022,Herzogstand,,47.61330032,11.30860043,1731 +DL/EW-023,Fahrenbergkopf,,47.6064,11.3142,1627 +DL/EW-024,Martinskopf,,47.6092,11.3078,1674 +DL/EW-025,Jochberg,,47.6258,11.3717,1565 +DL/EW-026,Sonnenspitze,,47.6369,11.3772,1271 +DL/EW-027,Alpenkopf,,47.6253,11.2811,1384 +DL/EW-028,Elferkoepfl,,47.5728,11.2194,1412 +DL/EW-029,Niederer Fricken,,47.5386,11.1564,1682 +DL/EW-030,Griessberg,,47.5886,11.2739,1405 +DL/EW-031,Griesskopf,,47.6108,11.2581,1452 +DL/EW-032,Grosser Illing,,47.6242,11.2631,1313 +DL/EW-033,Hinterer Kopf,,47.5669,11.2139,1501 +DL/EW-034,Kauserberg,,47.6256,11.2814,1384 +DL/EW-035,Kesselkoepfe,,47.5569,11.2406,1594 +DL/EW-036,Kirchelwand,,47.6058,11.3267,1155 +DL/EW-037,Krepelschrofen,,47.5264,11.2772,1160 +DL/EW-038,Kreuzturm,,47.5714,11.2050,1349 +DL/EW-039,Mitterberg,,47.5322,11.2683,1230 +DL/EW-040,Mitterkopf,,47.5147,11.1942,1529 +DL/EW-041,Neuglaugerkopf,,47.5522,11.2589,1491 +DL/EW-042,Ochsenberg,,47.5236,11.1486,1694 +DL/EW-043,Ohlstaudter Teilberg,,47.6081,11.2644,1457 +DL/EW-044,oelrain,,47.6069,11.2422,1542 +DL/EW-045,Rauchkopf,,47.6114,11.3200,1426 +DL/EW-046,Rauchkoepfl,,47.6186,11.2844,1508 +DL/EW-047,Rauteck,,47.6289,11.2992,1096 +DL/EW-048,Rauteckkopf,,47.6189,11.2992,1509 +DL/EW-049,Rotenkopf,,47.51079941,11.18360043,1685 +DL/EW-050,Schindlerskopf,,47.5547,11.1917,1940 +DL/EW-051,Simmersberg,,47.6364,11.2661,1052 +DL/EW-052,Teufelskapelle,,47.5664,11.1819,1069 +DL/EW-053,Unterrauheck,,47.5306,11.2061,1533 +DL/EW-054,Zundereck,,47.5692,11.1936,1478 +DL/EW-055,Zunderkopf 1,,47.5678,11.1939,1506 +DL/EW-056,Zunderkopf 2,,47.5164,11.1831,1611 +DL/EW-057,Bletschertalkopf,,47.50419998,11.21669960,1360 +DL/EW-058,Sattmannsberg,,47.59000015,11.25240040,1204 +DL/EW-059,Der Stein,,47.63359833,11.32559967,922 +DL/EW-060,Koenigsbergwald ,,47.71139908,11.31070042,833 +DL/KW-001,Brunnsteinspitze,,47.4056,11.2872,2180 +DL/KW-002,Rotwandlspitze,,47.4069,11.2892,2190 +DL/KW-003,Kirchlespitze,,47.4156,11.2928,2302 +DL/KW-004,Sulzleklammspitze,,47.41809845,11.29220009,2319 +DL/KW-005,Suedl. Linderspitze,,47.4222,11.2903,2305 +DL/KW-006,Noerdl. Linderspitze,,47.4281,11.2931,2374 +DL/KW-007,Gerberkreuz,,47.4269,11.2869,2303 +DL/KW-008,Westl. Karwendelspitze,,47.43000031,11.29889965,2385 +DL/KW-009,Karwendelkoepfe,,47.4358,11.2972,2365 +DL/KW-010,Viererspitze,,47.4381,11.2950,2053 +DL/KW-011,Kreuzwand,,47.4369,11.3014,2132 +DL/KW-012,Drei Kirchln,,47.4300,11.3058,2245 +DL/KW-013,Larchetfleckspitze,,47.43059921,11.31330013,2363 +DL/KW-014,Tiefkarspitze,,47.43780136,11.32079983,2431 +DL/KW-015,Grosskarspitzen,,47.4472,11.3344,2426 +DL/KW-016,Woerner,,47.44969940,11.33810043,2476 +DL/KW-017,Hochkarspitze,,47.44749832,11.35029984,2484 +DL/KW-018,Raffelspitze,,47.44499969,11.36470032,2324 +DL/KW-019,Baeralpkopf,,47.4469,11.3903,2337 +DL/KW-020,Schlichtenkarspitze,,47.4469,11.4044,2477 +DL/KW-021,Vogelkarspitze,,47.44670105,11.41110039,2524 +DL/KW-022,Oestl. Karwendelspitze,,47.44469833,11.42140007,2537 +DL/KW-023,Steinkarspitze,,47.45470047,11.41329956,2019 +DL/KW-024,Schoettelkarspitze,,47.49390030,11.32970047,2050 +DL/KW-025,Feldernkreuz,,47.4914,11.3294,2048 +DL/KW-026,Feldernkopf,,47.4836,11.3358,2071 +DL/KW-027,Soiernschneid,,47.4817,11.3411,2174 +DL/KW-028,Reissende Lahnspitze,,47.4803,11.3444,2209 +DL/KW-029,Soiernspitze,,47.48139954,11.35690022,2259 +DL/KW-030,Krapfenkarspitze,,47.49280167,11.37080002,2110 +DL/KW-031,Dreierspitze,,47.4969,11.3811,1953 +DL/KW-032,Baierkarspitze,,47.5025,11.3861,1909 +DL/KW-033,Fermerskopf,,47.4886,11.3800,1850 +DL/KW-034,Galgenstangenkopf,,47.5119,11.4036,1805 +DL/KW-035,Schafreiter,,47.50889969,11.48750019,2101 +DL/KW-036,Stierjoch,,47.51079941,11.51860046,1908 +DL/KW-037,Laerchkogel,,47.51419830,11.56190014,1688 +DL/KW-038,Demeljoch,,47.54610062,11.58580017,1923 +DL/KW-039,Westl.Torjoch,,47.5064,11.5028,1833 +DL/KW-040,Oestl.Torjoch,,47.5100,11.5411,1818 +DL/KW-041,Hoher Grasberg,,47.52190018,11.35610008,1783 +DL/KW-042,Pfetterkopf,,47.53390121,11.38720036,1546 +DL/KW-043,Kotzen,,47.53030014,11.51939964,1766 +DL/KW-044,Graskoepfel,,47.53689957,11.47169971,1753 +DL/KW-045,Rosskopf,,47.55479813,11.52390003,1131 +DL/KW-046,Jaegerbergl,,47.57820129,11.55879974,988 +DL/MF-001,Geigerstein,,47.68030167,11.62080002,1491 +DL/MF-002,Muehltahleck,,47.6556,11.6600,1518 +DL/MF-003,Reitstein,,47.58560181,11.67749977,1518 +DL/MF-004,Silberkopf,,47.6553,11.7006,1540 +DL/MF-005,Daffenstein,,47.6428,11.7803,1538 +DL/MF-006,Fockenstein,,47.68420029,11.65170002,1564 +DL/MF-007,Brandkopf,,47.6561,11.6528,1569 +DL/MF-008,Sonnberg,,47.6292,11.6747,1572 +DL/MF-009,Rieselsberg,,47.5944,11.8497,1574 +DL/MF-010,Hochplatte,,47.64080048,11.66720009,1592 +DL/MF-011,Seekarkreuz,,47.65219879,11.64309978,1601 +DL/MF-012,Spitzkamp,,47.6589,11.6544,1603 +DL/MF-013,Auerkamp,,47.66109848,11.65970039,1607 +DL/MF-014,Ochsenkamp,,47.6661,11.6661,1594 +DL/MF-015,Schildenstein,,47.5953,11.7247,1613 +DL/MF-016,Platteneck,,47.59170151,11.71170044,1617 +DL/MF-017,Pfaffenkopf,,47.61420059,11.85169983,1620 +DL/MF-018,Schoenberg,,47.63859940,11.64169979,1620 +DL/MF-019,Lahnerkopf,,47.6381,11.8233,1628 +DL/MF-020,Grubereck,,47.6394,11.7853,1671 +DL/MF-021,Hirschberg,,47.66059875,11.69610023,1670 +DL/MF-022,Rotkogel,,47.6092,11.8550,1687 +DL/MF-023,Rossstein,,47.6339,11.6761,1698 +DL/MF-024,Buchstein,,47.63389969,11.68080044,1701 +DL/MF-025,Setzberg,,47.65169907,11.78330040,1712 +DL/MF-026,Wallberg,,47.66579819,11.79669952,1722 +DL/MF-027,Blankenstein,,47.6408,11.8028,1768 +DL/MF-028,Blaubergkopf,,47.5900,11.7672,1787 +DL/MF-029,Schinder,,47.60169983,11.86110020,1808 +DL/MF-030,Risserkogel,,47.63719940,11.80360031,1826 +DL/MF-031,Halserspitz,,47.59140015,11.78079987,1862 +DL/MF-032,Riederstein,,47.7042,11.7939,1207 +DL/MF-033,Grindelalmschneid,,47.72330093,11.79500008,1334 +DL/MF-034,Baumgartenschneid,,47.70220184,11.80920029,1449 +DL/MF-035,Rainerkopf,,47.6856,11.8422,1464 +DL/MF-036,Stuempfling,,47.6622,11.8561,1506 +DL/MF-037,Wasserspitz,,47.6800,11.8353,1552 +DL/MF-038,Rotkopf,,47.64860153,11.86610031,1602 +DL/MF-039,Stolzenberg,,47.64250183,11.87220001,1603 +DL/MF-040,Rinnerspitz,,47.6744,11.8342,1611 +DL/MF-041,Bodenschneid,,47.67169952,11.83810043,1669 +DL/MF-042,Brecherspitz,,47.67639923,11.87080002,1683 +DL/MF-043,Steilenberg,,47.6603,11.9583,1503 +DL/MF-044,Seebergkopf,,47.66439819,11.99779987,1538 +DL/MF-045,Nagelspitz,,47.6847,11.9081,1554 +DL/MF-046,Kreuzbergspitzl,,47.6178,11.9353,1567 +DL/MF-047,Heissenplatte,,47.6831,11.9306,1583 +DL/MF-048,Auerberg,,47.6369,11.9461,1666 +DL/MF-049,Maroldschneid,,47.6436,11.9667,1688 +DL/MF-050,Rauhkopf,,47.66389847,11.92080021,1689 +DL/MF-051,Taubenstein,,47.6586,11.9208,1692 +DL/MF-052,Benzingspitz,,47.6731,11.9119,1736 +DL/MF-053,Jaegerkamp,,47.67330170,11.90579987,1746 +DL/MF-054,Aiplspitz,,47.67309952,11.92360020,1759 +DL/MF-055,Ruchenkoepfe,,47.6486,11.9486,1805 +DL/MF-056,Auerspitz,,47.64360046,11.94470024,1811 +DL/MF-057,Hochmiesing,,47.65779877,11.93970013,1883 +DL/MF-058,Rotwand,,47.65000153,11.93470001,1884 +DL/MF-059,Mitterberg,,47.68939972,12.12189960,1214 +DL/MF-060,Eibelkopf,,47.7275,11.9917,1312 +DL/MF-061,Grosser Riesenkopf,,47.70830154,12.10690022,1337 +DL/MF-062,Rehleitenkopf,,47.70249939,12.10359955,1338 +DL/MF-063,Sudelfeldkopf,,47.6650,12.0428,1436 +DL/MF-064,Schweinsberg,,47.7131,11.9875,1511 +DL/MF-065,Kirchelwand,,47.7136,12.0167,1521 +DL/MF-066,Bruennsteinschanze,,47.6517,12.0814,1547 +DL/MF-067,Vogelsang,,47.6619,12.0339,1563 +DL/MF-068,Rotwandlspitz,,47.64860153,12.08250046,1588 +DL/MF-069,Jaegerwand,,47.6508,12.0461,1603 +DL/MF-070,Breitenstein,,47.72109985,11.98719978,1622 +DL/MF-071,Bruennstein,,47.64830017,12.09309959,1634 +DL/MF-072,Hochsalwand,,47.7167,12.0356,1624 +DL/MF-073,Lechnerkopf,,47.71829987,12.03670025,1647 +DL/MF-074,Trainsjoch,,47.61529922,12.05420017,1707 +DL/MF-075,Wildalpjoch,,47.70140076,12.03530025,1720 +DL/MF-076,Kl. Traithen,,47.6547,12.0358,1722 +DL/MF-077,Steilner Joch,,47.6456,12.0544,1747 +DL/MF-078,Unterbergerjoch,,47.6439,12.0439,1829 +DL/MF-079,Wendelstein,,47.70360184,12.01389980,1838 +DL/MF-080,Gr. Traithen,,47.64670181,12.03750038,1852 +DL/MF-081,Semmelberg,,47.7125,11.6956,1102 +DL/MF-082,Schwarzer Berg,,47.82809830,11.75000000,896 +DL/MF-083,Fentberg,,47.8439,11.7886,807 +DL/MF-084,Wattenburger Kogel,,47.7456,11.7975,938 +DL/MF-085,Rainerberg,,47.7331,11.8253,1169 +DL/MF-086,Stadlberg,,47.7678,11.8544,924 +DL/MF-087,Buchbichl,,47.7619,11.9036,824 +DL/MF-088,Irschenberg,,47.8311,11.9200,743 +DL/MF-089,Hocheck,,47.7725,11.9772,899 +DL/MF-090,Schwarzenberg,,47.75419998,11.96580029,1188 +DL/MF-091,Sulzberg,,47.74530029,12.06359959,1117 +DL/MF-092,Kreuzbergkoepfel,,47.71139908,11.81110001,1273 +DL/MF-093,Schliersberg,,47.74280167,11.88860035,1264 +DL/MF-094,Rechelkopf,,47.72219849,11.62469959,1330 +DL/MF-095,Luckenkopf,,47.71469879,11.66469955,1370 +DL/MF-096,Keilkopf,,47.69530106,11.60249996,1125 +DL/MF-097,Schweinberg,,47.69689941,11.62220001,1278 +DL/MF-098,Sattelkopf,,47.69419861,11.67220020,1384 +DL/MF-099,Huder,,47.69969940,11.67329979,1403 +DL/MF-100,Wildbarren,,47.68109894,12.13829994,1448 +DL/MF-101,Hoher Gernbergkopf,,47.61439896,11.72669983,1226 +DL/MF-102,Sauruesselkopf,,47.62279892,11.65110016,1364 +DL/MF-103,Gerstenrieder Kopf,,47.60889816,11.60359955,1421 +DL/MF-104,Filzenkogel,,47.64580154,11.71280003,1444 +DL/MF-105,Leonhardstein,,47.63809967,11.71560001,1452 +DL/MF-106,Grueneck,,47.63249969,11.72309971,1395 +DL/MF-107,Duempfel,,47.69189835,12.06779957,1354 +DL/MF-108,Schortenkopf,,47.70109940,12.06330013,1322 +DL/MF-109,Hirschgeroehrkopf,,47.71390152,11.88939953,1272 +DL/MF-110,Breitenberg,,47.72439957,11.90060043,1210 +DL/MF-111,Schwarzenkopf,,47.65810013,11.90060043,1464 +DL/MF-112,Westerberg,,47.70280075,11.84860039,1333 +DL/MF-113,Sterneck,,47.74280167,11.99580002,1240 +DL/MF-114,Farrenpoint,,47.74309921,12.03890038,1273 +DL/MF-115,Nusslberg,,47.62639999,12.16329956,882 +DL/MF-116,Muehlbacherberg,,47.63890076,12.15579987,892 +DL/MF-117,Schwarzenberg,,47.64170074,12.13609982,1208 +DL/MF-118,Heidwand,,47.71530151,12.01889992,1585 +DL/MF-119,Langeckberg,,47.59889984,11.81359959,1419 +DL/MF-120,Achselkopf,,47.58959961,11.61660004,1190 +DL/MF-121,Breitenkopf,,47.61780167,11.63300037,1347 +DL/WS-001,Zugspitze,,47.42110062,10.98610020,2962 +DL/WS-003,Schneefernerkopf,,47.40940094,10.97000027,2875 +DL/WS-006,Plattspitzen,,47.39580154,10.98779964,2680 +DL/WS-011,Riffelspitzen,,47.43719864,11.00440025,2262 +DL/WS-012,Schoenangerspitze,,47.44219971,11.01249981,2264 +DL/WS-013,Grosser Waxenstein,,47.44609833,11.02330017,2277 +DL/WS-016,Innere Hoellentalspitze,,47.41830063,11.01060009,2741 +DL/WS-017,Mittlere Hoellentalspitze,,47.42029953,11.01939964,2743 +DL/WS-020,Hochblassen,,47.42309952,11.04249954,2707 +DL/WS-021,Hoher Gaif,,47.42219925,11.06330013,2288 +DL/WS-022,Alpspitze,,47.42940140,11.04780006,2629 +DL/WS-024,Hochwanner,,47.39580154,11.05500031,2744 +DL/WS-025,Hinterreintalschrofen,,47.39609909,11.07579994,2670 +DL/WS-026,Oberreintalschrofen,,47.39559937,11.10389996,2440 +DL/WS-027,Scharnitzspitze,,47.39559937,11.11190033,2463 +DL/WS-029,Leutascher Dreitorspitze,,47.40029907,11.12419987,2673 +DL/WS-031,Musterstein,,47.41389847,11.14029980,2476 +DL/WS-032,Wettersteinwand,,47.42219925,11.16639996,2482 +DL/WS-036,Grosse Arnspitze,,47.39720154,11.22249985,2196 +DL/WS-037,Kreuzjoch,,47.45190048,11.07830048,1719 +DL/WS-052,Gruenkopf,,47.43080139,11.22060013,1588 +DL/WS-058,Hoher Kranzberg,,47.45140076,11.22889996,1391 +DL/WS-088,Stellwagelskopf,,47.45669937,11.15530014,1288 +DL/WS-096,Zirbelkopf,,47.43220139,11.17780018,1989 +DL/WS-101,Wamberg,,47.47420120,11.16919994,1304 + + +DM/BM-001,Bogenberg,,48.90194444,12.84916667,432 +DM/BM-002,Proeller,,49.02190018,12.82110023,1048 +DM/BM-002,Proeller,,49.02194444,12.82111111,1048 +DM/BM-003,Predigtstuhl,,49.00222222,12.84916667,1024 +DM/BM-004,Knogl,,48.99638889,12.85777778,1051 +DM/BM-005,Schopf,,48.95472222,12.84305556,925 +DM/BM-006,Hirschenstein,,48.96440125,12.87940025,1095 +DM/BM-006,Hirschenstein,,48.96444444,12.87944444,1095 +DM/BM-007,Klausenstein,,48.95027778,12.89666667,1048 +DM/BM-008,Rauher Kulm,,48.94416667,12.90194444,1002 +DM/BM-009,Burgstein,,48.93361111,12.90555556,833 +DM/BM-010,Vogelsang,,48.93416667,12.94333333,1022 +DM/BM-011,Buechelstein,,48.80805556,13.17527778,827 +DM/BM-012,Brotjacklriegel,,48.81689835,13.21669960,1011 +DM/BM-013,Gallnerberg,,49.04719925,12.67440033,697 +DM/BM-014,Hirschpertberg,,49.13444444,12.81416667,647 +DM/BM-015,Maiberg,,49.09666667,12.62777778,589 +DM/BM-016,Geisskopf,,48.92361111,13.03750000,1097 +DM/BM-017,Breitenauriegel,,48.90638889,13.02972222,1116 +DM/BM-018,Ulrichsberg,,48.87083333,12.98194444,636 +DM/BM-019,Butzen,,48.90610123,12.94750023,775 +DM/BM-020,Diebstein,,48.76083333,13.33583333,590 +DM/BM-021,Koenig-Max-Hoehe,,48.58527778,13.55611111,521 +DM/BM-022,Luessen,,48.57249832,13.78419971,733 +DM/BM-023,Burgstall,,49.24916667,12.89083333,976 +DM/BM-024,Ahornriegel,,49.23472222,12.94361111,1050 +DM/BM-025,Lange Hoehe,,49.23222222,12.95611111,878 +DM/BM-026,Kagerstein,,49.23527778,12.96888889,793 +DM/BM-027,Kleiner Osser,,49.20138889,13.10277778,1266 +DM/BM-028,Grosser Osser,,49.20277778,13.10972222,1293 +DM/BM-029,Oberer Kuehberg,,49.20027778,13.02666667,654 +DM/BM-030,Rossberghuette,,49.18080139,12.77309990,664 +DM/BM-031,Weisser Felsen,,49.16944444,12.78777778,562 +DM/BM-032,Plattenstein,,49.17666667,12.91111111,788 +DM/BM-033,Kreuzfelsen,,49.17638889,12.92250000,999 +DM/BM-034,Mittagstein,,49.17361111,12.94138889,1034 +DM/BM-035,Steinbuehler Gesenke,,49.17250000,12.95472222,1044 +DM/BM-036,Grosser Riedelstein,,49.16579819,12.97309971,1132 +DM/BM-037,Kleiner Riedelstein,,49.16083333,12.97500000,1042 +DM/BM-038,Stierwald,,49.16000000,12.98361111,915 +DM/BM-039,Kuehberg,,49.13916667,13.02527778,830 +DM/BM-040,Muehlriegel,,49.15666667,13.01527778,1080 +DM/BM-041,Fahrenberg,,49.22972222,13.03861111,893 +DM/BM-042,Enzian,,49.12361111,13.08305556,1287 +DM/BM-043,Bischofshaube,,49.05694444,13.12416667,940 +DM/BM-044,Brandtner Riegel,,49.05583333,13.13500000,930 +DM/BM-045,Hochzellberg,,49.07777778,13.13388889,1208 +DM/BM-046,Kleiner Arber,,49.11305556,13.11027778,1384 +DM/BM-047,Grosser Arber,,49.11249924,13.13580036,1453 +DM/BM-048,Hahnenriegel,,49.06500000,13.16222222,1108 +DM/BM-049,Rote Hoehe,,49.05944444,13.17833333,1049 +DM/BM-050,Wagnerspitze,,49.13777778,13.14666667,1124 +DM/BM-051,Hennenkobel,,49.04500000,13.18166667,974 +DM/BM-052,Gesengetstein,,48.93250000,13.25777778,951 +DM/BM-053,Grosser Falkenstein,,49.08440018,13.27970028,1312 +DM/BM-054,Ruckwiesberg,,49.09472222,13.28250000,1269 +DM/BM-055,Schwarzbachriegel,,49.07833333,13.28722222,1145 +DM/BM-056,Sulzriegel,,49.06940079,13.23939991,782 +DM/BM-057,Hessenstein,,48.91472222,13.30416667,877 +DM/BM-058,Hoher Sachsen,,48.86166667,13.37166667,752 +DM/BM-059,Frauenberg,,48.84469986,13.38059998,723 +DM/BM-060,Kaltenberg,,48.79944444,13.47944444,633 +DM/BM-061,Saussberg,,48.70444444,13.60611111,793 +DM/BM-062,Steinberg,,48.68222222,13.58750000,830 +DM/BM-063,Almberg,,48.88888889,13.64250000,1139 +DM/BM-064,Staffelberg,,48.65110016,13.65079975,789 +DM/BM-065,Haidel,,48.81859970,13.67809963,1156 +DM/BM-066,Hochstein,,48.78444444,13.80277778,1333 +DM/BM-067,Habergrasberg,,48.78500000,13.78861111,1235 +DM/BM-068,Bayerischer Ploeckenstein,,48.77194444,13.82722222,1365 +DM/BM-069,Dieberg,,49.32666667,12.86888889,639 +DM/BM-070,Dachsriegel,,49.31805556,12.78888889,826 +DM/BM-071,Gibacht,,49.33333333,12.78055556,930 +DM/BM-072,Hoher Stein,,49.34472222,12.72777778,824 +DM/BM-073,Klammerfels,,49.34472222,12.73583333,848 +DM/BM-074,Zwirenzel,,49.34111111,12.68472222,701 +DM/BM-075,Galgenberg,,49.39833333,12.72722222,742 +DM/BM-076,Bleschenberg,,49.33222222,12.65555556,596 +DM/BM-077,Guettenberg,,49.38138889,12.54333333,546 +DM/BM-078,Schlossberg,,49.35416667,12.49027778,706 +DM/BM-078,Schlossberg,,49.35419846,12.49030018,706 +DM/BM-079,Kirchenbuehl,,49.29500000,12.66111111,651 +DM/BM-080,Riedbuehl,,49.28472222,12.54138889,591 +DM/BM-081,Kuernberg,,49.27361111,12.54527778,571 +DM/BM-082,Sattelberg,,49.26472222,12.54861111,586 +DM/BM-083,Traubenberg,,49.21166667,12.55833333,519 +DM/BM-084,Alter Thanstein,,49.38166667,12.44416667,635 +DM/BM-085,Platte,,49.39000000,12.42777778,616 +DM/BM-086,Pfieferlberg,,49.33722222,12.36611111,491 +DM/BM-087,Signalberg,,49.46360016,12.53750038,888 +DM/BM-088,Eulenberg,,49.54194444,12.59083333,818 +DM/BM-089,Stueckstein,,49.54055556,12.52583333,809 +DM/BM-090,Wildenstein,,49.52083333,12.40805556,736 +DM/BM-091,Reichenstein,,49.51444444,12.62083333,874 +DM/BM-092,Ebene,,49.52416667,12.63277778,894 +DM/BM-092,Ebene,,49.52420044,12.63280010,894 +DM/BM-093,Fischerberg,,49.67361111,12.22388889,636 +DM/BM-094,Schellenberg,,49.73222222,12.39888889,809 +DM/BM-095,Pfaffenbuehl,,49.91138889,12.53750000,692 +DM/BM-096,Poppenreuther Berg,,49.90527778,12.49694444,781 +DM/BM-097,Kapellberg,,49.62444444,10.24888889,456 +DM/BM-098,Bullenheimer Berg,,49.61944444,10.25250000,455 +DM/BM-099,Scheinberg,,49.61416667,10.28722222,499 +DM/BM-099,Scheinberg,,49.61420059,10.28719997,499 +DM/BM-100,Hoher Landsberg,,49.59472222,10.29777778,498 +DM/BM-101,Schneckenberg,,49.62250000,10.28166667,438 +DM/BM-102,Schwanberg,,49.72249985,10.27439976,474 +DM/BM-102,Schwanberg,,49.72250000,10.27444444,474 +DM/BM-103,Schoenberg,,49.77611111,10.41333333,463 +DM/BM-104,Katzenberg,,49.81972222,10.44583333,475 +DM/BM-105,Iffigheimer Berg,,49.62138889,10.31722222,482 +DM/BM-106,Schlossberg,,49.69833333,10.32250000,487 +DM/BM-107,Kalbberg,,49.70305556,10.29361111,412 +DM/BM-108,Zabelstein,,49.94805556,10.44583333,475 +DM/BM-109,Knetzberg,,49.95944444,10.51694444,487 +DM/BM-110,Hirschberg,,49.84416667,10.63083333,403 +DM/BM-111,Schmerber Berg,,49.85388889,10.50944444,425 +DM/BM-112,Stollberg,,49.87472222,10.42833333,443 +DM/BM-113,Vollberg,,49.90388889,10.45166667,457 +DM/BM-114,Schellenberg,,49.81027778,10.81722222,325 +DM/BM-115,Ebersberg,,49.96472222,10.57861111,450 +DM/BM-116,Zeilberg,,50.19580078,10.67920017,463 +DM/BM-117,Hoehberg,,50.26722222,10.42388889,450 +DM/BM-118,Ochsenhuegel,,50.25638889,10.43694444,473 +DM/BM-119,Rosenberg,,50.24972222,10.44305556,476 +DM/BM-120,Grosser Breitenberg,,50.23805556,10.43944444,497 +DM/BM-121,Laubhuegel,,50.22222222,10.41888889,504 +DM/BM-122,Lussberg,,50.01689911,10.75969982,460 +DM/BM-122,Lussberg,,50.01694444,10.75972222,460 +DM/BM-123,Stiefenberg,,49.98750000,10.80583333,388 +DM/BM-124,Eichelberg,,50.07055556,10.78083333,388 +DM/BM-125,Tonberg,,50.05222222,10.73305556,458 +DM/BM-126,Stachel,,50.06500000,10.70416667,462 +DM/BM-127,Huehnerberg,,50.07833333,10.71944444,440 +DM/BM-128,Eichelberg,,50.12722222,10.64777778,427 +DM/BM-129,Schrottenberg,,50.16583333,10.66944444,385 +DM/BM-130,Buechelberg,,50.16500000,10.61833333,467 +DM/BM-131,Roter Buehl,,50.06805556,10.68722222,445 +DM/BM-132,Haubeberg,,50.10888889,10.73611111,431 +DM/BM-133,Bramberg,,50.10805556,10.63472222,494 +DM/BM-134,Kleiner Hassberg,,50.23500000,10.50833333,426 +DM/BM-135,Hesselberg,,49.06610107,10.53439999,689 +DM/BM-136,Schloessleinsbuck,,49.06805556,10.55777778,562 +DM/BM-137,Wachtlerberg,,49.03833333,10.67638889,587 +DM/BM-138,Muehlberg,,49.20194444,10.26722222,527 +DM/BM-139,Hundsberg,,49.22972222,10.40861111,509 +DM/BM-140,Buechelberg,,49.27750000,10.39305556,492 +DM/BM-141,Schwander Berg,,49.28805556,10.32527778,504 +DM/BM-142,Moenchsberg,,49.19500000,10.76388889,529 +DM/BM-143,Reinhardsberg,,49.32000000,10.18472222,438 +DM/BM-144,Schaefersberg,,49.36083333,10.26388889,496 +DM/BM-145,Eichelberg,,49.13861111,10.62111111,522 +DM/BM-146,Teufelshaeusel,,49.44111111,10.30305556,486 +DM/BM-147,Petersberg,,49.43666667,10.38055556,504 +DM/BM-148,Eberleinsberg,,49.17111111,10.49277778,485 +DM/BM-149,Deutscher Buehl,,49.39083333,10.42472222,526 +DM/BM-150,Kohlberg,,50.04194444,12.18666667,627 +DM/BM-151,Nusshart,,50.04083333,11.86444444,972 +DM/BM-152,Wartberg,,50.06111111,12.11861111,626 +DM/BM-153,Grosser Kornberg,,50.18249893,12.02029991,826 +DM/BM-153,Grosser Kornberg,,50.18250000,12.02027778,826 +DM/BM-154,Koesseine,,49.98749924,11.97970009,945 +DM/BM-155,Burgstein,,49.99833333,11.99361111,879 +DM/BM-156,Haberstein,,50.00111111,11.98472222,820 +DM/BM-157,Hohe Matze,,49.99805556,11.93166667,813 +DM/BM-158,Platte,,50.01861111,11.89138889,884 +DM/BM-159,Seehuegel,,50.03250000,11.87666667,953 +DM/BM-160,Ochsenkopf,,50.03079987,11.80939960,1024 +DM/BM-161,Schneeberg,,50.05220032,11.85389996,1051 +DM/BM-162,Hohe Heide,,50.07027778,11.80500000,848 +DM/BM-163,Rudolfstein,,50.07194444,11.87666667,866 +DM/BM-164,Drei Brueder,,50.06916667,11.87250000,834 +DM/BM-165,Waldstein,,50.12916667,11.85250000,879 +DM/BM-166,Buchberg,,50.11472222,11.93583333,674 +DM/BM-167,Epprechtstein,,50.14527778,11.91750000,776 +DM/BM-168,Hohe Warte,,50.04750000,11.66638889,547 +DM/BM-169,Saubadfelsen,,49.89222222,12.03694444,858 +DM/BM-170,Reiseneggerfelsen,,49.90000000,12.02722222,845 +DM/BM-171,Schramberg,,49.89083333,12.01000000,708 +DM/BM-172,Knockfelsen,,49.91194444,12.03611111,834 +DM/BM-173,Katzentroegel,,49.91222222,12.04750000,880 +DM/BM-174,Platte,,49.90969849,12.05280018,946 +DM/BM-174,Platte,,49.90972222,12.05277778,946 +DM/BM-175,Hackelstein,,49.91944444,12.11972222,723 +DM/BM-176,Ploessberg,,49.92305556,12.10027778,820 +DM/BM-177,Mascherberg,,49.95777778,12.05944444,631 +DM/BM-178,Guegl,,49.95166667,11.06166667,510 +DM/BM-179,Giechburg,,49.95500000,11.05083333,530 +DM/BM-180,Platte,,49.81500000,11.44583333,614 +DM/BM-181,Warenberg,,49.78361111,11.50055556,608 +DM/BM-182,Hohensteiner Berg,,49.58666667,11.42222222,624 +DM/BM-183,Hohe Leite,,49.80444444,11.40305556,561 +DM/BM-184,Neubuerg,,49.89083333,11.40250000,587 +DM/BM-185,Plankenstein,,49.89333333,11.34500000,482 +DM/BM-186,Heidelberg,,49.72833333,11.25666667,548 +DM/BM-187,Kohlberg,,49.72583333,11.28250000,582 +DM/BM-188,Zuckerhut,,49.78777778,11.21361111,515 +DM/BM-189,Wallerwarte,,49.77750000,11.20027778,498 +DM/BM-190,Kreuzberg,,49.77361111,11.19944444,498 +DM/BM-191,Pfaffenstein,,49.77916667,11.31555556,524 +DM/BM-192,Neideck,,49.80888889,11.23194444,399 +DM/BM-193,Hummerstein,,49.80444444,11.20388889,472 +DM/BM-194,Druidenstein,,49.79444444,11.18861111,498 +DM/BM-195,Rodenstein,,49.71360016,11.15779972,532 +DM/BM-195,Rodenstein,,49.71361111,11.15777778,532 +DM/BM-196,Walberla,,49.71972222,11.15138889,514 +DM/BM-197,Schwedenfelsen,,49.86972222,11.14305556,524 +DM/BM-198,Seigelstein,,49.88305556,11.10388889,548 +DM/BM-199,Heroldsstein,,49.90027778,11.14361111,516 +DM/BM-200,Greifenstein,,49.87416667,11.17250000,499 +DM/BM-201,Retterner Kanzel,,49.75416667,11.10944444,507 +DM/BM-202,Friesener Warte,,49.84583333,11.04638889,562 +DM/BM-203,Hohe Reut,,49.63527778,11.41083333,635 +DM/BM-204,Langer Berg,,49.67638889,11.37833333,612 +DM/BM-205,Schlossberg,,49.70833333,11.37055556,590 +DM/BM-206,Rothenberg,,49.55388889,11.35833333,559 +DM/BM-207,Glatzenstein,,49.54416667,11.37388889,572 +DM/BM-208,Schossberg,,49.55333333,11.55722222,534 +DM/BM-209,Koppe,,49.53972222,11.48138889,572 +DM/BM-210,Moritzberg,,49.46720123,11.31140041,603 +DM/BM-211,Arzberg,,49.47972222,11.44027778,612 +DM/BM-212,Dietrichstein,,49.34166667,11.59472222,627 +DM/BM-213,Bromberg,,49.30972222,11.71638889,589 +DM/BM-214,Schlossberg,,49.29083333,11.79388889,513 +DM/BM-215,Hauberg,,49.28055556,11.80861111,518 +DM/BM-216,Moeningerberg,,49.23111111,11.31972222,527 +DM/BM-217,Buchberg,,49.24079895,11.43080044,591 +DM/BM-218,Muenchshofener Berg,,49.24720001,12.07139969,533 +DM/BM-219,Mayersberg,,49.21805556,11.75611111,629 +DM/BM-220,Haag,,49.19138889,11.66333333,611 +DM/BM-221,Roeschberg,,49.14805556,11.36361111,564 +DM/BM-222,Kalvariberg,,49.36083333,11.67416667,586 +DM/BM-223,Laemmerberg,,49.10500000,11.29361111,525 +DM/BM-224,Katzenberg,,49.09416667,11.31777778,562 +DM/BM-225,Schlossberg,,49.09944444,11.78472222,555 +DM/BM-226,Duerrenberg,,49.01555556,10.76222222,656 +DM/BM-227,Flueglinger Berg,,49.04359818,10.90470028,541 +DM/BM-228,Kreuzberg,,49.04111111,11.58694444,481 +DM/BM-229,Vogtholz,,49.02027778,11.57277778,504 +DM/BM-230,Wolfsberg,,49.02360153,11.60529995,497 +DM/BM-231,Kohlplatte,,48.97944444,11.36583333,498 +DM/BM-232,Schellenburg,,48.99361111,11.36805556,494 +DM/BM-233,Nagelberg,,48.96749878,10.92469978,542 +DM/BM-234,Steinplatte,,48.91611111,11.64333333,511 +DM/BM-235,Frauenberg,,48.88388889,11.18000000,505 +DM/BM-236,Ziegelhofer Berg,,48.89888889,11.20361111,532 +DM/BM-237,Stirnberg,,50.49111111,10.03916667,899 +DM/BM-238,Heidelstein,,50.46110153,10.00529957,923 +DM/BM-239,Muenzkopf,,50.44250000,09.99722222,849 +DM/BM-240,Dreistelzberg,,50.27690125,9.76749992,660 +DM/BM-241,Kreuzberg,,50.37055556,09.97916667,928 +DM/BM-242,Rother Kuppe,,50.48111111,10.10277778,711 +DM/BM-243,Gangolfsberg,,50.46583333,10.08583333,736 +DM/BM-244,Kaeulingsberg,,50.37527778,10.01000000,754 +DM/BM-245,Lindenberg,,50.02000000,09.30194444,402 +DM/BM-246,Steigkoppe,,50.04250000,09.30527778,502 +DM/BM-247,Zwercheck,,49.17333333,13.16555556,1333 +DM/BM-248,Hinterer Hiener,,49.32580185,12.70530033,768 +DM/BM-249,Vorderer Hiener,,49.30939865,12.71329975,780 +DM/BM-250,Blauberg,,49.36888889,12.66111111,637 +DM/BM-251,Grosser Hansgoergl,,49.52638889,11.39361111,601 +DM/BM-252,Leitenberg,,49.52220154,11.51609993,616 +DM/BM-253,Ossinger,,49.59939957,11.61940002,651 +DM/BM-254,Zantberg,,49.57027778,11.63750000,647 +DM/BM-255,Zankelstein,,49.50388889,11.52333333,547 +DM/BM-256,Poppberg,,49.41360092,11.58469963,652 +DM/BM-257,Lamberg,,49.19860077,12.71809959,602 +DM/BM-258,Einoedriegel,,48.92750000,13.02777778,1121 +DM/BM-259,Weigelsberg,,49.09805556,12.95972222,898 +DM/BM-260,Knogelberg,,49.06079865,12.97999954,708 +DM/BM-261,Wolfgangriegel,,49.07027778,13.04111111,876 +DM/BM-262,Rabenholz,,48.98720169,13.04810047,785 +DM/BM-263,Kronberg,,49.03694444,13.10527778,983 +DM/BM-264,Kuehberg,,48.97638889,13.22916667,870 +DM/BM-265,Hollerriegel,,48.97388889,13.27666667,876 +DM/BM-266,Hochleiten,,49.04277778,13.25111111,786 +DM/BM-267,Riesberg,,49.03969955,13.28940010,934 +DM/BM-268,Hochberg,,49.10777778,13.20638889,943 +DM/BM-269,Hindenburgfelsen,,49.14110184,13.15970039,1173 +DM/BM-270,Schwarzeck,,49.14749908,13.06359959,1236 +DM/BM-271,Eschenberg,,48.93470001,13.27919960,1042 +DM/BM-272,Bienstand,,48.89416667,13.39361111,865 +DM/BM-273,Koksberg,,48.85499954,13.33469963,707 +DM/BM-274,Grosser Rachel,,48.97829819,13.38920021,1452 +DM/BM-275,Plattenhausenriegel,,48.96416667,13.44944444,1372 +DM/BM-276,Lusen,,48.93888889,13.50694444,1373 +DM/BM-277,Steinberg,,48.85055556,13.46083333,871 +DM/BM-278,Sulzberg,,48.80166667,13.49277778,704 +DM/BM-279,Geyersberg,,48.79470062,13.53719997,798 +DM/BM-280,Ochsenberg,,48.79830170,13.58139992,832 +DM/BM-281,Geissberg,,48.79330063,13.59860039,835 +DM/BM-282,Friedrichsberg,,48.65444444,13.79638889,930 +DM/BM-283,Grosser Rathberg,,48.65638889,13.74416667,899 +DM/BM-284,Neufanger Berg,,48.74916667,13.65305556,755 +DM/BM-285,Sicklinger Berg,,48.73527778,13.57944444,628 +DM/BM-286,Ebersberg,,48.63944444,13.30138889,560 +DM/BM-287,Ruhmannsberg,,48.64749908,13.68560028,862 +DM/BM-288,Frauenwald,,48.68500000,13.65805556,947 +DM/BM-289,Thurnreuther Berg,,48.60609818,13.72669983,823 +DM/BM-290,Hoehenberg,,48.54277778,13.72222222,762 +DM/BM-291,Aschenstein,,48.81750000,13.25722222,942 +DM/BM-292,Hoehenberg,,48.74916667,13.36166667,610 +DM/BM-293,Hochberg,,48.71055556,13.31000000,596 +DM/BM-294,Stierberg,,48.78359985,13.23830032,716 +DM/BM-295,Abendberg,,48.99829865,12.94060040,844 +DM/BM-296,Hadriwa,,49.03469849,12.76640034,922 +DM/BM-297,Schellenberg,,48.95610046,12.79969978,595 +DM/BM-298,Engelsberg,,48.95055556,12.77194444,595 +DM/BM-299,Bernhardsnagel,,49.05329895,12.79749966,894 +DM/BM-300,Zeller Hoehe,,49.07666667,12.79194444,850 +DM/BM-301,Fahrberg,,49.10609818,12.81830025,675 +DM/BM-302,Ziernberg,,49.12055556,12.85861111,601 +DM/BM-303,Wurzer Spitz,,49.13055556,12.91805556,817 +DM/BM-304,Haidstein,,49.21580124,12.80669975,742 +DM/BM-305,Weissenstein,,49.13079834,12.68280029,681 +DM/BM-306,Laengseugenberg,,49.13690186,12.62469959,642 +DM/BM-307,Hadriwa,,49.12189865,12.39999962,677 +DM/BM-308,Scheuchenberg,,49.02610016,12.26780033,534 +DM/BM-309,Hochwald,,49.30220032,12.65060043,691 +DM/BM-310,Engelberg,,49.36360168,12.67560005,651 +DM/BM-311,Schlossberg,,49.24190140,12.69890022,563 +DM/BM-312,Oechselsberg,,49.27310181,12.69970036,647 +DM/BM-313,Brunstberg,,49.31969833,12.49890041,659 +DM/BM-314,Einsiedelhoehe,,49.22805556,12.34666667,502 +DM/BM-315,Obere Bocksgehirn,,49.36638889,12.42055556,586 +DM/BM-316,Knock,,49.38579941,12.42809963,667 +DM/BM-317,Kulm,,49.41749954,12.45670033,622 +DM/BM-318,Stangenberg,,49.54416667,12.47944444,750 +DM/BM-319,Eisberg,,49.54055556,12.40305556,770 +DM/BM-320,Schindelberg,,49.42027778,12.20305556,565 +DM/BM-321,Fahrenberg,,49.66719818,12.36559963,801 +DM/BM-322,Mitterberg,,49.67388889,12.43916667,784 +DM/BM-323,Entenbuehl,,49.75777778,12.39833333,900 +DM/BM-324,Fuerberg,,48.87055556,13.21250000,880 +DM/BM-325,Dattinger Berg,,48.87500000,13.11027778,886 +DM/BM-326,Schwarzberg,,49.21609879,12.14999962,538 +DM/BM-327,Jugenberg,,49.18555556,12.21861111,610 +DM/BM-328,Weissenhofer Haenge,,49.22277778,12.20250000,533 +DM/BM-329,Spitzberg,,50.33250000,11.30472222,520 +DM/BM-330,Oberer roter Buehl,,50.23027778,11.25333333,517 +DM/BM-331,Geuserberg,,50.24860001,11.46420002,708 +DM/BM-332,Doebraberg,,50.27805556,11.64305556,795 +DM/BM-333,Rainberg,,50.16277778,11.32333333,533 +DM/BM-334,Kesselleite,,50.08940125,11.48079967,528 +DM/BM-335,Fechheimer Berg,,50.28027778,11.11888889,484 +DM/BM-336,Muppberg,,50.32416667,11.13638889,516 +DM/BM-337,Hesserberg,,49.81219864,11.99829960,715 +DM/BM-338,Armesberg,,49.89027778,11.94583333,731 +DM/BM-339,Rauher Kulm,,49.82860184,11.84969997,681 +DM/BM-340,Steinberg,,49.98916667,12.15222222,705 +DM/BM-341,Kreuzstein,,49.97666667,11.80527778,838 +DM/BM-342,Hohberg,,49.99110031,11.74670029,863 +DM/BM-343,Hohe Wart,,49.96860123,11.57470036,463 +DM/BM-344,Kleiner Kulm,,49.78110123,11.50609970,627 +DM/BM-345,Kalvarienberg,,49.78166667,11.68166667,644 +DM/BM-346,Burgstall,,49.65689850,11.13280010,549 +DM/BM-347,Kohlberg,,49.57388889,11.54611111,565 +DM/BM-348,Houbirg,,49.48830032,11.49139977,617 +DM/BM-349,Hungerleite,,49.51190186,12.01280022,673 +DM/BM-350,Mariahilfberg,,49.45777778,11.87250000,529 +DM/BM-351,Dillberg,,49.32440186,11.38220024,595 +DM/BM-352,Schluepfelberg,,49.17027778,11.42916667,573 +DM/BM-353,Hofberg,,49.12694444,11.28777778,553 +DM/BM-354,Schlossberg,,49.11220169,11.10140038,607 +DM/BM-355,Westlicher Arzberg,,49.03359985,11.48610020,507 +DM/BM-356,Hainberg,,48.77416667,11.10166667,552 +DM/BM-357,Wittmessberg,,48.84416667,11.11416667,548 +DM/BM-358,Massenberg,,49.19138889,10.92083333,516 +DM/BM-359,Eierberge,,50.10359955,10.94190025,451 +DM/BM-360,Staffelberg,,50.09249878,11.02359962,541 +DM/BM-361,Kulch,,50.16194444,10.97694444,484 +DM/BM-362,Nassacher Hoehe,,50.18690109,10.49110031,512 +DM/BM-363,Hohe Schule,,50.48527778,10.30277778,538 +DM/BM-364,Heidelberg,,50.42666667,10.21444444,522 +DM/BM-365,Arnsberg,,50.39440155,9.96140003,843 +DM/BM-365,Arnsberg,,50.39444444,09.96138889,843 +DM/BM-366,Totnansberg,,50.32109833,9.93029976,839 +DM/BM-367,Sodenberg,,50.10388889,09.80972222,481 +DM/BM-368,Schwarzriegel,,49.23388889,12.93472222,1079 +DM/BM-369,Euerberg,,49.93138889,10.53972222,491 +DM/BM-370,Geissleite,,49.67940140,12.23480034,636 +DM/BW-001,Feldberg,,47.87360001,8.00389957,1493 +DM/BW-002,Herzogenhorn,,47.83555556,08.01888889,1415 +DM/BW-003,Belchen,,47.82249832,7.83309984,1414 +DM/BW-004,Stuebenwasen,,47.86777778,07.97194444,1386 +DM/BW-005,Grafenmatt,,47.84805556,08.01916667,1377 +DM/BW-006,Toter Mann,,47.89194444,07.99000000,1321 +DM/BW-007,Hochkopf,,47.85861111,08.05722222,1308 +DM/BW-008,Schauinsland,,47.91166667,07.89833333,1284 +DM/BW-009,Kandel,,48.06219864,8.01109982,1241 +DM/BW-010,Koehlgarten,,47.79055556,07.77805556,1224 +DM/BW-011,Bankgallihoehe,,47.91277778,08.03138889,1210 +DM/BW-012,Boetzberg,,47.78499985,8.13469982,1216 +DM/BW-013,Hinterwaldkopf,,47.91888889,08.01722222,1198 +DM/BW-014,Weisstannenhoehe,,47.93970108,8.11750031,1190 +DM/BW-015,Hochfirst,,47.90110016,8.18420029,1190 +DM/BW-016,Oberegg,,48.11277778,08.11666667,1177 +DM/BW-017,Rohrenkopf,,47.71305556,07.92694444,1169 +DM/BW-018,Blauen,,47.77833333,07.70111111,1165 +DM/BW-019,Hornisgrinde,,48.60580063,8.20139980,1163 +DM/BW-020,Brend,,48.07916667,08.15722222,1149 +DM/BW-021,Steinbuehl,,47.73666667,07.97000000,1148 +DM/BW-022,Weiher,,47.80305556,07.77777778,1143 +DM/BW-023,Hornkopf,,48.07305556,08.07166667,1121 +DM/BW-024,Schwarzer Grat,,47.69250000,10.12555556,1118 +DM/BW-025,Bildstein,,47.84111111,08.13694444,1107 +DM/BW-026,Pflumberg,,47.85305556,08.19222222,1101 +DM/BW-027,Riesenbuehl,,47.82916667,08.17944444,1097 +DM/BW-028,Hundsruecken,,48.61750000,08.21944444,1080 +DM/BW-029,Hoher Ochsenkopf,,48.64250000,08.26861111,1055 +DM/BW-030,Schliffkopf,,48.53583333,08.21611111,1055 +DM/BW-031,Geissberg,,48.15638889,08.14472222,1047 +DM/BW-032,Feuerberg,,47.92722222,08.17222222,1039 +DM/BW-033,Glassberg,,47.99138889,08.13833333,1037 +DM/BW-034,Wegmannshoehe,,47.70861111,10.10361111,1032 +DM/BW-035,Oedlandkopf,,47.66250000,07.97083333,1026 +DM/BW-036,Tenneberg,,47.91861111,08.22722222,1024 +DM/BW-037,Muehleberg,,48.10805556,08.22194444,1023 +DM/BW-038,Lemberg,,48.15055556,08.75027778,1015 +DM/BW-039,Pfaelzerkopf,,48.56305556,08.25166667,1012 +DM/BW-040,Sprigelsbacher Hoehe,,47.91611111,08.14361111,1009 +DM/BW-041,Wandbuehl,,48.16277778,08.80527778,1007 +DM/BW-042,Rainen,,48.17916667,08.80916667,1006 +DM/BW-043,Montschenloch,,48.16944444,08.79416667,1004 +DM/BW-044,Hohe Steig,,48.07138889,08.11833333,1003 +DM/BW-045,Bol,,48.17111111,08.80527778,1002 +DM/BW-046,Plettenberg,,48.20416667,08.81083333,1002 +DM/BW-047,Badener Hoehe,,48.66944444,08.27555556,1002 +DM/BW-048,Hoher Fels,,48.21861111,08.83583333,996 +DM/BW-049,Kochelsberg,,48.10138889,08.78555556,993 +DM/BW-050,Leinkopf,,48.57583333,08.27861111,992 +DM/BW-051,Schafberg,,48.21166667,08.83388889,991 +DM/BW-052,Weichenwang,,48.18555556,08.94583333,989 +DM/BW-053,Ortenberg,,48.17916667,08.80055556,985 +DM/BW-054,Hohloh,,48.70859909,8.41580009,984 +DM/BW-055,Hohe Moehr,,47.69277778,07.87416667,983 +DM/BW-056,Oberer Berg,,48.20166667,08.94694444,982 +DM/BW-057,Lupfen,,48.02388889,08.67111111,977 +DM/BW-058,Burg,,48.27194444,09.02194444,975 +DM/BW-059,Hirnbuehl,,48.08361111,08.78166667,973 +DM/BW-060,Hoher Draberg,,48.69388889,08.39555556,970 +DM/BW-061,Lochenstein,,48.22027778,08.84944444,963 +DM/BW-062,Rossbuehl,,48.49388889,08.23972222,963 +DM/BW-063,Raichberg,,48.30583333,08.99250000,956 +DM/BW-064,Heersberg,,48.22916667,08.94416667,954 +DM/BW-065,Hoernle,,48.22194444,08.87888889,951 +DM/BW-066,Grosser Hundskopf,,48.40416667,08.23666667,947 +DM/BW-067,Brandenkopf,,48.33888889,08.15361111,945 +DM/BW-068,Heimberg,,48.20194444,08.92083333,943 +DM/BW-069,Kolbenkopf,,48.16083333,08.21277778,934 +DM/BW-070,Hundsruecken,,48.28027778,08.92944444,931 +DM/BW-071,Schramberg,,48.65222222,08.39583333,922 +DM/BW-072,Irrenberg,,48.28111111,08.94388889,921 +DM/BW-073,Schnaitkopf,,48.10138889,08.96527778,920 +DM/BW-074,Hohenkarpfen,,48.04109955,8.71829987,912 +DM/BW-075,Kornbuehl,,48.35472222,09.09833333,886 +DM/BW-076,Mosswaldkopf,,48.24027778,08.30111111,879 +DM/BW-077,Braunberg,,48.44860077,8.19859982,874 +DM/BW-078,Roemerstein,,48.50999832,9.54419994,872 +DM/BW-079,Ellbachkopf,,48.50083333,08.30638889,872 +DM/BW-080,Baerleichkopf,,48.42250000,08.31638889,872 +DM/BW-081,Rossberg,,48.41777778,09.14277778,869 +DM/BW-082,Witthoh,,47.93579865,8.82719994,860 +DM/BW-083,Schondelhoehe,,48.23750000,08.24361111,859 +DM/BW-084,Rossberg,,48.40166667,08.33472222,848 +DM/BW-085,Hohenstoffeln,,47.79527778,08.75027778,844 +DM/BW-086,Hohenhewen,,47.83610153,8.74720001,844 +DM/BW-087,Schoellkopf,,48.43500000,08.38916667,843 +DM/BW-088,Rangenberg,,47.71500000,10.07250000,828 +DM/BW-089,Farrenberg,,48.38830185,9.07059956,820 +DM/BW-090,Hohe Warte,,48.49250000,09.33138889,820 +DM/BW-091,Schonberg,,48.44111111,09.22611111,793 +DM/BW-092,Urselhochberg,,48.45220184,9.27000046,789 +DM/BW-093,Farrenkopf,,48.25690079,8.18140030,789 +DM/BW-094,Kornberg,,48.61999893,9.63280010,779 +DM/BW-095,Volkmarsberg,,48.79222222,10.08666667,743 +DM/BW-096,Rosskopf,,48.00999832,7.90170002,737 +DM/BW-097,Nollenberg,,48.33222222,08.37694444,731 +DM/BW-098,Eggberg,,47.57777778,07.95416667,709 +DM/BW-099,Achalm,,48.49444444,09.24416667,707 +DM/BW-100,Rechberg,,48.75666667,09.79000000,707 +DM/BW-101,Hohentwiel,,47.76470184,8.81939983,690 +DM/BW-102,Hohenstaufen,,48.74305556,09.71666667,684 +DM/BW-103,Merkur,,48.76444444,08.28055556,668 +DM/BW-104,Steinberg,,48.71305556,08.27750000,656 +DM/BW-105,Schoenberg,,47.95439911,7.80530024,645 +DM/BW-106,Hohenkraehen,,47.79888889,08.82055556,643 +DM/BW-107,Katzenbuckel,,49.47055556,09.04111111,624 +DM/BW-108,Nellenburger Berg,,47.85527778,08.99027778,624 +DM/BW-109,Kleiner Staufenberg,,48.75611111,08.28611111,623 +DM/BW-110,Limburg,,48.60440063,9.53639984,598 +DM/BW-111,Hohe Brach,,49.03666667,09.55027778,586 +DM/BW-112,Hagberg,,48.93999863,9.71080017,585 +DM/BW-113,Hornberg,,49.01527778,10.18833333,570 +DM/BW-114,Koenigsstuhl,,49.40250000,08.73222222,568 +DM/BW-115,Kaiserstuhl/Totenkopf,,48.08079910,7.67250013,564 +DM/BW-116,Rosenegger Berg,,47.73440170,8.81560040,549 +DM/BW-117,Weisser Stein,,49.45305556,08.72277778,548 +DM/BW-118,Wolfristkopf,,47.64805556,07.91277778,548 +DM/BW-119,Juxkopf,,49.03388889,09.43166667,533 +DM/BW-120,Kressberg,,49.14361111,10.24138889,528 +DM/BW-121,Steinknickle,,49.10833333,09.47916667,525 +DM/BW-122,Ruehrberg,,47.57027778,07.71194444,518 +DM/BW-123,Friedrichsberg,,49.18500000,09.66305556,514 +DM/BW-124,Theresienberg,,49.19083333,09.62527778,498 +DM/BW-125,Schafberg,,47.66194444,07.55305556,387 +DM/BW-126,Hintersberg,,49.11694444,09.27416667,364 +DM/BW-127,Luginsland,,47.80194444,07.61000000,343 +DM/BW-128,Steinsberg,,49.21444444,08.87777778,333 +DM/BW-129,Tuniberg,,47.97277778,07.68027778,314 +DM/BW-130,Limberg,,48.15027778,07.60583333,272 +DM/BW-131,Ipf,,48.87055556,10.35611111,668 +DM/BW-132,Hornsberg,,48.90611111,10.22027778,587 +DM/BW-133,Burgberg,,49.12083333,09.97416667,534 +DM/BW-134,Hohenberg,,49.14611111,10.15527778,528 +DM/BW-135,Schliffkopf,,48.53527778,08.21472222,1053 +DM/BW-136,Buechelberg,,48.78444444,08.80944444,544 +DM/BW-137,Buechenbronner Hoehe,,48.84305556,08.64111111,608 +DM/BW-138,Erzkopf,,48.86777778,08.70583333,442 +DM/BW-139,Horn,,49.04500000,08.80805556,321 +DM/BW-140,Langenbrander Hoehe,,48.80416667,08.61805556,723 +DM/BW-141,Sandberg,,48.85861111,10.33500000,650 +DM/BW-143,Schwanner Warte,,48.83916667,08.54916667,472 +DM/BW-144,Sommerberg,,48.75055556,08.53750000,731 +DM/BW-145,Steinbuckel,,48.89138889,08.81222222,431 +DM/BW-146,Wallberg,,48.89583333,08.66527778,400 +DM/BW-147,Gespaltener Fels,,48.22027778,08.83805556,1000 +DM/BW-148,Graebelesberg,,48.21055556,08.91833333,915 +DM/BW-149,Haertle,,48.19194444,08.87000000,947 +DM/BW-150,Hummelbuehl,,48.13972222,08.87972222,933 +DM/BW-151,Buchenberg,,48.12666667,08.83361111,943 +DM/BW-152,Steinenberg,,48.10972222,08.77527778,993 +DM/BW-153,Galgenberg,,48.09611111,08.79277778,991 +DM/BW-154,Alter Berg,,48.09222222,08.80527778,980 +DM/BW-155,Gehrn,,48.04750000,08.73416667,948 +DM/BW-156,Lindenberg,,47.99219894,8.67000008,949 +DM/BW-157,Osterberg,,47.98249817,8.65279961,923 +DM/BW-158,Bruderwald,,48.01416667,08.62444444,888 +DM/BW-159,Blatthalde,,47.96638889,08.63472222,915 +DM/BW-160,Hornenberg,,47.93583333,08.67861111,904 +DM/BW-161,Wartenberg,,47.92527778,08.61722222,821 +DM/BW-162,Homberg,,47.88000000,08.52472222,860 +DM/BW-163,Wallenberg,,47.86777778,08.55027778,829 +DM/BW-164,Winterberg,,47.99333333,08.27083333,1097 +DM/BW-165,Kapf,,47.97055556,08.28611111,1025 +DM/BW-166,Fohrenbuehl,,47.97138889,08.30222222,1033 +DM/BW-167,Rufeneck,,48.01416667,08.26388889,1080 +DM/BW-168,Grashalde,,48.00888889,08.71527778,916 +DM/BW-169,Staufelberg,,48.06388889,08.70166667,807 +DM/BW-170,Winterhalde,,47.89472222,08.12166667,1027 +DM/BW-171,Bistenkopf,,47.90611111,08.06777778,1115 +DM/BW-172,Windeck,,47.89777778,08.07694444,1209 +DM/BW-173,Eckle,,47.88359833,8.09689999,1114 +DM/BW-174,Die Rau,,47.94416667,08.18194444,1077 +DM/BW-175,Stoberg,,47.85250000,08.56000000,842 +DM/BW-176,Eichberg,,47.84859848,8.51560020,914 +DM/BW-177,Mittelberg,,48.18250000,08.35083333,843 +DM/BW-178,Staufenberg,,48.11666667,08.89333333,955 +DM/BW-179,Willberg,,47.82555556,08.70361111,689 +DM/BW-180,Wannenberg,,47.82666667,08.66833333,760 +DM/BW-181,Sonnenberg,,48.06000000,08.21305556,1045 +DM/BW-182,Grosser Hausberg,,48.04083333,08.20194444,1031 +DM/BW-183,Amtenhauser Berg,,47.95055556,08.70333333,883 +DM/BW-184,Rossberg,,48.14666667,08.87500000,968 +DM/BW-185,Himmelberg,,47.99611111,08.65444444,941 +DM/BW-186,Wintersberg,,47.95500000,08.18361111,1064 +DM/BW-187,Buehlen,,48.21444444,08.86305556,952 +DM/BW-188,Oberer Berg,,48.20194444,08.94722222,982 +DM/BW-189,Schildhalde,,48.19305556,08.95472222,974 +DM/BW-190,Witterl,,48.13611111,08.85888889,962 +DM/BW-191,Koenigswang,,48.10888889,08.84305556,950 +DM/BW-192,Kohlberg,,47.98750000,08.67694444,923 +DM/BW-193,Schaecher,,47.89110184,8.57639980,918 +DM/BW-194,Ochsenberg,,48.04083333,08.32833333,974 +DM/BW-195,Zunderberg,,48.05469894,8.74170017,954 +DM/BW-196,Dietschenberg,,47.94666667,08.14638889,1098 +DM/BW-197,Fuchsloch,,48.18166667,08.91083333,930 +DM/BW-198,Kohlberg,,47.97083333,08.67694444,923 +DM/BW-199,Wanne,,49.41833333,09.69694444,401 +DM/BW-200,Emerberg,,48.22777778,09.49916667,704 +DM/BW-201,Hochberg,,47.99222222,09.53305556,676 +DM/BW-202,Frauenberg,,49.54250000,09.71611111,323 +DM/BW-203,Dickbuckel,,49.71055556,09.57250000,351 +DM/BW-204,Heiligenberg,,49.58777778,09.61805556,347 +DM/BW-205,Schlossberg,,48.16416667,09.33833333,709 +DM/BW-206,Rotenberg,,49.02166667,09.04111111,420 +DM/BW-207,Habsberg,,48.17527778,09.34333333,732 +DM/BW-208,Reifersberg,,48.19194444,09.40722222,773 +DM/BW-209,Apfelberg,,49.67916667,09.61194444,380 +DM/BW-210,Schlierkopf,,49.03250000,08.93277778,450 +DM/BW-211,Hohe Reute,,49.01166667,09.02138889,439 +DM/BW-212,Baiselberg,,49.00388889,08.98805556,477 +DM/BW-213,Eselsberg,,48.97472222,08.95916667,392 +DM/BW-214,Gosser Heidberg,,49.66666667,09.54555556,405 +DM/BW-215,Altenberg,,49.57194444,09.68444444,337 +DM/BW-216,Heidelberg,,49.10638889,09.07305556,336 +DM/BW-217,Eichbuehl,,49.11722222,09.03833333,335 +DM/BW-218,Steinehau,,49.03527778,08.99583333,472 +DM/BW-219,Mehlberg,,49.52750000,09.72305556,349 +DM/BW-220,Edelberg,,49.51527778,09.72055556,366 +DM/BW-221,Grosser Saukopf,,49.02138889,09.02388889,409 +DM/BW-222,Leiterholzspitze,,49.65083333,09.44472222,435 +DM/BW-223,Kreuzberg,,49.17083333,08.81583333,295 +DM/BW-224,Tauberberg,,49.48777778,09.86416667,407 +DM/BW-225,Grosser Saukopf,,49.02138889,09.02416667,409 +DM/BW-226,Boernle,,48.12833333,08.81222222,964 +DM/BW-227,Dreifaltigkeitsberg,,48.08222222,08.76277778,985 +DM/BW-228,Hummelsberg,,48.11777778,08.76388889,1002 +DM/BW-229,Ochsenberg,,48.00361111,08.42416667,803 +DM/BW-230,Tuernleberg,,48.04805556,08.56194444,799 +DM/BW-231,Kapf,,47.98305556,08.53194444,769 +DM/BW-232,Huchnegg,,47.88166667,08.53916667,863 +DM/BW-233,Buchberg,,47.83027778,08.52138889,880 +DM/BW-234,Hochwald,,47.78138889,08.51638889,693 +DM/BW-235,Hoher Randen,,47.78694444,08.55694444,924 +DM/BW-236,Kohlwald,,47.88222222,08.48777778,806 +DM/BW-237,Oberhohenberg,,48.16388889,08.76083333,1011 +DM/BW-238,Oberlen,,48.05916667,08.58333333,778 +DM/BW-239,Kapf,,48.00083333,08.79111111,858 +DM/BW-240,Leutenberg,,47.98944444,08.84166667,799 +DM/BW-241,Homburg,,47.93138889,08.93638889,763 +DM/BW-242,Kirchberg,,48.02194444,08.94388889,796 +DM/BW-243,Wirtenbuehl,,48.00222222,08.89722222,818 +DM/BW-244,Wachtbuehl,,48.09583333,08.85416667,928 +DM/BW-245,Barblen,,48.14277778,08.85027778,983 +DM/BW-246,Fohlen,,48.15444444,08.85583333,978 +DM/BW-247,Baienberg,,48.19194444,08.89805556,967 +DM/BW-248,Kuessaburg,,47.60194444,08.35361111,634 +DM/BW-249,Schellenberg,,47.94750000,08.45833333,821 +DM/BW-250,Triberg,,47.93750000,08.42972222,776 +DM/BW-251,G´schwand,,48.00083333,08.33555556,913 +DM/BW-252,Muehleberg,,48.03722222,08.29694444,995 +DM/BW-253,Kesselberg,,48.02861111,08.27500000,1047 +DM/BW-254,Duerreberg,,48.02333333,08.30194444,1015 +DM/BW-255,Hohe Wart,,48.02083333,08.32861111,968 +DM/BW-256,Auf der Burg,,48.05111111,08.31833333,996 +DM/BW-257,Rotwald,,48.12500000,08.40000000,825 +DM/BW-258,Hohen Schramberg,,48.22694444,08.37083333,680 +DM/BW-259,Teufelskopf,,48.24555556,08.36611111,668 +DM/BW-260,Sattellege,,48.24833333,08.37944444,580 +DM/BW-261,Hartskaepfle,,48.24580002,8.34469986,825 +DM/BW-262,Hohenreutenwald,,48.23916667,08.31166667,864 +DM/BW-263,Kahlenberg,,48.25777778,08.32333333,845 +DM/BW-264,Moosenkapf,,48.25638889,08.29638889,872 +DM/BW-265,Hasenkopf,,48.21416667,08.25833333,691 +DM/BW-266,Windeckfelsen,,48.20638889,08.24722222,773 +DM/BW-267,Hauberg,,48.17305556,08.24722222,890 +DM/BW-268,Mosenberg,,48.10361111,08.24222222,1036 +DM/BW-269,Stoecklewald,,48.09138889,08.25388889,1076 +DM/BW-270,Bosberg,,48.05611111,08.23416667,1052 +DM/BW-271,Rappeneck,,48.05916667,08.26583333,1034 +DM/BW-272,Sommerberg,,48.03111111,08.24166667,1076 +DM/BW-273,Kohlwasen,,48.01330185,8.21440029,1112 +DM/BW-274,Steinberg,,48.00027778,08.17250000,1141 +DM/BW-275,Hochberg,,47.97250000,08.20333333,1116 +DM/BW-276,Steinbuehl,,47.96500000,08.22583333,1141 +DM/BW-277,Schneeberg,,47.96916667,08.17055556,1056 +DM/BW-278,Hinterberg,,47.93027778,08.10888889,1046 +DM/BW-279,Hochfahrn,,47.90416667,07.96138889,1264 +DM/BW-280,Hirschkopf,,47.87944444,07.94250000,1254 +DM/BW-281,Spechtsboden,,47.84083333,07.96027778,1139 +DM/BW-282,Silberberg,,47.83777778,07.99638889,1358 +DM/BW-283,Spiesshorn,,47.83110046,8.04059982,1349 +DM/BW-284,Schnepfhalde,,47.81916667,08.09305556,1299 +DM/BW-285,Sieppberg,,47.79861111,08.09416667,1220 +DM/BW-286,Habsberg,,47.80138889,08.12444444,1263 +DM/BW-287,Kuhkopf,,47.79055556,08.11166667,1094 +DM/BW-288,Kaiserberg,,47.80638889,08.05527778,1156 +DM/BW-289,Rechberg,,47.77861111,08.06111111,1086 +DM/BW-290,Oren,,47.76944444,08.03611111,1166 +DM/BW-291,Farnberg,,47.76219940,8.02639961,1213 +DM/BW-292,Sackkoepfle,,47.77055556,08.05111111,1042 +DM/BW-293,Zeller Blauen,,47.74138889,07.84638889,1074 +DM/BW-294,Honeck,,47.77583333,07.84305556,1022 +DM/BW-295,Maistollen,,47.87972222,07.80111111,834 +DM/BW-296,Kohlernkopf,,47.92250000,07.82777778,734 +DM/BW-297,Hohfirst,,47.93888889,07.77916667,494 +DM/BW-298,Hohe Tanne,,48.09749985,7.94439983,516 +DM/BW-299,Schwarzenberg,,48.16361111,07.96027778,685 +DM/BW-300,Hohe Eck,,48.19666667,07.94027778,601 +DM/BW-301,Bockenbuehl,,48.19222222,07.97194444,740 +DM/BW-302,Rotzeleck,,48.20666667,07.98833333,784 +DM/BW-303,Grosser Grassert,,48.26250000,07.92000000,543 +DM/BW-304,Uhlsberg,,48.29722222,07.86361111,349 +DM/BW-305,Lauenberg,,48.31305556,07.92055556,440 +DM/BW-306,Niederbacher Eck,,48.31194444,08.00944444,499 +DM/BW-307,Eichberg,,48.33110046,7.95529985,469 +DM/BW-308,Rauhkasten,,48.35388889,07.98083333,639 +DM/BW-309,Geigenkoepfle,,48.36750000,07.96250000,598 +DM/BW-310,Geisskopf,,48.41750000,07.97500000,359 +DM/BW-311,Geigerskopf,,48.50555556,08.05638889,435 +DM/BW-312,Wolfenkopf,,48.48083333,08.06722222,504 +DM/BW-313,Mooskopf,,48.45277778,08.09361111,878 +DM/BW-314,Brandeckkopf,,48.46749878,8.02639961,690 +DM/BW-315,Schweinsberg,,49.11083333,09.24861111,373 +DM/BW-316,Sandberg,,49.11250000,09.30777778,386 +DM/BW-317,Fohlenberg,,49.04722222,09.31888889,381 +DM/BW-318,Rehbuehl,,49.02166667,09.35361111,408 +DM/BW-319,Wunnenstein,,49.02888889,09.27805556,394 +DM/BW-320,Koechersberg,,49.02305556,09.28944444,323 +DM/BW-321,Forstberg,,49.02944444,09.29972222,376 +DM/BW-322,Fuchsbuehl,,49.01750000,09.39916667,516 +DM/BW-323,Atzenberg,,49.04944444,09.33277778,316 +DM/BW-324,Braeunersberg,,49.04388889,09.35388889,380 +DM/BW-325,Tauzenbuehl,,49.06500000,09.33638889,419 +DM/BW-326,Aschenberg,,49.05444444,09.42194444,526 +DM/BW-327,Steinberg,,49.05972222,09.41777778,535 +DM/BW-328,Grosstierbuehl,,49.13194444,09.61416667,483 +DM/BW-329,Brenntenrain,,49.13777778,09.55250000,433 +DM/BW-330,Wartwald,,49.12722222,09.69055556,503 +DM/BW-331,Streiflesberg,,49.11444444,09.68416667,491 +DM/BW-332,Korber Kopf,,48.85277778,09.36611111,457 +DM/BW-333,Grosser Rossberg,,48.84830093,9.42310047,512 +DM/BW-334,Hohenstein,,48.83916667,09.47277778,460 +DM/BW-335,Koenigsbronn,,48.88416667,09.49361111,441 +DM/BW-336,Altenberg,,48.96250000,09.90194444,565 +DM/BW-337,Hoefenberg,,48.93722222,09.93666667,555 +DM/BW-338,Tautschbuch,,48.20027778,09.45972222,734 +DM/BW-339,Reichstein,,48.24944444,09.48916667,725 +DM/BW-340,Alter Hau,,48.24055556,09.50472222,698 +DM/BW-341,Hochberg,,48.25194444,09.56527778,661 +DM/BW-342,Oesterberg,,48.15916667,09.43638889,652 +DM/BW-343,Bozenberg,,48.16222222,09.30777778,754 +DM/BW-344,Scheinenberg,,48.13722222,09.23305556,774 +DM/BW-345,Schwarzer Berg,,47.83111111,09.94972222,713 +DM/BW-346,Hochberg,,48.00805556,09.45555556,634 +DM/BW-347,Schellenberg,,48.01444444,09.56694444,677 +DM/BW-348,Gehrenberg,,47.74166667,09.42416667,754 +DM/BW-349,Aacheck,,47.81689835,9.35719967,810 +DM/BW-350,Rinkenburg,,47.87916667,09.44583333,720 +DM/BW-351,Kaeferberg,,47.90388889,09.33666667,726 +DM/BW-352,Forstwald,,47.95472222,09.20000000,666 +DM/BW-353,Riesenberg,,47.69527778,09.17055556,485 +DM/BW-354,Taborberg,,47.69166667,09.16027778,473 +DM/BW-355,Homberg,,47.71916667,09.14083333,515 +DM/BW-356,Schoenenberg,,47.71861111,09.10861111,499 +DM/BW-357,Lettenberg,,47.73083333,09.05361111,466 +DM/BW-358,Homberg,,47.73722222,09.03361111,487 +DM/BW-359,Stoeckenloch,,47.78666667,09.03527778,698 +DM/BW-360,Kirnberg,,47.81888889,08.93888889,632 +DM/BW-361,Rossberg,,47.80720139,8.95580006,640 +DM/BW-362,Sipplinger Berg,,47.80777778,09.10305556,697 +DM/BW-363,Schiener Berg,,47.68555556,08.91944444,716 +DM/BW-364,Kressberg,,47.68722222,08.86611111,624 +DM/BW-365,Rauhenberg,,47.70439911,8.77719975,621 +DM/BW-366,Brennten,,47.99305556,08.89083333,842 +DM/BW-367,Brand,,47.97888889,08.86666667,844 +DM/BW-368,Baneck,,48.05805556,08.81250000,904 +DM/BW-369,Mittlerer Berg,,48.01750000,08.74083333,913 +DM/BW-370,Stallberg,,48.13888889,08.63333333,839 +DM/BW-371,Reitersbuehl,,48.11833333,08.54944444,739 +DM/BW-372,Bettenberg,,48.26083333,08.67583333,680 +DM/BW-373,Hoernle,,48.23277778,08.72750000,694 +DM/BW-374,Withau,,48.25472222,08.73333333,688 +DM/BW-375,Bauberg,,48.28583333,08.62694444,674 +DM/BW-376,Tonau,,48.32860184,8.68780041,682 +DM/BW-377,Weinberg,,48.33583333,08.73861111,573 +DM/BW-378,Owinger Berg,,48.35666667,08.85777778,622 +DM/BW-379,Hohwacht,,48.39000000,08.92361111,590 +DM/BW-380,Eichhalde,,48.35250000,08.42416667,688 +DM/BW-381,Reutiner Berg,,48.33833333,08.41277778,713 +DM/BW-382,Hengstberg,,48.79222222,08.59777778,717 +DM/BW-383,Heuberg,,48.80638889,08.54500000,709 +DM/BW-384,Teufelsmuehle,,48.75416667,08.40916667,908 +DM/BW-385,Mauzenberg,,48.80860138,8.40830040,759 +DM/BW-386,Schweizerkopf,,48.76000000,08.45527778,905 +DM/BW-387,Eichelberg,,49.19829941,8.82419968,325 +DM/BW-388,Kornberg,,49.21416667,08.81250000,249 +DM/BW-389,Bettelberg,,49.20333333,08.79583333,259 +DM/BW-390,Schlehberg,,49.23555556,08.73388889,224 +DM/BW-391,Galgenberg,,49.25777778,08.69777778,243 +DM/BW-392,Letzenberg,,49.25111111,08.67861111,243 +DM/BW-393,Wallenberg,,49.27027778,08.74083333,238 +DM/BW-394,Schlosswald,,49.30666667,08.87444444,265 +DM/BW-395,Helmsberg,,49.30638889,08.85194444,232 +DM/BW-396,Hirschberg,,49.33388889,08.71166667,317 +DM/BW-397,Utzenberg,,49.27916667,09.06083333,286 +DM/BW-398,Lammerskopf,,49.41138889,08.79222222,475 +DM/BW-399,Oberer Stadtwald,,49.38750000,08.81805556,361 +DM/BW-400,Buchwaldkopf,,49.44361111,08.82500000,460 +DM/BW-401,Gr.Admin.Wald,,49.39361111,08.89944444,368 +DM/BW-402,Weidach,,49.40944444,09.32138889,350 +DM/BW-403,Winterberg,,49.42222222,09.33694444,346 +DM/BW-404,Hohberg,,49.44722222,09.34555556,360 +DM/BW-405,Spitzenwald,,49.45583333,09.29277778,392 +DM/BW-406,Kandelberg,,49.41805556,09.38138889,314 +DM/BW-407,Eckenberg,,49.41250000,09.39361111,317 +DM/BW-408,Hahnberg,,49.43027778,09.46694444,371 +DM/BW-409,Wurmberg,,49.44777778,09.58277778,389 +DM/BW-410,Muehlberg,,49.47194444,09.67944444,351 +DM/BW-411,Eisenberg,,49.47388889,09.71055556,379 +DM/BW-412,Schalksberg,,49.48916667,09.69333333,372 +DM/BW-413,Neuberg,,49.50222222,09.69055556,359 +DM/BW-414,Vogelsberg,,49.53444444,09.75777778,343 +DM/BW-415,Turmberg,,49.54916667,09.75222222,370 +DM/BW-416,Altenberg,,49.50305556,09.80388889,345 +DM/BW-417,Katzenberg,,49.47166667,09.79583333,374 +DM/BW-418,Warte,,49.48083333,09.77722222,306 +DM/BW-419,Sailberg,,49.45194444,09.83361111,372 +DM/BW-420,Roeltersberg,,49.42583333,09.82777778,375 +DM/BW-421,Huettenberg,,49.43305556,09.79027778,369 +DM/BW-422,Schneitberg,,49.04250000,09.77055556,478 +DM/BW-423,Wolfsberg,,49.02611111,09.82305556,509 +DM/BW-424,Lehberg,,48.99805556,09.74861111,472 +DM/BW-425,Ebersberg,,49.00861111,09.73444444,485 +DM/BW-426,Steinbuehl,,49.03916667,09.72166667,484 +DM/BW-427,Dendelberg,,48.99583333,09.69888889,464 +DM/BW-428,Harnersberg,,48.99305556,09.65722222,483 +DM/BW-429,Felsenreute,,48.98388889,09.64555556,461 +DM/BW-430,Noblersberg,,48.95722222,09.56666667,539 +DM/BW-431,Utschberg,,49.00333333,09.52750000,429 +DM/BW-432,Springstein,,48.97222222,09.52638889,533 +DM/BW-433,Rohrberg,,48.84527778,09.58444444,462 +DM/BW-434,Suenchenberg,,48.82944444,09.52555556,392 +DM/BW-435,Sulzbuckel,,48.82944444,09.48305556,451 +DM/BW-436,Hohebergkopf,,48.80805556,09.63083333,499 +DM/BW-437,Joergenbuehl,,48.37027778,09.41500000,761 +DM/BW-438,Wahlenberg,,48.37138889,09.35944444,753 +DM/BW-439,Eichelberg,,48.34444444,09.35305556,768 +DM/BW-440,Rommetsberg,,48.34027778,09.38388889,798 +DM/BW-441,Dachenstein,,48.33888889,09.29777778,829 +DM/BW-442,Schneeberg,,48.31944444,09.28722222,812 +DM/BW-443,Augstberg,,48.29750000,09.27694444,848 +DM/BW-444,Neubann,,48.27888889,09.23944444,811 +DM/BW-445,Mahdenhaeule,,48.02194444,09.05916667,756 +DM/BW-446,Bodenwald,,48.07027778,08.23250000,1055 +DM/BW-447,Schlegelberg,,48.08083333,08.28250000,1009 +DM/BW-448,Lomberg,,48.06000000,08.67555556,816 +DM/BW-449,Gifiz,,48.03222222,08.63111111,816 +DM/BW-450,Tanzbuehl,,48.00555556,08.62638889,884 +DM/BW-451,Hohe Nistler,,49.44583333,08.70777778,496 +DM/BW-452,Heiligenberg,,49.42583333,08.70638889,440 +DM/BW-453,Kolbel,,49.43888889,08.94305556,409 +DM/BW-454,Heberl,,49.43610001,8.97830009,519 +DM/BW-455,Matzenberg,,49.43027778,09.02444444,467 +DM/BW-456,Hohe Warte,,49.49416667,08.98444444,552 +DM/BW-457,Buehl,,47.70972222,08.32638889,715 +DM/BW-458,Duxenberg,,47.69194444,08.34250000,619 +DM/BW-459,Kalter Wangen,,47.60750000,08.44277778,671 +DM/BW-460,Birnberg,,47.61416667,08.41944444,636 +DM/BW-461,Napberg,,47.64916667,08.47555556,641 +DM/BW-462,Rueglihau,,47.58750000,08.36888889,626 +DM/BW-463,Schneehenberg,,47.62138889,08.56583333,495 +DM/BW-464,Kernenwieden,,47.59277778,08.33861111,492 +DM/BW-465,Homberg,,47.68583333,08.29166667,707 +DM/BW-466,Glockenberg,,47.63777778,08.26583333,432 +DM/BW-467,Stubenberg,,47.63888889,08.13166667,706 +DM/BW-468,Kuehbuck,,47.67444444,08.20305556,750 +DM/BW-469,Duttenberg,,47.57611111,07.92444444,417 +DM/BW-470,Fuerstenberg,,47.89000000,08.56222222,918 +DM/BW-471,Wannenberg,,47.60166667,08.39777778,690 +DM/BW-472,Berchenwald,,47.60888889,08.32500000,530 +DM/BW-473,Hoehberg,,47.68444444,07.99305556,993 +DM/BW-475,Erlenberg,,47.73055556,07.95805556,1143 +DM/BW-477,Staufenkopf,,47.75833333,08.20361111,1037 +DM/BW-478,Labacher Berg,,47.74277778,08.17611111,958 +DM/BW-479,Ahornkopf,,47.76110077,8.09500027,1057 +DM/BW-480,Lehenkopf,,47.75111111,08.12500000,1039 +DM/BW-481,Mittelberg,,48.08861111,09.08777778,752 +DM/BW-482,Benzenberg,,48.07000000,09.12611111,722 +DM/BW-483,Tiefe,,48.12944444,09.19722222,708 +DM/BW-484,Bussen,,48.16194444,09.55666667,767 +DM/BW-485,Guckenberg,,48.20361111,09.57222222,657 +DM/BW-486,Hermannsberg,,49.23833333,08.78944444,243 +DM/BW-487,Kaisersberg,,49.25444444,08.81555556,253 +DM/BW-488,Schillinger Berg,,48.17555556,07.95388889,726 +DM/BW-489,Schlossberg,,48.07055556,07.62111111,352 +DM/BW-490,Hochbuck,,48.05972222,07.62527778,375 +DM/BW-491,Boeselsberg,,48.05611111,07.67861111,340 +DM/BW-492,Grenzertkopf,,48.76083333,08.41472222,891 +DM/BW-493,Lachsberg,,48.65611111,08.34305556,754 +DM/BW-494,Streitmannskoepfe,,48.67805556,08.31638889,989 +DM/BW-495,Vorfeldkopf,,48.66805556,08.24666667,949 +DM/BW-496,Kaelbelskopf,,48.69694444,08.21333333,672 +DM/BW-497,Eberkopf,,48.70055556,08.26305556,602 +DM/BW-498,Eierkuchenberg,,48.69305556,08.29666667,909 +DM/BW-499,Hohberg,,48.71138889,08.32527778,714 +DM/BW-500,Gr.Schoellkopf,,48.72805556,08.37916667,514 +DM/BW-501,Hirschkopf,,48.50444444,08.39500000,826 +DM/BW-502,Rinkenkopf,,48.51527778,08.36361111,760 +DM/BW-503,Hoellkopf,,48.54166667,08.36694444,855 +DM/BW-504,Grosshahnberg,,48.57916667,08.34111111,938 +DM/BW-505,Eckkoepfle,,48.59194444,08.37027778,681 +DM/BW-506,Stuhlberg,,48.60000000,08.36611111,615 +DM/BW-507,Kienberg,,48.49666667,08.33250000,890 +DM/BW-508,Eichelberg,,48.46500000,08.28777778,917 +DM/BW-509,Heimenhoehe,,48.45472222,08.29722222,879 +DM/BW-510,Absbachhoehe,,48.43138889,08.28333333,921 +DM/BW-511,Gauschberg,,48.40277778,08.26916667,838 +DM/BW-512,Teuscheneck,,48.40222222,08.28583333,866 +DM/BW-513,Staufenkopf,,48.33860016,8.27690029,851 +DM/BW-514,Spitzkopf,,48.34166667,08.29277778,830 +DM/BW-515,Waberhoehe,,48.32638889,08.30416667,813 +DM/BW-516,Ruxenkopf,,48.31638889,08.30750000,792 +DM/BW-517,Ippicher Hoehe,,48.31944444,08.26527778,735 +DM/BW-518,Teisenkopf,,48.31777778,08.33444444,794 +DM/BW-519,Hochwaelder Hoehe,,48.13805556,08.29777778,970 +DM/BW-520,Am Rifliz,,48.15000000,08.25444444,886 +DM/BW-521,Kroneck,,48.14055556,08.22166667,946 +DM/BW-522,Blindestein,,48.15000000,08.13916667,1049 +DM/BW-523,Braunhoernle,,48.13055556,08.09750000,1134 +DM/BW-524,Hoernleberg,,48.12750000,08.04583333,906 +DM/BW-525,Wachtbuehl,,48.16305556,08.04527778,542 +DM/BW-526,Stromberg,,48.16805556,08.02888889,566 +DM/BW-527,Wolfenbuehl,,48.15666667,08.00805556,554 +DM/BW-528,Hotzstein,,48.15527778,07.95138889,629 +DM/BW-529,Hohe Tag,,48.14972222,07.94111111,613 +DM/BW-530,Saisenberg,,48.17805556,07.92611111,589 +DM/BW-531,Huenersedel,,48.20439911,7.97170019,744 +DM/BW-532,Ruhbuehl,,48.20777778,07.93972222,542 +DM/BW-533,Geissberg,,48.23305556,07.99611111,727 +DM/BW-534,Goldbuehl,,48.25888889,07.98166667,529 +DM/BW-535,Lindenbuehl,,48.27000000,07.97250000,506 +DM/BW-536,Auf der Schanz,,48.28916667,07.99444444,571 +DM/BW-537,Eichberg,,48.13388889,07.86583333,369 +DM/BW-538,Schlechtberg,,48.13138889,07.91861111,454 +DM/BW-539,Erzbuck,,48.19527778,07.85555556,450 +DM/BW-540,Fohreneck,,48.20166667,07.83000000,326 +DM/BW-541,Schindlenbuehl,,48.25777778,07.87472222,486 +DM/BW-542,Rollberg,,48.20500000,07.89555556,434 +DM/BW-543,Heubachbuehl,,48.23277778,07.92083333,474 +DM/BW-544,Nimberg,,48.08777778,07.77611111,253 +DM/BW-545,Eichelspitze,,48.09249878,7.69579983,520 +DM/BW-546,Hochberg,,48.09500000,07.67361111,410 +DM/BW-547,Kaiserstuhl,,48.08361111,07.65361111,427 +DM/BW-548,Kirchberg,,48.08333333,07.62000000,296 +DM/BW-549,Haberberg,,48.10972222,07.59694444,291 +DM/BW-550,Katharinenberg,,48.11694444,07.68916667,492 +DM/BW-551,Hochberg,,48.12416667,07.62166667,289 +DM/BW-552,Eichert,,48.13027778,07.61388889,267 +DM/BW-553,Sulzberg,,48.31333333,07.87944444,387 +DM/BW-554,Ernet,,48.32333333,07.88222222,343 +DM/BW-555,Burghard,,48.33250000,07.88750000,331 +DM/BW-556,Hohberg,,48.32750000,07.90055556,354 +DM/BW-557,Mahlbuck,,48.35444444,07.91305556,433 +DM/BW-558,Schutterlindenberg,,48.34888889,07.85666667,297 +DM/BW-559,Steinfirst,,48.36944444,07.98111111,600 +DM/BW-560,Billibuch,,47.86777778,08.52000000,918 +DM/BW-561,Rossberg,,47.93833333,08.64333333,834 +DM/BW-562,Karlseichen,,47.95527778,08.61138889,736 +DM/BW-563,Kapf,,47.89694444,08.61416667,905 +DM/BW-564,Wiedberg,,47.87388889,08.63888889,787 +DM/BW-565,Schmiedsberg,,47.85583333,08.82555556,609 +DM/BW-566,Oberholz,,47.84416667,08.82472222,539 +DM/BW-567,Loh,,47.85138889,08.88833333,560 +DM/BW-568,Reschberg,,47.87138889,08.87833333,608 +DM/BW-569,Ballenberg,,47.85555556,08.74500000,710 +DM/BW-570,Neuhewen,,47.87916667,08.71777778,864 +DM/BW-570,Neuhewen,,47.87919998,8.71780014,864 +DM/BW-571,Kleinheppacher Kopf,,48.83444444,09.38416667,452 +DM/BW-572,Nonnenberg,,48.79027778,09.42944444,471 +DM/BW-573,Brennten,,48.77888889,09.52305556,503 +DM/BW-574,Frauenberg,,48.79111111,09.55583333,474 +DM/BW-575,Lemberg,,48.73750000,09.56722222,460 +DM/BW-576,Probst,,48.72277778,09.47805556,446 +DM/BW-577,Kernen,,48.78250000,09.31111111,513 +DM/BW-578,Frauenkopf,,48.76361111,09.20694444,462 +DM/BW-579,Warmbronner Kopf,,48.75638889,09.00500000,517 +DM/BW-580,Baumberg,,48.70388889,08.90750000,483 +DM/BW-581,Hochberg,,48.67527778,08.92166667,516 +DM/BW-582,Masenwald,,48.68444444,08.81250000,573 +DM/BW-583,Schneckenberg,,48.66750000,08.97277778,517 +DM/BW-584,Roetelberg,,48.61777778,08.93777778,556 +DM/BW-585,Steingart,,48.58083333,09.00444444,566 +DM/BW-586,Schoenbuchspitz,,48.56416667,08.97666667,546 +DM/BW-587,Alter Berg,,48.53638889,08.97055556,431 +DM/BW-588,Hornkopf,,48.54972222,09.01055556,515 +DM/BW-589,Heuberg,,48.54472222,09.03750000,498 +DM/BW-590,Kirnberg,,48.55805556,09.07388889,465 +DM/BW-591,Eichenfirst,,48.57666667,09.10555556,502 +DM/BW-592,Duerrenberg,,48.55194444,09.15638889,433 +DM/BW-593,Betzenberg,,48.61694444,09.14333333,500 +DM/BW-594,Uhlberg,,48.63527778,09.20583333,469 +DM/BW-595,Federlesmahd,,48.68166667,09.14083333,495 +DM/BW-596,Hohenwart,,48.68194444,09.09750000,498 +DM/BW-597,Schenkenburg,,48.26083333,08.61027778,589 +DM/BW-598,Kapf,,48.26583333,08.60777778,600 +DM/BW-599,Hummelberg,,48.31027778,08.61138889,616 +DM/BW-600,Hohberg,,48.43694444,08.58444444,653 +DM/BW-601,Altheimer Heiligenwald,,48.50472222,08.61583333,691 +DM/BW-602,Riedhalde,,48.46055556,08.57638889,714 +DM/BW-603,Tann,,48.53416667,08.64138889,614 +DM/BW-604,Kapf,,48.54111111,08.64944444,594 +DM/BW-605,Lindberg,,48.53805556,08.71500000,521 +DM/BW-606,Schlossberg,,48.55638889,08.71416667,533 +DM/BW-607,Huehnerberg,,49.23888889,08.97194444,290 +DM/BW-608,Wilhau,,49.26388889,08.72388889,245 +DM/BW-609,Schmeisenberg,,49.19416667,08.69138889,223 +DM/BW-610,Hohberg,,49.18694444,08.69083333,218 +DM/BW-611,Schwallenberg,,49.16083333,08.67916667,215 +DM/BW-612,Kallenberg,,49.17500000,08.66000000,176 +DM/BW-613,Waschloch,,49.17861111,08.77527778,235 +DM/BW-614,Strassberg,,49.26194444,09.00805556,289 +DM/BW-615,Kuehnberg,,49.30944444,08.91138889,231 +DM/BW-616,Reichertsberg,,49.30916667,09.11416667,294 +DM/BW-617,Wetschberg,,49.34360123,9.07030010,324 +DM/BW-618,Mittelberg,,49.39000000,09.05527778,265 +DM/BW-619,Goldberg,,49.34194444,09.26416667,334 +DM/BW-620,Hermannsberg,,49.41166667,09.22250000,318 +DM/BW-621,Henschelberg,,49.36055556,09.13916667,288 +DM/BW-622,Hamberg,,49.35194444,09.12083333,270 +DM/BW-623,Dachsberg,,49.31000000,09.20361111,305 +DM/BW-624,Ottenberg,,47.95416667,08.04277778,1041 +DM/BW-625,Frauensteigfels,,47.95166667,08.00333333,783 +DM/BW-626,Sonneck,,47.94583333,07.98250000,758 +DM/BW-627,Roteck,,47.92111111,08.00527778,1156 +DM/BW-628,Hundsruecken,,47.91944444,07.90944444,1234 +DM/BW-629,Trubelsmattkopf,,47.86750000,07.88777778,1281 +DM/BW-630,Hasbacher Hoehe,,47.83138889,07.91722222,1149 +DM/BW-631,Rotspitz,,47.82777778,07.87416667,1236 +DM/BW-632,Dietschel,,47.83833333,07.85500000,1241 +DM/BW-633,Heidstein,,47.83610153,7.84250021,1274 +DM/BW-634,Ruehgartenwald,,47.82722222,07.84333333,1246 +DM/BW-635,Breitnauer Kopf,,47.85580063,7.84000015,1121 +DM/BW-636,Kaibenkopf,,47.81527778,07.76611111,940 +DM/BW-637,Schneckenkopf,,47.77055556,07.91055556,997 +DM/BW-638,Gscheidkopf,,47.77000000,07.92194444,1064 +DM/BW-639,Hochgescheid,,47.77360153,7.93970013,1205 +DM/BW-640,Bloessling,,47.79444444,08.00444444,1310 +DM/BW-641,Hohe Zinken,,47.78305556,08.00416667,1242 +DM/BW-642,Hochkopf,,47.76720047,7.98670006,1263 +DM/BW-643,Haegelesberg,,48.54472222,09.89611111,634 +DM/BW-644,Kuhberg,,48.58638889,10.01916667,652 +DM/BW-645,Mittelberg,,48.59555556,10.00583333,655 +DM/BW-646,Hochberg,,48.66888889,10.10750000,645 +DM/BW-647,Schmittenberg,,48.68472222,10.16638889,588 +DM/BW-648,Bernhau,,48.64527778,10.17611111,597 +DM/BW-649,Kagberg,,48.59361111,10.21388889,510 +DM/BW-650,Rudelsberg,,48.72722222,10.18888889,645 +DM/BW-651,Wollenberg,,48.75833333,10.08166667,710 +DM/BW-652,Woellerstein,,48.85833333,10.17833333,723 +DM/BW-653,Gruenenberg,,48.84749985,10.14249992,733 +DM/BW-654,Heulenberg,,48.83194444,10.13722222,715 +DM/BW-655,Baerenberg,,48.76388889,09.97722222,755 +DM/BW-656,Rosenstein,,48.79583333,09.96611111,720 +DM/BW-657,Schoener Berg,,48.71333333,09.93250000,746 +DM/BW-658,Luetzelalb,,48.71138889,09.89444444,747 +DM/BW-659,Kaltes Feld,,48.73500000,09.85000000,781 +DM/BW-660,Schoenberg,,48.73527778,09.83027778,629 +DM/BW-661,Stuifen,,48.74330139,9.81859970,757 +DM/BW-662,Zwerenberg,,48.74305556,09.89972222,777 +DM/BW-663,Galgenberg,,48.71861111,09.87000000,717 +DM/BW-664,Wasserberg,,48.63666667,09.71194444,751 +DM/BW-665,Fraenkel,,48.64361111,09.74166667,681 +DM/BW-666,Tegel,,48.64333333,09.81555556,689 +DM/BW-667,Dalisberg,,48.63361111,09.73500000,746 +DM/BW-668,Nordalb,,48.61638889,09.71388889,762 +DM/BW-669,Weigoldberg,,48.61222222,09.75027778,711 +DM/BW-670,Duchstetten,,48.58861111,09.74611111,786 +DM/BW-671,Leimberg,,48.58888889,09.68111111,747 +DM/BW-672,Schlossberg,,48.58000000,09.70055556,717 +DM/BW-673,Hochbuch,,48.48166667,09.72305556,763 +DM/BW-674,Hugsbuch,,48.47694444,09.65583333,813 +DM/BW-675,Rosshaeuptle,,48.32722222,09.37666667,824 +DM/BW-676,Hausberg,,48.30833333,09.40250000,794 +DM/BW-677,Kohlberg,,48.27861111,09.68638889,571 +DM/BW-678,Doppberg,,48.26750000,09.65166667,589 +DM/BW-679,Egelsberg,,48.36138889,09.75361111,685 +DM/BW-680,Erzberg,,48.35333333,09.75361111,631 +DM/BW-681,Schelklinger Berg,,48.36194444,09.73027778,653 +DM/BW-682,Butzen,,48.54472222,09.72500000,781 +DM/BW-683,Dutzenberg,,48.55083333,09.74416667,740 +DM/BW-684,Floriansberg,,48.55333333,09.30888889,522 +DM/BW-685,Weinberg,,48.54111111,09.29861111,488 +DM/BW-686,Hofbuehl,,48.53861111,09.31250000,510 +DM/BW-687,Galgenberg,,48.50638889,09.34472222,827 +DM/BW-688,Hoernle,,48.54333333,09.35388889,707 +DM/BW-689,Jusiberg,,48.55000000,09.33916667,673 +DM/BW-690,Fichenfirst,,48.58083333,09.35666667,483 +DM/BW-691,Kleinbergle,,48.61861111,09.25916667,371 +DM/BW-692,Benzberg,,48.64000000,09.28305556,384 +DM/BW-693,Engelberg,,48.57777778,09.40861111,528 +DM/BW-694,Hohenneuffen,,48.55583333,09.39305556,743 +DM/BW-695,Teck,,48.58829880,9.47029972,775 +DM/BW-696,Uhlberg,,49.58444444,09.59555556,362 +DM/BW-697,Gissigheimer Hoehe,,49.60361111,09.59972222,370 +DM/BW-698,Hussenbacher Hoehe,,49.61027778,09.60083333,371 +DM/BW-699,Stammberg,,49.62527778,09.62944444,338 +DM/BW-700,Hoehberg,,49.61222222,09.65833333,308 +DM/BW-701,Seilingsberg,,49.59777778,09.75111111,339 +DM/BW-702,Hohe Hardt,,49.61750000,09.77250000,350 +DM/BW-703,Oberer Berg,,49.76222222,09.45638889,361 +DM/BW-704,Unterer Berg,,49.77250000,09.42583333,386 +DM/BW-705,Grosser Wald,,49.75722222,09.36055556,441 +DM/BW-706,Bulau,,49.53527778,09.29250000,411 +DM/BW-707,Buchenberg,,49.50416667,09.37361111,422 +DM/BW-708,Deusterberg,,49.51138889,09.40027778,387 +DM/BW-709,Sindolsheimer Hoehe,,49.50944444,09.47416667,394 +DM/BW-710,Geissberg,,48.84333333,08.85138889,509 +DM/BW-711,Dickenberg,,48.81500000,08.86916667,479 +DM/BW-712,Maiberg,,48.78111111,08.86527778,467 +DM/BW-713,Schallberg,,48.77138889,08.86861111,452 +DM/BW-714,Hoher Acker,,48.84055556,08.93972222,438 +DM/BW-715,Laengenbuehl,,48.78055556,08.96361111,480 +DM/BW-716,Eltinger Kopf,,48.77666667,08.98388889,519 +DM/BW-717,Lotterberg,,48.83138889,09.09750000,395 +DM/BW-718,Hart,,48.81055556,09.09555556,341 +DM/BW-719,Kaltenberg,,48.85194444,09.12972222,362 +DM/BW-720,Lemberg,,48.81722222,09.13083333,384 +DM/BW-721,Kupferhalden,,49.04972222,08.82194444,304 +DM/BW-722,Humsterberg,,49.08055556,08.82583333,245 +DM/BW-723,Altenberg,,49.08416667,08.87555556,324 +DM/BW-724,Eichelberg,,48.99638889,08.85083333,367 +DM/BW-725,Scheuelberg,,49.02055556,08.82750000,382 +DM/BW-726,Gleichenberg,,49.01111111,08.88750000,379 +DM/BW-727,Burgberg,,48.98694444,08.88305556,390 +DM/BW-728,Mettenberg,,49.02027778,08.87805556,377 +DM/BW-729,Teufelsberg,,49.00361111,09.03722222,402 +DM/BW-730,Dornberg,,49.10833333,09.27833333,345 +DM/BW-731,Reisberg,,49.11666667,09.29722222,378 +DM/BW-732,Foehrenberg,,49.11944444,09.33777778,288 +DM/BW-733,Wolfsberg,,49.09194444,09.33888889,377 +DM/BW-734,Kohlebene,,49.07888889,09.34750000,378 +DM/BW-735,Sandberg,,49.08916667,09.36972222,432 +DM/BW-736,Eisenberg,,49.10250000,09.36250000,369 +DM/BW-737,Horkenberg,,49.09527778,09.43750000,549 +DM/BW-738,Stangenberg,,49.08722222,09.45055556,559 +DM/BW-739,Railelberg,,49.07888889,09.45277778,561 +DM/BW-740,Steinberg,,49.07111111,09.46500000,566 +DM/BW-741,Hohbuehl,,49.02611111,09.58611111,547 +DM/BW-742,Heidenbuckel,,49.03111111,09.58055556,536 +DM/BW-743,Flinsberg,,49.02194444,09.63555556,535 +DM/BW-744,Muehlberg,,49.16722222,09.67000000,523 +DM/BW-745,Hirtenberg,,49.12694444,10.14222222,542 +DM/BW-746,Hornberg,,49.17416667,10.10500000,466 +DM/BW-747,Hohberg,,49.00666667,08.57611111,254 +DM/BW-748,Heulenberg,,49.00333333,08.55222222,207 +DM/BW-749,Hopfenberg,,48.99777778,08.52638889,266 +DM/BW-750,Stranzenberg,,48.97777778,08.56638889,274 +DM/BW-751,Wallkopf,,48.94083333,08.42750000,338 +DM/BW-752,Heustaett,,48.95805556,08.60222222,285 +DM/BW-753,Ebb,,48.94027778,08.61166667,304 +DM/BW-754,Oberwald,,48.91416667,08.57722222,286 +DM/BW-755,Kirchberg,,48.92361111,08.64666667,342 +DM/BW-756,Grundreisig,,49.01138889,08.66027778,286 +DM/BW-757,Loeschberg,,49.01250000,08.68777778,270 +DM/BW-758,Fraueneich,,49.02750000,08.60555556,254 +DM/BW-759,Schlohberg,,49.02638889,08.63666667,257 +DM/BW-760,Hinterwald,,49.03527778,08.61222222,263 +DM/BW-761,Hammberg,,49.05638889,08.73722222,266 +DM/BW-762,Kasselersberg,,47.81611111,10.04916667,727 +DM/BW-763,Herrenberg,,47.73388889,10.10166667,931 +DM/BW-764,Hokopf,,47.70250000,10.09944444,1035 +DM/BW-765,Silberfelsen,,47.83111111,08.08500000,1277 +DM/BW-766,Hohwildsberg,,47.75220108,7.73920012,1084 +DM/BW-767,Hohe Stueckbaeume,,47.71638889,07.72166667,939 +DM/BW-768,Scheinberg,,47.67250000,07.78138889,619 +DM/BW-769,Haefnet,,47.66859818,7.74970007,545 +DM/BW-770,Schindelberg,,47.63416667,07.70916667,418 +DM/BW-771,Mauerhaldenbuck,,47.63500000,07.78750000,493 +DM/BW-772,Hohe Flum,,47.62694444,07.81138889,536 +DM/BW-773,Welschberg,,47.62694444,07.81138889,520 +DM/BW-774,Schanze,,47.66611111,07.91416667,784 +DM/BW-775,Haeuleoekopf,,47.65694444,07.93361111,787 +DM/BW-776,Abhau,,47.65222222,07.96638889,1018 +DM/BW-777,Kraehenbuehl,,47.59361111,07.90527778,404 +DM/BW-778,Altenhau,,47.59861111,07.89555556,459 +DM/BW-779,Hornberg,,47.60861111,07.84027778,476 +DM/BW-780,Nettenberg,,47.57472222,07.75166667,445 +DM/BW-781,Eichberg,,47.57944444,07.73888889,478 +DM/BW-782,Hirzenleck,,47.56689835,7.73439980,523 +DM/BW-783,Roetelsteinfelsen,,47.55694444,07.67527778,434 +DM/BW-784,Kaeferholz,,47.61000000,07.63805556,460 +DM/BW-785,Homburg,,47.62111111,07.68583333,430 +DM/BW-786,Klaiser,,47.58194444,07.69222222,489 +DM/BW-787,Buttenberg,,47.59805556,07.69833333,485 +DM/BW-788,Mezelhoehe,,47.60916667,07.71194444,485 +DM/BW-789,Katzenberg,,47.67833333,07.58166667,393 +DM/BW-790,Hohe Schule,,47.72277778,07.61527778,470 +DM/BW-791,Holzeneinig,,47.68166667,07.63166667,371 +DM/BW-792,Behlen,,47.70470047,7.63420010,437 +DM/BW-793,Stocken,,47.74138889,07.62527778,458 +DM/BW-794,Ruettenen,,47.74527778,07.64500000,543 +DM/BW-795,Steineck,,47.74250000,07.65722222,550 +DM/BW-796,Laubrain,,47.73805556,07.68916667,565 +DM/BW-797,Mohrensattel,,47.72472222,07.67333333,556 +DM/BW-798,Burgberg,,47.73722222,07.70166667,663 +DM/BW-799,Grossholz,,47.75361111,07.70361111,848 +DM/BW-800,Juchskopf,,47.70277778,07.68138889,572 +DM/BW-801,Munzenberg,,47.69469833,7.70249987,702 +DM/BW-802,Koepfle,,47.70472222,07.75305556,759 +DM/BW-803,Vollen,,47.70527778,07.78194444,743 +DM/BW-804,Klaefferbuck,,47.70111111,07.81027778,660 +DM/BW-805,Tannenbuehl,,47.69805556,07.82277778,727 +DM/BW-806,Gebetsbuehl,,47.71444444,07.83527778,699 +DM/BW-807,Schloettleberg,,47.72861111,07.73972222,988 +DM/BW-808,Hoernle,,47.75083333,07.78861111,912 +DM/BW-809,Frommensried,,47.72944444,07.82972222,940 +DM/BW-810,Grueneck,,47.77027778,07.67194444,705 +DM/BW-811,Hurrberg,,47.77861111,07.59805556,371 +DM/BW-812,Steinacker,,47.77666667,07.61055556,439 +DM/BW-813,Lipberg,,47.78944444,07.66027778,461 +DM/BW-814,Eich,,47.79166667,07.64944444,386 +DM/BW-815,Steinberg,,47.81250000,07.67083333,530 +DM/BW-816,Lausberg,,47.81611111,07.70250000,689 +DM/BW-817,Katzenstuhl,,47.85638889,07.73111111,591 +DM/BW-818,Fohrenberg,,47.86027778,07.71083333,332 +DM/BW-819,Enggengruendler Kopf,,47.84722222,07.72777778,704 +DM/BW-820,Etzenbacher Hoehe,,47.87722222,07.76055556,725 +DM/BW-821,Roedelsburg,,47.87750000,07.78138889,773 +DM/BW-822,Ruine Staufen,,47.88638889,07.73194444,375 +DM/BW-823,Streilbanner Kopf,,47.90277778,07.81555556,698 +DM/BW-824,Kreuzkopf,,47.96472222,07.84611111,526 +DM/BW-825,Illenberg,,47.95055556,07.85527778,643 +DM/BW-826,Taubenkopf,,47.93416667,07.89000000,881 +DM/BW-827,Laubiskopf,,47.95083333,07.92472222,683 +DM/BW-828,Junghof,,47.95916667,07.91722222,557 +DM/BW-829,Kibfelsen,,47.96329880,7.88719988,833 +DM/BW-830,Uhlberg,,48.01888889,07.89305556,618 +DM/BW-831,Ruine Zaehringen,,48.02527778,07.88416667,478 +DM/BW-832,Hornbuehl,,48.01388889,07.92638889,727 +DM/BW-833,Flisserkopf,,48.04555556,07.91777778,506 +DM/BW-834,Flaunser,,48.02194444,07.95388889,866 +DM/BW-835,Lindenberg,,48.00333333,08.02111111,814 +DM/BW-836,Graetlewald,,47.99555556,07.99722222,687 +DM/BW-837,Langeck,,48.02222222,08.00611111,862 +DM/BW-838,Stalzenberg,,48.06805556,07.95000000,649 +DM/BW-839,Kranzkopf,,48.06333333,07.97166667,816 +DM/BW-840,Hornbuehl,,48.07361111,07.93805556,519 +DM/BW-841,Voegelestein,,48.12027778,07.97305556,607 +DM/BW-842,Himmelberg,,48.25166667,07.99111111,547 +DM/BW-843,Brandbuehl,,48.25027778,07.96361111,443 +DM/BW-844,Windkapf,,48.18361111,08.29305556,926 +DM/BW-845,Hummelskopf,,47.98166667,08.76500000,867 +DM/BW-846,Burg Hohenzollern,,48.32360077,8.96749973,850 +DM/HE-001,Wasserkuppe,,50.49860001,9.93610001,950 +DM/HE-002,Hohe Hoelle,,50.42860031,9.96140003,894 +DM/HE-003,Grosser Feldberg,,50.23360062,8.45779991,879 +DM/HE-004,Pferdskopf,,50.49194444,09.92222222,875 +DM/HE-005,Langenberg,,51.27722222,08.55916667,843 +DM/HE-006,Ettelsberg,,51.27777778,08.59777778,838 +DM/HE-007,Milseburg,,50.54555556,09.89861111,835 +DM/HE-008,Schafstein,,50.50277778,09.97500000,832 +DM/HE-009,Hopperkopf,,51.24861111,08.60000000,831 +DM/HE-010,Kleiner Feldberg,,50.22222222,08.44694444,825 +DM/HE-011,Simmelsberg,,50.43000000,09.93750000,818 +DM/HE-012,Ehrenberg,,50.51500000,09.99083333,817 +DM/HE-013,Eubeberg,,50.47888889,09.91805556,817 +DM/HE-014,Feldberg/Rhoen,,50.47194444,09.95083333,815 +DM/HE-015,Altkoenig,,50.21250000,08.48138889,798 +DM/HE-016,Weiherberg,,50.51861111,09.91222222,786 +DM/HE-017,Taufstein,,50.51805556,09.23916667,773 +DM/HE-018,Meissner,,51.22805556,09.86388889,754 +DM/HE-019,Buchschirmberg,,50.57388889,10.03000000,740 +DM/HE-020,Dommel,,51.33250000,08.67111111,738 +DM/HE-021,Teufelsstein,,50.51777778,09.89416667,729 +DM/HE-022,Maulkuppe,,50.52805556,09.87777778,706 +DM/HE-023,Wuestegarten,,51.01638889,09.08416667,675 +DM/HE-024,Rodenbacher Kuppe,,50.43722222,09.92527778,680 +DM/HE-025,Sackpfeife,,50.95638889,08.53916667,674 +DM/HE-026,Ebersberg,,50.47444444,09.85138889,689 +DM/HE-027,Wachtkueppel,,50.47000000,09.89166667,706 +DM/HE-028,Pferdskopf,,50.29111111,08.43527778,663 +DM/HE-029,Hohes Lohr,,51.02610016,9.02169991,657 +DM/HE-030,Hohe Warte,,51.05416667,08.53000000,645 +DM/HE-031,Buchholz,,50.96083333,08.49111111,643 +DM/HE-032,Hirschberg,,51.24330139,9.75860023,638 +DM/HE-033,Eckweisbacher Kuppe,,50.58638889,09.96277778,642 +DM/HE-034,Nordhoell,,50.86555556,08.26333333,641 +DM/HE-035,Bielstein,,51.28583333,09.78750000,641 +DM/HE-036,Grosse Aschkoppe,,51.06969833,9.02830029,640 +DM/HE-037,Eisenberg,,50.88830185,9.51809978,636 +DM/HE-038,Widdehagen,,51.30916667,08.77250000,635 +DM/HE-039,Knuellkopf,,50.91472222,09.42972222,634 +DM/HE-040,Herzberg,,50.25833333,08.52888889,591 +DM/HE-041,Hainpracht,,50.94000000,08.52472222,631 +DM/HE-042,Soisberg,,50.78916667,09.88444444,630 +DM/HE-043,Traddelkopf,,51.13249969,8.97749996,626 +DM/HE-043,Traddelkopf,,51.13250000,08.97750000,626 +DM/HE-044,Kalte Herberge,,50.05555556,08.00333333,619 +DM/HE-045,Hohe Wurzel,,50.11249924,8.12969971,618 +DM/HE-046,Hohes Gras,,51.30720139,9.35579967,615 +DM/HE-047,Auenberg,,51.06638889,09.07750000,611 +DM/HE-048,Angelburg,,50.78888889,08.43055556,609 +DM/HE-049,Bubenberg,,51.01689911,8.55169964,608 +DM/HE-050,Hausfirste,,51.30694444,09.76888889,607 +DM/HE-051,Hainbacher Hoehe,,50.83944444,08.21138889,606 +DM/HE-052,Bilstein,,50.49694444,09.20361111,666 +DM/HE-053,Neunkirchner Hoehe,,49.71969986,8.77169991,605 +DM/HE-054,Grosser Baerenberg,,51.35329819,9.26780033,600.7 +DM/HE-055,Heidkueppel,,50.46388889,09.83083333,600 +DM/HE-056,Die Hoeh,,50.74083333,08.11027778,598 +DM/HE-057,Hardberg,,49.53829956,8.80529976,593 +DM/HE-058,Rimberg,,50.79305556,09.46666667,592 +DM/HE-059,Hohe Kanzel,,50.16194444,08.26611111,592 +DM/HE-060,Burg,,50.73972222,08.06694444,591 +DM/HE-061,Eschenburg,,50.78861111,08.34527778,589 +DM/HE-062,Koepfchen,,50.88583333,09.43194444,588 +DM/HE-064,Jeust,,50.98888889,09.03805556,583 +DM/HE-065,Erbacher Kopf,,50.06888889,08.03555556,580 +DM/HE-066,Doernberg,,51.35499954,9.34809971,579 +DM/HE-067,Goldener Steinrueck,,50.60250000,09.24611111,578 +DM/HE-068,Tromm,,49.60527778,08.80472222,577 +DM/HE-069,Langhals,,50.27888889,08.48833333,574 +DM/HE-070,Suhl,,50.66329956,9.83810043,572 +DM/HE-071,Steinkopf,,50.19250000,08.43333333,570 +DM/HE-072,Hohestein,,51.25055556,10.04000000,569 +DM/HE-073,Talgang,,51.10972222,08.95638889,566 +DM/HE-074,Eisenberg,,51.25194444,08.82833333,569 +DM/HE-075,Schwarzenberg,,50.88916667,08.49416667,561 +DM/HE-076,Hemmrain,,50.78555556,08.26305556,561 +DM/HE-077,Grosser Nickus,,50.35138889,09.68944444,558 +DM/HE-078,Naxburg,,50.44972222,09.39222222,554 +DM/HE-079,Baerberg,,50.92611111,09.39138889,554 +DM/HE-080,Semmelberg,,50.92805556,09.50166667,553 +DM/HE-081,Horst,,50.46527778,09.39777778,553 +DM/HE-082,Alheimer,,51.03777778,09.73250000,549 +DM/HE-083,Roehrberg,,51.03555556,08.55222222,547 +DM/HE-084,Falkenberg,,49.54333333,09.02111111,546 +DM/HE-085,Lindenberg,,50.23527778,08.52138889,541 +DM/HE-086,Eschenberg,,50.92750000,09.46916667,535 +DM/HE-087,Stallberg,,50.71829987,9.84249973,554 +DM/HE-088,Homberg,,51.11970139,9.08889961,528 +DM/HE-089,Bielstein,,51.25109863,9.65999985,528 +DM/HE-090,Kuhbett,,50.32916667,08.32861111,526 +DM/HE-091,Rueckersberg,,50.73939896,9.81750011,525 +DM/HE-092,Dreienberg,,50.87440109,9.86810017,524 +DM/HE-093,Silberberg,,50.95277778,09.41888889,524 +DM/HE-094,Isthaberg,,51.31829834,9.21920013,523 +DM/HE-095,Kleinberg,,50.73609924,9.87559986,522 +DM/HE-096,Aschenberg,,50.99416667,09.50666667,521 +DM/HE-097,Steinkopf,,50.32777778,08.66166667,518 +DM/HE-098,Morsberg,,49.70859909,8.90060043,517 +DM/HE-099,Rossert,,50.16444444,08.40111111,516 +DM/HE-100,Wattenberg,,51.29694444,09.27416667,516 +DM/HE-101,Rabenkuppe,,51.11719894,10.10140038,515 +DM/HE-102,Felsberg,,49.73055556,08.68527778,514 +DM/HE-103,Boyneburg,,51.10189819,10.01080036,513 +DM/HE-104,Huenstein,,50.80388889,08.53500000,504 +DM/HE-105,Katzenstirn,,51.08359909,9.67329979,501 +DM/HE-106,Auerberg,,50.71638889,09.37444444,501 +DM/HE-107,Geiskopf,,50.97944444,09.60111111,497 +DM/HE-108,Rimberg,,50.84249878,8.62940025,497 +DM/HE-109,Gebrannter Kopf,,50.92388889,09.61555556,494 +DM/HE-110,Steinberg,,50.66277778,09.46694444,494 +DM/HE-111,Saengersberg,,50.64189911,9.53999996,494 +DM/HE-112,Weidelsberg,,51.27305556,09.14500000,492 +DM/HE-113,Himmelsberg,,50.51277778,09.54222222,490 +DM/HE-114,Rehkopf,,51.00138889,09.60444444,488 +DM/HE-115,Ibrakuppe,,50.83500000,09.49972222,487 +DM/HE-116,Muehlberg,,50.56916667,09.39638889,486 +DM/HE-117,Heerhain,,50.53083333,09.37027778,486 +DM/HE-118,Hausberg,,50.41250000,08.61611111,486 +DM/HE-119,Geiersberg,,49.54027778,08.88666667,485 +DM/HE-120,Eisenberg,,50.69860077,9.50059986,484 +DM/HE-121,Rosskopf,,51.28079987,9.91499996,482 +DM/HE-122,Winterstein,,50.33388889,08.66722222,482 +DM/HE-123,Franzosenkopf,,50.14972222,09.22638889,481 +DM/HE-124,Brenzelshoehe,,50.97000000,09.67861111,481 +DM/HE-125,Stellerskuppe,,50.87220001,9.61810017,481 +DM/HE-126,Plesse,,51.19083333,10.19750000,480 +DM/HE-127,Toter Mann,,50.90079880,9.84189987,480 +DM/HE-128,Eichelsberg,,51.04277778,09.56027778,480 +DM/HE-129,Hundsrueck,,51.14440155,10.06079960,478 +DM/HE-130,Herzberg,,51.00111111,09.95555556,478 +DM/HE-131,Auf der Schaerfe,,51.36916667,09.88250000,478 +DM/HE-132,Biberstein,,50.57305556,09.85027778,477 +DM/HE-133,Schreckenberg,,51.38361111,09.31722222,475 +DM/HE-134,Rosskuppe,,50.62166667,09.76166667,475 +DM/HE-135,Wollenberg,,50.87189865,8.67000008,474 +DM/HE-136,Mengshaeuser Kuppe,,50.78860092,9.64970016,476 +DM/HE-137,Gahrenberg,,51.44469833,9.57190037,472 +DM/HE-138,Staufenberg,,51.50833333,09.56166667,472 +DM/HE-139,Steinkopf,,51.02277778,09.55305556,472 +DM/HE-140,Hemmerich,,50.73166667,08.56361111,470 +DM/HE-141,Landenhaeuser Stein,,50.57694444,09.45916667,469 +DM/HE-142,Rammelsberg,,51.09444444,09.76472222,467 +DM/HE-143,Wildsberg,,51.09194444,09.58277778,467 +DM/HE-144,Allmutsberg,,51.00222222,09.45083333,463 +DM/HE-145,Spitzhuette,,50.98361111,09.93500000,462 +DM/HE-146,Selbergshoehe,,51.16583333,08.77861111,460 +DM/HE-147,Lohwald,,50.58555556,09.34722222,456 +DM/HE-148,Schwalbenkopf,,50.91750000,09.86305556,455 +DM/HE-149,Griechenkopf,,51.14166667,08.82027778,454 +DM/HE-150,Escheberg,,50.36388889,09.58472222,452 +DM/HE-151,Staufen,,50.14166667,08.41555556,451 +DM/HE-152,Homberg,,50.72972222,09.32333333,450 +DM/HE-153,Escheberg,,51.40416667,09.24166667,449 +DM/HE-154,Karnberg,,51.16638889,10.20500000,447 +DM/HE-155,Orthberg,,51.05194444,09.13277778,447 +DM/HE-156,Haukuppe,,50.90916667,09.66861111,446 +DM/HE-157,Ziegenkueppel,,51.11000000,09.85833333,445 +DM/HE-158,Wolkenbrust,,50.61500000,09.14500000,445 +DM/HE-159,Alteburg,,50.67333333,08.38277778,445 +DM/HE-160,Hornungskuppe,,50.90638889,09.97972222,444 +DM/HE-161,Bracht,,51.11527778,08.89305556,442 +DM/HE-162,Altenberg,,50.63777778,08.51777778,442 +DM/HE-163,Gibgeskuppe,,50.75694444,09.53694444,438 +DM/HE-164,Roteberg,,50.87611111,09.81027778,434 +DM/HE-165,Altenburg,,51.04527778,09.21083333,433 +DM/HE-166,Kuehlestuhl,,51.34916667,09.76138889,433 +DM/HE-167,Koehlerberg,,50.46833333,08.52277778,425 +DM/HE-168,Spitzenberg,,51.13333333,09.99583333,423 +DM/HE-169,Wernerstein,,50.36055556,09.27944444,420 +DM/HE-170,Laerchenberg,,50.61083333,09.45055556,415 +DM/HE-171,Maeuseberg,,51.13361111,09.88555556,415 +DM/HE-172,Hauberg,,50.79416667,09.77555556,413 +DM/HE-173,Wasserberg,,50.96694444,08.79444444,412 +DM/HE-174,Kreuzberg,,50.56527778,08.25944444,411 +DM/HE-175,Hueppelsberg,,51.12527778,10.01805556,410 +DM/HE-176,Vier Fichten,,50.24972222,09.23972222,406 +DM/HE-177,Mardorfer Kuppe,,50.73500000,08.92888889,407 +DM/HE-178,Rehkuppe,,50.81833333,09.60944444,404 +DM/HE-179,Hesselkopf,,50.99805556,09.87833333,403 +DM/HE-180,Bilskuppe,,50.67583333,09.39305556,403 +DM/HE-181,Stoppelberg,,50.53079987,8.52670002,401 +DM/HE-182,Heidenhaeuschen,,50.48469925,8.08220005,398 +DM/HE-182,Heidenhaeuschen,,50.48472222,08.08222222,398 +DM/HE-183,Teufelsberg,,50.95305556,09.12722222,397 +DM/HE-184,Sebbel,,50.82055556,09.40111111,394 +DM/HE-185,Heiligenberg,,51.13361111,09.45916667,393 +DM/HE-186,Leidenhoefer Kopf,,50.70805556,08.81444444,393 +DM/HE-187,Galgenberg,,50.18805556,09.24972222,393 +DM/HE-188,Heuberg,,51.52080154,9.34939957,392 +DM/HE-189,Quast,,51.49166667,09.03777778,392 +DM/HE-190,Eichelkopf,,50.25444444,09.19000000,386 +DM/HE-191,Kretenberg,,50.72722222,09.17416667,384 +DM/HE-192,Hardtkueppel,,50.36027778,08.38777778,384 +DM/HE-193,Steinroede,,50.31527778,09.15194444,377 +DM/HE-194,Hoher Rain,,51.16833333,10.11555556,376 +DM/HE-195,Grosser Steinkopf,,50.93000000,09.82416667,375 +DM/HE-196,Noll,,50.65444444,08.93361111,371 +DM/HE-197,Kirchberg,,50.76638889,08.59111111,362 +DM/HE-198,Klingelskopf,,49.80388889,08.92888889,361 +DM/HE-199,Bieler Burg,,50.57305556,08.37777778,359 +DM/HE-200,Alte Hoehe,,49.85611111,08.98250000,358 +DM/HE-201,Koppe,,50.63750000,08.37500000,354 +DM/HE-202,Gerstenberg,,50.92888889,09.30416667,353 +DM/HE-203,Suessekopf,,50.56305556,09.02333333,350 +DM/HE-204,Grauenstein,,50.47611111,08.35750000,349 +DM/HE-205,Koenigstuhl,,50.61138889,08.57027778,348 +DM/HE-206,Nellenberg,,50.83861111,09.11777778,345 +DM/HE-207,Globerg,,50.74527778,09.13583333,344 +DM/HE-208,Ziegenberg,,50.99000000,09.81666667,333 +DM/HE-209,Hermanskopf,,50.71361111,08.99444444,331 +DM/HE-210,Nollig,,50.05194444,07.79527778,331 +DM/HE-211,Kanzel,,50.47527778,08.42444444,326 +DM/HE-212,Stein,,50.89694444,08.79416667,306 +DM/HE-213,Hangelstein,,50.63111111,08.72833333,305 +DM/HE-214,Steinbuegel,,50.50694444,08.99500000,295 +DM/HE-215,Hubberg,,50.49083333,08.98277778,289 +DM/HE-216,Batzenberg,,51.01611111,09.34166667,276 +DM/HE-217,Herkules,,51.31638889,09.39277778,535 +DM/HE-218,Huettenberg,,51.31305556,09.39527778,555 +DM/HE-219,Brasselsberg,,51.29000000,09.40750000,434 +DM/HE-220,Hirzstein,,51.28750000,09.37527778,502 +DM/HE-221,Baunsberg,,51.26888889,09.40916667,410 +DM/HE-222,Schauenburg,,51.28472222,09.33305556,500 +DM/HE-223,Saukopf,,51.27027778,09.32611111,511 +DM/HE-224,Grosser Gudenberg,,51.36666667,09.27138889,569 +DM/HE-225,Kleiner Gudenberg,,51.36972222,09.26611111,532 +DM/HE-226,Grosser Schreckenberg,,51.37805556,09.30833333,450 +DM/HE-227,Kleiner Schreckenberg,,51.38333333,09.26611111,475 +DM/HE-228,Schartenberg,,51.39222222,09.31111111,404 +DM/HE-229,Elfbuchen,,51.33027778,09.39333333,535 +DM/HE-230,Grosser Steinhaufen,,51.31500000,09.36138889,597 +DM/HE-231,Rosenberg,,51.33027778,09.26888889,472 +DM/HE-232,Kloster Hasungen,,51.32333333,09.26888889,480 +DM/HE-233,Helfenstein,,51.36222222,09.34861111,510 +DM/HE-234,Hohlestein,,51.35083333,09.36388889,477 +DM/HE-235,Grosser Auskopf,,51.32833333,09.34027778,513 +DM/HE-236,Igelsburg,,51.33583333,09.36861111,466 +DM/HE-237,Grosser Steinberg,,51.35694444,09.70194444,542 +DM/HE-238,Kleiner Steinberg,,51.36611111,09.69916667,477 +DM/HE-239,Franzosentriesch,,51.22527778,09.61611111,484 +DM/HE-240,Breiter Berg,,51.18472222,09.67861111,533 +DM/HE-241,Himmelsberg,,51.17805556,09.69333333,564 +DM/HE-242,Warpel,,51.22583333,09.53444444,439 +DM/HE-243,Schorn,,51.22388889,09.52388889,457 +DM/HE-244,Dennhaeuser Huette,,51.24000000,09.49861111,325 +DM/HE-245,Niedensteiner Kopf,,51.23527778,09.32083333,475 +DM/HE-246,Sengelsberg,,51.24472222,09.31944444,449 +DM/HE-247,Steinberg,,51.25222222,09.93833333,419 +DM/HE-248,Falkenstein,,51.25388889,09.29583333,422 +DM/HE-249,Emser Berg,,51.23638889,09.27444444,447 +DM/HE-250,Bilstein,,51.22694444,09.35472222,459 +DM/HE-251,Stellberg,,51.21833333,09.57361111,476 +DM/HE-252,Gutsberg,,51.21916667,09.78111111,517 +DM/HE-253,Kasseler Kuppe,,51.22777778,09.86277778,754 +DM/HE-254,Kalbe,,51.21638889,09.87416667,720 +DM/HE-255,Seesteine,,51.19472222,09.85500000,695 +DM/HE-256,Breiter Berg,,51.18611111,09.67916667,533 +DM/HE-257,Grosser Suettelsberg,,51.18250000,09.64083333,490 +DM/HE-258,Kesselstein,,50.44500000,09.96833333,799 +DM/HE-259,Bremerkopf,,50.41416667,09.86444444,797 +DM/HE-260,Ottersteine,,50.41083333,09.86194444,821 +DM/HE-261,Beilstein,,50.40333333,09.89111111,865 +DM/HE-262,Dalherda Kuppe,,50.41083333,09.82694444,801 +DM/HE-263,Salmsbachs Kopf,,51.16861111,09.64166667,493 +DM/HE-264,Kohlberg,,51.17666667,09.58388889,426 +DM/HE-265,Rambachs Koepfchen,,51.17305556,09.17583333,413 +DM/HE-266,Elmsberg,,51.15250000,09.03888889,527 +DM/HE-267,Ochsenwurzelkopf,,51.16638889,09.02361111,542 +DM/HE-268,Daudenberg,,51.16027778,08.99000000,465 +DM/HE-268,Daudenberg,,51.16030121,8.98999977,465 +DM/HE-269,Schloss Waldeck,,51.20361111,09.05583333,381 +DM/HE-270,Pentersrueck,,51.16694444,09.68916667,562 +DM/HE-271,Hellkopf,,51.17027778,09.74027778,466 +DM/HE-272,Eisberg,,51.14666667,09.77694444,583 +DM/HE-273,Petershoehe,,51.13361111,09.77916667,441 +DM/HE-274,Grosse Steine,,51.15138889,09.79222222,533 +DM/HE-275,Beisenberg,,51.06166667,09.53527778,427 +DM/HE-276,Eichelberg,,51.04222222,09.55972222,480 +DM/HE-277,Trieschkopf,,51.22833333,09.60750000,480 +DM/HE-278,Kleiner Belgerkopf,,51.24083333,09.63222222,470 +DM/HE-279,Grosser Belgerkopf,,51.24972222,09.63166667,497 +DM/HE-280,St.Ottielienberg,,51.21972222,09.63166667,452 +DM/HE-281,Ottilienstein,,50.46861111,09.99166667,846 +DM/HE-282,Steinkopf,,50.47777778,10.01944444,888 +DM/HE-283,Abtsroder Kuppe,,50.50388889,09.93833333,905 +DM/HE-284,Fuchsstein,,50.48333333,09.95944444,816 +DM/HE-285,Schneeberg,,50.46916667,09.94472222,684 +DM/HE-286,Weiherberg,,50.51861111,09.91222222,786 +DM/HE-287,Heiligenberg,,50.51750000,09.92583333,650 +DM/HE-288,Stockmiesen,,50.50305556,09.95638889,844 +DM/HE-289,Mathesberg,,50.48750000,09.97777778,832 +DM/HE-290,Mostberg,,50.46388889,09.96638889,807 +DM/HE-291,Hachtkopf,,50.46833333,09.96472222,824 +DM/HE-292,Teufelsberg,,50.42138889,09.94861111,844 +DM/HE-293,Himmeldunkberg,,50.42305556,09.95888889,888 +DM/HE-294,Schwarzenhauck,,50.50555556,09.89277778,663 +DM/HE-295,Stellberg,,50.53805556,09.87388889,727 +DM/HE-296,Bubenbader,,50.53916667,09.91111111,759 +DM/HE-297,Hauenstein,,50.53805556,09.86555556,597 +DM/HE-298,Heidigskuppe,,50.51500000,09.90305556,702 +DM/HE-299,Steinwand,,50.52222222,09.86555556,647 +DM/HE-300,St.Ganggolf,,50.54444444,09.89777778,835 +DM/HE-301,Fuchskueppel,,50.52222222,09.91694444,775 +DM/HE-302,Bodenhofkueppel,,50.46472222,09.88250000,685 +DM/HE-303,Koenigsstein,,50.50916667,09.95583333,788 +DM/HE-304,Hoherodskopf,,50.51194444,09.22833333,764 +DM/HE-305,Nesselberg,,50.52083333,09.27138889,716 +DM/HE-306,Gackerstein,,50.51472222,09.20333333,663 +DM/HE-307,Rehberg,,50.49416667,09.24888889,670 +DM/HE-308,Herchenhainer Hoehe,,50.48722222,09.27694444,733 +DM/HE-309,Muehlberg,,50.48555556,09.23638889,611 +DM/HE-310,Ernstberg,,50.47500000,09.25388889,626 +DM/HE-311,Kleekopf,,50.50805556,09.31555556,555 +DM/HE-312,Burg,,50.50638889,09.29388889,588 +DM/HE-313,Kloeshorst,,50.50583333,09.32444444,560 +DM/HE-314,Melibocus,,49.72579956,8.63720036,517 +DM/HE-315,Mosenberg,,51.05916667,09.42166667,437 +DM/HE-316,Haeuschensberg,,51.38972222,09.51333333,301 +DM/HE-317,Speeler Kopf,,51.39305556,09.59805556,316 +DM/HE-318,Staufenkueppel,,51.41805556,09.62750000,334 +DM/HE-319,Sababurg,,51.54444444,09.53555556,352 +DM/HE-320,Wattberg,,51.48666667,09.32361111,353 +DM/HE-321,Muehlenberg,,51.47694444,09.57250000,439 +DM/HE-322,Gahrenberg,,51.44333333,09.57111111,472 +DM/HE-323,Malsburg,,51.41083333,09.26027778,406 +DM/HE-324,Kleiner Doernberg,,51.36500000,09.33194444,482 +DM/HE-325,Rohrberg,,51.34166667,09.27388889,517 +DM/HE-326,Ofenberg,,51.32750000,09.19000000,372 +DM/HE-327,Auerbacher Schloss,,49.70888889,08.63166667,346 +DM/HE-328,Darsberg,,49.73888889,08.64500000,374 +DM/HE-329,Tannenberg,,49.75638889,08.65638889,339 +DM/HE-330,Schlossberg,,49.64611111,08.64777778,295 +DM/HE-331,Lindenstein,,49.66138889,08.67527778,455 +DM/HE-332,Kesselberg,,49.67777778,08.70583333,531 +DM/HE-333,Stotz,,49.67689896,8.83059978,478 +DM/HE-334,Grosser Staufenberg,,51.36111111,09.63805556,403 +DM/HE-335,Hohe Wand,,51.36500000,09.71666667,478 +DM/HE-336,Haeringsnase,,51.34888889,09.72138889,508 +DM/HE-337,Hundsberg,,51.30833333,09.28361111,496 +DM/HE-338,Seilerberg,,51.31472222,09.32500000,495 +DM/HE-339,Lindenberg,,51.29833333,09.31500000,486 +DM/HE-340,Grosser Schoenberg,,51.29277778,09.30416667,483 +DM/HE-341,Bilsteinklippen,,51.29333333,09.40111111,400 +DM/HE-342,Huehnerberg,,51.33583333,09.39250000,496 +DM/HE-343,Hunrodsberg,,51.30611111,09.40944444,436 +DM/HE-344,Muehlenstein,,51.30500000,09.76750000,607 +DM/HE-345,Muehlenberg,,51.31805556,09.62000000,352 +DM/HE-346,Gerholdsberg,,51.30527778,09.64500000,352 +DM/HE-347,Salzleckerkopf,,51.32750000,09.68472222,412 +DM/HE-348,Zollstock,,51.28611111,09.70972222,549 +DM/HE-349,Kleine Kappe,,51.29444444,09.80972222,464 +DM/HE-350,Rendskopf,,51.25694444,09.30166667,421 +DM/HE-351,Halmskopf,,51.25861111,09.32555556,452 +DM/HE-352,Kriegsberg,,51.27750000,09.33444444,491 +DM/HE-353,Schwengeberg,,51.24969864,9.34280014,537 +DM/HE-354,Grosser Schoenberg,,51.29277778,09.32083333,483 +DM/HE-355,Birkenkopf,,51.28250000,09.39944444,360 +DM/HE-356,Stupberg,,51.27138889,09.69944444,477 +DM/HE-357,Giesenberg,,51.26750000,09.74611111,527 +DM/HE-358,Schwarzenberg,,51.27944444,09.75138889,517 +DM/HE-359,Steinberg,,51.27111111,09.77694444,570 +DM/HE-360,Langenberg,,51.27583333,09.81444444,565 +DM/HE-361,Kahlenberg,,51.26444444,09.81194444,470 +DM/HE-362,Hohekopf,,51.24611111,09.79944444,539 +DM/HE-363,Grosse Kappe,,51.28388889,09.80333333,571 +DM/HE-364,Roggenberg,,51.28750000,09.87111111,507 +DM/HE-365,Krueckenkopf,,51.27361111,09.87138889,519 +DM/HE-366,Haesselkuppe,,51.25944444,09.85833333,515 +DM/HE-367,Ruesskopf,,51.27722222,09.75305556,482 +DM/HE-368,Erzeberg,,51.25972222,09.25694444,437 +DM/HE-369,Remmenhausener Kopf,,51.26972222,09.27277778,428 +DM/HE-370,Laufskopf,,51.24083333,09.34194444,535 +DM/HE-371,Odenberg,,51.19555556,09.37722222,381 +DM/HE-372,Badenstein,,51.20138889,09.56166667,442 +DM/HE-373,Steinkopf,,51.20555556,09.57555556,427 +DM/HE-374,Koenigsberg,,51.21611111,09.65333333,410 +DM/HE-375,Roesberg,,51.22472222,09.75750000,528 +DM/HE-376,Eisenberg,,51.21472222,09.75333333,485 +DM/HE-377,Exberg,,51.23472222,09.78277778,506 +DM/HE-378,Meinetsberg,,51.21722222,09.81694444,502 +DM/HE-379,Metzberg,,51.18583333,09.78527778,422 +DM/HE-380,Kesselberg,,51.19611111,09.82333333,516 +DM/HE-381,Steinberg,,51.20333333,09.80333333,478 +DM/HE-382,Rettenberg,,51.18583333,09.82777778,450 +DM/HE-383,Hoellenrueck,,51.18833333,09.86805556,519 +DM/HE-384,Heiligenberg,,51.24055556,09.84666667,583 +DM/HE-385,Karlsstollen,,51.20500000,09.86583333,623 +DM/HE-386,Frau Holle,,51.21916667,09.87000000,623 +DM/HE-387,Hermannsberg,,51.30527778,08.65277778,705 +DM/HE-388,Hoehekopf,,51.31611111,08.64250000,622 +DM/HE-389,Schwalenburg,,51.31611111,08.62638889,579 +DM/HE-390,Hegeberg,,51.32329941,8.63059998,654 +DM/HE-391,Dreiskopf,,51.32722222,08.61000000,781 +DM/HE-392,Hegekopf,,51.33055556,08.65166667,641 +DM/HE-393,Iberg,,51.29805556,08.61916667,720 +DM/HE-393,Iberg,,51.29809952,8.61919975,720 +DM/HE-394,Eideler Berg,,51.29333333,08.63611111,743 +DM/HE-395,Schneeberg,,51.28361111,08.64027778,726 +DM/HE-396,Emmel,,51.26916667,08.64250000,742 +DM/HE-397,Hohe Poen,,51.26689911,8.62329960,703 +DM/HE-398,Grosse Grube,,51.27194444,08.59888889,798 +DM/HE-399,Krutenberg,,51.25527778,08.61750000,762 +DM/HE-400,Auf`m Knoll,,51.26361111,08.64138889,738 +DM/HE-401,Musenberg,,51.27305556,08.62500000,740 +DM/HE-402,Mittelsberg,,51.27611111,08.58333333,801 +DM/HE-403,Kalied,,51.26222222,08.67111111,745 +DM/HE-404,Hillekopf,,51.23972222,08.59944444,801 +DM/HE-405,Kessel,,51.15333333,09.52166667,368 +DM/HE-406,Schlossberg,,51.16222222,09.63222222,452 +DM/HE-407,Ruine Reichenbach,,51.16888889,09.75361111,522 +DM/HE-408,Grosser Rohrberg,,51.16722222,09.77305556,496 +DM/HE-409,Hahnberg,,51.10361111,09.06305556,512 +DM/HE-410,Duerrenberg,,51.11527778,08.99138889,550 +DM/HE-411,Ahornkopf,,51.12805556,08.96944444,604 +DM/HE-412,Ochsenwurzelskopf,,51.16722222,09.02527778,542 +DM/HE-413,Mosenberg,,51.05111111,09.42166667,437 +DM/HE-414,Schilling,,51.00861111,09.55888889,468 +DM/HE-415,Waltersberg,,51.01388889,09.55750000,466 +DM/HE-416,Ruine Rodenberg,,51.01055556,09.73638889,418 +DM/HE-417,Grosser Steinkopf,,51.02277778,09.72833333,446 +DM/HE-418,Kleiner Steinkopf,,51.02444444,09.73777778,454 +DM/HE-419,Nenterberg,,50.98111111,09.55583333,525 +DM/HE-420,Hasenkopf,,50.97138889,09.53833333,502 +DM/HE-421,Klosterstein,,50.96972222,09.55000000,528 +DM/HE-422,Stellberg,,50.53805556,09.88166667,727 +DM/HE-423,Tannenfels,,50.54388889,09.96611111,669 +DM/HE-424,Krautberg,,50.53333333,09.99277778,624 +DM/HE-425,Giebelrain,,50.50333333,09.83194444,588 +DM/HE-426,Haimberg,,50.50000000,09.82055556,568 +DM/HE-427,Grosser Nallenberg,,50.44469833,9.87969971,763 +DM/HE-428,Kleiner Nallenberg,,50.43583333,09.88027778,704 +DM/HE-429,Reesberg,,50.41944444,09.92166667,851 +DM/HE-430,Rommerser Berg,,50.41444444,09.90722222,850 +DM/HE-431,Allberg,,50.79916667,08.53388889,528 +DM/HE-432,Hilsberg,,50.80388889,08.50472222,526 +DM/HE-433,Daubhaus,,50.79500000,08.53138889,552 +DM/HE-434,Schindeberg,,50.78027778,08.46666667,553 +DM/HE-435,Huelsberg,,50.77027778,08.47083333,503 +DM/HE-436,Ebersberg,,50.77500000,08.48416667,508 +DM/HE-437,Wuergeloh,,50.77472222,08.45166667,564 +DM/HE-438,Hirschhohl,,50.75777778,08.43916667,502 +DM/HE-439,Hornberg,,50.83916667,08.55722222,451 +DM/HE-440,Kappe,,50.84000000,08.60194444,494 +DM/HE-441,Kronenberg,,50.83555556,08.58694444,454 +DM/HE-442,Eichelhardt,,50.83722222,08.57222222,465 +DM/HE-443,Loewenburg,,51.31222222,09.41555556,300 +DM/HE-444,Schloss Wilhelmshoehe,,51.31805556,09.41555556,305 +DM/HE-445,Hermannsberg,,50.93000000,09.43805556,526 +DM/HE-446,Wilsberg,,50.90500000,09.41111111,598 +DM/HE-447,Bornstrauchkoppe,,50.89416667,09.39805556,550 +DM/HE-448,Ellersberg,,50.20472222,09.27194444,621 +DM/HE-449,Herrhain,,50.53000000,09.36916667,486 +DM/HE-450,Feldkruecker Hoehe,,50.53805556,09.18555556,640 +DM/HE-451,Roellberg,,50.46305556,09.43388889,481 +DM/HE-452,Steinmauer,,50.40777778,09.45277778,451 +DM/HE-453,Kaupe,,50.40083333,09.44111111,472 +DM/HE-454,Weiperzberg,,50.30000000,09.59694444,504 +DM/HE-455,Leimberg,,50.29222222,09.58666667,503 +DM/HE-456,Schnepfenkopf,,50.27305556,09.45750000,490 +DM/HE-457,Lindenberg,,50.02000000,09.31861111,402 +DM/HE-458,Steigkoppe,,50.04250000,09.30527778,502 +DM/HE-459,Rabenkopf,,50.04055556,07.99000000,523 +DM/HE-460,Mittelberg,,49.58472222,09.04111111,507 +DM/HE-461,Elseberg,,49.57666667,09.00694444,518 +DM/HE-462,Krappenbuckel,,49.57916667,08.95194444,487 +DM/HE-463,Hoher Zorn,,49.69833333,08.92194444,495 +DM/HE-464,Kottenberg,,49.55055556,08.82944444,551 +DM/HE-465,Toter Mann,,49.54388889,08.83750000,554 +DM/HE-466,Goetzenstein,,49.55333333,08.76944444,522 +DM/HE-467,Hohberg,,49.53638889,08.77861111,537 +DM/HE-468,Waldskopf,,49.54000000,08.76972222,538 +DM/HE-469,Galgenberg,,50.18694444,08.86361111,188 +DM/HE-470,Rauschenberg,,50.57138889,09.71361111,471 +DM/HE-471,Schulzenberg,,50.55722222,09.61833333,370 +DM/HE-472,Haimberg,,50.54861111,09.59777778,409 +DM/HE-473,Roter Buckel,,49.64305556,09.07083333,540 +DM/HE-474,Erzberg,,49.65444444,08.81694444,485 +DM/HE-475,Hoschbachshoehe,,49.68444444,08.90000000,474 +DM/HE-476,Lannertskopf,,49.54972222,08.86416667,472 +DM/HE-477,Spessartskopf,,49.61000000,08.87416667,566 +DM/HE-477,Spessartskopf,,49.61000061,8.87419987,566 +DM/HE-478,Eichelberg,,50.14111111,08.20111111,535 +DM/HE-479,Galgen,,49.77416667,08.66333333,375 +DM/HE-480,Meisenberg,,49.58027778,08.86055556,538 +DM/HE-481,"Schlossberg,,08.66805556,1250,Ruine Frankenstein" +DM/HE-482,Jaegerhorn,,50.03277778,07.87694444,538 +DM/HE-482,Jaegerhorn,,50.03279877,7.87690020,538 +DM/HE-483,Atzelberg,,50.17527778,08.38805556,507 +DM/HE-484,Krehberg,,49.68416667,08.73083333,576 +DM/HE-484,Krehberg,,49.68420029,8.73079967,576 +DM/HE-485,Judenkopf,,50.12829971,8.38889980,410 +DM/HE-485,Judenkopf,,50.12833333,08.38888889,410 +DM/HE-486,Rinke,,49.51722222,08.84555556,489 +DM/HE-487,Schnappgalgen,,49.60750000,08.93944444,462 +DM/HE-488,Geisberg,,49.63277778,08.95166667,441 +DM/HE-489,Veste Otzberg,,49.81944444,08.91111111,368 +DM/HE-490,Rassel,,50.14500000,08.25555556,539 +DM/HE-491,Gickelsberg,,49.53750000,08.99250000,554 +DM/HE-492,Altscheuer,,49.76444444,08.79222222,376 +DM/HE-493,Schildenberg,,49.52888889,09.09833333,552 +DM/HE-494,Bacharacher Kopf,,50.00083333,07.87083333,342 +DM/HE-495,Fichtenkopf,,49.98361111,07.89138889,348 +DM/HE-496,Schlaeferskopf,,50.10805556,08.16694444,454 +DM/HE-497,Sensberg,,49.50970078,9.02169991,480 +DM/HE-498,Weilsberg,,50.23166667,08.43000000,701 +DM/HE-499,Hermannskoppe,,50.10694444,09.51666667,567 +DM/HE-500,Floersbacher Hoehe,,50.13222222,09.43388889,531 +DM/HE-501,Breuberg,,49.82000000,09.04000000,337 +DM/HE-502,Kolbenberg,,50.24222222,08.49611111,684 +DM/HE-503,Kirschenhell,,50.33000000,08.41611111,467 +DM/HE-504,Wolfskueppel,,50.30500000,08.41250000,545 +DM/HE-505,Eichkopf,,50.18611111,08.41500000,563 +DM/HE-506,Romberg,,50.19388889,08.45333333,541 +DM/HE-507,Knodener Kopf,,49.69666667,08.71083333,511 +DM/HE-508,Laermfeuer,,49.66555556,08.89500000,502 +DM/HE-509,Amoeneburg,,50.79666667,08.92166667,364 +DM/HE-510,Appelsberg,,50.72750000,09.82833333,533 +DM/HE-511,Auersberg,,50.59694444,10.01666667,633 +DM/HE-512,Bolzenberg,,50.81555556,08.24416667,577 +DM/HE-513,Boxberg,,50.62580109,9.96500015,687 +DM/HE-514,Breiter Berg,,50.66830063,9.87749958,582 +DM/HE-515,Dammskopf,,50.98500000,09.63722222,524 +DM/HE-516,Deiselberg,,51.58000000,09.37500000,391 +DM/HE-517,Dicker Kopf,,51.14939880,9.02309990,615 +DM/HE-518,Duensberg,,50.65166667,08.58083333,498 +DM/HE-519,Finkenberg,,51.17416667,09.90166667,464 +DM/HE-520,Frauenstein,,50.38000000,09.69666667,605 +DM/HE-521,Glauberg,,50.31166667,09.01500000,275 +DM/HE-522,Grosser Homberg,,51.03777778,08.65000000,471 +DM/HE-523,Grossersloh,,50.86500000,08.45500000,548 +DM/HE-524,Gulsberg,,51.21805556,09.78166667,533 +DM/HE-525,Haag,,50.32166667,09.71555556,588 +DM/HE-526,Habelberg,,50.63999939,9.99499989,721 +DM/HE-527,Hahneberg,,51.57580185,9.55580044,475 +DM/HE-528,Hammersberg,,50.16830063,8.35999966,441 +DM/HE-529,Hardeck,,50.29916667,08.99833333,226 +DM/HE-530,Hassenroth,,50.93750000,08.56166667,611 +DM/HE-531,Heidelbeerenberg,,51.39250000,09.16333333,409 +DM/HE-532,Hesselberg,,50.39916667,08.56833333,524 +DM/HE-533,Hinterberg,,51.19329834,9.23999977,425 +DM/HE-534,Hirschberg,,50.11916667,09.40083333,545 +DM/HE-535,Hochberg,,50.74580002,8.99940014,358 +DM/HE-536,Hoheberg,,51.15859985,9.23939991,388 +DM/HE-537,Hoeberueck,,50.98527778,09.71388889,405 +DM/HE-538,Holstein,,51.06999969,9.97169971,463 +DM/HE-539,Hundskopf,,50.97750000,09.09166667,466 +DM/HE-540,Kahle Hardt,,51.18916667,09.00166667,401 +DM/HE-541,Katzenstein,,50.83330154,9.43500042,545 +DM/HE-542,Klotzeberg,,49.86500000,08.98194444,371 +DM/HE-543,Kohlenberg,,50.96469879,8.59189987,582 +DM/HE-544,Landecker Berg,,50.84000000,09.89000000,523 +DM/HE-545,Magnetberg,,49.78416667,08.66750000,433 +DM/HE-546,Mensfelder Hoehe,,50.34329987,8.09169960,312 +DM/HE-547,Nickel,,50.18750000,08.32583333,524 +DM/HE-548,Ortenberg,,50.81666667,08.80222222,394 +DM/HE-549,Rauenberg,,50.17166667,09.16166667,302 +DM/HE-550,Ringelsberg,,50.99829865,8.56000042,533 +DM/HE-551,Komberg,,51.17829895,9.93610001,418 +DM/HE-552,Ronneberg,,51.00166667,09.40027778,402 +DM/HE-553,Rossberg,,50.45166667,09.75000000,481 +DM/HE-554,Roter Kopf,,50.51470184,8.21669960,406 +DM/HE-555,Saehre,,51.29666667,08.67166667,726 +DM/HE-556,Salzberg,,50.46666667,09.59666667,488 +DM/HE-557,Schoeneberg,,51.52416667,09.40250000,316 +DM/HE-558,Steinfirst,,49.61000000,08.87416667,566 +DM/HE-559,Steinknorre,,50.34416667,08.99000000,265 +DM/HE-560,Stockstein,,51.50166667,09.03666667,387 +DM/HE-561,Stoppelsberg,,50.75166667,09.70166667,516 +DM/HE-562,Struthkopf,,51.00749969,8.60309982,554 +DM/HE-563,Tempelberg,,50.66777778,09.58500000,391 +DM/HE-564,Vogelherd,,50.82666667,08.73750000,384 +DM/HE-565,Waltenberg,,51.29666667,09.27500000,518 +DM/HE-566,Wartberg,,51.24666667,09.21833333,442 +DM/HE-567,Wieselsberg,,50.72333333,09.80000000,508 +DM/HE-568,Wolfschur,,51.13330078,9.09000015,488 +DM/HE-569,Schadenberg,,50.85329819,8.43190002,553 +DM/ND-001,Helpter Berge,,53.48611111,13.60888889,179 +DM/ND-002,Ruhner Berge,,53.29722222,11.90500000,176 +DM/ND-003,Piekberg,,54.55333333,13.62805556,161 +DM/ND-004,Hagelberg,,52.13833333,12.51694444,200 +DM/ND-005,Wacheberge,,52.08666667,12.35472222,173 +DM/ND-006,Meuselberge,,52.11916667,14.56833333,159 +DM/ND-007,Rauener Berge,,52.32027778,14.03916667,153 +DM/ND-008,Dubrower Berge,,52.31361111,14.11027778,150 +DM/ND-009,Bungsberg,,54.20944444,10.72444444,168 +DM/ND-010,Golmberg,,52.01583333,13.34277778,178 +DM/ND-011,Kutschenberg,,51.36472222,13.72666667,200 +DM/ND-012,Hoher Berg,,51.61222222,14.57722222,183 +DM/ND-013,Lange Berge,,52.66750000,13.88888889,151 +DM/ND-014,Hutberg,,52.11444444,14.53666667,162 +DM/ND-015,Eichberge,,52.09055556,14.52027778,166 +DM/ND-016,Katzenberg,,52.12416667,12.38194444,178 +DM/ND-017,Gorrenberge,,52.05777778,12.35166667,173 +DM/ND-018,Frauenberg,,52.04361111,12.43194444,168 +DM/ND-019,Garrenberge,,52.03111111,12.53527778,188 +DM/ND-020,Schwarzer Berg,,52.03638889,12.40111111,160 +DM/ND-021,Brandberg,,51.59527778,14.54944444,175 +DM/ND-022,Spitzberg,,51.58638889,14.47722222,161 +DM/ND-023,Lissberg,,51.61083333,14.72722222,150 +DM/ND-024,Horlitzaberg,,51.58027778,14.54277778,168 +DM/ND-025,Felixturm,,51.61666667,14.54805556,163 +DM/ND-026,Spuelenberg,,52.08138889,12.37888889,166 +DM/ND-027,Kesselberg,,51.70416667,13.94527778,161 +DM/ND-028,Heidehoehe,,51.38472222,13.57555556,201 +DM/ND-029,Huettenberg,,52.12666667,12.42916667,179 +DM/ND-030,Waldkuppe,,52.15194444,12.49500000,187 +DM/NS-001,Wurmberg,,51.75638889,10.61805556,971 +DM/NS-002,Achtermann,,51.76079941,10.56919956,925 +DM/NS-003,Wolfswarte,,51.79027778,10.50250000,918 +DM/NS-004,Quietschenberg,,51.79638889,10.57833333,882 +DM/NS-005,Grosse Klippe,,51.74833333,10.61416667,824 +DM/NS-006,Lerchenkoepfe,,51.80166667,10.53277778,821 +DM/NS-007,Abbenstein,,51.81361111,10.56222222,769 +DM/NS-008,Schalke,,51.85055556,10.38305556,762 +DM/NS-009,Bocksberg,,51.85638889,10.35611111,723 +DM/NS-010,Stoeberhai,,51.65750000,10.54833333,714 +DM/NS-011,Altestalkopf,,51.85055556,10.41027778,693 +DM/NS-012,Grosser Knollen,,51.66719818,10.43000031,687 +DM/NS-013,Ravensberg,,51.62111111,10.52666667,659 +DM/NS-014,Grosse Wulpke,,51.85388889,10.25194444,620 +DM/NS-015,Hasselkopf,,51.71194444,10.61722222,612 +DM/NS-016,Bockwieser Hoehe,,51.82361111,10.33416667,610 +DM/NS-017,Blockkoetenkopf,,51.75583333,10.33861111,585 +DM/NS-018,Hoheharz,,51.63527778,10.64527778,584 +DM/NS-019,Burgberg,,51.87166667,10.56666667,483 +DM/NS-020,Steinberg,,51.90694444,10.40555556,472 +DM/NS-021,Eichenberg,,51.61750000,10.60722222,460 +DM/NS-022,Heidberg,,52.21666667,07.94972222,165 +DM/NS-023,Silberberg,,52.21000000,07.95305556,180 +DM/NS-024,Heidhornberg,,52.22583333,07.95722222,180 +DM/NS-025,Borgberg,,52.18111111,07.96472222,225 +DM/NS-026,Hueggel,,52.22000000,07.97444444,226 +DM/NS-027,Liener Berg,,52.16111111,07.98777778,225 +DM/NS-028,Heidhornberg,,52.17611111,08.00722222,202 +DM/NS-029,Buddelberg,,52.16472222,08.01194444,167 +DM/NS-030,Kahle Berg,,52.15888889,08.01250000,211 +DM/NS-031,Nottberg,,52.18305556,08.01611111,241 +DM/NS-032,Baumannsknollen,,52.19333333,08.01805556,245 +DM/NS-033,Grafen Sundern,,52.18111111,08.03277778,314 +DM/NS-034,Bardinghaussundern,,52.19250000,08.03361111,219 +DM/NS-035,Rehremberg,,52.18916667,08.05111111,243 +DM/NS-036,Doerenberg,,52.17555556,08.05333333,331 +DM/NS-037,Hochholz,,52.18000000,08.06833333,263 +DM/NS-038,Kleiner Freeden,,52.15694444,08.07611111,200 +DM/NS-039,Grosser Freeden,,52.15888889,08.09055556,269 +DM/NS-040,Musenberg,,52.18083333,08.09194444,256 +DM/NS-041,Dornsberg,,52.38416667,08.09222222,151 +DM/NS-042,Hohnsberg,,52.16361111,08.10305556,242 +DM/NS-043,Schmittenhoehe,,52.39611111,08.11750000,157 +DM/NS-044,Luedenstein,,52.11388889,08.12750000,208 +DM/NS-045,Venner Egge,,52.36000000,08.15666667,158 +DM/NS-046,Ebensbrink,,52.15333333,08.16250000,235 +DM/NS-047,Huelsberg,,52.15472222,08.16777778,254 +DM/NS-048,Hohnangel,,52.14388889,08.17527778,262 +DM/NS-049,Wehdeberg,,52.13972222,08.17944444,258 +DM/NS-050,Borgloher Egge,,52.15527778,08.18527778,242 +DM/NS-051,Asberg,,52.13750000,08.19000000,244 +DM/NS-052,Lohnberg,,52.15722222,08.20111111,213 +DM/NS-053,Peters Brink,,52.13000000,08.20166667,212 +DM/NS-054,Steinbrink,,52.14583333,08.20194444,191 +DM/NS-055,Schollegge,,52.12944444,08.21194444,252 +DM/NS-056,Sahlbrink,,52.13444444,08.22277778,244 +DM/NS-057,Steinegge,,52.12805556,08.22277778,266 +DM/NS-058,Hankenuell,,52.12138889,08.24638889,307 +DM/NS-059,Vicarienkopf,,52.11944444,08.26805556,270 +DM/NS-060,Schornstein,,52.12055556,08.27583333,273 +DM/NS-061,Stirper Berg,,52.33000000,08.28638889,154 +DM/NS-062,Neuenkirchener Berg,,52.12583333,08.29777778,220 +DM/NS-063,Hengeberg,,52.11444444,08.30472222,208 +DM/NS-064,Sonnenbrink,,52.31416667,08.32722222,180 +DM/NS-065,Born,,52.30916667,08.34166667,190 +DM/NS-066,Hesseler Berge,,52.07250000,08.34916667,240 +DM/NS-067,Meller Berg,,52.23194444,08.35111111,218 +DM/NS-068,Grosse Egge,,52.07833333,08.35361111,312 +DM/NS-069,Knuell,,52.07083333,08.37305556,254 +DM/NS-070,Slorkenberg,,52.06694444,08.38194444,234 +DM/NS-071,Gartnischberg,,52.05638889,08.38333333,228 +DM/NS-072,Linner Berg,,52.28472222,08.39305556,181 +DM/NS-073,Hengeberg,,52.05527778,08.40583333,316 +DM/NS-074,Jakobsberg,,52.03305556,08.41277778,217 +DM/NS-075,Kleiner Kellenberg,,52.27388889,08.42333333,161 +DM/NS-076,Bussberg,,52.03305556,08.43194444,306 +DM/NS-077,Grosser Kellenberg,,52.26444444,08.44861111,211 +DM/NS-078,Hans-Kuehnenburg,,51.72777778,10.40277778,811 +DM/NS-079,Grosser Sonnenberg,,51.75583333,10.51666667,838 +DM/NS-080,Matthias-Schmidt-Berg,,51.70361111,10.52500000,653 +DM/NS-081,Glockenberg,,51.70583333,10.51277778,627 +DM/NS-082,Beerberg,,51.70916667,10.53111111,658 +DM/NS-083,Kuppe,,51.72555556,10.50888889,729 +DM/NS-084,Mittelberg,,51.80694444,10.50472222,667 +DM/NS-085,Grosser Wiesenberg,,51.84638889,10.42277778,645 +DM/NS-086,Kleintalsberg,,51.85916667,10.41194444,677 +DM/NS-087,Dicker Kopf,,51.86944444,10.43333333,678 +DM/NS-088,Brautstein,,51.87944444,10.45472222,648 +DM/NS-089,Kaesteklippe,,51.86805556,10.48333333,605 +DM/NS-090,Nordberg,,51.90972222,10.38833333,458 +DM/NS-091,Hasenberg,,51.82833333,10.25388889,572 +DM/NS-092,Grosse Bloesse,,51.78055556,09.59194444,528 +DM/NS-093,Strutberg,,51.69250000,09.60555556,444 +DM/NS-094,Moosberg,,51.75305556,09.55194444,509 +DM/NS-095,Grosser Steinberg,,51.70190048,9.66689968,493 +DM/NS-095,Grosser Steinberg,,51.70194444,09.66694444,493 +DM/NS-096,Rehberg,,51.73860168,10.53579998,891 +DM/NS-097,Kleiner Sonnenberg,,51.74972222,10.52694444,853 +DM/NS-098,Balos,,51.69027778,09.81805556,379 +DM/NS-099,Hengstruecken,,51.68694444,09.71833333,424 +DM/NS-100,Tonkuhlenkopf,,51.74083333,09.57972222,470 +DM/NS-101,Scheerenberg,,51.74500000,10.30194444,487 +DM/NS-102,Grosser Staufenberg,,51.36111111,09.63805556,403 +DM/NS-103,Wilseder Berg,,53.16777778,09.93944444,169 +DM/NS-104,Vorderer Ebersberg,,51.68000000,10.64777778,679 +DM/NS-105,Hohe Warte,,52.25666667,09.48388889,379 +DM/NS-106,Kalenberg,,51.68000000,09.59638889,310 +DM/NS-107,Grasberg,,52.16439819,9.56389999,375 +DM/NS-108,Piesberg,,52.31860000,8.02170000,194 +DM/NS-109,Schwarzer Brink,,52.29138889,08.44527778,211 +DM/NS-110,Fahrenberg,,51.82055556,10.15388889,401 +DM/NS-111,Aschentalshalbe,,51.68638889,10.45194444,686 +DM/NS-112,Grosser Staufenberg,,51.62555556,10.63583333,554 +DM/NS-113,Bruchberg,,51.78359985,10.50000000,927 +DM/NS-114,Grosser Trogtaler Berg,,51.88277778,10.25805556,609 +DM/NS-115,Ecksberg,,51.89189911,10.28890038,556 +DM/NS-116,Sudmerberg,,51.91500000,10.46722222,354 +DM/NS-117,Hainholz/Lange Wand,,52.21555556,09.06888889,320 +DM/NS-118,Moencheberg,,52.20416667,09.20472222,336 +DM/NS-119,Hesterbrink,,52.25579834,8.33720016,234 +DM/NS-120,Signalberg,,52.55305556,08.21555556,146 +DM/NS-121,Fast,,52.12860107,9.61250019,419 +DM/NS-122,Broehn,,52.24720001,9.50829983,405 +DM/NS-123,Reinekensiekskopf,,52.27055556,09.45333333,382 +DM/NS-124,Brunnenberg,,52.44277778,09.20944444,161 +DM/NS-125,Bueckeberg,,52.25970078,9.21140003,373 +DM/NS-126,Hohe Egge,,52.17138889,09.38361111,440 +DM/NS-127,Thuester Berg / Kanstein,,52.05805556,09.62277778,441 +DM/NS-128,Duinger Berg,,52.00138889,09.73777778,333 +DM/NS-129,Ebersnacken,,51.92916667,09.56583333,460 +DM/NS-130,Schecken (Obensburg),,52.08138889,09.44361111,286 +DM/NS-131,Hasselburg,,52.05970001,9.47970009,289 +DM/NS-131,Hasselburg,,52.05972222,09.47972222,289 +DM/NS-132,Pyrmonter Berg,,52.01190186,9.26329994,361 +DM/NS-133,Schierholzberg,,52.02916667,09.29444444,361 +DM/NS-134,Hohe Stolle,,52.00329971,9.36579990,293 +DM/NS-135,Lauensteiner Kopf,,52.08638889,09.52694444,439 +DM/NS-136,Blosse Zelle,,51.95859909,9.68999958,480 +DM/NS-137,Reuberg,,51.96527778,09.78555556,328 +DM/NS-138,Haferberg,,51.32080078,9.73530006,581 +DM/NS-139,Hohe Schleife,,51.41166667,09.79888889,442 +DM/NS-140,Brackenberg,,51.43305556,09.74833333,461 +DM/NS-141,Hoher Hagen,,51.47305556,09.76500000,492 +DM/NS-142,Totenberg,,51.52939987,9.64830017,410 +DM/NS-143,Heidelberg,,51.55416667,09.68527778,402 +DM/NS-144,Alte Gleichen,,51.46720123,10.03859997,432 +DM/NS-145,Eschenberg,,51.45916667,10.04805556,408 +DM/NS-146,Bocksbuehl,,51.42940140,9.96889973,437 +DM/NS-147,Mackenroeder Spitze,,51.53777778,10.04944444,428 +DM/NS-148,Huenstollen,,51.57888889,10.04694444,424 +DM/NS-149,Ossenberg,,51.53666667,09.78027778,433 +DM/NS-150,Langfast,,51.65055556,10.04444444,360 +DM/NS-151,Duenenberg,,51.73277778,10.07111111,358 +DM/NS-152,Kahlberg,,51.81439972,10.06140041,370 +DM/NS-153,Krieberg,,51.78689957,9.96030045,299 +DM/NS-154,Fuchshoehlenberg,,51.84305556,09.88666667,346 +DM/NS-155,Helleberg,,51.87250000,09.74888889,411 +DM/NS-156,Holzberg,,51.84690094,9.63689995,445 +DM/NS-157,Hengstberg,,51.51527778,10.06416667,416 +DM/NS-158,Harrl,,52.24638889,09.07916667,213 +DM/NS-159,Schildhorst,,51.90859985,9.95030022,299 +DM/NS-160,Hohe Tafel,,52.03527778,09.81666667,395 +DM/NS-160,Hohe Tafel,,52.03530121,9.81669998,395 +DM/NS-161,Griesberg,,52.06190109,9.96080017,359 +DM/NS-162,Hohe Dehne,,51.95999908,10.04749966,318 +DM/NS-163,Hammersteinshoehe,,52.05749893,10.04059982,317 +DM/NS-164,Turmberg,,52.07555556,10.06416667,293 +DM/NS-165,Eilumer Horn,,52.19638889,10.74333333,323 +DM/NS-166,Remlinger Herse,,52.13000000,10.66250000,234 +DM/NS-167,Kalter Buschkopf,,52.03305556,10.22222222,299 +DM/NS-168,Burgberg,,51.87749863,9.52439976,358 +DM/NS-169,Buckenberg,,51.93888889,10.19694444,337 +DM/NS-170,Scharfenberg,,51.78138889,09.71500000,342 +DM/NS-171,Sackberg,,51.74610138,9.82030010,411 +DM/NS-172,Gladeberg,,51.63305556,09.82138889,360 +DM/NS-173,Grefenburg,,51.55666667,09.75777778,375 +DM/NS-174,Kruckberg,,51.99388889,09.53361111,269 +DM/NS-175,Hohe Egge,,51.90579987,9.89029980,396 +DM/NW-001,Loewenburg,,50.66416667,07.25000000,455 +DM/NW-002,Petersberg,,50.68638889,07.20833333,322 +DM/NW-003,Oelberg,,50.68220139,7.24940014,461 +DM/NW-004,Drachenfels,,50.66444444,07.21000000,321 +DM/NW-005,Wolkenburg,,50.66861111,07.21555556,324 +DM/NW-006,Lohrberg,,50.67194444,07.24944444,432 +DM/NW-007,Nonnenstromberg,,50.68555556,07.21972222,335 +DM/NW-008,Himmerich,,50.64388889,07.27333333,366 +DM/NW-009,Leyberg,,50.63250000,07.26638889,359 +DM/NW-010,Broderkonsberg,,50.64166667,07.28444444,354 +DM/NW-011,Breiberg,,50.66277778,07.23000000,313 +DM/NW-012,Hirschberg,,50.67333333,07.20916667,244 +DM/NW-013,Geisberg,,50.67055556,07.23138889,324 +DM/NW-014,Margarethenhoehe,,50.67722222,07.24944444,322 +DM/NW-015,Stenzelberg,,50.69138889,07.22583333,266 +DM/NW-016,Hohenhonnef,,50.65333333,07.24361111,235 +DM/NW-017,Dachsberg,,50.65138889,07.34361111,344 +DM/NW-018,Silberkuhle,,50.97719955,7.75419998,515 +DM/NW-019,Breselberg,,50.98138889,07.70805556,363 +DM/NW-020,Auf dem Huppen,,50.98055556,07.78611111,471 +DM/NW-021,Balzenberg,,50.98472222,07.87388889,434 +DM/NW-022,Martinshardt,,50.98750000,08.02027778,592 +DM/NW-023,Wilder Stein,,50.98027778,08.01111111,479 +DM/NW-024,Kleine Rausche,,50.81250000,08.05000000,443 +DM/NW-025,Kappenkopf,,51.12583333,07.74250000,549 +DM/NW-026,Kahler Asten,,51.18000000,08.48861111,841 +DM/NW-027,Bremberg,,51.19027778,08.49500000,809 +DM/NW-028,Poppenberg,,51.19277778,08.50888889,746 +DM/NW-029,Molbecke,,51.18138889,08.53277778,723 +DM/NW-030,Ruhrkopf,,51.21194444,08.55527778,696 +DM/NW-031,Langeberg,,51.17333333,08.54944444,662 +DM/NW-032,Katerkopf,,51.17583333,08.56305556,691 +DM/NW-033,Lagerstein,,51.17222222,08.57222222,732 +DM/NW-034,Hohe Seite,,51.17555556,08.59083333,682 +DM/NW-035,Hillekopf,,51.23972222,08.59944444,801 +DM/NW-036,Schlossberg,,51.22109985,8.61810017,790 +DM/NW-037,Roesberg,,51.20555556,08.59638889,781 +DM/NW-038,Junge Grimme,,51.20472222,08.61611111,782 +DM/NW-039,Hopperkopf,,51.24750000,08.59916667,831 +DM/NW-040,Rimberg,,51.24694444,08.53722222,763 +DM/NW-041,Egge,,51.22388889,08.57472222,681 +DM/NW-042,Mosenberg,,51.23222222,08.57166667,675 +DM/NW-043,Grosser Hoecher Kopf,,51.21166667,08.61083333,764 +DM/NW-044,Teukelberg,,51.16361111,08.61166667,749 +DM/NW-045,Bollerberg,,51.15940094,8.61060047,757 +DM/NW-046,Grosser Bromberg,,51.17583333,08.59083333,752 +DM/NW-047,Winterkasten,,51.18719864,8.63640022,659 +DM/NW-048,Baerenberg,,51.17083333,08.51500000,744 +DM/NW-049,Burgberg,,50.69472222,06.44222222,401 +DM/NW-050,Steling,,50.57777778,06.21277778,656 +DM/NW-051,Klotenberg,,52.23666667,07.74583333,158 +DM/NW-052,Luetke Berg,,52.21861111,07.84916667,182 +DM/NW-053,Leedener Berg,,52.21555556,07.87194444,202 +DM/NW-054,Hohner Rerge,,52.17416667,07.91388889,202 +DM/NW-055,Hoehneberg,,52.18888889,07.92305556,152 +DM/NW-056,Luisenturm,,52.10750000,08.28500000,291 +DM/NW-057,Barenberg,,52.08444444,08.32000000,259 +DM/NW-058,Riesberg,,52.09361111,08.32333333,221 +DM/NW-059,Sundern,,52.10555556,08.32472222,178 +DM/NW-060,Schwarzer Brink,,52.29138889,08.44527778,211 +DM/NW-061,Linkenberg,,52.29944444,08.47166667,157 +DM/NW-062,Huenenburg,,52.01472222,08.47527778,302 +DM/NW-063,Nonnenstein,,52.26190186,8.47920036,274 +DM/NW-064,Jostberg,,52.01444444,08.48777778,286 +DM/NW-065,Kahler Berg,,52.01666667,08.50472222,248 +DM/NW-066,Limberg,,52.28194444,08.51388889,190 +DM/NW-067,Kaeseberg,,51.99000000,08.52583333,267 +DM/NW-068,Auf der Egge,,51.99472222,08.53305556,243 +DM/NW-069,Togdrang,,51.98083333,08.55361111,295 +DM/NW-070,Gloesinghauser Berg,,52.26472222,08.55916667,289 +DM/NW-071,Altes Verbrenn,,52.26972222,08.56638889,291 +DM/NW-072,Eiserner Anton,,51.97861111,08.58333333,303 +DM/NW-073,Kahlewart,,52.27166667,08.59916667,286 +DM/NW-074,Breitenbrink,,52.27444444,08.60527778,287 +DM/NW-075,Wurzelbrink,,52.28359985,8.61530018,319 +DM/NW-076,Kniebrink,,52.28000000,08.61750000,315 +DM/NW-077,Ubbedisser Berg,,51.97750000,08.63000000,263 +DM/NW-078,Heidbrink,,52.29138889,08.63861111,320 +DM/NW-079,Brunsberg,,51.95833333,08.64166667,242 +DM/NW-080,Schweichler Berg,,52.15527778,08.65111111,168 +DM/NW-081,Barkhauser Berge,,51.94611111,08.67611111,293 +DM/NW-082,Nettelstedter Berg,,52.29500000,08.68194444,288 +DM/NW-083,Homberg,,52.15111111,08.69694444,201 +DM/NW-084,Ravensberg,,51.94027778,08.69750000,305 +DM/NW-085,Hunneckenkammer,,51.94444444,08.70638889,326 +DM/NW-086,Heuberg,,52.14527778,08.70833333,172 +DM/NW-087,Schnathorster Berg,,52.28638889,08.71611111,247 +DM/NW-088,Eggeberg,,52.14444444,08.72222222,233 +DM/NW-089,Stapellager Berge,,51.93610001,8.72439957,365 +DM/NW-090,Obernberg,,52.10388889,08.73555556,210 +DM/NW-091,Hermannsberg,,51.93138889,08.73833333,364 +DM/NW-092,Schwarzen Moor,,52.14305556,08.74305556,238 +DM/NW-093,Esbatzen,,51.93472222,08.74638889,278 +DM/NW-094,Elfter Kopf,,52.27722222,08.74916667,233 +DM/NW-095,Hoerster Berg,,51.92833333,08.75055556,308 +DM/NW-096,Kleiner Ehberg,,51.93333333,08.76138889,217 +DM/NW-097,Bergkirchener Kopf,,52.27027778,08.76638889,255 +DM/NW-098,Grosser Ehberg,,51.92416667,08.78027778,340 +DM/NW-099,Allhornberg,,51.92194444,08.79055556,315 +DM/NW-100,Haddenhauser Berg,,52.26250000,08.79138889,261 +DM/NW-101,Steinegge,,52.15330124,8.80060005,256 +DM/NW-102,Kahler Eberg,,51.92611111,08.81194444,224 +DM/NW-103,Lutternsche Egge,,52.25777778,08.81361111,256 +DM/NW-104,Zedling,,51.93111111,08.81416667,226 +DM/NW-105,Boberg,,52.09111111,08.81638889,267 +DM/NW-106,Krause Buche,,52.25611111,08.82833333,266 +DM/NW-107,Eidinghauser Berg,,52.25388889,08.83694444,247 +DM/NW-108,Klusberg,,52.15500000,08.83750000,196 +DM/NW-109,Kortewebelshals,,51.88638889,08.83750000,386 +DM/NW-110,Hermansdenkmal,,51.91138889,08.83944444,386 +DM/NW-111,Allarstein,,51.91444444,08.84166667,356 +DM/NW-112,Ebenoede,,52.17527778,08.84194444,237 +DM/NW-113,Hellberg,,51.90472222,08.84388889,346 +DM/NW-114,Steinberg,,52.18083333,08.84944444,196 +DM/NW-115,Eiberg,,52.13305556,08.84944444,230 +DM/NW-116,Moenkeberg,,52.06277778,08.84888889,224 +DM/NW-117,Duesterlau,,51.88194444,08.85333333,417 +DM/NW-118,Bickplecken,,52.10416667,08.85444444,276 +DM/NW-119,Rotenberg,,51.97833333,08.85916667,244 +DM/NW-120,Hahnberg,,51.89583333,08.86500000,325 +DM/NW-121,Grosser Gausekoeterberg,,51.86694444,08.86500000,367 +DM/NW-122,Limberg,,51.98444444,08.87361111,215 +DM/NW-123,Haeverstaedter Berg,,52.24888889,08.87555556,270 +DM/NW-124,Falkenburg,,51.87583333,08.87972222,373 +DM/NW-125,Bonstapel,,52.10888889,08.88000000,335 +DM/NW-126,Saalegge,,52.14305556,08.88333333,300 +DM/NW-127,Ruschberg,,52.15138889,08.88777778,295 +DM/NW-128,Stemberg,,51.87805556,08.88972222,402 +DM/NW-129,Gretberg,,51.98750000,08.89333333,253 +DM/NW-130,Falkenberg,,51.87083333,08.89361111,346 +DM/NW-131,Oberer Langenberg,,51.86361111,08.89000000,418 +DM/NW-132,Barnacken,,51.85499954,8.90359974,446 +DM/NW-133,Baerenstein,,51.87111111,08.91194444,316 +DM/NW-134,Sophienhoehe,,50.93555450,6.44000006,290 +DM/NW-135,Koeterberg,,51.85469818,9.32470036,496 +DM/NW-136,Toensberg,,51.95333333,08.67611111,333 +DM/NW-137,Reischlagsberg,,51.67083333,08.88805556,362 +DM/NW-138,Kleeberg,,52.06388889,08.98055556,360 +DM/NW-139,Preussisch Velmerstot,,51.83333333,08.95444444,464 +DM/NW-140,Heckberg,,50.94689941,7.40969992,364 +DM/NW-141,Hesseler Berge,,52.07250000,08.34916667,240 +DM/NW-142,Meller Berg,,52.23194444,08.35111111,218 +DM/NW-143,Grosse Egge,,52.07830048,8.35190010,312 +DM/NW-144,Knuell,,52.07083333,08.37305556,254 +DM/NW-145,Storkenberg,,52.06694444,08.38194444,234 +DM/NW-146,Gartnischberg,,52.05638889,08.38333333,228 +DM/NW-147,Linner Berg,,52.28472222,08.39305556,181 +DM/NW-148,Hengeberg,,52.05527778,08.40583333,316 +DM/NW-149,Jakobsberg,,52.03305556,08.41277778,217 +DM/NW-150,Kleiner Kellenberg,,52.27388889,08.42333333,161 +DM/NW-151,Bussberg,,52.03305556,08.43194444,306 +DM/NW-152,Grosser Kellenberg,,52.26444444,08.44861111,211 +DM/NW-153,Die Hoeh,,50.73861111,08.10777778,598 +DM/NW-154,Katzenknipp,,50.75333333,06.38277778,371 +DM/NW-155,Gieschhardt,,50.72444444,06.41861111,357 +DM/NW-156,Heidkopf,,50.68194444,06.45222222,361 +DM/NW-157,Mausauel,,50.70861111,06.45666667,388 +DM/NW-158,Roedelsberg,,50.65694444,06.50833333,362 +DM/NW-159,Sonnenberg,,50.64138889,06.48833333,393 +DM/NW-160,Wildbretshuegel,,50.61611111,06.42055556,525 +DM/NW-161,Hellberg,,50.60609818,6.45830011,526 +DM/NW-162,Rossberg,,50.67166667,06.45805556,384 +DM/NW-163,Wolfsberg,,50.50194444,06.44861111,528 +DM/NW-164,Pferdekopf,,50.51944444,06.53944444,527 +DM/NW-165,Kindshardt,,50.53916667,06.52305556,530 +DM/NW-166,Rathberg,,50.54722222,06.50666667,493 +DM/NW-167,Viriolsberg,,50.50361111,06.41194444,543 +DM/NW-168,Alteburg,,50.44500000,06.74666667,529 +DM/NW-169,Heidbusch,,50.41527778,06.66611111,524 +DM/NW-170,Stromberg,,50.39416667,06.63694444,559 +DM/NW-171,Hirnberg,,50.55805556,06.73500000,456 +DM/NW-172,Giersberg,,50.56416667,06.78111111,420 +DM/NW-173,Fanisberg,,50.53916667,06.79250000,507 +DM/NW-174,Hoehenberg,,50.37055556,06.45666667,600 +DM/NW-175,Buddelberg,,52.16500000,08.01194444,167 +DM/NW-176,Hohe Poen,,51.26666667,08.62277778,793 +DM/NW-177,Wellershoehe,,51.11833333,08.53305556,812 +DM/NW-178,Soehler,,50.89970016,8.09969997,491 +DM/NW-179,Goldener Strauch,,51.27888889,08.30500000,650 +DM/NW-179,Goldener Strauch,,51.27890015,8.30500031,650 +DM/NW-180,Bilstein,,51.38277778,08.62777778,623 +DM/NW-181,Hunau Gipfel,,51.21111111,08.38944444,817 +DM/NW-182,Kehlberg,,51.32860184,8.09829998,478 +DM/NW-183,Padberg,,51.40055556,08.76861111,510 +DM/NW-184,Grosser Ahlertsberg,,50.90416667,08.37416667,645 +DM/NW-185,Ziegenhelle,,51.12580109,8.52970028,816 +DM/NW-186,Wittekindsberg,,52.24611111,08.89055556,270 +DM/NW-187,Hoher Eimberg,,51.31250000,08.60083333,806 +DM/NW-188,Haerdler,,51.10388889,08.23583333,756 +DM/NW-189,Bastenberg,,51.30110168,8.38389969,745 +DM/NW-190,Schiershagen,,51.23360062,8.38059998,736 +DM/NW-191,Wiedegge,,51.32500000,08.46666667,732 +DM/NW-192,Stueppel,,51.31499863,8.43060017,732 +DM/NW-193,Steinmarkskopf,,51.26860046,8.42640018,724 +DM/NW-194,Heidkopf,,51.33166667,08.50861111,715 +DM/NW-195,Heiligenborner Hoehe,,50.88560104,8.28940010,694 +DM/NW-196,Himberg,,51.13830185,8.16749954,688 +DM/NW-197,Auergang,,51.14830017,8.18470001,685 +DM/NW-198,Baerenkopf,,50.97859955,8.41139984,680 +DM/NW-199,Ebschloh,,50.97109985,8.27390003,678 +DM/NW-200,Braberg,,51.28166667,08.45888889,676 +DM/NW-201,Sellerberg,,51.14166667,08.59583333,671 +DM/NW-202,Borberg,,51.35638889,08.53916667,669 +DM/NW-203,Hoemberg,,51.22916667,08.31361111,661 +DM/NW-204,Nordhelle,,51.14830017,7.75670004,660 +DM/NW-205,Hoher Wald,,51.02305556,08.02138889,658 +DM/NW-206,Homert,,51.26388889,08.10638889,655 +DM/NW-207,Wilzenberg,,51.15359879,8.33110046,655 +DM/NW-208,Sellenstuecke,,51.23527778,08.03472222,650 +DM/NW-209,Strauch,,51.02470016,8.27859974,643 +DM/NW-210,Wolfshorn,,51.04416667,08.02444444,642 +DM/NW-211,Soel,,51.26166667,08.39972222,631 +DM/NW-212,Berlarer Berg,,51.32416667,08.38611111,628 +DM/NW-213,Kindelsberg,,50.99000000,08.00388889,614 +DM/NW-214,Beerenberg,,51.14666667,08.25055556,614 +DM/NW-215,Vogelsang,,51.33305556,08.31888889,597 +DM/NW-216,Eisenberg,,51.37689972,8.73439980,595 +DM/NW-217,Bermershausener Hoehe,,50.95520020,8.33166981,603 +DM/NW-218,Windsberg,,51.40027618,8.50777817,585 +DM/NW-219,Heiligenstuhl,,51.20579910,7.92939997,582 +DM/NW-220,Grosses Sonnenstueck,,51.30305556,08.09666667,579 +DM/NW-221,Hoehe Schoendelt,,51.20109940,8.10890007,579 +DM/NW-222,Duemberg,,51.30110168,8.06169987,576 +DM/NW-223,Hohe Moelmert,,51.21469879,7.82420015,573 +DM/NW-224,Ramberg,,51.29330063,8.08720016,565 +DM/NW-225,Ostenberg,,51.34690094,8.39309978,562 +DM/NW-226,Hohe Liete,,51.28689957,8.06560040,561 +DM/NW-227,Lumberg,,51.24277778,08.23416667,559 +DM/NW-228,Suemberg,,51.16329956,7.78669977,552 +DM/NW-229,Burg,,51.01916667,08.40611111,549 +DM/NW-230,Balver Wald,,51.35527778,07.82888889,546 +DM/NW-231,Wolfhardt,,51.05555556,07.98583333,626 +DM/NW-232,Bruchl,,51.31638889,08.31388889,521 +DM/NW-233,Losenberg,,51.35666667,08.43916667,519 +DM/NW-234,Quinhagen,,51.08860016,7.96169996,513 +DM/NW-235,Welsberg,,51.32055556,08.23138889,510 +DM/NW-236,Grossendrescheid,,51.27220154,7.63469982,505 +DM/NW-237,Koepperkopf,,51.32609940,8.27750015,504 +DM/NW-238,Hellefelder Hoehe,,51.34388889,08.08416667,503 +DM/NW-239,Auf der Sange,,51.23220062,8.19029999,502 +DM/NW-240,Hochthuermenberg,,50.52777778,06.90777778,498 +DM/NW-241,Enkenberg,,51.41388889,08.73166667,492 +DM/NW-242,Saley,,51.22249985,7.88250017,491 +DM/NW-243,Weilenscheid,,51.14277778,08.04750000,481 +DM/NW-244,Hardt,,51.32249832,8.07830048,480 +DM/NW-245,Kehlberg,,51.32888889,08.09777778,478 +DM/NW-246,Beulberg,,51.04190063,7.66860008,477 +DM/NW-247,Breberg,,51.35609818,8.41189957,464 +DM/NW-248,Gummershardt,,51.03888889,07.51472222,438 +DM/NW-249,Hoher Schaden,,50.73805556,07.49944444,388 +DM/NW-250,Steinberg,,52.06969833,9.03219986,388 +DM/NW-251,Brungerst,,51.03219986,7.38829994,352 +DM/NW-252,Bellenberg,,51.87666667,09.00055556,312 +DM/NW-253,Vollrather Hoehe,,51.05720139,6.59359980,187 +DM/NW-254,Westerberg,,51.95888889,07.36083333,187 +DM/NW-255,Halde Haniel,,51.54972222,06.87583333,161 +DM/NW-256,Kollwesshoeh,,52.43579865,8.43360043,183 +DM/NW-257,Heimbacher Hoehe,,50.63249969,6.46640015,364 +DM/NW-258,Weisser Stein,,50.40777778,06.37111111,689 +DM/NW-259,Hohe Warte,,50.97940063,7.46390009,360 +DM/NW-260,Unnenberg,,51.06416667,07.61083333,506 +DM/NW-261,Rafelder Berg,,52.11638889,08.97388889,333 +DM/NW-262,Wuelpker Egge,,52.22999954,9.01469994,281 +DM/NW-263,Langenberg,,51.27638889,08.55861111,843 +DM/NW-264,Desenberg,,51.50055556,09.19833333,343 +DM/RP-001,Hohe Acht,,50.38610077,7.01079988,747 +DM/RP-002,Ernstberg,,50.23059845,6.76889992,699 +DM/RP-003,Schwarzer Mann,,50.25690079,6.35939980,697 +DM/RP-004,Scharteberg,,50.2183,6.7528,691 +DM/RP-005,Pruemscheid,,50.16780090,6.70219994,675 +DM/RP-006,Nuerburg,,50.34640121,6.95330000,676 +DM/RP-007,Hochkelberg,,50.27360153,6.95279980,675 +DM/RP-008,Rassberg,,50.3892,7.0628,664 +DM/RP-009,Seimersberg,,50.2528,6.5064,663 +DM/RP-010,Doehmberg,,50.2636,6.7603,653 +DM/RP-011,Goldberg,,50.3347,6.4594,649 +DM/RP-012,Langer Stein,,50.2761,6.5203,640 +DM/RP-013,Rote Heck,,50.3114,6.9403,639 +DM/RP-014,Schwirzheimer Kopf,,50.2442,6.5267,638 +DM/RP-015,Lehberg,,50.2128,6.7350,636 +DM/RP-016,Auf dem Gericht,,50.3400,6.4075,633 +DM/RP-017,Apert,,50.20080185,6.56080008,632 +DM/RP-018,Vogelsheck,,50.1967,6.5525,623 +DM/RP-019,Hohe Warte,,50.41609955,6.97170019,628 +DM/RP-020,Hardt,,50.2367,6.4711,627 +DM/RP-021,Auf der Wacht,,50.2336,6.7825,624 +DM/RP-022,Aremberg,,50.41719818,6.81419992,623 +DM/RP-023,Braenkekopf,,50.3261,6.9483,622 +DM/RP-024,Saberg,,50.3733,7.0958,621 +DM/RP-025,Weidenhoechst,,50.3372,6.4208,620 +DM/RP-026,Eselsberg,,50.2414,6.7850,620 +DM/RP-027,Hohlscheid,,50.2631,6.4842,619 +DM/RP-028,Dietzenley,,50.2025,6.6781,618 +DM/RP-029,Cotenickelchen,,50.3319,6.9528,618 +DM/RP-030,Schlehnenheck,,50.3014,6.4500,617 +DM/RP-031,Auf der Kopp,,50.1828,6.5322,616 +DM/RP-032,Hoechstberg,,50.23720169,7.03830004,616 +DM/RP-033,Glasfeld,,50.3025,6.4917,614 +DM/RP-034,Raedersberg,,50.2733,6.8200,610 +DM/RP-035,Weitersberg,,50.3067,6.5508,609 +DM/RP-036,Wilpert,,50.3114,6.4003,608 +DM/RP-037,Huscheid,,50.2908,6.3744,608 +DM/RP-038,Welfsberg,,50.3803,7.0639,606 +DM/RP-039,Elsberg,,50.3100,6.9267,605 +DM/RP-040,Hilz,,50.3156,6.5267,603 +DM/RP-041,Barsberg,,50.2936,6.8472,600 +DM/RP-042,Nerother Kopf,,50.1936,6.7603,600 +DM/RP-043,Steinbuechel,,50.3283,6.5603,597 +DM/RP-044,Bodert,,50.2753,6.4956,596 +DM/RP-045,Vogelsherdchen,,50.3506,6.9556,596 +DM/RP-046,Steinberg,,50.3133,6.3906,592 +DM/RP-047,Muensterberg,,50.2292,6.4206,592 +DM/RP-048,Roedel Kaul,,50.1689,6.6561,592 +DM/RP-049,Wippermann,,50.3781,7.0047,592 +DM/RP-050,Kapp,,50.2331,6.8917,590 +DM/RP-051,Hahnenberg,,50.3731,6.5894,589 +DM/RP-052,Daxelberg,,50.1208,6.6628,589 +DM/RP-053,Auf dem Hardt,,50.3333,6.4397,588 +DM/RP-054,Kalberberg,,50.2697,6.4683,588 +DM/RP-055,Alter Voss,,50.2458,6.7214,588 +DM/RP-056,Bradscheid,,50.1178,6.6403,588 +DM/RP-057,Beilstein,,50.2869,6.9703,588 +DM/RP-058,Boxert,,50.1653,6.5264,585 +DM/RP-059,Kretscheid,,50.1439,6.7214,585 +DM/RP-060,Dickenberg,,50.2422,6.4028,583 +DM/RP-061,Otzert,,50.2967,6.3644,582 +DM/RP-062,Ooser Nase,,50.2314,6.5947,580 +DM/RP-063,Bittberg,,50.2600,6.9611,580 +DM/RP-064,Gaensehals,,50.39720154,7.20419979,575 +DM/RP-065,Denskopf,,50.3533,7.1075,573 +DM/RP-066,Schwedenkreuz,,50.3550,6.9275,572 +DM/RP-067,Afelskreuz,,50.2575,6.9044,572 +DM/RP-068,Kantenkopf,,50.3036,6.3689,571 +DM/RP-069,Radsberg,,50.2925,6.3439,570 +DM/RP-070,Hoenselberg,,50.3014,6.7472,570 +DM/RP-071,Froehn,,50.2383,6.3711,570 +DM/RP-072,Hochbermel,,50.27920151,7.09439993,570 +DM/RP-073,Schmitzkopf,,50.3894,7.2039,570 +DM/RP-074,Deichelsberg,,50.3689,6.4169,569 +DM/RP-075,Kalvarienberg,,50.2094,6.4072,569 +DM/RP-076,Pruemer Berg,,50.1544,6.5717,567 +DM/RP-077,Kopnig,,50.2650,6.4597,566 +DM/RP-078,Steingert,,50.2458,6.4242,566 +DM/RP-079,Mohrsberg,,50.3728,7.1344,564 +DM/RP-080,Weinschiedsberg,,50.2231,6.4069,562 +DM/RP-081,Schnapert,,50.3092,6.3619,561 +DM/RP-082,Rother Kopf,,50.2464,6.6189,561 +DM/RP-083,Maeuseberg,,50.1756,6.8419,561 +DM/RP-084,Hundsberg,,50.1769,6.5653,560 +DM/RP-085,Struthberg,,50.2722,6.7875,560 +DM/RP-086,Saengscheid,,50.3444,6.5550,559 +DM/RP-087,Am Kopp,,50.2256,6.3803,558 +DM/RP-088,Wolfsberg,,50.2233,7.0947,558 +DM/RP-089,Steineberger Ley,,50.1778,6.9183,558 +DM/RP-090,Auf der Hardt,,50.1850,6.8636,558 +DM/RP-091,Alte Schanze,,50.2447,7.0689,557 +DM/RP-092,Auf der Aarlei,,50.1583,6.7939,557 +DM/RP-093,Herchenberg,,50.1533,6.5136,556 +DM/RP-094,Asberg,,50.3631,6.5203,554 +DM/RP-095,Weinberg,,50.3136,6.7114,554 +DM/RP-096,Ehlert,,50.2264,6.8953,553 +DM/RP-097,Hoehe,,50.2272,7.0672,553 +DM/RP-098,Hoelgertberg,,50.3283,7.0356,551 +DM/RP-099,Bremelichenberg,,50.3622,6.4442,549 +DM/RP-100,Hoher List,,50.1625,6.8481,549 +DM/RP-101,Dachsberg,,50.1689,6.6014,548 +DM/RP-102,Staufskopf,,50.39609909,6.95469999,548 +DM/RP-102,Staufskopf,,50.3961,6.9547,548 +DM/RP-103,Witzenberg,,50.3628,6.5714,547 +DM/RP-104,Zanderberg,,50.1869,6.5778,547 +DM/RP-105,Baumberg,,50.3456,6.6478,545 +DM/RP-106,Dreeskopf,,50.0956,6.5367,544 +DM/RP-107,Eichert,,50.3614,6.9208,544 +DM/RP-108,Holzbeuel,,50.0808,6.7444,544 +DM/RP-109,Warmendell,,50.2117,6.3783,542 +DM/RP-110,Schafberg,,50.3333,7.0825,540 +DM/RP-111,Verschneiderberg,,50.3100,6.3400,539 +DM/RP-112,Wiekert,,50.1297,6.5164,539 +DM/RP-113,Riedener Berg,,50.4036,7.1594,538 +DM/RP-114,Schlaefriger Berg,,50.2319,6.4458,536 +DM/RP-115,Kyller Hoehe,,50.2794,6.6839,535 +DM/RP-116,Kirschkaul,,50.1786,6.6472,535 +DM/RP-117,Huersnueck,,50.4206,6.8825,534 +DM/RP-118,Geisshecke,,50.2261,6.7083,533 +DM/RP-119,Wolfsbeuel,,50.2583,6.6389,531 +DM/RP-120,Gossberg,,50.2725,6.7031,530 +DM/RP-121,Auf der Held,,50.0692,6.6217,529 +DM/RP-122,Buerberg,,50.1333,6.7514,528 +DM/RP-123,Eich,,50.2183,6.3594,525 +DM/RP-124,Hohe Warte,,50.3519,7.0711,523 +DM/RP-125,Buberg,,50.3006,6.6983,519 +DM/RP-126,Grosser Schimmel,,50.1358,6.5772,512 +DM/RP-127,Mosenberg,,50.0814,6.7803,517 +DM/RP-128,Kockelsberg,,50.3578,6.5383,516 +DM/RP-129,Kreutzberg,,50.2236,6.9458,516 +DM/RP-130,Katzenberg,,50.2958,6.6064,515 +DM/RP-131,Auf Erbenschell,,50.2669,6.7208,512 +DM/RP-132,Hatzert,,50.3644,6.8925,509 +DM/RP-133,Heiserberg,,50.3019,6.6806,508 +DM/RP-134,Acht,,50.2750,6.5911,503 +DM/RP-135,Hanert,,50.1542,6.6247,502 +DM/RP-136,Wadt,,50.3567,6.8894,502 +DM/RP-137,Moeschelberg,,50.3203,6.6050,498 +DM/RP-138,Heider Koepfchen,,50.0906,6.5897,498 +DM/RP-139,Bunesnueck,,50.4133,6.8461,496 +DM/RP-140,Hoemmerich,,50.3653,6.8703,496 +DM/RP-141,Ebenserberg,,50.3064,6.6733,492 +DM/RP-142,Ahlert,,50.3419,7.1372,492 +DM/RP-143,Schaelkopf,,50.3447,7.1617,492 +DM/RP-144,Ettringer Bellberg,,50.3503,7.2281,487 +DM/RP-145,Kauligenberg,,50.3617,6.6714,485 +DM/RP-146,Eulenkopf,,50.4206,6.8578,467 +DM/RP-147,Schrack,,50.0350,6.9356,442 +DM/RP-148,Taubenberg,,50.0397,6.5700,438 +DM/RP-149,Schafstall,,50.1011,7.0972,423 +DM/RP-150,Kinheimer Berg,,49.98889923,7.04440022,420 +DM/RP-150,Kinheimer Berg,,49.9889,7.0444,420 +DM/RP-151,Falkenlay,,50.0833,7.0217,414 +DM/RP-152,Sollig,,50.0625,7.1183,398 +DM/RP-153,Flemmert,,50.0172,6.8411,392 +DM/RP-154,Calmont,,50.1089,7.1256,378 +DM/RP-155,Hochheid,,50.0800,7.1078,372 +DM/RP-156,Obergein,,50.3081,7.2794,361 +DM/RP-157,Sammetzkopf,,50.2589,7.2850,342 +DM/RP-158,Erbeskopf,,49.72919846,7.08939981,816 +DM/RP-159,Sandkopf,,49.7328,7.0983,802 +DM/RP-160,An den zwei Steinen,,49.83440018,7.22609997,766 +DM/RP-161,Springenkopf,,49.7219,7.0708,784 +DM/RP-162,Steingeruettekopf,,49.8100,7.1839,757 +DM/RP-163,Sandkopf,,49.6781,7.0272,757 +DM/RP-164,Idarkopf,,49.8611,7.2714,746 +DM/RP-165,Diebskopf,,49.6722,7.0036,739 +DM/RP-166,Sensweiler Hoehe,,49.7931,7.1558,734 +DM/RP-167,Usarkopf,,49.7822,7.1372,725 +DM/RP-168,Viehauskopf,,49.7164,7.0558,721 +DM/RP-169,Butterhecker Steinkoepfe,,49.7397,7.1797,714 +DM/RP-170,Ringelkopf,,49.7289,7.1450,712 +DM/RP-171,Roesterkopf,,49.67530060,6.83440018,708 +DM/RP-172,Friedrichskopf,,49.6597,7.0600,707 +DM/RP-173,Steinkopf,,49.7106,7.0086,683 +DM/RP-174,Pfannenfelskopf,,49.7461,7.1997,680 +DM/RP-175,Hasselsang,,49.7711,7.1258,674 +DM/RP-176,Hohe Wurzel,,49.7047,6.8622,669 +DM/RP-177,Sandkopf,,49.7708,7.2497,665 +DM/RP-178,Haardtkopf,,49.84889984,7.05999994,659 +DM/RP-179,Ellerspring,,49.91329956,7.61250019,656 +DM/RP-180,Simmerkopf,,49.9369,7.5950,653 +DM/RP-181,Hochsteinchen,,49.9789,7.6831,648 +DM/RP-182,Moerschieder Burr,,49.7856,7.2778,646 +DM/RP-183,Schanzerkopf,,49.9594,7.6369,643 +DM/RP-184,Roederberg,,49.7311,7.0317,641 +DM/RP-185,–desborner Hoehe,,49.9172,7.6219,638 +DM/RP-186,Ranzenkopf,,49.8381,7.0294,637 +DM/RP-187,Wildenburger Kopf,,49.77610016,7.25640011,664 +DM/RP-188,Ginsterkopf,,49.9450,7.6042,633 +DM/RP-189,Ochsenbaumer Hoehe,,49.9550,7.6158,632 +DM/RP-190,Wildburghoehe,,49.9097,7.5603,629 +DM/RP-191,Salzkopf,,49.9981,7.7808,628 +DM/RP-192,Silberich,,49.7586,7.2269,623 +DM/RP-193,Kandrich,,49.99309921,7.72609997,623 +DM/RP-194,Alteburg,,49.8797,7.5464,620 +DM/RP-195,Hoelzerkopf,,49.9231,7.6336,603 +DM/RP-196,Herzeter Hecke,,49.7561,7.1025,601 +DM/RP-197,Womrather Hoehe,,49.85359955,7.44920015,597 +DM/RP-198,Auerhahnkopf,,49.9825,7.7789,574 +DM/RP-199,Luftekopf,,50.0867,7.6222,551 +DM/RP-200,Klepp,,49.8800,7.1881,551 +DM/RP-201,Koppensteiner Hoehe,,49.8767,7.4897,539 +DM/RP-202,Guellheck,,50.1761,7.6075,534 +DM/RP-203,Katzenstein,,49.8606,7.4594,533 +DM/RP-204,Fleckertshoehe,,50.1864,7.6050,530 +DM/RP-205,Hochfels,,49.9697,7.6997,530 +DM/RP-206,Scheidling,,49.7794,7.0883,519 +DM/RP-207,Hoher Stein,,50.1228,7.6436,504 +DM/RP-208,Graskopf,,50.1936,7.5947,502 +DM/RP-209,Steinerner Mann,,49.6047,7.2064,496 +DM/RP-210,Rossel,,49.9733,7.8031,495 +DM/RP-211,Hohe Buch,,50.0583,7.4408,486 +DM/RP-212,Adams Berg,,49.7733,7.0656,481 +DM/RP-213,Oderter Kopf,,49.7842,7.0628,480 +DM/RP-214,Goettschieder Berg,,49.7167,7.3361,473 +DM/RP-215,Horstkopf,,50.2403,7.5161,463 +DM/RP-216,Thonhuegel,,50.0650,7.3189,463 +DM/RP-217,Eichen Berg,,50.1664,7.5842,459 +DM/RP-218,Mehringerberg,,49.7772,6.8472,455 +DM/RP-219,Auf der Huette,,50.0469,7.3022,452 +DM/RP-220,Rothekopf,,50.0583,7.2058,438 +DM/RP-221,Alte Schanzen,,49.9211,7.0978,436 +DM/RP-222,Waldeck,,50.0622,7.2728,434 +DM/RP-223,Kuppensteiner Wild,,49.7025,6.7083,427 +DM/RP-224,Schock,,50.16109848,7.32140017,426 +DM/RP-225,Bummkopf,,50.0017,7.1633,421 +DM/RP-226,Homberg,,49.8553,7.6903,418 +DM/RP-227,Kohlenberg,,49.9461,7.7447,417 +DM/RP-228,Spitzenstein,,50.1283,7.6947,412 +DM/RP-229,Dickenberg,,50.2569,7.4703,404 +DM/RP-230,Wolfer Berg,,49.9531,7.0856,400 +DM/RP-231,Maulbeerkopf,,50.2867,7.5706,398 +DM/RP-232,Rabenkopf,,50.0489,7.7525,395 +DM/RP-233,Auf Soell,,49.8014,6.8675,395 +DM/RP-234,Stoekert,,49.9633,7.8486,387 +DM/RP-235,Spitzenkopf,,49.7667,7.4258,386 +DM/RP-236,Kuehkopf,,50.3094,7.5692,382 +DM/RP-237,Endeler Koepfe,,49.9617,7.1550,382 +DM/RP-238,Hurtskopf,,50.1522,7.3047,378 +DM/RP-239,Schafberg,,50.2383,7.4581,370 +DM/RP-240,Hellberg,,49.7922,7.4964,366 +DM/RP-241,In den Hecken,,49.6747,6.4947,365 +DM/RP-242,Kalkberg,,50.1033,7.2550,347 +DM/RP-243,Geisenkopf,,50.0383,7.1842,346 +DM/RP-244,Wischkopf,,49.8992,7.0314,339 +DM/RP-245,Welschberg,,49.8267,7.7181,336 +DM/RP-246,Schanzenkopf,,49.82669830,7.83330011,321 +DM/RP-247,Beierberg,,50.2100,7.4092,317 +DM/RP-248,Valwigerberg,,50.1525,7.2164,316 +DM/RP-249,Muensterer Kopf,,49.9478,7.8769,301 +DM/RP-250,Forstberg,,50.2794,7.4769,286 +DM/RP-251,Felcheskopf,,50.1803,7.3178,261 +DM/RP-252,Prinzenkopf,,50.0469,7.1289,238 +DM/RP-253,Carolahoehe,,50.3139,7.5292,235 +DM/RP-254,Dommelberg,,50.3186,7.5839,223 +DM/RP-255,Schwedenschanze,,50.3247,7.5597,215 +DM/RP-256,Muehlberg,,49.9161,08.2233,243 +DM/RP-257,Grabenkopf,,49.8081,7.8775,298 +DM/RP-258,Petersberg,,49.7944,08.2039,246 +DM/RP-259,Horn,,49.7942,7.9350,271 +DM/RP-260,Schlossberg,,49.7875,7.8600,336 +DM/RP-261,Gangels-Berg,,49.79190063,7.73610020,341 +DM/RP-262,Lem-Berg,,49.78170013,7.76749992,421 +DM/RP-263,Kohlbusch,,49.6794,7.8917,444 +DM/RP-264,Stolzenberg,,49.6789,7.8097,340 +DM/RP-265,Molleberg,,49.6703,7.4811,454 +DM/RP-266,Dreiherrenstein,,49.6669,7.3847,581 +DM/RP-267,Mahlbergskopf,,49.6839,7.3789,596 +DM/RP-268,Radeberg,,49.6833,7.3092,434 +DM/RP-269,Steinberg,,49.6714,7.3311,547 +DM/RP-270,Wilsenberg,,49.6797,7.4311,545 +DM/RP-271,Stahlberg,,49.65499878,7.78970003,489 +DM/RP-272,Koenigsstuhl / Donnersberg,,49.62530136,7.91470003,687 +DM/RP-273,Kindelhell,,49.6417,7.4519,490 +DM/RP-274,Steinberg,,49.6028,7.8417,438 +DM/RP-275,Bickberg,,49.6000,7.8811,559 +DM/RP-276,Hohenfels,,49.6022,7.8928,544 +DM/RP-277,Reiserberg,,49.5550,7.7328,460 +DM/RP-278,Kiefernkopf,,49.5553,7.5331,533 +DM/RP-279,Steinerner Mann,,49.5572,7.5186,497 +DM/RP-280,Eulen-Berg,,49.3672,7.8383,490 +DM/RP-281,Muecken-Berg,,49.3658,7.8650,516 +DM/RP-282,Vorderer Gleisberg,,49.3728,7.9894,463 +DM/RP-283,Mittlerer Gleisberg,,49.36690140,7.99639988,471 +DM/RP-284,Hinterer Gleisberg,,49.3656,08.0044,468 +DM/RP-285,Unterstaedter Berg,,49.3792,08.0292,422 +DM/RP-286,Kaisergarten,,49.3550,08.0517,519 +DM/RP-287,Weinbiet,,49.37580109,8.12139988,554 +DM/RP-288,Nollenkopf,,49.3442,08.1133,490 +DM/RP-289,Platte,,49.3403,08.0603,561 +DM/RP-290,Jakobs-Hoehe,,49.3333,08.0358,517 +DM/RP-291,Kanzel-Kopf,,49.3250,08.0114,488 +DM/RP-292,Juden-Kopf,,49.3317,08.0017,430 +DM/RP-293,Gruenberg,,49.3361,7.9644,425 +DM/RP-294,Brogberg,,49.3303,7.8969,566 +DM/RP-295,Am Piquet,,49.3172,7.6725,429 +DM/RP-296,Steinberg,,49.3206,7.8228,528 +DM/RP-297,Schindhuebel,,49.3267,7.8753,571 +DM/RP-298,Eschkopf,,49.31029892,7.85389996,608 +DM/RP-299,Geiskopf,,49.3103,7.9267,567 +DM/RP-300,Rothsolberg,,49.3181,08.0508,607 +DM/RP-301,Schafkopf,,49.3125,08.0478,616 +DM/RP-302,Kalmit,,49.31859970,8.08310032,672 +DM/RP-303,Sommerberg,,49.3219,08.1056,502 +DM/RP-304,Hohe Loog,,49.3325,08.0950,619 +DM/RP-305,Hochberg,,49.29859924,8.07079983,635 +DM/RP-306,Steigerkopf,,49.2969,08.0261,614 +DM/RP-307,Hermeskopf,,49.29059982,8.00329971,581 +DM/RP-308,Erlenkopf,,49.2928,7.9381,552 +DM/RP-309,Mosisberg,,49.3000,7.8544,609 +DM/RP-310,Harzofenberg,,49.26639938,7.98530006,556 +DM/RP-311,Rossberg,,49.26169968,8.02939987,637 +DM/RP-312,Blaettersberg,,49.26940155,8.06750011,605 +DM/RP-313,Ringelsberg,,49.2339,08.0483,462 +DM/RP-314,Kehrenkopf,,49.2308,7.9486,530 +DM/RP-315,Spitze Boll,,49.2319,7.8142,540 +DM/RP-316,Kurzelberg,,49.22779846,7.70970011,463 +DM/RP-317,Hoch-Berg,,49.16439819,7.79780006,421 +DM/RP-318,Wolfshorn,,49.16189957,7.85419989,477 +DM/RP-319,Trautelsberg,,49.15219879,7.98920012,504 +DM/RP-320,Puhlstein,,49.13059998,7.85279989,446 +DM/RP-321,Dickenberg,,49.1339,7.8100,356 +DM/RP-322,Grosser Eyberg,,49.12390137,7.74860001,513 +DM/RP-323,Hohelist,,49.11610031,7.62220001,476 +DM/RP-324,Dretschberger Kopf,,49.1164,7.7542,460 +DM/RP-325,Juengstberg,,49.11220169,7.82219982,491 +DM/RP-326,Kahlenberg,,49.1033,7.9367,405 +DM/RP-327,Hohenberg,,49.0772,7.9511,420 +DM/RP-328,Schlossberg,,49.0772,7.9208,503 +DM/RP-329,Bobenthaler Knopf,,49.06779861,7.87529993,534 +DM/RP-330,Grosser Hum-Berg,,49.07419968,7.82329988,456 +DM/RP-331,Florenberg,,49.05469894,7.68470001,465 +DM/RP-332,Schmobberg,,49.0708,7.7722,524 +DM/RP-333,Kuehfelderstein,,50.6911,08.0553,697 +DM/RP-334,Fuchskaute,,50.66059875,8.10190010,656 +DM/RP-335,Salzburger Kopf,,50.6711,08.0536,654 +DM/RP-336,Stegskopf,,50.7017,08.0236,654 +DM/RP-337,Altenberg,,50.6508,08.1108,651 +DM/RP-338,Galgenberg,,50.6697,08.0428,649 +DM/RP-339,Homberg,,50.6425,08.1011,634 +DM/RP-340,Hoellenkopf,,50.7092,08.0394,628 +DM/RP-341,Troedelsteine,,50.7278,08.0369,613 +DM/RP-342,Marienberger Hoehe,,50.6600,7.9394,568 +DM/RP-343,Stirnskopf,,50.7133,08.0172,555 +DM/RP-344,Koeppel,,50.4306,7.7508,540 +DM/RP-345,Lippersberg,,50.4194,7.7467,535 +DM/RP-346,Seltersberg,,50.7206,08.0100,532 +DM/RP-347,Hommelshahn,,50.7433,7.9981,518 +DM/RP-348,Windhahn,,50.79809952,7.93470001,517 +DM/RP-349,Hohenseelbachskopf,,50.7564,7.9892,504 +DM/RP-350,Steinkopf,,50.7342,7.9108,500 +DM/RP-351,Schimmerich,,50.7186,7.9767,493 +DM/RP-352,Ziest,,50.6592,7.9147,489 +DM/RP-353,Auf der Burg,,50.7314,7.9519,488 +DM/RP-354,Beulstein,,50.5186,7.8597,483 +DM/RP-355,Knoepfchen,,50.9297,7.7772,480 +DM/RP-356,Hartenfelser Kopf,,50.6136,7.7678,479 +DM/RP-357,Unterer Kopf,,50.6508,7.8603,475 +DM/RP-358,Girkenrother Kopf,,50.5181,7.9789,461 +DM/RP-359,Weisser Stein,,50.3661,7.7669,458 +DM/RP-360,Scharfenstein,,50.6372,7.9117,455 +DM/RP-361,Haeuscher,,50.3475,7.7433,454 +DM/RP-362,Spitzheckerrueck,,50.3553,7.8014,451 +DM/RP-363,Kohlen-Berg,,50.7592,7.9497,447 +DM/RP-364,Zipfen,,50.4442,7.7367,446 +DM/RP-365,Hoechst,,50.37580109,7.90609980,444 +DM/RP-365,Hoechst,,50.3758,7.9061,444 +DM/RP-366,Asberg,,50.62670135,7.29500008,441 +DM/RP-367,Ziehenberg,,50.5631,08.0028,435 +DM/RP-368,Hohe Hahnscheid,,50.5550,08.0367,433 +DM/RP-369,Gruener Hahn,,50.6625,7.8561,432 +DM/RP-370,Ars-Berg,,50.7672,7.8897,430 +DM/RP-371,Hachenburger-Hoehe,,50.7608,7.9364,430 +DM/RP-372,Meerberg,,50.6064,7.2969,422 +DM/RP-373,Kohlhack,,50.5414,08.0608,410 +DM/RP-374,Wasserberg,,50.7828,7.9203,407 +DM/RP-375,Niessling,,50.4011,7.7306,407 +DM/RP-376,Hollenstein,,50.8900,7.7636,406 +DM/RP-377,Huemerich,,50.7681,7.8150,399 +DM/RP-378,Hoelz-Berg,,50.4756,7.7211,391 +DM/RP-379,Eisenkauten,,50.3278,7.8183,376 +DM/RP-380,Hohenmalberg,,50.3181,7.7039,376 +DM/RP-381,Horchheimer Hoehe,,50.3311,7.6297,357 +DM/RP-382,Bertenauer Kopf,,50.6136,7.4394,352 +DM/RP-383,Geierkopf,,50.3289,7.6583,318 +DM/RP-384,Schnatzberg,,50.4339,7.5994,268 +DM/RP-385,Friedrichsthaler Kopf,,50.5006,7.4286,268 +DM/RP-386,Kronenberg,,50.5239,7.3286,211 +DM/RP-387,Abtskopf,,49.13579941,7.96080017,487 +DM/RP-388,Almersberg,,49.24810028,7.92000008,564 +DM/RP-389,Auf Brauer,,49.9014,6.9222,434 +DM/RP-390,Barl,,50.03030014,7.15689993,283 +DM/RP-391,Baumwalder Kopf,,49.22579956,7.73500013,473 +DM/RP-392,Bei den drei Felsen,,49.23249817,7.90420008,422 +DM/RP-393,Burgberg,,49.94079971,6.83780003,351 +DM/RP-394,Drachenfels,,49.42419815,8.05189991,571 +DM/RP-395,Ebersberg,,49.18579865,7.95030022,462 +DM/RP-396,Eichelberg,,49.15560150,7.93030024,406 +DM/RP-397,Foehrlenberg,,49.19169998,7.99860001,533 +DM/RP-398,Giebelberg,,50.84389877,7.91029978,527 +DM/RP-399,Goeckelberg,,49.22219849,7.88749981,408 +DM/RP-400,Grosser Adelberg,,49.21580124,7.95779991,567 +DM/RP-401,Grosser Hellenberg,,49.17250061,7.76609993,379 +DM/RP-402,Grosser Mueckenkopf,,49.12310028,7.70940018,485 +DM/RP-403,Gruenberg,,49.11029816,7.87109995,410 +DM/RP-404,Heidenberg,,49.11560059,7.83610010,420 +DM/RP-405,Heischberg,,49.18719864,7.91359997,413 +DM/RP-406,Herrmannsberg,,49.57310104,7.52330017,536 +DM/RP-407,Hochkessel,,50.07939911,7.16669989,421 +DM/RP-408,Hochsimmer,,50.3603,7.2025,588 +DM/RP-409,Hochstein,,50.37170029,7.21920013,562 +DM/RP-410,Hochthuermenberg,,50.5281,6.9081,500 +DM/RP-411,Hohe Derst,,49.08560181,7.91359997,561 +DM/RP-412,Hoehe Haardter Hochwald,,49.94779968,6.85580015,355 +DM/RP-413,Hohenberg,,49.20280075,8.00500011,552 +DM/RP-414,Hollenberg,,49.19559860,7.89919996,455 +DM/RP-415,Hummelberg,,49.18080139,7.67889977,475 +DM/RP-416,Immersberg,,49.15530014,7.90000010,462 +DM/RP-417,Kesselberg,,49.28440094,8.04469967,662 +DM/RP-418,Kesselsberge,,49.92029953,7.69059992,582 +DM/RP-419,Kippenberg,,49.09389877,7.72279978,367 +DM/RP-420,Koenigsberg,,49.57529831,7.57859993,569 +DM/RP-421,Kronenberg,,49.82419968,6.91720009,376 +DM/RP-422,Krufter Ofen,,50.40140152,7.29279995,463 +DM/RP-423,Krummer Ellenbogen,,49.09080124,7.88420010,515 +DM/RP-424,Langenberg 1,,49.20280075,7.71969986,438 +DM/RP-425,Mollenkopf,,49.39390182,7.98360014,506 +DM/RP-426,Montabaurer Hoehe,,50.42499924,7.73390007,545 +DM/RP-427,Nestelberg,,49.09999847,7.85780001,402 +DM/RP-428,Nestel-Berg,,49.06809998,7.73000002,442 +DM/RP-429,Neuholz,,49.05810165,7.81309986,482 +DM/RP-430,Opel,,49.93889999,7.66109991,649 +DM/RP-431,Orensberg,,49.24390030,8.02750015,581 +DM/RP-432,Potzberg,,49.52080154,7.48000002,562 +DM/RP-433,Rehberg,,49.18140030,7.97030020,564 +DM/RP-434,Rindskehler Kopf,,49.43470001,8.13440037,462 +DM/RP-435,Rosenberg,,49.68310165,6.52500010,356 +DM/RP-436,Rothenberg 1,,49.96469879,6.98610020,365 +DM/RP-437,Rothenberg 2,,49.17079926,8.00440025,476 +DM/RP-438,Rothenberg 3,,49.19720078,7.92780018,462 +DM/RP-439,Salzwooger Hoehe,,49.17559814,7.72639990,367 +DM/RP-440,Schlack,,50.09360123,7.20919991,394 +DM/RP-441,Schletterberg,,49.17580032,7.99359989,523 +DM/RP-442,Schnepfenberg,,49.19060135,7.70669985,434 +DM/RP-443,Schoeneberg,,50.43109894,7.06939983,668 +DM/RP-444,Sindelsberg,,49.06060028,7.77780008,519 +DM/RP-445,Steinerberg,,50.49639893,7.01639986,531 +DM/RP-446,Sternenwald,,50.04610062,7.11329985,301 +DM/RP-447,Stueter Kopf,,49.43610001,8.03439999,486 +DM/RP-448,Teufelsberg,,49.25189972,8.05389977,598 +DM/RP-449,Teufelskopf,,49.59780121,6.82390022,695 +DM/RP-450,Vorderer Langenberg,,49.41579819,8.12889957,545 +DM/RP-450,Vorderer Langenberg,,49.4158,08.1289,545 +DM/RP-451,Wasserstein,,49.09500122,7.75810003,454 +DM/RP-452,Wehlener Wald,,49.94810104,6.97389984,361 +DM/RP-453,Zoonenberg,,49.84389877,6.68440008,402 +DM/RP-454,Dachsberg,,49.05860138,7.72529984,427 +DM/RP-455,Dachskoepfe,,50.23500061,7.70060015,457 +DM/RP-456,Dernbacher Kopf,,50.53639984,7.57690001,427 +DM/RP-457,Erbenstein,,49.66310120,7.37669992,608 +DM/RP-458,Erlenkopf,,49.08280182,7.58249998,467 +DM/RP-459,Felsentisch,,49.20890045,7.90829992,435 +DM/RP-460,Forstnueck,,50.40670013,6.88000011,564 +DM/RP-461,Grosse Boll,,49.22639847,7.78919983,533 +DM/RP-462,Grosser Eichelberg 2,,49.10359955,7.91779995,481 +DM/RP-463,Grosser Hausberg,,49.39889908,7.62500000,471 +DM/RP-464,Harsten,,49.80189896,7.76690006,303 +DM/RP-465,Hoehe Nusbaumer Hardt,,49.88079834,6.37060022,415 +DM/RP-466,Hoehe Piesport,,49.90110016,6.92220020,434 +DM/RP-467,Hoehe Rheingrafenheck,,49.58280182,7.65170002,447 +DM/RP-468,Hoehe Tannenwald,,49.12310028,7.88420010,364 +DM/RP-469,Hoehe Welschneudorfer Wald,,50.37639999,7.78529978,481 +DM/RP-470,Karmelenberg,,50.34500122,7.42280006,373 +DM/RP-471,Kellerberg,,49.89419937,6.76109982,447 +DM/RP-472,Kettrichhofer Hoehe,,49.13859940,7.59250021,461 +DM/RP-473,Korrelsberg,,50.3806,7.3572,293 +DM/RP-474,Langenberg 2,,49.23889923,7.69080019,428 +DM/RP-475,Lerchenberg,,49.94029999,8.16059971,258 +DM/RP-476,Linder Hoehe 2,,50.4911,6.9261,490 +DM/RP-477,Maring,,49.92419815,7.01079988,244 +DM/RP-478,Mehringer Berg,,49.81639862,6.78809977,415 +DM/RP-479,Mittlerer Krebser,,49.40670013,7.80030012,437 +DM/RP-480,Oberste Wald,,49.65499878,6.57670021,249 +DM/RP-481,Potschberg,,49.54529953,7.56419992,481 +DM/RP-482,Rahnfels,,49.47079849,8.08940029,516 +DM/RP-483,Reudelheck,,50.04579926,7.04080009,478 +DM/RP-484,Rochusberg Bingen,,49.95920181,7.90250015,245 +DM/RP-485,Rockeskyller Kopf,,50.25249863,6.67999983,549 +DM/RP-486,Rumberg,,49.05780029,7.66079998,401 +DM/RP-487,Sarrscher Hochwald Hoehe,,49.56439972,6.64470005,535 +DM/RP-488,Selberg,,49.56079865,7.59390020,545 +DM/RP-489,Stoeppelberg,,49.92110062,6.90749979,363 +DM/RP-490,Vogelskopf,,49.13669968,7.90999985,434 +DM/RP-491,Watzenhahn,,50.52859879,7.98420000,476 +DM/RP-492,Blackemichberg,,50.36029816,7.07969999,582 +DM/RP-493,Hohe Rain,,50.38669968,7.12279987,544 +DM/RP-494,Wegelnburg,,49.06140137,7.78719997,571 +DM/RP-495,Schluesselfelsen,,49.07170105,7.77689981,526 +DM/RP-496,Hinterer Stoppelkopf,,49.39720154,8.07359982,566 +DM/RP-497,Leuchtenberg,,49.48080063,8.06309986,492 +DM/RP-498,Grohesrondell,,49.60530090,7.89249992,570 +DM/RP-499,Bosenberg,,49.85609818,7.93060017,227 +DM/RP-500,Grosser Rauhberg,,49.20309830,7.87109995,377 +DM/RP-501,Dietelsberg,,49.48720169,7.47889996,433 +DM/SA-001,Brocken,,51.79916667,10.61527778,1142 +DM/SA-002,Koenigsberg,,51.78861111,10.59805556,1023 +DM/SA-004,Grosser Winterberg,,51.76055556,10.62444444,907 +DM/SA-005,Leistenklippen,,51.78166667,10.69416667,900 +DM/SA-006,Grenzklippen,,51.78500000,10.68361111,886 +DM/SA-007,Hoellenklippen,,51.78638889,10.67972222,880 +DM/SA-008,Schlungsklippe,,51.77861111,10.65972222,854 +DM/SA-009,Baerenklippen,,51.77833333,10.69472222,850 +DM/SA-010,Erdbeerkopf,,51.77361111,10.67833333,848 +DM/SA-011,Kleiner Winterberg,,51.75611111,10.63444444,836 +DM/SA-012,Ahrensklint,,51.77305556,10.66694444,822 +DM/SA-013,Landmannklippe,,51.79055556,10.67583333,805 +DM/SA-014,Hohnekopf,,51.77555556,10.69888889,835 +DM/SA-015,Feuersteinklippe,,51.76666667,10.67722222,761 +DM/SA-017,Kleiner Jaegerkopf,,51.81166667,10.67083333,725 +DM/SA-018,Hohensteinklippen,,51.79305556,10.70722222,656 +DM/SA-019,Birkenkopf,,51.60277778,10.89722222,600 +DM/SA-020,Grosser Auerberg,,51.58027778,11.00583333,580 +DM/SA-021,Kantorberg,,51.83277778,10.69388889,572 +DM/SA-022,Eichenforst,,51.55388889,10.92444444,495 +DM/SA-023,Armeleuteberg,,51.81638889,10.78111111,478 +DM/SA-024,Harburg,,51.81833333,10.78833333,475 +DM/SA-025,Eichenberg,,51.79250000,10.92944444,416 +DM/SA-026,Ziegenkopf,,51.78777778,10.93388889,407 +DM/SA-027,Agnesberg,,51.83000000,10.79861111,395 +DM/SA-028,Teufelsmauer,,51.78527778,10.97138889,324 +DM/SA-029,Ziegenberg,,51.82388889,10.89833333,316 +DM/SA-030,Buchenberg,,51.95109940,10.93640041,314 +DM/SA-031,Regenstein,,51.81277778,10.96222222,294 +DM/SA-032,Horstberg,,51.84111111,10.82027778,288 +DM/SA-033,Petersberg,,51.59609985,11.95419979,250 +DM/SA-034,Gegensteine,,51.73694444,11.22694444,244 +DM/SA-035,Schnarcherklippe,,51.75694444,10.66361111,671 +DM/SA-036,Spiegelsberge,,51.87361111,11.04305556,180 +DM/SA-037,Grosser Rodenberg,,52.19861111,11.07777778,207 +DM/SA-038,Kahler Berg,,52.09777778,11.21500000,208 +DM/SA-039,Scharfensteinklippe,,51.83222222,10.60000000,698 +DM/SA-040,Untere Zeterklippe,,51.80805556,10.64277778,827 +DM/SA-041,Trudenstein,,51.77250000,10.70000000,741 +DM/SA-042,Sonnenklippe,,51.81416667,10.65805556,749 +DM/SA-043,Wolfsklippe,,51.81888889,10.67277778,723 +DM/SA-044,Grosser Birkenkopf,,51.81138889,10.68444444,665 +DM/SA-045,Brandhai,,51.60944444,10.87500000,558 +DM/SA-046,Carlshausturm,,51.65638889,10.79638889,626 +DM/SA-047,Hoppelberg,,51.84166667,11.00250000,307 +DM/SA-048,Viktorshoehe,,51.68611111,11.08388889,582 +DM/SA-049,Halberstaedter Berg,,51.84250000,10.68888889,571 +DM/SA-050,Stapenberg,,51.82583333,10.84694444,443 +DM/SA-051,Henkersberg,,51.81166667,10.82111111,478 +DM/SA-052,Haltberg,,51.62611111,11.91416667,185 +DM/SA-053,Grosser Fallstein,,52.01359940,10.71529961,288 +DM/SA-054,Domburg,,51.87666667,11.31694444,241 +DM/SR-001,Dollberg,,49.63250000,07.01833333,695 +DM/SR-002,Schimmelkopf,,49.58916667,06.80583333,695 +DM/SR-003,Turmschneise,,49.57916667,06.75222222,659 +DM/SR-004,Weissfels,,49.62972222,07.03444444,624 +DM/SR-005,Hunnenring,,49.62083333,07.00250000,620 +DM/SR-006,Trautzberg,,49.55189896,7.27250004,604 +DM/SR-006,Trautzberg,,49.55194444,07.27250000,604 +DM/SR-007,Fuesselberg,,49.53469849,7.23530006,595 +DM/SR-008,Sinnenberg,,49.57220078,7.00439978,584 +DM/SR-009,Weiselberg,,49.52249908,7.24359989,569 +DM/SR-010,Benkelberg,,49.60972222,06.90000000,564 +DM/SR-011,Kahlenberg,,49.61250000,06.98527778,564 +DM/SR-012,Schaumberg,,49.48638889,07.02916667,569 +DM/SR-013,Leyenberg,,49.62111111,06.94666667,551 +DM/SR-014,Schankelberg,,49.62361111,06.96444444,550 +DM/SR-015,Felsenberg,,49.60333333,06.89027778,537 +DM/SR-016,Huebelberg,,49.57805556,06.82305556,522 +DM/SR-017,Hoecherberg,,49.39720154,7.26580000,518 +DM/SR-018,Leissberg,,49.52859879,7.08389997,512 +DM/SR-019,Losenberg,,49.52916667,07.06222222,512 +DM/SR-020,Heidenkopf,,49.56722222,07.14027778,505 +DM/SR-021,Langheck,,49.51190186,6.95139980,502 +DM/SR-022,Fallenseifenberg,,49.60083333,06.87083333,499 +DM/SR-023,Trausberg,,49.50444444,06.98416667,499 +DM/SR-024,Bosenberg,,49.47500000,07.19861111,485 +DM/SR-025,Donnerhuebel,,49.46138889,06.93972222,452 +DM/SR-026,Wintersteinchen,,49.52722222,06.56361111,447 +DM/SR-027,Steinhuegel,,49.50277778,07.25111111,444 +DM/SR-028,Kemelsberg,,49.46666667,06.50000000,442 +DM/SR-029,Vogelsfelsen,,49.52333333,06.61750000,430 +DM/SR-030,Hoehnenberg,,49.39916667,07.19333333,427 +DM/SR-031,Lutwinusschneise,,49.51472222,06.57333333,416 +DM/SR-032,Grosser Elmersberg,,49.40250000,06.99972222,414 +DM/SR-033,Hoxberg,,49.39027778,06.88111111,414 +DM/SR-034,Leukerkopf,,49.50777778,06.56472222,414 +DM/SR-035,Litermont,,49.40138889,06.78638889,414 +DM/SR-035,Litermont,,49.40140152,6.78639984,414 +DM/SR-036,Kirschholzberg,,49.48500000,06.90388889,408 +DM/SR-037,Renglischberg,,49.52222222,06.44833333,408 +DM/SR-038,Bueschfelder Hecken,,49.50138889,06.88972222,405 +DM/SR-039,Peterkopf,,49.50833333,06.64222222,403 +DM/SR-040,Betzentaler Berg,,49.26110077,7.12279987,402 +DM/SR-041,Dilsberg,,49.54000000,06.91527778,402 +DM/SR-042,Galgenberg,,49.50000000,06.73805556,401 +DM/SR-043,Kahlenberg,,49.18611111,07.27305556,401 +DM/SR-044,Schallenberg,,49.49166667,06.80194444,401 +DM/SR-045,Steinkopf,,49.25220108,7.10580015,401 +DM/SR-045,Steinkopf,,49.25222222,07.10583333,401 +DM/SR-046,Weidenberg,,49.25666667,07.14166667,401 +DM/SR-047,Grosser Stiefel,,49.25527778,07.08916667,397 +DM/SR-048,Oppener Kuppe,,49.46194444,06.78722222,388 +DM/SR-049,Scheidberg,,49.32220078,6.65829992,388 +DM/SR-050,Hardt,,49.15694444,07.18222222,386 +DM/SR-051,Totenkopf,,49.13055556,07.24138889,386 +DM/SR-052,Hohberg,,49.46416667,06.77472222,382 +DM/SR-053,Hirschberg,,49.28500000,07.24583333,381 +DM/SR-054,Gallenberg,,49.33527778,06.64333333,377 +DM/SR-055,Sauberg,,49.28166667,06.68388889,377 +DM/SR-056,Schwarzenberg,,49.24666667,07.04027778,377 +DM/SR-057,Hoher Kopf,,49.29361111,07.25500000,373 +DM/SR-058,Hannock,,49.16666667,07.18805556,372 +DM/SR-059,Saarlouiser Berg,,49.42972222,06.67194444,372 +DM/SR-060,Kahlenberg,,49.27000000,07.14611111,371 +DM/SR-061,Klosterberg,,49.28722222,07.29333333,370 +DM/SR-062,Ransbacher Berg,,49.17722222,07.08638889,368 +DM/SR-063,Kahler Berg,,49.20000000,07.27222222,364 +DM/SR-064,Hoheberg,,49.43138889,06.65000000,362 +DM/SR-065,Auberg,,49.16972222,07.06027778,360 +DM/SR-066,Bartenberg,,49.25777778,07.05972222,359 +DM/SR-067,Limberg,,49.34472222,06.68805556,359 +DM/SR-068,Hirnberg,,49.33361111,06.61944444,356 +DM/SR-069,Gischberg,,49.44444444,06.81666667,350 +DM/SR-070,Geisberg,,49.40277778,06.63000000,348 +DM/SR-071,Neuenberg,,49.37500000,06.62694444,337 +DM/SR-072,Hoesberg,,49.35777778,06.68111111,326 +DM/SR-073,Eisenkopf,,49.51472222,06.59361111,317 +DM/SR-074,Schreck,,49.58580017,6.95889997,535 +DM/SR-074,Schreck,,49.58583333,06.95972222,535 +DM/SR-075,Langensteinchen,,49.52999878,6.57390022,451 +DM/SR-076,Goettelborner Hoehe,,49.34027778,07.01694444,438 +DM/SR-077,Hargartener Hoehe,,49.45305556,06.71194444,417 +DM/SR-078,Hoehe Kirkeler Wald,,49.28305556,07.26250000,382 +DM/SR-079,Siersburger Hoehe,,49.37138889,06.66444444,308 +DM/SR-080,Betzenhuebel,,49.39939880,7.19360018,427 +DM/SR-081,Abraumhalde Bergwerk Saar,,49.31777778,06.78444444,325 +DM/SX-001,Fichtelberg,,50.42888889,12.95361111,1215 +DM/SX-002,Auersberg,,50.45610046,12.64640045,1018 +DM/SX-003,Kahleberg,,50.74860001,13.73079967,905 +DM/SX-004,Baerenstein,,50.50830078,13.01920033,898 +DM/SX-005,Lugstein,,50.73194444,13.74583333,893 +DM/SX-007,Hemmschuh,,50.72305556,13.69388889,845 +DM/SX-008,Poehlberg,,50.57416667,13.02944444,831 +DM/SX-008,Poehlberg,,50.57419968,13.02939987,831 +DM/SX-009,Altes Raupennest,,50.75861111,13.75472222,827 +DM/SX-010,Geisingberg,,50.77166667,13.77333333,824 +DM/SX-011,Scheibenberg,,50.53888889,12.92472222,807 +DM/SX-012,Drachenkopf,,50.74361111,13.60138889,805 +DM/SX-013,Scharspitze,,50.75083333,13.77250000,805 +DM/SX-014,Lausche,,50.84939957,14.64690018,793 +DM/SX-015,Schwartenberg,,50.65888889,13.46500000,787 +DM/SX-016,Kohlhaukuppe,,50.74361111,13.79305556,786 +DM/SX-017,Tellkoppe,,50.80722222,13.68750000,756 +DM/SX-018,Totenstein,,50.82500000,12.77833333,483 +DM/SX-019,Hochwald,,50.82580185,14.72749996,744 +DM/SX-020,Saydaer Hoehe,,50.72666667,13.42222222,728 +DM/SX-021,Greifensteine,,50.64888889,12.93027778,731 +DM/SX-022,Burg Frauenstein,,50.80083333,13.53611111,651 +DM/SX-023,Oelsener Hoehe,,50.79611111,13.92888889,644 +DM/SX-024,Burgberg,,50.81277778,13.46111111,617 +DM/SX-025,Valtenberg,,51.07360077,14.27779961,586 +DM/SX-026,Kottmar,,51.01055556,14.65583333,583 +DM/SX-027,Toepfer,,50.84944444,14.75944444,582 +DM/SX-028,Luchberg,,50.86805556,13.72888889,576 +DM/SX-029,Grosser Zschirnstein,,50.85469818,14.17720032,560 +DM/SX-030,Grosser Winterberg,,50.89638889,14.25916667,556 +DM/SX-031,Czorneboh,,51.11999893,14.52470016,555 +DM/SX-032,Zeisigstein,,50.82416667,13.99944444,551 +DM/SX-033,Unger,,50.99689865,14.22889996,537 +DM/SX-034,Spitzberg,,50.96027778,14.69000000,511 +DM/SX-035,Breiteberg,,50.89222222,14.70472222,510 +DM/SX-036,Bieleboh,,51.08166667,14.52027778,499 +DM/SX-037,Grosser Picho,,51.10888889,14.35194444,498 +DM/SX-038,Helleberg,,50.85000000,13.93138889,496 +DM/SX-039,Wachberg,,50.94611111,14.34138889,496 +DM/SX-040,Schlechteberg,,50.99861111,14.58972222,485 +DM/SX-041,Wilisch,,50.92079926,13.74940014,476 +DM/SX-042,Katzstein,,50.87027778,14.09916667,474 +DM/SX-043,Weifberg,,50.93611111,14.36527778,473 +DM/SX-044,Rotstein,,51.10527778,14.76500000,455 +DM/SX-045,Papststein,,50.90110016,14.11999989,451 +DM/SX-046,Sybillenstein,,51.18222222,14.11250000,449 +DM/SX-047,Loebauer Berg,,51.09109879,14.69250011,448 +DM/SX-048,Moenchswalder Berg,,51.11333333,14.41250000,447 +DM/SX-049,Gohrisch,,50.90166667,14.11027778,440 +DM/SX-050,Panoramahoehe,,50.86444444,13.95222222,437 +DM/SX-051,Pfaffenstein,,50.89777778,14.08083333,435 +DM/SX-052,Landberg,,50.99388889,13.51222222,426 +DM/SX-053,Lerchenberg,,50.95722222,13.68472222,425 +DM/SX-054,Schwedenstein,,51.19222222,14.05611111,420 +DM/SX-055,Landeskrone,,51.12939835,14.93249989,419 +DM/SX-056,Schrammsteinsicht,,50.91250000,14.20472222,417 +DM/SX-057,Lilienstein,,50.93000000,14.08500000,415 +DM/SX-058,Keulenberg,,51.22689819,13.95610046,414 +DM/SX-059,Grosser Teichstein,,50.91305556,14.29722222,413 +DM/SX-060,Hohe Liebe,,50.92138889,14.20944444,401 +DM/SX-061,Hochstein,,51.19499969,14.83500004,393 +DM/SX-062,Schanzberg,,50.97388889,14.12111111,392 +DM/SX-063,Finckenfang,,50.92083333,13.79750000,394 +DM/SX-064,Cottaer Spitzberg,,50.89833333,13.96833333,391 +DM/SX-065,Labyrinth,,50.88833333,14.03166667,390 +DM/SX-066,Hinteres Raubschloss,,50.91055556,14.28000000,390 +DM/SX-067,Zirkelstein,,50.87861111,14.22083333,385 +DM/SX-068,Butterberg,,51.15583333,14.18472222,384 +DM/SX-069,Triebenberg,,51.02694444,13.92333333,383 +DM/SX-070,Borsberg,,51.01277778,13.90361111,362 +DM/SX-071,Festung Koenigstein,,50.91859818,14.06029987,361 +DM/SX-072,Burg Stolpen,,51.04777778,14.08416667,357 +DM/SX-073,Windberg,,50.99694444,13.66222222,352 +DM/SX-074,Heinrichseck,,50.97972222,13.57666667,351 +DM/SX-075,Kaiserkrone,,50.88388889,14.21805556,351 +DM/SX-076,Rochlitzer Berg,,51.02611111,12.77083333,349 +DM/SX-077,Babisnauer Pappel,,50.97583333,13.74972222,329 +DM/SX-078,Kleiner Baerenstein,,50.94222222,14.04500000,338 +DM/SX-079,Neuer Wildenstein,,50.92555556,14.25777778,337 +DM/SX-080,Breiter Stein,,51.01805556,14.00888889,325 +DM/SX-081,Schoene Hoehe,,51.02833333,13.98277778,327 +DM/SX-082,Brand,,50.95583333,14.12666667,317 +DM/SX-083,Hutberg,,51.27361111,14.08027778,294 +DM/SX-084,Rauensteine,,50.95194444,14.06194444,308 +DM/SX-085,Collm,,51.30388889,13.01194444,312 +DM/SX-086,Monumentberg,,51.25805556,14.70583333,293 +DM/SX-087,Halde Trages,,51.18055556,12.51583333,250 +DM/SX-088,Loebenberg,,51.42027778,12.79527778,240 +DM/SX-089,Schildberg,,51.44083333,12.88972222,217 +DM/SX-090,Muehle Duerrenberg,,51.35277778,13.13388889,197 +DM/SX-091,Boselspitze,,51.14166667,13.51138889,192 +DM/SX-092,Schellenberg,,50.81305556,13.09944444,511 +DM/SX-093,Kuhberg,,50.52000000,12.49888889,795 +DM/SX-094,Langer Stein,,50.71666667,13.14250000,604 +DM/SX-095,Lauterbacher Knochen,,50.69055556,13.16638889,683 +DM/SX-096,Drei-Brueder-Hoehe,,50.65666667,13.12500000,688 +DM/SX-097,Morgensternhoehe,,50.64583333,13.24500000,711 +DM/SX-098,Steinhuebel,,50.61472222,13.27250000,817 +DM/SX-099,Adelsberg,,50.81111111,13.01555556,509 +DM/SX-100,Oberbecken,,50.51055556,12.86777778,848 +DM/SX-101,Kuhberg,,50.59944444,12.22194444,510 +DM/SX-102,Laubberg,,50.50388889,12.47222222,767 +DM/SX-103,Steinberg,,50.54361111,12.46527778,661 +DM/SX-104,Hoher Brand,,50.34027778,12.39000000,802 +DM/SX-105,Hinterer Kegelberg,,50.31583333,12.40027778,755 +DM/SX-106,Brunnenberg,,50.28416667,12.25583333,610 +DM/SX-107,Plattenberg,,50.25611111,12.26861111,683 +DM/SX-108,Kapellenberg,,50.18805556,12.30055556,759 +DM/SX-109,Steinberg,,50.54249954,12.63560009,732 +DM/SX-109,Steinberg,,50.54250000,12.63555556,732 +DM/SX-110,Goldene Hoehe,,50.48555556,12.44972222,733 +DM/SX-111,Eselsberg,,50.48083333,12.67694444,867 +DM/SX-112,Tangelberg,,50.49027778,12.63027778,714 +DM/SX-113,Ochsenkopf,,50.50111111,12.70277778,823 +DM/SX-114,Morgenleithe,,50.52555556,12.73166667,811 +DM/SX-115,Rabenberg,,50.45222222,12.75472222,912 +DM/SX-116,Buchberg,,50.51388889,12.67000000,783 +DM/SX-117,Eisenberg,,50.44166667,12.97138889,1028 +DM/SX-118,Katzenstein,,50.65472222,12.75833333,627 +DM/SX-119,Gleesberg,,50.59027778,12.65944444,593 +DM/SX-120,Frohnberg,,50.50500000,12.34305556,587 +DM/SX-121,Knock,,50.49861111,12.53138889,725 +DM/SX-122,Stangenhoehe,,50.40666667,12.60194444,963 +DM/SX-123,Wartberg,,50.46138889,12.00222222,558 +DM/SX-124,Hohe Reuth,,50.44972222,12.26555556,629 +DM/SX-125,Kiel,,50.40694444,12.46888889,943 +DM/SX-126,Grosser Rammelsberg,,50.40250000,12.52583333,963 +DM/SX-127,Stephanshoehe,,50.77666667,13.68361111,804 +DM/SX-128,Wahlberg,,51.26333333,14.04333333,359 +DM/SX-129,Wuesteberg,,51.25055556,14.05250000,351 +DM/SX-130,Jonsberg,,50.84916667,14.71638889,653 +DM/SX-131,Napoleonstein,,51.05694444,13.91333333,342 +DM/SX-132,Thierberg,,50.44722222,12.44472222,784 +DM/SX-133,Runder Huebel,,50.42694444,12.44666667,837 +DM/SX-134,Schneehuebel,,50.42750000,12.57555556,974 +DM/SX-135,Brueckenberg,,50.45416667,12.61000000,963 +DM/SX-136,Koernerberg,,50.35833333,12.48444444,738 +DM/SX-137,Pilzhuebel,,50.72666667,13.09833333,598 +DM/SX-138,Zeisighuebel,,50.69638889,13.11611111,643 +DM/SX-139,Lautaer Hoehe,,50.66166667,13.14888889,656 +DM/SX-140,Hoher Stein,,50.75777778,13.13777778,578 +DM/SX-141,Dittersdorfer Hoehe,,50.76277778,13.00722222,553 +DM/SX-142,Franzenshoehe,,50.63579941,12.99720001,703 +DM/SX-143,Saidenberg,,50.74972222,13.34333333,700 +DM/SX-144,Bismarckhoehe,,50.52222222,13.15805556,857 +DM/SX-145,Altes Gericht,,50.61944444,13.15388889,742 +DM/SX-146,Adlerstein,,50.69888889,13.16333333,674 +DM/SX-147,Galgenberg,,50.74388889,13.16722222,545 +DM/SX-148,Ulmknochen,,50.69722222,13.18805556,645 +DM/SX-149,Brandhuebel,,50.68805556,13.20194444,609 +DM/SX-150,Spitzberg,,50.78111111,13.02444444,504 +DM/SX-151,Scheffelsberg,,50.76055556,13.15444444,500 +DM/SX-152,Hilmersdorfer Hofhoehe,,50.66638889,13.12305556,645 +DM/SX-153,Fuchsgaloppe,,50.59833333,13.17500000,758 +DM/SX-154,Goetzhoehe,,50.76722222,13.07138889,494 +DM/SX-155,Plauberg,,50.83277778,13.09138889,437 +DM/SX-156,Katzenberg,,50.82555556,13.04083333,473 +DM/SX-157,Amtsberg,,50.74472222,13.02138889,503 +DM/SX-158,Waltersdorfer Hoehe,,50.77194444,13.27944444,590 +DM/SX-159,Granitzhuebel,,50.70500000,13.41361111,648 +DM/SX-160,Koenig-Friedrich-August-Hoehe,,50.70861111,13.45805556,735 +DM/SX-161,Schickels Hoehe,,50.74500000,13.63777778,805 +DM/SX-162,Geiersberg,,50.75000000,12.94305556,533 +DM/SX-163,Broednerhoehe,,50.68111111,13.18333333,615 +DM/SX-164,Rungstock,,50.65166667,13.31277778,618 +DM/SX-165,Goldkrone,,50.62361111,13.23027778,768 +DM/SX-166,Wolfsberg,,50.67666667,13.08916667,562 +DM/SX-167,Duerrer Berg,,50.63888889,13.30250000,733 +DM/SX-168,Annahoehe,,50.66861111,13.24694444,684 +DM/SX-169,Steinhuebel,,50.71583333,13.29305556,596 +DM/SX-170,Hexenberg,,50.70277778,13.42111111,679 +DM/SX-171,Teichhuebel,,50.65000000,13.50777778,818 +DM/SX-172,Vorderer Stangenberg,,50.68250000,13.50055556,703 +DM/SX-173,Steinberg,,50.70250000,13.49472222,625 +DM/SX-174,Steinberg,,50.71861111,13.50166667,707 +DM/SX-175,Goldhuebel,,50.68250000,13.48638889,648 +DM/SX-176,Steinberg,,50.68333333,13.36888889,661 +DM/SX-177,Spitzberg,,50.64611111,13.42472222,713 +DM/SX-178,Zaunhuebel,,50.61916667,13.45138889,735 +DM/SX-179,Reicheltberg,,50.64250000,13.44500000,741 +DM/SX-180,Spitzer Berg,,50.63416667,13.33666667,722 +DM/SX-181,Strohhuebel,,50.60805556,13.30277778,756 +DM/SX-182,Sophienstein,,50.63027778,13.36833333,703 +DM/SX-183,Wolfsstein,,50.63500000,13.27055556,736 +DM/SX-184,Steinberg,,50.70944444,13.35555556,617 +DM/SX-185,Schuetzenberg,,50.76444444,13.38194444,626 +DM/SX-186,Rabenberg,,50.62083333,13.25694444,801 +DM/SX-187,Alpstein,,50.81694444,13.36000000,542 +DM/SX-188,Bayerhoehe,,51.07444444,13.46611111,321 +DM/SX-189,Bernhardshoehe,,50.82055556,13.38805556,544 +DM/SX-190,Hohe Dubrau,,51.26250000,14.68750000,308 +DM/SX-190,Hohe Dubrau,,51.26250076,14.68750000,308 +DM/SX-191,Karolinenhoehe,,50.87361111,13.13277778,499 +DM/SX-192,Kollmer Dubrau,,51.26361111,14.69777778,303 +DM/SX-193,Lips Tulian Felsen,,50.92805556,13.46750000,450 +DM/SX-194,Markgrafenstein,,50.95250000,13.56138889,413 +DM/SX-195,Poebelknochen,,50.75750000,13.71055556,833 +DM/SX-196,Radewitzer Hoehe,,51.09722222,13.31888889,304 +DM/SX-197,Ranisberg,,50.85666667,13.21333333,518 +DM/SX-198,Schneckenberg,,50.77444444,12.82611111,416 +DM/SX-199,Seeghuebel,,51.03750000,13.39944444,326 +DM/SX-200,Spitzer Stein,,50.87805556,14.09194444,409 +DM/SX-201,Steinkuppe,,50.71944444,13.59916667,805 +DM/SX-202,Taennicht,,50.92638889,13.46000000,461 +DM/SX-203,Mausberg,,50.55000000,12.49000000,639 +DM/SX-204,Schatzenstein,,50.59388889,12.84305556,760 +DM/SX-204,Schatzenstein,,50.59389877,12.84309959,760 +DM/SX-205,Liebenstein,,50.52611111,12.95694444,756 +DM/SX-206,Kammerstein,,50.48055556,12.73555556,722 +DM/SX-207,Koenigshuebel,,50.41611111,12.49472222,891 +DM/SX-208,Grosser Stein,,50.67000000,12.79694444,611 +DM/SX-209,Baerenloher Hoehe,,50.28805556,12.20361111,648 +DM/SX-210,Blosenberg,,50.36888889,11.98472222,591 +DM/SX-211,Culmberg,,50.44694444,12.16833333,529 +DM/SX-212,Eisenberg,,50.54888889,12.17750000,433 +DM/SX-213,Gemeinberg,,50.33250000,12.40888889,776 +DM/SX-214,Hahnenpfalz,,50.20083333,12.31888889,702 +DM/SX-215,Kanzelstein,,50.45472222,12.71277778,819 +DM/SX-216,Muehlberg,,50.48277778,12.57666667,825 +DM/SX-217,Scheibenberg,,50.39500000,12.48805556,864 +DM/SX-218,Toskabank,,50.46805556,13.00444444,887 +DM/SX-219,Walfischkopf,,50.49833333,12.55861111,700 +DM/SX-220,Kohlberg,,50.67111111,13.52027778,837 +DM/SX-221,Spitzer Berg,,50.68722222,13.51138889,735 +DM/SX-222,Traugotthoehe,,50.73083333,13.82111111,806 +DM/SX-223,Kaelberstein,,51.07220078,14.45580006,487 +DM/SX-224,Doehlener Hoehe,,51.12166667,14.50305556,514 +DM/SX-225,Kuppritzer Berg,,51.12083333,14.57916667,505 +DM/SX-226,Hochstein,,51.11416667,14.57305556,533 +DM/SX-227,Buchberg,,50.85500000,14.67444444,651 +DM/SX-228,Scharfenstein,,50.84083333,14.75833333,569 +DM/SX-229,Kaempferberge,,51.17777778,14.83750000,415 +DM/SX-230,Quirl,,50.90527778,14.06666667,350 +DM/SX-231,Strobelberg,,50.46083333,12.82750000,774 +DM/SX-232,Fuchskanzel,,50.83138889,14.79583333,532 +DM/SX-233,Grosser Hemmberg,,50.49055556,12.89500000,829 +DM/SX-234,Raunerberg,,50.34500000,12.37277778,739 +DM/SX-235,Schoene Aussicht,,50.44083333,12.63027778,883 +DM/SX-236,Zeisiggesang,,50.45861111,12.58027778,922 +DM/SX-237,Rotstein,,50.86027778,14.09166667,458 +DM/SX-238,Gamrig,,50.95805556,14.09666667,253 +DM/SX-239,Schwarzenberg,,51.21527778,14.10361111,413 +DM/SX-240,Raumberg,,50.89916667,14.33388889,459 +DM/SX-241,Sonnenhuebel,,50.96689987,14.77280045,469 +DM/TH-001,Grosser Beerberg,,50.65829849,10.74470043,983 +DM/TH-002,Schneekopf,,50.66694444,10.76333333,978 +DM/TH-003,Grosser Finsterberg,,50.63690186,10.80060005,944 +DM/TH-004,Grosser Inselsberg,,50.85110092,10.46640015,916 +DM/TH-005,Grosser Eisenberg,,50.62222222,10.78166667,907 +DM/TH-006,Greifenberg,,50.71361111,10.67472222,901 +DM/TH-007,Gebrannter Stein,,50.68972222,10.67000000,896 +DM/TH-008,Donnershauk,,50.72250000,10.63888889,893 +DM/TH-009,Neuhaeuser Huegel,,50.60333333,10.76805556,890 +DM/TH-010,Hohe Moest,,50.71250000,10.63583333,887 +DM/TH-011,Spitzer Berg,,50.67416667,10.70277778,881 +DM/TH-012,Grosser Farmdenkopf Plateau,,50.51166667,11.02361111,875 +DM/TH-013,Grosser Hermannsberg,,50.70055556,10.61444444,867 +DM/TH-013,Grosser Hermannsberg,,50.70059967,10.61439991,867 +DM/TH-014,Ruppberg,,50.68416667,10.63944444,866 +DM/TH-015,Blessberg,,50.44609833,11.00440025,866 +DM/TH-016,Kickelhahn,,50.66579819,10.88109970,861 +DM/TH-017,Eisenberg,,50.48777778,11.11388889,852 +DM/TH-018,Adlersberg,,50.59138889,10.76638889,849 +DM/TH-019,Eselsberg,,50.51055556,10.96972222,841 +DM/TH-020,Mittlerer Hoehenberg,,50.78166667,10.52527778,836 +DM/TH-021,Hohe Scharte,,50.82138889,10.48166667,813 +DM/TH-022,Grosser Buchenberg,,50.75111111,10.63305556,812 +DM/TH-023,Stiefelkopf,,50.61916667,11.01472222,807 +DM/TH-024,Grosser Jagdberg,,50.83638889,10.50027778,806 +DM/TH-025,Seimberg,,50.81110001,10.44970036,803 +DM/TH-026,Sommerberg,,50.50194444,10.96222222,800 +DM/TH-027,Wetzstein,,50.44609833,11.45170021,793 +DM/TH-028,Simmersberg,,50.50250000,10.89361111,780 +DM/TH-029,Schwefelkopf,,50.54555556,10.90777778,773 +DM/TH-030,Sieglitzberg,,50.42611111,11.60861111,733 +DM/TH-031,Kulmberg,,50.40861111,11.60055556,726 +DM/TH-032,Hohe Warth,,50.50388889,10.86611111,718 +DM/TH-033,Baier,,50.74610138,10.10439968,714 +DM/TH-034,Diesburg,,50.58805556,10.21500000,712 +DM/TH-035,Loosbrand,,50.39666667,11.17666667,700 +DM/TH-036,Steinhuegel,,50.38805556,11.23722222,699 +DM/TH-037,Breitenberg,,50.89469910,10.38329983,697 +DM/TH-038,Bocksberg,,50.41277778,11.21305556,696 +DM/TH-039,Kahle Koppe,,50.88194444,10.40944444,690 +DM/TH-040,Grosser Gleichberg,,50.38859940,10.59189987,679 +DM/TH-041,Keil,,50.62720108,11.22360039,677 +DM/TH-042,Grosser Gieselberg,,50.76388889,10.44305556,657 +DM/TH-043,Kissel,,50.87194444,10.32250000,648 +DM/TH-044,Hessenhoehe,,50.38472222,11.20972222,647 +DM/TH-045,Pless,,50.74359894,10.24219990,644 +DM/TH-046,Kleiner Gleichberg,,50.41109848,10.59249973,641 +DM/TH-047,Hutsberg,,50.54999924,10.24330044,639 +DM/TH-048,Ringberg,,50.90500000,10.35611111,638 +DM/TH-049,Grosser Ehrenberg,,51.63444444,10.68611111,635 +DM/TH-050,Stoffelskuppe,,50.72861111,10.21861111,620 +DM/TH-051,Poppenberg,,51.58805556,10.82777778,600 +DM/TH-052,Carolinenhoehe,,50.89444444,10.35555556,596 +DM/TH-053,Horn,,50.72138889,10.17888889,578 +DM/TH-054,Arzberg,,50.74805556,10.02333333,573 +DM/TH-055,Grosser Wartberg,,50.90083333,10.43083333,568 +DM/TH-056,Koenigsberg,,50.57611111,11.87694444,548 +DM/TH-057,Passberg,,50.64611111,10.57333333,530 +DM/TH-058,Warteberg,,51.32277778,10.18638889,516 +DM/TH-059,Riechheimer Berg,,50.88166667,11.12833333,512 +DM/TH-060,Junkerkuppe,,51.33166667,09.95222222,508 +DM/TH-061,Heldrastein,,51.11000000,10.18833333,504 +DM/TH-062,Trogberg,,51.47500000,10.32944444,502 +DM/TH-063,Kapellenberg,,50.47833333,10.66611111,492 +DM/TH-064,Grosser Hoerselberg,,50.95388889,10.46138889,484 +DM/TH-065,Scharfenstein,,51.36361111,10.26750000,480 +DM/TH-066,Ettersberg,,51.01416667,11.25611111,478 +DM/TH-067,Kulpenberg,,51.41189957,11.07639980,473 +DM/TH-068,Gebraer Kopf,,51.42416667,10.56166667,446 +DM/TH-069,Kyffhaeuserberg,,51.41361111,11.11000000,440 +DM/TH-070,Abtsberg,,51.05440140,10.77280045,413 +DM/TH-071,Grosser Seeberg,,50.92444444,10.78722222,409 +DM/TH-072,Buchberg,,50.78166667,11.50250000,408 +DM/TH-073,Leuchtenburg,,50.80388889,11.61250000,400 +DM/TH-074,Fuchsturm,,50.92416667,11.62555556,391 +DM/TH-075,Monraburg,,51.23750000,11.29138889,377 +DM/TH-076,Burg Gleichen,,50.88055556,10.83888889,369 +DM/TH-077,Koenigskopf,,51.52722222,10.90888889,358 +DM/TH-078,Grosser Herrnkopf,,51.38333333,11.05833333,330 +DM/TH-079,Muehlberg,,51.18388889,11.43472222,310 +DM/TH-080,Schlachtberg,,51.36833333,11.10444444,271 +DM/TH-081,Dolmar,,50.62469864,10.47889996,740 +DM/TH-082,Gebaberg,,50.59000000,10.27027778,751 +DM/TH-083,Rondell,,51.36055556,10.51777778,516 +DM/TH-084,Katzenburg,,51.40222222,10.57750000,477 +DM/TH-085,Birkenberg,,51.46305556,10.40277778,533 +DM/TH-086,Hockelrain,,51.34833333,10.27861111,515 +DM/TH-087,Rain,,51.23388889,10.27833333,517 +DM/TH-088,Hohe Warte,,50.69583333,10.83111111,765 +DM/TH-089,Rumpelsberg,,50.68750000,10.84027778,799 +DM/TH-090,Gabelsbachskopf,,50.67222222,10.80555556,772 +DM/TH-091,Sommersbachskopf,,50.66500000,10.72805556,943 +DM/TH-092,Wildekopf,,50.66194444,10.72527778,943 +DM/TH-093,Sachsenstein,,50.65250000,10.79194444,915 +DM/TH-094,Finsterbachkopf,,50.70694444,10.64861111,898 +DM/TH-095,Brand,,50.66833333,10.78027778,887 +DM/TH-096,Sperrhuegel,,50.74359894,10.57390022,882 +DM/TH-097,Schuetzenberg,,50.69500000,10.68611111,878 +DM/TH-098,Saukopf,,50.72638889,10.67222222,869 +DM/TH-099,Kieferle,,50.46805556,11.09138889,867 +DM/TH-100,Salzberg,,50.62000000,10.76416667,866 +DM/TH-101,Brandleite,,50.68472222,10.72472222,862 +DM/TH-102,Duerre Fichte,,50.46361111,11.04638889,861 +DM/TH-103,Hoher Stein,,50.69694444,10.64444444,860 +DM/TH-104,Reinhardsberg,,50.86638889,10.57361111,483 +DM/TH-105,Oberlautenberg,,50.73583333,10.58972222,855 +DM/TH-106,Rosskopf,,50.73944444,10.61638889,851 +DM/TH-107,Breitenberg,,50.44166667,11.09194444,844 +DM/TH-108,Doerrkopf,,50.68111111,10.75388889,844 +DM/TH-109,Fellberg,,50.43555556,11.12722222,842 +DM/TH-110,Datenberg,,50.86861111,10.49916667,841 +DM/TH-111,Grosser Erleshuegel,,50.61361111,10.74472222,839 +DM/TH-112,Pechleite,,50.47805556,10.98888889,839 +DM/TH-113,Grosser Dreiherrenstein,,50.60611111,10.89833333,838 +DM/TH-114,Fehrenberg,,50.51694444,10.95083333,835 +DM/TH-115,Pappenheimer Berg,,50.48388889,11.18055556,835 +DM/TH-116,Buhler,,50.41805556,11.08722222,829 +DM/TH-117,Grosser Helmsberg,,50.62222222,10.88750000,828 +DM/TH-118,Buchskopf,,50.69388889,10.73666667,825 +DM/TH-119,Kalte Heide,,50.82722222,10.49055556,825 +DM/TH-120,Grosser Hundskopf,,50.60888889,10.87194444,824 +DM/TH-121,Grosser Mittelberg,,50.42416667,11.08722222,822 +DM/TH-122,Ruettelsberg,,50.46638889,11.02083333,822 +DM/TH-123,Reischelberg,,50.59027778,10.95500000,821 +DM/TH-124,Grosser Zigeunerberg,,50.48888889,11.13055556,820 +DM/TH-125,Wurzelberg,,50.52416667,11.04916667,820 +DM/TH-126,Fuerstenberg,,50.61833333,10.91833333,818 +DM/TH-127,Grosser Burgberg,,50.59166667,10.90722222,817 +DM/TH-128,Eckardtskopf,,50.70111111,10.75222222,815 +DM/TH-129,Dreiherrenstein,,50.61083333,10.88944444,814 +DM/TH-130,Hinterer Hoehenberg,,50.79055556,10.53055556,814 +DM/TH-131,Rotebachhoeg,,50.74527778,10.59111111,814 +DM/TH-132,Hintere Haube,,50.57694444,10.95194444,811 +DM/TH-133,Kleiner Mittelberg,,50.43472222,11.06944444,811 +DM/TH-134,Tanzbuche,,50.84250000,10.52416667,810 +DM/TH-135,Langer Berg,,50.61859894,11.01920033,809 +DM/TH-136,Beerberg,,50.60472222,10.73527778,808 +DM/TH-137,Hettstaedt,,50.55166667,11.13472222,808 +DM/TH-138,Kallenberg,,50.43416667,11.08638889,808 +DM/TH-139,Trockenberg,,50.83972222,10.49166667,808 +DM/TH-140,Grosser Tierberg,,50.45500000,11.16166667,806 +DM/TH-141,Hohe Tanne,,50.64750000,10.87666667,806 +DM/TH-142,Mittelberg,,50.51194444,11.19277778,804 +DM/TH-143,Rauhhuegel,,50.54330063,11.21689987,802 +DM/TH-144,Loeschleitenberg,,50.49861111,11.06583333,801 +DM/TH-145,Hellenberg,,50.72805556,10.60583333,799 +DM/TH-146,Roter Berg,,50.49416667,11.23527778,799 +DM/TH-147,Wasserberg,,50.41361111,11.09666667,798 +DM/TH-148,Limberg,,50.47666667,11.20361111,793 +DM/TH-149,Vorderer Hoehenberg,,50.77611111,10.52000000,793 +DM/TH-150,Heuberg,,50.46944444,10.98250000,792 +DM/TH-151,Frohnberg,,50.47944444,10.95750000,791 +DM/TH-152,Goerlitzberg,,50.46861111,11.12555556,791 +DM/TH-153,Kohlhieb,,50.56500000,10.93388889,790 +DM/TH-154,Naehertalskopf,,50.74138889,10.64416667,789 +DM/TH-155,Grendel,,50.47833333,10.93861111,787 +DM/TH-156,Koppe,,50.57305556,11.10861111,786 +DM/TH-157,Steinhauk,,50.69138889,10.62000000,786 +DM/TH-158,Apelsberg,,50.51527778,11.15583333,785 +DM/TH-159,Kirchberg,,50.57638889,11.14972222,784 +DM/TH-160,Leimbuehl,,50.67027778,10.82472222,784 +DM/TH-161,Schmiedswiesenkopf,,50.55527778,10.86055556,784 +DM/TH-162,Sieger,,50.43833333,11.03888889,784 +DM/TH-163,Breiter Berg,,50.45277778,11.17500000,783 +DM/TH-164,Bloessberg,,50.44694444,11.05444444,782 +DM/TH-165,Hoeheberg,,50.51055556,10.90805556,780 +DM/TH-166,Grosser Muenzeberg,,50.74027778,10.68194444,774 +DM/TH-167,Himmelsleiter,,50.56694444,11.13722222,774 +DM/TH-168,Kienberg,,50.65027778,10.93111111,774 +DM/TH-169,Wadeberg,,50.72111111,10.72166667,773 +DM/TH-170,Hirschkopf,,50.66694444,10.83833333,772 +DM/TH-171,Himmelreichskopf,,50.68083333,10.82277778,771 +DM/TH-172,Silberberg,,50.61444444,10.95527778,771 +DM/TH-173,Kalter Staudenkopf,,50.54000000,10.85500000,768 +DM/TH-174,Kramerod,,50.76555556,10.56222222,765 +DM/TH-175,Brandkuppe,,50.44444444,11.07138889,764 +DM/TH-176,Grauer Stuhl,,50.81611111,10.49916667,763 +DM/TH-177,Laerchenkopf,,50.72250000,10.74000000,762 +DM/TH-178,Hohe Leite,,50.78361111,10.55055556,761 +DM/TH-179,Rodeberg,,50.50638889,11.22444444,761 +DM/TH-180,Eckardtsberg,,50.47138889,10.92722222,760 +DM/TH-181,Eisfelder,,50.45277778,10.98722222,760 +DM/TH-182,Schanze,,50.56194444,11.14916667,760 +DM/TH-183,Oelberg,,50.74416667,10.63611111,760 +DM/TH-184,Trockentalskopf,,50.75222222,10.67416667,759 +DM/TH-185,Steinberg,,50.63527778,10.94055556,758 +DM/TH-186,Jungferbornskopf,,50.51222222,11.04666667,758 +DM/TH-187,Hammerleite,,50.43777778,11.25055556,757 +DM/TH-188,Schnetter Berg,,50.51250000,10.89305556,757 +DM/TH-189,Strassenberg,,50.42694444,11.05222222,756 +DM/TH-190,Hirschstein,,50.51444444,11.23305556,755 +DM/TH-191,Drehberg,,50.85361111,10.43638889,754 +DM/TH-192,Kernberg,,50.74194444,10.55083333,752 +DM/TH-193,Koehlerberg,,50.63166667,10.91666667,751 +DM/TH-194,Lindenberg,,50.66694444,10.90694444,749 +DM/TH-195,Schwarzer Kopf,,50.64277778,10.64083333,749 +DM/TH-196,Spiessberg,,50.82138889,10.53916667,749 +DM/TH-197,Dreiherrnstein,,50.84944444,10.41638889,747 +DM/TH-198,Lautersberg,,50.63194444,10.84361111,747 +DM/TH-199,Grosser Roedel,,50.66138889,10.83000000,746 +DM/TH-200,Unterer Geiersberg,,50.64527778,10.73388889,746 +DM/TH-201,Kleiner Buchenberg,,50.75250000,10.62111111,745 +DM/TH-202,Ringberg,,50.61666667,10.72222222,745 +DM/TH-203,Steinbiel,,50.53361111,11.13972222,745 +DM/TH-204,Spitze,,50.77083333,10.67361111,742 +DM/TH-205,Glashuegel,,50.48805556,11.28500000,741 +DM/TH-206,Holzberg,,50.52416667,10.91333333,740 +DM/TH-207,Auerhahnsbalze,,50.78083333,10.66638889,739 +DM/TH-208,Lindigkopf,,50.52694444,11.08305556,739 +DM/TH-209,Mittelberg,,50.68805556,10.81416667,739 +DM/TH-210,Koenigsknuebel,,50.65611111,10.70888889,738 +DM/TH-211,Fichteberg,,50.44472222,11.47166667,737 +DM/TH-212,Goldberg,,50.50388889,10.99138889,736 +DM/TH-213,Hammerbuehl,,50.47777778,11.27250000,735 +DM/TH-214,Hohe Schlaufe,,50.67527778,10.89194444,735 +DM/TH-215,Oberer Pirschhauskopf,,50.80472222,10.54805556,735 +DM/TH-216,Regenberg,,50.84138889,10.53722222,734 +DM/TH-217,Siegelberg,,50.76583333,10.75916667,734 +DM/TH-218,Langenbachsberg,,50.48805556,11.00750000,733 +DM/TH-219,Schauenburg,,50.84638889,10.55250000,733 +DM/TH-220,Tragberg,,50.71166667,10.77111111,731 +DM/TH-221,Rennwegskopf,,50.82500000,10.40611111,730 +DM/TH-222,Gerberstein,,50.85944444,10.39333333,729 +DM/TH-223,Tenneberg,,50.84694444,10.51194444,729 +DM/TH-224,Zapfenberg,,50.51777778,11.25944444,729 +DM/TH-225,Matteboehlar,,50.75777778,10.68388889,728 +DM/TH-226,Hinterer Brandkopf,,50.63805556,10.97222222,727 +DM/TH-227,Finkenberg,,50.42500000,11.51861111,726 +DM/TH-228,Volkmarskopf,,50.58611111,10.81888889,726 +DM/TH-229,Vorderer Mondhuegel,,50.47000000,11.29277778,726 +DM/TH-230,Beerhuegel,,50.51111111,11.31944444,725 +DM/TH-231,Kleiner Weissenberg,,50.86333333,10.41055556,725 +DM/TH-232,Geiersberg,,50.41972222,11.12000000,724 +DM/TH-233,Hinterer Mondhuegel,,50.45638889,11.27833333,723 +DM/TH-234,Kiesslich,,50.45000000,11.42388889,723 +DM/TH-235,Wilhelmsleite,,50.65944444,10.83861111,723 +DM/TH-236,Kienberg,,50.77888889,10.74166667,720 +DM/TH-237,Rehhecke,,50.56833333,11.18527778,720 +DM/TH-238,Heuberg,,50.82916667,10.52777778,719 +DM/TH-239,Gaensberg,,50.81472222,10.45527778,718 +DM/TH-240,Kohlberg,,50.49527778,10.88638889,718 +DM/TH-241,Birkenheide,,50.86388889,10.35166667,717 +DM/TH-242,Oberschaar,,50.39666667,11.13777778,716 +DM/TH-243,Rosenberg,,50.54777778,11.08305556,716 +DM/TH-244,Steinruecke,,50.64666667,10.62694444,716 +DM/TH-245,Ebershuegel,,50.47111111,11.31500000,714 +DM/TH-246,Grosser Muehlberg,,50.40472222,11.13277778,714 +DM/TH-247,Simmetsberg,,50.85055556,10.52305556,713 +DM/TH-249,Grosser Boehler,,50.74750000,10.70444444,712 +DM/TH-250,Hammerberg,,50.45444444,11.22500000,712 +DM/TH-251,Judenkopf,,50.81777778,10.40666667,712 +DM/TH-252,Sommerberg,,50.54916667,10.83944444,712 +DM/TH-253,Unterer Beerberg,,50.83583333,10.40861111,711 +DM/TH-254,Geuserberg,,50.25000000,11.46555556,708 +DM/TH-255,Kleiner Inselsberg,,50.86055556,10.46250000,706 +DM/TH-256,Regenberg,,50.64916667,10.64694444,706 +DM/TH-257,Mommelstein,,50.80277778,10.44500000,704 +DM/TH-258,Sonneberger Berg,,50.41861111,11.14583333,704 +DM/TH-259,Poppenberg,,50.56027778,11.17333333,703 +DM/TH-260,Brand,,50.68583333,10.60944444,702 +DM/TH-261,Hangeberg,,50.68805556,10.88166667,702 +DM/TH-262,Audeberg,,50.55500000,10.80777778,701 +DM/TH-263,Gemeindekuppe,,50.50972222,11.26583333,701 +DM/TH-264,Waldsberg,,50.72694444,10.77472222,701 +DM/TH-265,Streitberg,,50.76611111,10.70055556,699 +DM/TH-266,Hoher Berg,,50.71833333,10.56777778,698 +DM/TH-267,Oelzer Rain,,50.54972222,11.00277778,698 +DM/TH-268,Wagenberg,,50.56444444,10.80722222,698 +DM/TH-269,Reuster Berg,,50.83111111,12.19444444,370 +DM/TH-270,Falkenhuegel,,50.59055556,11.13638889,697 +DM/TH-271,Huebelskopf,,50.86777778,10.47916667,695 +DM/TH-272,Steiniger Berg,,50.79138889,10.71888889,694 +DM/TH-273,Vitzberg,,50.57194444,11.02166667,693 +DM/TH-274,Duerrberg,,50.63500000,10.65472222,692 +DM/TH-275,Schneeberg,,50.56190109,10.65810013,692 +DM/TH-276,Mittelberg,,50.67416667,10.61833333,691 +DM/TH-277,Blassenberg,,50.49055556,10.92555556,690 +DM/TH-278,Glashuegel,,50.43750000,11.51416667,688 +DM/TH-279,Grosser Mittelberg,,50.40444444,11.16694444,688 +DM/TH-280,Grosser Foerst,,50.43527778,11.20722222,688 +DM/TH-281,Kirchhuegel,,50.42305556,11.55305556,688 +DM/TH-282,Steinkopf,,50.79305556,10.67416667,688 +DM/TH-283,Arnsberg,,50.70916667,10.58138889,685 +DM/TH-284,Krippenkopf,,50.75472222,10.73083333,684 +DM/TH-285,Unterlautenberg,,50.72194444,10.59333333,684 +DM/TH-286,Bock,,50.62805556,10.65972222,682 +DM/TH-287,Grosser Brand,,50.40694444,11.48666667,682 +DM/TH-288,Ziegenrueck,,50.57333333,10.78833333,682 +DM/TH-289,Vogelberg,,50.44472222,11.53972222,681 +DM/TH-290,Abtsberg,,50.85444444,10.53805556,679 +DM/TH-291,Dicker Berg,,50.69472222,10.59277778,679 +DM/TH-292,Knuellfeld,,50.69555556,10.59805556,679 +DM/TH-293,Schwarzberg,,50.67472222,10.65333333,678 +DM/TH-294,Borzelberg,,50.73944444,10.76944444,677 +DM/TH-295,Klingenberg,,50.46361111,10.90083333,677 +DM/TH-296,Milchberg,,50.59805556,11.03888889,676 +DM/TH-297,Kleiner Hermannsberg,,50.71000000,10.60333333,674 +DM/TH-298,Ziegelberg,,50.80055556,10.67916667,673 +DM/TH-299,Brandkopf,,50.80444444,10.67111111,672 +DM/TH-300,Mittelberg,,50.41111111,11.51027778,672 +DM/TH-301,Grosser Mittelberg,,50.41861111,11.18583333,671 +DM/TH-302,Moosbachskopf,,50.67055556,10.84916667,671 +DM/TH-303,Winsberg,,50.85222222,10.34888889,671 +DM/TH-304,Grosser Herrenhuegel,,50.58472222,10.79555556,669 +DM/TH-305,Loebesberg,,50.81472222,10.50666667,669 +DM/TH-306,Boehmer Berg,,50.63527778,10.66833333,668 +DM/TH-307,Beerberg,,50.59861111,11.05555556,667 +DM/TH-308,Dornsenberg,,50.87944444,10.36722222,667 +DM/TH-309,Barigauer Hoehe,,50.62972222,11.10750000,665 +DM/TH-310,Lerchenhuegel,,50.38944444,11.50250000,665 +DM/TH-311,Wiesenberg,,50.75861111,10.54166667,665 +DM/TH-312,Heinersdorfer Hoehe,,50.41888889,11.28722222,664 +DM/TH-313,Totenkopf,,50.39750000,11.47555556,664 +DM/TH-314,Vogelherdskopf,,50.79361111,10.65638889,663 +DM/TH-315,Grosser Mittelrain,,50.77944444,10.58333333,662 +DM/TH-316,Grosser Klettnitzberg,,50.40916667,11.25138889,660 +DM/TH-317,Hirschbalz,,50.80888889,10.52777778,660 +DM/TH-318,Weissenberg,,50.79916667,10.51527778,660 +DM/TH-319,Die Fals,,50.39111111,11.53916667,659 +DM/TH-320,Hexenstein,,50.64805556,10.96083333,659 +DM/TH-321,Turmberg,,50.76805556,10.74027778,659 +DM/TH-322,Ehrenberg,,50.57805556,10.63166667,658 +DM/TH-323,Sommerberg,,50.56916667,10.68277778,656 +DM/TH-324,Metze,,50.66416667,10.61888889,655 +DM/TH-325,Heinersberg,,50.37805556,11.54555556,653 +DM/TH-326,Kirchberg,,50.57277778,10.64055556,652 +DM/TH-327,Arlesberg,,50.71222222,10.81027778,651 +DM/TH-328,Bloecherhuegel,,50.36888889,11.54583333,649 +DM/TH-329,Arnsberg,,50.86472222,10.32833333,648 +DM/TH-330,Friedlersberg,,50.51055556,11.30472222,646 +DM/TH-331,Stiller Stein,,50.70833333,10.51500000,646 +DM/TH-332,Kesselberg,,50.56333333,10.62972222,644 +DM/TH-333,Wirtsberg,,50.38555556,11.47750000,644 +DM/TH-334,Salzleckenkopf,,50.52833333,10.82444444,640 +DM/TH-335,Hohe Schlaufe,,50.77916667,10.65166667,639 +DM/TH-336,Flossberg,,50.67111111,10.91861111,638 +DM/TH-337,Saarsknock,,50.36666667,11.45805556,636 +DM/TH-338,Kleiner Mittelberg,,50.43166667,11.19000000,634 +DM/TH-339,Koernberg,,50.84805556,10.57166667,633 +DM/TH-340,Totenkopf,,50.80861111,10.66250000,633 +DM/TH-341,Galgenberg,,50.56333333,10.62194444,632 +DM/TH-342,Weisser Stein,,50.73138889,10.86333333,632 +DM/TH-343,Hasenberg,,50.61555556,11.06611111,631 +DM/TH-344,Hesselkopf,,50.87888889,10.41500000,631 +DM/TH-345,Fichtig,,50.61777778,11.08500000,629 +DM/TH-346,Zimmerberg,,50.86527778,10.51944444,628 +DM/TH-347,Buckenberg,,50.38666667,11.51694444,627 +DM/TH-348,Roter Steinberg,,50.60000000,11.15083333,627 +DM/TH-349,Silberbacher Kuppe,,50.53972222,10.79444444,627 +DM/TH-350,Winterberg,,50.48000000,11.40555556,627 +DM/TH-351,Donnersberg,,50.54472222,10.70000000,625 +DM/TH-352,Galgenberg,,50.38972222,11.39000000,625 +DM/TH-353,Doernberg,,50.71194444,10.51166667,624 +DM/TH-354,Kammerkuppe,,50.77555556,10.44583333,623 +DM/TH-355,Mittelrain,,50.78694444,10.65194444,623 +DM/TH-356,Heftenberg,,50.71500000,10.52722222,620 +DM/TH-357,Arzberg,,50.70444444,10.55361111,618 +DM/TH-358,Bergmannskopf,,50.73750000,10.78361111,616 +DM/TH-359,Eichenberg,,50.56750000,10.60500000,613 +DM/TH-360,Auberg,,50.58500000,10.62000000,609 +DM/TH-361,Regenberg,,50.36361111,11.51111111,609 +DM/TH-362,Knock,,50.34111111,11.47583333,608 +DM/TH-363,Scheffelsberg,,50.55805556,11.04555556,607 +DM/TH-364,Lichtenhainer Hoehe,,50.59916667,11.12111111,606 +DM/TH-365,Weinberg,,50.78444444,10.44194444,605 +DM/TH-366,Eulenberg,,50.47388889,11.36138889,604 +DM/TH-367,Hainberg,,50.55833333,11.07222222,602 +DM/TH-368,Gipfel,,50.41194444,11.41750000,601 +DM/TH-369,Heckenberg,,50.56722222,11.07805556,601 +DM/TH-370,Bromberg,,50.33138889,11.47138889,598 +DM/TH-371,Heidelberg,,50.67333333,10.59000000,594 +DM/TH-372,Johannisberg,,50.63083333,11.12694444,592 +DM/TH-373,Hirschberg,,50.65027778,11.25111111,589 +DM/TH-374,Kleiner Gieselsberg,,50.77194444,10.43416667,589 +DM/TH-375,Stinberg,,50.61333333,11.11944444,587 +DM/TH-376,Haselkoppe,,50.78333333,10.95833333,586 +DM/TH-377,Reuterkoepfe,,50.53972222,10.72694444,584 +DM/TH-378,Hainberg,,50.66138889,11.27250000,583 +DM/TH-379,Singener Berg,,50.73055556,11.04972222,583 +DM/TH-380,Biberschlag,,50.49305556,10.87305556,580 +DM/TH-381,Todemann,,50.90527778,10.33833333,580 +DM/TH-382,Solaberg,,50.46111111,10.82250000,577 +DM/TH-383,Hohe Klinge,,50.81694444,10.39277778,575 +DM/TH-384,Rohrhammer,,50.55138889,11.04472222,575 +DM/TH-385,Curau,,50.59194444,11.09194444,573 +DM/TH-386,Dittersdorfer Hoehe,,50.65111111,11.23111111,572 +DM/TH-387,Eichkoepfe,,50.65555556,11.29861111,572 +DM/TH-388,Stelzener Berg,,50.44000000,10.96361111,571 +DM/TH-389,Heuberg,,50.82555556,10.57361111,570 +DM/TH-390,Pfefferberg,,50.80444444,10.48111111,570 +DM/TH-391,Doerrberg,,50.72944444,10.79638889,568 +DM/TH-392,Gaertleser Hoehe,,50.52916667,10.57972222,565 +DM/TH-393,Schauberg,,50.36444444,11.48916667,565 +DM/TH-394,Thielberg,,50.87805556,10.43416667,565 +DM/TH-395,Drosselleite,,50.64055556,10.45444444,564 +DM/TH-396,Hirschberg,,50.71888889,10.50472222,562 +DM/TH-397,Henneberger Leite,,50.70472222,10.88444444,560 +DM/TH-398,Haardt,,50.59138889,10.65805556,558 +DM/TH-399,Ziegenhoehler,,50.78805556,10.70611111,558 +DM/TH-400,Zipptannskuppe,,50.63888889,11.29305556,657 +DM/TH-401,Aschenkopf,,50.62833333,10.62638889,556 +DM/TH-402,Hohe Roch,,50.72472222,10.51638889,556 +DM/TH-403,Diestel,,50.58416667,10.66388889,552 +DM/TH-404,Feldstein,,50.52861111,10.63416667,552 +DM/TH-405,Mittelberg,,50.45972222,10.77222222,552 +DM/TH-406,Veronikaberg,,50.72972222,10.90500000,552 +DM/TH-407,Duerrenberg,,50.64000000,10.43277778,549 +DM/TH-408,Schneeberg,,50.63333333,10.42166667,547 +DM/TH-409,Vorderer Breitenberg,,50.63222222,11.32472222,547 +DM/TH-410,Kirchberg,,50.69305556,10.57583333,545 +DM/TH-411,Gottlobsberg,,50.77805556,10.98166667,544 +DM/TH-412,Kroetenkopf,,50.88527778,10.32000000,540 +DM/TH-413,Vogelherd,,50.66361111,10.58916667,537 +DM/TH-414,Dietrichsberg,,50.48527778,10.46388889,536 +DM/TH-415,Grosskopf,,50.44777778,10.49722222,536 +DM/TH-415,Grosskopf,,50.44779968,10.49720001,536 +DM/TH-416,Kahler Berg,,50.75222222,10.91111111,536 +DM/TH-417,Mittelberg,,50.47833333,10.72611111,536 +DM/TH-418,Schlossberg,,50.32000000,11.50388889,534 +DM/TH-419,Eichenberg,,50.71027778,10.98305556,533 +DM/TH-420,Sandberg,,50.55083333,10.64305556,533 +DM/TH-421,Silbachshoehe,,50.58722222,10.57388889,531 +DM/TH-422,Windberg,,50.58277778,10.58416667,530 +DM/TH-423,Kuppe,,50.42750000,10.59472222,529 +DM/TH-424,Mittelberg,,50.89666667,10.42694444,527 +DM/TH-425,Grosser Hund,,50.76527778,11.11833333,526 +DM/TH-426,Haselriether Berg,,50.42805556,10.69333333,526 +DM/TH-427,Wache,,50.78359985,11.34829998,526 +DM/TH-428,–lberg,,50.83888889,10.60333333,526 +DM/TH-429,Hainberg,,50.63027778,10.43888889,525 +DM/TH-430,Honigsberg,,50.48027778,10.47666667,525 +DM/TH-431,Huehnberg,,50.78166667,10.43055556,524 +DM/TH-432,Kammberg,,50.74277778,10.82944444,524 +DM/TH-433,Lindenberg,,50.68611111,10.44750000,523 +DM/TH-434,Geiersberg,,50.64138889,11.13750000,522 +DM/TH-435,Herrenkuppe,,50.69305556,10.43972222,522 +DM/TH-436,Hoehnberg,,50.80027778,10.40833333,522 +DM/TH-437,Kesselberg,,50.70083333,11.26277778,522 +DM/TH-438,Kleiner Wartberg,,50.90527778,10.42027778,522 +DM/TH-439,Eichenkopf,,50.79194444,10.42111111,521 +DM/TH-440,Silberberg,,50.67555556,11.24083333,521 +DM/TH-441,Finstere Tanne,,50.87583333,10.54250000,520 +DM/TH-442,Knoepfelsberg,,50.80972222,10.69944444,519 +DM/TH-443,Schwanberg,,50.43722222,10.57944444,519 +DM/TH-444,Wiesenberg,,50.53833333,10.64250000,518 +DM/TH-445,Laubberg,,50.43972222,10.67944444,515 +DM/TH-446,Heiligenberg,,50.62444444,10.41166667,514 +DM/TH-447,Heiliger Berg,,50.61166667,10.65000000,513 +DM/TH-448,Schwabhaeuser Berg,,50.42805556,10.57277778,511 +DM/TH-449,Sandersberg,,50.60944444,10.61500000,510 +DM/TH-450,Steinkopf,,50.75472222,10.43500000,509 +DM/TH-451,Kunitzberg,,50.74111111,11.23861111,508 +DM/TH-452,Moenchberg,,50.69250000,10.42138889,508 +DM/TH-453,Queienberg,,50.45027778,10.47361111,508 +DM/TH-454,Burgberg,,50.53222222,10.66194444,506 +DM/TH-455,Haunberg,,50.77527778,11.11166667,506 +DM/TH-456,Rabenhuegel,,50.63944444,11.16055556,506 +DM/TH-457,Dietrich,,50.44500000,10.51055556,505 +DM/TH-458,Heitzberg,,50.67861111,10.41472222,505 +DM/TH-459,Hohe Wart,,50.40305556,10.77027778,505 +DM/TH-460,Hummelsberg,,50.78555556,11.36305556,504 +DM/TH-461,Hoelschberg,,50.56083333,10.52333333,503 +DM/TH-462,Katzenberg,,50.52000000,10.65916667,503 +DM/TH-463,Kienberg,,50.71333333,10.95750000,503 +DM/TH-464,Maeuseberg,,50.77305556,10.98805556,503 +DM/TH-465,Langer Berg,,50.51694444,10.46694444,502 +DM/TH-466,Roderberg,,50.64444444,11.17416667,502 +DM/TH-467,Willinger Berg,,50.75944444,11.01027778,502 +DM/TH-468,Frohnberg,,50.51861111,10.48638889,501 +DM/TH-469,Platte,,50.44083333,10.52194444,501 +DM/TH-470,Kaitsch,,50.89305556,11.36472222,497 +DM/TH-471,Michelsdorf,,50.51944444,10.51416667,496 +DM/TH-472,Stadtberg,,50.41638889,10.72194444,496 +DM/TH-473,Ahlberg,,50.48833333,10.45222222,495 +DM/TH-474,Zimmerberg,,50.67083333,10.42194444,495 +DM/TH-475,Alter Berg,,51.05194444,10.45750000,494 +DM/TH-476,Haelsberg,,50.53777778,10.48694444,494 +DM/TH-477,Edelmannsberg,,50.75611111,11.08666667,492 +DM/TH-478,Hetzert,,50.55750000,10.53111111,491 +DM/TH-479,Dachsberg,,50.86111111,10.59444444,490 +DM/TH-480,Wallingsberg,,51.34055556,10.46305556,490 +DM/TH-481,Rossbachhoehe,,50.69916667,10.43527778,489 +DM/TH-482,Schlotberg,,50.46583333,10.48722222,489 +DM/TH-483,Katzenberg,,50.88888889,11.13944444,488 +DM/TH-484,Krautberg,,50.41444444,10.73361111,488 +DM/TH-485,Schweinskopf,,50.79583333,11.09722222,488 +DM/TH-486,Moeckser Hoehe,,50.68722222,10.40722222,487 +DM/TH-487,Sollstedter Warte,,51.31472222,10.48305556,487 +DM/TH-488,Schweinsberg,,50.79305556,10.89916667,486 +DM/TH-489,Wachkopf,,50.83583333,10.65583333,486 +DM/TH-490,Kuhberg,,50.79861111,10.96500000,485 +DM/TH-491,Ziegenberg,,50.77472222,10.85611111,485 +DM/TH-492,Geroder Berg,,50.56527778,10.51138889,484 +DM/TH-493,Craulaer Hausmassen,,51.06972222,10.45527778,483 +DM/TH-494,Kohlberg,,50.52166667,10.49833333,483 +DM/TH-495,Quingerberg,,50.90500000,11.18666667,483 +DM/TH-496,Bitthaeuser Berg,,50.55305556,10.48972222,482 +DM/TH-497,Reitzenberg,,50.91000000,10.44972222,482 +DM/TH-498,Stedtberg,,50.54027778,10.51083333,482 +DM/TH-499,Doerrberg,,50.39777778,10.77111111,481 +DM/TH-500,Doettberg,,50.51861111,10.45027778,479 +DM/TH-501,Rothkuppe,,50.74194444,10.42361111,479 +DM/TH-502,Wolfsberg,,50.89222222,11.11611111,478 +DM/TH-503,Kolmberg,,50.71305556,11.23527778,477 +DM/TH-504,Eichelberg,,50.51250000,10.44750000,476 +DM/TH-505,Galgenberg,,50.87555556,11.35805556,476 +DM/TH-506,Kaltenberg,,50.41222222,10.70583333,476 +DM/TH-507,Kalter Berg,,51.30694444,10.47305556,476 +DM/TH-508,Mittelberg,,50.51027778,10.50972222,476 +DM/TH-509,Steinberg,,50.79416667,11.31805556,476 +DM/TH-510,Sanertberg,,50.50472222,10.47750000,475 +DM/TH-511,Trippstein,,50.65222222,11.18583333,475 +DM/TH-512,Weimarberg,,50.70611111,10.43083333,474 +DM/TH-513,Grosser Eller,,50.54027778,10.61972222,473 +DM/TH-514,Renn,,51.04750000,10.47361111,473 +DM/TH-515,Eichberg,,50.89388889,11.15805556,471 +DM/TH-516,Kesselberg,,50.90472222,11.22166667,471 +DM/TH-517,Vogelherd,,50.90055556,11.32861111,471 +DM/TH-518,Eisenberg,,50.89166667,10.31388889,470 +DM/TH-519,Ruettelsberg,,50.91416667,11.20750000,470 +DM/TH-520,Schossberg,,50.90916667,10.39500000,470 +DM/TH-521,Treppendorfer Berg,,50.81972222,11.27166667,470 +DM/TH-522,Buchenberg,,50.75416667,11.19083333,469 +DM/TH-523,Holzberg,,50.87805556,11.38944444,469 +DM/TH-524,Zeiberg,,50.42611111,10.63777778,469 +DM/TH-525,Loehberg,,51.05416667,10.42888889,468 +DM/TH-526,Winterstein,,51.14611111,10.35361111,468 +DM/TH-527,Otterbuehl,,51.07333333,10.42944444,466 +DM/TH-528,Bombenberg,,50.87194444,11.36555556,465 +DM/TH-529,Forstberg,,50.71861111,11.20388889,465 +DM/TH-530,Wachenberg,,50.86500000,11.40194444,465 +DM/TH-531,Harnisch,,51.30583333,10.53583333,464 +DM/TH-532,Hirschstein,,50.92750000,10.32083333,464 +DM/TH-533,Schwallunger Berg,,50.66527778,10.40611111,464 +DM/TH-534,Kesselberg,,50.84722222,11.41750000,463 +DM/TH-535,Milmesberg,,50.90694444,10.25472222,461 +DM/TH-536,Sommerstein,,51.15222222,10.33444444,461 +DM/TH-537,Finkenberg,,50.82361111,10.67638889,460 +DM/TH-538,Kirschberg,,50.71888889,11.25138889,460 +DM/TH-539,Reinhardtsberg,,50.84777778,11.16111111,460 +DM/TH-540,Grosser Wolfskuppe,,50.79222222,10.37694444,459 +DM/TH-541,Buchberg,,50.76638889,11.07777778,458 +DM/TH-542,Grosser Kroetenkopf,,50.84694444,10.32611111,457 +DM/TH-543,Grosser Zimmerberg,,51.06416667,10.44111111,456 +DM/TH-544,Gebrannter Kopf,,51.13805556,10.35361111,455 +DM/TH-545,Linkberg,,50.42722222,10.62194444,455 +DM/TH-546,Ringelsberg,,50.65611111,10.40222222,455 +DM/TH-547,Eichberg,,50.90055556,10.28833333,454 +DM/TH-548,Geiersberg,,50.82027778,11.29444444,454 +DM/TH-549,Kambuehl,,50.92250000,10.45638889,454 +DM/TH-550,Duerrenberg,,50.92611111,10.33805556,453 +DM/TH-551,Zollberg,,50.55027778,10.50444444,453 +DM/TH-552,Der Berg,,51.41055556,10.64666667,451 +DM/TH-553,Haardt,,51.10194444,10.38222222,451 +DM/TH-554,Starkenberg,,50.54055556,10.56027778,451 +DM/TH-555,Vorwerkshuegel,,50.82083333,11.45027778,451 +DM/TH-556,Ziegenschneller,,50.80638889,11.43972222,451 +DM/TH-557,Kottenhainer Hoehe,,50.83361111,11.38833333,449 +DM/TH-558,Steiger,,51.08472222,10.40833333,449 +DM/TH-559,Wipferkopf,,50.72250000,10.95777778,449 +DM/TH-560,Wuester Weinberg,,50.82888889,11.30138889,449 +DM/TH-561,Arnstein,,50.52694444,10.56722222,448 +DM/TH-562,Knollenberg,,50.57972222,10.54638889,448 +DM/TH-563,Stiebelskuppe,,50.96500000,10.24916667,448 +DM/TH-564,Kleine Wolfskuppe,,50.78666667,10.38361111,447 +DM/TH-565,Zimmritzer Hoehe,,50.85111111,11.50777778,447 +DM/TH-566,Buchberge,,50.78166667,11.48055556,446 +DM/TH-567,Seelig,,50.39333333,10.73055556,446 +DM/TH-568,Alter Busch,,51.04111111,10.44222222,445 +DM/TH-569,Gruebelsberg,,50.89527778,10.49527778,444 +DM/TH-570,Hangleite,,50.38861111,10.73916667,444 +DM/TH-571,Nuesslerliefe,,50.76222222,10.40916667,444 +DM/TH-572,Ruesselskopf,,50.95666667,10.25222222,444 +DM/TH-573,Wachenberg,,50.85555556,11.43361111,444 +DM/TH-574,Windberg,,50.52055556,10.61833333,444 +DM/TH-575,Hohe Sonne,,50.93194444,10.32250000,443 +DM/TH-576,Hopfberg,,50.80000000,11.47361111,443 +DM/TH-577,Neuenstein,,51.08777778,10.39500000,443 +DM/TH-578,Teilberg,,51.40305556,10.71333333,443 +DM/TH-579,Hexenberg,,50.91444444,11.27194444,442 +DM/TH-580,Kugelberg,,50.79944444,11.50333333,442 +DM/TH-581,Pfaffenberg,,50.89555556,10.28666667,442 +DM/TH-582,Rittergasserberg,,51.04138889,10.49055556,442 +DM/TH-583,Wolfshof,,51.33470154,10.88029957,442 +DM/TH-584,Steinberg,,50.89722222,11.18666667,439 +DM/TH-585,Eisenhuegel,,50.43583333,10.53583333,438 +DM/TH-586,Hehlig,,50.56333333,10.56916667,436 +DM/TH-587,Kleiner Hoerselberg,,50.96388889,10.40583333,436 +DM/TH-588,Dudelberg,,51.13777778,10.31611111,435 +DM/TH-589,Haeselberg,,50.70361111,10.41694444,435 +DM/TH-590,Hummelreich,,50.84444444,11.44750000,434 +DM/TH-591,Totenkopf,,51.09555556,10.39333333,434 +DM/TH-592,Polarskopf,,50.90861111,10.49583333,433 +DM/TH-593,Possen,,51.33888889,10.85777778,432 +DM/TH-594,Rehn,,50.86388889,11.45000000,432 +DM/TH-595,Pfennigsberg,,50.83750000,10.90972222,431 +DM/TH-596,Salkopf,,50.93638889,10.30777778,430 +DM/TH-597,Wartenberg,,51.03388889,10.45305556,430 +DM/TH-598,Woebelsburg,,51.40916667,10.70416667,429 +DM/TH-599,Jaegersberg,,50.84333333,11.47333333,428 +DM/TH-600,Krayenberg,,50.53194444,10.53944444,428 +DM/TH-601,Galgenkopf,,50.89916667,10.45916667,426 +DM/TH-602,Saarkopf,,50.77833333,10.38166667,426 +DM/TH-603,Breitenberg,,50.92083333,11.26166667,424 +DM/TH-604,Karthaeuserberg,,50.92583333,10.30388889,424 +DM/TH-605,Lohberg,,51.04333333,10.41805556,424 +DM/TH-606,Steckenberg,,51.40138889,10.68138889,424 +DM/TH-607,Steiler Huegel,,50.73972222,10.39555556,424 +DM/TH-608,Eichberg,,51.06333333,10.40500000,422 +DM/TH-609,Rodberg,,50.86305556,11.12388889,422 +DM/TH-610,Bock,,50.82361111,11.43055556,421 +DM/TH-611,Schlegelsberg,,50.79722222,10.37194444,421 +DM/TH-612,Wachsenburg,,50.85861111,10.87611111,421 +DM/TH-613,Ingelstedter Berg,,51.34277778,10.64194444,420 +DM/TH-614,Langer Berg,,50.72944444,10.39972222,420 +DM/TH-615,Fichtenkopf,,50.65055556,10.77027778,944 +DM/TH-616,Teufelskanzel,,50.66888889,10.76555556,935 +DM/TH-617,Farmenfleck,,50.67694444,10.71583333,890 +DM/TH-618,Unterer Beerberg,,50.65388889,10.73694444,890 +DM/TH-619,Finsterberger Koepfchen,,50.64194444,10.80638889,875 +DM/TH-620,Jaegerhausberg,,50.70194444,10.66416667,874 +DM/TH-621,Goldlauterberg,,50.64083333,10.77166667,874 +DM/TH-622,Schuesslers Hoehe,,50.59611111,10.76972222,858 +DM/TH-623,Alter Berg,,50.72055556,10.68472222,852 +DM/TH-624,Bornberg,,50.50083333,11.13666667,846 +DM/TH-625,Sternberg,,50.68583333,10.69444444,840 +DM/TH-626,Schlossbergkopf,,50.71250000,10.72861111,827 +DM/TH-627,Schnitzersberg,,50.55833333,10.08000000,816 +DM/TH-628,Ellenbogen,,50.57277778,10.08166667,813 +DM/TH-629,Grabenberg,,50.52944444,10.06638889,796 +DM/TH-630,Kleiner Muenzeberg,,50.73361111,10.68888889,794 +DM/TH-631,Spielmannsleite,,50.65416667,10.80861111,784 +DM/TH-632,Unterer Alsbachsberg,,50.48305556,11.04583333,782 +DM/TH-633,Petersberg,,50.72222222,10.61805556,774 +DM/TH-634,Heidelberg,,50.68861111,10.85666667,769 +DM/TH-635,Wuestrumnei,,50.68361111,10.80611111,751 +DM/TH-636,Wurmberg,,50.57888889,11.15638889,749 +DM/TH-637,Nesselberg,,50.78000000,10.56305556,747 +DM/TH-638,Steufelsberg,,50.56972222,10.11250000,740 +DM/TH-639,Grosser Droehberg,,50.59166667,10.73888889,729 +DM/TH-640,Weidberg,,50.58972222,10.08388889,725 +DM/TH-641,Neidhardskopf,,50.57527778,10.26583333,721 +DM/TH-642,Sachsenburg,,50.71305556,10.07694444,720 +DM/TH-643,Fuchssteine,,50.64555556,10.65166667,709 +DM/TH-644,Haderholzstein,,50.78750000,10.49694444,708 +DM/TH-645,Hoher Rain,,50.66888889,10.17861111,702 +DM/TH-646,Rossberg,,50.67305556,10.18250000,701 +DM/TH-646,Rossberg,,50.67309952,10.18249989,701 +DM/TH-647,Moenchstein,,50.76444444,10.51500000,701 +DM/TH-648,Umpfen,,50.64444444,10.16694444,700 +DM/TH-649,Mannsberg,,50.70583333,10.03888889,698 +DM/TH-650,Hoher Stern,,50.71750000,10.04916667,697 +DM/TH-651,Mittelberg,,50.57805556,11.11888889,697 +DM/TH-652,Ausgebrannter Stein,,50.70416667,10.77638889,695 +DM/TH-653,Galgenhuegel,,50.58305556,11.13472222,695 +DM/TH-654,Steinkopf,,50.69694444,10.08583333,694 +DM/TH-655,Rossberg,,50.68222222,10.01722222,693 +DM/TH-656,Zeller Kopf,,50.70305556,10.07611111,693 +DM/TH-657,Roederburg,,50.71583333,10.07500000,691 +DM/TH-658,Alte Mark,,50.58305556,10.15500000,676 +DM/TH-659,Domberg,,50.61722222,10.68583333,674 +DM/TH-660,Waltersberg,,50.68416667,10.09138889,673 +DM/TH-661,Steinbruchsberg,,50.58138889,11.12444444,671 +DM/TH-662,Glaeserberg,,50.69250000,10.09972222,670 +DM/TH-663,Dietrichsberg,,50.78138889,10.03055556,667 +DM/TH-663,Dietrichsberg,,50.78139877,10.03059959,667 +DM/TH-664,Kleine Hohe Warte,,50.73444444,10.76833333,666 +DM/TH-665,Horbel,,50.65555556,10.08055556,665 +DM/TH-666,Stellberg,,50.55861111,10.14055556,663 +DM/TH-667,Reisinger Stein,,50.66111111,10.63138889,662 +DM/TH-668,Pinzler,,50.63611111,10.09916667,661 +DM/TH-669,Arnsberg,,50.68916667,10.06472222,661 +DM/TH-670,Leichelberg,,50.60250000,10.18805556,655 +DM/TH-671,Hammerberg,,50.47777778,10.88861111,653 +DM/TH-672,Hoellkopf,,50.87750000,10.34527778,646 +DM/TH-673,Altes Schloss,,50.70527778,10.08972222,645 +DM/TH-674,Kuhberg,,50.69361111,10.05750000,642 +DM/TH-675,Grosser Huflar,,50.62083333,10.08666667,640 +DM/TH-676,Henneberg,,50.53388889,10.24472222,639 +DM/TH-677,Geriswiesenkopf,,50.62555556,10.22111111,634 +DM/TH-678,Schaefersberg,,50.64000000,10.62694444,632 +DM/TH-679,Katzenstein,,50.67250000,10.06888889,627 +DM/TH-680,Oechsenberg,,50.79970169,10.02830029,627 +DM/TH-681,Priemaeusel,,50.47833333,10.86027778,624 +DM/TH-682,Hemschenberg,,50.59833333,10.13527778,613 +DM/TH-683,Windberg,,50.64472222,10.13138889,608 +DM/TH-684,Hausberg,,50.67416667,10.15944444,604 +DM/TH-685,Reinsburg,,50.76861111,10.93750000,604 +DM/TH-686,Kruecke,,50.63555556,10.23472222,603 +DM/TH-687,Bildstein,,50.60305556,10.26638889,595 +DM/TH-688,Masskopf,,50.76833333,10.49111111,588 +DM/TH-689,Lehmberg,,50.63555556,09.95694444,587 +DM/TH-690,Rabenberg,,50.75888889,10.93083333,584 +DM/TH-691,Wunschberg,,50.60611111,10.21388889,578 +DM/TH-692,Hundsrueck,,50.78305556,10.47583333,577 +DM/TH-693,Gartenkuppe,,50.61833333,11.34388889,577 +DM/TH-694,Gotteskopf,,50.67694444,10.21805556,576 +DM/TH-695,Schorn,,50.62444444,10.59305556,573 +DM/TH-696,Kohlberg,,50.73666667,10.49583333,568 +DM/TH-696,Kohlberg,,50.73669815,10.49580002,568 +DM/TH-697,Gretiberg,,50.61527778,10.19000000,563 +DM/TH-698,Roter Buehl,,50.54305556,10.25722222,563 +DM/TH-699,Schorn,,50.73500000,10.07333333,559 +DM/TH-700,Baerenkopf,,50.67305556,10.45750000,559 +DM/TH-701,Ohrberg,,50.58027778,10.17500000,556 +DM/TH-702,Ahlstaedter Berg,,50.52361111,10.70416667,556 +DM/TH-703,Heckenbuehl,,50.45750000,10.79583333,550 +DM/TH-704,Glasberg,,50.65500000,10.23055556,548 +DM/TH-705,Tannenberg,,50.63388889,09.93694444,543 +DM/TH-706,Waldauer Hoehe,,50.50277778,10.80250000,543 +DM/TH-707,Hinterer Thalkopf,,50.65055556,10.46805556,543 +DM/TH-708,Schlossberg,,50.80194444,10.71222222,542 +DM/TH-709,Emberg,,50.73138889,10.09194444,541 +DM/TH-710,Mittelberg,,50.77972222,10.97194444,540 +DM/TH-711,Roessberg,,50.63888889,09.91222222,639 +DM/TH-712,Hoher Berg,,50.58416667,10.30222222,539 +DM/TH-713,Leite,,50.54000000,10.29611111,538 +DM/TH-714,Fritzenberg,,50.50220108,10.37829971,534 +DM/TH-715,Nebelberg,,50.70000000,10.19500000,532 +DM/TH-716,Ahornsberg,,50.46944444,10.83861111,532 +DM/TH-717,Heiliger Berg,,50.49666667,10.36555556,530 +DM/TH-718,Schleusenberg,,50.46916667,10.81750000,530 +DM/TH-719,Steinruecke,,50.65750000,10.53444444,528 +DM/TH-720,Pletzelstein,,50.66472222,09.88722222,527 +DM/TH-721,Burg Henneberg,,50.49138889,10.36138889,527 +DM/TH-722,Eppersberg,,50.71750000,10.09500000,525 +DM/TH-723,Weidebrunner Kuppe,,50.74777778,10.45055556,525 +DM/TH-724,Klausberg,,50.56250000,10.17944444,523 +DM/TH-725,Steinkopf,,50.54166667,10.21194444,523 +DM/TH-726,Buchenberg,,50.53638889,10.32277778,523 +DM/TH-727,Schwarzer Berg,,50.61277778,11.35333333,523 +DM/TH-728,Dicker Berg,,50.66388889,10.51611111,522 +DM/TH-729,Kleiner Dolmar,,50.67055556,10.50777778,522 +DM/TH-730,Wallenberge,,50.57166667,10.22361111,521 +DM/TH-731,Rudelsberg,,50.53222222,10.30611111,519 +DM/TH-732,Ebanotte,,50.80444444,10.87138889,518 +DM/TH-733,Karl-Friedrich-Stein,,50.70777778,10.11194444,517 +DM/TH-734,Silbacher Berg,,50.52555556,10.78027778,515 +DM/TH-735,Kuechenberg,,50.74500000,10.27416667,514 +DM/TH-736,Ransberg,,50.47583333,10.40138889,514 +DM/TH-737,Ermelsberg,,50.44444444,10.60138889,514 +DM/TH-738,Beckenschlagskopf,,50.64194444,10.50750000,513 +DM/TH-739,Hoehnberg,,50.44638889,10.65916667,513 +DM/TH-740,Eulskopf,,50.61194444,10.60194444,513 +DM/TH-741,Haselberg,,50.52527778,10.33444444,512 +DM/TH-742,Dornkopf,,50.55000000,10.32500000,512 +DM/TH-743,Iltenberg,,50.48500000,10.62277778,512 +DM/TH-744,Roedelsberg,,50.68916667,10.54194444,512 +DM/TH-745,Hoehn,,50.65555556,10.11888889,511 +DM/TH-746,Kleine Geba,,50.57444444,10.31305556,510 +DM/TH-747,Albrechtser Berg,,50.63777778,10.60361111,510 +DM/TH-748,Wolfsberg,,50.48416667,10.35444444,505 +DM/TH-749,Hausberg,,50.47611111,10.39222222,505 +DM/TH-750,Meisenbachskopf,,50.60916667,10.54138889,505 +DM/TH-751,Schleidsberg,,50.70833333,09.97416667,503 +DM/TH-752,Ochsenbachskopf,,50.64416667,10.53250000,502 +DM/TH-753,Teufelsberg,,50.67583333,09.88944444,501 +DM/TH-754,Galgenhoeh,,50.45777778,10.60861111,501 +DM/TH-755,Thomasberg,,50.42694444,10.85722222,501 +DM/TH-756,Kuhberg,,50.51000000,10.69166667,499 +DM/TH-757,Hohe Maas,,50.56222222,10.45861111,497 +DM/TH-758,Steinerner Berg,,50.50138889,10.59611111,497 +DM/TH-759,Ripperts,,50.73944444,10.29083333,496 +DM/TH-760,Buchberg,,50.59361111,10.57472222,494 +DM/TH-761,Kuppe,,50.64388889,10.31111111,493 +DM/TH-762,Bornkopf,,50.79000000,10.15972222,492 +DM/TH-763,Kuechenberg,,50.56777778,10.46861111,492 +DM/TH-764,Mehmelsfelder Berg,,50.51000000,10.38722222,491 +DM/TH-765,Kuesselberg,,50.46500000,10.51611111,491 +DM/TH-766,Hahnkopf,,50.79194444,10.03444444,489 +DM/TH-767,Bettstall,,50.63333333,10.57361111,489 +DM/TH-768,Uhlberg,,50.47972222,10.56750000,488 +DM/TH-769,Brunnenberg,,50.44250000,10.81750000,488 +DM/TH-770,Koehlersberg,,50.73555556,10.30833333,487 +DM/TH-771,Kahler Berg,,50.56277778,10.33444444,487 +DM/TH-772,Auf der Schanz,,50.55750000,10.43638889,486 +DM/TH-773,Drachenberg,,50.58027778,10.44277778,486 +DM/TH-774,Eschberg,,50.61722222,10.40666667,486 +DM/TH-775,Lochberg,,50.56277778,10.19222222,486 +DM/TH-776,Koepfchen,,50.61694444,10.26611111,485 +DM/TH-777,Neuberg,,50.53138889,10.35305556,484 +DM/TH-778,Eulenkopf,,50.50638889,10.39805556,483 +DM/TH-779,Maselsbacher Berg,,50.77527778,10.17722222,481 +DM/TH-780,Salzunger Berg,,50.78444444,10.16055556,481 +DM/TH-781,Schwarzbacher Kopf,,50.48083333,10.82472222,480 +DM/TH-782,Bornkopf,,50.76861111,10.10583333,479 +DM/TH-783,Spielberg,,50.51527778,10.40027778,478 +DM/TH-784,Koppe,,50.58722222,10.47166667,478 +DM/TH-785,Hexenberg,,50.54500000,10.43277778,478 +DM/TH-786,Oberer Berg,,50.59111111,10.37638889,478 +DM/TH-787,Lotzenhack,,50.56500000,10.35138889,476 +DM/TH-788,Holzkopf,,50.54055556,10.59750000,476 +DM/TH-789,Rothenberg,,50.72888889,10.27166667,475 +DM/TH-790,Rangenberg,,50.48416667,10.51333333,474 +DM/TH-791,Dippersberg,,50.54638889,10.35611111,473 +DM/TH-792,Bremer Berg,,50.73305556,10.02472222,472 +DM/TH-793,Ziegenberg,,50.53861111,10.44472222,472 +DM/TH-794,Schnorr,,50.47527778,10.53333333,472 +DM/TH-795,Hengstberg,,50.67750000,10.30583333,471 +DM/TH-796,Hutsberg,,50.47527778,10.62472222,471 +DM/TH-797,Hohenrod,,50.55138889,10.54777778,471 +DM/TH-798,Kohlberg,,50.73111111,10.25444444,470 +DM/TH-799,Galgenberg,,50.79944444,10.13138889,470 +DM/TH-800,Gickelberg,,50.60416667,10.53444444,470 +DM/TH-801,Koepfel,,50.69083333,10.16861111,470 +DM/TH-802,Eichigkopf,,50.59166667,10.32000000,469 +DM/TH-803,Kirchberg,,50.45333333,10.56111111,469 +DM/TH-804,Mittelberg,,50.73750000,10.27916667,467 +DM/TH-805,Hessenkoppe,,50.57944444,10.46222222,466 +DM/TH-806,Johannisberg,,50.59611111,10.46083333,465 +DM/TH-807,Zehnerberg,,50.50690079,10.42000008,465 +DM/TH-808,Oberer Vogelherd,,50.69333333,10.27333333,465 +DM/TH-809,Kohlkoepfchen,,50.71222222,10.20222222,465 +DM/TH-810,Rother Kopf,,50.39333333,10.60750000,465 +DM/TH-811,Stillberg,,50.53138889,10.38583333,462 +DM/TH-812,Schlossberg,,50.81666667,10.36361111,462 +DM/TH-813,Mittelberg,,50.70833333,09.99000000,460 +DM/TH-814,Arnsberg,,50.46805556,10.42500000,460 +DM/TH-815,Hemmkopf,,50.46638889,10.56000000,460 +DM/TH-816,Gehegter Berg,,50.49583333,10.61611111,460 +DM/TH-817,Fixleite,,50.55611111,10.46666667,459 +DM/TH-818,Vorderberg,,50.62305556,10.27666667,459 +DM/TH-819,Schienberg,,50.69250000,10.47027778,458 +DM/TH-820,Pfaffenkopf,,50.40138889,10.72805556,458 +DM/TH-821,Grosser Breitberg,,50.44111111,10.62138889,457 +DM/TH-822,Hundsruecken,,50.71166667,10.32277778,456 +DM/TH-823,Kiliansberg,,50.60027778,10.43027778,455 +DM/TH-824,Aschenberg,,50.80666667,10.36083333,452 +DM/TH-825,Kirchberg,,50.70916667,10.33361111,450 +DM/TH-826,Adelsberg,,50.90222222,11.30027778,416 +DM/TH-827,Pferdeberg,,50.64027778,10.90500000,805 +DM/TH-828,Jenzig,,50.93916667,11.63416667,385 +DM/TH-829,Kuppe,,50.85694444,11.54722222,438 +DM/TH-830,Ziegelberg,,50.84055556,10.64222222,519 +DM/TH-831,Wernburg,,50.63555556,11.43361111,449 +DM/TH-832,Kulm,,50.68360138,11.36890030,482 +DM/TH-833,Moenchsberg,,50.55666667,11.47861111,572 +DM/TH-834,Beerhuegel,,50.58361111,11.30444444,677 +DM/TH-835,Henneberg,,50.49916667,11.50805556,701 +DM/TH-836,Hinterer Breiteberg,,50.62388889,11.32138889,551 +DM/TH-837,Kolditzberg,,50.55388889,11.36777778,583 +DM/TH-838,Vogelherd,,50.60194444,11.46166667,565 +DM/TH-839,Schmittenberg,,50.59944444,11.42666667,529 +DM/TH-840,Spitzer Berg,,50.55361111,11.19027778,790 +DM/TH-841,Kirchberg,,50.56916667,11.23166667,725 +DM/TH-842,Sommerberg,,50.61944444,11.29277778,669 +DM/TH-843,Rueckersbiel,,50.52555556,11.16222222,756 +DM/TH-844,Quittelsberg,,50.60777778,11.19694444,708 +DM/TH-845,Pechseifenberg,,50.50055556,11.02361111,794 +DM/TH-846,Grosser Kalmberg,,50.77190018,11.17189980,547 +DM/TH-847,Brandhuegel,,50.64444444,11.26416667,623 +DM/TH-848,Frauenberg,,51.37722222,10.83388889,411 +DM/TH-849,Sankt Georgsberg,,50.82777778,10.62527778,481 +DM/TH-850,Napoleonstein,,50.94527778,11.57166667,362 +DM/TH-851,Keudelskuppe,,51.20579910,10.18690014,485 + + +OE/BL-001,Geschriebenstein,,47.3528,16.4339,884 +OE/BL-002,Grosser Hirschenstein,,47.3450,16.3792,862 +OE/BL-003,Steinstueckl,,47.4339,16.2739,833 +OE/BL-004,Kienberg,,47.4244,16.2650,805 +OE/BL-005,Pauliberg,,47.5844,16.3392,761 +OE/BL-006,Klosterberg,,47.5658,16.3336,745 +OE/BL-007,Koglberg,,47.4500,16.2958,711 +OE/BL-008,Krieriegel,,47.7189,16.2944,682 +OE/BL-009,Sieggrabner Kogel,,47.6606,16.3619,650 +OE/BL-010,Bergkogel,,47.7433,16.2994,621 +OE/BL-011,Brenntenriegel,,47.6594,16.3906,606 +OE/BL-012,Sonnenberg,,47.8753,16.4756,484 +OE/BL-013,Buchkogel,,47.8778,16.5389,433 +OE/BL-014,Rotterberg,,46.8314,16.0058,408 +OE/BL-015,Ramsauberg,,47.8936,16.5928,390 +OE/BL-016,Dreilaenderecke,,46.8689,16.1139,387 +OE/BL-017,Hofweinriegel,,47.0603,16.1889,366 +OE/BL-018,Sauspitz,,47.9525,16.6878,366 +OE/BL-019,Koenigsberg,,47.9717,16.7403,286 +OE/BL-020,Rosalienkapelle (Rosalia),,47.6978,16.3069,748 +OE/KT-001,Grossglockner,,47.0744,12.6939,3798 +OE/KT-002,Johannisberg,,47.1092,12.6731,3453 +OE/KT-003,Hochalmspitze (Hochalmer),,47.0153,13.3203,3360 +OE/KT-004,Fuscher-Kar-Kopf,,47.0989,12.7450,3331 +OE/KT-005,Petzeck,,46.9481,12.8042,3283 +OE/KT-006,Roter Knopf,,46.9786,12.7389,3281 +OE/KT-007,Hocharn (Hochnarr),,47.0758,12.9372,3254 +OE/KT-008,Ankogel,,47.0511,13.2486,3252 +OE/KT-009,Grosser Hornkopf,,46.9672,12.7783,3251 +OE/KT-010,Schareck,,47.0414,13.0175,3123 +OE/KT-011,Hoher Seekamp,,46.9958,12.8031,3112 +OE/KT-012,Hoher Sonnblick,,47.0539,12.9572,3106 +OE/KT-013,Sandkopf,,47.0372,12.9300,3090 +OE/KT-014,Saeuleck,,46.9967,13.2869,3086 +OE/KT-015,Brennkogel,,47.0975,12.8200,3018 +OE/KT-016,Vorderer Geissl­kopf,,47.0133,13.0728,2974 +OE/KT-017,Reisseck,,46.9469,13.3642,2965 +OE/KT-018,Weissseekopf,,47.0153,12.9958,2908 +OE/KT-019,Stellkopf,,46.9897,12.9775,2852 +OE/KT-020,Gamskarlspitz,,47.0372,13.1619,2833 +OE/KT-021,Riedbock,,46.9283,13.3561,2822 +OE/KT-022,Reitereck,,47.0194,13.5042,2790 +OE/KT-023,Polinik,,46.8950,13.1581,2784 +OE/KT-024,Hohe Leier,,46.9122,13.3900,2774 +OE/KT-025,Striedenkopf,,46.8681,13.1128,2749 +OE/KT-026,Sadnig,,46.9411,12.9886,2745 +OE/KT-027,Hochkreuz,,46.8150,13.0736,2709 +OE/KT-028,Stanziwurten,,47.0089,12.9258,2707 +OE/KT-029,Kreuzeck,,46.8400,13.1117,2701 +OE/KT-030,Hochstadel,,46.7600,12.8567,2681 +OE/KT-031,Scharnik,,46.7944,13.0439,2657 +OE/KT-032,Tandlspitze,,46.9558,13.4147,2633 +OE/KT-033,Mohar,,46.9661,12.9467,2605 +OE/KT-034,Torkarspitze,,46.6492,12.7158,2574 +OE/KT-035,Grakofel,,46.8328,13.2283,2551 +OE/KT-036,Hochtristen,,46.7953,13.1353,2536 +OE/KT-037,Stawipfel,,46.8261,13.1869,2514 +OE/KT-038,Raudenspitze,,46.6478,12.7611,2507 +OE/KT-039,Salzkofel,,46.8467,13.2606,2498 +OE/KT-040,Rosennock,,46.8767,13.7122,2440 +OE/KT-041,Schulterhoehe,,46.6722,12.6947,2424 +OE/KT-042,Wintertalernock,,46.9422,13.9519,2394 +OE/KT-043,Riebenkofel,,46.7294,12.8017,2386 +OE/KT-044,Plenge,,46.6522,12.9006,2373 +OE/KT-045,Reisskofel,,46.6856,13.1464,2371 +OE/KT-046,Stubeck,,46.9931,13.5361,2370 +OE/KT-047,Koenigstuhl,,46.9436,13.7842,2336 +OE/KT-048,Rinsennock,,46.9089,13.8506,2334 +OE/KT-049,Polinik,,46.6272,12.9819,2332 +OE/KT-050,Klomnock,,46.8814,13.7878,2331 +OE/KT-051,Bretthoehe,,46.9125,13.9364,2320 +OE/KT-052,Rodresnock,,46.8528,13.8158,2310 +OE/KT-053,Lenkenspitz,,46.8131,13.2581,2298 +OE/KT-054,Stagor,,46.7861,13.2658,2289 +OE/KT-055,Lumkofel,,46.7219,12.8433,2287 +OE/KT-056,Trogkofel,,46.5708,13.2164,2280 +OE/KT-057,Koflernock,,46.9094,13.7939,2277 +OE/KT-058,Torkofel,,46.7017,13.0764,2276 +OE/KT-059,Grosser Speikkofel,,46.8939,13.9397,2270 +OE/KT-060,Latschur,,46.7383,13.3961,2236 +OE/KT-061,Gruft,,46.9053,13.9019,2232 +OE/KT-062,Koederhoehe,,46.6144,13.0128,2228 +OE/KT-063,Hochstuhl,,46.4336,14.1733,2225 +OE/KT-064,Karlhoehe,,46.0025,13.5694,2218 +OE/KT-065,Schwarzwand,,47.0075,13.6928,2214 +OE/KT-066,Hoher Trieb,,46.5972,13.0611,2199 +OE/KT-067,Gartnerkofel,,46.5714,13.3036,2195 +OE/KT-068,Gaugen,,46.7864,13.2092,2195 +OE/KT-069,Hochwipfel,,46.5947,13.1761,2195 +OE/KT-070,Wertatscha,,46.4397,14.2125,2180 +OE/KT-071,Stileck,,46.8747,13.6392,2179 +OE/KT-072,Villacher Alpe (Dobratsch),,46.6036,13.6703,2166 +OE/KT-073,Saebelspitz,,46.6406,12.8389,2159 +OE/KT-074,Mittagskogel,,46.5067,13.9519,2145 +OE/KT-075,Woellaner Nock,,46.7764,13.8281,2145 +OE/KT-076,Goldeck,,46.7586,13.4589,2142 +OE/KT-077,Grosser Speikko­gel,,46.7867,14.9717,2140 +OE/KT-078,Hochobir,,46.5058,14.4869,2139 +OE/KT-079,Koschutnikturm,,46.4461,14.4100,2136 +OE/KT-080,Spitzegel,,46.6550,13.4100,2119 +OE/KT-081,Feistritzer Spitze (Hochpetzen),,46.5111,14.7500,2113 +OE/KT-082,Mirnock,,46.7589,13.7147,2110 +OE/KT-083,Hochpalfennock,,46.8511,13.5833,2099 +OE/KT-084,Millstaetter Alpe,,46.8389,13.6231,2091 +OE/KT-085,Schatzbichl,,46.7242,12.9114,2090 +OE/KT-086,Ladinger Spitz,,46.8533,14.6508,2079 +OE/KT-087,Kreuzbuehel,,46.7517,13.3969,2060 +OE/KT-088,Oisternig,,46.5658,13.4994,2052 +OE/KT-089,Kienberg,,46.8847,14.6461,2050 +OE/KT-090,Hirschstein,,46.9983,14.0856,2047 +OE/KT-091,Graslitzen,,46.6542,13.4683,2044 +OE/KT-092,Ackerlhoehe,,47.0456,14.1256,2040 +OE/KT-093,Kosiak (Geissberg),,46.4531,14.1817,2024 +OE/KT-094,Golz,,46.6714,13.3653,2004 +OE/KT-095,Poludnig,,46.5719,13.4094,1999 +OE/KT-096,Wiesernock,,46.8367,13.7414,1974 +OE/KT-097,Loibler Baba,,46.4386,14.2992,1969 +OE/KT-098,Peterer Riegel,,47.0381,14.8406,1967 +OE/KT-099,Starhand,,46.5664,13.4686,1965 +OE/KT-100,Waidegger Hoehe,,46.6089,13.1125,1961 +OE/KT-101,Hahnberg,,46.8042,14.1050,1956 +OE/KT-102,Kleinobir,,46.5169,14.4803,1948 +OE/KT-103,Baerentaler Kotschna,,46.4728,14.1228,1944 +OE/KT-104,Techantinger Mit­tagskogel,,46.5153,13.8603,1931 +OE/KT-105,Zollnerhoehe,,46.6247,13.0636,1931 +OE/KT-106,Freiberg (Setitsche),,46.4886,14.4092,1923 +OE/KT-107,Madritschen,,46.5603,13.2528,1919 +OE/KT-108,Gerlitzen,,46.6947,13.9139,1909 +OE/KT-109,Palnock,,46.7139,13.7383,1901 +OE/KT-110,Tschekelnock,,46.6517,13.5369,1892 +OE/KT-111,Jukbichl,,46.7086,13.0086,1889 +OE/KT-112,Kruckenspitze,,46.8372,13.9639,1886 +OE/KT-113,Zoehrerkogel,,46.9978,14.6153,1874 +OE/KT-114,Lichtberg,,46.9750,14.0883,1872 +OE/KT-115,Laka,,46.6864,13.4008,1852 +OE/KT-116,Ferlacher Horn (Gerloutz),,46.4867,14.3142,1840 +OE/KT-117,Kahlkogel,,46.4911,14.0544,1834 +OE/KT-118,Kabesnock,,46.6486,13.6008,1820 +OE/KT-119,Hohenwart,,46.9539,14.6853,1818 +OE/KT-120,Grossboden,,46.6806,13.3406,1806 +OE/KT-121,Kaerntner Stor­schitz,,46.4308,14.5253,1759 +OE/KT-122,Kleinalpl,,46.7417,14.9872,1759 +OE/KT-123,Kegel,,46.8625,13.9867,1745 +OE/KT-124,Baerofen,,46.8894,14.9928,1720 +OE/KT-125,Knittel,,46.8050,13.9800,1705 +OE/KT-126,Goeriacher Berg,,46.5458,13.5928,1693 +OE/KT-127,Moedringberg,,46.9325,14.1072,1693 +OE/KT-128,Matschacher Gupf,,46.4894,14.1375,1691 +OE/KT-129,Jauernik,,46.4933,14.3783,1657 +OE/KT-130,Hochwarter Hoehe,,46.6619,13.2172,1655 +OE/KT-131,Steinberg (Kamnik),,46.5175,13.7764,1655 +OE/KT-132,Topitza,,46.5161,14.6772,1649 +OE/KT-133,Roschachkogel,,46.8833,14.9667,1647 +OE/KT-134,Hochtraten,,46.7300,13.2967,1646 +OE/KT-135,Klippitztoerl,,46.9333,14.6667,1644 +OE/KT-136,Wiederschwinger Alm,,46.6878,13.5269,1640 +OE/KT-137,Matzen,,46.5089,14.3622,1627 +OE/KT-138,Minichoutz,,46.5208,14.5147,1624 +OE/KT-139,Sadonikhoehe,,46.4367,14.5953,1624 +OE/KT-140,Bergkogel,,46.9803,14.8728,1612 +OE/KT-141,Singerberg,,46.5003,14.2583,1589 +OE/KT-142,Oistra,,46.5097,14.6433,1577 +OE/KT-143,Sinacher Gupf,,46.4942,14.1917,1577 +OE/KT-144,Kalisnikturm,,46.4564,14.4542,1575 +OE/KT-145,Mosganberg,,46.4917,14.7111,1575 +OE/KT-146,Waldkogel,,46.9853,14.5100,1562 +OE/KT-147,Dreieckkogel,,46.7217,15.0414,1528 +OE/KT-148,Huehnerkogel,,46.6450,15.0297,1522 +OE/KT-149,Dreilaendereck,,46.5228,13.7139,1508 +OE/KT-150,Kuster,,46.9592,14.2375,1481 +OE/KT-151,Mittagsnock,,46.6908,13.2875,1473 +OE/KT-152,Am Hals,,46.7333,13.9167,1452 +OE/KT-153,Hachelnock,,46.6333,13.6667,1442 +OE/KT-154,Grafenwegerhoehe,,46.7119,13.2286,1441 +OE/KT-155,Ochsenstand,,46.5500,13.5500,1417 +OE/KT-156,Bischofeck,,46.9167,14.7333,1357 +OE/KT-157,Mesnerkogel,,46.7833,14.6833,1350 +OE/KT-158,Gasserriegel,,46.9314,14.4786,1347 +OE/KT-159,Hofkogel,,46.8333,14.7167,1347 +OE/KT-160,Raucheck,,46.8167,14.9167,1346 +OE/KT-161,Hocheck,,46.7711,14.1625,1338 +OE/KT-162,Schneebauerberg,,46.7967,14.2508,1338 +OE/KT-163,Paulsberg,,46.7667,14.1667,1333 +OE/KT-164,Spitzeck,,46.6333,13.7500,1332 +OE/KT-165,Wabenkopf,,46.5833,13.7500,1325 +OE/KT-166,Moritschkogel,,46.7667,14.6500,1321 +OE/KT-167,Ochsenkogel,,46.9750,14.9706,1314 +OE/KT-168,Durchspring,,46.6500,13.2500,1310 +OE/KT-169,Rudolfshoehe,,46.9375,14.5800,1279 +OE/KT-170,Wunderriegel,,46.7833,14.2167,1274 +OE/KT-171,Jegartkogel,,46.5228,14.6172,1263 +OE/KT-172,Moschitzberg,,46.9333,14.3500,1258 +OE/KT-173,Kapellenberg,,46.5000,14.0667,1226 +OE/KT-174,Zoderkogel,,46.8333,14.8833,1190 +OE/KT-175,Freithofer Berg,,46.8439,14.2431,1188 +OE/KT-176,Eckberg,,46.8333,13.4667,1176 +OE/KT-177,Zammelsberg,,46.8319,14.1633,1171 +OE/KT-178,Veitsberg,,46.7333,14.2000,1160 +OE/KT-179,Kolbenberg,,46.8167,14.3333,1145 +OE/KT-180,Gauerstall,,46.7769,14.3067,1129 +OE/KT-181,Rastenkogel,,46.7500,12.9000,1115 +OE/KT-182,Windische Hoehe,,46.6333,13.5333,1110 +OE/KT-183,Hinterwachsen­berg,,46.7700,14.1086,1091 +OE/KT-184,Lippekogel,,46.7319,14.4986,1079 +OE/KT-185,Steinbruchkogel,,46.7194,14.4639,1078 +OE/KT-186,Taubenbuehel,,46.6608,14.0544,1069 +OE/KT-187,Burgstall,,46.8500,12.8833,1065 +OE/KT-188,Magdalensberg,,46.7167,14.4167,1059 +OE/KT-189,Rabenkogel,,46.6500,14.0167,1059 +OE/KT-190,Hoher Gallin,,46.6661,14.0953,1046 +OE/KT-191,Ulrichsberg,,46.7019,14.2961,1022 +OE/KT-192,Birbuehel,,46.8333,14.3167,1016 +OE/KT-193,Rigi,,46.9167,14.4000,993 +OE/KT-194,Kleingradenegger Hoehe,,46.7500,14.1500,990 +OE/KT-195,Lantschnig,,46.7500,14.1167,990 +OE/KT-196,Petritschkogel,,46.7167,14.5500,984 +OE/KT-197,Lerchbaumerko­gel,,46.9500,14.4167,982 +OE/KT-198,Koeblkogel,,46.7500,14.9333,978 +OE/KT-199,Zechnerkogel,,46.7167,14.4000,977 +OE/KT-200,Holzerriegel,,46.8667,14.2333,967 +OE/KT-201,Danielsberg,,46.8833,13.2833,966 +OE/KT-202,Stroppitzberg,,46.5167,14.7833,962 +OE/KT-203,Christofberg,,46.7000,14.4500,957 +OE/KT-204,Hermannsberg,,46.9500,14.7833,938 +OE/KT-205,Illitschhoehe,,46.5333,13.8667,936 +OE/KT-206,Dobeiner Wand,,46.5647,14.1542,924 +OE/KT-207,Hennereck,,46.8733,14.8500,923 +OE/KT-208,Sabalahoehe,,46.5667,14.1667,921 +OE/KT-209,Kortnikkogel,,46.6167,14.8333,914 +OE/KT-210,Propstenhoehe,,46.8333,14.3500,909 +OE/KT-211,Pyramidenkogel,,46.6089,14.1453,850 +OE/KT-212,Kasparstein,,46.6769,14.8692,841 +OE/KT-213,Martinikogel,,46.6667,14.8500,841 +OE/KT-214,Schrottkogel,,46.6011,14.2406,759 +OE/KT-215,Maria Saaler Berg,,46.6675,14.3447,746 +OE/KT-216,Wauberg,,46.5833,13.9333,689 +OE/KT-217,Seeblick,,46.6333,14.1000,680 +OE/KT-218,Falkenberg,,46.6333,14.2500,671 +OE/KT-219,Georgiberg,,46.6000,14.6000,624 +OE/KT-220,Aussicht Petelinz,,46.5333,14.3167,609 +OE/KT-221,Sliemnach,,46.5500,14.6833,599 +OE/KT-222,Galgenkogel,,46.7833,14.3667,598 +OE/KT-223,Turnberg,,46.5500,13.7500,597 +OE/KT-224,Kumitschkogel,,46.8000,14.4000,596 +OE/KT-225,Kreuzbergl,,46.6167,14.2667,588 +OE/KT-226,Kleiner Sternberg,,46.6167,14.0000,587 +OE/KT-227,Steinerkogel,,46.6833,14.3167,585 +OE/KT-228,Kinzelkogel,,46.6667,14.8167,584 +OE/KT-229,Dert,,46.5667,13.6167,576 +OE/KT-230,Rainkogel,,46.7000,14.9000,572 +OE/KT-231,Mooskogel,,46.7000,14.5333,568 +OE/KT-232,Lippekogel,,46.6333,14.7500,567 +OE/KT-233,Ferrakogel,,46.5500,14.7500,566 +OE/KT-234,Kapitelkogel,,46.6333,14.6833,563 +OE/KT-235,Pesjak,,46.6333,14.7000,561 +OE/KT-236,Kogel,,46.7000,14.3667,560 +OE/KT-237,Wintschkogel,,46.6667,14.6333,560 +OE/KT-238,Gaertnerkogel,,46.7167,14.8833,551 +OE/KT-239,Schounza,,46.5500,14.7000,550 +OE/KT-240,Glockerkogel,,46.6500,14.6500,546 +OE/KT-241,Gemeinkogel,,46.6667,14.3500,542 +OE/KT-242,Schusterkogel,,46.6167,14.5167,536 +OE/KT-243,Zillhoehe,,46.6167,14.2333,536 +OE/KT-244,Lubitschkogel,,46.6833,14.9167,534 +OE/KT-245,Seerain,,46.5667,14.6000,532 +OE/KT-246,Tainacher Berg,,46.6333,14.5333,525 +OE/KT-247,Pichlingkogel,,46.7167,14.8833,522 +OE/KT-248,Husarenkogel,,46.7667,14.8667,516 +OE/KT-249,Spitalsberg,,46.6333,14.3000,498 +OE/KT-250,Rabenstein,,46.6000,14.9833,490 +OE/KT-251,Eselsberg,,46.6500,14.3833,489 +OE/KT-252,Pleschauka,,46.6500,14.4333,484 +OE/KT-253,Strassenkogel,,46.6333,14.5000,470 +OE/KT-254,Breitriegel,,46.7839,14.6322,1553 +OE/NO-001,Klosterwappen,,47.7672,15.8050,2076 +OE/NO-002,Scheibwaldhoehe,,47.7147,15.7217,1943 +OE/NO-003,Oetscher,,47.8619,15.2025,1893 +OE/NO-004,Duerrenstein,,47.7856,15.0594,1878 +OE/NO-005,Amaissbichl,,47.7153,15.6358,1828 +OE/NO-006,Hochkar,,47.7106,14.9100,1808 +OE/NO-007,Hochkogel,,47.7292,14.7772,1774 +OE/NO-008,Goeller,,47.7933,15.4919,1766 +OE/NO-009,Weisskogel,,47.7067,15.7456,1765 +OE/NO-010,Schmalzmauer,,47.7194,14.9278,1760 +OE/NO-011,Hochwechsel,,47.5303,15.9136,1743 +OE/NO-012,Tanzboden,,47.7464,14.7361,1727 +OE/NO-013,Gippel,,47.7983,15.5806,1669 +OE/NO-014,Niederwechsel,,47.5181,15.9511,1669 +OE/NO-015,Ringkogel,,47.7433,14.9731,1668 +OE/NO-016,Grosser Sonnleit­stein,,47.7519,15.6389,1639 +OE/NO-017,Grosser Zeller Hut,,47.7533,15.2000,1639 +OE/NO-018,Gemeindealpe,,47.8128,15.2497,1626 +OE/NO-019,Scheiblingstein,,47.8394,15.0992,1622 +OE/NO-020,Schwarzauer Gip­pel,,47.8025,15.6122,1605 +OE/NO-021,Krummbachstein,,47.7417,15.8328,1602 +OE/NO-022,Arabichl,,47.5642,15.9139,1595 +OE/NO-023,Lahnberg,,47.7783,15.6200,1594 +OE/NO-024,Tratenkogel,,47.6456,15.7261,1565 +OE/NO-025,Kleiner Oetscher,,47.8503,15.1578,1552 +OE/NO-026,Schnalzstein,,47.7892,15.5450,1546 +OE/NO-027,Sonnwendstein,,47.6294,15.8603,1523 +OE/NO-028,Erzkogel,,47.6222,15.8575,1504 +OE/NO-029,Alpl,,47.5861,15.9217,1499 +OE/NO-030,Hochkirch,,47.7525,15.0347,1468 +OE/NO-031,Kampstein,,47.5614,15.9875,1467 +OE/NO-032,Obersberg (Ahornberg),,47.8147,15.6656,1467 +OE/NO-033,Schwarzkogel,,47.7958,14.8678,1452 +OE/NO-034,Preineckkogel,,47.8142,15.6247,1449 +OE/NO-035,Mitterberg,,47.7811,15.6544,1429 +OE/NO-036,Alpkogel,,47.6136,15.8625,1414 +OE/NO-037,Grosser Sulzberg,,47.8389,15.3839,1400 +OE/NO-038,Reisalpe,,47.9564,15.6636,1399 +OE/NO-039,Studierkogel,,47.7489,15.7044,1395 +OE/NO-040,Feichtaberg,,47.7172,15.8286,1381 +OE/NO-041,Tirolerkogel,,47.8736,15.4208,1377 +OE/NO-042,Poirhoehe,,47.5975,15.8492,1374 +OE/NO-043,Schneekogel,,47.8386,14.8228,1373 +OE/NO-044,Tuernitzer Hoeger,,47.9197,15.5561,1372 +OE/NO-045,Handlesberg,,47.8256,15.7397,1370 +OE/NO-046,Grosser Otter,,47.6300,15.9150,1358 +OE/NO-047,Hirschenkogel,,47.6219,15.8336,1340 +OE/NO-048,Hennesteck,,47.8925,15.3597,1334 +OE/NO-049,Mitterschwarzriegel,,47.7644,15.6442,1332 +OE/NO-050,Hinteralm,,47.9719,15.6106,1311 +OE/NO-051,Kaltenberg,,47.6575,15.7642,1302 +OE/NO-052,Rainstock,,47.9019,15.1450,1296 +OE/NO-053,Pinkenkogel,,47.6367,15.8136,1292 +OE/NO-054,Kogel,,47.5253,16.0169,1289 +OE/NO-055,Hubmerkogel,,47.7744,15.6814,1282 +OE/NO-056,Hainboden,,47.7578,15.7267,1268 +OE/NO-057,Jochart,,47.9122,15.7119,1266 +OE/NO-058,Paulmauer,,47.8817,15.5678,1248 +OE/NO-059,Alpl,,47.8431,15.3258,1239 +OE/NO-060,Linsberg,,47.8919,15.5683,1238 +OE/NO-061,Zwieselmauer,,47.7756,15.6719,1236 +OE/NO-062,Schober,,47.8178,15.8572,1231 +OE/NO-063,Katharinenschlag,,47.8331,15.9217,1222 +OE/NO-064,Hohenstein,,47.9844,15.4986,1195 +OE/NO-065,Grosser Fegenberg,,47.7806,15.7200,1186 +OE/NO-066,Eisenstein,,47.9597,15.4397,1185 +OE/NO-067,Oehler,,47.8219,15.8781,1183 +OE/NO-068,Egger Berg,,47.9069,14.9842,1134 +OE/NO-069,Plackles,,47.8144,16.0025,1132 +OE/NO-070,Sonnstein,,47.9242,15.7417,1124 +OE/NO-071,Kieneck,,47.9608,15.8739,1107 +OE/NO-072,Sengenebenberg,,48.0039,15.6933,1104 +OE/NO-073,Haselstein,,47.8492,15.6269,1092 +OE/NO-074,Kreuzberg,,47.6683,15.8183,1084 +OE/NO-075,Geissruck,,47.9531,15.9053,1074 +OE/NO-076,Schwarzwaldeck,,47.9964,15.7178,1073 +OE/NO-077,Schafkogel,,47.8928,15.4383,1069 +OE/NO-078,Kirchwaldberg,,47.9472,15.8564,1067 +OE/NO-079,Reingupf,,47.9717,15.8667,1065 +OE/NO-080,Grosser Peilstein,,48.3025,15.1017,1061 +OE/NO-081,Eichelberg,,48.5922,14.7397,1054 +OE/NO-082,Grosser Neukogel,,47.8547,15.9114,1053 +OE/NO-083,Grosse Kanzel,,47.8111,16.0131,1052 +OE/NO-084,Weinsberg,,48.3828,15.0331,1041 +OE/NO-085,Hocheck,,47.9964,15.9519,1037 +OE/NO-086,Hochsteinkogel,,47.8222,15.5675,1037 +OE/NO-087,Sulzberg,,47.8492,15.6717,1021 +OE/NO-088,Hochweid,,48.3183,15.0183,1017 +OE/NO-089,Falkenstein,,47.8228,15.7017,1013 +OE/NO-090,Baerenstein,,48.6539,14.7464,1003 +OE/NO-091,Eibl,,47.9158,15.4528,1002 +OE/NO-092,Grosser Hoellberg,,48.3928,15.0939,1001 +OE/NO-093,Eselberg,,47.6314,15.9961,974 +OE/NO-094,Hohe Mandling,,47.8953,16.0092,967 +OE/NO-095,Abspannberg,,48.5486,14.8511,962 +OE/NO-096,Jauerling,,48.3394,15.3383,960 +OE/NO-097,Ursprungkogel,,47.8142,15.5953,959 +OE/NO-098,Schnabelstein,,47.9839,15.3872,955 +OE/NO-099,Runzelberg,,47.9672,15.0903,953 +OE/NO-100,Himberg,,47.7872,15.9233,948 +OE/NO-101,Pelletriedel,,48.2856,15.0061,945 +OE/NO-102,Stueckelberg,,48.4550,15.0958,931 +OE/NO-103,Kobermannsberg,,47.6683,15.8669,925 +OE/NO-104,Vordere Mandling,,47.8864,16.0467,925 +OE/NO-105,Hollabrunner Rie­gel,,47.6211,16.0694,922 +OE/NO-106,Kirchberg,,48.0194,15.7539,922 +OE/NO-107,Ginselhoehe,,47.9886,15.1211,905 +OE/NO-108,Heimhoeh,,47.8217,15.5892,905 +OE/NO-109,Goesing,,47.7383,15.9889,898 +OE/NO-110,Hutwisch,,47.4631,16.2219,896 +OE/NO-111,Schoepfl,,48.0881,15.9147,893 +OE/NO-112,Gruentalkogel,,48.0203,15.3275,886 +OE/NO-113,Gfoehlberg,,48.0733,15.8269,885 +OE/NO-114,Lorenzipechkogel,,48.0236,15.5583,883 +OE/NO-115,Hochriegel,,47.9931,15.9189,882 +OE/NO-116,Stickelberg,,47.6042,16.2333,881 +OE/NO-117,Ebenhofer Hoehe,,47.5769,16.1825,862 +OE/NO-118,Bichlberg,,48.0225,15.3544,859 +OE/NO-119,Guttenberg,,48.4981,15.1306,855 +OE/NO-120,Schneekogel,,47.9686,15.1406,853 +OE/NO-121,Geissbuehel,,48.0419,15.4753,849 +OE/NO-122,Blassenstein,,48.0086,15.2017,844 +OE/NO-123,Hoher Lindkogel,,48.0072,16.1353,834 +OE/NO-124,Kagerriegel,,47.4564,16.1669,827 +OE/NO-125,Grestner Hochko­gel,,47.9900,14.9783,821 +OE/NO-126,Lampelsberg,,48.0053,15.1308,819 +OE/NO-127,Kulmariegel,,47.5489,16.1236,818 +OE/NO-128,Schusserberg,,47.9894,14.5786,799 +OE/NO-129,Staff,,48.0297,15.6569,786 +OE/NO-130,Grosser Kitzberg,,47.8844,15.9786,771 +OE/NO-131,Kulmriegel,,47.6314,16.1175,758 +OE/NO-132,Plattenberg,,48.0147,14.5492,750 +OE/NO-133,Spitzbrandkogel,,48.0053,15.5942,729 +OE/NO-134,Muehlberg,,48.3492,15.4425,725 +OE/NO-135,Predigtstuhl,,48.8147,15.3717,718 +OE/NO-136,Kaiserkogel,,48.0600,15.5400,716 +OE/NO-137,Peilstein,,48.0147,16.0519,716 +OE/NO-138,Silbersberg,,47.6814,15.9353,716 +OE/NO-139,Soosser Lindkogel,,47.9914,16.1619,713 +OE/NO-140,Kohlberg,,47.7075,15.9775,708 +OE/NO-141,Seisbuehel,,47.5189,16.1772,687 +OE/NO-142,Glanzenriegel,,47.5128,16.2186,686 +OE/NO-143,Hoher Stein,,48.9897,15.2875,679 +OE/NO-144,Seekopf,,48.3753,15.4722,671 +OE/NO-145,Niklasberg,,47.4792,16.2889,657 +OE/NO-146,Hegerberg,,48.1317,15.7783,655 +OE/NO-147,Eschenkogel,,48.0556,16.2417,653 +OE/NO-148,Kienberg,,47.8042,16.0575,650 +OE/NO-149,Hoellensteinberg,,48.0961,16.1878,645 +OE/NO-150,Jochgrabenberg,,48.1531,16.0164,645 +OE/NO-151,Heidenberg,,47.6833,16.2303,644 +OE/NO-152,Kohlerhoehe,,48.4706,15.4875,641 +OE/NO-153,Dunkelstein,,48.2503,15.4867,625 +OE/NO-154,Plambachecker Hoehe,,48.0794,15.5458,623 +OE/NO-155,Marriegel,,47.6686,16.3525,622 +OE/NO-156,Hengstlberg,,48.1347,16.0619,619 +OE/NO-157,Hasenriegel,,48.1211,15.9519,618 +OE/NO-158,Gfieder,,47.7153,16.0094,609 +OE/NO-159,Pfingstbuehel,,48.8672,15.3475,607 +OE/NO-160,Groessenberg,,47.8344,16.1206,605 +OE/NO-161,Ammering,,48.3247,15.5358,598 +OE/NO-162,Gespitzter Riegel,,47.7583,16.2967,594 +OE/NO-163,Rudolfshoehe,,48.1089,15.6442,594 +OE/NO-164,Simmetsberg,,48.0756,15.4367,592 +OE/NO-165,Hiesberg,,48.4500,15.5233,582 +OE/NO-166,Wetzlesberg,,48.9156,15.4264,581 +OE/NO-167,Kuehberg,,47.9775,16.0475,578 +OE/NO-168,Kaiserbrunnberg,,48.1592,16.0339,576 +OE/NO-169,Weissjackl,,47.6994,16.1781,576 +OE/NO-170,Silberne Birn,,48.2964,15.5242,569 +OE/NO-171,Troppberg,,48.2236,16.1100,542 +OE/NO-172,Pfaffstaettner Ko­gel,,48.0292,16.2386,541 +OE/NO-173,Manhartsberg,,48.5436,15.7489,537 +OE/NO-174,Brandstetterkogel,,48.2186,14.8789,532 +OE/NO-175,Parapluieberg,,48.1164,16.2281,532 +OE/NO-176,Oberer Saubichl,,48.1939,16.0597,504 +OE/NO-177,Waxenberg,,48.3589,15.6022,499 +OE/NO-178,Tulbinger Kogel,,48.2817,16.1489,494 +OE/NO-179,Kohlberg,,48.7461,15.8472,490 +OE/NO-180,Hundsheimer Berg,,48.1319,16.9392,480 +OE/NO-181,Rudolfshoehe,,48.1956,16.1878,475 +OE/NO-182,Buchberg,,48.2136,15.9444,469 +OE/NO-183,Galgenberg,,48.7086,16.5858,425 +OE/NO-184,Schwalbenfelsen,,48.8650,15.8408,424 +OE/NO-185,Buchberg,,48.6714,16.1550,417 +OE/NO-186,Haberg,,48.4842,16.0650,414 +OE/NO-187,Michelberg,,48.4297,16.2889,409 +OE/NO-188,Wolfpassinger Berg,,48.3011,16.1878,404 +OE/NO-189,Hohe Warte,,48.2394,16.0422,400 +OE/NO-190,Frauenberg,,48.2172,16.0103,382 +OE/NO-191,Schiffberg,,48.3717,15.6883,367 +OE/NO-192,Glockenberg,,48.4289,16.4472,365 +OE/NO-193,Buchberg,,48.2994,16.3075,362 +OE/NO-194,Bisamberg,,48.3208,16.3617,360 +OE/NO-195,Scheiterberg,,47.9656,16.6167,350 +OE/NO-196,Seelackenberg,,48.3283,15.7708,348 +OE/NO-197,Braunsberg,,48.1531,16.9575,346 +OE/NO-198,Auberg,,48.2656,16.0444,318 +OE/NO-199,Unterberg,,47.9381,15.8189,1342 +OE/NO-200,Tischberg,,48.6078,14.7317,1063 +OE/NO-201,Nebelstein,,48.6736,14.7789,1017 +OE/NO-202,Sandl,,48.4275,15.4867,723 +OE/NO-203,Sonntagberg,,47.9961,14.7631,712 +OE/NO-204,Anninger,,48.0472,16.2442,675 +OE/NO-205,Kolmberg,,48.4619,15.4839,665 +OE/NO-206,Feuersteinberg,,48.1842,16.1575,507 +OE/NO-207,Buschberg,,48.5769,16.3956,491 +OE/NO-208,Sonnberg,,48.3233,16.2519,420 +OE/OO-001,Hoher Dachstein,,47.4750,13.6056,2995 +OE/OO-002,Hoher Gjaidstein,,47.4817,13.6322,2794 +OE/OO-003,Hunerkogel,,47.4675,13.6261,2687 +OE/OO-004,Grosser Priel,,47.7167,14.0631,2515 +OE/OO-005,Spitzmauer,,47.6953,14.0619,2446 +OE/OO-006,Warscheneck,,47.6525,14.2408,2388 +OE/OO-007,Kreuzspitze,,47.6378,14.1775,2327 +OE/OO-008,Taubenkogel,,47.5039,13.6472,2300 +OE/OO-009,Schrocken,,47.6442,14.1861,2281 +OE/OO-010,Weitgrubenkopf,,47.6972,14.0539,2259 +OE/OO-011,Grosser Pyhrgas,,47.6525,14.3972,2244 +OE/OO-012,Hoher Krippenstein,,47.5242,13.6919,2108 +OE/OO-013,Schoenberg (Wildenkogel),,47.7125,13.7906,2090 +OE/OO-014,Grosser Donnerkogel,,47.5242,13.4814,2054 +OE/OO-015,Kleiner Pyhrgas,,47.6628,14.4089,2023 +OE/OO-016,Rinnerkogel (Augstkogel),,47.7194,13.8400,2012 +OE/OO-017,Steinriesenkogel,,47.5211,13.4831,2008 +OE/OO-018,Daeumelkogel,,47.5239,13.7094,2001 +OE/OO-019,Hoher Sarstein,,47.6019,13.6983,1975 +OE/OO-020,Plassen,,47.5700,13.6058,1953 +OE/OO-021,Rote Wand,,47.6581,14.2728,1872 +OE/OO-022,Grosser Hoellkogel,,47.7975,13.6781,1862 +OE/OO-023,Wilder Jaeger,,47.6311,13.5003,1842 +OE/OO-024,Hohe Schrott,,47.7275,13.7114,1839 +OE/OO-025,Hoch Kalmberg,,47.6122,13.5672,1833 +OE/OO-026,Niederer Kalmberg,,47.6081,13.5789,1827 +OE/OO-027,Mittagkogel,,47.7339,13.7200,1790 +OE/OO-028,Stubwieswipfel,,47.6547,14.2994,1786 +OE/OO-029,Hochglegt,,47.7258,13.7022,1784 +OE/OO-030,Bergwerkskogel,,47.6761,13.5089,1781 +OE/OO-031,Kasberg,,47.8014,13.9978,1747 +OE/OO-032,Leonsberg (Zimnitz),,47.7544,13.5689,1745 +OE/OO-033,Brunnkogel,,47.8275,13.6300,1708 +OE/OO-034,Alberfeldkogel,,47.8169,13.7053,1707 +OE/OO-035,Wurzerkampl,,47.6425,14.2867,1706 +OE/OO-036,Mitterzinken,,47.7514,13.5650,1702 +OE/OO-037,Hochleckenkogel,,47.8269,13.6208,1691 +OE/OO-038,Traunstein,,47.8731,13.8397,1691 +OE/OO-039,Bergwerkkogel,,47.7389,13.7281,1689 +OE/OO-040,Heumahdgupf,,47.8147,13.7122,1680 +OE/OO-041,Hohe Scheibe,,47.5628,13.5842,1659 +OE/OO-042,Rosskopf,,47.6822,13.5547,1657 +OE/OO-043,Rossschopf,,47.7942,14.0064,1647 +OE/OO-044,Petergupf,,47.7461,13.7358,1646 +OE/OO-045,Brenntenkogel,,47.6081,13.5883,1640 +OE/OO-046,Hainzen,,47.6867,13.5667,1638 +OE/OO-047,Helmeskogel,,47.8031,13.7158,1633 +OE/OO-048,Gamskogel,,47.7142,13.7467,1628 +OE/OO-049,Spitzplaneck,,47.8042,13.9769,1617 +OE/OO-050,Kremsmauer,,47.8442,14.1006,1604 +OE/OO-051,Brennerin,,47.8167,13.5783,1602 +OE/OO-052,Elferkogel,,47.6872,13.5767,1601 +OE/OO-053,Eibenberg,,47.7878,13.8244,1598 +OE/OO-054,Feuerkogel,,47.8161,13.7225,1592 +OE/OO-055,Hochkogel,,47.7286,13.7908,1591 +OE/OO-056,Erlakogel,,47.8192,13.8253,1575 +OE/OO-057,Gartenzinken,,47.7406,13.5600,1557 +OE/OO-058,Katrin,,47.6897,13.5794,1542 +OE/OO-059,Schwarzeck,,47.6456,14.2978,1537 +OE/OO-060,Feuerkogel,,47.6861,13.5878,1460 +OE/OO-061,Pfannstein,,47.8600,14.0789,1423 +OE/OO-062,Steineck,,47.8753,13.8792,1418 +OE/OO-063,Hochsalm,,47.8792,13.9919,1405 +OE/OO-064,Zwillingskogel,,47.8603,13.9114,1402 +OE/OO-065,Rauer Kaibling,,47.8567,14.0853,1381 +OE/OO-066,Ploeckenstein,,48.7711,13.8572,1379 +OE/OO-067,Gspranggupf,,47.7444,13.6003,1368 +OE/OO-068,Katzenstein,,47.8744,13.8592,1349 +OE/OO-069,Hochficht,,48.7364,13.9211,1338 +OE/OO-070,Windhagkogel,,47.8733,13.9739,1334 +OE/OO-071,Baerenpfadkogel,,47.6494,13.4917,1333 +OE/OO-072,Herrentisch,,47.8644,14.0842,1333 +OE/OO-073,Schoberstein,,47.9056,14.3253,1285 +OE/OO-074,Predigstuhl,,47.6597,13.6389,1278 +OE/OO-075,Hochbuchberg,,47.9169,14.2950,1273 +OE/OO-076,Mahdlgupf,,47.8042,13.5550,1261 +OE/OO-077,Raukogel (Mittagstein),,47.8733,14.0239,1260 +OE/OO-078,Walkerskogel,,47.7367,13.5658,1243 +OE/OO-079,Hoheneck,,47.7617,13.5056,1165 +OE/OO-080,Sternstein,,48.5597,14.2672,1122 +OE/OO-081,Kolomansberg,,47.8767,13.2756,1114 +OE/OO-082,Lindaumauer,,47.9125,14.6567,1103 +OE/OO-083,Hirschwaldstein,,47.8878,14.1681,1095 +OE/OO-084,Pernecker Kogel,,47.9153,14.0442,1080 +OE/OO-085,Baerenstein,,48.6831,13.9842,1077 +OE/OO-086,Brockenberg,,48.5250,14.8011,1053 +OE/OO-087,Grosser Sonnstein,,47.8239,13.7742,1037 +OE/OO-088,Schoberstein,,47.7997,13.5506,1037 +OE/OO-089,Mondseeberg,,47.8647,13.3708,1029 +OE/OO-090,Gruenangerl,,47.8072,13.8906,1025 +OE/OO-091,Rossmoos,,47.8728,13.4789,1015 +OE/OO-092,Gruenberg,,47.8986,13.8183,984 +OE/OO-093,Freithofberg,,47.9392,14.6539,958 +OE/OO-094,Kollmannsberg,,47.8628,13.7181,957 +OE/OO-095,Maisenkoegerl,,47.8956,13.9769,945 +OE/OO-096,Hongar,,47.9219,13.6967,943 +OE/OO-097,Ameisberg,,48.5550,13.8322,941 +OE/OO-098,Lichtenberg,,48.3856,14.2536,927 +OE/OO-099,Helmetzedter Berg,,48.4531,14.4022,924 +OE/OO-100,Kleiner Sonnstein,,47.8289,13.7853,923 +OE/OO-101,Hohe Luft,,47.9275,13.7100,917 +OE/OO-102,Haugstein,,48.5083,13.6703,895 +OE/OO-103,Diesenberg,,48.4481,14.8594,893 +OE/OO-104,Predigtberg,,48.4408,14.6814,892 +OE/OO-105,Lichtenberg,,47.9342,13.4278,885 +OE/OO-106,Gmundnerberg,,47.9058,13.7353,884 +OE/OO-107,Reither Gupf,,47.8706,13.5089,881 +OE/OO-108,Gahberg,,47.9150,13.5922,864 +OE/OO-109,Hamberg,,47.9044,13.9847,854 +OE/OO-110,Hansberg,,48.4739,14.1458,848 +OE/OO-111,Hirtstein,,48.5153,14.3761,844 +OE/OO-112,Schimplgupf,,47.9344,13.6981,838 +OE/OO-113,Wachtberg,,47.8847,13.5786,823 +OE/OO-114,Kronberg,,47.9333,13.7344,815 +OE/OO-115,Buchberg,,48.4597,14.5586,813 +OE/OO-116,Herzogreither Berg,,48.4408,14.6533,811 +OE/OO-117,Buchberg,,47.9275,13.5294,808 +OE/OO-118,Damberg,,48.0033,14.4597,807 +OE/OO-119,Goeblberg,,48.0931,13.5261,801 +OE/OO-120,Kronberg,,47.8936,13.4897,789 +OE/OO-121,Roadlberg,,48.4297,14.3983,778 +OE/OO-122,Sonnberg,,47.9658,14.4564,777 +OE/OO-123,Hoher Stein,,48.5817,13.8603,772 +OE/OO-124,Ellerberg,,48.3661,14.7078,732 +OE/OO-125,Trattberg,,47.9325,13.6411,702 +OE/OO-126,Hollerberg,,48.5339,14.0625,675 +OE/OO-127,Voecklaberg,,47.9422,13.7422,660 +OE/OO-128,Wetzlstein,,48.2678,14.8650,641 +OE/OO-129,Pfenningberg,,48.3094,14.3578,616 +OE/OO-130,Siriuskogel,,47.7047,13.6178,599 +OE/OO-131,Georgenberg,,47.8733,14.1383,595 +OE/OO-132,Penzenstein,,48.5056,13.7428,568 +OE/OO-133,Poestlingberg,,48.3236,14.2583,539 +OE/OO-134,Hohenstein,,48.2972,14.4147,526 +OE/OO-135,Kuernberg (Kuernbergburg),,48.2944,14.2214,526 +OE/OO-136,Moosberg,,48.0869,13.7436,507 +OE/OO-137,Feichtenberg,,48.3389,13.7906,504 +OE/OO-138,Hochkogel,,47.9186,13.7925,500 +OE/OO-139,Gobel (Gobelwarte),,48.2175,14.8400,484 +OE/OO-140,Weltstein,,48.2967,14.6092,478 +OE/OO-141,Gaisberg,,48.4536,13.4756,466 +OE/OO-142,Gusterberg,,48.0375,14.1364,488 +OE/OO-143,Buchberg,,48.3108,13.3806,421 +OE/OO-144,Linzerberg,,48.3458,14.4025,402 +OE/OO-145,Wohlfahrtsberg,,48.0142,14.4222,400 +OE/OO-146,Torstein,,47.4744,13.5853,2948 +OE/OO-147,Niederer Dachstein,,47.4781,13.6064,2934 +OE/OO-148,Mitterspitz,,47.4753,13.5958,2925 +OE/OO-149,Grosser Koppenkarstein,,47.4661,13.6400,2863 +OE/OO-150,Hohes Kreuz,,47.4883,13.6039,2837 +OE/OO-151,Dirndln,,47.4722,13.6169,2832 +OE/OO-152,Kleiner Gjaidstein,,47.4756,13.6286,2734 +OE/OO-153,Niederes Kreuz,,47.4944,13.6072,2651 +OE/OO-154,Landfriedstein,,47.4625,13.6672,2536 +OE/OO-155,Hoher Ochsenkogel,,47.5022,13.6017,2527 +OE/OO-156,Niederer Gjaidstein,,47.4872,13.6511,2482 +OE/OO-157,Eiskarlspitz,,47.4803,13.5725,2480 +OE/OO-158,Hochkesselkopf,,47.4825,13.5678,2454 +OE/OO-159,Schoeberl,,47.4981,13.6167,2426 +OE/OO-160,Mitterstein,,47.4792,13.6464,2417 +OE/OO-161,Grosswand,,47.5028,13.5136,2415 +OE/OO-162,Vorderer Gjaidstein,,47.4933,13.6503,2414 +OE/OO-163,Schermberg,,47.7153,14.0353,2396 +OE/OO-164,Liezener,,47.6506,14.2322,2367 +OE/OO-165,Hosskogel,,47.5078,13.5903,2366 +OE/OO-166,Mittlerer Ochsenkogel,,47.5111,13.6122,2365 +OE/OO-167,Brotfall,,47.7061,14.0594,2360 +OE/OO-168,Hoher Trog,,47.5069,13.6061,2359 +OE/OO-169,Temlberg,,47.7000,14.0364,2331 +OE/OO-170,Schreiberwandeck,,47.4981,13.5814,2330 +OE/OO-171,Daeumling,,47.5017,13.5181,2322 +OE/OO-172,Hebenkas,,47.6533,14.0650,2285 +OE/OO-173,Mandlkogel,,47.5103,13.5008,2279 +OE/OO-174,Rotgschirr,,47.6997,13.9953,2261 +OE/OO-175,Torsteineck,,47.4847,13.5775,2256 +OE/OO-176,Hohe Hosswand,,47.5119,13.5797,2247 +OE/OO-177,Hoher Gruenberg,,47.5147,13.6042,2243 +OE/OO-178,Pyhrner Kampl,,47.6489,14.1983,2241 +OE/OO-179,Torstein,,47.6503,14.2186,2236 +OE/OO-180,Niederer Ochsenkogel,,47.5144,13.6175,2220 +OE/OO-181,Rossarsch,,47.6419,14.2231,2205 +OE/OO-182,Steiglkogel,,47.4944,13.5289,2204 +OE/OO-183,Scheiblingstein,,47.6528,14.4233,2197 +OE/OO-184,Grosser Kraxenberg,,47.6369,14.0481,2195 +OE/OO-185,Zwillingkogel,,47.7317,14.0575,2184 +OE/OO-186,Kreuz,,47.7289,14.0578,2174 +OE/OO-187,Wildkarkogel,,47.5064,13.6236,2163 +OE/OO-188,Grosser Brieglersberg,,47.6261,14.0519,2148 +OE/OO-189,Kleine Priel,,47.7328,14.1289,2136 +OE/OO-190,Speikberg,,47.5197,13.7306,2125 +OE/OO-191,Mitterkogel,,47.4947,13.5342,2122 +OE/OO-192,Ramesch,,47.6522,14.2506,2119 +OE/OO-193,Almkogel,,47.6194,14.0931,2116 +OE/OO-194,Widerlechnerstein,,47.6483,14.2467,2107 +OE/OO-195,Angerstein,,47.5131,13.4900,2100 +OE/OO-196,Zwoelferkogel,,47.7094,13.9517,2099 +OE/OO-197,Kreuzmauer,,47.6561,14.4461,2091 +OE/OO-198,Niederer Speikberg,,47.5147,13.7317,2089 +OE/OO-199,Kleiner Brieglersberg,,47.6211,14.0514,2078 +OE/OO-200,Hirscheck,,47.6275,14.1225,2068 +OE/OO-201,Grosser Woising,,47.7158,13.9033,2064 +OE/OO-202,Strichkogel,,47.5197,13.4869,2034 +OE/OO-203,Lagelsberg,,47.6694,14.2331,2008 +OE/OO-204,Ochsenwieshoehe,,47.5136,13.6297,1990 +OE/OO-205,Schafkoegel,,47.6547,14.1772,1990 +OE/OO-206,Niederer Krippenstein,,47.5167,13.6831,1989 +OE/OO-207,Feigentalhimmel,,47.7225,13.8864,1984 +OE/OO-208,Zwoelferkogel,,47.5317,13.6450,1982 +OE/OO-209,Hoher Nock,,47.7825,14.3231,1963 +OE/OO-210,Eisernes Bergl,,47.6375,14.2400,1955 +OE/OO-211,Faeustling,,47.7347,13.9981,1919 +OE/OO-212,Kleiner Donnerkogel,,47.5272,13.4792,1916 +OE/OO-213,Gamsplan,,47.7744,14.3344,1902 +OE/OO-214,Lahnerkogel,,47.6189,14.3306,1854 +OE/OO-215,Hochsengs,,47.7942,14.2469,1838 +OE/OO-216,Vorderer Kesselgupf,,47.8094,13.6769,1822 +OE/OO-217,Gruenalmkogel,,47.8144,13.6397,1821 +OE/OO-218,Hochhirn,,47.8064,13.6667,1821 +OE/OO-219,Mittlerer Kesselgupf,,47.8064,13.6764,1818 +OE/OO-220,Eiblgupf,,47.8147,13.6756,1813 +OE/OO-221,Rohrauer Groesstenberg,,47.7878,14.2886,1810 +OE/OO-222,Kleiner Hoellkogel,,47.8014,13.6736,1788 +OE/OO-223,Stumpfmauer,,47.7539,14.7428,1770 +OE/OO-224,Schillereck,,47.8014,14.2250,1748 +OE/OO-225,Mayrwipfl,,47.7669,14.3733,1736 +OE/OO-226,Brandleck,,47.7706,14.3719,1725 +OE/OO-227,Grosser Groesstenberg,,47.7647,14.4250,1724 +OE/OO-228,Gamskogel,,47.7878,14.2617,1710 +OE/OO-229,Predigkogel,,47.7169,13.7436,1691 +OE/OO-230,Grosser Brettkogel,,47.6289,13.5053,1658 +OE/OO-231,Schwalbenmauer,,47.8019,14.0153,1657 +OE/OO-232,Bannkogel,,47.7425,13.7322,1656 +OE/OO-233,Steinkogel,,47.8106,13.7144,1644 +OE/OO-234,Sonnenwendkogel,,47.6228,13.5617,1638 +OE/OO-235,Plediridl,,47.8167,13.7175,1624 +OE/OO-236,Toerleck,,47.5317,13.4767,1618 +OE/OO-237,Spering,,47.8036,14.1942,1605 +OE/OO-238,Mannsberg,,47.6719,14.4256,1603 +OE/OO-239,Steyreck,,47.7633,14.3892,1592 +OE/OO-240,Karleck,,47.6311,14.3750,1582 +OE/OO-241,Traunkirchner Kogel,,47.8694,13.8278,1575 +OE/OO-242,Seespitz,,47.6778,14.3006,1574 +OE/OO-243,Schwarzkogel,,47.6964,14.4881,1554 +OE/OO-244,Schneidkogel,,47.5753,13.6364,1552 +OE/OO-245,Schafkogel,,47.6756,14.4514,1550 +OE/OO-246,Bodenwies,,47.7517,14.5664,1540 +OE/OO-247,Almkogel,,47.8256,14.5647,1513 +OE/OO-248,Wasserklotz,,47.7211,14.4811,1505 +OE/OO-249,Huehnerkogel,,47.8264,14.5831,1474 +OE/OO-250,Hoehbuehel,,47.5531,13.4842,1473 +OE/OO-251,Brunnbacheck,,47.8333,14.5644,1472 +OE/OO-252,Steinberg,,47.7856,13.8933,1457 +OE/OO-253,Vormauerstein,,47.7539,13.4617,1450 +OE/OO-254,Alpstein,,47.7942,14.4339,1443 +OE/OO-255,Hornspitz,,47.5681,13.4781,1433 +OE/OO-256,Burgspitz,,47.8422,14.5753,1429 +OE/OO-257,Wieser,,47.8175,14.5608,1427 +OE/OO-258,Traempl,,47.7922,14.4194,1424 +OE/OO-259,Astein,,47.7192,14.4692,1419 +OE/OO-260,Kuehberg,,47.7747,14.6189,1415 +OE/OO-261,Gschirreck,,47.7514,13.8669,1410 +OE/OO-262,Kampermauer,,47.6908,14.4892,1394 +OE/OO-263,Ennsberg,,47.8308,14.5981,1373 +OE/OO-264,–ttlberg,,47.7036,14.1206,1342 +OE/OO-265,Schober,,47.8128,13.3119,1328 +OE/OO-266,Schmeisserkogel,,47.7300,14.2394,1324 +OE/OO-267,Farrenaubuehel (Hochberg),,47.8319,13.9886,1287 +OE/OO-268,Kleinerberg,,47.7336,14.3664,1287 +OE/OO-269,Reischlberg,,48.7497,13.9044,1281 +OE/OO-270,Gamsstein,,47.8344,14.5403,1273 +OE/OO-271,Gaisberg,,47.9100,14.2797,1267 +OE/OO-272,Jagerspitz,,47.8306,14.0017,1266 +OE/OO-273,Stinglfelsen,,48.7344,13.9131,1260 +OE/OO-274,Koglerstein,,47.9061,14.3086,1257 +OE/OO-275,Fahrnaugupf,,47.8378,13.7503,1239 +OE/OO-276,Duerres Eck,,47.9108,14.2711,1222 +OE/OO-277,Schieferstein,,47.9117,14.4839,1206 +OE/OO-278,Schafferkogel,,47.6536,14.1242,1200 +OE/OO-279,Rapoldeck,,47.8308,14.6697,1195 +OE/OO-280,Sonnkogel,,47.8950,14.4017,1177 +OE/OO-281,Zwieselberg,,48.7364,13.8697,1163 +OE/OO-282,Schabenreitnerstein,,47.8747,14.0831,1143 +OE/OO-283,Hochplettspitz,,47.8219,13.4692,1134 +OE/OO-284,Hohe Dirn,,47.9111,14.3950,1134 +OE/OO-285,Scharnsteiner Spitze,,47.8836,13.9600,1133 +OE/OO-286,Koppenstein,,47.8214,13.4572,1123 +OE/OO-287,Viehberg,,48.5603,14.6233,1112 +OE/OO-288,Kolowratshoehe,,47.6872,13.6594,1109 +OE/OO-289,Lindauer Berg,,47.9169,14.6661,1084 +OE/OO-290,Hirschkogel,,47.8789,14.7686,1078 +OE/OO-291,Spindeleben,,47.9275,14.6953,1066 +OE/OO-292,Sulzberg,,48.7011,13.9675,1041 +OE/OO-293,Richtberg,,47.8906,13.6550,1036 +OE/OO-294,Almkogel,,47.8056,13.3653,1030 +OE/OO-295,Herndleck,,47.9275,14.3278,1026 +OE/OO-296,Hirschenstein,,48.5792,14.2144,1026 +OE/OO-297,Kruckenbrettl,,47.9372,14.2969,1020 +OE/OO-298,Spadenberg,,47.9553,14.5278,1000 +OE/OO-299,Kammererberg,,48.4914,14.7706,980 +OE/OO-300,Alpenberg,,47.9225,13.6642,973 +OE/OO-301,Glasenberg,,47.9450,14.5722,971 +OE/OO-302,Bramhosen,,47.8583,13.5872,960 +OE/OO-303,Breitenstein,,48.4150,14.2742,956 +OE/OO-304,Burgstallmauer,,48.3408,14.9283,949 +OE/OO-305,Braunberg (Braunberghuette),,48.4800,14.5881,912 +OE/OO-306,Radingberg,,47.7417,14.2914,901 +OE/OO-307,Schoenberg,,47.8519,13.8189,895 +OE/OO-308,Kienesberg,,47.8833,13.6200,894 +OE/OO-309,Geierkogel,,47.9503,14.5617,886 +OE/OO-310,Koglerberg,,48.3639,14.8292,882 +OE/OO-311,Kranzberg,,48.3544,14.8908,874 +OE/OO-312,Geisswand,,47.8408,13.7772,872 +OE/OO-313,Poppenberg,,47.7100,14.1706,860 +OE/OO-314,Wurbauerkogel,,47.7256,14.3397,858 +OE/OO-315,Herrgottsitz,,48.4019,14.7114,855 +OE/OO-316,Grillenparz,,47.9203,14.1331,842 +OE/OO-317,Haingrabeneck,,47.8939,14.5683,841 +OE/OO-318,Schwarzberg,,47.9794,14.4722,838 +OE/OO-319,Rotstein,,47.8656,14.5567,837 +OE/OO-320,Jainzenberg,,47.7208,13.6244,834 +OE/OO-321,Wegererstein,,48.4278,14.7875,834 +OE/OO-322,Brandkogel,,47.9378,14.3336,825 +OE/OO-323,Steiglberg,,48.0997,13.3581,767 +OE/OO-324,Hofberg,,48.0906,13.5058,758 +OE/OO-325,Kaiblinger Kogel,,47.9567,14.3056,752 +OE/OO-326,Heidenstein,,48.5600,14.4100,738 +OE/OO-327,Haefelberg,,47.9283,13.5967,715 +OE/OO-328,Falkenmauer,,48.2906,14.9825,700 +OE/OO-329,Feichtenberg,,47.9522,13.9392,664 +OE/OO-330,Mayrhofberg,,48.3675,13.9300,654 +OE/OO-331,Steinerfelsen,,48.4389,13.8675,543 +OE/OO-332,Schneiderbauerhoehe,,48.3706,13.7750,537 +OE/OO-333,Stelzerberg,,48.2747,13.5267,495 +OE/OO-334,Freinberg,,48.2958,14.2694,375 +OE/OO-335,Gruendberg,,48.3394,14.2872,374 +OE/OO-336,Julianaberg,,48.1283,14.2111,368 +OE/OO-337,Zwoelferkogel,,47.6081,13.6033,1634 +OE/OO-338,Rotgsol,,47.8019,14.3514,1560 +OE/OO-339,Sulzkogel,,47.7533,13.7942,1539 +OE/OO-340,Tamberg,,47.7372,14.2167,1516 +OE/OO-341,Brunnkogel,,47.7806,13.6789,1508 +OE/OO-342,Laermerstange,,47.7928,14.7167,1477 +OE/OO-343,Hochkogel,,47.8525,13.8517,1468 +OE/OO-344,Ramsauer Groesstenberg,,47.8286,14.2842,1458 +OE/OO-345,Hochedl,,47.8272,14.0900,1424 +OE/OO-346,Breitenberg,,47.7722,13.5153,1412 +OE/OO-347,Gasselkogel,,47.8247,13.8406,1411 +OE/OO-348,Schnellerplan,,47.8186,13.8656,1411 +OE/OO-349,Grosser Spitzberg,,47.8286,14.2261,1396 +OE/OO-350,Kreuzeck,,47.7689,13.9089,1306 +OE/OO-351,Schreindlmauer,,47.8222,14.3919,1293 +OE/OO-352,Wasserkogel,,47.8425,13.8669,1268 +OE/OO-353,Schneeberg,,47.8731,14.4119,1244 +OE/OO-354,Hoher Trailing,,47.8542,14.3028,1237 +OE/OO-355,Brunntalmauer,,47.8800,14.4825,1183 +OE/OO-356,Annasberg,,47.8694,14.2972,1172 +OE/OO-357,Hundskogel,,47.7703,14.0456,1167 +OE/OO-358,Hochkogel,,47.7822,14.5017,1157 +OE/OO-359,Mitterberg,,47.8519,14.4069,1145 +OE/OO-360,Habichtkogel,,47.7758,14.1042,1142 +OE/OO-361,Buchberg,,47.8294,14.3289,1132 +OE/OO-362,Feichteck,,47.8794,14.6372,1114 +OE/OO-363,Eibling,,47.8583,14.2517,1108 +OE/OO-364,Wolfsberg,,47.7725,13.9367,1099 +OE/OO-365,Kulmspitze,,47.8506,13.4064,1095 +OE/OO-366,Hoher Krahberg,,47.8522,13.6164,1090 +OE/OO-367,Brandberg,,47.7664,13.9675,1074 +OE/OO-368,Hohenaugupf,,47.8442,13.7219,1062 +OE/OO-369,Keferspitz,,47.7933,14.1433,1061 +OE/OO-370,Rammelspitz,,47.8706,14.2506,1054 +OE/OO-371,Steyrsberg,,47.7183,14.1833,1007 +OE/OO-372,Lindeck,,47.8694,14.3558,1002 +OE/OO-373,Miesenberg,,47.8678,13.6331,993 +OE/OO-374,Hochstein,,48.5992,13.8750,904 +OE/OO-375,Plachwitz,,47.9019,14.2133,904 +OE/OO-376,Grosser Landsberg,,47.9217,14.2269,899 +OE/OO-377,Reisingerberg,,48.5908,14.5358,886 +OE/OO-378,Rinnerberg,,47.9064,14.1933,878 +OE/OO-379,Hochbuehel,,48.6403,13.9258,871 +OE/OO-380,Hieselberg,,47.8736,14.5322,849 +OE/OO-381,Wurberg,,47.6756,14.3422,847 +OE/OO-382,Schlaeger Berg,,48.6514,13.8903,843 +OE/OO-383,Oberriedel,,47.9275,13.9036,806 +OE/OO-384,Kienberg,,47.8589,14.1789,801 +OE/OO-385,Gunst,,47.7292,14.3117,787 +OE/OO-386,Oeberg,,48.1414,13.6736,692 +OE/SB-001,Hohe Dock,,47.1311,12.7408,3348 +OE/SB-002,Keeskogel,,47.1364,12.3122,3291 +OE/SB-003,Kitzsteinhorn,,47.1881,12.6875,3209 +OE/SB-004,Oberer Fochezkopf,,47.1614,12.7467,3159 +OE/SB-005,Larmkogel,,47.1742,12.4033,3017 +OE/SB-006,Tauernkogel,,47.1581,12.4839,2988 +OE/SB-007,Hochkoenig,,47.4203,13.0628,2941 +OE/SB-008,Gamsspitzl,,47.0997,12.2692,2888 +OE/SB-009,Rosskopf,,47.1517,12.1386,2845 +OE/SB-010,Windbachtalkogel,,47.1206,12.1472,2843 +OE/SB-011,Silbereck,,47.0869,13.4314,2810 +OE/SB-012,Eisenkopf,,47.0892,13.4319,2802 +OE/SB-013,Hochseiler,,47.4308,13.0308,2793 +OE/SB-014,Weisseck,,47.1625,13.3936,2777 +OE/SB-015,Schwarzkopf,,47.1672,12.8608,2765 +OE/SB-016,Kreuzkogel,,47.0539,13.1003,2686 +OE/SB-017,Mosermandl,,47.2061,13.3958,2680 +OE/SB-018,Ohlitzen,,47.0803,13.4578,2658 +OE/SB-019,Faulkogel,,47.2164,13.3722,2654 +OE/SB-020,Schoenfeldspitze,,47.4583,12.9358,2653 +OE/SB-021,Lakarschneid,,47.2192,12.6825,2652 +OE/SB-022,Selbhorn,,47.4439,12.9642,2642 +OE/SB-023,Birnhorn,,47.4747,12.7339,2634 +OE/SB-024,Baumgartlkopf,,47.1392,12.8439,2623 +OE/SB-025,Brandhorn,,47.4475,13.0044,2610 +OE/SB-026,Silberpfennig,,47.0892,13.0417,2600 +OE/SB-027,Grosser Hundstod,,47.5125,12.8858,2594 +OE/SB-028,Kendlkopf,,47.1325,12.8414,2587 +OE/SB-029,Tuerchlwand,,47.1511,13.0322,2577 +OE/SB-030,Kreuzhoehe,,47.2219,13.7811,2566 +OE/SB-031,Weisseneck,,47.1767,13.5644,2563 +OE/SB-032,Grosses Gurpitscheck,,47.2106,13.6153,2526 +OE/SB-033,Hoher Goell,,47.5942,13.0669,2522 +OE/SB-034,Pihapper,,47.2342,12.4611,2513 +OE/SB-035,Grosses Ochsenhorn,,47.5383,12.6606,2511 +OE/SB-036,Breithorn,,47.4572,12.9031,2504 +OE/SB-037,Graukogel,,47.0972,13.1714,2492 +OE/SB-038,Lesshoehe,,47.2256,13.7275,2490 +OE/SB-039,Kareck,,47.0592,13.5539,2481 +OE/SB-040,Scharnock,,47.2583,13.7136,2480 +OE/SB-041,Huggachkoepfe,,47.1747,12.4997,2477 +OE/SB-042,Gamskarkogel,,47.1611,13.1586,2467 +OE/SB-043,Schareck,,47.1600,13.5989,2466 +OE/SB-044,Grosse Bischofsmuetze,,47.4939,13.5111,2458 +OE/SB-045,Kramkogel,,47.4203,13.0367,2454 +OE/SB-046,Hohe Arche,,47.2381,12.6794,2453 +OE/SB-047,Zechnerkarspitze,,47.2192,13.6881,2452 +OE/SB-048,Wurmkopf,,47.4567,12.9281,2451 +OE/SB-049,Zwoelferkogel,,47.2353,12.5250,2446 +OE/SB-050,Glingspitze,,47.1589,13.3178,2433 +OE/SB-051,Raucheck,,47.4989,13.2264,2430 +OE/SB-052,Frauenkogel,,47.1736,13.1672,2424 +OE/SB-053,Breitkopf,,47.2289,12.3597,2421 +OE/SB-054,Speiereck,,47.1278,13.6247,2411 +OE/SB-055,Gamskarlspitze,,47.2511,13.5850,2411 +OE/SB-056,Bleikogel,,47.5142,13.2983,2411 +OE/SB-057,Ennskraxen,,47.2575,13.3564,2410 +OE/SB-058,Imbachhorn,,47.2322,12.7711,2410 +OE/SB-059,Tischkogel,,47.0997,13.0903,2409 +OE/SB-060,Koenigsstuhl,,47.2108,12.6361,2408 +OE/SB-061,Arbeskopf,,47.1942,12.1550,2400 +OE/SB-062,Grosses Woazkoepfl,,47.1000,12.8381,2391 +OE/SB-063,Zehnerkarspitze,,47.2367,13.5292,2382 +OE/SB-064,Kleines Gurpitscheck,,47.2022,13.6219,2378 +OE/SB-065,Mauskarkopf,,47.1542,13.0475,2373 +OE/SB-066,Lapernig Spitze,,47.1703,13.5897,2369 +OE/SB-067,Weissgrubenkopf,,47.1861,13.3325,2369 +OE/SB-068,Stierkarkopf,,47.1972,13.3533,2366 +OE/SB-069,Mittleres Streitmandl,,47.5025,13.2453,2360 +OE/SB-070,Gamsleitenspitze,,47.2392,13.5467,2359 +OE/SB-071,Schindlkoepfe,,47.4906,12.8842,2357 +OE/SB-072,Kleiner Lanschuetz,,47.1353,13.6247,2355 +OE/SB-073,Seekarspitze,,47.2731,13.5433,2350 +OE/SB-074,Grosser Lanschuetz,,47.1419,13.6203,2347 +OE/SB-075,Steinfeldspitze,,47.2661,13.4517,2344 +OE/SB-076,Tennkogel,,47.1783,13.1581,2333 +OE/SB-077,Bernkogel,,47.2489,13.0433,2325 +OE/SB-078,Eiskogel,,47.4967,13.2819,2321 +OE/SB-079,Seehorn,,47.5167,12.8531,2321 +OE/SB-080,Gumma,,47.2106,13.7794,2316 +OE/SB-081,Sladinkopf,,47.2456,13.0408,2305 +OE/SB-082,Steinkogel,,47.2986,12.2369,2299 +OE/SB-083,Scheiblingkogel,,47.5342,13.2722,2289 +OE/SB-084,Zwoelferkogel,,47.2361,12.3533,2281 +OE/SB-085,Pollannock,,47.2150,13.7286,2280 +OE/SB-086,Duerrkarhorn,,47.4881,12.7431,2280 +OE/SB-087,Gensgitsch,,47.2108,13.7319,2279 +OE/SB-088,Kempen,,47.1650,13.4139,2277 +OE/SB-089,Schilchernock,,46.9906,13.7911,2270 +OE/SB-090,Gernkogel,,47.2661,12.1867,2267 +OE/SB-091,Schwarzkopf,,47.2697,13.4417,2263 +OE/SB-092,Achenkopf,,47.2403,12.8967,2260 +OE/SB-093,Feldernock,,47.0072,13.8219,2257 +OE/SB-094,Kleiner Koenigstuhl,,47.0075,13.8042,2254 +OE/SB-095,Muellachgeier,,47.2675,12.0986,2254 +OE/SB-096,Hirschkopf,,47.2328,12.9433,2252 +OE/SB-097,Breitkopf,,47.2439,12.8856,2251 +OE/SB-098,Sandkogel,,47.2853,13.1631,2249 +OE/SB-099,Roetelstein,,47.4575,13.5547,2247 +OE/SB-100,Tauernkogel,,47.4939,13.2983,2247 +OE/SB-101,Manlitzkogel,,47.3275,12.5419,2247 +OE/SB-102,Stubnerkogel,,47.1131,13.0992,2246 +OE/SB-103,Hochkogel,,47.3281,12.6156,2240 +OE/SB-104,Hundskogel,,47.2658,13.5803,2239 +OE/SB-105,Ronachgeier,,47.2678,12.1450,2236 +OE/SB-106,Knallstein,,47.5439,13.2319,2233 +OE/SB-107,Vorderer Schafbichl,,47.1428,12.6347,2232 +OE/SB-108,Baerensteigkopf,,47.3256,12.5892,2225 +OE/SB-109,Baukogel,,47.2431,12.9469,2224 +OE/SB-110,Wildkogel,,47.2858,12.2975,2224 +OE/SB-111,Weichselbachhoehe,,47.1908,12.9072,2220 +OE/SB-112,Gurenstein,,47.1875,13.3047,2219 +OE/SB-113,Seekareck,,47.2647,13.5322,2217 +OE/SB-114,Muehlhauserhoehe,,47.0236,13.7794,2216 +OE/SB-115,Zirmkogel,,47.3319,12.6536,2216 +OE/SB-116,Arlspitze,,47.2628,13.1500,2214 +OE/SB-117,Scheidegg,,47.2428,12.6114,2214 +OE/SB-118,Birkkogel,,47.2425,12.5242,2212 +OE/SB-119,Aineck,,47.0556,13.6378,2210 +OE/SB-120,Reissrachkopf,,47.2203,12.9425,2210 +OE/SB-121,Rauchkogel,,47.1653,13.1433,2208 +OE/SB-122,Kreuzeck,,47.1739,13.3072,2204 +OE/SB-123,Spielkogel,,47.1975,13.2594,2201 +OE/SB-124,Gaipahoehe,,46.9908,13.7281,2192 +OE/SB-125,Hinterer Geissstein,,47.3067,13.5383,2190 +OE/SB-126,Elferkogel,,47.2403,12.3683,2190 +OE/SB-127,Filzmooshoerndl,,47.2047,13.2681,2189 +OE/SB-128,Zechnerhoehe,,46.9939,13.7447,2188 +OE/SB-129,Gamskogel,,47.2733,13.4469,2186 +OE/SB-130,Huehnerleitennock,,47.0325,13.7775,2182 +OE/SB-131,Gruendegg,,47.2494,13.2819,2168 +OE/SB-132,Taghaube,,47.4039,13.0561,2159 +OE/SB-133,Niederer Gernkogel,,47.3292,12.6650,2153 +OE/SB-134,Rosskopf,,47.2322,12.7867,2152 +OE/SB-135,Teuerlnock,,47.0431,13.6439,2145 +OE/SB-136,Strimskogel,,47.3117,13.4703,2139 +OE/SB-137,Tagweidegg,,47.2775,13.4344,2135 +OE/SB-138,Gmeinnock,,47.0017,13.7022,2130 +OE/SB-139,Tagweide,,47.5269,13.3556,2128 +OE/SB-140,Stemmerkogel,,47.3536,12.6211,2123 +OE/SB-141,Hasseck,,47.2817,13.1225,2119 +OE/SB-142,Hundsstein,,47.3386,12.9086,2117 +OE/SB-143,Breiteck,,47.2242,12.6219,2114 +OE/SB-144,Tristkopf,,47.5328,13.1247,2110 +OE/SB-145,Heukareck,,47.2925,13.1653,2100 +OE/SB-146,Predigtstuhl,,47.0158,13.8044,2097 +OE/SB-147,Schattberg-West,,47.3653,12.6228,2096 +OE/SB-148,Kreuzkoepfl,,47.2142,12.8675,2094 +OE/SB-149,Stubennock,,46.9683,13.7747,2092 +OE/SB-150,Saalbachkogel,,47.3431,12.6194,2092 +OE/SB-151,Matehanshoehe,,46.9825,13.7586,2086 +OE/SB-152,Benzegg,,47.2647,13.3950,2075 +OE/SB-153,Maurerkogel,,47.3303,12.6983,2074 +OE/SB-154,Rabenkopf,,47.3278,12.5561,2074 +OE/SB-155,Schoppachhoehe,,47.2442,12.7067,2069 +OE/SB-156,Spazeck,,47.2544,13.4644,2065 +OE/SB-157,Katzenkopf,,47.2531,13.0222,2061 +OE/SB-158,Lackenkogel,,47.3264,13.4233,2051 +OE/SB-159,Geisskopf,,47.2344,13.4058,2051 +OE/SB-160,Saukarkopf,,47.2542,13.2333,2048 +OE/SB-161,Plattenkogel,,47.2247,12.1353,2039 +OE/SB-162,Gabel,,47.2844,13.2694,2037 +OE/SB-163,Fulseck,,47.2353,13.1481,2035 +OE/SB-164,Edelweisskogel,,47.5128,13.3458,2030 +OE/SB-165,Gamsfeld,,47.6233,13.4808,2027 +OE/SB-166,Kreuzkogel,,47.2247,13.1542,2027 +OE/SB-167,Farnbuehel,,47.2128,12.1300,2026 +OE/SB-168,Hochkasern,,47.3489,12.9511,2017 +OE/SB-169,Wirtsnock,,47.0197,13.7511,2014 +OE/SB-170,Saukarkopf,,47.3072,13.3456,2014 +OE/SB-171,Gamskarkogel,,47.4558,13.1006,2013 +OE/SB-172,Herrnkoepfl,,47.2275,13.2975,2012 +OE/SB-173,Schwalbenwand,,47.3647,12.8633,2011 +OE/SB-174,Vorderkogel,,47.3075,13.4253,2008 +OE/SB-175,Hakopf,,47.2992,13.4764,1996 +OE/SB-176,Griessenkareck,,47.3186,13.3511,1991 +OE/SB-177,Doerfler Hoehe,,47.1350,13.9942,1987 +OE/SB-178,Zwoelferkogel,,47.3606,12.5692,1983 +OE/SB-179,Schmittenhoehe,,47.3292,12.7372,1965 +OE/SB-180,Mooskopf,,47.2922,13.3486,1961 +OE/SB-181,Moseregg,,47.2750,13.3606,1960 +OE/SB-182,Hochkranz,,47.5236,12.7900,1953 +OE/SB-183,Kuhfeldhoerndl,,47.4333,12.6450,1942 +OE/SB-184,Hanglhoehe,,47.3139,12.3678,1940 +OE/SB-185,Lasaberg,,47.1036,13.8736,1935 +OE/SB-186,Rosskopf,,47.2939,13.4286,1929 +OE/SB-187,Hinterkogel,,47.3003,13.4283,1922 +OE/SB-188,Schneeberg,,47.3689,13.0739,1921 +OE/SB-189,Hochalmspitze,,47.3983,12.5617,1921 +OE/SB-190,Scharwandspitze,,47.3175,13.4147,1918 +OE/SB-191,Wildbuehel,,47.2889,13.3569,1916 +OE/SB-192,Asitzkopf,,47.4028,12.7025,1914 +OE/SB-193,Sausteigen,,47.3864,12.7597,1912 +OE/SB-194,Wildenkarkogel,,47.4017,12.6856,1910 +OE/SB-195,Moserkopf,,47.1586,13.6711,1896 +OE/SB-196,Braunedlkogel,,47.6353,13.4500,1894 +OE/SB-197,Resterhoehe,,47.3072,12.3828,1894 +OE/SB-198,Gstosshoehe,,47.0472,13.8547,1890 +OE/SB-199,Torkogel,,47.0992,13.8786,1889 +OE/SB-200,Schabergkogel,,47.3928,12.7106,1888 +OE/SB-201,Breiter Kopf,,47.3136,12.8706,1872 +OE/SB-202,Schrambachkopf,,47.3447,12.7561,1858 +OE/SB-203,Ahornstein,,47.3667,13.0436,1855 +OE/SB-204,Salzburger Hochthron,,47.7181,13.0050,1853 +OE/SB-205,Korein,,47.4700,13.3481,1850 +OE/SB-206,Sonntagskogel,,47.3022,13.2586,1849 +OE/SB-207,Bischlinghoehe,,47.4628,13.2983,1834 +OE/SB-208,Braggstein,,47.4325,12.9525,1827 +OE/SB-209,Rinnkogel,,47.6669,13.4861,1823 +OE/SB-210,Grindkogel,,47.2944,13.2639,1823 +OE/SB-211,Reiterkogel,,47.4014,12.5933,1818 +OE/SB-212,Mardeckkopf,,47.4089,12.6639,1817 +OE/SB-213,Rauchkoegerl,,47.2764,13.0508,1810 +OE/SB-214,Breitspitz,,47.3975,13.2786,1804 +OE/SB-215,Weidschober,,47.1703,13.9297,1789 +OE/SB-216,Schafberg,,47.7767,13.4339,1782 +OE/SB-217,Rettenkogel,,47.6814,13.5067,1780 +OE/SB-218,Grinnberg,,47.3808,12.9789,1774 +OE/SB-219,Rossbrand,,47.4939,13.4792,1770 +OE/SB-220,Hoher Zinken,,47.6703,13.3481,1764 +OE/SB-221,Durchenkopf,,47.4006,12.7633,1764 +OE/SB-222,Kleiner Goell,,47.5897,13.1264,1752 +OE/SB-223,Grubhoerndl,,47.5964,12.6614,1747 +OE/SB-224,Bernkogel,,47.4131,12.6028,1740 +OE/SB-225,Eibenberg,,47.3325,13.4117,1738 +OE/SB-226,Gennerhorn,,47.6753,13.3094,1735 +OE/SB-227,Gruberhorn,,47.6747,13.3042,1732 +OE/SB-228,Gerzkopf,,47.4606,13.4306,1728 +OE/SB-229,Sonnkogel,,47.4350,12.6592,1727 +OE/SB-230,Spinnerin,,47.7736,13.4425,1725 +OE/SB-231,Hochdurchkogel,,47.4708,12.6789,1722 +OE/SB-232,Pitscherberg,,47.6664,13.3753,1720 +OE/SB-233,Barnkogel,,47.4236,12.6269,1709 +OE/SB-234,Grinnkoepfl,,47.3683,12.9722,1707 +OE/SB-235,Kienalkopf,,47.4639,12.8756,1707 +OE/SB-236,Grosses Hundshorn,,47.5828,12.7494,1706 +OE/SB-237,Einberg,,47.6183,13.3608,1688 +OE/SB-238,Regenspitz,,47.6806,13.2889,1675 +OE/SB-239,Plattenkopf,,47.4683,12.7667,1661 +OE/SB-240,Kleiner Traunstein,,47.5358,13.3733,1659 +OE/SB-241,Schlenken,,47.6817,13.2133,1648 +OE/SB-242,Labenberg,,47.6458,13.3947,1642 +OE/SB-243,Schoenbuehel,,47.5972,12.6458,1624 +OE/SB-244,Taborberg,,47.6072,13.4183,1618 +OE/SB-245,Wieslerhorn,,47.6811,13.4089,1603 +OE/SB-246,Holzeck,,47.6789,13.3286,1603 +OE/SB-247,Hochglocker,,47.3478,13.1397,1590 +OE/SB-248,Schwarzer Berg,,47.6061,13.2372,1584 +OE/SB-249,Schwarzeck,,47.6139,12.6475,1565 +OE/SB-250,Faistenauer Schafberg,,47.7486,13.3050,1559 +OE/SB-251,Windkogel,,47.6822,13.4311,1547 +OE/SB-252,Dietrichshorn,,47.6222,12.6742,1542 +OE/SB-253,Bleckwand,,47.6922,13.4464,1541 +OE/SB-254,Hochgimpling,,47.6628,12.6225,1539 +OE/SB-255,Gitschenwand,,47.6344,13.2600,1527 +OE/SB-256,Bodenberg,,47.5964,13.4444,1523 +OE/SB-257,Zwoelferhorn,,47.7425,13.3517,1521 +OE/SB-258,Sparber,,47.6942,13.4661,1502 +OE/SB-259,Ochsenberg,,47.7486,13.2033,1487 +OE/SB-260,Bergkoepfel,,47.6894,13.2731,1480 +OE/SB-261,Illingerberg,,47.7219,13.3361,1479 +OE/SB-262,Grobriedel,,47.7094,13.2519,1473 +OE/SB-263,Reiningspitz,,47.7681,13.4272,1450 +OE/SB-264,Forstegg,,47.3581,13.2461,1438 +OE/SB-265,Oebristkopf,,47.3503,13.2856,1411 +OE/SB-266,Thaellerer Kogel,,47.6258,12.6822,1337 +OE/SB-267,Filbling,,47.7878,13.2681,1307 +OE/SB-268,Gaisberg,,47.8053,13.1125,1287 +OE/SB-269,Breitenberg,,47.7144,13.3872,1260 +OE/SB-270,Feichtenstein,,47.7069,13.2978,1249 +OE/SB-271,Lidaunberg,,47.7953,13.2261,1237 +OE/SB-272,Buergerberg,,47.4372,12.8806,1237 +OE/SB-273,Buchberg,,47.3092,13.0583,1234 +OE/SB-274,Schmiedhorn,,47.7836,13.2583,1224 +OE/SB-275,Dickkopf,,47.6539,12.6597,1204 +OE/SB-276,Hoellkar,,47.7986,13.3553,1169 +OE/SB-277,Wallhuettenkopf,,47.7906,13.3489,1116 +OE/SB-278,Nagelkoepfl,,47.2900,12.6681,1090 +OE/SB-279,Sonnberg,,47.7719,13.3247,1072 +OE/SB-280,Grosse Plaike,,47.8850,13.2364,1034 +OE/SB-281,Lehmberg,,47.8922,13.2642,1027 +OE/SB-282,Ellmaustein,,47.7953,13.3128,994 +OE/SB-283,Strumberg,,47.7811,13.1936,981 +OE/SB-284,Birnberg,,47.4472,12.7586,961 +OE/SB-285,Kienberg,,47.7961,13.4172,947 +OE/SB-286,Kesselkopf,,47.7794,13.4031,928 +OE/SB-287,Eibenberg,,47.7911,13.3778,923 +OE/SB-288,Auberg,,47.7858,13.4981,907 +OE/SB-289,Heuberg,,47.8314,13.1078,901 +OE/SB-290,Zifanken,,47.8758,13.2100,897 +OE/SB-291,Raspenhoehe,,47.6603,13.1039,893 +OE/SB-292,Sechserkogel,,47.7933,13.5269,872 +OE/SB-293,Irrsberg,,47.9567,13.2739,844 +OE/SB-294,Haunsberg,,47.9150,13.9969,835 +OE/SB-295,Buchberg,,47.9536,13.1089,801 +OE/SB-296,Nasenberg,,47.7853,13.3931,753 +OE/SB-297,Oberalmberg,,47.7142,13.1150,726 +OE/SB-298,Hiesenberg,,47.9161,13.2469,725 +OE/SB-299,Hochgitzen,,47.8569,13.0347,676 +OE/SB-300,Kapuzinerberg,,47.8053,13.0581,636 +OE/SB-301,Johannsberg,,47.9578,13.2108,600 +OE/SB-302,Lielonberg,,47.0272,13.0322,569 +OE/SB-303,Heuberg,,47.6956,13.1169,556 +OE/SB-304,Plainberg,,47.8375,13.0444,549 +OE/SB-305,Moenchsberg,,47.7953,13.0478,540 +OE/SB-306,Georgenberg,,47.6350,13.1597,528 +OE/SB-307,Hellbrunner Berg,,47.7589,13.0661,515 +OE/SB-308,Lamkopf,,47.4219,13.0411,2846 +OE/SB-309,Medelzkopf,,47.1158,12.6289,2761 +OE/SB-310,Scharegg,,47.4464,12.9839,2570 +OE/SB-311,Bonegg,,47.4428,12.9761,2560 +OE/SB-312,Mitterhorn,,47.4608,12.9003,2491 +OE/SB-313,Hundshoerndl,,47.4769,12.7100,2482 +OE/SB-314,Griessner Hochbrett,,47.4761,12.7006,2470 +OE/SB-315,Persailhorn,,47.4600,12.8908,2347 +OE/SB-316,Sommerstein,,47.4564,12.9136,2308 +OE/SB-317,Hochzint,,47.4725,12.7450,2246 +OE/SB-318,Mitterhorn,,47.4750,12.7586,2206 +OE/SB-319,Metzhoerndl,,47.4831,12.7461,2135 +OE/SB-320,Maurerkoepfl,,47.4831,12.7461,2133 +OE/SB-321,Hohe Penhab,,47.3547,12.5572,2113 +OE/SB-322,Wildzacken,,47.4661,12.7311,2093 +OE/SB-323,Ochsenkopf,,47.3342,12.8997,1995 +OE/SB-324,Langegg,,47.3569,12.9197,1899 +OE/SB-325,Haiderbergkogel,,47.3947,12.7553,1875 +OE/SB-326,Schaflzacken,,47.4631,12.7353,1739 +OE/SB-327,Gabuehel,,47.3903,12.9853,1636 +OE/SB-328,Saliterkoepfl,,47.4658,12.8028,1499 +OE/SB-329,Baleitenkopf,,47.4119,12.9494,1438 +OE/SB-330,Hochtoelzer,,47.4594,12.7417,1362 +OE/SB-331,Pointner Berg,,47.3417,12.8311,1303 +OE/SB-332,Lichte Tanne,,47.4617,12.8481,1301 +OE/SB-333,Natrun,,47.3950,12.9283,1253 +OE/SB-334,Miesberg,,47.4300,12.8042,1115 +OE/SB-335,Kuehbichl,,47.4122,12.8525,875 +OE/ST-001,Hochgolling,,47.2664,13.7606,2862 +OE/ST-002,Hochwildstelle,,47.3347,13.8306,2747 +OE/ST-003,Roteck,,47.2300,13.8503,2742 +OE/ST-004,Preber,,47.2200,13.8650,2740 +OE/ST-005,Waldhorn,,47.2958,13.8175,2702 +OE/ST-006,Kieseck,,47.2931,13.8256,2681 +OE/ST-007,Scheichenspitze,,47.4508,13.6561,2667 +OE/ST-008,Greifenberg,,47.2892,13.7892,2618 +OE/ST-009,Grosser Knallstein,,47.3206,13.9761,2599 +OE/ST-010,Rupprechtseck,,47.2400,14.0011,2591 +OE/ST-011,Predigtstuhl,,47.2619,13.9108,2543 +OE/ST-012,Suessleiteck,,47.2678,13.9986,2507 +OE/ST-013,Gamskarspitz,,47.3494,13.8364,2491 +OE/ST-014,Rettlkirchspitze,,47.2600,14.1275,2475 +OE/ST-015,Greim,,47.2475,14.1517,2474 +OE/ST-016,Steirische Kalkspitze,,47.2833,13.6222,2459 +OE/ST-017,Eisenhut,,47.2350,14.0494,2456 +OE/ST-018,Grosser Boesenstein,,47.4436,14.4039,2448 +OE/ST-019,Eisenhut,,46.9522,13.9283,2441 +OE/ST-020,Deneck,,47.2869,14.0506,2433 +OE/ST-021,Bauleiteck,,47.2711,13.9692,2424 +OE/ST-022,Schoberspitze,,47.2894,14.1611,2423 +OE/ST-023,Geierhaupt,,47.3747,14.6361,2417 +OE/ST-024,Hochreichhart,,47.3633,14.6817,2416 +OE/ST-025,Kilnprein,,46.9858,13.8431,2408 +OE/ST-026,Seckauer Zinken,,47.3392,14.7361,2397 +OE/ST-027,Zirbitzkogel,,47.0633,14.5672,2396 +OE/ST-028,Gamskogel,,47.3658,14.5489,2388 +OE/ST-029,Hochstubofen,,47.2678,14.1122,2385 +OE/ST-030,Samspitze,,47.2769,13.7300,2381 +OE/ST-031,Hochtor,,47.5619,14.6328,2369 +OE/ST-032,Hohenwart,,47.3294,14.2361,2363 +OE/ST-033,Grimming,,47.5206,14.0172,2351 +OE/ST-034,Grosser Griessstein,,47.3908,14.5394,2337 +OE/ST-035,Kegeleck,,47.3011,14.2128,2323 +OE/ST-036,Gstoder,,47.2933,14.2136,2318 +OE/ST-037,Amachkogel,,47.3528,14.5381,2312 +OE/ST-038,Bruderkogel,,47.3878,14.4219,2299 +OE/ST-039,Krautgartsch,,47.2656,13.7125,2293 +OE/ST-040,Hochschwab,,47.6183,15.1428,2277 +OE/ST-041,Grosser Ringkogel,,47.3208,14.6219,2277 +OE/ST-042,Hornfeldspitze,,47.2672,14.0903,2277 +OE/ST-043,Schiesseck,,47.2747,14.3231,2275 +OE/ST-044,Laerchkogel,,47.3536,14.5214,2258 +OE/ST-045,Moaralmspitze,,47.3522,13.7839,2257 +OE/ST-046,Spateck,,47.3497,13.8978,2256 +OE/ST-047,Sparafeld,,47.5497,14.5303,2247 +OE/ST-048,Huehnerkogel,,47.2989,14.2744,2242 +OE/ST-049,Trockenbrotsch,,47.2767,13.7214,2237 +OE/ST-050,Zinkenkogel,,47.4200,14.3761,2233 +OE/ST-051,Geierkogel,,47.4000,14.4997,2231 +OE/ST-052,Sonntagskogel,,47.3906,14.5103,2229 +OE/ST-053,Gumpeneck,,47.3972,14.0153,2226 +OE/ST-054,Kerschkern,,47.3878,14.6139,2225 +OE/ST-055,Grosser Buchstein,,47.6106,14.5969,2224 +OE/ST-056,Hoher Zinken,,47.2708,14.3419,2222 +OE/ST-057,Hochrettelstein,,47.4247,14.2325,2220 +OE/ST-058,Kleinhansl,,47.3247,14.2706,2217 +OE/ST-059,Goesseck,,47.4486,14.9000,2214 +OE/ST-060,Fuchskogel,,47.0456,14.5797,2214 +OE/ST-061,Lugauer,,47.5550,14.7256,2206 +OE/ST-062,Schoenfeldspitz,,47.3381,14.2236,2202 +OE/ST-063,Tschaudinock,,47.0167,13.9317,2200 +OE/ST-064,Kalbling,,47.5472,14.5211,2196 +OE/ST-065,Hochschwung,,47.4075,14.3389,2196 +OE/ST-066,Hochzinoedl,,47.5656,14.6661,2191 +OE/ST-067,Ameringkogel,,47.0711,14.8083,2187 +OE/ST-068,Hochstein,,47.4308,14.1875,2183 +OE/ST-069,Grosses Tragl,,47.6189,14.0319,2179 +OE/ST-070,Hexenturm,,47.6458,14.4811,2172 +OE/ST-071,Prankerhoehe,,47.0236,14.0689,2166 +OE/ST-072,Eisenerzer Reichenstein,,47.5028,14.9344,2165 +OE/ST-073,Seitnerzinken,,47.3925,14.2997,2164 +OE/ST-074,Schreinl,,47.3808,14.1681,2154 +OE/ST-075,Wenzelalpe,,47.1103,14.5406,2151 +OE/ST-076,Baerfallspitze,,47.3600,13.7858,2150 +OE/ST-077,Breiteckkoppe,,47.3711,14.2367,2144 +OE/ST-078,Kirbisch,,47.0500,14.0508,2140 +OE/ST-079,Gstoder,,47.1422,13.9931,2140 +OE/ST-080,Kammspitz,,47.4761,13.8847,2139 +OE/ST-081,Schober,,47.3458,13.6053,2133 +OE/ST-082,Elm,,47.6736,13.9628,2128 +OE/ST-083,Schoberspitze,,47.4036,14.1678,2126 +OE/ST-084,Zeiritzkampel,,47.4914,14.7269,2125 +OE/ST-085,Ebenstein,,47.6061,15.0281,2123 +OE/ST-086,Rosenkranzhoehe,,47.0553,14.0497,2118 +OE/ST-087,Planspitze,,47.5739,14.6408,2117 +OE/ST-088,Hochkogel,,47.5389,14.8156,2105 +OE/ST-089,Karlhochkogel,,47.6072,15.1583,2096 +OE/ST-090,Himmeleck,,47.4269,14.6031,2096 +OE/ST-091,Kaiserschild,,47.5386,14.8281,2084 +OE/ST-092,Hochturm,,47.5339,15.0069,2081 +OE/ST-093,Feistererhorn,,47.3847,14.7000,2081 +OE/ST-094,Moelbegg,,47.4561,14.1869,2080 +OE/ST-095,Plannerseekar­spitze,,47.4150,14.2097,2072 +OE/ST-096,Grosses Baerneck,,47.3528,14.0808,2071 +OE/ST-097,Jauriskampel,,47.3353,14.2828,2064 +OE/ST-098,Wildgoessl,,47.6925,13.9319,2062 +OE/ST-099,Nazogl,,47.6111,14.2294,2057 +OE/ST-100,Hintergullingspitz,,47.3867,14.2131,2054 +OE/ST-101,Kufstein,,47.4567,13.7617,2049 +OE/ST-102,Schleifeck,,47.3656,14.5122,2048 +OE/ST-103,Stoderzinken,,47.4592,13.8286,2048 +OE/ST-104,Wildfeld,,47.4825,14.8481,2043 +OE/ST-105,Stein am Mandl,,47.4928,14.3653,2043 +OE/ST-106,Leobner,,47.4944,14.6500,2036 +OE/ST-107,Tamischbachturm,,47.6147,14.6992,2035 +OE/ST-108,Hohe Lins,,47.4931,14.9036,2028 +OE/ST-109,Lahnerleitenspitze,,47.4919,14.6786,2027 +OE/ST-110,Lattenberg,,47.4014,14.6017,2018 +OE/ST-111,Hauser Kaibling,,47.3736,13.7786,2015 +OE/ST-112,Heukuppe,,47.6892,15.6892,2007 +OE/ST-113,Hochweichsel,,47.6381,15.2269,2006 +OE/ST-114,Brandstein,,47.6008,14.9831,2003 +OE/ST-115,Rotofen,,47.0197,13.8639,1999 +OE/ST-116,Frauenalpe,,47.0647,14.1369,1997 +OE/ST-117,Speikkogel,,47.0575,14.8447,1993 +OE/ST-118,Bosruck,,47.6231,14.3464,1992 +OE/ST-119,Kleiner Buchstein,,47.6286,14.6278,1990 +OE/ST-120,Speikkogel,,47.2272,15.0492,1988 +OE/ST-121,Hohe Veitsch,,47.6486,15.4058,1981 +OE/ST-122,Traweng,,47.6039,14.0144,1981 +OE/ST-123,Blaseneck,,47.4994,14.6189,1969 +OE/ST-124,Peterer Riegel,,47.0383,14.8408,1967 +OE/ST-125,Lawinenstein,,47.5978,13.9544,1965 +OE/ST-126,Lueg,,47.6094,14.2117,1962 +OE/ST-127,Dreimarkstein,,47.7086,15.7158,1948 +OE/ST-128,Schoenberg,,47.2658,14.3756,1943 +OE/ST-129,Rappoldkogel,,47.0839,14.8836,1928 +OE/ST-130,Riesnerkrispen,,47.3647,14.0919,1922 +OE/ST-131,Hochstadl,,47.6856,15.0750,1919 +OE/ST-132,Rossfeld,,47.3492,13.6414,1919 +OE/ST-133,Rosenkogel,,47.2972,14.5517,1918 +OE/ST-134,Moschkogel,,46.8228,14.9914,1916 +OE/ST-135,Polster,,47.5325,14.9611,1910 +OE/ST-136,Planai,,47.3692,13.7267,1906 +OE/ST-137,Windberg,,47.7033,15.5947,1903 +OE/ST-138,Predigtstuhl,,47.6961,15.7081,1902 +OE/ST-139,Redender Stein,,47.6897,13.8869,1900 +OE/ST-140,Braeuningzinken,,47.6753,13.7925,1899 +OE/ST-141,Grosser Schober,,47.4419,14.6375,1895 +OE/ST-142,Rossalm,,47.2447,14.3469,1894 +OE/ST-143,Rosskogel,,47.5981,14.0644,1890 +OE/ST-144,Voettleck,,47.4539,14.5542,1888 +OE/ST-145,Pfaffenstein,,47.5614,14.9150,1871 +OE/ST-146,Leobner Mauer,,47.5294,14.9881,1870 +OE/ST-147,Grebenzen,,47.0389,14.3317,1870 +OE/ST-148,Papstriegel,,47.3133,14.7236,1869 +OE/ST-149,Bremstein,,47.3725,14.7792,1868 +OE/ST-150,Gamseck,,47.6989,15.6789,1857 +OE/ST-151,Eisenbeutel,,47.3608,14.4386,1855 +OE/ST-152,Zinken,,47.5822,13.7664,1854 +OE/ST-153,Grabnerstein,,47.6331,14.5047,1847 +OE/ST-154,Kragelschinken,,47.4892,14.8239,1845 +OE/ST-155,Loser,,47.6608,13.7711,1837 +OE/ST-156,Feistringstein,,47.6067,15.2375,1836 +OE/ST-157,Messnerin,,47.5600,15.0858,1835 +OE/ST-158,Eiblkogel,,47.2617,15.0981,1831 +OE/ST-159,Hochtausing,,47.5844,14.1567,1823 +OE/ST-160,Tieflimauer,,47.6261,14.6464,1820 +OE/ST-161,Stolzalpe,,47.1517,14.1903,1817 +OE/ST-162,Hechlstein,,47.5733,14.0667,1814 +OE/ST-163,Staritzen-Ostgipfel,,47.6403,15.2719,1810 +OE/ST-164,Windgrube,,47.5808,15.2261,1809 +OE/ST-165,Weberkogel,,46.8581,15.0089,1805 +OE/ST-166,Kramerkogel,,47.1297,14.0850,1802 +OE/ST-167,Pleschaitz,,47.1619,14.3158,1797 +OE/ST-168,Grabnerspitze,,47.4653,14.8347,1795 +OE/ST-169,Moarkoepfl,,47.2469,14.3811,1793 +OE/ST-170,Zargenkopf,,47.6011,14.8969,1792 +OE/ST-171,Stuhleck,,47.5742,15.7900,1782 +OE/ST-172,Hochblaser,,47.5878,14.8611,1771 +OE/ST-173,Grosses Maiereck,,47.6719,14.5528,1764 +OE/ST-174,Tuerkenkogel,,47.6089,13.9036,1756 +OE/ST-175,Trisselwand,,47.6464,13.8136,1754 +OE/ST-176,Schafkogel,,47.1592,14.5139,1746 +OE/ST-177,Weisseck,,47.1706,14.4733,1743 +OE/ST-178,Duerrenschoeberl,,47.5528,14.3656,1737 +OE/ST-179,Spielkogel,,47.5194,14.5686,1731 +OE/ST-180,Hochmuehleck,,47.5161,13.8583,1731 +OE/ST-181,Blosen,,47.5006,14.2714,1724 +OE/ST-182,Brandriegel,,47.1106,14.5950,1721 +OE/ST-183,Hochlantsch,,47.3628,15.4244,1720 +OE/ST-184,Rauschkogel,,47.6122,15.3731,1720 +OE/ST-185,Pleschberg,,47.6108,14.4025,1720 +OE/ST-186,Sandling,,47.6564,13.7139,1717 +OE/ST-187,Tonion,,47.7131,15.3792,1699 +OE/ST-188,Oisching,,47.5958,15.2678,1699 +OE/ST-189,Schwarzkogel,,47.0722,14.9133,1694 +OE/ST-190,Kampl,,47.5889,13.8769,1685 +OE/ST-191,Hochanger,,47.6058,15.3169,1682 +OE/ST-192,Hohe Trett,,47.5192,14.2044,1681 +OE/ST-193,Saukogel,,47.4811,14.7975,1678 +OE/ST-194,Steinplan,,47.1633,14.9050,1670 +OE/ST-195,Schiessling,,47.5786,15.2819,1667 +OE/ST-196,Amundsenhoehe,,47.5517,15.7317,1666 +OE/ST-197,Rosseck,,47.3586,15.2053,1664 +OE/ST-198,Thalerkogel,,47.4769,15.0539,1655 +OE/ST-199,Brandkogel,,47.0856,14.9350,1648 +OE/ST-200,Hohes Waxenegg,,47.7353,15.5539,1647 +OE/ST-201,Gwoehnlistein,,47.5711,14.0486,1645 +OE/ST-202,Wetterkogel,,47.3344,15.2081,1643 +OE/ST-203,Fensteralm,,47.2803,15.1533,1642 +OE/ST-204,Mugel,,47.3583,15.1886,1630 +OE/ST-205,Rennfeld,,47.4044,15.3600,1629 +OE/ST-206,Scherzberg,,47.1294,14.9417,1624 +OE/ST-207,Zinken,,47.6800,15.2197,1619 +OE/ST-208,Hasenfuss,,47.7372,14.8094,1615 +OE/ST-209,Boese Mauer,,47.5483,14.7875,1615 +OE/ST-210,Roetelstein,,47.5936,13.8469,1614 +OE/ST-211,Turntaler Kogel,,47.6306,15.3692,1610 +OE/ST-212,Spielkogel,,47.7314,15.5269,1599 +OE/ST-213,Glatzeter Kogel,,47.7467,15.6108,1594 +OE/ST-214,Lachalpe,,47.6892,15.5133,1590 +OE/ST-215,Hoelzlberg,,47.2500,14.6714,1589 +OE/ST-216,Floning,,47.4878,15.2025,1583 +OE/ST-217,Hochschlag,,47.4031,15.5050,1580 +OE/ST-218,Steinriegel,,47.5356,15.7197,1577 +OE/ST-219,Grosser Koenigskogel,,47.7075,15.4447,1574 +OE/ST-220,Grosser Proles,,47.7253,15.4547,1565 +OE/ST-221,Gspitzter Stein,,47.5372,14.7064,1556 +OE/ST-222,Grosser Pfaff,,47.5622,15.8261,1555 +OE/ST-223,Osser,,47.3442,15.5011,1548 +OE/ST-224,Muehlsteinboden,,47.1078,14.2953,1544 +OE/ST-225,Hohe Student,,47.7372,15.3944,1539 +OE/ST-226,Kampalpe,,47.6325,15.7425,1535 +OE/ST-227,Plankogel,,47.3550,15.5583,1531 +OE/ST-228,Wetterin,,47.6844,15.3583,1530 +OE/ST-229,Wildalpe,,47.7536,15.4558,1523 +OE/ST-230,Rote Wand,,47.3333,15.4067,1505 +OE/ST-231,Teufelstein,,47.4650,15.6214,1498 +OE/ST-232,Habring,,47.2336,14.4719,1497 +OE/ST-233,Friessenkogel,,47.3619,15.4767,1491 +OE/ST-234,Stanglalpe,,47.4944,15.5344,1490 +OE/ST-235,Hocheck,,47.5906,15.7986,1488 +OE/ST-236,Zoeberer Hoehe,,47.5067,15.2817,1486 +OE/ST-237,Kraubatheck,,47.3381,14.9161,1475 +OE/ST-238,Grosse Scheibe,,47.6350,15.6889,1473 +OE/ST-239,Troiseck,,47.5569,15.4136,1466 +OE/ST-240,Erzberg,,47.5244,14.9119,1465 +OE/ST-241,Rabenkropf,,47.5728,15.8769,1464 +OE/ST-242,Reinischkogel,,46.9275,15.1153,1463 +OE/ST-243,Kreuzeck,,47.1211,14.4133,1459 +OE/ST-244,Schweineck,,47.3478,15.4447,1457 +OE/ST-245,Blaskoegerl,,47.6453,15.4797,1451 +OE/ST-246,Schwarzkogel,,47.4281,15.4125,1448 +OE/ST-247,Herrenstein,,47.5028,15.8581,1446 +OE/ST-248,Schoeckl,,47.1983,15.4611,1442 +OE/ST-249,Schlanderkogel,,47.0181,14.6667,1442 +OE/ST-250,Fuerstkogel,,47.4278,15.5883,1435 +OE/ST-251,Feldhuetl,,47.7550,15.2547,1434 +OE/ST-252,Kreuzschober,,47.6178,15.6272,1410 +OE/ST-253,Aibel,,47.4189,15.4783,1394 +OE/ST-254,Toellmarkogel,,47.5408,15.4069,1366 +OE/ST-255,Rosenkogel,,46.8956,15.1489,1362 +OE/ST-256,Gossstein,,47.6469,14.8861,1331 +OE/ST-257,Buchkogel,,47.3283,15.5083,1330 +OE/ST-258,Hochegg,,47.5108,15.3328,1324 +OE/ST-259,Gerlerkogel,,47.3331,15.4656,1324 +OE/ST-260,Hochkogel,,47.4681,15.9811,1314 +OE/ST-261,Hochanger,,47.3656,15.2664,1304 +OE/ST-262,Gschwandkogel,,47.5558,15.4447,1282 +OE/ST-263,Rabenwaldkogel,,47.3019,15.7367,1280 +OE/ST-264,Zetz,,47.2967,15.6322,1274 +OE/ST-265,Buergeralpe,,47.7878,15.3292,1270 +OE/ST-266,Roethelstein,,47.3264,15.3864,1263 +OE/ST-267,Masenberg,,47.3492,15.8753,1261 +OE/ST-268,Wildwiesen,,47.3944,15.7750,1254 +OE/ST-269,Kalcherberg,,47.5478,15.3636,1249 +OE/ST-270,Serkogel,,47.4403,15.4861,1240 +OE/ST-271,Gschaidberg,,47.3053,15.4375,1240 +OE/ST-272,Herzogberg,,47.5275,15.3939,1227 +OE/ST-273,Koenigskogel,,47.3378,15.6447,1225 +OE/ST-274,Granegg,,47.5050,15.6111,1205 +OE/ST-275,Tressenstein,,47.6267,13.7892,1201 +OE/ST-276,Sulzriegl,,47.7606,15.5033,1189 +OE/ST-277,Reithkogel,,47.4244,15.6694,1157 +OE/ST-278,Krauserschoeckl,,47.4236,15.7500,1132 +OE/ST-279,Hochreiterkogel,,47.5661,15.4747,1114 +OE/ST-280,Arzberg,,47.4669,15.8178,1111 +OE/ST-281,Fragnerberg,,47.2514,15.3914,1109 +OE/ST-282,Spitz Christi,,47.3622,15.1303,1105 +OE/ST-283,Sulberg,,47.2894,15.4253,1094 +OE/ST-284,Doerfelstein,,47.6036,14.4786,1074 +OE/ST-285,Pleschkogel,,47.1444,15.2322,1061 +OE/ST-286,Klementkogel,,46.6414,15.2436,1052 +OE/ST-287,Madereck,,47.4194,15.2222,1050 +OE/ST-288,Hoehhansl,,47.4483,15.7700,1044 +OE/ST-289,Liechtensteinberg,,47.1631,14.6797,1033 +OE/ST-290,Hohe Rannach,,47.1731,15.4006,1018 +OE/ST-291,Kulm,,47.2250,15.7589,975 +OE/ST-292,Lindkogel,,47.3267,15.6678,955 +OE/ST-293,Schwarzkogel,,47.5053,15.3758,934 +OE/ST-294,Kulm,,47.5211,14.1247,918 +OE/ST-295,Buchkogel,,47.2703,15.8050,907 +OE/ST-296,Kreilkogel,,47.2606,15.7600,869 +OE/ST-297,Fresenkogel,,47.2697,15.7314,852 +OE/ST-298,Ringkogel,,47.2975,15.9514,789 +OE/ST-299,Fuerstenstand,,47.0903,15.3856,754 +OE/ST-300,Landschakogel,,47.2367,15.6222,726 +OE/ST-301,Wartbergkogel,,47.5217,15.4761,717 +OE/ST-302,Demmerkogel,,46.7858,15.4297,671 +OE/ST-303,Buchkogel,,47.0381,15.3750,656 +OE/ST-304,Platte,,47.1125,15.4700,651 +OE/ST-305,Hauenstein,,47.1258,15.4886,650 +OE/ST-306,Schmirnberg,,46.6303,15.4939,634 +OE/ST-307,Rosenkogel,,47.2139,15.7394,624 +OE/ST-308,Stradner Kogel,,46.8456,15.9317,609 +OE/ST-309,Gleichenberger Kogel,,46.8919,15.9083,598 +OE/ST-310,Lubekogel,,46.6789,15.5197,570 +OE/ST-311,Buchkogel,,46.8714,15.5075,550 +OE/ST-312,Buchberg,,47.2203,15.8028,532 +OE/ST-313,Urlkogel,,46.6958,15.5508,524 +OE/ST-314,Krebskogel,,46.6344,15.5331,516 +OE/ST-315,Kreuzkogel,,46.7892,15.5136,496 +OE/ST-316,Kranachberg,,46.7233,15.4939,496 +OE/ST-317,Salzerkogel,,46.6617,15.4147,494 +OE/ST-318,Huehnerberg,,46.9853,15.5364,484 +OE/ST-319,Schlossberg,,47.0767,15.4378,474 +OE/ST-320,Koenigsberg,,46.7856,15.9583,462 +OE/ST-321,Kapfensteiner Kogel,,46.8942,15.9753,461 +OE/ST-322,Grillkogel,,46.7475,15.4097,458 +OE/ST-323,Traubenberg,,46.9483,15.6136,452 +OE/ST-324,Koegelberg,,46.9389,15.5461,441 +OE/ST-325,Kleiner Takernberg,,47.0550,15.7650,431 +OE/ST-326,Stefansberg,,46.9097,15.6883,425 +OE/ST-327,Buchkogel,,46.7808,15.4908,410 +OE/ST-328,Rosenbichl,,46.8692,15.6042,408 +OE/ST-329,Rittscheinberg,,47.0050,16.0278,398 +OE/ST-330,Am Berner,,47.1797,16.0203,397 +OE/ST-331,Schiesslkogel,,46.9819,15.9803,389 +OE/ST-332,Edlmannkogel,,46.7500,15.5100,383 +OE/ST-333,Grosssteinberg,,46.9883,16.0906,360 +OE/ST-334,Hoechstein,,47.3467,13.7911,2543 +OE/ST-335,Rotmandlspitz,,47.2811,13.6725,2453 +OE/ST-336,Knarrnspitze,,47.2539,13.8819,2387 +OE/ST-337,Hochhaide,,47.4697,14.3992,2363 +OE/ST-338,Maierangerkogel,,47.3478,14.7139,2356 +OE/ST-339,Sinabell,,47.4461,13.6931,2349 +OE/ST-340,Schiedeck,,47.3117,13.6503,2339 +OE/ST-341,Grosse Kesselspitze,,47.3236,13.9133,2294 +OE/ST-342,Kruegerzinken,,47.3400,13.7011,2204 +OE/ST-343,Gsuchmauer,,47.5486,14.6672,2116 +OE/ST-344,Salzofen,,47.6819,13.9383,2070 +OE/ST-345,Schuettkogel,,47.4619,14.3197,2049 +OE/ST-346,Griesmauerkogel,,47.5511,14.9833,2034 +OE/ST-347,Riegerin,,47.6450,15.0672,1939 +OE/ST-348,Handalm,,46.8467,15.0200,1853 +OE/ST-349,Rossbachkogel,,47.2047,15.0436,1848 +OE/ST-350,Achnerkuchel,,47.4819,14.7592,1824 +OE/ST-351,Kuhalm,,47.0353,14.2503,1784 +OE/ST-352,Bocksruck,,47.2228,14.3931,1763 +OE/ST-353,Terenbachalm,,47.1911,14.9986,1734 +OE/ST-354,Ofnerkogel,,47.1219,14.9300,1666 +OE/ST-355,Rittisberg,,47.4186,13.5928,1565 +OE/ST-356,Schwarzkogel,,46.9039,15.0619,1550 +OE/ST-357,Freiberg,,47.1722,14.0769,1488 +OE/ST-358,Kletschachkogel,,47.4472,15.1311,1457 +OE/ST-359,Eisnerkogel,,47.6033,15.4336,1440 +OE/ST-360,Sauwand,,47.7453,15.3275,1420 +OE/ST-361,Hocheck,,47.6328,15.5450,1418 +OE/ST-362,Mitterbachkogel,,47.3797,15.5406,1401 +OE/ST-363,Patschaberg,,47.2806,15.6006,1271 +OE/ST-364,Hochtroetsch,,47.2603,15.3697,1239 +OE/ST-365,Schiffall,,47.3119,15.3400,1221 +OE/ST-366,Kulmberg,,47.4117,13.6553,1218 +OE/ST-367,Burgstaller Hoehe,,47.2294,15.5128,1218 +OE/ST-368,Tremmelberg,,47.2461,14.7878,1194 +OE/ST-369,Haderniggkogel,,46.6797,15.1294,1184 +OE/ST-370,Hochgoelk,,47.5272,15.5906,1176 +OE/ST-371,Gschieskogel,,47.2892,15.4117,1142 +OE/ST-372,Katerloch,,47.2528,15.5439,1088 +OE/ST-373,Buchwald,,47.4317,15.8536,1058 +OE/ST-374,Mitterberg,,47.5417,14.2617,1046 +OE/ST-375,Strossberg,,47.2475,15.5742,1039 +OE/ST-376,Raasberg,,47.2503,15.6600,1009 +OE/ST-377,Schartnerkogel,,47.1981,15.3047,931 +OE/ST-378,Emberg,,47.4364,15.2572,917 +OE/ST-379,Hochkogel,,47.1036,15.1372,794 +OE/ST-380,Parmaseggkogel,,47.2247,15.3139,785 +OE/ST-381,Steinkogel,,47.1047,15.3589,742 +OE/ST-382,Kreuzberg,,46.7100,15.4594,633 +OE/TI-001,Kleinglockner,,47.0742,12.6947,3770 +OE/TI-002,Wildspitze,,46.8853,10.8672,3768 +OE/TI-003,Grossvenediger,,47.1089,12.3461,3666 +OE/TI-004,Similaun,,46.7636,10.8806,3599 +OE/TI-005,Rainerhorn,,47.1008,12.3642,3559 +OE/TI-006,Zuckerhuetl,,46.9642,11.1539,3507 +OE/TI-007,Hohes Aderl,,47.1019,12.3503,3506 +OE/TI-008,Schwarze Wand,,47.1036,12.3700,3506 +OE/TI-009,Dreiherrnspitze,,47.0692,12.2406,3499 +OE/TI-010,Schrankogel,,47.0442,11.0989,3497 +OE/TI-011,Roetspitze,,47.0269,12.2050,3496 +OE/TI-012,Olperer,,47.0533,11.6589,3476 +OE/TI-013,Ruderhofspitze,,47.0397,11.1431,3474 +OE/TI-014,Kleinvenediger,,47.1167,12.3589,3471 +OE/TI-015,Wilder Pfaff,,46.9658,11.1644,3456 +OE/TI-016,Kreuzspitze,,46.8164,10.8700,3455 +OE/TI-017,Adlersruhe,,47.0706,12.7017,3451 +OE/TI-018,Hoher Zaun,,47.1000,12.3767,3451 +OE/TI-019,Wilder Freiger,,46.9706,11.1900,3418 +OE/TI-020,Hohe Geige,,47.0047,10.9086,3393 +OE/TI-021,Hoher Eichham,,47.0536,12.4064,3371 +OE/TI-022,Grosser Geiger,,47.0931,12.3086,3360 +OE/TI-023,Seikogel,,46.7983,10.8519,3355 +OE/TI-024,Stubaier Wildspitze,,46.9831,11.0997,3341 +OE/TI-025,Schaufelspitze,,46.9783,11.1158,3332 +OE/TI-026,Kristallwand,,47.0936,12.3994,3310 +OE/TI-027,Weissspitze,,47.0761,12.3933,3300 +OE/TI-028,Luesener Fernerkogel,,47.0967,11.1150,3298 +OE/TI-029,Habicht,,47.0439,11.2897,3277 +OE/TI-030,Hochschober,,46.9428,12.6981,3242 +OE/TI-031,Muntanitz,,47.0736,12.5889,3232 +OE/TI-032,Hoher Riffler,,47.0814,11.7042,3231 +OE/TI-033,Saeulkopf,,47.0483,12.4203,3209 +OE/TI-034,Gloedis,,46.9614,12.7258,3206 +OE/TI-035,Dreilaenderspitze,,46.8511,10.1450,3197 +OE/TI-036,Hoher Riffler,,47.1161,10.3711,3168 +OE/TI-037,Nederkogel,,46.9069,11.0089,3163 +OE/TI-038,Mittagskogel,,46.9333,10.8719,3159 +OE/TI-039,Schoenbichler Horn,,47.0086,11.7731,3134 +OE/TI-040,Totenkar Spitze,,46.9806,12.2044,3133 +OE/TI-041,Mittlere Guslarspitze,,46.8372,10.8244,3128 +OE/TI-042,Boeses Weibl,,46.9975,12.7228,3119 +OE/TI-043,Luibiskogel,,47.0494,10.9036,3110 +OE/TI-044,Lasoerling,,46.9758,12.3550,3098 +OE/TI-045,Wurmkogel,,46.8806,11.0858,3082 +OE/TI-046,Fundusfeiler,,47.1125,10.8703,3079 +OE/TI-047,Rauhkopf,,47.0458,12.4289,3070 +OE/TI-048,Gaislachkogel,,46.9422,10.9672,3056 +OE/TI-049,Gamsspitzl,,46.9789,11.2025,3050 +OE/TI-050,Nauderer Hennesiglspitze,,46.8644,10.6242,3042 +OE/TI-051,Festkogel,,46.8522,11.0511,3038 +OE/TI-052,Schere,,47.0600,12.6836,3037 +OE/TI-053,Parseierspitze,,47.1744,10.4783,3036 +OE/TI-054,Hexenkopf,,47.0211,10.4692,3035 +OE/TI-055,Buerkelkopf,,46.9897,10.3464,3032 +OE/TI-056,Wildes Mannle,,46.8744,10.8942,3023 +OE/TI-057,Seespitze,,46.9483,12.2736,3021 +OE/TI-058,Wildenkogel,,47.1039,12.4592,3021 +OE/TI-059,Hangerer,,46.8353,11.0181,3020 +OE/TI-060,Tschadinhorn,,46.9922,12.7089,3017 +OE/TI-061,Schwarzkogel,,46.9622,10.9386,3016 +OE/TI-062,Sulzkogel,,47.1819,11.0114,3016 +OE/TI-063,Hochreichkopf,,47.1706,10.9697,3010 +OE/TI-064,Furgler,,47.0403,10.5119,3004 +OE/TI-065,Zischgeles,,47.1317,11.0950,3004 +OE/TI-066,Kraxentrager,,47.0056,11.5900,2999 +OE/TI-067,Nussingkogel,,47.0517,12.5531,2989 +OE/TI-068,Rauher Kopf,,46.8650,10.7553,2989 +OE/TI-069,Hoerndle,,46.8486,10.9067,2985 +OE/TI-070,Ahornspitze,,47.1300,11.9178,2973 +OE/TI-071,Wildgrat,,47.1406,10.8264,2971 +OE/TI-072,Weisse Spitze,,46.8717,12.3581,2962 +OE/TI-073,Rote Spitze,,46.8764,12.3444,2956 +OE/TI-074,Kraspesspitze,,47.1806,11.0428,2954 +OE/TI-075,Hochgrabe,,46.8489,12.4214,2951 +OE/TI-076,Rotkogel,,46.9672,10.9492,2947 +OE/TI-077,Grosses Degenhorn,,46.8689,12.3928,2946 +OE/TI-078,Goelbner,,46.8244,12.5044,2943 +OE/TI-079,Seiter Schartle,,46.8928,10.9967,2932 +OE/TI-080,Hochgasser,,47.1506,12.5217,2922 +OE/TI-081,Schafgruebler,,47.1011,11.1603,2922 +OE/TI-082,Riegelkopf,,47.1333,12.5369,2920 +OE/TI-083,Gumriaul,,46.8167,12.5069,2918 +OE/TI-084,Gaensekragen,,47.0900,11.0397,2914 +OE/TI-085,Bergkastelspitze,,46.8467,10.5564,2912 +OE/TI-086,Goesleswand,,46.9794,12.2956,2912 +OE/TI-087,Grieskogel,,46.9906,10.9711,2911 +OE/TI-088,Schleinitz,,46.8956,12.7486,2904 +OE/TI-089,Grosser Troegler,,46.9956,11.1603,2902 +OE/TI-090,Rabenstein,,47.1319,12.5794,2902 +OE/TI-091,Grosser Landeggkopf,,47.1361,12.5664,2900 +OE/TI-092,Wetterspitze,,47.2061,10.3694,2895 +OE/TI-093,Regenstein,,46.8608,12.4903,2891 +OE/TI-094,Freispitze,,47.2006,10.4286,2884 +OE/TI-095,Rietzer Grieskogel,,47.2458,11.0592,2884 +OE/TI-096,Brennerspitze,,47.0839,11.2267,2877 +OE/TI-097,Greitspitze,,46.9700,10.3339,2871 +OE/TI-098,Schartenkopf,,47.1792,11.0300,2855 +OE/TI-099,Vorderes Kreuzjoch,,47.0311,10.4222,2845 +OE/TI-100,Amertaler Hoehe,,47.1278,12.5533,2841 +OE/TI-101,Kirchdach,,47.0672,11.3419,2840 +OE/TI-102,Roter Kogel,,47.1378,11.1692,2832 +OE/TI-103,Masnerkopf,,47.0125,10.4731,2828 +OE/TI-104,Pirchkogel,,47.2319,10.9989,2828 +OE/TI-105,Gaiskogel,,47.2039,11.0536,2820 +OE/TI-106,Valluela,,46.9375,10.1128,2813 +OE/TI-107,Piz Val Gronda,,46.9236,10.2908,2812 +OE/TI-108,Schoenleitenspitze,,46.9906,12.6897,2809 +OE/TI-109,Valluga,,47.1578,10.2133,2809 +OE/TI-110,Schartlkopf,,46.9000,10.5617,2808 +OE/TI-111,Bockstein,,46.8533,12.5353,2805 +OE/TI-112,Schlicker Seespitze,,47.1453,11.2731,2804 +OE/TI-113,Hochalmspitze,,46.8831,12.4578,2797 +OE/TI-114,Kugelspitze,,46.8678,12.4839,2796 +OE/TI-115,Vorderer Sulzkogel,,47.0400,11.0625,2796 +OE/TI-116,Gruenbergspitze,,47.1739,11.5469,2790 +OE/TI-117,Obernberger-Tribulaun,,46.9892,11.3758,2780 +OE/TI-118,Gaisspitze,,46.9911,10.1831,2779 +OE/TI-119,Hohe Aifner Spitze,,47.1044,10.7314,2779 +OE/TI-120,Grosser Zunig,,46.9558,12.5153,2776 +OE/TI-121,Muttekopf,,47.2672,10.6517,2774 +OE/TI-122,Riepenspitze,,46.8478,12.2967,2774 +OE/TI-123,Hoher Gemeindekopf,,47.1308,10.8167,2771 +OE/TI-124,Grosse Sandspitze,,46.7667,12.8117,2770 +OE/TI-125,Murmentenkarspitze,,47.1519,10.8297,2770 +OE/TI-126,Hochplattig,,47.3531,10.9883,2768 +OE/TI-127,Weisses Beil,,46.9367,12.3092,2766 +OE/TI-128,Rotes Ginggele,,46.8419,12.3706,2763 +OE/TI-129,Rastkogel,,47.2044,11.7511,2762 +OE/TI-130,Rotenkogel,,46.9803,12.5989,2762 +OE/TI-131,Birkkarspitze,,47.4114,11.4375,2749 +OE/TI-132,Malgruebler,,47.2006,11.5883,2749 +OE/TI-133,Kreuzspitze,,47.1853,11.5364,2746 +OE/TI-134,Hochkreuzspitze,,46.8736,12.2756,2739 +OE/TI-135,Kuchenjoechli,,47.0544,10.2233,2730 +OE/TI-136,Kesselspitze,,47.1008,11.3647,2728 +OE/TI-137,Grosser Bettelwurf,,47.3444,11.5197,2726 +OE/TI-138,Hirzer,,47.2178,11.6631,2725 +OE/TI-139,Schmalzkopf,,46.9311,10.5353,2724 +OE/TI-140,Hochwand,,47.3586,11.0156,2719 +OE/TI-141,Serles,,47.1239,11.3814,2717 +OE/TI-142,Spitzkofel,,46.7725,12.7428,2717 +OE/TI-143,Stanzling,,46.9439,12.4981,2715 +OE/TI-144,Rotstein,,46.8561,12.6022,2702 +OE/TI-145,Brandberger Kolm,,47.1725,11.9622,2700 +OE/TI-146,Grosse Kinigat,,46.6756,12.5242,2689 +OE/TI-147,Vertineskopf,,47.0003,10.1950,2685 +OE/TI-148,Pfannspitze,,46.6806,12.5019,2678 +OE/TI-149,Glungezer,,47.2078,11.5286,2677 +OE/TI-150,Kleine Kinigat,,46.6786,12.5158,2674 +OE/TI-151,Ballunspitze,,46.9553,10.1350,2671 +OE/TI-152,Weisslachberg,,46.8064,12.4950,2671 +OE/TI-153,Eisenreich,,46.6875,12.4689,2665 +OE/TI-154,Toblacher Pfannhorn,,46.7828,12.2844,2663 +OE/TI-155,Torspitze,,47.1803,11.6722,2663 +OE/TI-156,Lavantegg,,46.8517,12.6131,2658 +OE/TI-157,Krottenkopf,,47.3117,10.3561,2656 +OE/TI-158,Hohe Mut,,46.8486,11.0306,2653 +OE/TI-159,Speikboden,,46.9458,12.4183,2653 +OE/TI-160,Hohes Licht,,47.2800,10.2761,2651 +OE/TI-161,Kogelseespitze,,47.2478,10.5650,2647 +OE/TI-162,Rosskogel,,47.2231,11.1528,2646 +OE/TI-163,Predigberg,,46.9561,10.2147,2645 +OE/TI-164,Maedelegabel,,47.2997,10.2956,2644 +OE/TI-165,Hippoldspitze,,47.1978,11.6681,2642 +OE/TI-166,Neunerkogel,,47.2003,11.0331,2640 +OE/TI-167,Schoenbergspitze,,46.8453,12.6233,2640 +OE/TI-168,–stliche Praxmarerkarspitze,,47.3514,11.4036,2638 +OE/TI-169,Breitlehnjoechl,,47.0264,10.9033,2637 +OE/TI-170,Kleiner Solstein,,47.3025,11.3242,2637 +OE/TI-171,Mittagspitze,,47.1283,10.3842,2635 +OE/TI-172,Schoentalhoehe,,46.6897,12.4533,2635 +OE/TI-173,Niederl,,46.9942,11.2089,2629 +OE/TI-174,Partenkirchener Dreitorspitze,,47.4081,11.1239,2626 +OE/TI-175,Kreuzspitze,,46.8292,12.3128,2624 +OE/TI-176,Mislkopf,,47.1569,11.5186,2623 +OE/TI-177,Grafennsspitze,,47.2106,11.6647,2619 +OE/TI-178,Mittagskopf,,47.0461,10.7197,2616 +OE/TI-179,Gaishoerndl,,46.7917,12.2808,2615 +OE/TI-180,Laserzwand,,46.7728,12.8011,2614 +OE/TI-181,Parzinnspitze,,47.2392,10.5758,2613 +OE/TI-182,Brunnkarspitze,,47.2497,10.6261,2609 +OE/TI-183,Bretterspitze,,47.3331,10.4617,2608 +OE/TI-184,Morgenkogel,,47.1875,11.5086,2607 +OE/TI-185,Stallkogel,,47.0872,10.8069,2605 +OE/TI-186,Rosskopf,,46.6856,12.5006,2603 +OE/TI-187,Schafseitenspitze,,47.1028,11.5542,2602 +OE/TI-188,Biberkopf,,47.2703,10.2322,2600 +OE/TI-189,Porze,,46.6517,12.5692,2599 +OE/TI-190,Haneburger,,47.2122,11.5847,2596 +OE/TI-191,Zwoelferkopf,,47.0725,10.5764,2596 +OE/TI-192,Rauchegg,,46.8000,12.4847,2594 +OE/TI-193,Hochvogel,,47.3806,10.4367,2592 +OE/TI-194,Hohe Munde,,47.3467,11.0819,2592 +OE/TI-195,Demut,,46.6903,12.4461,2591 +OE/TI-196,Eggenkofel,,46.7389,12.6778,2591 +OE/TI-197,Wetterkreuzkogel,,47.2053,10.9497,2591 +OE/TI-198,Stierkopf,,47.1778,10.4136,2589 +OE/TI-199,Laliderer Spitze,,47.3914,11.5000,2588 +OE/TI-200,Hochspitz,,46.6575,12.6683,2581 +OE/TI-201,Hollbrucker Spitze,,46.6992,12.4269,2580 +OE/TI-202,Kaskarspitze,,47.3472,11.4194,2580 +OE/TI-203,Ruitelspitze,,47.2556,10.4461,2580 +OE/TI-204,Poschachkogel,,47.1472,10.9750,2574 +OE/TI-205,Hochzeiger,,47.1456,10.7944,2560 +OE/TI-206,Pleiskopf,,47.2528,10.6528,2560 +OE/TI-207,Vordere Brandjochspitze,,47.3028,11.3417,2559 +OE/TI-208,Gorfenspitze,,46.9556,10.1750,2558 +OE/TI-209,Kreuzjoch,,47.2517,11.9825,2558 +OE/TI-210,Seirloecherkogel,,47.0333,10.8472,2557 +OE/TI-211,Hanauer Spitze,,47.2339,10.6047,2553 +OE/TI-212,Namloser Wetterspitze,,47.3233,10.6417,2553 +OE/TI-213,Wildofen,,47.2250,11.6739,2553 +OE/TI-214,Ellbogner Spitze,,47.2650,10.2722,2552 +OE/TI-215,Tullenkogel,,46.8169,12.5842,2552 +OE/TI-216,Hornischegg,,46.7008,12.4139,2550 +OE/TI-217,Pezinerspitze,,47.1017,10.4411,2550 +OE/TI-218,Hochnissl,,47.3672,11.6183,2547 +OE/TI-219,Bielerspitze,,46.9278,10.0986,2545 +OE/TI-220,Maldongrat,,47.2817,10.6747,2544 +OE/TI-221,Grosser Solstein,,47.3028,11.3078,2541 +OE/TI-222,Weittalspitze,,46.7497,12.7661,2539 +OE/TI-223,Hochgruben,,46.7061,12.4100,2537 +OE/TI-224,Oestliche Karwendelspitze,,47.4447,11.4217,2537 +OE/TI-225,Blosse,,47.1817,10.8475,2536 +OE/TI-226,Kreuzjoechl,,47.1322,11.5981,2536 +OE/TI-227,Katzenkopf,,47.2750,11.9864,2535 +OE/TI-228,Mooskopf,,47.0136,10.7650,2532 +OE/TI-229,Wildkarlegg,,46.6589,12.5514,2532 +OE/TI-230,Muttakopf,,46.9697,10.4467,2525 +OE/TI-231,Steinkarspitz,,46.6569,12.6908,2524 +OE/TI-232,Boeses Weibele,,46.8350,12.6503,2521 +OE/TI-233,Wamperter Schrofen,,47.3544,10.9144,2520 +OE/TI-234,Erster Karkopf,,47.1781,10.8706,2513 +OE/TI-235,Rosskarspitze,,46.6575,12.5589,2511 +OE/TI-236,Lamsenspitze,,47.3828,11.5911,2508 +OE/TI-237,Gilfert,,47.2681,11.7431,2506 +OE/TI-238,Mitterhorn,,47.5494,12.6286,2506 +OE/TI-239,Elferspitze,,47.0825,11.3128,2505 +OE/TI-240,Marchkopf,,47.2511,11.8061,2499 +OE/TI-241,Rifflerkogel,,47.2644,11.9725,2494 +OE/TI-242,Schoenjoechl,,47.0775,11.5989,2493 +OE/TI-243,Wannig,,47.3369,10.8622,2493 +OE/TI-244,Hoher Gleirsch,,47.3611,11.3561,2492 +OE/TI-245,Hauerkogel,,47.0653,10.9358,2491 +OE/TI-246,Grosse Gamswiesenspitze,,46.7664,12.7831,2486 +OE/TI-247,Zietenkopf,,46.8053,12.9439,2483 +OE/TI-248,Elmer Kreuzspitze,,47.3458,10.5914,2480 +OE/TI-249,Kemacher,,47.3128,11.3669,2480 +OE/TI-250,Rauher Kopf,,46.9892,10.2819,2478 +OE/TI-251,Hochegg,,46.6936,12.5344,2477 +OE/TI-252,Loreakopf,,47.3542,10.7714,2471 +OE/TI-253,Breitenkopf,,47.3617,10.9872,2469 +OE/TI-254,Karkopf,,47.3553,11.0275,2469 +OE/TI-255,Ochsenkopf,,47.2753,12.0786,2469 +OE/TI-256,Klimmspitze,,47.3519,10.5061,2464 +OE/TI-257,Bschlaber Kreuzspitze,,47.3317,10.5914,2462 +OE/TI-258,Silberspitze,,47.1842,10.5722,2461 +OE/TI-259,Filmoorhoehe,,46.6678,12.5336,2457 +OE/TI-260,Rumer Spitze,,47.3206,11.4261,2454 +OE/TI-261,Rossgrubenkofel,,47.0219,11.5472,2450 +OE/TI-262,Schafsiedel,,47.3144,12.1142,2447 +OE/TI-263,Kroendlhorn,,47.2986,12.1650,2444 +OE/TI-264,Wimbachkopf,,47.2550,11.8172,2442 +OE/TI-265,Bentlstein,,47.1033,11.5222,2436 +OE/TI-266,Hochrast,,46.7750,12.3578,2436 +OE/TI-267,Goisele,,46.8853,12.7775,2433 +OE/TI-268,Helm,,46.7150,12.3872,2433 +OE/TI-269,Baerenbadegg,,46.6561,12.6036,2431 +OE/TI-270,Muttekopf,,47.2750,10.3083,2431 +OE/TI-271,Gatterspitze,,46.6981,12.4814,2430 +OE/TI-272,Galtenberg,,47.3367,11.9761,2424 +OE/TI-273,Peischelspitze,,47.2383,10.3464,2424 +OE/TI-274,Achplatte,,47.1889,10.9383,2423 +OE/TI-275,Kraxentrager,,47.2403,11.7961,2423 +OE/TI-276,Reiterkarspitze,,46.6619,12.6308,2422 +OE/TI-277,Mutenkogel,,47.1964,11.0839,2420 +OE/TI-278,Wanglspitze,,47.1844,11.7753,2420 +OE/TI-279,Sonnenspitze,,47.3683,10.9217,2417 +OE/TI-280,Gamskofel,,46.6531,12.6506,2415 +OE/TI-281,Thurntaler,,46.7744,12.3828,2408 +OE/TI-282,Erlspitze,,47.3200,11.2856,2405 +OE/TI-283,Schaflegerkogel,,47.1547,11.2372,2405 +OE/TI-284,Kappler Kopf,,47.0608,10.3256,2404 +OE/TI-285,Saile,,47.1922,11.3250,2404 +OE/TI-286,Rothorn,,47.5528,12.6136,2403 +OE/TI-287,Rosskoepfe,,47.2089,10.9406,2399 +OE/TI-288,Die Mute,,47.2006,11.0178,2398 +OE/TI-289,Thialkopf,,47.1044,10.5536,2398 +OE/TI-290,Grueblspitze,,47.1575,11.6931,2395 +OE/TI-291,Peilspitze,,47.1028,11.3906,2392 +OE/TI-292,Sechszeiger (Leiner Koegele),,47.1661,10.7836,2392 +OE/TI-293,Westliche Karwendelspitze,,47.4300,11.2989,2385 +OE/TI-294,Rauhegg,,47.3444,10.3681,2384 +OE/TI-295,Knittelkarspitze,,47.3758,10.6508,2376 +OE/TI-296,Tamerlanhoehe,,46.7464,12.6478,2376 +OE/TI-297,Kesselhoehe,,46.6653,12.6147,2375 +OE/TI-298,Reither Spitze,,47.3233,11.2361,2374 +OE/TI-299,Hohe Warte,,47.1742,10.9403,2372 +OE/TI-300,Tschirgant,,47.2419,10.7969,2370 +OE/TI-301,Gehrenspitze,,47.3867,11.1353,2367 +OE/TI-302,Muttlerkopf,,47.3144,10.3417,2366 +OE/TI-303,Roter Stein,,47.3822,10.7731,2366 +OE/TI-304,Geissstein,,47.3375,12.4953,2363 +OE/TI-305,Wannenspitze,,47.2756,10.4881,2362 +OE/TI-306,Lichtspitze,,47.3000,10.5292,2356 +OE/TI-307,Metzen,,47.2261,11.0861,2355 +OE/TI-308,Steinfalk,,47.4272,11.5122,2347 +OE/TI-309,Kleines Schoeberl,,46.8814,12.7328,2345 +OE/TI-310,Ellmauer Halt,,47.5617,12.3025,2344 +OE/TI-311,Kellerjoch,,47.3178,11.7681,2344 +OE/TI-312,Muttenkopf,,46.9642,10.8561,2344 +OE/TI-313,Sumpfkopf,,47.0867,11.5369,2341 +OE/TI-314,Thaneller,,47.4264,10.7244,2341 +OE/TI-315,Daniel,,47.4325,10.8803,2340 +OE/TI-316,Hafelekarspitze,,47.3131,11.3864,2334 +OE/TI-317,Ackerlspitze,,47.5592,12.3469,2329 +OE/TI-318,Kastenwendenkopf,,47.2731,12.0458,2329 +OE/TI-319,Laaggers,,47.2350,10.6789,2328 +OE/TI-320,Hoher Boesring,,46.6867,12.5792,2324 +OE/TI-321,Sunntigerspitze,,47.3647,11.4814,2321 +OE/TI-322,Handschuhspitze,,47.3403,10.8825,2319 +OE/TI-323,Gleirschspitze,,47.3158,11.3983,2317 +OE/TI-324,Golzentipp,,46.7344,12.6036,2317 +OE/TI-325,Kapall,,47.1486,10.2489,2315 +OE/TI-326,Koenigsleiten,,47.2614,12.0894,2315 +OE/TI-327,Spitzkoefele,,46.6753,12.6122,2314 +OE/TI-328,Kirchspitze,,47.1914,12.0431,2312 +OE/TI-329,Egger Muttekopf,,47.3231,10.6075,2311 +OE/TI-330,Schartenkogel,,47.2194,11.5367,2311 +OE/TI-331,Grosse Beil,,47.3414,12.0269,2309 +OE/TI-332,Leitnerberg,,47.0419,11.4172,2309 +OE/TI-333,Narrenkogel,,47.1378,10.9586,2309 +OE/TI-334,Rauher Kopf (Flaurling),,47.2503,11.1347,2308 +OE/TI-335,Viggarspitze,,47.2136,11.4992,2306 +OE/TI-336,Rosskopf,,47.0517,10.8322,2305 +OE/TI-337,Vorderer Drachenkopf,,47.3578,10.9264,2302 +OE/TI-338,Padasterkogel,,47.0725,11.3656,2301 +OE/TI-339,Hochiss,,47.4586,11.7647,2299 +OE/TI-340,Engelspitze,,47.3469,10.6928,2291 +OE/TI-341,Brand,,47.1256,10.9878,2283 +OE/TI-342,Schoberkoepfl,,46.8792,12.7864,2281 +OE/TI-343,Mutzeiger,,47.1811,10.8269,2277 +OE/TI-344,Leilachspitze,,47.4386,10.5461,2274 +OE/TI-345,Sinnesjoch,,47.3028,10.7756,2273 +OE/TI-346,Glasfelderkopf,,47.4028,10.4314,2271 +OE/TI-347,Kuhmoeser,,47.3100,11.7714,2264 +OE/TI-348,Isskogel,,47.2483,12.0131,2263 +OE/TI-349,Rotwand,,47.3269,10.5633,2262 +OE/TI-350,Rofanspitze,,47.4575,11.7933,2259 +OE/TI-351,Alpleskopf,,47.3167,10.7733,2258 +OE/TI-352,Karspitze,,47.2411,11.9614,2257 +OE/TI-353,Wetterkreuzspitze,,47.2775,11.8056,2256 +OE/TI-354,Rote Wand,,47.2492,11.6478,2252 +OE/TI-355,Rosslaufspitze,,47.2392,11.7242,2248 +OE/TI-356,Gaishorn,,47.4697,10.4761,2247 +OE/TI-357,Hochschrutte,,47.4450,10.8419,2247 +OE/TI-358,Patscherkofel,,47.2089,11.4608,2246 +OE/TI-359,Blaser,,47.1064,11.4117,2241 +OE/TI-360,Rauhhorn,,47.4583,10.4678,2241 +OE/TI-361,Sagtalerspitze,,47.3339,11.9331,2241 +OE/TI-362,Koellenspitze,,47.4989,10.6303,2238 +OE/TI-363,Pleisen,,47.1925,11.2806,2236 +OE/TI-364,Jochspitze,,47.3544,10.3836,2232 +OE/TI-365,Padauner Berg,,47.0225,11.5286,2230 +OE/TI-366,Filzenkogel,,47.1319,11.8828,2227 +OE/TI-367,Schwarzhanskarspitze,,47.4050,10.6131,2227 +OE/TI-368,Joechlspitze,,47.2817,10.3592,2226 +OE/TI-369,Bleispitze,,47.3983,10.8183,2225 +OE/TI-370,Gampelkopf,,47.1700,10.6711,2225 +OE/TI-371,Haermelekopf,,47.3267,11.2308,2224 +OE/TI-372,Vorderes Sonnwendjoch,,47.4447,11.8011,2224 +OE/TI-373,Venet,,47.1506,10.6672,2223 +OE/TI-374,Gedrechter,,47.2667,11.8281,2217 +OE/TI-375,Schlierewand,,47.3633,10.7089,2217 +OE/TI-376,Kleiner Rettenstein,,47.3369,12.3419,2216 +OE/TI-377,Sandegg,,47.3594,10.7011,2216 +OE/TI-378,Steinbergstein,,47.3417,12.1903,2215 +OE/TI-379,Largoz,,47.2417,11.5925,2214 +OE/TI-380,Birkhahnkopf,,46.9592,10.1411,2213 +OE/TI-381,Steinermandl,,46.8764,12.7922,2213 +OE/TI-382,Hahnleskopf,,47.2286,10.3156,2210 +OE/TI-383,Wankspitze,,47.3378,10.9389,2209 +OE/TI-384,Schusterkogel,,47.3492,12.4989,2207 +OE/TI-385,Spitzmandl,,47.1967,11.3333,2206 +OE/TI-386,Vorderer Sonnenkogel,,47.2486,10.3947,2204 +OE/TI-387,Kohlbergspitze,,47.4378,10.7997,2202 +OE/TI-388,Laempersberg,,47.3558,12.0253,2202 +OE/TI-389,Mutkopf,,47.1883,10.8264,2200 +OE/TI-390,Wenderkogel,,47.1272,10.9017,2200 +OE/TI-391,Grosse Arnspitze,,47.3972,11.2222,2196 +OE/TI-392,Guffertspitze,,47.5464,11.7886,2194 +OE/TI-393,Hoellkopf,,47.3419,10.9181,2194 +OE/TI-394,Hochalmkreuz,,47.4242,11.4283,2192 +OE/TI-395,Faltegartenkoepfl,,47.2439,10.9597,2184 +OE/TI-396,Steinkarspitze,,47.3864,10.6633,2181 +OE/TI-397,Brunnensteinspitze,,47.4056,11.2872,2180 +OE/TI-398,Ultenspitze,,47.0544,11.5475,2179 +OE/TI-399,Gamshag,,47.3647,12.4678,2178 +OE/TI-400,Pitzenegg,,47.4431,10.8236,2174 +OE/TI-401,Matonkopf,,47.0067,10.6381,2168 +OE/TI-402,Gehrenspitze,,47.5003,10.6553,2163 +OE/TI-403,Oefelerjoch,,47.2519,11.8381,2162 +OE/TI-404,Grasleitkopf,,47.3006,12.2642,2158 +OE/TI-405,Grieskogel,,47.1881,11.2450,2158 +OE/TI-406,Seehorn,,47.5450,12.5994,2155 +OE/TI-407,Ochsenkopf,,47.0539,10.7075,2153 +OE/TI-408,Rauher Kopf (Schmirn),,47.0742,11.5839,2150 +OE/TI-409,Tschamatschkopf,,46.9989,10.2925,2145 +OE/TI-410,Grosser Gamsstein,,47.2822,11.7481,2142 +OE/TI-411,Allerleigrubenspitze,,46.9942,11.4236,2131 +OE/TI-412,Maurerkogel,,47.3239,12.4700,2129 +OE/TI-413,Bischof,,47.4053,12.5117,2127 +OE/TI-414,Wiedersberger Horn,,47.3611,11.9233,2127 +OE/TI-415,Laerchegg,,47.5689,12.3517,2123 +OE/TI-416,Wildseeloder,,47.4319,12.5314,2118 +OE/TI-417,Sattelberg,,47.0111,11.4792,2115 +OE/TI-418,Staffkogel,,47.3814,12.4981,2115 +OE/TI-419,Nonsjoechl,,47.2725,11.7225,2112 +OE/TI-420,Scheffauer,,47.5572,12.2417,2111 +OE/TI-421,Pleisspitze,,47.3956,10.6011,2109 +OE/TI-422,Rote Flueh,,47.4997,10.6086,2108 +OE/TI-423,Mondscheinspitze,,47.4661,11.6133,2106 +OE/TI-424,Pfriemeswand,,47.2014,11.3278,2103 +OE/TI-425,Scharfreiter,,47.5089,11.4875,2102 +OE/TI-426,Stanser Joch,,47.3994,11.6986,2102 +OE/TI-427,Grosser Tanzkogel,,47.3350,12.2561,2097 +OE/TI-428,Hamberg,,47.3253,11.9094,2096 +OE/TI-429,Simmering,,47.2781,10.8667,2096 +OE/TI-430,Sonntagskoepfl,,47.1667,11.2631,2096 +OE/TI-431,Penken,,47.1689,11.7997,2095 +OE/TI-432,Tristkogel,,47.3681,12.4764,2095 +OE/TI-433,Mahnkopf,,47.4122,11.5078,2094 +OE/TI-434,Zirmeskoepfle,,47.0283,10.6808,2092 +OE/TI-435,Sulzspitze,,47.4622,10.5364,2084 +OE/TI-436,Hochunnutz,,47.5200,11.7361,2075 +OE/TI-437,Schochenspitze,,47.4525,10.5242,2069 +OE/TI-438,Ederplan,,46.8258,12.8958,2062 +OE/TI-439,Sonnspitze,,47.3961,12.5044,2062 +OE/TI-440,Seefelder Joch,,47.3403,11.2397,2060 +OE/TI-441,Gr. Schlicke,,47.5183,10.6233,2059 +OE/TI-442,Niedere Munde,,47.3547,11.0458,2059 +OE/TI-443,Hochstein,,46.8239,12.6928,2057 +OE/TI-444,Kuhkaser,,47.3372,12.4469,2054 +OE/TI-445,Seekarspitze,,47.4792,11.6825,2053 +OE/TI-446,Schoenbichl,,47.0236,11.7850,2049 +OE/TI-447,Arbiskogel,,47.2058,12.0428,2048 +OE/TI-448,Saeuling,,47.5353,10.7556,2048 +OE/TI-449,Ponten,,47.4856,10.4511,2045 +OE/TI-450,Spielberghorn,,47.4322,12.6322,2044 +OE/TI-451,Hoenig,,47.3936,10.7417,2034 +OE/TI-452,Brechhorn,,47.3781,12.2664,2032 +OE/TI-453,Schwarzkogel,,47.3686,12.3439,2030 +OE/TI-454,Saalkogel,,47.3778,12.4825,2006 +OE/TI-455,Zweitausender,,47.3236,12.3497,2004 +OE/TI-456,Weisslehnkopf,,47.3906,11.2017,2002 +OE/TI-457,Brentenjoch,,47.5322,10.5822,2000 +OE/TI-458,Krinnenspitze,,47.4742,10.5856,2000 +OE/TI-459,Spieleckkogel,,47.3906,12.5236,1998 +OE/TI-460,Pyramidenspitze,,47.6103,12.2767,1997 +OE/TI-461,Kitzbueheler Horn,,47.4761,12.4303,1996 +OE/TI-462,Alpkogel,,46.9733,10.1392,1995 +OE/TI-463,Kuhberg,,47.0067,11.5253,1992 +OE/TI-464,Baerenkopf,,47.4144,11.7119,1991 +OE/TI-465,Schwaigberghorn,,47.3717,12.0875,1990 +OE/TI-466,Juifen,,47.5433,11.6258,1988 +OE/TI-467,Grossmutzkopf,,46.8628,10.4919,1987 +OE/TI-468,Aggenstein,,47.5369,10.5572,1986 +OE/TI-469,Gaichtspitze,,47.4658,10.6397,1986 +OE/TI-470,Hinteres Sonnwendjoch,,47.5986,11.9497,1986 +OE/TI-471,Breiteggern,,47.3664,12.0797,1981 +OE/TI-472,Steinbergkogel,,47.4022,12.3669,1972 +OE/TI-473,Haller Zunterkopf,,47.3194,11.4844,1966 +OE/TI-474,Joelspitze,,47.3717,12.0019,1964 +OE/TI-475,Abendspitze,,47.3983,10.6867,1962 +OE/TI-476,Wildkarspitze,,47.3606,12.0786,1961 +OE/TI-477,Ebner Joch,,47.4256,11.7739,1957 +OE/TI-478,Gampenkogel,,47.4050,12.2658,1957 +OE/TI-479,Laeuferspitze,,47.5103,10.5978,1956 +OE/TI-480,Sefenspitze,,47.5169,10.5903,1948 +OE/TI-481,Kirchbergkoepfl,,47.2811,11.3022,1943 +OE/TI-482,Rosskogel,,47.4669,11.8272,1940 +OE/TI-483,Walchererhoehe,,47.1547,10.3044,1940 +OE/TI-484,Rangger Koepfl,,47.2428,11.1814,1939 +OE/TI-485,Hahnenkamm,,47.4783,10.6419,1938 +OE/TI-486,Pengelstein,,47.3908,12.3483,1938 +OE/TI-487,Schoenbichlkopf,,47.3558,10.7436,1938 +OE/TI-488,Talsenhoehe,,47.3514,12.3644,1928 +OE/TI-489,Sonntagsspitze,,47.5100,11.6458,1926 +OE/TI-490,Feldalphorn,,47.3853,12.0847,1923 +OE/TI-491,Karstein,,47.4553,12.4872,1922 +OE/TI-492,Steinernes Mandl,,47.3617,12.0350,1920 +OE/TI-493,Hechenberg,,47.2775,11.3061,1912 +OE/TI-494,Jungfrau,,47.4744,12.6858,1910 +OE/TI-495,Rauchkofel,,46.7992,12.7822,1910 +OE/TI-496,Gacher Blick,,47.3419,10.9806,1909 +OE/TI-497,Steinmandl,,47.3633,10.5786,1909 +OE/TI-498,Hartkaserhoehe,,47.3156,12.3636,1900 +OE/TI-499,Kreuzjoechl,,47.5114,10.8689,1900 +OE/TI-500,Gratlspitze,,47.4150,11.9475,1899 +OE/TI-501,Rauher Kopf,,47.3758,10.9261,1898 +OE/TI-502,Schatzberg,,47.3903,11.9844,1898 +OE/TI-503,Baerenbadkogel,,47.3406,12.3811,1883 +OE/TI-504,Spiessnaegel,,47.3558,12.3075,1880 +OE/TI-505,Waldraster Joechl,,47.1372,11.4069,1878 +OE/TI-506,Oberer Geierkopf,,47.3267,10.8542,1869 +OE/TI-507,Steinplatte,,47.6039,12.5778,1869 +OE/TI-508,Breiteggspitze,,47.3536,12.0725,1868 +OE/TI-509,Einstein,,47.5222,10.5136,1866 +OE/TI-510,Halserspitze,,47.5914,11.7808,1863 +OE/TI-511,Koflerjoch,,47.5228,10.7622,1863 +OE/TI-512,Vorderskopf,,47.4969,11.4375,1858 +OE/TI-513,Tauern,,47.4678,10.7622,1841 +OE/TI-514,Stronachkogel,,46.8444,12.8769,1831 +OE/TI-515,Vilser Kegel,,47.5303,10.6214,1831 +OE/TI-516,Weisse Wand,,47.1189,11.4203,1830 +OE/TI-517,Hohe Salve,,47.4650,12.2044,1828 +OE/TI-518,Feldberg,,47.5922,12.3239,1813 +OE/TI-519,Hochplatte,,47.5281,11.6500,1813 +OE/TI-520,Schinder,,47.6017,11.8611,1808 +OE/TI-521,Stripsenkopf,,47.5819,12.3083,1807 +OE/TI-522,Ehrenbachhoehe,,47.4183,12.3594,1802 +OE/TI-523,Schledererkopf,,47.3878,12.2669,1802 +OE/TI-524,Lochgehrenkopf,,47.4753,10.5311,1790 +OE/TI-525,Joechle,,47.3233,10.9283,1786 +OE/TI-526,Hornkoepfl,,47.4672,12.4331,1773 +OE/TI-527,Unterberghorn,,47.6206,12.4364,1773 +OE/TI-528,Gaisberg,,47.4264,12.2869,1770 +OE/TI-529,Sunntigkoepfl,,47.3297,11.2586,1765 +OE/TI-530,Fellhorn,,47.6100,12.5089,1764 +OE/TI-531,Laubkogel,,47.3994,12.4656,1760 +OE/TI-532,Christlumkopf,,47.5033,11.6611,1758 +OE/TI-533,Brunnerkogel,,47.4336,12.4625,1749 +OE/TI-534,Heuberg,,47.5119,11.9558,1746 +OE/TI-535,Peterskoepfl,,47.6092,12.2467,1745 +OE/TI-536,Hochetzkogel,,47.4436,12.4511,1738 +OE/TI-537,Hochmahdkopf,,47.3194,11.4986,1738 +OE/TI-538,Rosskopf,,47.4256,12.0706,1731 +OE/TI-539,Buerglkopf,,47.4314,12.5936,1730 +OE/TI-540,Schelleleskopf,,47.4844,10.7922,1722 +OE/TI-541,Muehlwaldkoepfl (Gartigkoepfl),,47.4058,10.7967,1719 +OE/TI-542,Gampenkoepfle,,47.3319,10.8894,1711 +OE/TI-543,Kirchl,,47.4969,12.6275,1691 +OE/TI-544,Schoenkahler,,47.5403,10.4886,1688 +OE/TI-545,Kirchberg,,47.5378,12.5353,1678 +OE/TI-546,Schoenjoechl,,47.4953,10.8592,1661 +OE/TI-547,Turmkogel,,47.4067,12.0692,1648 +OE/TI-548,Koeglhoerndl,,47.5497,12.0589,1645 +OE/TI-549,Schachtkopf,,47.3633,10.8994,1642 +OE/TI-550,Sorgschrofen,,47.5558,10.4542,1636 +OE/TI-551,Scheibenkogel,,47.6092,12.3497,1614 +OE/TI-552,Heuberg,,47.6194,12.3094,1603 +OE/TI-553,Spitzstein,,47.7106,12.2467,1598 +OE/TI-554,Lahnerkogel,,47.6283,12.5197,1595 +OE/TI-555,Mittagskogel,,47.5103,12.1511,1595 +OE/TI-556,Steinwurfkogel,,47.6250,12.4992,1588 +OE/TI-557,Rauher Kopf,,47.4744,12.3089,1580 +OE/TI-558,Altenbergkopf,,47.5050,10.8278,1574 +OE/TI-559,Pendling,,47.5714,12.1089,1563 +OE/TI-560,Hartkaser,,47.4919,12.2719,1553 +OE/TI-561,Karkopf,,47.6900,12.3397,1510 +OE/TI-562,Voldoeppberg,,47.4744,11.8878,1509 +OE/TI-563,Kalkstein,,47.5308,12.4844,1506 +OE/TI-564,Gruenberg,,47.2817,10.9147,1497 +OE/TI-565,Schneebichl,,47.5936,12.3572,1470 +OE/TI-566,Buchensteinwand,,47.4842,12.5836,1462 +OE/TI-567,Kragenjoch,,47.4506,12.0203,1425 +OE/TI-568,Kranzhorn,,47.7006,12.1842,1368 +OE/TI-569,Reisenbergkoepfl,,47.4764,12.4697,1362 +OE/TI-570,Brennkopf,,47.6750,12.3100,1353 +OE/TI-571,Wetterfahne,,47.6828,12.3775,1284 +OE/TI-572,Gscheuerkopf,,47.5458,12.3944,1280 +OE/TI-573,Horauer Spitze,,47.6636,12.3503,1117 +OE/TI-574,Hochkogel,,47.4744,12.5100,1066 +OE/TI-575,Rettenberg,,47.4831,12.3569,876 +OE/TI-576,Grosser Loeffler,,47.0325,11.9156,3379 +OE/TI-577,Rauchkofel,,47.0756,12.0917,3251 +OE/TI-578,Alplesspitze,,46.9578,12.2603,3149 +OE/TI-579,Zwieselbacher Rosskogel,,47.1628,11.0475,3081 +OE/TI-580,Bischofspitze,,46.8694,10.2303,3029 +OE/TI-581,Zwoelferkogel,,47.1900,11.0106,2988 +OE/TI-582,Flimspitze,,46.9819,10.3433,2929 +OE/TI-583,Innerer Knorrkogel,,47.1017,12.4197,2882 +OE/TI-584,Schneefernerkopf,,47.4094,10.9700,2874 +OE/TI-585,Kesseltoerl,,47.1261,12.3947,2790 +OE/TI-586,Dristner,,47.1133,11.8389,2767 +OE/TI-587,Hemerkogel,,47.1078,10.9856,2759 +OE/TI-588,Stanskogel,,47.1731,10.3047,2757 +OE/TI-589,Hochwanner,,47.3958,11.0550,2744 +OE/TI-590,Hennekopf,,46.9094,10.1394,2704 +OE/TI-591,Schmalzgrubenscharte,,47.0950,10.3508,2697 +OE/TI-592,Leutascher Dreitorspitze,,47.4003,11.1242,2682 +OE/TI-593,Plattspitzen,,47.3958,10.9878,2680 +OE/TI-594,Hinterreintalschrofen,,47.3961,11.0758,2669 +OE/TI-595,Tarrentonspitze,,47.3119,10.7225,2639 +OE/TI-596,Samspitze,,47.1736,10.3956,2624 +OE/TI-597,Gamskarspitze,,47.1161,10.3231,2621 +OE/TI-598,Griesskopf,,47.1750,10.3325,2581 +OE/TI-599,Windegg,,47.1758,11.1814,2577 +OE/TI-600,Oefnerspitze,,47.3172,10.3486,2575 +OE/TI-601,Pleisenspitze,,47.4086,11.3419,2569 +OE/TI-602,Oberreintalschrofen,,47.3956,11.1039,2523 +OE/TI-603,Vogelkarspitze,,47.4467,11.4111,2522 +OE/TI-604,Hobarjoch,,47.2050,11.7036,2512 +OE/TI-605,Hochkarspitze,,47.4475,11.3503,2482 +OE/TI-606,Wettersteinwand,,47.4222,11.1664,2482 +OE/TI-607,Musterstein,,47.4139,11.1403,2477 +OE/TI-608,Woerner,,47.4497,11.3381,2476 +OE/TI-609,Schindlekopf,,47.1683,10.3158,2471 +OE/TI-610,Rappenseekopf,,47.2811,10.2544,2468 +OE/TI-611,Scharnitzspitze,,47.3956,11.1119,2463 +OE/TI-612,Sonnenpleiskopf,,47.1933,10.5675,2461 +OE/TI-613,Hochgundspitze,,47.2844,10.2625,2460 +OE/TI-614,Ulrichskopf,,46.9428,10.5428,2457 +OE/TI-615,Sonnjoch,,47.4122,11.6050,2457 +OE/TI-616,Gamsjoch,,47.4183,11.5483,2452 +OE/TI-617,Torhelm,,47.1800,11.9558,2452 +OE/TI-618,Vorderer Tajakopf,,47.3650,10.9481,2450 +OE/TI-619,Tiefkarspitze,,47.4378,11.3208,2430 +OE/TI-620,Peischelkopf,,47.1217,10.1914,2412 +OE/TI-621,Pimig,,47.2250,10.2731,2406 +OE/TI-622,Grosser Wilder,,47.3700,10.3889,2379 +OE/TI-623,Gartner Wand,,47.3847,10.8208,2377 +OE/TI-624,Larchetfleckspitze,,47.4306,11.3133,2362 +OE/TI-625,Hochfeld,,47.1833,11.9247,2350 +OE/TI-626,Lattenspitze,,47.3253,11.4481,2330 +OE/TI-627,Raffelspitze,,47.4450,11.3647,2323 +OE/TI-628,Sulzleklammspitze,,47.4181,11.2922,2321 +OE/TI-629,Fuchskarspitze,,47.3908,10.4292,2314 +OE/TI-630,Kleiner Wilder,,47.3628,10.3861,2309 +OE/TI-631,Treffauer,,47.5550,12.2914,2304 +OE/TI-632,Breitenstein,,46.7472,12.6061,2304 +OE/TI-633,Rauher Knoell,,47.3867,11.6231,2278 +OE/TI-634,Mittagkopf,,47.0519,10.3950,2249 +OE/TI-635,Am Flach,,47.1369,11.7406,2248 +OE/TI-636,Predigtstein,,47.3833,11.0578,2234 +OE/TI-637,Galzig,,47.1342,10.2236,2184 +OE/TI-638,Nederjoch,,47.1828,11.3369,2142 +OE/TI-639,Galtjoch,,47.3944,10.6758,2109 +OE/TI-640,Kreuzspitze,,47.5183,10.9172,2088 +OE/TI-641,Henne,,47.4283,12.5433,2078 +OE/TI-642,Padauner Kogel,,47.0428,11.5072,2066 +OE/TI-643,B'schiesser,,47.4878,10.4406,1998 +OE/TI-644,Rohnenspitze,,47.4881,10.4678,1990 +OE/TI-645,Delpsjoch,,47.5008,11.4958,1945 +OE/TI-646,Demeljoch,,47.5461,11.5858,1924 +OE/TI-647,Gruener,,47.2750,10.2075,1914 +OE/TI-648,Kreuzkopf,,47.5275,10.8131,1910 +OE/TI-649,Stierjoch,,47.5108,11.5186,1909 +OE/TI-650,Hirschfang,,47.5275,10.8142,1905 +OE/TI-651,Stuckkogel,,47.4411,12.4653,1888 +OE/TI-652,Kuehgundkopf,,47.5039,10.4311,1852 +OE/TI-653,Spiess,,47.4597,10.8183,1846 +OE/TI-654,Schneidjoch,,47.5664,11.7892,1811 +OE/TI-655,Alpkopf,,47.4153,10.7650,1802 +OE/TI-656,Zaeunlkopf,,47.3642,11.2689,1746 +OE/TI-657,Brunschkopf,,47.3275,11.1567,1710 +OE/TI-658,Trainsjoch,,47.6153,12.0542,1708 +OE/TI-659,Schulterberg,,47.5542,11.6433,1686 +OE/TI-660,Wallerberg,,47.5144,12.5344,1682 +OE/TI-661,Pitzkopf,,47.5572,11.6233,1670 +OE/TI-662,Laerchfilzkogel,,47.4425,12.5492,1654 +OE/TI-663,Natterwand,,47.5725,11.7497,1618 +OE/TI-664,Ragstattjoch,,47.5675,11.8492,1545 +OE/TI-665,Hochkoepfl,,47.6911,12.3217,1539 +OE/TI-666,Gamskogel,,47.5800,12.2336,1449 +OE/TI-667,Rudersburg,,47.6847,12.3700,1434 +OE/TI-668,Dristenkopf,,47.5125,11.8653,1405 +OE/TI-669,Reither Kogel,,47.4008,11.8600,1336 +OE/TI-670,Zwoelferkopf,,47.5669,10.6053,1293 +OE/TI-671,Achleitner Kogel,,47.5328,12.2042,1229 +OE/TI-672,Juffinger Joechl,,47.4947,12.1392,1181 +OE/TI-673,Moeslalmkogel,,47.4742,12.0922,1109 +OE/TI-674,Maistaller Berg,,47.5833,12.1308,998 +OE/TI-675,Thierberg,,47.6003,12.1647,721 +OE/VB-001,Grosser Piz Buin,,46.8442,10.1186,3312 +OE/VB-002,Kleiner Piz Buin,,46.8425,10.1119,3255 +OE/VB-003,Silvrettahorn,,46.8581,10.0922,3244 +OE/VB-004,Schneeglocke,,46.8644,10.0853,3223 +OE/VB-005,Signalhorn,,46.8489,10.0969,3210 +OE/VB-006,Schattenspitze,,46.8675,10.0875,3202 +OE/VB-007,Rotfluh,,46.8606,10.0806,3166 +OE/VB-008,Silvretta-Egghorn,,46.8511,10.0922,3147 +OE/VB-009,Piz Jeramias,,46.8479,10.1406,3136 +OE/VB-010,Grosses Seehorn,,46.8881,10.0325,3121 +OE/VB-011,Klostertaler Egghorn,,46.8742,10.0794,3120 +OE/VB-012,Schattenkopf,,46.9314,10.0839,3114 +OE/VB-013,Grosslitzner,,46.8864,10.0383,3109 +OE/VB-014,Rauher Kopf,,46.8711,10.1422,3101 +OE/VB-015,Tirolerkopf,,46.8678,10.1386,3095 +OE/VB-016,Ochsenkopf,,46.8622,10.1394,3057 +OE/VB-017,Haagspitze,,46.8750,10.1411,3029 +OE/VB-018,Piz Mon,,46.8475,10.1317,2982 +OE/VB-019,Schesaplana,,47.0539,9.7075,2965 +OE/VB-020,Verhupfspitze,,46.8886,10.0561,2957 +OE/VB-021,Hohes Rad,,46.8928,10.1117,2934 +OE/VB-022,Winterberg,,46.8806,10.0425,2932 +OE/VB-023,Pflunspitze,,47.0797,10.1328,2912 +OE/VB-024,Kaltenberg,,47.0864,10.1389,2896 +OE/VB-025,Schrottenkopf,,46.9933,10.1544,2890 +OE/VB-026,Westliche Plattenspitze,,46.9006,10.0111,2883 +OE/VB-027,Sonntagspitze,,46.8769,10.0519,2882 +OE/VB-028,Eisentaelispitze,,46.9133,9.9625,2875 +OE/VB-029,Hintere Lobspitze,,46.8950,10.0581,2873 +OE/VB-030,Suedl. Kl. Klostertaler Egghorn,,46.8783,10.0853,2872 +OE/VB-031,Valgraggeszwillinge,,46.9097,10.0214,2869 +OE/VB-032,Lobturm,,46.8978,10.0578,2867 +OE/VB-033,Westliche Kromerspitze,,46.8975,10.0225,2865 +OE/VB-034,Panueeler Kopf,,47.0669,9.6797,2859 +OE/VB-035,Oestliche Plattenspitze,,46.9019,10.0178,2852 +OE/VB-036,Rotbuehelspitze,,46.9158,9.9589,2852 +OE/VB-037,Vermuntkopf,,46.8642,10.1264,2851 +OE/VB-038,Gloetterspitze,,46.8922,10.0469,2847 +OE/VB-039,Taelihorn,,46.8653,10.0508,2844 +OE/VB-040,Klostertaler Spitze,,46.8678,10.0511,2842 +OE/VB-041,Salaruelkopf,,47.0614,9.6775,2841 +OE/VB-042,Felsenkopf,,47.0544,9.7144,2835 +OE/VB-043,Vordere Lobspitze,,46.9042,10.0728,2835 +OE/VB-044,Kessispitz,,46.9025,9.9914,2833 +OE/VB-045,Drusenfluh - HG,,47.0289,9.8017,2827 +OE/VB-046,Valgraggestuerme,,46.9097,10.0214,2826 +OE/VB-047,Hochmaderer,,46.9289,10.0286,2823 +OE/VB-048,Valgraggeskopf,,46.9117,10.0222,2820 +OE/VB-049,Grosse Sulzfluh,,47.0128,9.8397,2818 +OE/VB-050,Zirmenkopf,,47.0567,9.7200,2806 +OE/VB-051,Mittlere Lobspitze,,46.9006,10.0703,2799 +OE/VB-052,Bieltalkopf,,46.8792,10.1278,2797 +OE/VB-053,Noerdliche Valgraggesspitze,,46.9200,10.0214,2793 +OE/VB-054,Faednerspitze,,46.9836,10.1597,2788 +OE/VB-055,Wildberg,,47.0678,9.7022,2788 +OE/VB-056,Kleinlitzner,,46.8997,10.0333,2783 +OE/VB-057,Gargellener Madrisa - HG,,46.9419,9.8914,2770 +OE/VB-058,Valschavieler Maderer (Madererspitze),,47.0250,10.0697,2769 +OE/VB-059,Suedliche Valgraggesspitze,,46.9161,10.0197,2761 +OE/VB-060,Kleine Lobspitze,,46.9069,10.0756,2760 +OE/VB-061,Untere Wildgrubenspitze,,47.1647,10.1267,2753 +OE/VB-062,Oestliche Eisentaler Spitze,,47.0794,10.1003,2753 +OE/VB-063,Roggspitze,,47.1653,10.2092,2747 +OE/VB-064,Stritkopf,,46.9364,10.0319,2745 +OE/VB-065,Marchspitze,,46.9347,9.8761,2732 +OE/VB-066,Noerdl. Kl. Klostert Egghorn,,46.8817,10.0856,2730 +OE/VB-067,Kleiner Zirmenkopf,,47.0594,9.7164,2728 +OE/VB-068,Satteinser Spitze,,47.0944,10.1375,2722 +OE/VB-069,Trittkopf,,47.1553,10.1933,2720 +OE/VB-070,Valisera,,46.9611,9.9558,2716 +OE/VB-071,Westliche Pazuelfernerspitze,,47.1544,10.2003,2712 +OE/VB-072,Kleine Sulzfluh,,47.0175,9.8375,2710 +OE/VB-073,Westliche Eisentaler Spitze,,47.0803,10.0789,2710 +OE/VB-074,Gruener Grat,,47.0019,10.1564,2708 +OE/VB-075,Kleine Schattenspitze,,47.1864,9.9850,2704 +OE/VB-076,Rote Wand,,46.8872,10.0858,2704 +OE/VB-077,Untere Graetlisgratspitze,,47.1625,10.1331,2702 +OE/VB-078,Seekopf,,47.0578,9.7361,2698 +OE/VB-079,Valschavielkopf,,47.0294,10.1344,2696 +OE/VB-080,Krachenspitze,,47.0969,10.1450,2686 +OE/VB-081,Heimspitze,,46.9614,9.9664,2685 +OE/VB-082,Hinterberg,,46.9161,9.9783,2682 +OE/VB-083,Spuller Schafberg,,47.1742,10.0756,2679 +OE/VB-084,Gaflunakopf,,47.0639,10.1347,2676 +OE/VB-085,Mittelberg,,46.9192,9.9858,2675 +OE/VB-086,Roggalspitze,,47.1661,10.1175,2673 +OE/VB-087,Westliche Wasenspitze,,47.1536,10.1278,2665 +OE/VB-088,Mittagsspitze,,46.9625,9.9506,2665 +OE/VB-089,Grosse Grubenspitze,,47.1544,10.1358,2659 +OE/VB-090,Schattenkopf,,46.9314,10.0839,2654 +OE/VB-091,Stubener Albonakopf,,47.1061,10.1544,2654 +OE/VB-092,Mittlere Fluhspitze,,46.9903,10.1378,2653 +OE/VB-093,Ritzenspitzen,,46.9381,9.9281,2650 +OE/VB-094,Braunarlspitze,,47.2294,10.0642,2649 +OE/VB-095,Zimba,,47.0914,9.7889,2643 +OE/VB-096,Kleine Valuella,,46.9325,10.1078,2643 +OE/VB-097,Obere Graetlisgratspitze - HG,,47.1683,10.1278,2642 +OE/VB-098,Oestliche Fluhspitze,,46.9894,10.1444,2641 +OE/VB-099,Torkopf,,47.0314,10.1336,2638 +OE/VB-100,Erlispitze,,47.1700,10.2092,2634 +OE/VB-101,Ruefispitze,,47.1911,10.1825,2632 +OE/VB-102,Weissplatte,,47.0097,9.8708,2630 +OE/VB-103,Obere Wildgrubenspitze,,47.1722,10.1211,2629 +OE/VB-104,Flexenspitze,,47.0064,9.8733,2627 +OE/VB-105,Scheienfluh,,47.1594,10.1372,2627 +OE/VB-106,Joechligrat,,47.0056,10.1544,2626 +OE/VB-107,Oestlicher Valschavielberg,,47.0098,10.1269,2623 +OE/VB-108,Kresperspitze,,46.9294,10.0778,2620 +OE/VB-109,Taelispitze,,47.0283,10.0619,2613 +OE/VB-110,Pfannseekopf,,47.0611,10.1461,2611 +OE/VB-111,Reutlinger Turm,,47.0750,10.1014,2606 +OE/VB-112,Silbertaler Loobspitze,,47.0789,10.0625,2605 +OE/VB-113,Stritkopf,,47.0131,10.1311,2604 +OE/VB-114,Tschambreuspitze,,46.9389,10.0403,2604 +OE/VB-115,Hochlichtspitze,,47.2200,10.0458,2600 +OE/VB-116,Orgelspitze,,47.0336,10.1064,2592 +OE/VB-117,Schwarze Wand,,47.2278,10.0517,2592 +OE/VB-118,Valzifenzerturm,,46.9264,9.9464,2589 +OE/VB-119,Vergaldner Schneeberg,,46.9289,9.9431,2583 +OE/VB-120,Noerdlicher Trittkopf,,47.1617,10.1889,2581 +OE/VB-121,Verbellakopf,,47.0025,10.1050,2581 +OE/VB-122,Westlicher Johanneskopf,,47.2103,10.0222,2573 +OE/VB-123,Naafkopf,,47.0608,9.6072,2571 +OE/VB-124,Loeffelspitze,,47.2228,10.0494,2563 +OE/VB-125,Suedliche Sarotlaspitze,,47.0008,9.8894,2563 +OE/VB-126,Valschavieler Plattenspitze,,47.0328,10.1250,2561 +OE/VB-127,Pfaffeneck,,47.1719,10.0408,2559 +OE/VB-128,Omeshorn,,47.1858,10.1281,2557 +OE/VB-129,–stlicher Totalpkopf,,47.0436,9.7217,2556 +OE/VB-130,Vorderberg,,46.9283,9.9839,2553 +OE/VB-131,Dritte Kirchlispitze - HG,,47.0389,9.7689,2552 +OE/VB-132,Riedkopf,,46.9750,9.8781,2552 +OE/VB-133,Muttberg,,47.0617,10.1225,2551 +OE/VB-134,Maroispitze,,47.1097,10.1558,2548 +OE/VB-135,Butzenspitze,,47.2286,10.0744,2547 +OE/VB-136,Madlochspitze,,47.2286,10.0744,2547 +OE/VB-137,Westlicher Valschavielberg,,47.0067,10.1142,2546 +OE/VB-138,Hintere Hasenfluh,,47.1661,10.1400,2545 +OE/VB-139,Noerdliche Sarotlaspitze,,47.0053,9.8969,2545 +OE/VB-140,Mohnenfluh,,47.2322,10.1022,2542 +OE/VB-141,Poengertlekopf,,47.1747,10.0350,2539 +OE/VB-142,Oestlicher Fanesklakopf,,47.0333,10.1189,2539 +OE/VB-143,Widderstein,,47.2847,10.1294,2538 +OE/VB-144,Hornspitz,,47.0597,9.6450,2537 +OE/VB-145,Erzbergspitze,,47.1531,10.1419,2536 +OE/VB-146,Vordere Hasenfluh,,47.1661,10.1400,2534 +OE/VB-147,Giampspitze,,47.0322,10.0914,2533 +OE/VB-148,Rongspitz,,46.9756,9.8794,2531 +OE/VB-149,Oestlicher Maroikopf,,47.1139,10.1633,2529 +OE/VB-150,Schwarze Wand,,47.2039,10.0142,2524 +OE/VB-151,Kuchenberg,,46.9344,9.9828,2523 +OE/VB-152,Westlicher Maroikopf,,47.1147,10.1583,2522 +OE/VB-153,Hochjoch,,47.0661,9.9881,2520 +OE/VB-154,Rauher Kopf - HG,,47.1958,10.2014,2520 +OE/VB-155,Bratschenkopf,,47.2144,10.0225,2520 +OE/VB-156,Guemplespitze,,47.1942,10.1969,2518 +OE/VB-157,Rotspitz,,46.9831,9.8831,2517 +OE/VB-158,Saulakopf,,47.0794,9.7692,2516 +OE/VB-159,Westliche Fluhspitze,,46.9892,10.1269,2512 +OE/VB-160,Wannenkopf,,47.3133,9.9003,2510 +OE/VB-161,Oestlicher Johanneskopf,,47.2089,10.0311,2508 +OE/VB-162,Blisadonaspitze,,47.1506,10.1200,2508 +OE/VB-163,Innerer Platinakopf,,47.0103,9.8969,2505 +OE/VB-164,Hirschenspitze,,47.2011,10.0133,2501 +OE/VB-165,Saggrat,,46.9531,10.1278,2498 +OE/VB-166,Rohnspitze - HG,,47.1536,10.0997,2498 +OE/VB-167,Sporaturm,,47.0267,9.8153,2489 +OE/VB-168,Trittwangkopf,,47.1856,10.1994,2482 +OE/VB-169,Formarin-Rothorn,,47.1822,9.9797,2481 +OE/VB-170,Geisterspitz,,47.1856,10.1994,2480 +OE/VB-171,Fluh,,46.9878,10.1194,2473 +OE/VB-172,Grosse Rappenspitze,,47.2364,10.1975,2472 +OE/VB-173,Giampkopf,,47.0264,10.0931,2470 +OE/VB-174,Madrisella,,46.9594,9.9861,2466 +OE/VB-175,Versalspitze,,46.9822,10.0850,2462 +OE/VB-176,Tilisuna-Schwarzhorn,,47.0328,9.8703,2460 +OE/VB-177,Rossberg,,47.0469,9.7669,2452 +OE/VB-178,Grosser Valkastiel,,47.1008,9.8058,2449 +OE/VB-179,Gamsfreiheit,,47.0722,10.0556,2445 +OE/VB-180,Lobschild,,47.0722,10.0556,2445 +OE/VB-181,Steintaelikopf,,47.0961,9.8019,2443 +OE/VB-182,Schlappiner Spitze,,47.2036,9.9972,2442 +OE/VB-183,Zuger Mittagspitze,,47.1806,10.1153,2441 +OE/VB-184,Gottvaterspitze,,47.1033,9.8036,2438 +OE/VB-185,Zaluandakopf,,47.0533,9.7767,2437 +OE/VB-186,Misthaufen,,47.2036,9.9972,2436 +OE/VB-187,Torkopf,,47.0314,10.1336,2426 +OE/VB-188,Blisadonakopf,,47.1483,10.1192,2424 +OE/VB-189,Scheimersch (Geisterspitze),,47.0417,10.0053,2420 +OE/VB-190,Karhorn,,47.2481,10.1514,2416 +OE/VB-191,Aeusserer Platinakopf,,47.0139,9.9000,2416 +OE/VB-192,Suedlicher Schafgafall,,47.0647,9.7664,2414 +OE/VB-193,Formarin-Schafberg,,47.1700,9.9508,2413 +OE/VB-194,Juppenspitze,,47.2389,10.1072,2412 +OE/VB-195,Unterer Schafberg,,47.1850,10.0864,2407 +OE/VB-196,Aeusserer Gweilkopf,,47.0247,9.9075,2406 +OE/VB-197,Zitterklapfen-HG,,47.2681,9.9714,2403 +OE/VB-198,Fundelkopf,,47.1103,9.6767,2401 +OE/VB-199,Schafboden,,46.9511,10.0244,2400 +OE/VB-200,Knoedelkopf,,47.1203,10.1828,2400 +OE/VB-201,Kreuzjoch,,47.0608,9.9750,2398 +OE/VB-202,Hochkuenzelspitze,,47.2717,10.0306,2397 +OE/VB-203,Noerdlicher Schafgafall,,47.0686,9.7661,2392 +OE/VB-204,Elferkopf,,47.3022,10.1778,2387 +OE/VB-205,Zamangspitze,,47.0517,9.9750,2387 +OE/VB-206,Liechelkopf,,47.2961,10.1797,2384 +OE/VB-207,Zuger Hochlicht,,47.2264,10.1008,2377 +OE/VB-208,Sarotla-Wildberg,,47.0964,9.7689,2372 +OE/VB-209,Versettla,,46.9658,9.9956,2372 +OE/VB-210,Goppelspitze,,47.1556,10.0933,2371 +OE/VB-211,Schermsteeberg,,47.0336,10.0408,2370 +OE/VB-212,Schwarzkopf,,46.9706,9.9656,2370 +OE/VB-213,Geisshorn,,47.2878,10.1756,2366 +OE/VB-214,Hoellenspitze,,47.2433,10.2053,2362 +OE/VB-215,Mittagsjoch,,47.0717,9.9978,2362 +OE/VB-216,Ruefikopf,,47.2011,10.1703,2362 +OE/VB-217,Rothorn,,47.1908,9.9933,2357 +OE/VB-218,Kreuzspitze,,47.0431,9.8125,2354 +OE/VB-219,Guemplekopf (Stierlochkopf),,47.1803,10.1100,2353 +OE/VB-220,Schafgufel,,47.1083,9.7986,2351 +OE/VB-221,Hanflender,,47.1750,9.9539,2349 +OE/VB-222,Reutehorn (Ruethihorn),,47.0086,9.9192,2348 +OE/VB-223,Alpilakopf,,46.9442,10.0150,2345 +OE/VB-224,Schmalzberg,,46.9681,9.9339,2345 +OE/VB-225,Tilisuna-Seehorn,,47.0247,9.8881,2342 +OE/VB-226,Oberzalimkopf,,47.0789,9.6778,2340 +OE/VB-227,Blankuskopf,,47.0925,9.6794,2334 +OE/VB-228,Geissspitze,,47.0447,9.8278,2334 +OE/VB-229,Windeckerspitze,,47.0994,9.6864,2331 +OE/VB-230,Fensterlewand,,47.1547,10.0047,2329 +OE/VB-231,Hochberg,,47.2472,10.0692,2324 +OE/VB-232,Dreier,,47.0406,10.0350,2321 +OE/VB-233,Noerdlicher Schafalpenkopf (3. Schafalpenkopf),,47.3106,10.2167,2320 +OE/VB-234,Westliche Plattnitzerjochspitze,,47.1542,10.0592,2318 +OE/VB-235,Tuklar,,47.1178,9.6942,2318 +OE/VB-236,–stliche Plattnitzerjochspitze,,47.1536,10.0636,2316 +OE/VB-237,Ganahlskopf,,47.1564,10.0086,2314 +OE/VB-238,Freschluakopf,,47.0583,9.7867,2314 +OE/VB-239,Woesterhorn,,47.2250,10.1806,2310 +OE/VB-240,Pfannenkopf,,47.1450,10.2025,2308 +OE/VB-241,Gorfion,,47.0781,9.6186,2308 +OE/VB-242,Hinterer Geisskopf,,47.1675,9.9631,2303 +OE/VB-243,Mittlerer Schafalpenkopf (2. Schafalpenkopf),,47.1544,10.0592,2302 +OE/VB-244,Auenfelder Horn,,47.2506,10.1408,2297 +OE/VB-245,Luenereck,,47.0372,9.7475,2297 +OE/VB-246,Schwarzer Turm bei Kloesterle,,47.1492,10.1467,2297 +OE/VB-247,Gamsbodenspitze,,47.1533,10.0336,2296 +OE/VB-248,Formaletsch,,47.1681,10.0094,2292 +OE/VB-249,Wilder Mann,,47.0483,9.8169,2291 +OE/VB-250,Zapfkopf,,47.0267,9.8153,2290 +OE/VB-251,Madratsch,,47.1914,9.9689,2287 +OE/VB-252,Lusgrind,,47.1789,9.9506,2286 +OE/VB-253,Ochsenkopf,,47.1147,9.6247,2286 +OE/VB-254,Roggelskopf,,47.1525,9.9575,2284 +OE/VB-255,Schoeneberg,,47.2711,10.0125,2282 +OE/VB-256,Oestlicher Pitschikopf,,47.1683,9.9372,2280 +OE/VB-257,Oestliches Klasenzahorn,,47.2083,9.9797,2276 +OE/VB-258,Alpkopf,,46.9469,9.9214,2273 +OE/VB-259,Suedlicher Schafalpenkopf (1. Schafalpenkopf),,47.3028,10.2053,2272 +OE/VB-260,Bettlerspitze,,47.2117,9.9717,2272 +OE/VB-261,Feuerstein,,47.2294,10.0106,2271 +OE/VB-262,Zwoelferkopf,,47.1131,9.7922,2271 +OE/VB-263,Borschtkopf,,46.9869,9.8975,2265 +OE/VB-264,Kilkaschrofen,,47.2697,9.9967,2262 +OE/VB-265,Kreuzjoch,,47.0564,9.8175,2261 +OE/VB-266,Wildes Graeshorn,,47.2711,9.9686,2258 +OE/VB-267,Warther Horn,,47.2517,10.1567,2257 +OE/VB-268,Alpilakopf,,47.0303,9.9050,2255 +OE/VB-269,Hochgehrenspitze,,47.3214,10.2069,2251 +OE/VB-270,Gamsgrat,,47.1106,9.6208,2246 +OE/VB-271,Burtschakopf,,47.1122,10.0850,2244 +OE/VB-272,Glongspitz,,47.1503,10.0547,2243 +OE/VB-273,Schadona-Rothorn,,47.2519,10.0419,2239 +OE/VB-274,Saladinaspitze,,47.1494,10.0028,2238 +OE/VB-275,Kleiner Widderstein,,47.2908,10.1367,2236 +OE/VB-276,Pfannenknechtle,,47.0867,9.6792,2234 +OE/VB-277,Hoher Ifen,,47.3547,10.1003,2230 +OE/VB-278,Ochsenbodenkopf,,47.1486,10.1778,2222 +OE/VB-279,Latschaetzkopf,,47.0567,9.8267,2219 +OE/VB-280,Weisses Roessle,,47.1703,9.9169,2214 +OE/VB-281,Jungfernspitze,,47.1922,9.9781,2212 +OE/VB-282,Gamsfreiheit,,47.1733,9.8972,2211 +OE/VB-283,Fellimaennle,,47.0683,10.0425,2209 +OE/VB-284,Grappeskopf,,47.0131,10.0286,2206 +OE/VB-285,Gruenes Graeshorn,,47.2739,9.9719,2201 +OE/VB-286,Rosskopf,,47.1531,10.1528,2200 +OE/VB-287,Galinakopf,,47.1517,9.6206,2198 +OE/VB-288,Breitspitze /Breiter Spitz,,46.9581,10.0989,2196 +OE/VB-289,Suedlicher Formarin-Rosskopf,,47.1556,9.9983,2195 +OE/VB-290,Westlicher Pitschikopf,,47.1669,9.9308,2193 +OE/VB-291,Sarotlahoerner,,47.0994,9.7742,2192 +OE/VB-292,Kemptner Kopf,,47.2975,10.1992,2191 +OE/VB-293,Heiterberg,,47.2817,10.0903,2188 +OE/VB-294,Gweilspitze,,47.0264,9.9253,2187 +OE/VB-295,Vorderer Geisskopf,,47.1667,9.9728,2183 +OE/VB-296,Selzner Kopf,,46.9514,9.9250,2180 +OE/VB-297,Oberer Rauher Kopf,,47.1114,10.1247,2179 +OE/VB-298,Mottakopf,,47.0861,9.7186,2176 +OE/VB-299,Kriegerhorn,,47.2139,10.1169,2173 +OE/VB-300,Schuesser / Hammerspitze,,47.3264,10.1994,2170 +OE/VB-301,Platziser Joch,,47.0600,9.8156,2170 +OE/VB-302,Tschaggunser Mittagspitze,,47.0458,9.8850,2168 +OE/VB-303,Scheienkopf - HG,,47.1283,9.6358,2159 +OE/VB-304,Alpilakopf,,47.1289,9.7117,2156 +OE/VB-305,Niederkuenzelspitze,,47.2786,10.0297,2156 +OE/VB-306,Schoenbuehel,,47.1928,10.0128,2152 +OE/VB-307,Kaemmerlischrofen,,47.0861,9.6872,2151 +OE/VB-308,Roter Turm,,47.1475,10.1469,2147 +OE/VB-309,Noerdlicher Formarin-Rosskopf,,47.1581,9.9956,2144 +OE/VB-310,Uentschenspitze,,47.3039,10.0608,2135 +OE/VB-311,Glatthorn,,47.2653,9.8800,2133 +OE/VB-312,Hoeferberg,,47.2739,10.1017,2131 +OE/VB-313,Blisadona,,47.1436,10.1036,2130 +OE/VB-314,Annalper Stecken,,47.2783,9.9703,2124 +OE/VB-315,Grueneck,,47.0642,9.8456,2124 +OE/VB-316,Innerer „lpelekopf,,47.1344,9.6414,2122 +OE/VB-317,Giglturm,,47.2656,10.0333,2112 +OE/VB-318,Hoernle,,47.2769,10.0011,2112 +OE/VB-319,Zuger Horn,,47.2125,10.0839,2111 +OE/VB-320,Blasenka,,47.2569,9.9450,2109 +OE/VB-321,Zaferahorn,,47.2703,9.9253,2107 +OE/VB-322,Glattjoechlespitze,,47.2622,10.0222,2106 +OE/VB-323,Kleiner Fundelkopf,,47.1211,9.6756,2104 +OE/VB-324,Kaennerberg,,47.1181,9.7944,2099 +OE/VB-325,Damuelser Mittagspitze,,47.3103,9.8839,2098 +OE/VB-326,Tuertschhorn,,47.2575,9.8800,2096 +OE/VB-327,Golmer Joch,,47.0619,9.8356,2094 +OE/VB-328,Rauher Berg,,47.1075,9.6286,2094 +OE/VB-329,Faludriga-Novakopf,,47.1783,9.9017,2093 +OE/VB-330,Itonskopf,,47.1164,9.9333,2088 +OE/VB-331,Breithorn,,47.2114,9.9142,2081 +OE/VB-332,Wasserkluppe,,47.2683,10.0458,2081 +OE/VB-333,Rosskopf,,47.1131,9.8269,2080 +OE/VB-334,Baerenkopf,,47.3000,10.1358,2080 +OE/VB-335,Mutjoechle,,47.0983,10.0278,2075 +OE/VB-336,Strahleck,,47.0719,9.6558,2068 +OE/VB-337,Hochblanken,,47.3117,9.8692,2068 +OE/VB-338,Klipperen,,47.3161,9.9161,2066 +OE/VB-339,Aeusserer „lpelekopf,,47.1406,9.6533,2063 +OE/VB-340,Suenser Spitze,,47.3033,9.8347,2062 +OE/VB-341,Kanzelwand/Warmatsgundkopf,,47.3347,10.2078,2059 +OE/VB-342,Haehlekopf,,47.3467,10.0706,2058 +OE/VB-343,Heubergkopf,,47.1508,9.9647,2056 +OE/VB-344,Unterer Rauher Kopf,,47.1147,10.1228,2054 +OE/VB-345,Gungern,,47.3136,9.9083,2053 +OE/VB-346,Drei Schwestern - HG,,47.1758,9.5728,2053 +OE/VB-347,Zigerbergkopf,,47.1503,9.6044,2051 +OE/VB-348,Ragazer Blanken,,47.3047,9.8525,2051 +OE/VB-349,Holenke (Kanisfluh – HG),,47.3314,9.9278,2044 +OE/VB-350,Saloberkopf,,47.2550,10.1347,2043 +OE/VB-351,Schiesshorn,,46.9539,9.9314,2043 +OE/VB-352,Motadenser Kopf,,47.0325,9.9172,2041 +OE/VB-353,Gruenhorn,,47.3239,10.0792,2039 +OE/VB-354,Fellhorn,,47.3506,10.2178,2038 +OE/VB-355,Mittagstein,,47.1022,10.0269,2035 +OE/VB-356,Huttlaspitze,,47.2172,9.9664,2034 +OE/VB-357,Wannakoepfle,,47.1125,9.9214,2032 +OE/VB-358,Novaspitz,,47.1839,9.9047,2022 +OE/VB-359,Allhoehe,,47.1406,10.0042,2021 +OE/VB-360,Matonakopf,,47.2217,9.9686,2019 +OE/VB-361,Kellaspitze,,47.2097,9.8967,2017 +OE/VB-362,Kunkelspitze,,47.2617,9.9917,2016 +OE/VB-363,Runder Kopf (Kanisfluh),,47.3336,9.9364,2014 +OE/VB-364,Hochscherekopf Zitterklapfen-WG,,47.2619,9.9567,2013 +OE/VB-365,Toblermannskopf,,47.2864,10.0081,2010 +OE/VB-366,Portlerhorn,,47.2906,9.8497,2010 +OE/VB-367,Hohes Licht,,47.2803,10.2761,2009 +OE/VB-368,Wasenspitze,,47.1100,9.7681,2009 +OE/VB-369,Schillerkopf,,47.1422,9.7211,2006 +OE/VB-370,Wannenkopf,,47.3133,9.9003,2006 +OE/VB-371,Hoher Freschen,,47.3072,9.7778,2004 +OE/VB-372,Haldenwanger Kopf,,47.2758,10.1753,2002 +OE/VB-373,Taelispitz,,47.2394,9.7778,2000 +OE/VB-374,Hohe Matona,,47.2967,9.7883,1997 +OE/VB-375,Steinwandeck,,47.1164,9.8289,1996 +OE/VB-376,Walmendinger Horn,,47.3267,10.1281,1993 +OE/VB-377,Blasegg,,47.1425,10.1169,1989 +OE/VB-378,Hochgerach,,47.2369,9.7567,1985 +OE/VB-379,Steinmannl,,47.3322,10.0700,1982 +OE/VB-380,Hoher Frassen,,47.1919,9.8336,1979 +OE/VB-381,Gronggenkopf,,47.2106,9.9328,1978 +OE/VB-382,Huettenkopf,,47.2339,9.7653,1976 +OE/VB-383,Gipskoepfle,,47.0703,9.7794,1975 +OE/VB-384,Kreuzmannl,,47.3300,10.0642,1974 +OE/VB-385,Falzerkopf,,47.3300,10.0642,1968 +OE/VB-386,Schlappoltkopf,,47.3586,10.2242,1968 +OE/VB-387,Mondspitze,,47.1528,9.7264,1967 +OE/VB-388,Sonnenspitz (Kanisfluh),,47.3344,9.9425,1965 +OE/VB-389,Kuhspitz,,47.2364,9.7711,1964 +OE/VB-390,Otterkirchle,,47.0858,9.6661,1964 +OE/VB-391,Loeffelspitz,,47.2531,9.8275,1962 +OE/VB-392,Gundkopf,,47.3381,10.2008,1961 +OE/VB-393,Ochsenhofer Koepfe,,47.3250,10.1033,1950 +OE/VB-394,Pfrondhorn,,47.2625,9.8425,1949 +OE/VB-395,Wannenkopf,,47.2525,10.1692,1941 +OE/VB-396,Otternkopf,,47.1900,9.9336,1938 +OE/VB-397,Gehrenfalben,,47.2811,9.8103,1938 +OE/VB-398,Mellenspitz (Melkspitz),,47.2406,9.7894,1936 +OE/VB-399,Muttabellaspitze,,47.2489,9.8200,1933 +OE/VB-400,Glattmahd,,47.2206,9.9367,1930 +OE/VB-401,Damuelser Horn,,47.2706,9.8689,1929 +OE/VB-402,Klesiwand,,47.1900,9.8511,1929 +OE/VB-403,Unspitz,,47.3089,10.0939,1929 +OE/VB-404,Schusterstuhl,,47.3036,9.7033,1917 +OE/VB-405,Schnauzlberg (Blisadonele),,47.1400,10.1019,1913 +OE/VB-406,Kuhgehrenspitze,,47.3339,10.1911,1910 +OE/VB-407,Spitzguf,,47.1236,9.9036,1908 +OE/VB-408,Portlerkopf,,47.2808,9.8436,1905 +OE/VB-409,Monteneu,,47.1092,9.9119,1883 +OE/VB-410,Schwarzhorn,,47.1153,9.9544,1883 +OE/VB-411,Davennaspitze,,47.1269,9.8919,1881 +OE/VB-412,Grenzspitz,,47.2481,9.8336,1879 +OE/VB-413,Winterstaude,,47.3994,9.9806,1877 +OE/VB-414,Huttler Wangspitze,,47.2300,9.9681,1873 +OE/VB-415,Grafenspitz,,47.1447,10.0553,1871 +OE/VB-416,Gehrenspitz,,47.3469,10.1997,1871 +OE/VB-417,Gehrenspitz,,47.3467,10.1997,1857 +OE/VB-418,Zwoelferkopf,,47.1269,9.9022,1843 +OE/VB-419,Sattelkopf,,47.1119,10.0561,1841 +OE/VB-420,Hirschberg,,47.3594,9.9992,1834 +OE/VB-421,Leuenkopf,,47.3500,9.8153,1830 +OE/VB-422,Moerzelspitze,,47.3464,9.8111,1830 +OE/VB-423,Wannenberg,,47.2958,10.1031,1830 +OE/VB-424,Tantermauses,,47.1206,9.8050,1821 +OE/VB-425,Garmil,,47.2158,9.9364,1810 +OE/VB-426,Loischkopf,,47.1347,9.7422,1809 +OE/VB-427,Hoher Stoss (Kanisfluh),,47.3325,9.9133,1806 +OE/VB-428,Schafberg,,47.3044,9.8272,1805 +OE/VB-429,Mont Calv,,47.2428,9.8375,1804 +OE/VB-430,Stierkopf,,47.1656,9.8725,1801 +OE/VB-431,Falben (Gapfohl),,47.2725,9.7692,1793 +OE/VB-432,Alpkopf,,47.3286,9.7750,1788 +OE/VB-433,Nob,,47.2825,9.7625,1785 +OE/VB-434,Goppaschrofen,,47.1756,9.6136,1781 +OE/VB-435,Gurtisspitze,,47.1822,9.6322,1778 +OE/VB-436,Riesenspitze,,47.3050,9.8003,1774 +OE/VB-437,Hahnenkopf,,47.2722,9.8992,1772 +OE/VB-438,Steriser Wangspitze,,47.2186,9.9083,1766 +OE/VB-439,Salzboedenkopf,,47.3306,9.7936,1765 +OE/VB-440,Bullerschkopf,,47.3964,10.0075,1761 +OE/VB-441,Lohnspitz,,47.1600,9.6492,1758 +OE/VB-442,Klamperschrofen,,47.1592,9.7253,1755 +OE/VB-443,Schwarzkopf,,47.1603,9.7331,1753 +OE/VB-444,Taleu,,47.1267,9.7492,1748 +OE/VB-445,Hohe Kirche,,47.3950,9.9981,1747 +OE/VB-446,Hangspitze,,47.3589,9.8494,1746 +OE/VB-447,Tristenkopf,,47.4019,9.9667,1741 +OE/VB-448,Maruler Guggernuelli,,47.2106,9.8819,1736 +OE/VB-449,Kopes,,47.2408,9.7322,1735 +OE/VB-450,Galamant,,47.0794,9.6503,1730 +OE/VB-451,Gruene Koepfe,,47.3592,10.0364,1725 +OE/VB-452,Wasenkopf,,47.3692,10.0767,1719 +OE/VB-453,Valbonakopf,,47.1211,9.7853,1714 +OE/VB-454,Hintere Niedere,,47.3992,9.9453,1711 +OE/VB-455,Davennakopf,,47.1300,9.8806,1708 +OE/VB-456,Gampberg,,47.1675,9.6622,1708 +OE/VB-457,Maehrenhoehe,,47.3842,10.0814,1703 +OE/VB-458,Soellereck,,47.3736,10.2372,1703 +OE/VB-459,Luguntenkopf,,47.3875,9.9894,1702 +OE/VB-460,Naegelekopf,,47.3950,10.0181,1693 +OE/VB-461,Sevisschrofen,,47.3697,10.0636,1659 +OE/VB-462,Vorderes Hoernle,,47.3269,9.7339,1656 +OE/VB-463,Feuerstaetterkopf,,47.4325,10.0781,1645 +OE/VB-464,Mohrenkopf,,47.3603,10.0250,1645 +OE/VB-465,Hohe Kugel,,47.3353,9.7158,1645 +OE/VB-466,Zwoelferkopf,,47.1347,9.6961,1644 +OE/VB-467,Eineguntkopf (Rohnehoehe),,47.4889,10.0383,1639 +OE/VB-468,Haarkopf,,47.1703,9.6083,1638 +OE/VB-469,Mittagsfluh,,47.3375,9.9839,1637 +OE/VB-470,Duenser Horn,,47.2408,9.7194,1616 +OE/VB-471,Haelekopf,,47.3844,9.9686,1614 +OE/VB-472,Spiesseck,,47.1442,9.7036,1614 +OE/VB-473,Diedamskopf,,47.3464,10.0256,2090 +OE/VB-474,Sienspitze,,47.3850,10.0172,1600 +OE/VB-475,Muttkopf,,47.2419,9.7069,1594 +OE/VB-476,Vordere Niedere,,47.4033,9.9389,1586 +OE/VB-477,Kojenkopf,,47.3300,9.8769,1583 +OE/VB-478,Hoernle,,47.3194,9.7406,1581 +OE/VB-479,Oestlicher Katzenkopf,,47.1639,9.8603,1579 +OE/VB-480,Giblenkopf,,47.3500,9.9828,1571 +OE/VB-481,Hochhaedrich,,47.4817,10.0033,1566 +OE/VB-482,Falken,,47.4839,10.0208,1564 +OE/VB-483,Eckskopf,,47.1522,9.6811,1563 +OE/VB-484,Sattelspitze,,47.3378,9.7700,1562 +OE/VB-485,Burstkopf,,47.4397,10.0786,1559 +OE/VB-486,Auf der Platte,,47.3408,9.9997,1555 +OE/VB-487,Koppachstein,,47.4631,10.0397,1537 +OE/VB-488,Schoener Mann,,47.3572,9.7378,1532 +OE/VB-489,Duemelekopf,,47.3097,9.7494,1523 +OE/VB-490,Westlicher Katzenkopf,,47.1636,9.8558,1495 +OE/VB-491,Scharzenberg,,47.3664,9.7356,1475 +OE/VB-492,Flohkopf,,47.3894,10.0761,1470 +OE/VB-493,Staufen,,47.3761,9.7553,1465 +OE/VB-494,Hochaelpele,,47.4031,9.8128,1464 +OE/VB-495,Bocksberg,,47.3608,9.7575,1461 +OE/VB-496,Alpwegkopf,,47.2736,9.7156,1437 +OE/VB-497,Renkknie,,47.4389,10.0450,1411 +OE/VB-498,Patennerkopf,,47.4064,10.0136,1385 +OE/VB-499,Plessigkopf,,47.3906,10.0644,1384 +OE/VB-500,Strahlkopf,,47.3536,9.7217,1366 +OE/VB-501,Hittisberg,,47.4472,9.9900,1328 +OE/VB-502,Gopfberg,,47.3578,9.8989,1316 +OE/VB-503,Kojenstein,,47.4917,9.9708,1300 +OE/VB-504,Geisskopf,,47.4289,9.8250,1198 +OE/VB-505,Brueggelekopf,,47.4433,9.8531,1182 +OE/VB-506,Letze,,47.3092,9.6900,1174 +OE/VB-507,Kapf,,47.3425,9.6853,1153 +OE/VB-508,Breitenberg,,47.3794,9.7322,1105 +OE/VB-509,Hirschberg,,47.5222,9.8222,1095 +OE/VB-510,Stangstattkopf,,47.4406,9.9589,1095 +OE/VB-511,Eichenberger Hochberg,,47.5422,9.8036,1069 +OE/VB-512,Pfaender,,47.5072,9.7803,1064 +OE/VB-513,Hochstraess,,47.5367,9.9394,1041 +OE/VB-514,Troegerhoehe,,47.5400,9.8106,1039 +OE/VB-515,Klaratsberg,,47.4356,9.9397,1019 +OE/VB-516,Rotenberg,,47.4628,9.9425,994 +OE/VB-517,Hohe Lug,,47.3264,9.6711,973 +OE/VB-518,Karren,,47.3878,9.7508,971 +OE/VB-519,Schneiderkopf,,47.4708,9.8103,971 +OE/VB-520,Nackkopf,,47.4208,9.7769,944 +OE/VB-521,Schweizberg,,47.4714,9.9206,923 +OE/VB-522,Geserberg,,47.5078,9.8094,918 +OE/VB-523,Brentenkopf,,47.3864,9.7658,837 +OE/VB-524,Zwurms,,47.3300,9.6542,745 +OE/VB-525,Kummenberg,,47.3361,9.6167,667 +OE/VB-526,Ardetzenberg,,47.2517,9.6025,631 +OE/WI-001,Hermannskogel,,48.2703,16.2936,542 +#OE/WI-002,Vogelsangberg,,48.2667,16.3000,516 +OE/WI-003,Hochbruckenberg,,48.2356,16.2269,497 +#OE/WI-004,Kahlenberg,,48.2667,16.3333,484 +OE/WI-005,Heuberg,,48.2294,16.2747,464 +#OE/WI-006,Greutberg,,48.2167,16.2000,449 +#OE/WI-007,Steinerne Lahn,,48.2333,16.2333,448 +#OE/WI-008,Satzberg,,48.2000,16.2500,435 +#OE/WI-009,Kolbeterberg,,48.2167,16.2167,426 +#OE/WI-010,Leopoldsberg,,48.2667,16.3333,425 +#OE/WI-011,Hackenberg,,48.1833,16.2333,406 +#OE/WI-012,Schafberg,,48.2333,16.2833,390 +#OE/WI-013,Michaelerberg,,48.2333,16.2833,387 +#OE/WI-014,Burgstall,,48.2667,16.3500,295 +OE/WI-015,Kaltbruendlberg,,48.1689,16.2192,508 +W8V/PH-114,Germany Knob,,38.7730,-79.4071,854 +I/AA-302,Monte Croce,,46.7242,10.8389,2576 +I/AA-303,Monte Bullacia,,46.5706,11.6139,2130 +I/AA-304,Monte Cavallo,,46.5431,12.0044,2912 +I/AA-305,Vetta d'Italia,,?47.0911,12.1805,2912 +I/AA-306,Corno Bianco,,46.8247,11.3694,2705 +I/AA-307,Omini di Pietra,,46.6322,11.2719,2003 +I/AA-308,Monte Giogo Alto,,46.7833,10.7922,2857 +I/AA-309,MonteTullo,,46.6597,11.7622,2653 +I/AA-310,Monte Pascolo,,46.7314,11.6139,2436 +I/AA-311,Monte Castelliere,,46.5219,12.3622,2168 +I/AA-312,Sasso Piatto,,46.5039,11.6961,2964 +I/AA-313,Cima Karkofel,,46.7433,11.2547,2114 +I/AA-314,Monte Catino,,46.6908,11.2664,2422 +I/AA-315,Cima del Vento,,46.6750,11.1722,2305 +I/AA-316,Cima Grava,,46.7042,11.1722,2080 +I/AA-317,Monte Pez,,46.4983,11.6894,2564 +I/AA-318,Monte Specie,,46.6464,12.2125,2307 +I/AA-319,Monte Muro,,46.7147,11.7922,2422 +I/AA-320,Cima Raciesa,,46.5781,11.7244,2278 +I/AA-321,Picco Altacroce,,46.8547,11.2144,2743 +I/AA-322,Picco Ivigna,,46.6919,11.2578,2552 +I/AA-323,Cima Lasta,,46.7628,11.8086,2194 +I/AA-324,Monte Luco Grande,,46.5347,11.0861,2434 +I/AA-325,Cima delle Pecore,,46.5633,10.6467,3001 +I/AA-326,Monte Mutta,,46.6997,11.1322,2294 +I/AA-327,Picco di Vallandro,,46.6725,12.1853,2839 +I/AA-328,Sasso Putia,,46.6589,11.8200,2875 +I/AA-329,Col Rotondo,,46.6311,12.1897,2204 +I/AA-330,Monte Forca Grande,,46.6903,11.7628,2576 +I/AA-331,Monte Cigot,,46.7200,11.0600,3001 +I/AA-332,Picco della Croce,,46.9125,11.5933,3135 +I/AA-333,Crodarotta,,46.7361,10.8861,2889 +I/AA-334,Cima Rasass,,46.7478,10.4475,2941 +I/AA-335,Croda del Becco,,46.6750,12.0725,2810 +I/AA-336,Cima Beltovo,,46.5028,10.6283,3325 +I/AA-337,Cima Montone,,46.8344,12.0531,2483 +I/AA-338,Monte Piana,,46.6153,12.2369,2325 +I/AA-339,Pietrarossa,,46.6219,11.2153,1465 +I/AA-340,Monte Lira,,46.3925,11.2114,1617 +I/AA-341,Piz Bo¨,,46.5111,11.8278,3152 +I/AB-301,Corno Grande,,42.4700,13.5642,2973 +I/AB-302,Monte Brancastello,,42.4167,13.6508,2385 +I/AB-303,Monte Aquila,,42.1256,13.0528,2495 +I/AB-304,Monte Midia,,42.0583,13.1778,1730 +I/AB-305,Monte Padiglione,,42.0194,13.2056,1623 +I/AB-306,Pizzo Cefalone,,42.4742,13.5006,2533 +I/AB-307,Corno Piccolo,,42.4742,13.2364,2655 +I/AB-308,Monte Vallenova,,41.4017,13.9353,1803 +I/AB-309,Monte Scindarella,,42.4269,13.5811,2233 +I/AB-310,Monte Camicia,,42.4383,13.7192,2564 +I/AB-311,Monte Amaro,,42.0864,14.0861,2795 +I/AB-312,Monte Orsello,,42.2472,13.3647,2042 +I/AB-313,Monte Ienca,,42.4631,13.4506,2208 +I/AB-314,Monte Portella,,42.4506,13.5247,2405 +I/AB-315,Monte Prena,,42.9922,13.6831,2561 +I/AB-316,Monte Ceria,,41.9975,13.2925,1708 +I/AB-317,Pizzo Camarda,,42.2333,13.4636,2332 +I/AB-318,Monte Velino,,42.1472,13.3814,2487 +I/AB-319,Monte San Franco,,42.4650,13.3911,2132 +I/BS-301,Monte Grasta,,39.9167,16.0717,1465 +I/BS-302,T.ne della Capanna,,39.9139,16.1333,1823 +I/BS-303,Serra del Prete,,39.9236,16.1653,2180 +I/BS-304,Serra Dolcedorme,,39.9000,16.2167,2267 +I/BS-305,Monte Pollino,,39.9144,16.1933,2248 +I/BS-306,Serra di Crispo,,39.9056,16.2167,2053 +I/BS-307,Serra delle Ciavole,,39.9167,16.2211,2127 +I/BS-308,Monte Forte,,40.5314,15.8058,1444 +I/BS-309,Toppa d'Albano,,40.4894,15.7433,1627 +I/BS-310,Monte Cupolicchio,,40.6333,16.0392,1097 +I/BS-311,Monte Moltonor,,40.7333,15.9833,815 +I/BS-312,Toppa Romito,,40.6706,15.6997,1294 +I/CA-301,Monte Cervialto,,40.7817,15.1306,1809 +I/CA-302,Monte Mutria,,41.3842,14.5233,1823 +I/CA-303,Monte Terminio,,40.8414,14.9381,1806 +I/CA-304,Monte Pizzone,,41.0228,14.6100,800 +I/CA-305,Avella,,40.9611,14.6017,1598 +I/CA-306,Monte Vergine,,40.9336,14.7333,1499 +I/CA-307,Taburno,,41.0958,14.6061,1391 +I/CA-308,Camposauro,,41.1675,14.6006,1388 +I/CL-301,Monte Montalto,,39.1586,15.9367,1955 +I/CL-302,Monte Seduto,,38.4267,16.1839,1143 +I/CL-303,Monte Cresta,,38.4375,16.1669,1006 +I/CL-304,Monte Cappellano,,38.3728,16.1414,910 +I/CL-305,Monte Liminia,,38.3850,16.2150,888 +I/CL-306,Cozzo del Pellegrino,,39.7047,15.9811,1987 +I/CL-307,Monte Botte Donato,,39.2831,16.4478,1928 +I/CL-308,Monte Gariglione,,39.1356,16.6244,1765 +I/CL-309,Monte Basilico,,39.4419,16.7356,1013 +I/CL-310,Monte Pettinascura,,39.3500,16.5686,1708 +I/CL-311,Monte Scuro,,39.3564,16.3847,1633 +I/CL-312,Monte Cuzzo,,39.2186,16.1325,1541 +I/CL-313,Monte Pecoraro,,38.5292,16.3447,1423 +I/CL-314,Monte Crocco,,38.4903,16.2467,1276 +I/CL-315,Monte Poro,,38.6039,15.9097,710 +I/ER-301,M. Molicatico,,44.4711,9.8650,1549 +I/ER-302,Monte Orsaro,,44.3983,9.9967,1831 +I/ER-303,Monte Sillara,,44.3689,10.0667,1861 +I/ER-304,Monte Marmagna,,44.3997,9.9847,1851 +I/ER-305,Monte Matto,,44.3739,10.0472,1837 +I/ER-306,Monte Fuso,,44.5081,10.2706,1115 +I/ER-307,Monte Braiola,,44.4047,9.9906,1819 +I/ER-308,Monte Aquila,,44.3894,10.0097,1780 +I/ER-309,Monte Pelpi,,44.5442,9.6539,1480 +I/ER-310,Monte Barigazzo,,44.6008,9.8350,1284 +I/ER-311,Monte Caio,,44.4686,10.1503,1583 +I/ER-312,Monte Penna,,44.4822,9.4939,1735 +I/ER-313,Monte Maggiorasca,,44.5517,9.4908,1798 +I/ER-314,Monte Tomalo,,44.5306,9.5058,1602 +I/ER-315,Monte Cimone,,44.1944,10.7000,2165 +I/ER-316,Monte Gottero,,44.3642,9.6797,1640 +I/ER-317,Monte Cervellino,,44.5164,10.0581,1493 +I/ER-318,Monte Navert,,44.3931,10.0672,1653 +I/ER-319,Monte Paitino,,44.3725,10.0558,1814 +I/ER-320,Tocca Piumacciolo,,44.3786,10.0572,1711 +I/ER-321,Monte Brusa,,44.3847,10.0219,1796 +I/ER-322,Monte Cimoncino,,44.1917,10.7050,2118 +I/ER-323,Monte Tavola,,44.4264,10.0031,1503 +I/ER-324,Monte Grotta Mora,,44.4733,9.9006,1419 +I/ER-325,Monte Pelata,,44.4708,9.8928,1427 +I/ER-326,Monte Borraccia,,44.4697,9.8397,1259 +I/FV-301,Monte Rest,,46.3536,12.8028,1780 +I/FV-302,Pal Piccolo,,46.5997,12.9497,1866 +I/FV-303,Monte Zermula,,46.5625,13.1528,2145 +I/FV-304,Monte Verzegnis,,46.3650,12.9064,1914 +I/FV-305,Monte Tremol,,46.1200,12.5039,2007 +I/FV-306,Monte Festa,,46.3536,13.0983,1055 +I/FV-307,Monte Crotis,,46.5736,12.8908,2250 +I/FV-308,Monte Pala d'Altei,,46.2503,12.9300,1528 +I/FV-309,Monte San Simone,,46.3433,13.1058,1505 +I/FV-310,Monte Arvenis,,46.4925,12.9358,1697 +I/FV-311,Monte Fara,,46.1792,12.6367,1345 +I/FV-312,Monte Chiampion,,46.2958,13.1808,1709 +I/FV-313,Monte Flagel,,46.2861,12.9717,1467 +I/FV-314,Monte Coglians,,46.6058,12.8889,2780 +I/FV-315,Monte Brancot,,46.3050,13.0900,1049 +I/FV-316,Monte Cuar,,46.4564,12.9883,1478 +I/FV-317,Monte Colombera,,46.1272,12.5028,2066 +I/FV-318,Monte Jof de Miezegnot,,46.4764,13.4558,2089 +I/FV-319,Monte Matajour,,46.2117,13.5292,1641 +I/FV-320,Monte Timau,,46.5960,13.0116,2217 +I/FV-321,Monte Raut,,46.2214,12.6509,2025 +I/LG-301,Monte Valletta della Punta,,44.0589,7.7328,2100 +I/LG-302,Monte Front¨,,44.0558,7.7569,2152 +I/LG-303,Monte Pietravecchia,,43.9892,7.6589,2038 +I/LG-304,Monte Grai,,43.9892,7.6622,2015 +I/LG-305,Monte Toraggio,,43.9772,7.6528,1971 +I/LG-306,Monte Ceppo,,43.9361,7.6042,1927 +I/LG-307,Monte Gouta,,43.9369,7.6033,1310 +I/LG-308,Monte Grande,,43.9867,7.8539,1418 +I/LG-309,Monte Grammondo,,43.8422,7.5100,1378 +I/LG-310,Monte Caggio,,43.8519,7.7081,1090 +I/LG-311,Monte Moro,,43.9430,7.8813,1184 +I/LG-312,Monte Fenaira,,43.9900,7.8575,1459 +I/LG-313,Monte Monega,,44.0367,7.8003,1182 +I/LG-314,Monte Carmo,,44.1772,8.1875,1389 +I/LG-315,Bric Bad²,,44.2164,8.1708,1293 +I/LG-316,Monte Galero,,44.1353,8.0347,1708 +I/LG-317,Monte Ermetta,,44.4450,8.5497,1267 +I/LG-318,Monte Zucchello,,44.6103,9.2567,1417 +I/LG-319,Monte Groppo Rosso,,44.5614,9.4666,1593 +I/LG-320,Monte Tomarlo,,44.5297,9.5047,1602 +I/LG-321,Monte Penna,,44.4814,9.4931,1735 +I/LG-322,Monte Zuccone,,44.4356,9.6061,1423 +I/LG-323,Monte Gottero,,44.3633,9.6786,1640 +I/LG-324,Rocca Tramontina,,44.1008,7.9514,1495 +I/LG-325,Monte Montarlone,,44.5661,9.3597,1500 +I/LG-326,Bric del Dente,,44.4819,8.6758,1109 +I/LG-327,Monte Lega,,43.9636,7.6275,1556 +I/LG-328,Poggio Fearia,,44.0419,7.7928,1846 +I/LG-329,Punta Martin,,44.4783,8.7889,1001 +I/LG-330,Monte Cimonasso,,44.0525,7.7417,2085 +I/LG-331,Monte Bignone,,43.8736,7.7336,1299 +I/LG-332,Croce di Praesto,,43.9428,7.7803,1514 +I/LG-333,Monte Saccarello,,44.0617,7.7136,2205 +I/LG-334,Monte Reixa,,44.4508,8.6669,1183 +I/LG-335,Monte Rama,,44.4278,8.6186,1150 +I/LG-336,Monte Argentea,,44.4344,8.6406,1082 +I/LG-337,Monte Caucaso,,44.4564,9.2256,1245 +I/LG-338,Monte Antola,,44.5744,9.1497,1597 +I/LG-339,Monte Ramaceto,,44.4364,9.3153,1345 +I/LG-340,Monte Aiona,,44.4867,9.4447,1701 +I/LG-341,Monte Rossola,,44.1858,9.6019,563 +I/LG-342,Monte Zatta,,44.4017,9.4606,1404 +I/LG-343,Monte Alpe,,44.3100,9.5228,1094 +I/LG-344,Monte Chiappozzo,,44.3761,9.4886,1126 +I/LO-301,Pizzo Coca,,46.0808,9.9803,3050 +I/LO-302,Pizzo Arera,,45.9347,9.8169,2512 +I/LO-303,Pizzo Presolana,,45.9556,10.0725,2521 +I/LO-304,San Primo,,45.9217,9.2297,1682 +I/LO-305,Canto Alto,,45.7589,9.6664,1146 +I/LO-306,Cima di Lemma,,46.0247,9.7314,2349 +I/LO-307,Resegone,,45.8536,9.4869,1875 +I/LO-308,Monte Boletto,,45.8319,9.1214,1236 +I/LO-309,Monte Campione,,45.8292,10.1839,1848 +I/LO-310,Misma,,45.7361,9.8042,1160 +I/LO-311,Monte Pora,,45.9069,10.1083,1879 +I/LO-312,Monte Guglielmo,,45.7736,10.1992,1949 +I/LO-313,Zona Ferrante,,46.0050,10.0919,2426 +I/LO-314,Cablera,,45.8411,9.8178,1315 +I/LO-315,Corno Stella,,46.0533,9.8078,2612 +I/LO-316,Monte Croce,,45.7828,9.8986,1120 +I/LO-317,Corna Lunga,,45.8083,9.9567,1250 +I/LO-318,Monte Nudo,,45.9225,8.6894,1235 +I/LO-319,Muffetto,,45.8331,10.2489,2060 +I/LO-320,Palazone,,45.8619,9.2017,1436 +I/LO-321,Capione,,45.8022,10.6411,1977 +I/LO-322,Monte Tombea,,45.8061,10.6272,1976 +I/LO-323,Grignetta,,45.9194,9.3883,2177 +I/LO-324,Monte Linzone,,45.7856,9.5186,1392 +I/LO-325,Monte Alben,,45.8622,9.7819,2019 +I/LO-326,Pizzo Formico,,45.8475,9.9236,1637 +I/LO-327,Monte Alto,,45.8675,10.0897,1719 +I/LO-328,Cima Grem,,45.9083,9.8228,2050 +I/LO-329,Monte Par¨,,45.9192,9.9894,1642 +I/LO-330,Scanapa,,45.9231,10.0906,1669 +I/LO-331,Pizzo tre Signori,,46.0117,9.5275,2554 +I/LO-332,Monte Pizzocolo,,45.6731,10.5919,1582 +I/LO-333,Monte Bolettone,,45.8369,9.1792,1317 +I/LO-334,Castello Regina,,45.8417,9.6186,1424 +I/LO-335,Zuccon Campelli,,45.9533,9.5169,2092 +I/LO-336,Cima Blum,,45.9081,9.9678,1297 +I/LO-337,Monte Corru,,45.9556,9.9614,1823 +I/LO-338,Cimone della Bagozza,,46.0117,10.2506,2410 +I/LO-339,Monte Paletti,,45.9189,10.4058,2147 +I/LO-340,Aralalta,,45.9453,9.5769,2006 +I/LO-341,Monte Legnone,,46.0947,9.4147,2609 +I/LZ-301,Monte Autore,,41.9606,13.2042,1853 +I/LZ-302,Monte Cotento,,41.9169,13.3339,2014 +I/LZ-303,Monte Viglio,,41.8842,13.3731,2136 +I/LZ-304,Morra,,42.0336,12.8336,1030 +I/LZ-305,Terminillo,,42.4744,12.9981,2216 +I/LZ-306,Cacume,,41.5700,13.2328,1035 +I/LZ-307,Gennaro,,42.0667,12.8000,1272 +I/LZ-308,Tancia,,42.3169,12.7358,1292 +I/LZ-309,Nuria,,42.3614,13.0911,1892 +I/LZ-310,Pizzuto,,42.3356,12.7261,1288 +I/LZ-311,Pellecchia,,42.1003,12.8669,1368 +I/LZ-312,Cambio,,42.513842,13.023734,2084 +I/LZ-313,Cima d'Arme,,42.5106,12.8931,1678 +I/LZ-314,Rosato,,42.5131,12.8917,1510 +I/LZ-315,Semorevisa,,41.5697,13.0903,1536 +I/LZ-316,Monte Gorzano,,42.6181,13.3956,2458 +I/MC-301,Monte Lieto,,42.8339,13.1667,1944 +I/MC-302,Monte Acuto,,43.3167,13.2164,1668 +I/MC-303,Monte Castel S. Maria,,42.2092,12.9281,1239 +I/MC-304,Monte Castel Manardo,,42.9825,13.2303,1917 +I/MC-305,Monte San Vicino,,43.3250,13.1081,1485 +I/MC-306,Monte Catria,,43.4608,12.7050,1701 +I/MC-307,Monte Rotondo,,42.4933,12.7697,2103 +I/MC-308,Monte Vettore,,42.8244,13.2758,1863 +I/MC-309,Monte Vettoretto,,42.8242,13.2761,2052 +I/MC-310,Monte Priora,,42.9328,13.2406,2332 +I/MO-301,Monte Miletto,,41.4497,14.3669,2050 +I/MO-302,Monte La Gallinola,,41.4344,14.4194,1923 +I/MO-303,Monte Mutria,,41.3836,14.5186,1823 +I/MO-304,Monte Patalecchia,,41.5336,14.3167,1089 +I/MO-305,Monte Marrone,,41.6336,14.0000,1337 +I/MO-306,Monte Mare,,41.6353,13.9978,1656 +I/MO-307,Monte Vairano,,41.5500,14.5831,927 +I/PM-301,Cima Bossola,,45.4839,7.7189,1509 +I/PM-302,Monte Cavallaria,,45.5211,7.8086,1464 +I/PM-303,Punta Quinzeina,,45.4633,7.6378,2344 +I/PM-304,Monte Gregorio,,45.5250,7.7833,1955 +I/PM-305,Mombarone,,45.5897,7.8964,2341 +I/PM-306,Bric Paglie,,45.5683,7.9119,1859 +I/PM-307,Monticchio,,45.6639,8.0475,1697 +I/PM-308,Monte Cucco,,45.6297,8.0056,1515 +I/PM-309,Punta Frassati,,45.6175,7.9556,2033 +I/PM-310,Cintiplagna,,45.0722,7.0128,2849 +I/PM-311,Rocciamelone,,45.2036,7.0772,3538 +I/PM-312,Punta dell'Aquila,,45.0039,7.2389,2115 +I/PM-313,Rocca Patanua,,45.1783,7.2197,2410 +I/PM-314,Monte Musine,,45.1139,7.4544,1150 +I/PM-315,Rocca della Sella,,45.1403,7.3519,1508 +I/PM-316,Ciarm del Prete,,45.2644,7.2911,2390 +I/PM-317,Punta di Ostanetta,,44.7286,7.2000,2375 +I/PM-318,Monte Bocciarda,,45.0053,7.2014,2215 +I/PM-319,Punta Sarasina,,45.0058,7.2117,2205 +I/PM-320,Punta Sourel,,45.2072,7.3494,1770 +I/PM-321,Malamot,,45.1992,6.9119,2924 +I/PM-322,Genevris,,45.0311,6.9017,2536 +I/PM-323,Monte Sapei,,45.1533,7.3494,1610 +I/PM-324,Monte Soglio,,45.3719,7.5303,1970 +I/PM-325,Monte Orsiera,,45.2072,7.1067,2890 +I/PM-326,La Cialma,,45.4122,7.3975,2193 +I/PM-327,Il Turu,,45.2339,7.4669,1355 +I/PM-328,Punta di Costa Fiorita,,45.1675,7.3389,1760 +I/PM-329,Pizzo Proman,,46.0242,8.3944,2100 +I/PM-330,Monte Massone,,45.9469,8.3378,2161 +I/PM-331,Monte Zeda,,46.0450,8.5356,2156 +I/PM-332,Punta di Terrarossa,,46.2681,8.0903,3245 +I/PM-333,Monte Faraut,,44.5458,6.9653,3046 +I/PM-334,Punta d’Arbella,,45.4461,7.5558,1879 +I/PM-335,Cima dell’Uia,,45.3713,7.4913,2142 +I/PM-336,Monte Birrone,,44.5422,7.2519,2131 +I/PM-337,Monte Ciriunda,,45.2702,7.3063,2244 +I/PM-338,Punta Violetta,,45.4822,7.1697,3031 +I/PM-339,Punta Leynir,,45.5166,7.1383,3235 +I/PM-340,Punta Lunella,,45.1972,7.2161,2772 +I/PM-341,Punta Golai,,45.2647,7.2411,2819 +I/PM-342,Monte Francaise Peloux,,45.0691,7.0661,2736 +I/PM-343,Monte Pelvo,,45.0651,7.0702,2770 +I/PM-344,Monte Orsiera,,45.0647,7.1066,2890 +I/PM-345,Monte Nibl¨,,45.1401,6.8972,3365 +I/PM-346,Punta Sbaron,,45.1789,7.2801,2223 +I/PM-347,Monte Pintas,,45.0789,7.0441,2543 +I/PM-348,Cima del Vallone,,45.1251,6.9286,2437 +I/PM-349,Punta Mulatera,,45.1675,6.9633,2544 +I/PM-350,Rocca Moross,,45.2761,7.3347,2135 +I/PM-351,Rocca Pergo Piccola,,44.3675,7.2033,2092 +I/PM-352,Monte Il Pilone,,45.1903,7.4147,1467 +I/PM-353,Monte Arpone,,45.1786,7.3969,1602 +I/PM-354,Monte Colombano,,45.1994,7.4311,1658 +I/PM-355,Uia di Calcante,,45.2591,7.3875,1614 +I/PM-356,Santa Cristina,,45.3269,7.3806,1304 +I/PM-357,Monte Fai¨,,44.9717,7.283,1382 +I/PM-358,Monte Cristetto,,44.9894,7.2814,1611 +I/PM-359,Monte Rosselli,,45.1678,7.4642,1205 +I/PM-360,Monte Pietraborga,,45.0214,7.4217,926 +I/PM-361,Monte Lion,,45.5022,7.6911,2009 +I/PM-362,Monte Marmottere,,45.2751,7.3144,2192 +I/PM-363,Monte Baron,,45.1586,7.4775,818 +I/PM-364,Monte Muretto,,45.0001,7.2706,1706 +I/PM-365,Monte Paletto,,44.9981,7.2717,1667 +I/PM-366,Punta Mid¬ o Muret,,44.9694,7.1081,2210 +I/PM-367,Monte Vaccarezza,,44.3578,7.4631,2203 +I/PM-368,Cima dell’Angiolino,,45.3583,7.4711,2168 +I/PM-369,Punta dell’Aggia,,45.3701,7.4303,2254 +I/PM-370,Monte La Rossa,,45.3739,7.1958,2319 +I/PM-371,Monte Salancia,,45.0767,7.1958,2088 +I/PM-372,Monte Bisalta o Besimauda,,44.2717,7.6058,2231 +I/PM-373,Monte Bellavarda,,45.3753,7.3872,2345 +I/PM-374,Punta Mars¨,,45.3764,7.3994,2318 +I/PM-375,Monte Riba del Gias,,44.6222,7.2014,2379 +I/PM-376,Testa di Garitta Nuova,,44.6214,7.2151,2385 +I/PM-377,Monte Tobbio,,44.5881,8.8047,1093 +I/PM-378,Monte Selletta,,44.8928,7.0281,2575 +I/PM-379,Monviso,,44.6675,7.0901,3841 +I/PM-380,Cima della Crocetta,,45.4108,7.2692,2824 +I/PM-381,Bric del Mindino,,44.2369,7.9544,1879 +I/PM-382,Monte Poggio,,44.5314,8.7842,1081 +I/PM-383,Monte Palon,,45.1897,7.1211,2965 +I/PM-384,Viso Mozzo,,44.6747,7.1094,3019 +I/PM-385,Monte Croce,,45.8836,8.3094,1645 +I/PM-386,Monte Cerano,,45.0833,8.3858,1702 +I/PM-387,Poggio Croce,,45.9353,8.3761,1759 +I/PM-388,Monte Oserot,,44.3931,6.9917,2860 +I/PM-389,Punta Fattiere,,45.0767,7.0319,2698 +I/PM-390,Monte Civrari,,45.1922,7.3272,2302 +I/PM-391,Punta Grifone,,45.1969,7.2689,2408 +I/PM-392,Rocca Maritano,,45.1942,7.2328,2545 +I/PM-393,Monte Ruetas,,44.9751,6.9747,2935 +I/PM-394,Punta Gias Vej,,45.3625,7.4239,2180 +I/PM-395,Monte Vandalino,,44.8372,7.1651,2136 +I/PM-396,Punta Rumella,,44.7306,7.2011,2322 +I/PM-397,Monte Bussaia,,44.2158,7.4681,2451 +I/PM-398,Monte Doubia,,44.3414,7.2961,2463 +I/PM-399,Monte Arzola,,45.4461,7.4606,2158 +I/PM-400,Monte San Giorgio,,44.9972,7.4478,837 +I/PM-401,Monte Montagnazza,,45.0028,7.4267,892 +I/PM-402,Monte Tre Denti,,44.9714,7.3251,1343 +I/PM-403,Monte Muretto,,45.0692,7.1781,2278 +I/PM-404,Monte Merqua,,44.2614,7.3039,2148 +I/PM-405,Uia d'Ingria,,45.4592,7.5408,1921 +I/PM-406,Cima del Loit,,45.4567,7.5194,2034 +I/PM-407,Monte Mondol¨,,44.2222,7.7561,2382 +I/PM-408,Punta del Vallone,,45.4781,7.4981,2479 +I/PM-409,Truc della Diera,,45.2611,7.3569,1567 +I/PM-410,Cima Mares,,45.3956,7.5633,1654 +I/PM-411,Rocche San Martino,,45.3944,7.5825,1507 +I/PM-412,Monte Freidour,,44.9733,7.3028,1451 +I/PM-413,Monte Chersogno,,44.5269,7.0197,3006 +I/PM-414,Monte San Bernardo,,44.5075,7.3561,1625 +I/PM-415,Monte Mongioie,,44.1758,7.7851,2631 +I/PM-416,Pizzo d'Ormea,,44.1658,7.8297,2476 +I/PM-417,Punta Cornour,,44.8514,7.0936,2868 +I/PM-418,Punta Cialancia,,44.8628,7.1003,2855 +I/PM-419,Punta Gnifetti,,45.9272,7.8769,4554 +I/PM-420,Monte Garbella,,44.1844,7.4764,2305 +I/PM-421,Rocca Pergo Grossa,,44.3694,7.2628,2198 +I/PM-422,Punta delle Serene,,45.2858,7.1856,2643 +I/PM-423,Punta Sea Bianca,,44.7242,7.1147,2721 +I/PM-424,Punta Marguareis,,44.1661,7.6828,2651 +I/PM-425,Monte Nebin,,44.5431,7.1453,2514 +I/PM-426,Punta Rasciassa,,44.6289,7.1542,2664 +I/PM-427,Rocca Bianca,,44.9042,7.0919,2379 +I/PM-428,Monte Servin,,44.8769,7.1851,1756 +I/PM-429,Monte Ebro,,44.6919,9.1701,1701 +I/PM-430,Monte Chiappo,,44.6872,9.2017,1699 +I/PM-431,Pizzo San Martino,,46.0125,8.0906,2738 +I/PM-432,Monte Fal²,,45.8472,8.4833,1500 +I/PM-433,Monte Carmo,,44.6158,9.1997,1642 +I/PM-434,Monte Chialmo,,44.4361,7.2344,1642 +I/PM-435,Cima di Bo,,45.7151,7.9986,2556 +I/PM-436,Punta Tre Vescovi,,45.7253,7.9375,2501 +I/PM-437,Gemelli di Mologna,,45.7183,7.9281,2476 +I/PM-438,Monte Cresto,,45.6817,7.9101,2546 +I/PM-439,Cima delle Guardie,,45.6901,8.0186,2007 +I/PM-440,Punta della Gragliasca,,45.6658,7.9217,2397 +I/PM-441,Alpe Rittana,,44.3578,7.3281,1796 +I/PM-442,Monte Pan ,,44.7058,9.1539,1659 +I/PM-443,Monte Cosfrone,,44.6958,9.1581,1667 +I/PM-444,Monte Mucrone,,45.5881,7.9439,2335 +I/PM-445,Rocca dellAbisso,,44.1433,7.5039,2755 +I/PM-446,Monte Tamone,,44.3867,7.3808,1393 +I/PM-447,Rocca d'Argimonia,,45.6678,8.1044,1613 +I/PM-448,Monte Bracco,,44.6811,7.3383,1306 +I/PM-449,Roc delle Fate,,45.5569,7.9153,1325 +I/PM-450,San Bernardo,,45.6772,8.1411,1407 +I/PM-451,Punta Sella,,45.6267,7.9128,2315 +I/PM-452,Cima Mares,,45.3944,7.5628,1600 +I/PM-453,Rocche di S. Martino,,45.3933,7.5803,1400 +I/PM-454,Monte Calvo,,45.4611,7.6928,1300 +I/PM-455,Cima Spinalba,,45.4678,7.7317,900 +I/PM-456,Cima Belice,,45.4186,7.6419,940 +I/PM-457,Cima Montesino,,45.5069,7.8828,516 +I/PM-458,Monte Margut,,45.5072,7.8828,512 +I/PM-459,Monte di Maggio,,45.5011,7.8708,431 +I/PM-460,Cima Cavanna,,45.5664,7.9089,1564 +I/PU-301,Cornacchia,,41.3392,15.1469,1152 +I/PU-302,S. Vito,,41.3189,15.1772,1015 +I/PU-303,Celano,,41.7439,15.7197,1007 +I/PU-304,Caccia,,41.0208,16.2258,679 +I/PU-305,Guadianello,,41.0911,16.1125,455 +I/PU-306,Serio,,40.8136,17.2011,441 +I/PU-307,Pizzuto,,40.7628,17.4511,350 +I/PU-308,Pagliarone,,41.4033,15.1153,1029 +I/SI-301,Monte Soro,,37.9189,14.6544,1847 +I/SI-302,Pizzo Carbonara,,37.8608,14.0253,1979 +I/SI-303,Serra del Re,,37.8883,14.9853,1754 +I/SI-304,Montagna Grande,,37.9364,15.1914,1374 +I/SI-305,Monte Lauro,,37.1300,14.8200,986 +I/SI-306,Monte Raci,,36.9747,14.6708,610 +I/SI-307,Monte Racello,,36.9717,14.6628,433 +I/SI-308,Monte Arcibessi,,37.0303,14.7200,906 +I/SI-309,Monti Rossi,,37.6197,15.1589,950 +I/SI-310,Monte Minardo,,37.7344,14.7033,1304 +I/SI-311,Monte Baracca,,37.7814,15.0447,1742 +I/SI-312,Monte Serra Pizzuta Calvarina,,37.6911,15.0247,1704 +I/SI-313,Monyi Silvestri,,37.7044,15.0083,2001 +I/TN-302,Cima Caregna,,45.7239,11.1297,2259 +I/TN-303,Cima d'Asta,,46.1781,11.6058,2847 +I/TN-304,Cima Presana,,46.2219,10.5872,3069 +I/TN-305,Cima Palom,,45.7919,11.1764,2009 +I/TN-306,Cima Vezzena,,45.9844,11.3603,1908 +I/TN-307,Monte Altissimo,,45.8067,10.8819,2078 +I/TN-308,Monte Stivo,,45.9300,10.9406,2059 +I/TN-309,Monte Zugna,,45.8214,11.0478,1864 +I/TN-310,Monte Finonchio,,45.8967,11.1267,1603 +I/TN-311,Corno Paura,,45.7711,10.9614,1539 +I/TN-312,Monte Vignola,,45.7689,10.9133,1607 +I/TN-313,Monte Cauriol,,46.2153,11.6317,2494 +I/TN-314,Monte Vioz,,46.4017,10.6331,3645 +I/TN-315,Cima Bocche,,46.3542,11.7522,2745 +I/TN-316,Corno Nero,,46.3358,11.4467,2439 +I/TN-317,Cima Ombretta,,46.4242,11.8467,2983 +I/TN-318,Monte Presanella,,46.2194,10.6642,3356 +I/TN-319,Monte Penegal,,46.4383,11.2164,1800 +I/TN-320,Catinaccio,,46.4542,11.6217,3002 +I/TN-321,Cima Cece,,46.2608,11.6842,2754 +I/TN-322,La Fontanella,,46.0658,11.3422,2037 +I/TN-323,Col Santo,,46.8331,11.1506,2112 +I/TN-324,Punta Penia,,46.4344,11.8497,3342 +I/TN-325,Croz dell’ Altissimo,,46.1694,10.9411,2338 +I/TN-326,Cima Olmi,,46.4819,10.9642,2656 +I/TN-327,Monte Cornetto,,45.7469,11.1761,2060 +I/TN-328,Monte Biaena,,45.8825,10.9706,1600 +I/TN-329,Cima Paradisi,,46.2303,11.6628,2206 +I/TN-330,Coma dell’Uomo,,46.4061,11.8083,3010 +I/TN-331,Cima Fravort,,46.0764,11.3517,2347 +I/TN-332,Cima Folga,,46.1986,11.7544,2435 +I/TN-333,Cima Mulaz,,46.3164,11.8322,2906 +I/TN-334,Pala di Santa,,46.3461,11.5136,2488 +I/TN-335,Monte Peller,,46.3150,10.9433,2319 +I/TN-336,Monte Brento,,45.9875,10.8978,1545 +I/TN-337,Monte Castellaz,,46.3075,11.7950,2333 +I/TN-338,Monte Brione,,45.8850,10.8747,376 +I/TN-339,Cima Lagorai,,46.2025,11.5239,2585 +I/TN-340,Monte Misone,,45.9553,10.8333,1803 +I/TN-341,Cima Valsorda,,46.1997,11.7358,2287 +I/TN-342,Monte Roen,,46.3599,11.1921,2116 +I/TO-301,Monte Pania della Croce,,44.0358,10.3239,1859 +I/TO-302,Poggio all'Aia,,43.8822,11.2308,918 +I/TO-303,Monte Sagro,,44.1147,10.1600,1748 +I/TO-304,Monte Calvi,,43.0931,10.6236,646 +I/TO-305,Monte Gennaio,,44.1028,10.8461,1814 +I/TO-306,Libro Aperto,,44.1569,10.7133,1936 +I/TO-307,Monte Spigolino,,44.1256,10.7953,1830 +I/TO-308,Poggio delle Ignude,,44.0978,10.8494,1732 +I/TO-309,Monte Forato,,44.0164,10.3344,1223 +I/TO-310,Monte Giovo,,44.1328,10.5767,1991 +I/TO-311,Poggio di Gallicano,,44.0678,10.9550,1152 +I/TO-312,Monte Prato Fiorito,,44.0492,10.6264,1297 +I/TO-313,Poggio dei Malandrini,,44.0989,10.8483,1662 +I/TO-314,Le Cornate,,43.1569,10.8492,1060 +I/TO-315,Poggio Casaccia,,42.8731,11.2383,921 +I/TO-316,Monte Rondinaio,,44.1161,10.5939,1964 +I/TO-317,Monte Calvana,,43.8786,11.3744,913 +I/TO-318,Uomo di Sasso,,43.6844,11.6089,1535 +I/TO-319,Monte Faltrona,,43.8728,11.6967,1643 +I/TO-320,Monte Nona,,43.9950,10.3389,1279 +I/TO-321,Monte Matanna,,43.9839,10.3364,1314 +I/UM-301,Monte Subasio,,43.0497,12.6667,1290 +I/UM-302,Monte Martano,,42.7828,12.5764,1094 +I/UM-303,Monte Vettor,,42.8239,13.2761,2476 +I/UM-304,Serra Santa,,42.8239,13.2761,1423 +I/VA-301,Mt Chaz Dura,,45.6994,6.8778,2584 +I/VA-302,Col della Croce,,45.7519,7.0061,2373 +I/VA-303,Testa d' Arpy,,45.7458,7.0125,2022 +I/VA-304,Punta del Dric,,45.6922,7.3297,2683 +I/VA-305,Truc d'Arbe,,45.6806,7.1547,1291 +I/VA-306,Punta Fontana Fredda,,45.8533,7.6256,2513 +I/VA-307,Cimetta Rossa,,45.6122,7.5794,2466 +I/VA-308,Bec Renon,,45.5631,7.7497,2266 +I/VA-309,Punta Regina,,45.7483,7.8181,2388 +I/VA-310,Zerbion,,45.8194,7.6586,2719 +I/VA-311,Corno del Camoscio,,45.8778,7.8664,3030 +I/VA-312,Stlolemberg,,45.8792,7.8656,3200 +I/VA-313,Cima Piana,,45.6433,7.5967,2512 +I/VA-314,Cima Bonze,,45.5514,7.7308,2516 +I/VA-315,Monte Parassone,,45.6028,7.8272,1799 +I/VA-316,Monte Glacier,,45.6364,7.5358,3186 +I/VA-317,Le Grand Chateau,,45.6244,7.7025,1650 +I/VA-318,Cima Botta,,45.7769,7.6814,2048 +I/VA-319,Testa di Comagna,,45.7447,7.7222,2100 +I/VA-320,Monte Ros,,45.7175,7.7131,1598 +I/VA-321,Cima Les Ors,,45.7728,7.0906,2168 +I/VA-322,Cima Verney,,45.6919,6.8742,2294 +I/VA-323,Punta Falita,,45.7731,7.1108,2623 +I/VA-324,Monte della Saxe,,45.7578,6.9975,2348 +I/VA-325,Punta Bernarda,,45.8333,7.0372,2534 +I/VA-326,Monte du Parc,,45.7236,6.9553,1732 +I/VE-301,Monte Coppolo,,46.0528,11.7006,2069 +I/VE-302,Monte Ortigara,,46.0250,11.5375,2017 +I/VE-303,Monte Avena,,45.6867,13.8678,1454 +I/VE-304,Monte Rivon,,45.6983,11.2003,1691 +I/VE-305,Monte Maggio,,45.8033,11.2875,1853 +I/VE-306,Monte Priafora,,45.7775,11.2844,1659 +I/VE-307,Spiz Tonezza,,45.8889,11.2986,1694 +I/VE-308,Cima Pradazzo,,46.3250,11.7528,2279 +I/VE-309,Monte Cesen,,45.9447,12.0356,1560 +I/VE-310,Col de Moi,,45.0528,12.0336,1358 +I/VE-311,Monte Cernera,,46.4811,12.0536,2664 +I/VE-312,Mo0nte Paterno,,46.6167,12.3014,2744 +I/VE-313,Monte Serva,,46.2372,12.3889,2133 +I/VE-314,Monte Caldiera,,46.0003,11.5208,2124 +I/VE-315,Monte Boral,,46.0217,12.2042,1245 +I/VE-316,Monte Punta,,46.3553,12.2000,1952 + +# gma suites, cqgma.eu +# created: 16.04.2015 - 18.00.14,,,,, +EC6/CA-001,Na Picamosques,,39.14420700,2.91899443,172 +EC6/FO-001,Sa Talaiassa,,38.66547394,1.53634703,195 +EC6/IB-001,Sa Talaia,,38.91138840,1.27416694,475 +EC6/IB-002,Es Vedra,,38.86666870,1.20000005,382 +EC6/MA-001,Puig Major,,39.80747986,2.79342389,1445 +EC6/MA-002,Puig de l’Ofre,,39.76338959,2.76743889,1093 +EC6/MA-003,Cornador Gran,,39.75939941,2.74731207,953 +EC6/MA-004,Torre Picada,,39.80583191,2.69774389,161 +EC6/MA-005,Muleta,,39.79607391,2.68113589,116 +EC6/MA-006,Puig de na Franquesa,,39.76882935,2.77603006,1067 +EC6/MA-007,Puig des Tossals Verds,,39.78382111,2.81983995,1111 +EC6/MA-008,Sa Rateta,,39.77410889,2.78291988,1113 +EC6/MA-009,Coll d en Marques,,39.79296494,2.71109104,210 +EC6/MA-010,Sa Font des Noguer,,39.78908157,2.79807997,771 +EC6/MA-011,Coll de Roca Mala,,39.77566147,2.79614902,799 +EC6/ME-001,Monte Toro,,39.98866272,4.11639690,357 +HB9/-1001,Monte Toro,,0.00000000,0.00000000,357 +HB9/AG-1001,Wasserflue,,47.43109894,8.02060032,866 +HB9/AG-1002,Homberg,,47.42919922,8.06639957,776 +HB9/AG-1003,Frickberg,,47.51309967,8.04360008,650 +HB9/AI-1001,Hochhus,,47.25080109,9.43809986,1926 +HB9/AI-1002,Kamor,,47.28978348,9.48669815,1751 +HB9/AR-1001,Petersalp,,47.28670120,9.30690002,1589 +HB9/AR-1002,Gupf,,47.43000031,9.49279976,1077 +HB9/AR-1003,Sommersberg,,47.36830139,9.48890018,1180 +HB9/BE-1001,Lauteraarhorn,,46.58309937,8.12810040,4042 +HB9/BE-1002,Naessihorn,,46.59439850,8.11139965,3741 +HB9/BE-1003,Kleines Lauteraarhorn,,46.57889938,8.13920021,3737 +HB9/BE-1004,Silberhorn,,46.54169846,7.94890022,3695 +HB9/BE-1005,Wyssi Frau,,46.49280167,7.78359985,3650 +HB9/BE-1006,Altels,,46.42860031,7.67859983,3629 +HB9/BE-1007,Morgenhorn,,46.49499893,7.79220009,3623 +HB9/BE-1008,Ankenbaelli,,46.61109924,8.14529991,3601 +HB9/BE-1009,Kleines Schreckhorn,,46.60169983,8.10190010,3494 +HB9/BE-1010,Oeschinenhorn,,46.48360062,7.76719999,3486 +HB9/BE-1011,Lauteraar Rothoerner,,46.56689835,8.15359974,3478 +HB9/BE-1012,Kleindoldenhorn,,46.46969986,7.72720003,3475 +HB9/BE-1013,Strahlegghorn,,46.57529831,8.11779976,3461 +HB9/BE-1014,Scheuchzerhorn,,46.54389954,8.19060040,3456 +HB9/BE-1015,Alte Strahlegg,,46.55920029,8.12749958,3454 +HB9/BE-1016,Wysse Nollen,,46.65390015,8.39890003,3398 +HB9/BE-1017,Rotbraett,,46.54249954,7.93889999,3386 +HB9/BE-1018,Scheideggwetterhorn,,46.64469910,8.11060047,3361 +HB9/BE-1019,Ewigschneehorn,,46.59690094,8.16829967,3329 +HB9/BE-1020,Raenfenhorn,,46.63359833,8.16499996,3259 +HB9/BE-1021,Hinterer Tierberg,,46.54690170,8.21310043,3205 +HB9/BE-1022,Hiendertelltihorn,,46.59999847,8.23690033,3179 +HB9/BE-1023,Maettenberg,,46.60829926,8.07859993,3104 +HB9/BE-1024,Mutthorn,,46.48830032,7.82310009,3035 +HB9/BE-1025,Fuenffingerstoeck,,46.75220108,8.43610001,2994 +HB9/BE-1026,Äussere Fisistock,,46.47330093,7.70419979,2946 +HB9/BE-1027,Wild Andrist,,46.54779816,7.79689980,2849 +HB9/BE-1028,Grosses Engelhorn,,46.67190170,8.18000031,2782 +HB9/BE-1029,Faulhorn,,46.67470169,7.99889994,2681 +HB9/BE-1030,Birg,,46.56169891,7.85809994,2677 +HB9/BE-1031,Ammertenspitz,,46.43310165,7.52470016,2613 +HB9/BE-1032,First,,46.50469971,7.64309978,2549 +HB9/BE-1033,Indri Saegissa,,46.66830063,7.96280003,2465 +HB9/BE-1034,Maennlichen,,46.61809921,7.93809986,2343 +HB9/BE-1035,Rauflihorn,,46.53279877,7.48280001,2323 +HB9/BE-1036,Axalphorn,,46.70999908,8.06079960,2321 +HB9/BE-1037,Raufligrat,,46.53279877,7.48280001,2259 +HB9/BE-1038,Tierlaufhorn,,46.94426115,7.52547296,2242 +HB9/BE-1039,Wandeliflue,,46.44609833,7.33109999,2203 +HB9/BE-1040,Dentenberg,,46.94323000,7.52152000,714 +HB9/BE-1041,Erdburg,,46.92176000,7.51742000,652 +HB9/BE-1042,Lisiberg,,46.88020000,7.44646000,972 +HB9/BE-1043,Huernberg,,46.89762000,7.63095000,915 +HB9/BE-1044,Hube/Hubewald,,46.84496000,7.61224000,865 +HB9/BE-1045,Falkeflue,,46.64065000,7.64065000,1078 +HB9/BE-1046,Lueg,,47.07417000,7.70507000,887 +HB9/BE-1047,Rothoehe,,47.04030000,7.61576000,692 +HB9/BE-1048,rothhoehe,,9999.99999999,7.00000000,686 +HB9/BL-1001,Geitenberg,,47.37580109,7.66359997,1132 +HB9/BL-1002,Leutschenberg,,47.41139984,7.93389988,910 +HB9/BL-1003,Blauen/Brunnenberg,,47.45420074,7.46829987,875 +HB9/BL-1004,Wischberg,,47.48170090,7.89610004,678 +HB9/BL-1005,Wischberg,,0.00000000,0.00000000,678 +#HB9/FR-1001,Gros Perré,,46.50310135,7.12610006,2208 +HB9/FR-1002,Maere,,46.67470169,7.37580013,2086 +HB9/FR-1003,Fochsenflue,,46.63639832,7.27419996,1975 +HB9/FR-1004,Le Cousimbert,,46.69169998,7.18559980,1633 +HB9/FR-1005,Chasseral,,47.05920029,7.05919981,1607 +HB9/FR-1006,Baederhorn,,46.61309814,7.32749987,2009 +HB9/GL-1001,Piz Cazarauls,,46.81280136,8.87689972,3069 +HB9/GL-1002,Berglihorn,,46.94329834,9.12390041,2428 +HB9/GL-1003,Alpbigligenstoeckli,,47.07860184,9.17889977,1958 +HB9/GL-1004,Gulmen,,47.08309937,9.18970013,1828 +HB9/GL-1005,Zindlenspitz,,47.07640076,8.95969963,2097 +HB9/GR-1001,Puntone dei Fracion,,46.47109985,9.08500004,3202 +HB9/GR-1002,Piz Traunter Ovas,,46.51499939,9.73060036,3151 +HB9/GR-1003,Muotas Muragl,,46.50000000,9.83329964,2568 +HB9/GR-1004,Piz Lunghin,,46.41059875,9.67029953,2780 +HB9/GR-1005,Roggenhorn: Suedwestgipfel,,46.83440018,10.00780010,2891 +HB9/GR-1006,Piz Timun/ Pizzo d'Emet,,46.46689987,9.40939999,3209 +HB9/GR-1007,Piz Murtaroel/ Cima la Casina,,46.57030106,10.28750038,3180 +HB9/GR-1008,Piz di Pian,,46.45470047,9.27190018,3158 +HB9/LU-1001,Schonguetsch,,46.78860092,8.03639984,2320 +HB9/LU-1002,Hagerlen,,46.83639908,8.04220009,1949 +HB9/LU-1003,Dossen,,47.02690125,8.49860001,1685 +HB9/LU-1004,Studberg,,46.98640060,8.20189953,1603 +HB9/LU-1005,Vitznauer/Gersauer Stock,,47.00439835,8.50920010,1452 +HB9/LU-1006,Napf,,47.00360107,7.93970013,1408 +HB9/LU-1007,Hochaenzi,,47.00669861,7.90889978,1339 +HB9/NW-1001,Rigidalstock,,46.85189819,8.41940022,2593 +HB9/OW-1001,Ruchstock,,46.85440063,8.47309971,2812 +HB9/OW-1002,Gross Gemsispil,,46.83560181,8.46310043,2518 +HB9/SG-1001,Sichelchamm,,47.13359833,9.36250019,2269 +HB9/SG-1002,Chrummenstein,,47.11579895,9.40579987,2261 +HB9/SG-1003,Hochhus,,47.25080109,9.43809986,1926 +HB9/SG-1004,Neuenalpspitz,,47.20750046,9.25220013,1816 +HB9/SG-1005,Schwendigrat,,47.20220184,9.27060032,1538 +HB9/SG-1006,Hochalp,,47.27529907,9.25440025,1530 +HB9/SG-1007,Regelstein,,47.24779892,9.07779980,1315 +HB9/SG-1008,Halbruetispitz,,47.30530167,9.00170040,1274 +HB9/SG-1009,Schafwis,,47.22560120,9.29609966,1987 +HB9/SG-1010,Baerensberg,,47.43432617,9.08701801,608 +HB9/SG-1011,Vogelsberg,,47.43674088,9.11565018,702 +HB9/SG-1012,Wildberg,,47.41212463,9.11282158,805 +HB9/SG-1013,Kreienberg,,47.41146469,9.15106010,783 +HB9/SG-1014,Chapf,,47.41572189,9.12245941,801 +HB9/SG-1015,Riemensberg,,47.39477539,9.10988426,807 +HB9/SG-1016,Winzenberg,,47.39698410,9.11659908,863 +HB9/SO-1001,Grenchenberg,,47.22940063,7.38329983,1405 +HB9/SO-1002,Geissflue,,47.41970062,7.95669985,963 +HB9/SO-1003,Saeli,,47.33440018,7.91890001,664 +HB9/SZ-1001,Saeli,,0.00000000,0.00000000,664 +HB9/SZ-1002,Rot Nossen,,46.90280151,8.89560032,2502 +HB9/SZ-1003,Blueemberg,,46.93170166,8.73939991,2405 +HB9/SZ-1004,Forstberg,,47.00080109,8.82390022,2215 +HB9/SZ-1005,Haengst,,46.92250061,8.85830021,2003 +HB9/SZ-1006,Brueschtockbuegel,,47.10829926,8.93809986,1489 +HB9/TG-1001,Grat,,47.38560104,8.96640015,996 +HB9/TG-1002,Obere Saedelegg,,47.41108322,8.91784763,852 +HB9/TG-1003,St. Pelagiberg,,47.48797989,9.29857254,601 +HB9/TG-1004,Hiltebaerg,,47.46782684,8.97768974,636 +HB9/TG-1005,Buechholz,,47.46888351,8.97106266,645 +HB9/TG-1006,Buchegg,,47.40546600,8.94050000,834 +HB9/TI-1001,Cima di Camadra,,46.60969925,8.90610027,3172 +HB9/TI-1002,Piz Alpettas,,46.58940125,9.04189968,2979 +HB9/TI-1003,Filo di Remia,,46.39670181,9.09309959,2939 +HB9/TI-1004,Pizzo del Ramulazz,,46.39970016,9.09640026,2914 +HB9/TI-1005,Pizzo Sorda,,46.53779984,9.00000000,2885 +HB9/TI-1006,Pizzo di Gueida,,46.60279846,9.01609993,2845 +HB9/TI-1007,Pizzo Pianicco,,46.41139984,9.10309982,2832 +HB9/TI-1008,Monte Prosa,,46.56169891,8.58250046,2737 +#HB9/TI-1009,Pizzo dell'Alpe Gelato,,46.24919891,8.44439983,2617 +HB9/TI-1010,Ritzberg,,46.31919861,8.44390011,2592 +HB9/TI-1011,Pizzo Stabbiello,,46.55189896,8.67920017,2442 +HB9/TI-1012,Pianca,,46.25249863,8.49940014,2376 +HB9/TI-1013,Mottone di Cava,,46.35670090,9.02110004,2371 +HB9/TI-1014,Cima di Precastello,,46.28580093,8.90639973,2359 +HB9/UR-1001,Chruezlistock,,46.71440125,8.74079990,2707 +HB9/UR-1002,Hundstock,,46.92419815,8.68249989,2213 +HB9/VD-1001,Sex Rouge,,46.32690048,7.20249987,2971 +HB9/VD-1002,La Palette,,46.36669922,7.19920015,2171 +HB9/VD-1003,Le Soliat,,46.93059921,6.72079992,1463 +HB9/VD-1004,Les Pleiades,,46.48939896,6.91279984,1397 +HB9/VS-1001,Jungfrau,,46.53939819,7.96330023,4089 +HB9/VS-1002,Grosshorn,,46.48690033,7.91029978,3754 +HB9/ZH-1001,Schnebelhorn,,47.32559967,8.97970009,1292 +HB9/ZH-1002,Huettchopf,,47.31309891,8.94890022,1232 +HB9/ZH-1003,Langnauer Berg,,47.28390121,8.51220036,893 +HB9/ZH-1004,Schauenberg,,47.46189880,8.85859966,892 +JW/BE-001,Urd (Miseryfjellet),,74.41317749,19.18297958,536 +JW/BE-002,Skuld (Miseryfjellet),,74.42813873,19.20139313,454 +JW/SP-001,Newtontoppen,,79.01055908,17.49083328,1713 +LB/AH-001,Kantoråsen,,59.80249023,10.79395008,153 +LB/AH-002,Sonsåsen,,59.52907944,10.66827011,116 +LB/HM-001,Hornkjølen,,60.08625031,12.05475044,434 +LB/OF-001,Rambergåsen,,59.45508957,10.63539028,140 +LB/OL-001,Storhaugen,,61.42987823,9.93187046,1052 +LB/OL-002,Larvehei,,61.41790000,9.94887000,1042 +LB/OS-001,Grønliåsen,,59.82368851,10.82491970,228 +MW/NW-001,Halkyn Mountain,,53.23917000,-3.20750000,290 +MW/NW-002,Mynydd Mostyn,,53.30372000,-3.31146000,211 +MW/NW-003,Gop Hill,,53.31058000,-3.37246000,251 +OE0/BL-1001,Grosser Hirschenstein,,47.34500122,16.37919998,862 +OE0/BL-1002,Steinstueckl,,47.43389893,16.27389908,833 +OE0/BL-1003,Kienberg,,47.42440033,16.26499939,805 +OE0/BL-1004,Klosterberg,,47.56579971,16.33359909,745 +OE0/BL-1005,Koglberg,,47.45000076,16.29579926,711 +OE0/BL-1006,Krieriegel,,47.71889877,16.29439926,682 +OE0/BL-1007,Sieggrabner Kogel,,47.66059875,16.36190033,650 +OE0/BL-1008,Bergkogel,,47.74330139,16.29940033,621 +OE0/BL-1009,Buchkogel,,47.87779999,16.53890038,433 +OE0/BL-1010,Rotterberg,,46.83140182,16.00580025,408 +OE0/BL-1011,Ramsauberg,,47.89360046,16.59280014,390 +OE0/BL-1012,Dreilaenderecke,,46.86890030,16.11389923,387 +OE0/BL-1013,Hofweinriegel,,47.06029892,16.18889999,366 +OE0/BL-1014,Sauspitz,,47.95249939,16.68779945,366 +OE0/BL-1015,Koenigsberg,,47.97169876,16.74029922,286 +OE0/KT-1001,Hochstadel,,46.75999832,12.85669994,2681 +OE0/KT-1002,Gruft,,46.90530014,13.90190029,2232 +OE0/KT-1003,Karlhoehe,,47.00249863,13.56939983,2218 +OE0/KT-1004,Gaugen,,46.78639984,13.20919991,2195 +OE0/KT-1005,Saebelspitz,,46.64059830,12.83889961,2159 +OE0/KT-1006,Feistritzer Spitze (Hochpetzen),,46.51110077,14.75000000,2113 +OE0/KT-1007,Kienberg,,46.88470078,14.64610004,2050 +OE0/KT-1008,Hahnberg,,46.80419922,14.10499954,1256 +OE0/KT-1009,Baerofen,,46.88940048,14.99279976,1720 +OE0/KT-1010,Klippitztoerl,,46.93690000,14.67422000,1644 +OE0/KT-1011,Mesnerkogel,,46.79478000,14.69048000,1350 +OE0/KT-1012,Hofkogel,,46.84010000,14.71988000,1347 +OE0/KT-1013,Moritschkogel,,46.76876000,14.64997000,1321 +OE0/KT-1014,Koeblkogel,,46.75665000,14.93439000,978 +OE0/KT-1015,Christofberg,,46.70932000,14.46249000,957 +OE0/KT-1016,Hermannsberg,,46.95061000,14.78635000,938 +OE0/KT-1017,Martinikogel,,46.67775000,14.85358000,841 +OE0/KT-1018,Kinzelkogel,,46.66718000,14.82262000,584 +OE0/KT-1019,Lippekogel,,46.64248000,14.75264000,567 +OE0/KT-1020,Kapitelkogel,,46.64896011,14.69379044,563 +OE0/KT-1021,Glockerkogel,,46.65239000,14.65387000,546 +OE0/KT-1022,Lubitschkogel,,46.68544000,14.92044000,534 +OE0/KT-1023,Tainacher Berg,,46.64576000,14.54244000,525 +OE0/KT-1024,Pichlingkogel,,46.71670151,14.88329983,522 +OE0/KT-1025,Husarenkogel,,46.77730000,14.87231000,516 +OE0/KT-1026,Pleschauka,,46.65589000,14.43752000,484 +OE0/KT-1027,Strassenkogel,,46.64666000,14.50180000,470 +OE0/KT-1029,Brandhoehe,,46.82777800,14.99638900,1886 +OE0/NO-1001,Schmalzmauer,,47.71939850,14.92780018,1760 +OE0/NO-1002,Niederwechsel,,47.51810074,15.95110035,1669 +OE0/NO-1003,Ringkogel,,47.74330139,14.97309971,1668 +OE0/NO-1004,Schwarzauer Gip­pel,,47.80250168,15.61219978,1605 +OE0/NO-1005,Arabichl,,47.56420135,15.91390038,1595 +OE0/NO-1006,Erzkogel,,47.62220001,15.85750008,1504 +OE0/NO-1007,Hochkirch,,47.75249863,15.03470039,1468 +OE0/NO-1008,Kampstein,,47.56140137,15.98750019,1467 +OE0/NO-1009,Preineckkogel,,47.81420135,15.62469959,1449 +OE0/NO-1010,Mitterberg,,47.78110123,15.65439987,1429 +OE0/NO-1011,Alpkogel,,47.61360168,15.86250019,1414 +OE0/NO-1012,Studierkogel,,47.74890137,15.70440006,1395 +OE0/NO-1013,Poirhoehe,,47.59749985,15.84920025,1374 +OE0/NO-1014,Hirschenkogel,,47.62189865,15.83360004,1340 +OE0/NO-1015,Mitterschwarzriegel,,47.76440048,15.64420033,1332 +OE0/NO-1016,Kogel,,47.52529907,16.01689911,1289 +OE0/NO-1017,Hubmerkogel,,47.77439880,15.68140030,1282 +OE0/NO-1018,Hainboden,,47.75780106,15.72669983,1268 +OE0/NO-1019,Alpl,,47.84310150,15.32579994,1239 +OE0/NO-1020,Linsberg,,47.89189911,15.56830025,1238 +OE0/NO-1021,Zwieselmauer,,47.77560043,15.67189980,1236 +OE0/NO-1022,Oehler,,47.82189941,15.87810040,1183 +OE0/NO-1023,Sonnstein,,47.92419815,15.74170017,1124 +OE0/NO-1024,Geissruck,,47.95309830,15.90530014,1074 +OE0/NO-1025,Schwarzwaldeck,,47.99639893,15.71780014,1073 +OE0/NO-1026,Schafkogel,,47.89279938,15.43830013,1069 +OE0/NO-1027,Kirchwaldberg,,47.94720078,15.85639954,1067 +OE0/NO-1028,Reingupf,,47.97169876,15.86670017,1065 +OE0/NO-1029,Eichelberg,,48.59220123,14.73970032,1054 +OE0/NO-1030,Grosse Kanzel,,47.81110001,16.01309967,1052 +OE0/NO-1031,Hochsteinkogel,,47.82220078,15.56750011,1037 +OE0/NO-1032,Baerenstein,,48.65390015,14.74639988,1003 +OE0/NO-1033,Eibl,,47.91579819,15.45279980,1002 +OE0/NO-1034,Ursprungkogel,,47.81420135,15.59529972,959 +OE0/NO-1035,Pelletriedel,,48.28559875,15.00609970,945 +OE0/NO-1036,Hollabrunner Rie­gel,,47.62110138,16.06940079,922 +OE0/NO-1037,Heimhoeh,,47.82170105,15.58920002,905 +OE0/NO-1038,Hochriegel,,47.99309921,15.91889954,882 +OE0/NO-1039,Kagerriegel,,47.45640182,16.16690063,827 +OE0/NO-1040,Soosser Lindkogel,,47.99140167,16.16189957,713 +OE0/NO-1041,Glanzenriegel,,47.51279831,16.21859932,686 +OE0/NO-1042,Eschenkogel,,48.05559921,16.24169922,653 +OE0/NO-1043,Kohlerhoehe,,48.47060013,15.48750019,641 +OE0/NO-1044,Hengstlberg,,48.13470078,16.06189919,619 +OE0/NO-1045,Hasenriegel,,48.12110138,15.95189953,618 +OE0/NO-1046,Gfieder,,47.71530151,16.00939941,609 +OE0/NO-1047,Rudolfshoehe,,48.10889816,15.64420033,594 +OE0/NO-1048,Hiesberg,,48.45000076,15.52330017,582 +OE0/NO-1049,Kaiserbrunnberg,,48.15919876,16.03389931,576 +OE0/NO-1050,Silberne Birn,,48.29639816,15.52420044,569 +OE0/NO-1051,Pfaffstaettner Ko­gel,,48.02920151,16.23859978,541 +OE0/NO-1052,Parapluieberg,,48.11640167,16.22809982,532 +OE0/NO-1053,Oberer Saubichl,,48.19390106,16.05970001,504 +OE0/NO-1054,Wolfpassinger Berg,,48.30110168,16.18779945,404 +OE0/NO-1055,Frauenberg,,48.21720123,16.01029968,382 +OE0/NO-1056,Scheiterberg,,47.96559906,16.61669922,350 +OE0/NO-1057,Seelackenberg,,48.32830048,15.77079964,348 +OE0/NO-1058,Auberg,,48.26559830,16.04439926,318 +OE0/NO-1059,Koenigswarte,,48.11555000,17.02310000,344 +OE0/NO-1060,Hindlerberg,,48.11073000,17.00786000,298 +OE0/NO-1061,Heimenburg (Schlossberg),,48.14244000,16.94785000,291 +OE0/OO-1001,Hunerkogel,,47.46749878,13.62609959,2687 +OE0/OO-1002,Kreuzspitze,,47.63779831,14.17749977,2327 +OE0/OO-1003,Schrocken,,47.64419937,14.18610001,2281 +OE0/OO-1004,Weitgrubenkopf,,47.69720078,14.05389977,2259 +OE0/OO-1005,Steinriesenkogel,,47.52109909,13.48309994,2008 +OE0/OO-1006,Daeumelkogel,,47.52389908,13.70940018,2001 +OE0/OO-1007,Niederer Kalmberg,,47.60810089,13.57890034,1827 +OE0/OO-1008,Mittagkogel,,47.73389816,13.72000027,1790 +OE0/OO-1009,Hochglegt,,47.72579956,13.70219994,1784 +OE0/OO-1010,Mitterzinken,,47.75139999,13.56499958,1702 +OE0/OO-1011,Hochleckenkogel,,47.82690048,13.62080002,1691 +OE0/OO-1012,Bergwerkkogel,,47.73889923,13.72809982,1689 +OE0/OO-1013,Heumahdgupf,,47.81470108,13.71220016,1680 +OE0/OO-1014,Rosskopf,,47.68220139,13.55469990,1657 +OE0/OO-1015,Rossschopf,,47.79420090,14.00640011,1647 +OE0/OO-1016,Gamskogel,,47.71419907,13.74670029,1628 +OE0/OO-1017,Elferkogel,,47.68719864,13.57670021,1601 +OE0/OO-1018,Feuerkogel,,47.81610107,13.72249985,1592 +OE0/OO-1019,Hochkogel,,47.72859955,13.79080009,1591 +OE0/OO-1020,Gartenzinken,,47.74060059,13.56000042,1557 +OE0/OO-1021,Katrin,,47.68970108,13.57940006,1542 +OE0/OO-1022,Schwarzeck,,47.64559937,14.29780006,1537 +OE0/OO-1023,Rauer Kaibling,,47.85670090,14.08530045,1381 +OE0/OO-1024,Herrentisch,,47.86439896,14.08419991,1333 +OE0/OO-1025,Mahdlgupf,,47.80419922,13.55500031,1261 +OE0/OO-1026,Walkerskogel,,47.73669815,13.56579971,1243 +OE0/OO-1027,Hoheneck,,47.76169968,13.50559998,1165 +OE0/OO-1028,Mondseeberg,,47.86470032,13.37080002,1029 +OE0/OO-1029,Gruenangerl,,47.80720139,13.89060020,1025 +OE0/OO-1030,Maisenkoegerl,,47.89559937,13.97690010,945 +OE0/OO-1031,Kleiner Sonnstein,,47.82889938,13.78530025,923 +OE0/OO-1032,Hohe Luft,,47.92750168,13.71000004,917 +OE0/OO-1033,Reither Gupf,,47.87060165,13.50889969,881 +OE0/OO-1034,Gahberg,,47.91500092,13.59220028,864 +OE0/OO-1035,Hamberg,,47.90439987,13.98470020,854 +OE0/OO-1036,Schimplgupf,,47.93439865,13.69810009,838 +OE0/OO-1037,Herzogreither Berg,,48.44079971,14.65330029,811 +OE0/OO-1038,Roadlberg,,48.42969894,14.39830017,778 +OE0/OO-1039,Sonnberg,,47.96580124,14.45639992,777 +OE0/OO-1040,Trattberg,,47.93249893,13.64109993,702 +OE0/OO-1041,Voecklaberg,,47.94219971,13.74219990,660 +OE0/OO-1042,Georgenberg,,47.87329865,14.13829994,595 +OE0/OO-1043,Feichtenberg,,48.33890152,13.79059982,504 +OE0/OO-1044,Hochkogel,,47.91859818,13.79249954,500 +OE0/OO-1045,Gusterberg,,48.03749847,14.13640022,488 +OE0/OO-1046,Linzerberg,,48.34579849,14.40250015,402 +OE0/OO-1047,Wohlfahrtsberg,,48.01419830,14.42220020,400 +OE0/OO-1048,Niederer Dachstein,,47.47809982,13.60639954,2934 +OE0/OO-1049,Dirndln,,47.47219849,13.61690044,2832 +OE0/OO-1050,Kleiner Gjaidstein,,47.47560120,13.62860012,2734 +OE0/OO-1051,Niederer Gjaidstein,,47.48720169,13.65110016,2482 +OE0/OO-1052,Hochkesselkopf,,47.48249817,13.56779957,2454 +OE0/OO-1053,Schoeberl,,47.49810028,13.61670017,2426 +OE0/OO-1054,Mitterstein,,47.47919846,13.64640045,2417 +OE0/OO-1055,Vorderer Gjaidstein,,47.49330139,13.65030003,2414 +OE0/OO-1056,Liezener,,47.65060043,14.23219967,2367 +OE0/OO-1057,Hosskogel,,47.50780106,13.59029961,2366 +OE0/OO-1058,Mittlerer Ochsenkogel,,47.51110077,13.61219978,2365 +OE0/OO-1059,Brotfall,,47.70610046,14.05939960,2360 +OE0/OO-1060,Daeumling,,47.50170135,13.51809978,2322 +OE0/OO-1061,Hoher Gruenberg,,47.51470184,13.60420036,2243 +OE0/OO-1062,Pyhrner Kampl,,47.64889908,14.19830036,2241 +OE0/OO-1063,Kreuz,,47.72890091,14.05780029,2174 +OE0/OO-1064,Mitterkogel,,47.49470139,13.53419971,2122 +OE0/OO-1065,Ramesch,,47.65219879,14.25059986,2119 +OE0/OO-1066,Widerlechnerstein,,47.64830017,14.24670029,2107 +OE0/OO-1067,Angerstein,,47.51309967,13.48999977,2100 +OE0/OO-1068,Niederer Speikberg,,47.51470184,13.73169994,2089 +OE0/OO-1069,Kleiner Brieglersberg,,47.62110138,14.05140018,2078 +OE0/OO-1070,Strichkogel,,47.51969910,13.48690033,2034 +OE0/OO-1071,Schafkoegel,,47.65470123,14.17720032,1990 +OE0/OO-1072,Niederer Krippenstein,,47.51670074,13.68309975,1989 +OE0/OO-1073,Kleiner Donnerkogel,,47.52719879,13.47920036,1916 +OE0/OO-1074,Gamsplan,,47.77439880,14.33440018,1902 +OE0/OO-1075,Lahnerkogel,,47.61890030,14.33059978,1854 +OE0/OO-1076,Mittlerer Kesselgupf,,47.80640030,13.67640018,1818 +OE0/OO-1077,Eiblgupf,,47.81470108,13.67560005,1813 +OE0/OO-1078,Kleiner Hoellkogel,,47.80139923,13.67360020,1788 +OE0/OO-1079,Brandleck,,47.77059937,14.37189960,1725 +OE0/OO-1080,Grosser Brettkogel,,47.62889862,13.50529957,1658 +OE0/OO-1081,Bannkogel,,47.74250031,13.73219967,1656 +OE0/OO-1082,Steinkogel,,47.81060028,13.71440029,1644 +OE0/OO-1083,Sonnenwendkogel,,47.62279892,13.56169987,1638 +OE0/OO-1084,Plediridl,,47.81669998,13.71749973,1624 +OE0/OO-1085,Toerleck,,47.53170013,13.47669983,1618 +OE0/OO-1086,Mannsberg,,47.67190170,14.42560005,1603 +OE0/OO-1087,Steyreck,,47.76330185,14.38920021,1592 +OE0/OO-1088,Traunkirchner Kogel,,47.86940002,13.82779980,1575 +OE0/OO-1089,Brunnbacheck,,47.83330154,14.56439972,1472 +OE0/OO-1090,Hornspitz,,47.56809998,13.47809982,1433 +OE0/OO-1091,Burgspitz,,47.84220123,14.57530022,1429 +OE0/OO-1092,Wieser,,47.81750107,14.56079960,1427 +OE0/OO-1093,Traempl,,47.79219818,14.41940022,1424 +OE0/OO-1094,Astein,,47.71920013,14.46920013,1419 +OE0/OO-1095,Kampermauer,,47.69079971,14.48919964,1394 +OE0/OO-1096,Ennsberg,,47.83079910,14.59809971,1373 +OE0/OO-1097,Schmeisserkogel,,47.72999954,14.23939991,1324 +OE0/OO-1098,Reischlberg,,48.74969864,13.90439987,1281 +OE0/OO-1099,Gaisberg,,47.90999985,14.27970028,1267 +OE0/OO-1100,Jagerspitz,,47.83060074,14.00170040,1266 +OE0/OO-1101,Stinglfelsen,,48.73440170,13.91310024,1260 +OE0/OO-1102,Koglerstein,,47.90610123,14.30860043,1257 +OE0/OO-1103,Sonnkogel,,47.89500046,14.40170002,1177 +OE0/OO-1104,Scharnsteiner Spitze,,47.88359833,13.96000004,1133 +OE0/OO-1105,Koppenstein,,47.82139969,13.45720005,1123 +OE0/OO-1106,Lindauer Berg,,47.91690063,14.66609955,1084 +OE0/OO-1107,Sulzberg,,48.70109940,13.96749973,1041 +OE0/OO-1108,Herndleck,,47.92750168,14.32779980,1026 +OE0/OO-1109,Herndleck,,0.00000000,0.00000000,1026 +OE0/OO-1110,Glasenberg,,47.94499969,14.57219982,971 +OE0/OO-1111,Bramhosen,,47.85829926,13.58720016,960 +OE0/OO-1112,Geierkogel,,47.95029831,14.56169987,886 +OE0/OO-1113,Poppenberg,,47.70999908,14.17059994,860 +OE0/OO-1114,Wurbauerkogel,,47.72560120,14.33969975,858 +OE0/OO-1115,Rotstein,,47.86560059,14.55669975,837 +OE0/OO-1116,Hofberg,,48.09059906,13.50580025,758 +OE0/OO-1117,Feichtenberg,,47.95220184,13.93920040,664 +OE0/OO-1118,Stelzerberg,,48.27470016,13.52670002,495 +OE0/OO-1119,Freinberg,,48.29579926,14.26939964,375 +OE0/OO-1120,Gruendberg,,48.33940125,14.28719997,374 +OE0/OO-1121,Julianaberg,,48.12829971,14.21109962,368 +OE0/SB-1001,Silbereck,,47.08689880,13.43140030,2810 +OE0/SB-1002,Eisenkopf,,47.08919907,13.43190002,2802 +OE0/SB-1003,Ohlitzen,,47.08029938,13.45779991,2658 +OE0/SB-1004,Faulkogel,,47.21640015,13.37220001,2654 +OE0/SB-1005,Kendlkopf,,47.13249969,12.84140015,2587 +OE0/SB-1006,Tuerchlwand,,47.15110016,13.03219986,2577 +OE0/SB-1007,Kreuzhoehe,,47.22190094,13.78110027,2566 +OE0/SB-1008,Kareck,,47.05920029,13.55389977,2481 +OE0/SB-1009,Kramkogel,,47.42029953,13.03670025,2454 +OE0/SB-1010,Wurmkopf,,47.45669937,12.92809963,2451 +OE0/SB-1011,Speiereck,,47.12779999,13.62469959,2411 +OE0/SB-1012,Bleikogel,,47.51419830,13.29829979,2411 +OE0/SB-1013,Ennskraxen,,47.25749969,13.35639954,2410 +OE0/SB-1014,Koenigsstuhl,,47.21080017,12.63609982,2408 +OE0/SB-1015,Grosses Woazkoepfl,,47.09999847,12.83810043,2391 +OE0/SB-1016,Mauskarkopf,,47.15420151,13.04749966,2373 +OE0/SB-1017,Lapernig Spitze,,47.17029953,13.58969975,2369 +OE0/SB-1018,Stierkarkopf,,47.19720078,13.35330009,2366 +OE0/SB-1019,Kleiner Lanschuetz,,47.13529968,13.62469959,2355 +OE0/SB-1020,Gumma,,47.21060181,13.77939987,2316 +OE0/SB-1021,Zwoelferkogel,,47.23609924,12.35330009,2281 +OE0/SB-1022,Pollannock,,47.21500015,13.72859955,2280 +OE0/SB-1023,Gensgitsch,,47.21080017,13.73190022,2279 +OE0/SB-1024,Kempen,,47.16500092,13.41390038,2277 +OE0/SB-1025,Schwarzkopf,,47.26969910,13.44169998,2263 +OE0/SB-1026,Feldernock,,47.00719833,13.82190037,2257 +OE0/SB-1027,Kleiner Koenigstuhl,,47.00749969,13.80420017,2254 +OE0/SB-1028,Hirschkopf,,47.23279953,12.94330025,2252 +OE0/SB-1029,Breitkopf,,47.24390030,12.88560009,2251 +OE0/SB-1030,Sandkogel,,47.28530121,13.16310024,2249 +OE0/SB-1031,Stubnerkogel,,47.11309814,13.09920025,2246 +OE0/SB-1032,Hochkogel,,47.32809830,12.61559963,2240 +OE0/SB-1033,Vorderer Schafbichl,,47.14279938,12.63469982,2232 +OE0/SB-1034,Weichselbachhoehe,,47.19079971,12.90719986,2220 +OE0/SB-1035,Gurenstein,,47.18750000,13.30469990,2219 +OE0/SB-1036,Birkkogel,,47.24250031,12.52420044,2212 +OE0/SB-1037,Rauchkogel,,47.16529846,13.14330006,2208 +OE0/SB-1038,Kreuzeck,,47.17390060,13.30720043,2204 +OE0/SB-1039,Gaipahoehe,,46.99079895,13.72809982,2192 +OE0/SB-1040,Zechnerhoehe,,46.99390030,13.74470043,2188 +OE0/SB-1041,Gamskogel,,47.27330017,13.44690037,2186 +OE0/SB-1042,Niederer Gernkogel,,47.32920074,12.66499996,2153 +OE0/SB-1043,Rosskopf,,47.23220062,12.78670025,2152 +OE0/SB-1044,Tagweidegg,,47.27750015,13.43439960,2135 +OE0/SB-1045,Breiteck,,47.22420120,12.62189960,2114 +OE0/SB-1046,Stubennock,,46.96829987,13.77470016,2092 +OE0/SB-1047,Rabenkopf,,47.32780075,12.55609989,2074 +OE0/SB-1048,Farnbuehel,,47.21279907,12.13000011,2026 +OE0/SB-1049,Wirtsnock,,47.01969910,13.75109959,2014 +OE0/SB-1050,Gamskarkogel,,47.45579910,13.10060024,2013 +OE0/SB-1051,Hakopf,,47.29919815,13.47640038,1996 +OE0/SB-1052,Doerfler Hoehe,,47.13499832,13.99419975,1987 +OE0/SB-1053,Zwoelferkogel,,47.36059952,12.56919956,1983 +OE0/SB-1054,Mooskopf,,47.29219818,13.34860039,1961 +OE0/SB-1055,Hanglhoehe,,47.31389999,12.36779976,1940 +OE0/SB-1056,Lasaberg,,47.10359955,13.87360001,1935 +OE0/SB-1057,Rosskopf,,47.29389954,13.42860031,1929 +OE0/SB-1058,Hinterkogel,,47.30030060,13.42829990,1922 +OE0/SB-1059,Scharwandspitze,,47.31750107,13.41469955,1918 +OE0/SB-1060,Wildbuehel,,47.28889847,13.35690022,1916 +OE0/SB-1061,Torkogel,,47.09920120,13.87860012,1889 +OE0/SB-1062,Mardeckkopf,,47.40890121,12.66390038,1817 +OE0/SB-1063,Rauchkoegerl,,47.27640152,13.05080032,1810 +OE0/SB-1064,Rettenkogel,,47.68140030,13.50669956,1780 +OE0/SB-1065,Eibenberg,,47.33250046,13.41170025,1738 +OE0/SB-1066,Regenspitz,,47.68059921,13.28890038,1675 +OE0/SB-1067,Kleiner Traunstein,,47.53580093,13.37329960,1659 +OE0/SB-1068,Windkogel,,47.68220139,13.43109989,1547 +OE0/SB-1069,Reiningspitz,,47.76810074,13.42720032,1450 +OE0/SB-1070,Thaellerer Kogel,,47.62580109,12.68220043,1337 +OE0/SB-1071,Buergerberg,,47.43719864,12.88059998,1237 +OE0/SB-1072,Wallhuettenkopf,,47.79059982,13.34889984,1116 +OE0/SB-1073,Nagelkoepfl,,47.29000092,12.66810036,1090 +OE0/SB-1074,Lehmberg,,47.89220047,13.26420021,1027 +OE0/SB-1075,Birnberg,,47.44720078,12.75860023,961 +OE0/SB-1076,Kesselkopf,,47.77939987,13.40310001,928 +OE0/SB-1077,Raspenhoehe,,47.66030121,13.10389996,893 +OE0/SB-1078,Haunsberg,,47.91500092,13.99689960,835 +OE0/SB-1079,Johannsberg,,47.95780182,13.21080017,600 +OE0/SB-1080,Lielonberg,,47.02719879,13.03219986,569 +OE0/SB-1081,Heuberg,,47.69559860,13.11690044,556 +OE0/SB-1082,Georgenberg,,47.63499832,13.15970039,528 +OE0/SB-1083,Hellbrunner Berg,,47.75889969,13.06610012,515 +OE0/SB-1084,Ahornbuechsenkopf,,47.61940002,13.08170033,1604 +OE0/SB-1085,Edelweissspitze,,47.12376785,12.83144093,2571 +OE0/SB-1086,Hennenkoepfl,,47.62670898,13.09270000,1551 +OE0/ST-1001,Kieseck,,47.29309845,13.82559967,2681 +OE0/ST-1002,Bauleiteck,,47.27109909,13.96920013,2424 +OE0/ST-1003,Hochstubofen,,47.26779938,14.11219978,2385 +OE0/ST-1004,Amachkogel,,47.35279846,14.53810024,2312 +OE0/ST-1005,Krautgartsch,,47.26559830,13.71249962,2293 +OE0/ST-1006,Moaralmspitze,,47.35219955,13.78390026,2257 +OE0/ST-1007,Trockenbrotsch,,47.27669907,13.72140026,2237 +OE0/ST-1008,Hoher Zinken,,47.27080154,14.34189987,2222 +OE0/ST-1009,Kleinhansl,,47.32469940,14.27060032,2217 +OE0/ST-1010,Fuchskogel,,47.04560089,14.57970047,2214 +OE0/ST-1011,Schoenfeldspitz,,47.33810043,14.22360039,2202 +OE0/ST-1012,Kalbling,,47.54719925,14.52110004,2196 +OE0/ST-1013,Grosses Tragl,,47.61890030,14.03190041,2179 +OE0/ST-1014,Prankerhoehe,,47.02360153,14.06890011,2166 +OE0/ST-1015,Wenzelalpe,,47.11029816,14.54059982,2151 +OE0/ST-1016,Baerfallspitze,,47.36000061,13.78579998,2150 +OE0/ST-1017,Kirbisch,,47.04999924,14.05080032,2140 +OE0/ST-1018,Rosenkranzhoehe,,47.05530167,14.04969978,2118 +OE0/ST-1019,Plannerseekar­spitze,,47.41500092,14.20969963,2072 +OE0/ST-1020,Jauriskampel,,47.33530045,14.28279972,2064 +OE0/ST-1021,Wildgoessl,,47.69250107,13.93190002,2062 +OE0/ST-1022,Schleifeck,,47.36560059,14.51220036,2048 +OE0/ST-1023,Lattenberg,,47.40140152,14.60169983,2018 +OE0/ST-1024,Hauser Kaibling,,47.37360001,13.77859974,2015 +OE0/ST-1025,Hochweichsel,,47.63809967,15.22690010,2006 +OE0/ST-1026,Rotofen,,47.01969910,13.86390018,1999 +OE0/ST-1027,Speikkogel,,47.05749893,14.84469986,1993 +OE0/ST-1028,Peterer Riegel,,47.03829956,14.84080029,1967 +OE0/ST-1029,Lueg,,47.60940170,14.21170044,1962 +OE0/ST-1030,Schoenberg,,47.26580048,14.37559986,1943 +OE0/ST-1031,Riesnerkrispen,,47.36470032,14.09189987,1922 +OE0/ST-1032,Rosenkogel,,47.29719925,14.55169964,1918 +OE0/ST-1033,Planai,,47.36920166,13.72669983,1906 +OE0/ST-1034,Windberg,,47.70330048,15.59469986,1903 +OE0/ST-1035,Predigtstuhl,,47.69609833,15.70810032,1902 +OE0/ST-1036,Redender Stein,,47.68970108,13.88689995,1900 +OE0/ST-1037,Braeuningzinken,,47.67530060,13.79249954,1899 +OE0/ST-1038,Rossalm,,47.24470139,14.34689999,1894 +OE0/ST-1039,Leobner Mauer,,47.52939987,14.98810005,1870 +OE0/ST-1040,Papstriegel,,47.31330109,14.72360039,1869 +OE0/ST-1041,Gamseck,,47.69889832,15.67889977,1857 +OE0/ST-1042,Eisenbeutel,,47.36080170,14.43859959,1855 +OE0/ST-1043,Grabnerstein,,47.63309860,14.50469971,1847 +OE0/ST-1044,Staritzen-Ostgipfel,,47.64030075,15.27190018,1810 +OE0/ST-1045,Windgrube,,47.58079910,15.22609997,1809 +OE0/ST-1046,Weberkogel,,46.85810089,15.00889969,1805 +OE0/ST-1047,Grabnerspitze,,47.46530151,14.83469963,1795 +OE0/ST-1048,Moarkoepfl,,47.24689865,14.38109970,1793 +OE0/ST-1049,Zargenkopf,,47.60110092,14.89690018,1792 +OE0/ST-1050,Hochblaser,,47.58779907,14.86110020,1771 +OE0/ST-1051,Schafkogel,,47.15919876,14.51389980,1746 +OE0/ST-1052,Spielkogel,,47.51940155,14.56859970,1731 +OE0/ST-1053,Brandriegel,,47.11059952,14.59500027,1721 +OE0/ST-1054,Schwarzkogel,,47.07220078,14.91329956,1694 +OE0/ST-1055,Saukogel,,47.48109818,14.79749966,1678 +OE0/ST-1056,Amundsenhoehe,,47.55170059,15.73169994,1666 +OE0/ST-1057,Brandkogel,,47.08560181,14.93500042,1648 +OE0/ST-1058,Hohes Waxenegg,,47.73529816,15.55389977,1647 +OE0/ST-1059,Gwoehnlistein,,47.57109833,14.04860020,1645 +OE0/ST-1060,Fensteralm,,47.28030014,15.15330029,1642 +OE0/ST-1061,Mugel,,47.35829926,15.18859959,1630 +OE0/ST-1062,Scherzberg,,47.12939835,14.94169998,1624 +OE0/ST-1063,Hasenfuss,,47.73720169,14.80939960,1615 +OE0/ST-1064,Boese Mauer,,47.54830170,14.78750038,1615 +OE0/ST-1065,Roetelstein,,47.59360123,13.84689999,1614 +OE0/ST-1066,Glatzeter Kogel,,47.74670029,15.61079979,1594 +OE0/ST-1067,Hoelzlberg,,47.25000000,14.67140007,1589 +OE0/ST-1068,Steinriegel,,47.53559875,15.71969986,1577 +OE0/ST-1069,Gspitzter Stein,,47.53720093,14.70639992,1556 +OE0/ST-1070,Kampalpe,,47.63249969,15.74250031,1535 +OE0/ST-1071,Habring,,47.23360062,14.47189999,1497 +OE0/ST-1072,Stanglalpe,,47.49440002,15.53439999,1490 +OE0/ST-1073,Hocheck,,47.59059906,15.79860020,1488 +OE0/ST-1074,Grosse Scheibe,,47.63499832,15.68889999,1473 +OE0/ST-1075,Erzberg,,47.52439880,14.91189957,1465 +OE0/ST-1076,Rabenkropf,,47.57279968,15.87689972,1464 +OE0/ST-1077,Blaskoegerl,,47.64530182,15.47970009,1451 +OE0/ST-1078,Herrenstein,,47.50279999,15.85809994,1446 +OE0/ST-1079,Schlanderkogel,,47.01810074,14.66670036,1442 +OE0/ST-1080,Feldhuetl,,47.75500107,15.25469971,1434 +OE0/ST-1081,Aibel,,47.41889954,15.47830009,1394 +OE0/ST-1082,Toellmarkogel,,47.54079819,15.40690041,1366 +OE0/ST-1083,Rosenkogel,,46.89559937,15.14890003,1362 +OE0/ST-1084,Gossstein,,47.64690018,14.88609982,1331 +OE0/ST-1085,Buchkogel,,47.32830048,15.50829983,1330 +OE0/ST-1086,Hochegg,,47.51079941,15.33279991,1324 +OE0/ST-1087,Gerlerkogel,,47.33309937,15.46560001,1324 +OE0/ST-1088,Hochkogel,,47.46810150,15.98110008,1314 +OE0/ST-1089,Gschwandkogel,,47.55580139,15.44470024,1282 +OE0/ST-1090,Roethelstein,,47.32640076,15.38640022,1263 +OE0/ST-1091,Kalcherberg,,47.54779816,15.36359978,1249 +OE0/ST-1092,Serkogel,,47.44029999,15.48610020,1240 +OE0/ST-1093,Gschaidberg,,47.30530167,15.43750000,1240 +OE0/ST-1094,Herzogberg,,47.52750015,15.39389992,1227 +OE0/ST-1095,Granegg,,47.50500107,15.61110020,1205 +OE0/ST-1096,Sulzriegl,,47.76060104,15.50329971,1189 +OE0/ST-1097,Krauserschoeckl,,47.42359924,15.75000000,1132 +OE0/ST-1098,Arzberg,,47.46689987,15.81779957,1111 +OE0/ST-1099,Fragnerberg,,47.25139999,15.39140034,1109 +OE0/ST-1100,Spitz Christi,,47.36220169,15.13029957,1105 +OE0/ST-1101,Sulberg,,47.28939819,15.42529964,1094 +OE0/ST-1102,Doerfelstein,,47.60359955,14.47859955,1074 +OE0/ST-1103,Hoehhansl,,47.44829941,15.77000046,1044 +OE0/ST-1104,Lindkogel,,47.32669830,15.66779995,955 +OE0/ST-1105,Schwarzkogel,,47.50529861,15.37580013,934 +OE0/ST-1106,Buchkogel,,47.27030182,15.80500031,907 +OE0/ST-1107,Kreilkogel,,47.26060104,15.76000023,869 +OE0/ST-1108,Fresenkogel,,47.26969910,15.73139954,852 +OE0/ST-1109,Landschakogel,,47.23669815,15.62220001,726 +OE0/ST-1110,Wartbergkogel,,47.52170181,15.47609997,717 +OE0/ST-1111,Hauenstein,,47.12580109,15.48859978,650 +OE0/ST-1112,Schmirnberg,,46.63029861,15.49390030,634 +OE0/ST-1113,Rosenkogel,,47.21390152,15.73939991,624 +OE0/ST-1114,Lubekogel,,46.67890167,15.51970005,570 +OE0/ST-1115,Buchberg,,47.22029877,15.80280018,532 +OE0/ST-1116,Urlkogel,,46.69580078,15.55080032,524 +OE0/ST-1117,Krebskogel,,46.63439941,15.53310013,516 +OE0/ST-1118,Kreuzkogel,,46.78919983,15.51360035,496 +OE0/ST-1119,Kranachberg,,46.72330093,15.49390030,496 +OE0/ST-1120,Salzerkogel,,46.66170120,15.41469955,494 +OE0/ST-1121,Huehnerberg,,46.98529816,15.53639984,484 +OE0/ST-1122,Schlossberg,,47.07669830,15.43780041,474 +OE0/ST-1123,Kapfensteiner Kogel,,46.89419937,15.97529984,461 +OE0/ST-1124,Grillkogel,,46.74750137,15.40970039,458 +OE0/ST-1125,Traubenberg,,46.94829941,15.61359978,452 +OE0/ST-1126,Koegelberg,,46.93889999,15.54609966,441 +OE0/ST-1127,Kleiner Takernberg,,47.05500031,15.76500034,431 +OE0/ST-1128,Stefansberg,,46.90969849,15.68830013,425 +OE0/ST-1129,Buchkogel,,46.78079987,15.49079990,410 +OE0/ST-1130,Rosenbichl,,46.86920166,15.60420036,408 +OE0/ST-1131,Rittscheinberg,,47.00500107,16.02779961,398 +OE0/ST-1132,Am Berner,,47.17969894,16.02029991,397 +OE0/ST-1133,Schiesslkogel,,46.98189926,15.98029995,389 +OE0/ST-1134,Edlmannkogel,,46.75000000,15.51000023,383 +OE0/ST-1135,Grosssteinberg,,46.98830032,16.09059906,360 +OE0/ST-1136,Loskogel,,46.80638885,15.00888920,1790 +OE0/ST-1137,Scharfes Eck,,47.07166672,14.55972195,2364 +OE0/ST-1138,Saukogel,,47.34333420,15.55166721,1437 +OE0/ST-1139,Narrenfelsen,,46.70888901,15.04833317,1490 +OE0/ST-1140,Gschwendtberg,,47.28393173,15.34092999,993 +OE0/ST-1141,Riffel,,47.55300903,14.51432991,2106 +OE0/ST-1142,Schankkogel,,47.23472200,15.25361100,1049 +OE0/ST-1143,Listkogel,,47.24416700,15.22305600,1148 +OE0/ST-1144,Haneggkogel,,47.25416700,15.27750000,1088 +OE0/ST-1145,Sadningkogel,,47.26916700,15.19444400,1449 +OE0/ST-1146,Zoellerkogel,,47.26666700,15.20611100,1353 +OE0/ST-1147,Hirzykogel,,47.27388900,15.23750000,1129 +OE0/ST-1148,Fuchskogel,,47.26722200,15.23222200,1293 +OE0/ST-1149,Thomaskogel,,47.26055600,15.19777800,1302 +OE0/ST-1150,Walzkogel,,47.21083300,15.13388900,1456 +OE0/ST-1151,Mitterberg,,47.23527800,15.18361100,1064 +OE0/ST-1152,Hurdaxkogel,,47.23583300,15.17333300,1144 +OE0/ST-1153,Harterberg,,47.28638900,15.38972200,1036 +OE0/ST-1154,Randlofen,,46.94055600,15.12027800,1433 +OE0/ST-1155,Heiggerkogel,,47.15916700,15.23861100,1098 +OE0/ST-1156,Hoher Zetz,,47.28277800,15.65111100,1264 +OE0/ST-1157,Pammeggkogel,,47.21138900,15.20861100,1090 +OE0/ST-1158,Eggenberg,,47.15592000,15.33790000,707 +OE0/ST-1159,Pfaffenkoge,,47.16547000,15.30964000,734 +OE0/ST-1160,Moar-Zu-Hof-Buehel,,47.21690000,14.95844000,1461 +OE0/ST-1161,Hohe Sinn,,47.23147000,14.98722000,1638 +OE0/ST-1162,Baerenkogel,,47.30616000,15.11174000,1479 +OE0/ST-1163,Rotuendlberg,,47.30760000,15.16085000,1533 +OE0/ST-1164,Berntalerkogel,,47.31228000,15.26486000,1177 +OE0/ST-1165,Himberger Eck,,47.42452000,15.09989000,1345 +OE0/ST-1166,Klammkogel,,47.47375000,15.00054000,1358 +OE0/ST-1167,Hohe Zoelz,,47.48323000,14.92851000,1897 +OE0/ST-1168,Reitererkogel,,47.39558000,14.94514000,953 +OE0/ST-1169,Mittagkogel,,47.28786000,14.92514000,938 +OE0/ST-1170,Sauernkogel,,47.41298000,15.60155000,1451 +OE0/ST-1171,Reiflingberg,,47.12113000,14.65632000,1474 +OE0/ST-1172,Lukaskogel,,47.18079000,15.12339000,1118 +OE0/ST-1173,Falkenberg,,47.20102000,14.60825000,1142 +OE0/ST-1174,Wohntalhocheck,,47.52014000,15.10485000,1456 +OE0/ST-1175,Gfaell,,47.50849000,15.11644000,1450 +OE0/ST-1176,Ilgner Hocheck,,47.54409000,15.13796000,1512 +OE0/ST-1177,Traidersberg,,47.37901000,15.01537000,987 +OE0/ST-1178,Gsollerkoge,,47.15012000,15.31651000,668 +OE0/ST-1179,Wolfsattel,,47.26483000,15.56899000,1080 +OE0/ST-1180,Hochglaserer,,47.21119000,15.37281000,910 +OE0/TI-1001,Kleinglockner,,47.07419968,12.69470024,3770 +OE0/TI-1002,Hohes Aderl,,47.10189819,12.35029984,3506 +OE0/TI-1003,Schwarze Wand,,47.10359955,12.36999989,3506 +OE0/TI-1004,Kleinvenediger,,47.11669922,12.35890007,3471 +OE0/TI-1005,Adlersruhe,,47.07059860,12.70170021,3451 +OE0/TI-1006,Hoher Zaun,,47.09999847,12.37670040,3451 +OE0/TI-1007,Kristallwand,,47.09360123,12.39939976,3310 +OE0/TI-1008,Rauhkopf,,47.04579926,12.42889977,3070 +OE0/TI-1009,Gamsspitzl,,46.97890091,11.20250034,3050 +OE0/TI-1010,Schere,,47.06000137,12.68360043,3037 +OE0/TI-1011,Wildes Mannle,,46.87440109,10.89420033,3023 +OE0/TI-1012,Seespitze,,46.94829941,12.27359962,3021 +OE0/TI-1013,Tschadinhorn,,46.99219894,12.70890045,3017 +OE0/TI-1014,Hoerndle,,46.84859848,10.90670013,2985 +OE0/TI-1015,Hochgasser,,47.15060043,12.52169991,2922 +OE0/TI-1016,Gumriaul,,46.81669998,12.50689983,2918 +OE0/TI-1017,Schartenkopf,,47.17919922,11.02999973,2855 +OE0/TI-1018,Schoenleitenspitze,,46.99060059,12.68970013,2809 +OE0/TI-1019,Kugelspitze,,46.86780167,12.48390007,2796 +OE0/TI-1020,Hoher Gemeindekopf,,47.13079834,10.81669998,2771 +OE0/TI-1021,Murmentenkarspitze,,47.15190125,10.82970047,2770 +OE0/TI-1022,Weisses Beil,,46.93669891,12.30920029,2766 +OE0/TI-1023,Kreuzspitze,,47.18529892,11.53639984,2746 +OE0/TI-1024,Kuchenjoechli,,47.05440140,10.22329998,2730 +OE0/TI-1025,Hirzer,,47.21780014,11.66310024,2725 +OE0/TI-1026,Weisslachberg,,46.80640030,12.49499989,2671 +OE0/TI-1027,Lavantegg,,46.85169983,12.61310005,2658 +OE0/TI-1028,Maedelegabel,,47.29970169,10.29559994,2644 +OE0/TI-1029,Neunerkogel,,47.20029831,11.03310013,2640 +OE0/TI-1030,Schoenbergspitze,,46.84529877,12.62329960,2640 +OE0/TI-1031,Breitlehnjoechl,,47.02640152,10.90330029,2637 +OE0/TI-1032,Mittagspitze,,47.12829971,10.38420010,2635 +OE0/TI-1033,Schoentalhoehe,,46.68970108,12.45330048,2635 +OE0/TI-1034,Niederl,,46.99420166,11.20890045,2629 +OE0/TI-1035,Gaishoerndl,,46.79169846,12.28079987,2615 +OE0/TI-1036,Laserzwand,,46.77280045,12.80109978,2614 +OE0/TI-1037,Morgenkogel,,47.18750000,11.50860023,2607 +OE0/TI-1038,Rosskopf,,46.68560028,12.50059986,2603 +OE0/TI-1039,Haneburger,,47.21220016,11.58469963,2596 +OE0/TI-1040,Rauchegg,,46.79999924,12.48470020,2594 +OE0/TI-1041,Demut,,46.69029999,12.44610023,2591 +OE0/TI-1042,Vordere Brandjochspitze,,47.30279922,11.34169960,2559 +OE0/TI-1043,Hornischegg,,46.70080185,12.41390038,2550 +OE0/TI-1044,Bielerspitze,,46.92779922,10.09860039,2545 +OE0/TI-1045,Grosser Solstein,,47.30279922,11.30780029,2541 +OE0/TI-1046,Hochgruben,,46.70610046,12.40999985,2537 +OE0/TI-1047,Boeses Weibele,,46.83499908,12.65030003,2521 +OE0/TI-1048,Rosskarspitze,,46.65750122,12.55889988,2511 +OE0/TI-1049,Rifflerkogel,,47.26440048,11.97249985,2494 +OE0/TI-1050,Schoenjoechl,,47.07749939,11.59889984,2493 +OE0/TI-1051,Karkopf,,47.35530090,11.02750015,2469 +OE0/TI-1052,Bschlaber Kreuzspitze,,47.33169937,10.59140015,2462 +OE0/TI-1053,Filmoorhoehe,,46.66780090,12.53359985,2457 +OE0/TI-1054,Wimbachkopf,,47.25500107,11.81719971,2442 +OE0/TI-1055,Hochrast,,46.77500153,12.35779953,2436 +OE0/TI-1056,Goisele,,46.88529968,12.77750015,2433 +OE0/TI-1057,Helm,,46.71500015,12.38720036,2433 +OE0/TI-1058,Gatterspitze,,46.69810104,12.48139954,2430 +OE0/TI-1059,Kraxentrager,,47.24029922,11.79609966,2423 +OE0/TI-1060,Wanglspitze,,47.18439865,11.77530003,2420 +OE0/TI-1061,Thurntaler,,46.77439880,12.38280010,2408 +OE0/TI-1062,Schaflegerkogel,,47.15470123,11.23719978,2405 +OE0/TI-1063,Rothorn,,47.55279922,12.61359978,2403 +OE0/TI-1064,Rosskoepfe,,47.20890045,10.94060040,2399 +OE0/TI-1065,Die Mute,,47.20059967,11.01780033,2398 +OE0/TI-1066,Kesselhoehe,,46.66529846,12.61470032,2375 +OE0/TI-1067,Muttlerkopf,,47.31439972,10.34169960,2366 +OE0/TI-1068,Kleines Schoeberl,,46.88140106,12.73279953,2345 +OE0/TI-1069,Hafelekarspitze,,47.31309891,11.38640022,2334 +OE0/TI-1070,Handschuhspitze,,47.34030151,10.88249969,2319 +OE0/TI-1071,Gleirschspitze,,47.31579971,11.39830017,2317 +OE0/TI-1072,Koenigsleiten,,47.26139832,12.08940029,2315 +OE0/TI-1073,Spitzkoefele,,46.67530060,12.61219978,2314 +OE0/TI-1074,Schartenkogel,,47.21939850,11.53670025,2311 +OE0/TI-1075,Narrenkogel,,47.13779831,10.95860004,2309 +OE0/TI-1076,Viggarspitze,,47.21360016,11.49919987,2306 +OE0/TI-1077,Rosskopf,,47.05170059,10.83220005,2305 +OE0/TI-1078,Padasterkogel,,47.07249832,11.36559963,2301 +OE0/TI-1079,Schoberkoepfl,,46.87919998,12.78639984,2281 +OE0/TI-1080,Kuhmoeser,,47.31000137,11.77140045,2264 +OE0/TI-1081,Isskogel,,47.24829865,12.01309967,2263 +OE0/TI-1082,Rotwand,,47.32690048,10.56330013,2262 +OE0/TI-1083,Karspitze,,47.24110031,11.96140003,2257 +OE0/TI-1084,Rote Wand,,47.24919891,11.64780045,2252 +OE0/TI-1085,Padauner Berg,,47.02249908,11.52859974,2230 +OE0/TI-1086,Filzenkogel,,47.13190079,11.88280010,2227 +OE0/TI-1087,Schwarzhanskarspitze,,47.40499878,10.61310005,2227 +OE0/TI-1088,Gampelkopf,,47.16999817,10.67109966,2225 +OE0/TI-1089,Haermelekopf,,47.32669830,11.23079967,2224 +OE0/TI-1090,Vorderes Sonnwendjoch,,47.44469833,11.80109978,2224 +OE0/TI-1091,Schlierewand,,47.36330032,10.70890045,2217 +OE0/TI-1092,Sandegg,,47.35940170,10.70110035,2216 +OE0/TI-1093,Largoz,,47.24169922,11.59249973,2214 +OE0/TI-1094,Birkhahnkopf,,46.95920181,10.14109993,2213 +OE0/TI-1095,Steinermandl,,46.87639999,12.79220009,2213 +OE0/TI-1096,Spitzmandl,,47.19670105,11.33329964,2206 +OE0/TI-1097,Mutkopf,,47.18830109,10.82639980,2200 +OE0/TI-1098,Hochalmkreuz,,47.42419815,11.42829990,2192 +OE0/TI-1099,Faltegartenkoepfl,,47.24390030,10.95969963,2184 +OE0/TI-1100,Steinkarspitze,,47.38639832,10.66329956,2181 +OE0/TI-1101,Brunnensteinspitze,,47.40560150,11.28719997,2180 +OE0/TI-1102,Pitzenegg,,47.44309998,10.82359982,2174 +OE0/TI-1103,Oefelerjoch,,47.25189972,11.83810043,2162 +OE0/TI-1104,Seehorn,,47.54499817,12.59939957,2155 +OE0/TI-1105,Ochsenkopf,,47.05390167,10.70750046,2153 +OE0/TI-1106,Rauher Kopf (Schmirn),,47.07419968,11.58390045,2150 +OE0/TI-1107,Tschamatschkopf,,46.99890137,10.29249954,2145 +OE0/TI-1108,Grosser Gamsstein,,47.28219986,11.74810028,2142 +OE0/TI-1109,Maurerkogel,,47.32389832,12.47000027,2129 +OE0/TI-1110,Laerchegg,,47.56890106,12.35169983,2123 +OE0/TI-1111,Nonsjoechl,,47.27249908,11.72249985,2112 +OE0/TI-1112,Pfriemeswand,,47.20140076,11.32779980,2103 +OE0/TI-1113,Hamberg,,47.32529831,11.90939999,2096 +OE0/TI-1114,Penken,,47.16889954,11.79969978,2095 +OE0/TI-1115,Mahnkopf,,47.41220093,11.50780010,2094 +OE0/TI-1116,Ederplan,,46.82580185,12.89579964,2062 +OE0/TI-1117,Sonnspitze,,47.39609909,12.50440025,2062 +OE0/TI-1118,Seefelder Joch,,47.34030151,11.23970032,2060 +OE0/TI-1119,Niedere Munde,,47.35469818,11.04580021,2059 +OE0/TI-1120,Hochstein,,46.82389832,12.69279957,2057 +OE0/TI-1121,Kuhkaser,,47.33720016,12.44690037,2054 +OE0/TI-1122,Schoenbichl,,47.02360153,11.78499985,2049 +OE0/TI-1123,Arbiskogel,,47.20579910,12.04279995,2048 +OE0/TI-1124,Hoenig,,47.39360046,10.74170017,2034 +OE0/TI-1125,Saalkogel,,47.37779999,12.48250008,2006 +OE0/TI-1126,Zweitausender,,47.32360077,12.34969997,2004 +OE0/TI-1127,Weisslehnkopf,,47.39059830,11.20170021,2002 +OE0/TI-1128,Spieleckkogel,,47.39059830,12.52359962,1998 +OE0/TI-1129,Alpkogel,,46.97330093,10.13920021,1995 +OE0/TI-1130,Gaichtspitze,,47.46580124,10.63969994,1986 +OE0/TI-1131,Breiteggern,,47.36640167,12.07970047,1981 +OE0/TI-1132,Abendspitze,,47.39830017,10.68669987,1962 +OE0/TI-1133,Wildkarspitze,,47.36059952,12.07859993,1961 +OE0/TI-1134,Laeuferspitze,,47.51029968,10.59780025,1956 +OE0/TI-1135,Sefenspitze,,47.51689911,10.59029961,1948 +OE0/TI-1136,Walchererhoehe,,47.15470123,10.30440044,1940 +OE0/TI-1137,Rangger Koepfl,,47.24280167,11.18140030,1939 +OE0/TI-1138,Pengelstein,,47.39080048,12.34829998,1938 +OE0/TI-1139,Talsenhoehe,,47.35139847,12.36439991,1928 +OE0/TI-1140,Feldalphorn,,47.38529968,12.08469963,1923 +OE0/TI-1141,Steinernes Mandl,,47.36169815,12.03499985,1920 +OE0/TI-1142,Hechenberg,,47.27750015,11.30609989,1912 +OE0/TI-1143,Jungfrau,,47.47439957,12.68579960,1910 +OE0/TI-1144,Gacher Blick,,47.34189987,10.98060036,1909 +OE0/TI-1145,Steinmandl,,47.36330032,10.57859993,1909 +OE0/TI-1146,Hartkaserhoehe,,47.31560135,12.36359978,1900 +OE0/TI-1147,Kreuzjoechl,,47.51139832,10.86890030,1900 +OE0/TI-1148,Rauher Kopf,,47.37580109,10.92609978,1898 +OE0/TI-1149,Oberer Geierkopf,,47.32669830,10.85420036,1869 +OE0/TI-1150,Breiteggspitze,,47.35359955,12.07250023,1868 +OE0/TI-1151,Weisse Wand,,47.11890030,11.42029953,1830 +OE0/TI-1152,Ehrenbachhoehe,,47.41830063,12.35939980,1802 +OE0/TI-1153,Schledererkopf,,47.38779831,12.26690006,1802 +OE0/TI-1154,Lochgehrenkopf,,47.47529984,10.53110027,1790 +OE0/TI-1155,Joechle,,47.32329941,10.92829990,1786 +OE0/TI-1156,Hornkoepfl,,47.46720123,12.43309975,1773 +OE0/TI-1157,Laubkogel,,47.39939880,12.46560001,1760 +OE0/TI-1158,Christlumkopf,,47.50329971,11.66110039,1758 +OE0/TI-1159,Brunnerkogel,,47.43360138,12.46249962,1749 +OE0/TI-1160,Peterskoepfl,,47.60919952,12.24670029,1745 +OE0/TI-1161,Hochetzkogel,,47.44359970,12.45110035,1738 +OE0/TI-1162,Hochmahdkopf,,47.31940079,11.49860001,1738 +OE0/TI-1163,Muehlwaldkoepfl (Gartigkoepfl),,47.40579987,10.79669952,1719 +OE0/TI-1164,Gampenkoepfle,,47.33190155,10.88939953,1711 +OE0/TI-1165,Schachtkopf,,47.36330032,10.89939976,1642 +OE0/TI-1166,Heuberg,,47.61940002,12.30939960,1603 +OE0/TI-1167,Lahnerkogel,,47.62829971,12.51970005,1595 +OE0/TI-1168,Steinwurfkogel,,47.62500000,12.49919987,1588 +OE0/TI-1169,Karkopf,,47.68999863,12.33969975,1510 +OE0/TI-1170,Schneebichl,,47.59360123,12.35719967,1470 +OE0/TI-1171,Wetterfahne,,47.68280029,12.37749958,1284 +OE0/TI-1172,Gscheuerkopf,,47.54579926,12.39439964,1280 +OE0/TI-1173,Hochkogel,,47.47439957,12.51000023,1066 +OE0/TI-1174,Rettenberg,,47.48310089,12.35690022,876 +OE0/TI-1175,Roter Schrofen,,47.04021835,10.71808338,2702 +OE0/TI-1343,Koepfle,,47.09317398,10.74602795,2834 +OE0/TI-1344,Aifner Spitze,,47.10717773,10.72116947,2558 +OE0/TI-1345,Hochschaltergrat,,47.09612274,10.73656273,2636 +OE0/TI-1346,Oberer Sattelkopf,,47.06495285,10.57179546,2596 +OE0/TI-1347,Hinterer Sattelkopf,,47.06326675,10.56442070,2670 +OE0/TI-1348,Brunnenkopf,,47.05924606,10.55749130,2682 +OE0/TI-1349,Hohe Birga,,47.24052811,11.29601955,845 +OE0/TI-1350,Feichtener Karlspitze,,47.01538086,10.70774460,2916 +OE0/TI-1351,Birgitzkoepfl,,47.19887924,11.31459045,1982 +OE0/TI-1352,Lanser Kopf,,47.24467850,11.41833019,930 +OE0/TI-1353,Bergisel,,47.24674988,11.40003014,746 +OE0/TI-1354,Schlantekopf,,47.02122116,10.69552612,2524 +OE0/TI-1355,Pfriemeskoepfl,,47.20748138,11.32882977,1801 +OE0/TI-1356,Noesslachjoch,,47.05929184,11.44229984,2231 +OE0/TI-1357,Gschwandtkopf,,47.31401000,11.17889000,1485 +OE0/TI-1359,Speckkarspitze,,47.34638900,11.48750000,2621 +OE0/TI-1360,Reps,,47.36580000,11.46194000,2159 +OE0/TI-1361,Grosser Lafatscher,,47.34580000,11.45250000,2696 +OE0/VB-1001,Schattenkopf,,46.93140030,10.08390045,3114 +OE0/VB-1002,Valgraggeszwillinge,,46.90969849,10.02140045,2869 +OE0/VB-1003,Valgraggestuerme,,46.90969849,10.02140045,2826 +OE0/VB-1004,Westliche Eisentaler Spitze,,47.08029938,10.07890034,2710 +OE0/VB-1005,Westliche Wasenspitze,,47.15359879,10.12779999,2665 +OE0/VB-1006,Oestliche Fluhspitze,,46.98939896,10.14439964,2641 +OE0/VB-1007,Joechligrat,,47.00559998,10.15439987,2626 +OE0/VB-1008,Westliche Fluhspitze,,46.98920059,10.12689972,2512 +OE0/VB-1009,Wannenkopf,,47.31330109,9.90030003,2510 +OE0/VB-1010,Saggrat,,46.95309830,10.12779999,2498 +OE0/VB-1011,Torkopf,,47.03139877,10.13360023,2426 +OE0/VB-1012,Schermsteeberg,,47.03359985,10.04080009,2370 +OE0/VB-1013,Dreier,,47.04059982,10.03499985,2321 +OE0/VB-1014,Schuesser / Hammerspitze,,47.32640076,10.19939995,2170 +OE0/VB-1015,Platziser Joch,,47.06000137,9.81560040,2170 +OE0/VB-1016,Tuertschhorn,,47.25749969,9.88000011,2096 +OE0/VB-1017,Runder Kopf (Kanisfluh),,47.33359909,9.93640041,2014 +OE0/VB-1018,Hohes Licht,,47.28030014,10.27610016,2009 +OE0/VB-1019,Kreuzmannl,,47.33000183,10.06420040,1974 +OE0/VB-1020,Schlappoltkopf,,47.35860062,10.22420025,1968 +OE0/VB-1021,Sonnenspitz (Kanisfluh),,47.33440018,9.94250011,1965 +OE0/VB-1022,Kuhspitz,,47.23640060,9.77110004,1964 +OE0/VB-1023,Schusterstuhl,,47.30360031,9.70330048,1917 +OE0/VB-1024,Leuenkopf,,47.34999847,9.81529999,1830 +OE0/VB-1025,Garmil,,47.21580124,9.93640041,1810 +OE0/VB-1026,Hoher Stoss (Kanisfluh),,47.33250046,9.91329956,1806 +OE0/VB-1027,Schafberg,,47.30440140,9.82719994,1805 +OE0/VB-1028,Mont Calv,,47.24280167,9.83749962,1804 +OE0/VB-1029,Steriser Wangspitze,,47.21860123,9.90830040,1766 +OE0/VB-1030,Bullerschkopf,,47.39640045,10.00749969,1761 +OE0/VB-1031,Hohe Kirche,,47.39500046,9.99810028,1747 +OE0/VB-1032,Maruler Guggernuelli,,47.21060181,9.88189983,1736 +OE0/VB-1033,Soellereck,,47.37360001,10.23719978,1703 +OE0/VB-1034,Vordere Niedere,,47.40330124,9.93889999,1586 +OE0/VB-1035,Hoernle,,47.31940079,9.74059963,1581 +OE0/VB-1036,Duemelekopf,,47.30970001,9.74940014,1523 +OE0/VB-1037,Scharzenberg,,47.36640167,9.73560047,1475 +OE0/VB-1038,Alpwegkopf,,47.27360153,9.71560001,1437 +OE0/VB-1039,Brueggelekopf,,47.44329834,9.85309982,1182 +OE0/VB-1040,Letze,,47.30920029,9.68999958,1174 +OE0/VB-1041,Breitenberg,,47.37939835,9.73219967,1105 +OE0/VB-1042,Hochstraess,,47.53670120,9.93939972,1041 +OE0/VB-1043,Troegerhoehe,,47.54000092,9.81060028,1039 +OE0/VB-1044,Hohe Lug,,47.32640076,9.67109966,973 +OE0/VB-1045,Karren,,47.38779831,9.75080013,971 +OE0/VB-1046,Schneiderkopf,,47.47079849,9.81029987,971 +OE0/VB-1047,Geserberg,,47.50780106,9.80939960,918 +OE0/VB-1048,Ardetzenberg,,47.25170135,9.60249996,631 +OE0/VB-1049,Dreispitz,,47.10430145,9.80101013,2351 +OE0/VB-1050,Kleine Valkastiel,,47.10753250,9.81829071,2233 +OE0/VB-1051,Hechlekopf,,47.16699982,9.62199974,2056 +OE0/VB-1052,Hohe Koepfe,,47.16899872,9.62150002,2066 +#OE0/WI-1001,Vogelsangberg,,48.26670074,16.29999924,516 +#OE0/WI-1002,Hochbruckenberg,,48.23559952,16.22690010,497 +#OE0/WI-1003,Kahlenberg,,48.26670074,16.33329964,484 +#OE0/WI-1004,Greutberg,,48.21670151,16.20000076,449 +OE0/WI-1005,Steinerne Lahn,,48.23329926,16.23329926,448 +OE0/WI-1006,Satzberg,,48.20000076,16.25000000,435 +OE0/WI-1007,Kolbeterberg,,48.21670151,16.21669960,426 +#OE0/WI-1008,Leopoldsberg,,48.26670074,16.33329964,425 +#OE0/WI-1009,Hackenberg,,48.18330002,16.23329926,406 +#OE0/WI-1010,Schafberg,,48.23329926,16.28330040,390 +OE0/WI-1011,Michaelerberg,,48.23329926,16.28330040,387 +OE0/WI-1012,Burgstall,,48.26670074,16.35000038,295 +#OL/JC-001,Trojmezná ,,48.77125931,13.82973003,1361 +#OL/JC-002,Strass ,,48.97578812,13.57988071,1308 +#OL/JC-003,Srní vrch ,,48.98992538,13.80475521,1296 +#OL/JC-004,Holý vrch ,,48.98104477,13.58005905,1294 +#OL/JC-005,Basumský hřeben ,,48.97609711,13.79699516,1288 +#OL/JC-006,Hraničník ,,48.75025558,13.90491962,1281 +#OL/JC-007,Boubínský hřbet ,,48.98710632,13.79673004,1268 +#OL/JC-008,Stolová hora ,,48.98374557,13.60086727,1254 +#OL/JC-009,Červený vrch ,,48.96090698,13.79659557,1203 +#OL/JC-010,Orel,,49.02746582,13.59198093,1182 +#OL/JC-011,Lapka,,49.02360916,13.57085991,1171 +#OL/JC-012,Studničná ,,48.75770187,13.89951038,1160 +#OL/JC-013,Stanová hora ,,48.99920273,13.60546589,1159 +#OL/JC-014,V Pařezí ,,48.79928589,13.84774780,1146 +#OL/JC-015,Žlíbský vrch ,,48.93506622,13.72905350,1133 +#OL/JC-016,Zvěřín ,,49.02186203,13.63481617,1133 +#OL/JC-017,Světlá hora ,,49.00416946,13.71734047,1123 +#OL/JC-018,Churáňovský vrch ,,49.06826019,13.61492443,1119 +#OL/JC-019,Výška ,,49.06006241,13.63946438,1117 +#OL/JC-020,Obří hora ,,48.98194504,13.74459076,1114 +#OL/JC-021,Janská hora ,,49.00975037,13.62683296,1112 +#OL/JC-022,Kamenná ,,49.01751328,13.68165588,1101 +#OL/JC-023,Bukovec,,49.00566101,13.68688965,1099 +#OL/JC-024,Chlustov,,48.92515564,13.75726414,1094 +#OL/JC-025,Jedlová ,,48.93415833,13.85524273,1089 +#OL/JC-026,Hrb,,49.05555344,13.67276573,1074 +#OL/JC-027,Skalnatý hřbet ,,48.90696716,13.68129158,1072 +#OL/JC-028,Nad Smržem ,,48.98687363,13.71527004,1069 +#OL/JC-029,Vyhlídka ,,48.98519516,13.64992332,1068 +#OL/JC-030,Stodůlecká hora ,,48.92906952,13.64657974,1066 +#OL/JC-031,Žďárecká hora ,,48.92388916,13.65092182,1064 +#OL/JC-032,Šerava ,,49.00538635,13.75592518,1061 +#OL/JC-033,Včelenský vrch ,,49.00633240,13.83291340,1057 +#OL/JC-034,Polední vrch ,,48.96522522,13.65953541,1053 +#OL/JC-035,Větrný ,,48.90578842,13.93656921,1051 +#OL/JC-036,Liščí hora ,,48.97629166,13.70843601,1049 +#OL/JC-037,Perník ,,48.81715775,13.90182877,1049 +#OL/JC-038,Kamenáč ,,49.00056458,13.64108562,1048 +#OL/JC-039,Homole,,48.97653580,13.66043472,1044 +#OL/JC-040,Kupa,,49.01159286,13.80522060,1044 +#OL/JC-041,Nad Pasekou,,49.04184723,13.67597771,1041 +#OL/JC-042,Jelení hora ,,48.93503189,13.67487240,1039 +#OL/JC-043,Zátoňská hora ,,48.94589996,13.83143997,1034 +#OL/JC-044,Václavova hora ,,48.81523132,13.84454918,1031 +#OL/JC-045,Doupná hora ,,48.88999939,13.93583965,1029 +#OL/JC-046,Kapraď ,,48.85688400,13.77324295,1026 +#OL/JC-047,Koňský vrch ,,48.78296280,13.88580322,1026 +#OL/JC-048,Na Skalce,,48.96553802,14.01093674,1025 +#OL/JC-049,Medvědí vrch ,,48.63851166,14.08977890,1017 +#OL/JC-050,Radvanovský vrch ,,48.89487076,13.78552055,1012 +#OL/JC-051,Mechový vrch ,,48.88134150,13.91946500,1012 +#OL/JC-052,Valy,,49.09791946,13.59174252,1010 +#OL/JC-053,Rohanovský vrch ,,48.95780182,14.02299976,1010 +#OL/JC-054,V Oboře ,,49.00738144,13.85503960,1006 +#OL/JC-055,Pomezný ,,48.88815308,13.68506050,1002 +#OL/JC-056,Homole,,49.06951523,13.65410233,1001 +#OL/JC-057,Přední kopec ,,48.88100815,13.67084026,997 +#OL/JC-058,Kobylí hlava ,,48.78160477,13.89400101,994 +#OL/JC-059,Stožecká skála ,,48.87361908,13.82127953,974 +#OL/JC-060,Nad Černými Lady ,,48.99481201,13.68509865,993 +#OL/JC-061,Sklářský vrch ,,49.02391434,13.78621292,992 +#OL/JC-062,Slatinský vrch ,,48.96076584,13.72315407,983 +#OL/JC-063,Kaliště ,,48.65666962,14.20949078,983 +#OL/JC-064,Kolářův vrch ,,48.61516953,14.65272045,982 +#OL/JC-065,Kamenná ,,48.81828690,13.81222057,979 +#OL/JC-066,Plešivec ,,48.81147385,13.87198639,978 +#OL/JC-067,Jilmová ,,49.05772018,13.72428608,978 +#OL/JC-068,Bukový vrch ,,48.63620758,14.13607883,975 +#OL/JC-069,Medník ,,49.03265762,13.78282642,974 +#OL/JC-070,Spáleniště ,,48.87802887,13.79220009,960 +#OL/JC-071,Suchý vrch ,,49.11763763,13.59776211,958 +#OL/JC-072,Skaliny,,48.91968918,14.02690983,958 +#OL/JC-073,Klín ,,49.03852844,13.69451046,955 +#OL/JC-074,Kobylí hora ,,48.61981964,14.66652870,955 +#OL/JC-075,Střední vrch ,,48.60049438,14.67880917,955 +#OL/JC-076,Kraví hora ,,48.73093796,14.71975517,953 +#OL/JC-077,Nad Lipovou,,48.60653305,14.20278549,949 +#OL/JC-078,Skelný vrch ,,48.92900467,14.01427937,947 +#OL/JC-079,Jelení hora ,,48.61261368,14.64009380,947 +#OL/JC-080,Vysoký les ,,48.93902588,13.91980457,942 +#OL/JC-081,Jiřická hora ,,48.61162186,14.66930008,942 +#OL/JC-082,Růžový vrch ,,48.64837265,14.07168007,939 +#OL/JC-083,Kamenná ,,48.57281494,14.29723454,938 +#OL/JC-084,Obecní vrch ,,48.89817429,13.71841812,937 +#OL/JC-085,Vrchoviště ,,48.83973694,13.84823799,937 +#OL/JC-086,Hradiště ,,48.59166336,14.29583454,937 +#OL/JC-087,Stříbrný vrch ,,48.65416718,14.69932461,936 +#OL/JC-088,Sviňovický vrch ,,48.95861816,13.97686672,935 +#OL/JC-089,Medvědí hora ,,48.61928177,14.22548866,934 +#OL/JC-090,Luč ,,48.63277054,14.26317692,933 +#OL/JC-091,Pivonický vrch ,,48.66797638,14.66968822,933 +#OL/JC-092,Křepelický vrch ,,49.00849533,13.96118546,932 +#OL/JC-093,Albertov,,48.89944839,14.20348549,932 +#OL/JC-094,Jilmová ,,48.95316696,13.71919537,931 +#OL/JC-095,Bílý kámen ,,48.85333252,14.29418945,931 +#OL/JC-096,Kraví hora ,,48.61367416,14.19496632,930 +#OL/JC-097,Na Vrších ,,49.03620911,13.81973648,928 +#OL/JC-098,Výšina ,,49.03363037,13.82800674,926 +#OL/JC-099,Uhlířský vrch ,,48.60675430,14.24651718,925 +#OL/JC-100,Kuní hora ,,48.72643661,14.70411587,925 +#OL/JC-101,Střední kopec ,,48.89060974,13.66973972,920 +#OL/JC-102,Silnický vršek ,,48.88520050,13.71372986,920 +#OL/JC-103,Zlatá stezka ,,48.93395233,13.91598129,920 +#OL/JC-104,Korunáč ,,48.86436081,13.94704628,920 +#OL/JC-105,Vysoká Mýť ,,48.92412949,14.04255009,920 +#OL/JC-106,Ořechovka ,,48.92895889,13.91281319,919 +#OL/JC-107,Malý Plešný ,,48.64615631,14.13840675,917 +#OL/JC-108,Dvorský vrch ,,48.91865158,13.86662579,914 +#OL/JC-109,V Lískách ,,49.13269043,13.60457611,914 +#OL/JC-110,Na Kamenici,,49.07275772,13.72390079,914 +#OL/JC-111,Ktišská hora ,,48.92583084,14.12017155,911 +#OL/JC-112,Kraví hora ,,48.74768066,14.40874195,910 +#OL/JC-113,Smrčina ,,48.66288376,14.67591381,910 +#OL/JC-114,Mošna ,,48.93579865,14.00070953,908 +#OL/JC-115,Mařský vrch ,,49.07301331,13.84767342,907 +#OL/JC-116,Lužnický vrch ,,48.69130325,14.64833832,907 +#OL/JC-117,Vodník ,,49.05451965,13.74758148,906 +#OL/JC-118,Černý les ,,49.01588821,13.88203526,906 +#OL/JC-119,Mackův vrch ,,48.93161392,14.12334728,904 +#OL/JC-120,U Hvozdecké cesty ,,48.82204437,13.92384624,902 +#OL/JC-121,Kamenný vrch ,,49.07891846,13.65198612,902 +#OL/JC-122,Hodslavský vrch ,,48.67630768,14.22917938,902 +#OL/JC-123,Libínský les ,,48.97153854,13.98939228,901 +#OL/JC-124,Kamenáč ,,48.92377853,13.90538979,899 +#OL/JC-125,Vysoká ,,48.99515533,13.88151550,899 +#OL/JC-126,Šešovec ,,48.75497055,13.97948456,899 +#OL/JC-127,Loužka ,,49.07284927,13.74547768,899 +#OL/JC-128,Kobylí vrch ,,48.63320923,14.64243984,899 +#OL/JC-129,Jelení vrch ,,48.83451462,13.85140991,897 +#OL/JC-130,Vyklestilka,,48.61189270,14.27335739,897 +#OL/JC-131,Hamerský les ,,48.89888000,13.75294971,896 +#OL/JC-132,Kohoutová ,,49.09714890,13.71691895,894 +#OL/JC-133,U Pasečné ,,48.61619949,14.10359001,894 +#OL/JC-134,Brod,,48.60708618,14.26452732,893 +#OL/JC-135,U Mysliven,,48.93795013,13.88459969,891 +#OL/JC-136,Slupečný vrch ,,48.64871979,14.23666000,890 +#OL/JC-137,Hůrka ,,48.86122894,13.94307613,887 +#OL/JC-138,Ohrada,,48.85212708,14.27381325,886 +#OL/JC-139,Studená ,,49.03591537,13.89165688,885 +#OL/JC-140,Lhotský vrch ,,48.75334930,13.99976254,884 +#OL/JC-141,Mezileský vrch ,,48.59843063,14.10905361,884 +#OL/JC-142,Smolná hora ,,48.91783142,13.84884548,883 +#OL/JC-143,Kokovec,,49.06442261,13.91544533,882 +#OL/JC-144,Nad Skalným ,,48.77730560,14.14117336,880 +#OL/JC-145,Petrovický vrch ,,48.99001400,13.96277290,835 +#OL/JC-146,Růžový vrch ,,48.88380814,14.24258232,877 +#OL/JC-147,Ohradec,,48.84325790,13.81904411,875 +#OL/JC-148,Na Vrchu,,48.85250092,13.83965969,874 +#OL/JC-149,Tok,,48.85668182,13.79452038,873 +#OL/JC-150,Krejčovický kopec ,,48.98312378,13.89512444,872 +#OL/JC-151,Ořík ,,48.76065063,14.05469894,870 +#OL/JC-152,Žibřidovský vrch ,,48.66172791,14.39062691,870 +#OL/JC-153,Ptáčník ,,48.92911148,13.80489635,868 +#OL/JC-154,Jelení hora ,,48.94120026,14.05016994,868 +#OL/JC-155,Lučenický vrch,,48.97583389,14.05457211,867 +#OL/JC-156,U Horní Ureše ,,48.60744095,14.06968975,866 +#OL/JC-157,Chuchelecká hora ,,48.75916290,14.43026924,866 +#OL/JC-158,Vysoký kámen (Slepice) ,,48.75645065,14.60826397,865 +#OL/JC-159,Čertova stráň ,,49.00172043,13.87983990,862 +#OL/JC-160,Dobrá voda ,,48.77263260,14.03280640,862 +#OL/JC-161,Plešivec ,,48.70107651,14.27522755,862 +#OL/JC-162,Suchý vrch ,,49.11111450,13.66679001,861 +#OL/JC-163,Hřibový vrch ,,48.89695740,14.23932743,857 +#OL/JC-164,Vrata,,48.95777130,14.12769699,856 +#OL/JC-165,Malšínský kámen ,,48.67866135,14.27908039,856 +#OL/JC-166,Nad Malší ,,48.62612152,14.58983994,855 +#OL/JC-167,Stožeček ,,48.87518692,13.85244274,854 +#OL/JC-168,Martínkovský vrch ,,48.60425568,14.29527950,846 +#OL/JC-169,Zvonkovský vrch ,,48.72397232,13.99795151,845 +#OL/JC-170,Zahájený ,,49.15711975,13.69989967,845 +#OL/JC-171,Altán ,,49.17681885,13.70345974,845 +#OL/JC-172,U Věže ,,48.64760971,14.03161526,844 +#OL/JC-173,Hrubec,,48.70819855,14.29839611,843 +#OL/JC-174,Chudějovský vrch ,,48.72091293,14.40949154,843 +#OL/JC-175,Ovesný vrch ,,48.80337143,13.92816830,842 +#OL/JC-176,Na Dvacítkách ,,48.96219635,13.95045280,841 +#OL/JC-177,Suchý vrch ,,48.76824951,14.11410999,840 +#OL/JC-178,Albrechtovický kopec ,,48.97401047,13.95993423,839 +#OL/JC-179,Martinova hora,,49.08752823,13.76537895,839 +#OL/JC-180,Klenovec,,48.97200775,14.09782410,839 +#OL/JC-181,Na Vrcholu,,48.99892044,14.04778957,837 +#OL/JC-182,Nad Vadkovem,,48.95012283,14.13455105,837 +#OL/JC-183,Táhlý ,,48.65227127,14.55801868,836 +#OL/JC-184,Lískový vrch (Lískovec) ,,48.90098190,13.86255074,834 +#OL/JC-185,Panský vrch ,,48.96606827,13.92813015,834 +#OL/JC-186,Mlýnský vršek ,,48.95040894,13.76341152,831 +#OL/JC-187,Lysý vrch ,,48.65248108,14.63817978,831 +#OL/JC-188,Cikánský vrch (Mlýnský vrch) ,,48.70185471,14.15691948,829 +#OL/JC-190,Kalený vrch ,,49.12597656,13.75378704,828 +#OL/JC-191,Hajný vrch ,,48.79423523,13.92825413,826 +#OL/JC-192,Lesík ,,48.77423477,14.07023239,824 +#OL/JC-193,Jelenský vrch,,48.79663849,13.89345264,823 +#OL/JC-194,Modlenický vrch ,,49.08288193,13.74171925,823 +#OL/JC-195,Jelení kopec ,,48.61013031,14.13247967,823 +#OL/JC-196,Uhřice ,,49.08744431,13.92217636,822 +#OL/JC-197,Velenecký vrch ,,48.68303680,14.33939552,822 +#OL/JC-198,Nad Žlábkem ,,48.75640869,14.08259010,821 +#OL/JC-199,Červený vrch ,,48.67161942,14.63619614,821 +#OL/JC-200,Filipinka,,48.71512604,14.67318630,820 +#OL/JC-201,Spálený ,,48.85159683,13.87599277,818 +#OL/JC-202,Suchého kopec ,,48.94122314,13.96291065,818 +#OL/JC-203,Farský vrch ,,48.63834381,14.58626652,818 +#OL/JC-204,Na Kopci,,49.10506821,13.73414040,816 +#OL/JC-205,Želnavský vrch ,,48.81225967,13.95800018,815 +#OL/JC-206,Bosákův vrch ,,48.93458939,14.06707001,815 +#OL/JC-207,Babín ,,48.64069366,14.38729668,815 +#OL/JC-208,Hovorkův kopec ,,48.93330765,13.96307468,814 +#OL/JC-209,U Lipky,,48.94979477,14.12007809,814 +#OL/JC-210,Mlýnské vrchy ,,48.87934875,14.19005680,814 +#OL/JC-211,Kozí vrch ,,48.72819901,14.03773975,812 +#OL/JC-212,Větrný kopec ,,48.73242188,14.40826893,812 +#OL/JC-213,Malonínský kopec ,,48.97748566,14.07181454,810 +#OL/JC-214,Granátník ,,48.84445953,14.31426811,810 +#OL/JC-215,U Miletínek ,,48.92517471,14.10025215,809 +#OL/JC-216,Nový les ,,48.87493134,14.23791981,809 +#OL/JC-217,Radvanovský vrch ,,48.55857468,14.32892895,808 +#OL/JC-218,Červený vrch ,,48.67288208,14.25574589,808 +#OL/JC-219,Pískový kámen ,,48.97076416,14.19251156,808 +#OL/JC-220,Zelený vrch ,,48.99437714,14.09632683,806 +#OL/JC-221,Kuřský vrch ,,48.71535873,14.63087845,806 +#OL/JC-222,Kóta ,,48.71136093,14.01101017,805 +#OL/JC-223,Lískovec ,,48.72304916,14.08988953,805 +#OL/JC-224,Pískový vrch ,,48.85618973,14.25658035,804 +#OL/JC-225,Cikánský vrch ,,48.72379303,14.65909767,804 +#OL/JC-226,Dehetník ,,49.01933670,13.95855236,802 +#OL/JC-227,Kuželová ,,48.88729858,14.21265030,801 +#OL/JC-228,Hůra ,,48.76082230,14.40314484,799 +#OL/JC-229,Tábor ,,48.60644531,14.43122959,798 +#OL/JC-230,Kraví vrch ,,48.87054062,14.20667171,797 +#OL/JC-231,Kraví hora ,,48.63448715,14.32005024,796 +#OL/JC-232,Loučová ,,49.01961517,13.89541054,793 +#OL/JC-233,Na Skalce,,48.76715469,13.97346783,793 +#OL/JC-234,Plánský kopec ,,48.69493484,14.12670326,788 +#OL/JC-235,Vyhlídka ,,48.66388702,14.54661846,788 +#OL/JC-236,Šibeník ,,48.93449402,14.17201519,787 +#OL/JC-237,Strnadí kopec ,,48.66796112,14.34589481,784 +#OL/JC-238,Dubový kopec ,,48.91587448,14.14076614,783 +#OL/JC-239,Kněžík ,,48.86494827,14.24166679,783 +#OL/JC-240,Žumberský kopec ,,48.64941025,14.32441139,783 +#OL/JC-241,Bělský vrch ,,48.79632950,13.95283031,782 +#OL/JC-242,Kozlík ,,48.71791840,14.16969967,782 +#OL/JC-243,Hradišťský vrch ,,48.74014664,14.53983974,780 +#OL/JC-244,Chrášťanský vrch ,,48.98834991,14.20677185,780 +#OL/JC-245,Ostrá hora ,,48.93826294,14.08991146,780 +#OL/JC-246,Soví vrch ,,48.66828156,14.06848907,780 +#OL/JC-247,Zaječí vrch ,,48.72295380,14.64333153,780 +#OL/JC-248,Na Vrších ,,49.00926208,14.02429199,777 +#OL/JC-249,Zábraňský vrch ,,48.69862366,14.33386421,777 +#OL/JC-250,Kříchová ,,48.77636337,14.33621216,776 +#OL/JC-251,Čistá hora ,,49.12654877,13.77351093,773 +#OL/JC-252,Bolíkovický vrch ,,49.08523941,13.89636993,770 +#OL/JC-253,Křížová hora ,,48.71931076,14.37840271,768 +#OL/JC-254,Kobylí hora ,,49.02095032,14.03005028,767 +#OL/JC-255,Lomec,,49.04228592,13.91067314,766 +#OL/JC-256,Na Mýtkách ,,49.13457108,13.74326229,766 +#OL/JC-257,Jelínka ,,48.70131500,14.39814110,752 +#OL/JC-258,Kamenný vrch ,,48.78324890,14.18202019,765 +#OL/JC-259,Novoveský vrch ,,49.17784882,13.73250675,765 +#OL/JC-260,Věnec ,,49.09916306,13.86822033,765 +#OL/JC-261,Hora,,48.77240753,14.37524319,764 +#OL/JC-262,Na Čepici ,,48.61067963,14.55914211,762 +#OL/JC-263,Mackův vrch ,,48.95985031,14.21183968,761 +#OL/JC-264,Dubový vrch ,,49.01553726,13.98423481,760 +#OL/JC-265,Liščí díra ,,48.77787018,14.15956974,760 +#OL/JC-266,Pivničky ,,49.15714264,15.32598114,760 +#OL/JC-267,Hazukův kopec ,,48.95040131,14.07551003,759 +#OL/JC-268,Omlenický vrch ,,48.72703171,14.43879128,759 +#OL/JC-269,Zdenice,,49.01443100,14.03748035,758 +#OL/JC-270,Brda,,49.14282990,13.81678963,757 +#OL/JC-271,Jiříčkův vrch ,,48.86910248,14.33182240,757 +#OL/JC-272,Herbertovský vrch ,,48.60448456,14.34595490,755 +#OL/JC-273,Hrádek ,,49.07403183,13.78904533,755 +#OL/JC-274,Vrch,,49.02306747,13.91043568,754 +#OL/JC-275,Besednická hora (Velký kámen) ,,48.94723892,14.18338585,752 +#OL/JC-277,Hájky ,,48.77186966,14.43089008,748 +#OL/JC-278,Vyšný vrch ,,48.83808136,14.29440022,744 +#OL/JC-279,Branný vrch ,,48.75637817,14.29173946,743 +#OL/JC-280,Ivovice,,49.09070587,13.82863617,742 +#OL/JC-281,Stráže ,,48.99518204,14.13590336,742 +#OL/JC-282,Blanice,,48.97351837,13.91413975,741 +#OL/JC-283,Dlouhý vrch ,,48.79156494,14.26793480,740 +#OL/JC-284,Horní háj ,,48.78762054,14.40772915,739 +#OL/JC-285,Šibeniční vrch ,,48.77948380,14.36644363,738 +#OL/JC-286,Šibeniční vrch ,,48.66372299,14.28684521,737 +#OL/JC-287,Hůrka ,,48.74303055,14.07549000,736 +#OL/JC-288,Za Vrškem ,,49.20390701,15.31742096,736 +#OL/JC-289,U Tří mezníků ,,49.02058411,14.08874035,735 +#OL/JC-290,Jeseň ,,48.77349854,14.56599045,733 +#OL/JC-291,Kamenný vrch ,,48.98189163,14.19725037,733 +#OL/JC-292,Krásná hora ,,48.72227859,14.63436031,733 +#OL/JC-293,Ostrý ,,48.66168213,14.26003933,733 +#OL/JC-294,Horka,,49.15968323,15.34344482,732 +#OL/JC-295,Křížovice ,,49.09502792,13.82897282,732 +#OL/JC-296,Šerovna ,,48.98885345,13.93042850,732 +#OL/JC-297,Šibeník ,,49.08591461,15.23041344,732 +#OL/JC-298,Nad Suchdolem,,48.68254852,14.43760014,731 +#OL/JC-299,Borek,,48.92195129,14.08376503,729 +#OL/JC-300,Ohrádka ,,48.84799957,14.25800991,728 +#OL/JC-301,Racinova hora,,49.12590790,13.78087425,728 +#OL/JC-302,V Kopcích ,,49.21324158,15.28538036,728 +#OL/JC-303,Vysoký kámen ,,49.06335068,15.24055004,728 +#OL/JC-304,Hodonický vrch ,,48.71925354,14.55264664,726 +#OL/JC-305,Silná hora ,,49.08583069,13.86501026,725 +#OL/JC-306,Studnice,,49.05608368,15.24878025,722 +#OL/JC-307,Haberský vrch ,,48.93492508,14.31488705,718 +#OL/JC-308,Malý vrch ,,49.16127014,15.33139038,717 +#OL/JC-309,Polední vrch ,,48.57147217,14.37631321,716 +#OL/JC-310,Skalka,,49.06832123,15.16669750,715 +#OL/JC-311,Suchdolský vrch ,,49.12191772,15.25426292,714 +#OL/JC-312,Chrasnice,,49.17439651,13.77276897,711 +#OL/JC-313,Černý les ,,48.61512756,14.37023926,710 +#OL/JC-314,Kozlov,,49.53688812,14.41895962,709 +#OL/JC-315,Babí hora ,,49.18156052,15.31768894,708 +#OL/JC-316,Stržíšek ,,48.93813705,14.20942497,708 +#OL/JC-317,Dubovec,,49.17047882,13.76298714,706 +#OL/JC-318,Vysoká ,,48.96712875,14.22896957,706 +#OL/JC-319,Tichý vrch ,,48.63785172,14.51546860,705 +#OL/JC-320,Mladotický vrch ,,49.21232605,13.79346943,703 +#OL/JC-321,Skalka,,49.09924698,15.21951580,703 +#OL/JC-322,Spálený ,,49.02725601,14.08621025,703 +#OL/JC-323,Starohuťský vrch ,,48.98476791,15.16707516,703 +#OL/JC-324,Střední hora ,,48.94778824,14.29154968,702 +#OL/JC-325,Vraný vrch ,,48.78556442,14.31027889,702 +#OL/JC-326,Stráž ,,49.02969360,13.93404007,701 +#OL/JC-327,Javoří hora ,,49.06845093,15.21729851,700 +#OL/JC-328,Kameniště ,,48.67764282,14.48041916,700 +#OL/JC-329,Kozí kámen ,,48.98123932,14.13811207,700 +#OL/JC-330,Křížový kopec ,,48.73170090,14.27000046,700 +#OL/JC-331,Radešice ,,49.13998413,13.77142525,700 +#OL/JC-332,Skalka,,48.65074539,14.34318447,699 +#OL/JC-333,Za Horou,,49.10016251,13.78260136,698 +#OL/JC-334,Němč ,,49.04934692,13.92716026,697 +#OL/JC-335,Přední kopec ,,48.89014053,14.28734207,697 +#OL/JC-336,Jelínek ,,48.74852753,14.62834930,696 +#OL/JC-337,Hora,,49.00038147,14.13811016,694 +#OL/JC-338,Ve Vrškách ,,49.49307632,14.83655930,693 +#OL/JC-339,Houperek,,48.98204422,14.18981457,691 +#OL/JC-340,Kamenný vrch ,,49.04259109,15.21417999,689 +#OL/JC-341,Skalka,,48.95531464,14.28302574,688 +#OL/JC-342,Hůrka ,,49.55296707,14.88253689,686 +#OL/JC-343,Lazecký vrch ,,48.83655167,14.26782036,686 +#OL/JC-344,Výrovec ,,49.02869415,13.98298168,686 +#OL/JC-345,Bloudím ,,49.21023178,13.72579956,685 +#OL/JC-346,Choustník ,,49.33107000,14.85361000,670 +#OL/JC-347,Pravda,,49.15328979,13.84032631,684 +#OL/JC-348,Pintovka,,49.03882217,13.96460438,683 +#OL/JC-349,Kondračská hora ,,48.78022385,14.63737202,682 +#OL/JC-350,Na Vyhlídce ,,49.02961349,13.95658684,682 +#OL/JC-351,Na Vrchu,,48.96103287,14.18021011,681 +#OL/JC-352,Návary ,,48.98074341,15.20893574,681 +#OL/JC-353,Havlova hora,,49.08762360,15.27107048,680 +#OL/JC-354,Kunějovský kopec ,,49.07931900,15.11371040,680 +#OL/JC-355,Vysoký kořen ,,48.95868683,14.23674965,680 +#OL/JC-356,Dluhoště ,,48.73147964,14.56766033,678 +#OL/JC-357,Malinový kopec ,,48.92298889,14.18902016,678 +#OL/JC-358,Světlík ,,48.73522186,14.74250984,678 +#OL/JC-359,Bukovice,,49.18882751,15.26152229,677 +#OL/JC-360,Holý vrch ,,49.52864838,14.55702496,677 +#OL/JC-361,Skalí ,,49.50278091,14.85591793,677 +#OL/JC-362,Hora,,49.10178375,15.27871037,675 +#OL/JC-363,Jirkova skála ,,49.45145050,14.83785680,699 +#OL/JC-364,Kraví vrch ,,48.96395111,15.22143459,675 +#OL/JC-365,Muchův kopec ,,49.13302612,15.27340221,674 +#OL/JC-366,Na Vrších ,,49.16535568,13.76849270,674 +#OL/JC-367,Podhoří ,,49.55086899,14.87126064,673 +#OL/JC-368,Vojíkov ,,49.22323227,13.69124413,673 +#OL/JC-369,Králov ,,49.54177094,14.39601040,672 +#OL/JC-370,Venclovský vrch ,,48.98583984,15.21529961,672 +#OL/JC-371,Kamenný vrch ,,49.01799393,15.12921906,670 +#OL/JC-372,Bušová ,,49.52206802,14.85785103,669 +#OL/JC-373,Na Hejsalech,,49.41547012,14.90073395,669 +#OL/JC-374,Čekanka ,,49.19287109,13.77747250,668 +#OL/JC-375,Spálený ,,48.78719711,14.39553547,668 +#OL/JC-376,Vormanice,,49.51697922,14.51866722,668 +#OL/JC-377,Zadní Radlický vrch ,,49.12054825,15.31280422,668 +#OL/JC-378,Homole,,49.46464539,14.80723095,666 +#OL/JC-379,Křížový vrch ,,48.97809601,15.19908524,666 +#OL/JC-380,Kbíl ,,49.21846008,13.84440517,664 +#OL/JC-381,Mlaď ,,49.15248489,13.78998661,663 +#OL/JC-382,Šibenice ,,48.64606094,14.35503006,663 +#OL/JC-383,Vršek ,,49.12666702,15.28564835,662 +#OL/JC-384,Pekelec,,49.03834915,15.29225731,661 +#OL/JC-385,V Pahrbcích ,,49.50324631,14.55741978,660 +#OL/JC-386,Čertův kámen ,,49.22790909,14.97483826,659 +#OL/JC-387,Na Skále ,,49.47800827,14.90568733,659 +#OL/JC-388,Bukovec,,49.48669815,14.59661484,658 +#OL/JC-389,Pastviště ,,49.03919601,14.10372448,658 +#OL/JC-390,Přední Radlický vrch ,,49.11296844,15.32185555,658 +#OL/JC-391,Spálený vrch ,,49.15055466,13.85454273,658 +#OL/JC-392,Kříb ,,48.75087357,14.69210911,657 +#OL/JC-393,Duškovec ,,49.15449142,14.00761890,656 +#OL/JC-394,Obora,,49.00139236,15.10555077,656 +#OL/JC-395,Hůrka ,,49.21799088,13.83928967,655 +#OL/JC-396,Mlýnský vrch ,,48.72100067,14.57666969,655 +#OL/JC-397,Stříbrný kopec ,,49.05797195,15.30146122,655 +#OL/JC-398,Vráže ,,49.05516052,13.95211029,655 +#OL/JC-399,Čihadlo ,,49.04845810,14.04695988,654 +#OL/JC-400,Pálenina ,,49.10845947,13.92248821,654 +#OL/JC-401,Stříbrný vrch ,,49.03627777,15.31424522,654 +#OL/JC-402,Na Vršku ,,49.41135788,14.89081573,653 +#OL/JC-403,Písková hora ,,49.17840195,15.34028149,653 +#OL/JC-404,Spálenka ,,49.53662491,14.38225365,653 +#OL/JC-405,Na Vrchu,,49.50383377,14.89812374,652 +#OL/JC-406,Betaň ,,49.14051437,13.87287331,651 +#OL/JC-407,Buková hora ,,48.99747467,14.21482944,650 +#OL/JC-408,Přidinec ,,49.17224884,13.93328762,650 +#OL/JC-409,Široký ,,49.04233932,13.96782017,650 +#OL/JC-410,Štěnice ,,48.94438934,14.24002647,650 +#OL/JC-411,Blanský vrch ,,48.73149490,14.53534889,649 +#OL/JC-412,Pánův vrch ,,49.25603867,14.95745277,649 +#OL/JC-413,Za Židovským hřbitovem ,,49.47295380,14.53930664,648 +#OL/JC-415,U Spůle ,,49.11172485,13.79393864,648 +#OL/JC-416,Deštenská hora ,,49.25077820,14.93800068,647 +#OL/JC-417,Dubovec,,49.22238541,13.81992245,647 +#OL/JC-418,Liščí vrch ,,49.11270905,15.17473888,647 +#OL/JC-419,Sosnový vrch ,,49.27669907,15.01506805,647 +#OL/JC-420,Výhon ,,48.96168900,15.19825554,647 +#OL/JC-421,Dubovec,,49.21958923,13.73242855,646 +#OL/JC-422,Osule,,49.04809189,14.06425953,646 +#OL/JC-423,Stříbrný vrch ,,48.99668121,15.22879887,646 +#OL/JC-424,Brčík ,,49.24185562,14.94009972,645 +#OL/JC-425,Hlavičky ,,49.21889114,13.80928993,645 +#OL/JC-426,Peltanův vršek ,,49.20418549,15.21207237,645 +#OL/JC-427,Vichrův kopec ,,49.05070114,15.30251217,645 +#OL/JC-428,Vráž ,,49.18350983,13.95454025,645 +#OL/JC-429,Kámen ,,49.17233658,15.23268032,644 +#OL/JC-430,Kobylí vrch ,,49.16508000,13.98842000,623 +#OL/JC-431,Doubí ,,48.96384430,14.16038132,643 +#OL/JC-432,Kamenec,,49.05915833,15.09305000,643 +#OL/JC-433,Pahorek,,49.14570236,15.35003948,643 +#OL/JC-434,Na Homolích ,,49.51066208,14.48822880,642 +#OL/JC-435,Na Vrších ,,49.15400000,15.29030000,642 +#OL/JC-436,Řasy ,,49.07899857,15.06628036,642 +#OL/JC-437,Výhledy ,,48.95383072,14.25321484,642 +#OL/JC-438,Židovská stráň ,,49.42150497,14.89178658,642 +#OL/JC-439,Kamenný stůl ,,48.97129822,15.21916962,641 +#OL/JC-440,Kopanina,,49.16260529,15.27323532,641 +#OL/JC-441,Skalka,,49.00518799,15.22139931,641 +#OL/JC-442,Beranov,,49.18756104,15.34700012,640 +#OL/JC-443,Červená ,,49.17765427,13.97389507,640 +#OL/JC-444,Hora,,49.21377182,15.21121025,640 +#OL/JC-445,Brankovec,,49.13508606,13.90688610,639 +#OL/JC-446,Divizna,,49.10551834,15.54365253,639 +#OL/JC-447,Řečický vrch ,,49.14204025,15.35305977,639 +#OL/JC-448,Vlčkův vrch ,,48.75896835,14.69069958,639 +#OL/JC-449,Patákův kopec ,,49.47860336,14.80585098,638 +#OL/JC-450,Chmelovka,,49.16890717,14.01029396,637 +#OL/JC-451,U Starých vod ,,49.22639847,13.69456959,637 +#OL/JC-452,Bořkův kopec ,,49.11231995,13.91020966,636 +#OL/JC-453,Hansalice,,49.16947174,13.96791840,636 +#OL/JC-454,Klokotín ,,49.23184586,13.70222473,636 +#OL/JC-455,Kostelík ,,49.49740982,14.44106960,635 +#OL/JC-456,Kalný vrch ,,49.20141602,13.90476513,634 +#OL/JC-457,Lítovec ,,49.15927887,13.81341267,634 +#OL/JC-458,Včelákův vrch ,,49.53408051,14.56703663,634 +#OL/JC-459,Vlčí vrch ,,48.94641495,14.22000122,634 +#OL/JC-460,Stříbrná hora ,,48.99555969,14.18762684,633 +#OL/JC-461,Buková ,,49.09476089,15.29609489,632 +#OL/JC-462,U Lomu,,49.03329849,15.07103157,632 +#OL/JC-463,Záhoří ,,49.50305939,14.40322781,631 +#OL/JC-464,Kučka ,,49.10898590,13.78687954,630 +#OL/JC-465,Kluzí ,,49.03393173,14.06429005,629 +#OL/JC-466,Matějkův vrch ,,48.94659042,14.22729015,628 +#OL/JC-467,V Hutinkách ,,49.22904587,15.19174099,628 +#OL/JC-468,Holý vrch ,,48.65174103,14.46645641,627 +#OL/JC-469,Nad Hřištěm ,,48.61230087,14.32005024,627 +#OL/JC-470,Pahrbek,,49.47851944,14.48132992,627 +#OL/JC-471,Hora,,49.16442871,13.92763996,626 +#OL/JC-472,Vlčkovský vrch ,,49.26547340,15.01539450,638 +#OL/JC-473,Holý vrch ,,49.12964249,15.35420322,625 +#OL/JC-474,Hůrka ,,49.20466995,13.75038338,625 +#OL/JC-475,Huminec,,49.15636826,13.79658508,624 +#OL/JC-476,Slabošovka ,,48.79159164,14.53642845,624 +#OL/JC-477,Tůmův vrch ,,49.19891357,15.17910576,624 +#OL/JC-478,Malý Kamýk ,,49.23569870,14.29633999,623 +#OL/JC-479,Kravský vrch ,,49.17099762,13.85505962,622 +#OL/JC-480,Kropáč ,,49.27460861,15.03519440,622 +#OL/JC-481,Boží kámen ,,49.23593903,13.78080559,621 +#OL/JC-482,Stráž ,,49.00116348,15.31227493,621 +#OL/JC-483,Holička ,,49.11009216,14.13325119,620 +#OL/JC-484,Holubí vrch ,,48.99298859,15.47232723,620 +#OL/JC-485,Holý vrch ,,49.24086380,13.78376198,620 +#OL/JC-486,Tůmův kopec ,,49.24185562,14.94009972,620 +#OL/JC-487,Tyterec,,49.21804810,13.76311874,620 +#OL/JC-488,Kovanín ,,49.48926926,14.81547356,619 +#OL/JC-489,Vrch,,48.98906326,14.18478012,619 +#OL/JC-490,Záhorská ,,49.09023285,13.95170116,619 +#OL/JC-491,Zelená hora ,,49.07946777,15.51148891,619 +#OL/JC-492,Hůrka ,,49.25019073,14.92940044,618 +#OL/JC-493,Veveří ,,48.76314926,14.80832958,617 +#OL/JC-494,Hůrka ,,49.25019073,14.92940044,618 +#OL/JC-495,Drahenický vrch ,,49.51013184,13.95501995,615 +#OL/JC-496,Fabián ,,49.03461838,14.98949242,615 +#OL/JC-497,Podlipí ,,49.06085205,14.01452160,615 +#OL/JC-498,Kamenický vrch ,,49.11504364,15.15402794,614 +#OL/JC-499,Vejřice ,,49.19836044,13.80375004,614 +#OL/JC-500,Kraví hora (Homole) ,,49.30643463,14.19683456,613 +#OL/JC-501,Křížek ,,49.19836426,13.79347992,613 +#OL/JC-502,Račí ,,49.14498901,13.92685223,613 +#OL/JC-503,Za Horou,,49.10530853,13.95176983,613 +#OL/JC-504,Kašparka ,,48.91909790,14.34032822,612 +#OL/JC-505,Hora,,49.20492935,13.81739998,611 +#OL/JC-506,Podustupky,,49.30559158,14.90821838,611 +#OL/JC-507,Chlumečský vrch ,,48.91315460,14.29705906,610 +#OL/JC-508,Němcův kopec ,,49.23777008,15.12858295,610 +#OL/JC-509,Řanda ,,49.18708801,13.81659031,610 +#OL/JC-510,Stráže ,,49.47534943,14.41604328,610 +#OL/JC-511,V Březovém háji ,,48.84056854,14.25154972,610 +#OL/JC-512,Bublavá skála ,,49.02475739,14.98741531,609 +#OL/JC-513,Bytina,,49.26403046,14.25866127,609 +#OL/JC-514,Džbán ,,49.11008072,14.12250900,609 +#OL/JC-515,Fajka,,49.13335800,15.17843056,609 +#OL/JC-516,Holý vrch ,,49.02038574,14.11905384,609 +#OL/JC-517,Maryškovský kopec ,,49.26201248,14.95590878,609 +#OL/JC-518,Hamerský vrch ,,49.03754044,15.08012295,608 +#OL/JC-519,Plec,,49.08256912,15.33283329,608 +#OL/JC-520,Třebětický vrch ,,49.05202103,15.50157261,608 +#OL/JC-521,Zběžnice ,,49.50308228,14.34101963,608 +#OL/JC-522,U Kapličky ,,49.18001175,15.17537022,607 +#OL/JC-523,Skalka,,49.16975450,13.99606400,620 +#OL/JC-524,Kostelík ,,49.25826645,15.05244350,605 +#OL/JC-525,Strážiště ,,49.32673645,14.89254475,605 +#OL/JC-526,Za Bláhovým ,,48.74095154,14.32372952,605 +#OL/JC-527,Hradiště ,,49.21990204,13.87392521,604 +#OL/JC-528,Pecivál ,,49.22253799,14.29795456,604 +#OL/JC-529,Skalice,,49.09525299,14.14085197,604 +#OL/JC-530,Šibeniční vrch ,,48.98791885,15.38479996,604 +#OL/JC-531,Jezvina,,49.15033722,14.03578663,603 +#OL/JC-532,Černý vrch ,,49.09770966,15.06937027,602 +#OL/JC-533,Neděliště ,,49.15408325,14.04493046,602 +#OL/JC-534,Ve Vrších ,,49.43944168,14.79489040,602 +#OL/JC-535,Manina,,49.17510000,13.92999000,640 +#OL/JC-536,Na Kloboučku ,,49.10268021,13.94299984,601 +#OL/JC-537,Vlkanec,,48.89660645,14.28550339,601 +#OL/JC-538,Vrchy,,49.43173981,14.78888035,601 +#OL/JC-539,Bída ,,49.05794144,15.05858040,600 +#OL/JC-540,Boreček ,,49.15582275,13.93122673,600 +#OL/JC-541,Dlouhé díly ,,49.13142014,14.02814865,600 +#OL/JC-542,Lesný ,,49.12150574,14.02154446,600 +#OL/JC-543,Mladiny,,49.24057007,13.81773090,600 +#OL/JC-544,Rojšínský vrch ,,48.91910934,14.24306011,600 +#OL/JC-545,Srní vrch ,,49.11943054,15.08683300,600 +#OL/JC-546,Větrák ,,49.51195908,14.83091545,600 +#OL/JC-547,Čtrnáctka ,,49.00132751,15.41946697,599 +#OL/JC-548,Radlina,,49.26496124,15.04288387,599 +#OL/JC-549,Strážný kopec ,,48.99872971,15.33293056,599 +#OL/JC-550,Svícny ,,49.28652954,14.22713566,599 +#OL/JC-551,Dubovec,,49.13415909,13.87049007,598 +#OL/JC-552,Vystroužek ,,49.04593658,14.11914921,598 +#OL/JC-553,Na Vršku ,,49.21688461,14.94177723,597 +#OL/JC-554,Vrchy,,49.13072968,15.15308952,597 +#OL/JC-555,Kubalov,,49.24532318,15.01692677,596 +#OL/JC-556,U Šmejdů buku ,,49.05361176,15.02212048,596 +#OL/JC-557,Ostrá ,,49.21107864,13.86204243,595 +#OL/JC-558,Sosnovec,,48.93278885,14.24981022,595 +#OL/JC-559,Blejště ,,49.18335724,13.79669952,594 +#OL/JC-560,V Hoře ,,49.46841812,14.48268032,594 +#OL/JC-561,Kometa,,49.20767212,14.31518936,593 +#OL/JC-562,Ovčárky ,,49.14552689,14.04575253,593 +#OL/JC-563,Na Kopci,,49.17993164,15.10966206,592 +#OL/JC-564,Na Opukách ,,49.15000153,13.87084961,592 +#OL/JC-565,Suchý vrch ,,48.74186325,14.50228214,591 +#OL/JC-566,V Hoře ,,49.14203644,13.93470383,591 +#OL/JC-567,Ve Vrchu,,48.87190247,14.36865997,590 +#OL/JC-568,Na Vyhlídce ,,48.97417831,15.49598122,589 +#OL/JC-569,Zádušní les ,,49.07546997,14.12300873,589 +#OL/JC-570,Hájek ,,49.10765076,14.05141258,588 +#OL/JC-571,Lejskův vrch ,,49.10270309,15.12286282,588 +#OL/JC-572,Malý Mehelník ,,49.29066849,14.22723579,588 +#OL/JC-573,Na Klenové ,,49.20500565,14.93091869,588 +#OL/JC-574,Hajná hora ,,49.04867935,14.11110973,587 +#OL/JC-575,Kotrbnice,,49.12501144,14.01917267,587 +#OL/JC-576,Němec ,,49.27512360,14.23803806,587 +#OL/JC-577,Vitanka,,49.46323776,14.42601299,587 +#OL/JC-578,Soví vrch ,,48.78805120,14.76283940,541 +#OL/JC-579,Kuřimanský vrch ,,49.20480347,13.95993423,586 +#OL/JC-580,Mádlův kopec ,,49.19140625,14.93093777,586 +#OL/JC-581,Pátek ,,49.13368988,13.88191032,586 +#OL/JC-582,Altánek ,,49.11659622,13.83405590,585 +#OL/JC-583,Kellerův kopec ,,48.90594101,14.26533985,585 +#OL/JC-584,Kůstrý vrch ,,49.25164032,13.78866386,584 +#OL/JC-585,Na Židovně ,,49.51009750,14.66969013,584 +#OL/JC-586,Sněžník ,,49.27614975,14.89584446,584 +#OL/JC-587,Žejdlíček ,,49.30429077,14.21992493,584 +#OL/JC-588,Dobrohošťský vrch ,,49.06968689,15.49364567,583 +#OL/JC-589,Hadí hora ,,49.51893997,14.83122349,583 +#OL/JC-590,Sviní vrch ,,49.11681366,14.11811447,583 +#OL/JC-591,Brabčice ,,49.10411835,14.00226974,582 +#OL/JC-592,Ratmírovský kopec ,,49.14839554,15.12451172,582 +#OL/JC-593,Horní hora ,,49.14115906,13.95621967,581 +#OL/JC-594,Hradějn ,,49.07788849,13.98745537,581 +#OL/JC-595,Ostrý vrch ,,49.17849731,13.87146187,581 +#OL/JC-596,Bradlo,,49.25402451,15.04441357,580 +#OL/JC-597,Matka,,49.27338791,14.25874043,580 +#OL/JC-598,Na Neckách ,,49.49029922,14.38526726,580 +#OL/JC-599,Lukšův kopec ,,48.98365784,15.50132370,579 +#OL/JC-600,Ostrý vrch ,,49.20653534,13.94441223,579 +#OL/JC-601,Hránová ,,49.15921783,13.96429157,578 +#OL/JC-602,Kovář ,,49.04080582,15.01630974,578 +#OL/JC-603,Otmaň ,,48.91391754,14.28023338,578 +#OL/JC-604,Sejkův vrch ,,49.13725662,15.10901928,578 +#OL/JC-605,Skalnice,,49.11632156,13.81114960,578 +#OL/JC-606,V Šejbech ,,49.16895294,15.14442730,578 +#OL/JC-607,Vrch,,49.37986755,14.84977531,578 +#OL/JC-608,Dolejší hora ,,49.10768127,13.97105980,577 +#OL/JC-609,Jedlina,,48.98001480,15.38058376,577 +#OL/JC-610,Nad Muškou ,,49.00207520,14.17275429,577 +#OL/JC-611,Trubný vrch ,,49.35546112,13.90950108,577 +#OL/JC-612,Vlažinský vrch ,,49.04531097,15.48946285,577 +#OL/JC-613,Zámek ,,49.33214188,13.83535957,577 +#OL/JC-614,Háj ,,48.93603897,14.23972034,576 +#OL/JC-615,Na Skalnici,,49.11407852,13.81651974,576 +#OL/JC-616,Na Vršku ,,48.88496017,14.31777000,576 +#OL/JC-617,Homolka,,49.52858734,14.72251892,575 +#OL/JC-618,Kvasníkovice ,,49.11692047,14.03248787,575 +#OL/JC-619,Malíkovský kopec ,,49.05015945,15.01029015,575 +#OL/JC-620,V Karhanech,,49.46755219,14.58517933,575 +#OL/JC-621,Višťák ,,49.53691864,14.29534149,575 +#OL/JC-622,Zdoba,,49.21427917,14.33695793,574 +#OL/JC-623,Chudý vrch ,,49.30814743,14.21551704,573 +#OL/JC-624,Pavlova hora,,49.24827194,13.78324986,573 +#OL/JC-625,Vlčický kopec ,,49.15209198,15.16313839,573 +#OL/JC-626,U Honzíčka ,,49.31749344,14.18289566,572 +#OL/JC-627,Větrník ,,49.01986313,15.48286724,572 +#OL/JC-628,Altánek ,,49.17207718,13.82638741,571 +#OL/JC-629,Bratružel ,,49.19264603,13.97622108,571 +#OL/JC-630,Březový vrch ,,49.30635071,13.88280010,571 +#OL/JC-631,Chlum,,49.24647141,14.28123760,571 +#OL/JC-632,Stráně ,,49.18410873,13.97914028,571 +#OL/JC-633,Velký Hrádeček ,,49.01517868,14.14409065,571 +#OL/JC-634,Kváskovická hůrka ,,49.18113327,14.01784420,570 +#OL/JC-635,Šachovna ,,49.49346542,14.61953735,570 +#OL/JC-636,Urbanečský vrch ,,49.03905869,15.41299725,570 +#OL/JC-637,Hůrky ,,49.41956711,14.83310890,568 +#OL/JC-638,Kloboučky ,,49.24179077,14.28120041,567 +#OL/JC-639,Třebiště ,,48.91303253,14.36268234,566 +#OL/JC-640,Vlčí vrch ,,48.97187805,15.40347862,566 +#OL/JC-641,Hrádek ,,49.03760910,13.98989010,565 +#OL/JC-642,Kněžská hora ,,49.49552536,13.83806038,565 +#OL/JC-643,Dubnice,,49.05923080,14.10243034,564 +#OL/JC-644,Háj ,,49.11817932,15.38361359,564 +#OL/JC-645,Šetkův vrch ,,49.51625061,14.63361835,564 +#OL/JC-646,Turkovický vrch ,,49.24833298,13.72861481,564 +#OL/JC-647,U Doktorova lomu,,49.14902115,14.53046989,564 +#OL/JC-648,Velká Kakada ,,49.24404907,13.93108177,564 +#OL/JC-649,Cizkrajovský vrch ,,49.05863190,15.34778500,562 +#OL/JC-650,Holý vrch ,,49.35929108,13.91096020,562 +#OL/JC-651,Chlum,,49.39977646,13.97886753,562 +#OL/JC-652,Obrň ,,49.33956146,13.85754108,562 +#OL/JC-653,Větrník ,,49.02069473,14.58343410,562 +#OL/JC-654,Kamenice,,49.38816452,13.95154953,561 +#OL/JC-655,Lískovec ,,49.11952209,15.05163956,561 +#OL/JC-656,Pahrbek,,49.52030563,14.76854706,561 +#OL/JC-657,V Kopcích ,,49.10449982,15.38978004,561 +#OL/JC-658,Brusenský vrch ,,49.00582886,14.18450642,560 +#OL/JC-659,Budislavská hora ,,49.29726410,14.85684872,559 +#OL/JC-660,Hůrka ,,49.12020874,13.97546959,559 +#OL/JC-661,Komora,,49.15900040,15.09875298,559 +#OL/JC-662,Křemenec ,,49.48138046,14.00172997,559 +#OL/JC-663,Bělčická hora ,,49.49240875,13.83758163,558 +#OL/JC-664,Hůrka ,,49.18075180,14.04990578,557 +#OL/JC-665,Kamenná bába ,,49.23413467,13.85030365,557 +#OL/JC-666,Ve Vrších ,,49.33844757,14.82126904,557 +#OL/JC-667,Míšná hora ,,49.35184860,13.82696342,556 +#OL/JC-668,Holubičí vrch ,,48.99213409,15.45208740,555 +#OL/JC-669,Hvozdec,,49.05580521,15.33046436,555 +#OL/JC-670,Kráseka ,,49.16708970,14.05993480,555 +#OL/JC-671,Křídlí ,,49.36777115,13.92520618,555 +#OL/JC-672,Na Brdě ,,49.51342010,14.31657982,555 +#OL/JC-673,Dlouhý kopec ,,49.21481323,15.00450325,554 +#OL/JC-674,Kozlov,,49.05773163,14.04533005,553 +#OL/JC-675,Lomec,,49.09761047,14.17829132,552 +#OL/JC-676,Tisovská hora ,,49.52008820,13.81984997,552 +#OL/JC-677,Dlouhý vrch ,,48.97843933,14.54180431,551 +#OL/JC-678,Markův kopec ,,49.08297729,15.01303768,551 +#OL/JC-679,Stehlovy,,49.53117752,14.83482933,550 +#OL/JC-680,Na Vršku ,,49.02223206,15.03972054,549 +#OL/JC-681,Chlumák ,,49.48670197,13.96236992,548 +#OL/JC-682,Metelská hora ,,49.50376129,13.77134991,548 +#OL/JC-683,Mláka ,,49.32229233,14.22167683,548 +#OL/JC-684,Čihadlo ,,49.14261627,15.06493568,546 +#OL/JC-685,Fořtmistrovka ,,49.05757523,15.00361347,546 +#OL/JC-686,Kuřidlo ,,49.27296448,13.87656689,546 +#OL/JC-687,Na Brdech,,49.48640060,14.30593014,546 +#OL/JC-688,Ranovice,,49.02220535,15.45542431,546 +#OL/JC-689,Jelení vrch ,,49.15179443,14.08216667,545 +#OL/JC-690,Jezvinec,,49.48862076,14.04319000,545 +#OL/JC-691,Málkovský vrch ,,49.45959091,13.89346027,544 +#OL/JC-692,Na Pláni ,,49.07101822,14.05811024,544 +#OL/JC-693,Kobyla,,49.46982193,13.80173302,543 +#OL/JC-694,Hradiště ,,49.40023422,13.93365002,542 +#OL/JC-695,Zvíkovec ,,49.44566345,14.34201050,542 +#OL/JC-696,Holý vrch ,,49.51998520,14.12326527,541 +#OL/JC-697,Karlovec,,49.21425629,13.94666386,541 +#OL/JC-698,Střížovický vrch ,,49.45423126,13.92872524,541 +#OL/JC-699,V Parku,,49.24916077,13.76531029,540 +#OL/JC-700,Nebřehovický vrch ,,49.24564362,13.95599937,539 +#OL/JC-701,Ostrý vrch ,,49.26408768,14.22336292,539 +#OL/JC-702,Strážiště ,,49.35297394,14.06939602,538 +#OL/JC-703,Divoš ,,49.27207947,13.75494957,537 +#OL/JC-704,Mazný ,,49.13350296,14.07120800,537 +#OL/JC-705,Vojtův vrch ,,49.12054062,15.42814636,537 +#OL/JC-706,Vrch,,49.55720901,14.74475956,537 +#OL/JC-707,Vršky ,,49.25310135,13.73695755,537 +#OL/JC-708,Hliniční vrch ,,49.46512985,13.87902451,536 +#OL/JC-709,Chlumek,,48.93210220,14.54474068,536 +#OL/JC-710,Chocholka,,49.39888382,49.39888382,535 +#OL/JC-711,Kamenný vrch ,,49.03891373,14.54781723,535 +#OL/JC-712,Kubátova hora ,,49.47806931,13.90777493,535 +#OL/JC-713,Mladšiny ,,49.39678574,14.31421757,535 +#OL/JC-714,U Nivy,,49.45401001,13.84605217,534 +#OL/JC-715,Na Skalce,,49.23786545,14.33444500,533 +#OL/JC-716,Chlum,,49.46089554,14.04924774,532 +#OL/JC-717,Beranice,,49.26851273,13.75108051,531 +#OL/JC-718,Hrnčířská skála ,,49.58842468,14.86739922,531 +#OL/JC-719,Husí hora ,,49.56630707,14.84511089,531 +#OL/JC-720,Malý Kameník ,,49.08757019,14.43539619,531 +#OL/JC-721,Pahorek,,49.40809250,13.95917511,531 +#OL/JC-722,Háj ,,49.23685074,13.83436012,530 +#OL/JC-723,Dubiny,,49.45211029,13.88290977,529 +#OL/JC-724,Dubovec,,49.30919266,13.99703026,528 +#OL/JC-725,Na Panském vrchu ,,49.44781113,14.47496033,528 +#OL/JC-726,Hladomře ,,49.46176147,14.39070225,527 +#OL/JC-727,Ryšová ,,49.27793121,13.89509964,527 +#OL/JC-728,Vysoký pahorek ,,49.42029190,13.77205276,527 +#OL/JC-729,Vávra ,,49.03602219,14.56371403,526 +#OL/JC-730,Čihadla ,,49.49042511,13.80388069,525 +#OL/JC-731,Háj ,,49.29845047,13.82697010,525 +#OL/JC-732,Sýkorka ,,49.33549118,14.17393017,525 +#OL/JC-733,Dubový vrch ,,49.33500290,14.31959152,524 +#OL/JC-734,Krahulík ,,49.51100922,14.12552547,524 +#OL/JC-735,Vlčiny ,,49.21945953,13.90282822,524 +#OL/JC-736,Chrástava ,,49.19736481,13.85774517,523 +#OL/JC-737,Strážiště ,,49.12598419,14.43221855,523 +#OL/JC-738,Ostrý ,,49.29375839,13.92912674,522 +#OL/JC-739,Václavovský kopec ,,48.98014069,15.42705154,522 +#OL/JC-740,Zelený vrch ,,49.45463943,13.88401031,522 +#OL/JC-741,Jaslov,,49.28702164,13.93202305,521 +#OL/JC-742,Štětky,,49.59654999,14.79187965,520 +#OL/JC-743,Švehlany ,,48.92684174,14.36097717,520 +#OL/JC-744,V Horách ,,49.58639908,14.78705025,520 +#OL/JC-745,Malý kopec ,,49.00758362,14.20931053,519 +#OL/JC-746,Smrtí hora ,,49.27313995,13.74199963,519 +#OL/JC-747,Hůrka ,,49.45978165,14.64005566,518 +#OL/JC-748,Jelení vrch ,,49.07767868,14.47417831,518 +#OL/JC-749,Jíva ,,49.32682037,13.83570576,518 +#OL/JC-750,Lomy,,49.40906143,14.37994003,518 +#OL/JC-751,Za Hřbitovem ,,48.95873642,15.45375347,518 +#OL/JC-752,Králův vršek ,,49.53057861,14.74390030,517 +#OL/JC-753,Ohařská hora ,,49.55087280,14.03511524,517 +#OL/JC-754,Svatonický vrch ,,49.35037613,14.19248486,517 +#OL/JC-755,Vlčí vrch ,,49.40279007,14.39138031,517 +#OL/JC-756,Háj ,,49.52235031,14.05789471,516 +#OL/JC-757,Jedlový vrch ,,49.22763824,14.33936024,516 +#OL/JC-758,Na Brejše ,,49.54050827,14.21617031,516 +#OL/JC-759,Soudný ,,49.45311356,13.98868847,516 +#OL/JC-760,Výštice ,,49.12045288,14.40574932,516 +#OL/JC-761,Hůrka ,,49.22920609,14.87001133,515 +#OL/JC-762,Borovanský vrch ,,48.88045883,14.64622021,514 +#OL/JC-763,Koška ,,49.48331833,14.27313805,514 +#OL/JC-764,Zelená hora ,,49.44723892,14.01280975,514 +#OL/JC-765,U Pomníku ,,49.47246933,14.26208973,513 +#OL/JC-766,Nad Studenou vodou,,49.31428146,14.05427456,512 +#OL/JC-767,Paračov ,,49.42856216,14.00375652,512 +#OL/JC-768,Dlouhý ,,49.01660156,14.19155216,511 +#OL/JC-769,Hradec,,49.28887177,13.92208195,511 +#OL/JC-770,Ostrý vrch ,,49.20312119,14.28823566,511 +#OL/JC-771,Tišiny ,,49.33893204,13.94279385,511 +#OL/JC-772,Holý vrch ,,49.27391052,13.89618015,510 +#OL/JC-773,Na Logrech,,49.31323242,14.17085838,510 +#OL/JC-774,Šibeník ,,49.27379990,13.90326977,510 +#OL/JC-775,Velké lesy ,,48.94996643,15.48699951,509 +#OL/JC-776,Brdo,,49.27451324,13.99806404,508 +#OL/JC-777,Vrchy,,49.57350159,14.84027004,507 +#OL/JC-778,Peklo,,49.04362488,14.17666340,506 +#OL/JC-779,U Obrázku ,,49.48738861,14.24026966,506 +#OL/JC-780,V Sedletinách ,,49.32582855,14.06715488,506 +#OL/JC-781,Tábor ,,49.31886292,14.35415936,504 +#OL/JC-782,Holý vrch ,,49.22121000,13.94745000,542 +#OL/JC-783,Hájiště ,,49.25994492,14.38362503,503 +#OL/JC-784,Rabyň ,,49.21802521,14.24391460,503 +#OL/JC-785,Čabelice ,,48.79257965,14.93813133,501 +#OL/JC-786,Přední Maršovina ,,48.93953705,14.94548798,501 +#OL/JC-787,Bába ,,48.92197610,14.40657840,500 +#OL/JC-788,Čepinec ,,49.33092880,14.34970700,500 +#OL/JC-789,Čoudkův vrch ,,49.02970070,14.92765970,500 +#OL/JC-790,Hliničná ,,49.27826000,13.88453000,500 +#OL/JC-791,Kamenný vrch ,,49.26732970,14.36538880,500 +#OL/JC-792,Olešnický vrch ,,49.09835740,14.39165620,500 +#OL/JC-793,Ostrý vrch ,,49.38693000,14.07878000,500 +#OL/JC-794,Dominový vrch ,,49.30876050,13.94057840,499 +#OL/JC-795,Na Kopci,,49.32749000,14.36142000,498 +#OL/JC-796,Opeřová ,,49.27697000,13.87384000,498 +#OL/JC-797,Výřice ,,49.22746460,13.96693080,498 +#OL/JC-798,Nuzovský vrch ,,49.24212090,14.25338340,497 +#OL/JC-799,Virotín ,,49.24399480,13.98889900,497 +#OL/JC-800,Zadní Maršovina ,,48.92867520,14.95434610,497 +#OL/JC-801,Křesovec ,,49.40843000,13.93844000,496 +#OL/JC-802,Ve Vrších ,,49.31471000,13.99689000,496 +#OL/JC-803,Hraničník ,,49.15083170,14.86516980,495 +#OL/JC-804,Libovka,,49.04344000,14.14677000,495 +#OL/JC-805,Kaplice,,49.59192000,14.74181000,494 +#OL/JC-806,Kuřinec ,,49.47069460,14.36596780,494 +#OL/JC-807,Šibenice ,,49.22145680,13.98738130,494 +#OL/JC-808,Droušný vrch ,,49.31970220,13.81495700,493 +#OL/JC-809,Katovická hora ,,49.28096160,13.81258570,493 +#OL/JC-810,Na Hořici ,,49.31164550,14.24369310,493 +#OL/JC-811,Myslínek ,,49.53722320,14.02908140,492 +#OL/JC-812,Skladiště ,,49.37390770,14.19276050,492 +#OL/JC-813,Hanslovka,,49.51223000,14.20590000,490 +#OL/JC-814,Řehnůvka ,,49.21253440,14.89465990,490 +#OL/JC-815,Chumelák ,,49.43583430,14.26346760,489 +#OL/JC-816,Jahodinská ,,49.32735000,14.41312000,489 +#OL/JC-817,Janoch,,49.16260950,14.41731540,488 +#OL/JC-818,Lipová ,,49.31703080,13.84969600,488 +#OL/JC-819,Hájek ,,49.32898530,14.03978950,487 +#OL/JC-820,Matčí hora ,,49.40597270,13.92404170,487 +#OL/JC-821,Čihátko ,,49.31991390,14.02213220,486 +#OL/JC-822,Kamenná ,,49.00214570,14.24625800,485 +#OL/JC-823,Kupcový ,,49.42629000,13.83873000,485 +#OL/JC-824,Vraní vrch ,,49.25737120,13.78621490,485 +#OL/JC-825,Panský kopec ,,49.14401720,14.88559110,484 +#OL/JC-826,Vůstří ,,49.39915000,14.03310000,484 +#OL/JC-827,Mezi vršky ,,49.28722760,13.74499710,481 +#OL/JC-828,Smíchovec ,,48.98443000,14.90998000,480 +#OL/JC-829,Vráže ,,48.98222000,14.32971000,480 +#OL/JC-830,Červený vrch ,,49.21523830,14.39395800,479 +#OL/JC-831,Chrášťanská hůrka ,,49.28646140,14.39022520,479 +#OL/JC-832,Hradišťský vrch ,,49.30494960,14.12114420,478 +#OL/JC-833,Hradec,,49.50126000,14.05002000,477 +#OL/JC-834,Na Homoli,,49.58207750,14.76670560,477 +#OL/JC-835,Stříbrný ,,49.06222840,14.16157200,477 +#OL/JC-836,Dubový vrch ,,49.27666260,14.41575300,476 +#OL/JC-837,Krčohrad ,,49.25589400,13.77580650,474 +#OL/JC-838,U Královské louky ,,49.03439360,14.95851810,474 +#OL/JC-839,V Lomcích ,,49.06310940,14.96462700,474 +#OL/JC-840,Žižkův vrch ,,49.32202760,14.01680610,470 +#OL/JC-841,Přední Pecky ,,49.28062110,14.18933450,469 +#OL/JC-842,Babina,,49.29359370,14.41973390,467 +#OL/JC-843,Na Jezvinách ,,49.40028000,14.08217000,466 +#OL/JC-844,Radčický vrch ,,49.16510140,14.17651690,466 +#OL/JC-845,U Malovce,,49.27198110,14.79280590,466 +#OL/JC-846,Hřeben ,,49.14682790,14.42737340,463 +#OL/JC-847,Na Zámku ,,49.26938290,14.16741440,463 +#OL/JC-848,Kanín ,,49.06268380,14.46875140,461 +#OL/JC-849,Zlatá hora ,,49.23803550,14.11321030,461 +#OL/JC-850,Pahorek,,49.49155090,14.08477770,456 +#OL/JC-851,Jalovcový vrch ,,49.03424470,14.51480480,454 +#OL/JC-852,Kaliště ,,49.32133390,13.78497360,454 +#OL/JC-853,Blyštice ,,49.15324000,14.12720000,453 +#OL/JC-854,Plechový ,,49.48829000,14.16070000,452 +#OL/JC-855,Nad Zeleným křížem ,,49.18342520,14.23538470,451 +#OL/JC-856,Zbuš ,,49.29254430,13.94576710,449 +#OL/JC-857,Baba,,49.07505420,14.45175020,446 +#OL/JC-858,Varta,,49.44314520,14.20475720,446 +#OL/JC-859,Hromový vrch ,,49.45224460,14.13893390,445 +#OL/JC-860,Na Hájcích ,,49.27202270,13.94444490,442 +#OL/JC-861,Zubovský vrch ,,49.25253000,14.13614680,442 +#OL/JC-862,Skovka,,49.30018990,13.80001910,440 +#OL/JC-863,Libouš ,,49.27379310,14.72945000,438 +#OL/JC-864,Polanka,,49.21740250,14.13489160,437 +#OL/JC-865,U Hrádku ,,49.11637240,14.45403570,437 +#OL/JC-866,Vazová ,,49.13138110,14.31328020,436 +#OL/JC-867,Kraví hora ,,49.14382950,14.23303240,435 +#OL/JC-868,Banina,,49.27801000,13.85300000,434 +#OL/JC-869,Čihadlo ,,49.25829720,14.32086640,433 +#OL/JC-870,Holý vrch ,,49.22987790,14.35971520,428 +#OL/JC-871,Kopanina,,49.24987980,14.42755650,428 +#OL/JC-872,Na Dobevském vršku ,,49.29172890,14.03358200,427 +#OL/JC-873,Doubí ,,48.97396270,14.29620490,496 +#OL/JC-874,Na Vrchu,,49.27259940,13.97654660,417 +#OL/JC-875,Na Honzíkově ,,49.23652630,14.21280540,413 +#OL/JC-876,Na Skalkách ,,49.41399000,14.13277000,413 +#OL/JC-877,Na Býkovci ,,49.27468750,13.96858450,407 +#OL/JC-878,Klokočínský hájek ,,49.22721110,14.19254360,391 +#OL/JC-879,Korunáček ,,48.87019800,13.95586990,994 +#OL/JC-880,Turnberg,,48.67276440,14.28681300,824 +#OL/JC-881,Třešňovický kopec ,,48.69342000,14.37760000,796 +#OL/JC-882,Buková skála ,,49.17740000,13.71146000,766 +#OL/JC-883,Šus ,,48.60073510,14.43319250,742 +#OL/JC-884,Kalvárie ,,48.61352190,14.40700010,707 +#OL/JC-885,Hlásný kopec ,,48.64249180,14.33487520,701 +#OL/JC-886,Kozí hůra ,,48.80005160,14.35093310,691 +#OL/JC-887,Dubový vrch ,,48.79486260,14.29457430,681 +#OL/JC-888,Horní brána ,,48.80378130,14.33296280,672 +#OL/JC-889,Křížová hora ,,48.80292240,14.32296470,643 +#OL/JC-890,Vondračka ,,49.47367600,14.56790060,617 +#OL/JC-891,Nad Mlýnem ,,48.82386250,14.28239620,615 +#OL/JC-892,Hrůzův kopec ,,49.20779410,15.15991700,612 +#OL/JC-893,Ptačí hrádek ,,48.81218060,14.30206810,592 +#OL/JM-001,Stolová hora ,,48.84050420,16.63753830,459 +#OL/JM-002,Svatý kopeček ,,48.80633610,16.64636780,363 +#OL/JM-003,Čupec (Čapec) ,,48.84690000,17.62080000,819 +#OL/JM-004,Babylon,,49.44309110,16.46454070,657 +#OL/JM-005,Mojetín ,,49.53067390,16.71734300,607 +#OL/JM-006,Milenka,,49.51751260,16.51869800,579 +#OL/JM-007,Jedle,,49.38734000,16.59922000,562 +#OL/JM-008,Mramorka,,49.51276000,16.50355000,556 +#OL/JM-009,Květnice ,,49.35907640,16.41448950,470 +#OL/JM-010,Křivoš ,,49.37305340,16.37135940,464 +#OL/JM-011,Velká Skála ,,49.35451000,16.41863000,446 +#OL/JM-012,Bučín ,,49.16399000,16.41331000,444 +#OL/JM-013,Čebínka ,,49.31990220,16.48466930,429 +#OL/JM-014,Rozhledna Klucanina,,49.34680690,16.44068320,401 +#OL/JM-015,Spálená hora ,,49.41259190,16.67708280,529 +#OL/JM-016,Alexandrova rozhledna,,49.29795640,16.67270720,497 +#OL/JM-017,Brusná ,,49.42727420,16.71528830,607 +#OL/JM-018,Chobot,,49.36639750,16.72489780,496 +#OL/JM-019,Blansek - zřícenina hradu ,,49.31216330,16.65501940,472 +#OL/JM-021,Starý hrad ,,49.32587920,16.63911530,402 +#OL/JM-022,Čertův hrádek ,,49.33720360,16.65182580,373 +#OL/JM-023,Habří ,,49.49523940,16.63169420,451 +#OL/JM-024,Bukovice,,49.40488220,16.59153300,501 +#OL/JM-025,Strážka,,49.41885440,16.65480650,422 +#OL/JM-026,Velký Chlum,,49.44223270,16.58882390,464 +#OL/JM-027,Zámecký vrch,,49.41754960,16.58091200,377 +#OL/JM-028,Velká hora,,49.40295700,16.45644060,558 +#OL/JM-029,Pokojná,,49.33617160,16.69421010,502 +#OL/JM-030,Kněží hora,,49.40866850,16.70453470,585 +#OL/JM-031,Paprč,,49.52870440,16.77393510,721 +#OL/JM-032,Holíkov,,49.46336090,16.70212560,667 +#OL/JM-033,Trhůvka,,49.42246930,16.68355580,564 +#OL/JM-034,Babí hora,,49.45701690,16.74868650,642 +#OL/JM-035,Babí lom rozhledna,,49.30510000,16.57629000,526 +#OL/JM-036,Chocholík rozhledna ,,49.27981260,16.93747070,366 +#OL/JM-037,Simonův vrch,,49.39535000,16.75857000,512 +#OL/JM-038,Zelenkův kopec,,49.57068720,16.45614220,666 +#OL/JM-039,Strážná,,49.35467090,16.74232770,538 +#OL/JM-040,Stránská skala,,49.19042020,16.67583040,310 +#OL/JM-041,Hády ,,49.22211710,16.67366110,424 +#OL/JM-042,Starý hustopečský vrch ,,48.98108650,16.82154830,368 +#OL/JM-044,Hlinský kopec ,,49.11640680,16.42643260,450 +#OL/JM-045,Vinohrad,,49.15654530,16.93232740,336 +#OL/JM-046,Zněcko ,,49.48613890,16.45200330,699 +#OL/KA-001,Černá skála ,,50.38047000,12.97476000,1130 +#OL/KA-002,Nad Ryžovnou ,,50.40300620,12.84304290,1054 +#OL/KA-003,Na Skalách ,,50.38634130,12.99337220,1037 +#OL/KA-004,Hubertky,,50.42227000,12.90502000,1031 +#OL/KA-005,Křížová hora ,,50.38862910,13.02614010,1024 +#OL/KA-006,Tetřeví hora ,,50.42207330,12.85073660,1004 +#OL/KA-007,Dub,,50.38791560,12.92723970,1001 +#OL/KA-008,Perninský vrch ,,50.36292000,12.76252000,1000 +#OL/KA-009,Smrčina ,,50.38958020,12.79097680,1000 +#OL/KA-010,Hřeben ,,50.37555313,12.89604759,968 +#OL/KA-011,Komáří vrch ,,50.43262482,12.82220745,965 +#OL/KA-012,Dračí skála ,,50.34939957,12.78564548,953 +#OL/KA-013,Trousnice,,50.32829666,12.80371284,952 +#OL/KA-014,Rolavský vrch ,,50.38600540,12.62423515,950 +#OL/KA-015,Trousnická skála ,,50.33330154,12.79066563,949 +#OL/KA-016,Čupřina ,,50.41777039,12.78628635,948 +#OL/KA-017,Vlčí hora ,,50.38681793,12.74450970,946 +#OL/KA-018,Smrčina ,,50.37746048,12.59360409,945 +#OL/KA-019,Milíře ,,50.38855743,12.60486031,941 +#OL/KA-020,Nad Starou šachtou ,,50.43707657,12.86636543,936 +#OL/KA-021,Hraniční vrch ,,50.44816208,12.84753990,936 +#OL/KA-022,Jelení hora ,,50.39507675,12.76224136,935 +#OL/KA-023,Kameniště ,,50.35215378,12.63334846,928 +#OL/KA-024,Borový vrch ,,50.36833572,12.73762417,926 +#OL/KA-025,Strmý vrch ,,50.34156799,12.64714336,925 +#OL/KA-026,Rudenský Špičák ,,50.35142899,12.66150093,923 +#OL/KA-027,Díže ,,50.34104538,12.67123127,919 +#OL/KA-028,Skalisko ,,50.36986160,12.64428043,913 +#OL/KA-029,Na Strašidlech ,,50.40169144,12.75089645,913 +#OL/KA-030,Hlaváč,,50.36480331,12.95895767,908 +#OL/KA-031,Stráž ,,50.33652115,12.66448212,907 +#OL/KA-032,Vlčí hřbet ,,50.35138321,12.89250565,902 +#OL/KA-033,Javorník ,,50.33177567,12.66471481,900 +#OL/KA-034,Popovská hora ,,50.35021973,12.90976334,900 +#OL/KA-035,Ovčák ,,50.04100037,12.59862995,898 +#OL/KA-036,Vyhlídka ,,50.38898087,12.54912376,874 +#OL/KA-037,Kružný ,,50.02936554,12.59273148,863 +#OL/KA-038,V Boru,,50.04070282,12.75250721,860 +#OL/KA-039,Komora,,50.32383728,12.78863144,854 +#OL/KA-040,Rudná ,,50.43488312,12.75180244,852 +#OL/KA-041,Vysoká jedle ,,50.33617783,12.75657845,851 +#OL/KA-042,Havraní vrch ,,50.35705948,12.69114399,841 +#OL/KA-043,Stráž ,,50.37229919,12.92724514,840 +#OL/KA-044,Dvorský vrch ,,50.36642075,12.71701527,839 +#OL/KA-045,Kupa,,50.36846161,13.00818920,835 +#OL/KA-046,Sklenný vrch ,,50.09075546,12.71034622,831 +#OL/KA-047,Špičák ,,50.11507416,12.76178360,828 +#OL/KA-048,Křovitá stráň ,,50.35961151,12.71104240,828 +#OL/KA-049,Ptačí hora ,,50.33246613,12.61712646,827 +#OL/KA-050,Zámecký vrch ,,50.01531982,12.63062286,824 +#OL/KA-051,Malý Špičák ,,50.11855316,12.76688194,824 +#OL/KA-052,Šibeník ,,50.11198044,12.76931381,819 +#OL/KA-053,Sklenský vrch ,,50.32034683,12.54310322,816 +#OL/KA-054,Světlina ,,50.32765198,12.76979542,815 +#OL/KA-055,Branišovský vrch ,,50.00197601,12.99524498,813 +#OL/KA-056,Holina,,50.00615311,12.65050220,805 +#OL/KA-057,Olověný vrch ,,50.36782074,12.51184940,802 +#OL/KA-058,Kamenná hora ,,50.04597092,12.58150768,794 +#OL/KA-059,Komáří vrch,,50.11286163,12.74051380,791 +#OL/KA-060,Chloumecký kopec ,,50.11452484,12.93806362,787 +#OL/KA-061,Stolec,,50.11358643,12.69314289,785 +#OL/KA-062,Nejdecký Špičák ,,50.32848358,12.69444084,784 +#OL/KA-063,Homole,,50.02405930,12.60059166,783 +#OL/KA-064,Krásenský vrch (Na Vyhlídce) ,,50.30114365,12.40781212,774 +#OL/KA-066,Pekelská skála ,,50.36240768,13.05433750,774 +#OL/KA-067,Uhelný vrch ,,50.14379120,12.91283989,772 +#OL/KA-068,Hanušovský kopec ,,50.35035706,12.97633362,756 +#OL/KA-069,Popovský kříž ,,50.33842087,12.92377377,752 +#OL/KA-070,Spálený vrch ,,50.15620041,12.72301388,744 +#OL/KA-071,Sněženský vrch ,,50.31490707,12.49730682,742 +#OL/KA-072,Kozí díl ,,50.32257843,12.75676918,741 +#OL/KA-073,Spálený ,,50.02377701,12.83126163,736 +#OL/KA-074,Skřivánčí vrch ,,50.22103119,12.21441269,736 +#OL/KA-075,Nad Matysem ,,50.31370926,12.79719257,736 +#OL/KA-076,Žilnatý vrch ,,50.33761215,12.72311878,731 +#OL/KA-077,Roháč ,,50.17075729,13.03121090,728 +#OL/KA-078,Skalka,,50.04501343,12.81633663,720 +#OL/KA-079,Jesínecký vrch ,,50.10929871,13.05644703,718 +#OL/KA-080,Dančí vrch ,,50.29598236,12.64894390,718 +#OL/KA-081,Andělská hora ,,50.20571518,12.96351147,717 +#OL/KA-082,Hradiště ,,50.33832550,12.51552773,715 +#OL/KA-083,Za Starým dvorem ,,50.08697510,12.81666660,714 +#OL/KA-084,Zámecký vrch ,,50.14163208,13.03655052,714 +#OL/KA-085,Homolka,,50.06668472,13.05973530,713 +#OL/KA-086,Záhořský vrch ,,50.15341568,13.14033508,710 +#OL/KA-087,Zelenáč ,,50.17226791,12.79104424,707 +#OL/KA-088,U Lomu,,50.25508118,12.17010975,707 +#OL/KA-089,Větrník ,,50.29416275,12.63375664,706 +#OL/KA-090,Rozhled,,50.32229233,12.86760521,706 +#OL/KA-091,Nejdecký vrch ,,50.33126450,12.72971725,698 +#OL/KA-092,Srnčí vrch ,,50.24621582,12.60807800,696 +#OL/KA-093,Travný vrch ,,50.21501160,12.95201302,694 +#OL/KA-094,Dlouhý vrch ,,50.10302734,13.13915443,691 +#OL/KA-095,Křížový vrch ,,50.32577515,12.73964596,689 +#OL/KA-096,Vašíček ,,50.10369873,12.63107395,684 +#OL/KA-097,Chlebský vršek ,,49.99224091,12.56054020,679 +#OL/KA-098,Havran,,50.27230072,12.67368984,679 +#OL/KA-099,Kočičí vrch ,,50.09410858,12.82495594,678 +#OL/KA-100,Za Studencem,,50.26645660,12.53678417,677 +#OL/KA-101,Hřebenky ,,50.16712952,12.83161259,675 +#OL/KA-102,Goethův vrch ,,50.17842484,12.25656414,670 +#OL/KA-103,Šibeniční vrch ,,50.23632431,12.54787540,666 +#OL/KA-104,Zelená hora ,,50.07917786,12.80762768,665 +#OL/KA-105,Březový vrch ,,50.30423355,12.80965233,663 +#OL/KA-106,Březnice ,,50.22748566,12.51804066,662 +#OL/KA-107,Šibeniční vrch ,,50.32812881,12.51999378,659 +#OL/KA-108,Kamenitý vrch ,,50.27896118,12.53602695,650 +#OL/KA-109,Šemnická skála ,,50.22949219,12.96945286,645 +#OL/KA-110,Jelení vrch ,,50.18293762,12.82652569,644 +#OL/KA-111,U Bošířanské cesty ,,50.15096283,12.80602551,643 +#OL/KA-112,Mechový vrch ,,50.01005936,12.50670624,642 +#OL/KA-113,Anenská výšina ,,50.28962708,12.54693222,639 +#OL/KA-114,Zelená hora ,,50.07077789,12.30632210,637 +#OL/KA-115,Zlatník ,,50.29843140,12.53457069,637 +#OL/KA-116,Nebeská skála (Nebesa) ,,50.34857941,13.04500675,635 +#OL/KA-117,Kamenný vrch ,,50.22128296,12.97327805,628 +#OL/KA-118,Jelení vrch ,,50.15818024,12.22535038,627 +#OL/KA-119,U Vlčího dvora ,,50.14994812,12.78300190,624 +#OL/KA-120,Zámecký vrch ,,50.18811798,12.86921692,624 +#OL/KA-121,Na Kopci,,49.99569321,12.44329071,622 +#OL/KA-122,Kozí vrch ,,50.15534592,12.76427174,620 +#OL/KA-123,U Lovčí komory ,,50.18305969,12.77586555,618 +#OL/KA-124,Špičák ,,50.37854004,13.08979797,618 +#OL/KA-125,U Křížku ,,50.16207123,12.85749340,610 +#OL/KA-126,Smolnice,,50.28950882,12.13605309,607 +#OL/KA-127,Mezný vrch ,,50.13296890,12.20341015,606 +#OL/KA-128,Lněný vrch ,,50.17040253,12.76144028,605 +#OL/KA-129,Lužský vrch ,,50.18824005,12.35071564,605 +#OL/KA-130,Doubrava,,50.10514832,13.11020660,602 +#OL/KA-131,Letná ,,50.12476730,12.61962414,600 +#OL/KA-132,Bečovský kopec ,,50.14260864,12.85970688,596 +#OL/KA-133,Lapák ,,50.10137177,13.11673260,593 +#OL/KA-134,Jezerský vrch ,,50.12177277,13.26691246,589 +#OL/KA-135,Vysoký hřbet ,,50.19776917,12.82697296,587 +#OL/KA-136,Bučina ,,50.25564575,13.00470543,582 +#OL/KA-137,Obteč ,,50.19510269,12.84984970,576 +#OL/KA-138,Kameniště ,,50.34473419,12.99242783,575 +#OL/KA-139,Dubový vrch ,,50.34378815,13.03384686,570 +#OL/KA-140,Červený vrch ,,50.18209076,12.85065842,568 +#OL/KA-141,Loketský vrch ,,50.19063187,12.77304745,564 +#OL/KA-142,Kamenný vrch ,,50.18584824,12.36261654,562 +#OL/KA-143,Výšina přátelství ,,50.21917343,12.87131023,556 +#OL/KA-144,Táhlý vrch ,,50.32800293,12.99864101,556 +#OL/KA-145,Skaliska,,50.03673935,12.54632950,546 +#OL/KA-146,Kostelní vrch ,,50.01015472,12.41569042,544 +#OL/KA-147,Vyhlídka ,,50.10327911,13.26690865,541 +#OL/KA-148,Jižní vrch ,,50.21624756,12.88063622,514 +#OL/KA-149,Lysý vrch ,,50.25987244,12.94582367,512 +#OL/KA-150,Komorní hůrka ,,50.10112381,12.33650684,503 +#OL/KA-151,Zřícenina ,,50.29138184,12.96154022,499 +#OL/KA-152,Nad Rybníkem ,,50.28467560,12.97721195,485 +#OL/KA-153,Podhorní vrch ,,49.97299957,12.77000046,847 +#OL/KA-154,Třebouňský vrch ,,50.01399994,13.00300026,824 +#OL/KA-155,Háj ,,50.23400116,12.20199966,757 +#OL/KA-156,Velflík ,,50.33676040,12.81366570,977 +#OL/KA-157,Tokaniště ,,50.41617690,12.82915580,971 +#OL/KA-158,Liščí hora ,,50.37397000,12.75575000,994 +#OL/KA-159,Korec,,50.40181970,12.69493600,981 +#OL/KA-160,Lesík ,,50.38784000,12.80243000,976 +#OL/KA-161,Bučina ,,50.41016890,12.68056770,973 +#OL/KA-162,Jelení vrch ,,50.36329540,12.59072080,960 +#OL/KA-163,Jelen,,50.39658450,12.52767970,959 +#OL/KA-164,Jelení ,,50.36250000,12.85445000,954 +#OL/KA-165,Jelení hora ,,50.36131000,12.58154000,954 +#OL/KA-166,Přední Ostružník ,,50.39302230,12.56861420,948 +#OL/KA-167,Sněžná hůrka ,,50.40898590,12.79356490,948 +#OL/KA-168,Vysoký vrch ,,50.39589810,12.58749180,946 +#OL/KA-169,Vítov ,,50.38881340,12.57209370,943 +#OL/KA-170,Hadí hora ,,50.38546320,12.93499960,941 +#OL/KA-171,U Štoly ,,50.39098540,12.68927080,941 +#OL/KA-172,Plochá hora ,,50.40436070,12.63513900,939 +#OL/KA-173,Liščí hůrka ,,50.40281780,12.66561470,934 +#OL/KA-174,Rudenské návrší ,,50.35815380,12.63822410,934 +#OL/KA-175,Jelení vrch ,,50.38813070,12.67601580,931 +#OL/KA-176,Vlčí hora ,,50.37428280,12.62459560,929 +#OL/KA-177,Šance ,,50.37854430,12.91622680,927 +#OL/KA-178,Borový vrch ,,50.36833410,12.73762390,925 +#OL/KA-179,Tři skalky ,,50.38699960,12.51267420,916 +#OL/KA-180,Skalnatý vrch ,,50.34114000,12.67932000,905 +#OL/KA-181,Bukový vrch ,,50.35597860,12.55734780,904 +#OL/KA-182,Bukovec,,50.37901920,12.57000570,901 +#OL/KA-183,Chaloupecký vrch ,,50.36717190,12.66072710,900 +#OL/KA-184,Vršina ,,50.34063240,12.62942360,900 +#OL/KA-185,Čihadlo ,,50.37686860,12.71043670,897 +#OL/KA-186,V Jedlinách ,,50.38192180,12.64638410,893 +#OL/KA-187,Skaliny,,50.38435050,12.55999790,890 +#OL/KA-188,Valy,,50.01608280,12.63449380,886 +#OL/KA-189,Vysoký vrch ,,50.36991780,12.68646930,883 +#OL/KA-190,Vlčinec ,,50.03685120,12.66503650,871 +#OL/KA-191,Obora,,50.38831760,13.05462780,865 +#OL/KA-192,Lesnatec,,50.34114730,12.58453320,860 +#OL/KA-193,Obora,,50.02504160,12.61338880,857 +#OL/KA-194,Šišák ,,50.37127950,12.54924840,855 +#OL/KA-195,Na Rozcestí ,,50.04878500,12.67339780,853 +#OL/KA-196,Králův kámen ,,50.01510630,12.69138610,852 +#OL/KA-197,Prostřední vrch ,,50.34434780,12.75866760,851 +#OL/KA-198,Ztracená ,,50.06288050,12.67115070,849 +#OL/KA-199,Červená Bystřice ,,50.35165960,12.81770480,846 +#OL/KA-200,U Louky,,50.07379380,12.71149000,846 +#OL/KA-201,Hvězdice ,,50.03774710,12.67560750,844 +#OL/KA-202,Oldřichovský vrch ,,50.33435930,12.77060510,843 +#OL/KA-203,Jedlovec,,50.33757610,12.69208890,833 +#OL/KA-204,Oslí vrch ,,50.37235140,12.53867280,824 +#OL/KA-205,Nad Mlýnem ,,50.38095180,12.52517300,817 +#OL/KA-206,Dolina,,50.41912930,12.74838130,811 +#OL/KA-207,Jelínek ,,50.38127820,12.53545330,809 +#OL/KA-208,Lobezský vrch ,,50.13460700,12.70814140,805 +#OL/KA-209,Nad Krásným Lesem ,,50.35780730,12.99108900,802 +#OL/KA-210,Zelený močál ,,50.14316910,12.71904160,797 +#OL/KA-211,Žitný ,,50.06663150,12.62719990,793 +#OL/KA-212,Bernovská hora ,,50.32852000,12.68053000,790 +#OL/KA-213,Liščí vrch ,,50.29736620,12.42891290,786 +#OL/KA-214,Vřesovec ,,50.32917400,12.63212990,784 +#OL/KA-215,Kuželový vrch ,,50.32095050,12.41831100,783 +#OL/KA-216,Říjiště ,,50.08787000,12.65740000,783 +#OL/KA-217,Na Pastvinách ,,50.37284000,13.04980000,780 +#OL/KA-218,Prachometský kopec ,,50.00749000,12.95471000,780 +#OL/KA-219,Zlatý vrch ,,50.14028230,12.68950710,777 +#OL/KA-220,Hraniční vrch ,,50.34572590,12.44856750,775 +#OL/KA-221,Kosina,,50.32583490,12.57834070,770 +#OL/KA-222,Kužel ,,50.30799000,12.40278000,769 +#OL/KA-223,Rakušák ,,50.37441000,12.48903000,768 +#OL/KA-224,Stříbrný vrch ,,50.36632010,12.53251600,768 +#OL/KA-225,Na Nových ,,50.33733770,12.46644470,767 +#OL/KA-226,Mlžný vrch ,,50.33589880,12.44673310,759 +#OL/KA-227,Vřesový vrch ,,50.30011840,12.45258240,757 +#OL/KA-228,Smolný vrch ,,50.31882000,12.77369000,754 +#OL/KA-229,Lysina,,50.13105220,12.95302540,753 +#OL/KA-230,Vršina ,,50.36387300,12.49214360,752 +#OL/KA-231,Kamenný vrch ,,50.28798760,12.43436070,751 +#OL/KA-232,Oldřišský vrch ,,50.34225000,12.88273000,749 +#OL/KA-233,Milhostovský kopec ,,49.96502660,12.75120970,748 +#OL/KA-234,Záhoř ,,50.20579000,12.26946000,744 +#OL/KA-235,Pasecký vrch ,,50.14115130,12.66819060,743 +#OL/KA-236,Limnický vrch ,,50.33328790,12.74120060,742 +#OL/KA-237,Tisovský vrch ,,50.03710050,12.84719720,740 +#OL/KA-238,U Odolenovických hranic ,,50.08468750,12.89740550,739 +#OL/KA-239,Stráž ,,49.98800200,12.54122130,738 +#OL/KA-240,Střední vrch ,,49.98600930,12.52619940,738 +#OL/KA-241,Hraniční vrch ,,49.93231000,12.50282000,734 +#OL/KA-242,U Vápenky ,,50.21183000,12.26468000,733 +#OL/KA-243,Špičák ,,50.25590040,12.61365410,730 +#OL/KA-244,Vysočanský les ,,49.94108350,12.77933720,730 +#OL/KA-245,Kameník ,,50.13515510,12.88881230,724 +#OL/KA-246,Liščí vrch ,,50.28283960,12.42610220,723 +#OL/KA-247,Jedlovník ,,50.27431000,12.63076000,720 +#OL/KA-248,Jelení vrch ,,50.25317380,12.50110520,720 +#OL/KA-249,Bučka ,,50.12321410,12.97384230,718 +#OL/KA-250,Mezicestí ,,50.10556510,12.88603000,718 +#OL/KA-251,Nad Lípou ,,50.34793000,12.87070000,717 +#OL/KA-252,Široký ,,50.32655260,12.47016600,716 +#OL/KA-253,Lysý vrch ,,50.04769860,12.84052080,714 +#OL/KA-254,Besídka ,,50.10444080,12.86980040,713 +#OL/KA-255,Bílá skála ,,50.26650000,12.65281000,711 +#OL/KA-256,Na Kupě ,,50.16057860,13.07643450,711 +#OL/KA-257,Svárov ,,50.12874050,12.74664990,711 +#OL/KA-258,Kozí hřbety ,,50.24804390,12.59384650,708 +#OL/KA-259,Milešovský vrch ,,50.11085000,12.82750000,708 +#OL/KA-260,Psí skála ,,50.08672560,12.85347420,708 +#OL/KA-261,Výhledy ,,50.15101420,12.93033470,708 +#OL/KA-262,Liščí hora ,,50.14836000,12.98695000,706 +#OL/KA-263,Hřebínek ,,49.95642840,12.55827930,703 +#OL/KA-264,Království ,,50.31049930,12.81385940,703 +#OL/KA-265,Ptačinec ,,50.30743440,12.50118260,703 +#OL/KA-266,U Vitriolky,,50.07877000,12.88374000,703 +#OL/KA-267,Stránisko ,,50.15935450,12.81986700,702 +#OL/KA-268,Bezinky,,50.30718070,12.70153880,701 +#OL/KA-269,Pařez ,,50.14654640,12.68606960,701 +#OL/KA-270,Hlinitý ,,50.30795460,12.47531100,700 +#OL/KA-271,Nad Jilmovým potokem ,,49.95211070,12.75964660,700 +#OL/KA-272,Na Srázu (Javořík) ,,50.05636270,12.57260150,698 +#OL/KA-273,Kozel,,50.15019930,13.01133790,697 +#OL/KA-274,Studánecký vrch ,,50.26859280,12.19614260,697 +#OL/KA-275,Holina,,49.93354460,12.75593680,695 +#OL/KA-276,Dřevařský vrch ,,50.11160800,12.85846020,694 +#OL/KA-277,Nad Zastávkou ,,50.03903470,12.83320010,692 +#OL/KA-278,Vršek ,,50.24457480,12.59312350,692 +#OL/KA-279,Dražovský vrch ,,50.14918720,12.88091510,689 +#OL/KA-280,Křovina ,,50.28697000,12.69847000,684 +#OL/KA-281,Hlavákovský vrch ,,50.16418530,13.21205750,683 +#OL/KA-282,Smrkovec,,50.25833720,12.12692260,682 +#OL/KA-283,Strážiště ,,50.25083530,12.44488710,680 +#OL/KA-284,Mlýnský vrch ,,50.29255000,12.48837080,677 +#OL/KA-285,Pastviny,,50.14025030,13.07859360,677 +#OL/KA-286,U Dráhy ,,50.00425840,12.82449260,676 +#OL/KA-287,Nad Hájovnou ,,50.24932120,12.48099350,675 +#OL/KA-288,Zbraslavský vrch ,,50.02550110,13.13746130,674 +#OL/KA-289,Na Kopci,,50.27726000,12.44886000,673 +#OL/KA-290,Lipovka,,50.00319230,12.53218380,671 +#OL/KA-291,Maroltovský les ,,50.34484180,12.96138810,671 +#OL/KA-292,Osek,,50.30803970,12.80172480,671 +#OL/KA-293,Svár ,,50.27899850,12.70649020,670 +#OL/KA-294,Lužecký vrch ,,50.30931930,12.80469960,668 +#OL/KA-295,Vyhlídka ,,50.24816000,12.23689000,668 +#OL/KA-296,Boučský vrch ,,50.23920270,12.57831690,667 +#OL/KA-297,Hůrka ,,50.09908000,13.06181000,665 +#OL/KA-298,Na Hoře ,,50.04125650,13.05394520,665 +#OL/KA-299,Březová ,,50.27321490,12.56720140,664 +#OL/KA-300,Holý vrch ,,50.25415750,12.64460650,664 +#OL/KA-301,Na Tabuli,,50.14319000,13.15929000,662 +#OL/KA-302,Nad Osvinovem,,50.35751000,13.02531000,662 +#OL/KA-303,Ovčí vrch ,,50.25409500,12.63091660,662 +#OL/KA-304,Za Valihorou,,50.20870000,12.23442000,662 +#OL/KA-305,Havraní vrch ,,50.12185180,13.11066840,661 +#OL/KA-306,Hornosušský vrch ,,50.31236000,12.73652000,660 +#OL/KA-307,Kraví vrch ,,50.33059000,12.87280000,660 +#OL/KA-308,Nad Ovčínem ,,50.08095400,12.95627860,660 +#OL/KA-309,Jilmový vrch ,,49.94324900,12.75910990,659 +#OL/KA-310,Roh,,50.28577000,12.66593000,659 +#OL/KA-311,Koule,,50.18171180,12.78825540,658 +#OL/KA-312,Fojtovský vrch ,,50.29974820,12.77065120,657 +#OL/KA-313,Dolnosušský vrch ,,50.30469000,12.74727000,654 +#OL/KA-314,Březový vrch ,,50.28269000,12.55942000,651 +#OL/KA-315,Čerťák ,,50.09082000,13.07209000,651 +#OL/KA-316,Bukový vrch ,,50.20436780,12.32750950,650 +#OL/KA-317,Na Oldříši ,,50.32781000,12.88208000,649 +#OL/KA-318,Panská rozhledna ,,49.93519830,12.63835360,649 +#OL/KA-319,Třístová ,,50.28048150,12.38815880,648 +#OL/KA-320,Libocký vrch ,,50.25764240,12.45995690,647 +#OL/KA-321,Kopaninský vrch ,,50.26753220,12.21787410,646 +#OL/KA-322,Skalka,,50.32385000,12.49990000,646 +#OL/KA-323,Nad Nádražím ,,50.07399340,12.83436390,644 +#OL/KA-324,U Lesa,,50.30178560,12.50956800,642 +#OL/KA-325,Květný vrch ,,50.16249580,12.71016810,640 +#OL/KA-326,Na Kopaninách ,,50.26782230,12.44016040,640 +#OL/KA-327,U Chaty,,50.30279000,12.57210000,640 +#OL/KA-328,V Březí ,,50.13989000,12.84205000,640 +#OL/KA-329,Vysoká paseka ,,50.23099410,12.50540640,640 +#OL/KA-330,Spálený vrch ,,50.22509660,12.49219760,638 +#OL/KA-331,Černý kopec ,,50.32553710,12.49303880,637 +#OL/KA-332,Vraní vrch ,,50.09845000,13.08857000,636 +#OL/KA-333,Ptačí vrch ,,50.29415910,12.55366400,635 +#OL/KA-334,Mlyňanský vrch ,,50.08091570,13.11116010,634 +#OL/KA-335,Jezevčí vrch ,,49.90544240,12.59445030,633 +#OL/KA-336,Mašličky ,,50.09082000,13.04425000,631 +#OL/KA-337,Nevděk ,,50.08336020,13.16641860,630 +#OL/KA-338,Šibeniční vrch ,,50.07836740,12.84512540,629 +#OL/KA-339,Bučina ,,50.18294620,12.80781030,627 +#OL/KA-340,U Rybníčku ,,50.21419640,12.48065760,627 +#OL/KA-341,Ptačí vrch ,,50.06911250,13.11989690,626 +#OL/KA-342,Na Hvězdě ,,49.98468510,12.65645910,620 +#OL/KA-343,Rájecký Špičák ,,50.27976000,12.72918000,618 +#OL/KA-344,Liščí kopec ,,50.26874240,12.70821810,616 +#OL/KA-345,Hroznatův vrch ,,50.31715000,12.85290000,613 +#OL/KA-346,Čertův vrch ,,50.08528000,13.06782000,611 +#OL/KA-347,Větrný vrch ,,50.19409430,12.48782560,609 +#OL/KA-348,Hlínovec ,,50.09872570,13.16728810,606 +#OL/KA-349,Chrutisko,,50.06409910,13.25501840,606 +#OL/KA-350,Na Kalvárii ,,50.16324980,13.24032060,604 +#OL/KA-351,Vřesový vrch ,,50.24626970,12.37886420,595 +#OL/KA-352,Nad Lomem,,50.15873300,12.85215440,592 +#OL/KA-353,Bílý vrch ,,50.33155000,12.90183000,588 +#OL/KA-354,Kupka,,50.30427130,12.82324560,587 +#OL/KA-355,Na Vyhlídce ,,50.24785490,12.55721500,586 +#OL/KA-356,Mlýnský vrch ,,50.16119000,12.84882000,578 +#OL/KA-357,Na Zadu,,50.08991640,13.09391730,578 +#OL/KA-358,Liščí vrch ,,50.27857750,12.74379190,576 +#OL/KA-359,Krkavec,,50.07635000,13.16973000,575 +#OL/KA-360,Tři díry ,,50.14619000,12.22714000,573 +#OL/KA-361,Studený vrch ,,50.26284850,12.97589220,569 +#OL/KA-362,Stráně ,,50.10945010,12.21295010,568 +#OL/KA-363,U Bažantnice ,,50.07428830,12.28398470,568 +#OL/KA-364,Kozí hřbety ,,50.19978000,12.80376000,566 +#OL/KA-365,Kozinec,,50.25347110,12.67483170,562 +#OL/KA-366,Nad Dvorcem,,50.07403170,13.29390240,562 +#OL/KA-367,U Kapličky ,,50.02348200,12.54555310,561 +#OL/KA-368,Strážiště ,,50.26407400,12.82855910,545 +#OL/KA-369,Kamenný vrch ,,50.23393740,12.35547520,544 +#OL/KA-370,U Kyselky,,50.17741070,12.32879060,539 +#OL/KA-371,Chlůmek ,,50.34191890,13.00862540,538 +#OL/KA-372,Na Valech,,50.31437000,13.00933000,537 +#OL/KA-373,Smrčný ,,50.11745000,12.54492000,524 +#OL/KA-374,Vřesoviště ,,50.28153960,12.80070010,517 +#OL/KA-375,Náhon ,,50.31845450,12.99151250,514 +#OL/KA-376,Rudolecký vrch ,,50.13610950,12.62186020,514 +#OL/KA-377,Borový ,,50.27920950,12.76532260,512 +#OL/KA-378,Čertův kámen ,,50.22038090,12.85880720,512 +#OL/KA-379,Svatavský vrch ,,50.20512300,12.60273360,508 +#OL/KA-380,Bukovec,,50.31326000,13.03724000,507 +#OL/KA-381,Špičák ,,50.31733000,13.01848000,504 +#OL/KA-382,Bučina ,,50.15742780,12.50946290,501 +#OL/KA-383,Šibeniční vrch ,,50.19199000,12.75792000,498 +#OL/KA-384,Čihadlo ,,50.27569860,12.86171570,490 +#OL/KA-385,Ptačí vrch ,,50.25836890,12.92186880,489 +#OL/KA-386,Liščí vrch ,,50.28436000,12.99845000,480 +#OL/KA-387,Nástraha ,,50.27722270,12.94620020,478 +#OL/KA-388,Šibeniční vrch,,50.33394990,13.02233670,476 +#OL/KA-389,Košťál ,,50.27819000,12.99776000,464 +#OL/KA-390,Ve Spálené ,,50.24744000,12.93020000,461 +#OL/KA-391,Starý vrch ,,50.30171000,13.00547000,446 +#OL/KA-392,Nad Bočí ,,50.36420000,13.08812000,433 +#OL/KA-393,Bažantí vrch ,,50.24499870,12.84367740,417 +#OL/KA-394,Liščí kopec ,,50.27924000,13.01126000,387 +#OL/KA-395,Šibeniční vrch ,,50.17632790,13.27266990,619 +#OL/KA-396,Žižkův vrch ,,49.98266870,12.70677840,749 +#OL/KA-397,Špičák ,,50.01144190,12.63276750,809 +#OL/KR-001,Krakonoš ,,50.73421520,15.66476380,1421 +#OL/KR-002,Mužské kameny ,,50.77691000,15.59110000,1417 +#OL/KR-003,Svorová hora ,,50.74252610,15.76981920,1411 +#OL/KR-004,Stoh,,50.71746650,15.64945480,1324 +#OL/KR-005,Světlý vrch ,,50.70136240,15.66022100,1315 +#OL/KR-006,Čelo ,,50.75500010,15.81333810,1269 +#OL/KR-007,Světlá ,,50.65829700,15.77245940,1244 +#OL/KR-008,Jelení hora ,,50.71988140,15.78333110,1172 +#OL/KR-009,Slatinná stráň ,,50.67235210,15.73510240,1152 +#OL/KR-010,Lesní hora ,,50.70760550,15.71186040,1129 +#OL/KR-011,Pěnkavčí vrch ,,50.70136290,15.78425460,1105 +#OL/KR-012,Malá Deštná ,,50.31525380,16.39681900,1090 +#OL/KR-013,Mechovinec,,50.72755820,15.57005220,1081 +#OL/KR-014,Kraví hora ,,50.71901700,15.80462250,1071 +#OL/KR-015,Maruša ,,50.29195640,16.40152780,1042 +#OL/KR-016,Černá skála ,,50.70909050,15.56555090,1040 +#OL/KR-017,Vlašský vrch ,,50.68144700,15.76196860,1035 +#OL/KR-018,Jelení vrch ,,50.65603380,15.69783890,1024 +#OL/KR-019,Pevnost,,50.75346630,15.60413480,1012 +#OL/KR-020,Mravenečník (Mravenčí vrch) ,,50.65118460,15.70263310,1001 +#OL/KR-024,Haida,,50.73163390,15.80075770,995 +#OL/KR-025,Ostružník ,,50.35799240,16.35432190,982 +#OL/KR-026,Tetřeví vrch ,,50.66276840,15.67824320,964 +#OL/KR-027,Červený vrch ,,50.68367050,15.79726570,962 +#OL/KR-028,Lubný ,,50.27768590,16.38853320,959 +#OL/KR-029,Herlíkovický Žalý ,,50.67707430,15.60858850,958 +#OL/KR-030,Vápenný vrch ,,50.27454460,16.40964750,952 +#OL/KR-031,Mezivrší ,,50.22577000,16.49900000,949 +#OL/KR-032,Albeřický vrch ,,50.70679720,15.83879960,946 +#OL/KR-033,Kotel,,50.68532000,15.67002000,944 +#OL/KR-034,Zadní hora ,,50.31807000,16.40954000,929 +#OL/KR-035,Janský vrch ,,50.67912660,15.56536060,925 +#OL/KR-036,Sklenářovický vrch ,,50.63508580,15.86580440,921 +#OL/KR-037,Čepel ,,50.67969540,15.86294480,912 +#OL/KR-038,Stará hora ,,50.67383950,15.80922780,896 +#OL/KR-039,Studený vrch ,,50.29079030,16.37262930,883 +#OL/KR-040,Špičák ,,50.67227720,15.80104940,876 +#OL/KR-041,Srázný ,,50.26613980,16.41221980,863 +#OL/KR-042,Kužel ,,50.66849430,15.62568480,843 +#OL/KR-043,Široký vrch ,,50.65982430,16.29399610,839 +#OL/KR-044,Mravenčí vrch ,,50.64155940,15.99654680,837 +#OL/KR-045,Mravenčí vrch ,,50.67606000,15.99034000,831 +#OL/KR-046,Strážná hůra ,,50.65618540,15.61672890,825 +#OL/KR-047,Horní les ,,50.66171600,15.88952640,816 +#OL/KR-048,Světlina ,,50.66287010,16.26561080,796 +#OL/KR-049,Vápenice ,,50.65263350,15.63837530,791 +#OL/KR-050,Čáp ,,50.57456600,16.12416640,786 +#OL/KR-051,Obírka ,,50.67161280,16.23533380,781 +#OL/KR-052,Javorový vrch ,,50.65880220,16.30500370,777 +#OL/KR-053,Panský kopec ,,50.37981600,16.33058230,772 +#OL/KR-054,Supí skály ,,50.57999140,16.13965600,771 +#OL/KR-055,Koruna,,50.52216570,16.32464970,769 +#OL/KR-056,Polom,,50.18082870,16.53766910,766 +#OL/KR-057,Sovinec,,50.64233950,15.57012370,765 +#OL/KR-058,Jelení vrch ,,50.65625400,16.31726980,751 +#OL/KR-059,Červená hora ,,50.63188570,16.37756180,747 +#OL/KR-060,Březový vrch ,,50.66463760,16.25184780,743 +#OL/KR-061,Nad Rázem ,,50.58772110,16.11034570,738 +#OL/KR-062,Podolský kopec ,,50.26029120,16.35963060,737 +#OL/KR-063,Jedlový vrch ,,50.65692460,16.34360360,734 +#OL/KR-064,Bartův les ,,50.62892110,15.84804560,732 +#OL/KR-065,Kuní vrch ,,50.22700000,16.53607000,728 +#OL/KR-066,Vrchy,,50.63725040,15.90057570,716 +#OL/KR-067,Feistův kopec ,,50.37824140,16.31720490,711 +#OL/KR-068,Liščí hora ,,50.59662210,16.09732990,710 +#OL/KR-069,Kněžický vrch ,,50.63680650,15.58687060,709 +#OL/KR-070,Krupná hora ,,50.60210450,16.05687270,706 +#OL/KR-071,Supí hnízdo ,,50.56407910,16.27606570,702 +#OL/KR-072,Dlouhý vrch ,,50.64069000,16.09616000,698 +#OL/KR-073,Jankův kopec ,,50.64014720,15.61908580,695 +#OL/KR-074,Jiráskovy skály ,,50.57364060,16.14712900,694 +#OL/KR-075,Strážná hora ,,50.57620230,16.25955800,689 +#OL/KR-076,Smrčina ,,50.62725250,15.72195710,687 +#OL/KR-077,Modrý kámen ,,50.54914040,16.29644040,686 +#OL/KR-078,Hradiště ,,50.56098050,16.08102760,683 +#OL/KR-079,Bělá ,,50.26759640,16.33463680,682 +#OL/KR-080,Kraví vrch ,,50.62807480,15.82563460,681 +#OL/KR-081,Starozámecký vrch ,,50.61754250,16.09906060,681 +#OL/KR-082,Přední kopec ,,50.15807410,16.53077880,678 +#OL/KR-083,Skalky,,50.63767660,16.06932310,677 +#OL/KR-084,Červený kopec ,,50.36511310,16.30418660,677 +#OL/KR-085,Křížový vrch ,,50.62488720,16.12852570,667 +#OL/KR-086,Pavlovská hora ,,50.62976790,16.08430120,663 +#OL/KR-087,Polův kopec ,,50.17176450,16.47934460,658 +#OL/KR-088,Syrovec,,50.27668490,16.30412670,656 +#OL/KR-089,Strážný vrch ,,50.58330260,16.09447770,654 +#OL/KR-090,Rudný ,,50.60629570,16.40270550,654 +#OL/KR-091,Koňský hřbet ,,50.60227830,16.13770720,647 +#OL/KR-092,Kašparka ,,50.38620670,16.23724330,639 +#OL/KR-093,Kamenný vrch ,,50.65730180,16.11707870,638 +#OL/KR-094,Buková hora ,,50.62674000,16.17842000,638 +#OL/KR-095,Malinová hora (Vrch) ,,50.39996510,16.21612900,637 +#OL/KR-096,Panský vrch ,,50.37697890,16.29669220,637 +#OL/KR-097,Šintákův kopec ,,50.32366970,16.26835200,636 +#OL/KR-098,Na Popravišti ,,50.65162920,15.92260700,635 +#OL/KR-099,Zámecký vrch ,,50.59942540,15.90511010,635 +#OL/KR-100,Šibeniční vrch ,,50.63241000,16.11507000,632 +#OL/KR-101,Kozí kameny ,,50.56833190,15.98212290,632 +#OL/KR-102,Kraví hora ,,50.53167320,16.09136360,628 +#OL/KR-103,Zaječí kopec ,,50.56047780,16.01703030,624 +#OL/KR-104,Kupcův kopec ,,50.26439850,16.32169490,624 +#OL/KR-105,Lada,,50.61803880,16.14464650,623 +#OL/KR-106,Hůra ,,50.56838470,16.00127200,622 +#OL/KR-107,Špička ,,50.62794470,15.66614840,614 +#OL/KR-108,Klůček ,,50.55170260,16.24964470,614 +#OL/KR-109,Tiský kopec ,,50.34317380,16.26125400,614 +#OL/KR-110,Družstevní vrch ,,50.63519370,16.15603660,613 +#OL/KR-111,U Lesa,,50.25357170,16.31516690,608 +#OL/KR-112,Záhoř ,,50.55476190,16.11485090,607 +#OL/KR-113,Chlum,,50.51614670,16.26749430,606 +#OL/KR-114,Turov,,50.51097420,16.14888180,603 +#OL/KR-115,Valy,,50.68841000,15.95391000,600 +#OL/KR-116,Soví hora ,,50.61397730,15.87440640,599 +#OL/KR-117,Machovský Šefel ,,50.50612610,16.27258500,597 +#OL/KR-118,Dubovice,,50.38587970,16.22052330,596 +#OL/KR-119,Hora,,50.53296830,16.26551800,593 +#OL/KR-120,Valy,,50.60939210,16.18197500,590 +#OL/KR-121,Vlčí skála ,,50.59276840,15.80749800,587 +#OL/KR-122,Mračný vrch ,,50.60615580,16.20292300,587 +#OL/KR-123,Kamenný vrch ,,50.59728150,16.18427150,587 +#OL/KR-124,Skřivaní vrch ,,50.60872140,15.81540280,586 +#OL/KR-125,Kopna,,50.47479900,15.95188460,582 +#OL/KR-126,Krahulčí ,,50.37002000,16.22683810,579 +#OL/KR-127,Staropacká hora ,,50.51602840,15.51026220,578 +#OL/KR-128,Velbloudí vrch ,,50.64610020,16.33701460,576 +#OL/KR-129,Na Homoli,,50.16174880,16.42874290,576 +#OL/KR-130,Borek,,50.60340000,16.15933000,566 +#OL/KR-131,Kozí hřbet ,,50.37907190,16.21100950,564 +#OL/KR-132,Velká Suchá ,,50.13442350,16.44477680,559 +#OL/KR-133,Závora ,,50.49450440,15.77880830,548 +#OL/KR-134,Liščí kopec ,,50.63007580,15.64542210,547 +#OL/KR-135,Holý vrch ,,50.62938550,16.31052360,546 +#OL/KR-136,Vysoký kámen ,,50.53647250,16.16412070,545 +#OL/KR-137,Kamenná ,,50.57088990,15.79277640,543 +#OL/KR-138,Supí vrch ,,50.63268590,16.33352310,541 +#OL/KR-139,Bolkův kopec ,,50.60775270,15.94371090,541 +#OL/KR-140,Krkonošská vyhlídka ,,50.46610930,15.60534110,532 +#OL/KR-141,Kapraď ,,50.07393190,16.29903780,529 +#OL/KR-142,Poříčský hřbet ,,50.56458710,15.94781860,522 +#OL/KR-143,Mlýnský vrch ,,50.61262990,16.30977520,521 +#OL/KR-144,Bradlo,,50.50146610,15.73154390,520 +#OL/KR-145,Jerusalem,,50.49754630,15.59212260,520 +#OL/KR-146,Kazabrud,,50.49712970,15.61861030,516 +#OL/KR-147,Křížový vrch ,,50.57992950,15.84750450,512 +#OL/KR-148,Svatá Kateřina ,,50.50835380,15.77077180,511 +#OL/KR-149,Koníček ,,50.37450300,16.18304740,507 +#OL/KR-150,Šibeník ,,50.55597900,15.90619770,506 +#OL/KR-151,Jahodová ,,50.15233060,16.34990310,505 +#OL/KR-152,Vraní výšina ,,50.57777650,15.86633510,503 +#OL/KR-153,Nad Hájem ,,50.61043430,15.64549260,502 +#OL/KR-154,Stěna ,,50.50186380,15.71383920,500 +#OL/KR-155,Božanovský vrch ,,50.51039460,16.36268320,496 +#OL/KR-156,Fejfarův vrch ,,50.58576010,15.59062900,494 +#OL/KR-157,Hůrka ,,50.58988250,15.62780680,494 +#OL/KR-158,Roviny,,50.08182180,16.27943050,494 +#OL/KR-159,Klůček ,,50.52806250,15.99023170,493 +#OL/KR-160,Zámecký kopec ,,50.52899780,16.15248000,492 +#OL/KR-161,Vyhlídka ,,50.63190870,16.26449640,489 +#OL/KR-162,Valy,,50.44782820,15.62693930,489 +#OL/KR-163,Jírová hora ,,50.48678450,16.17558650,485 +#OL/KR-164,Na Signálu,,50.47461180,16.02477000,483 +#OL/KR-165,Na Zástavách ,,50.36939890,16.17195210,477 +#OL/KR-166,Na Spravedlnosti,,50.52110440,15.82867600,471 +#OL/KR-167,Kozinec,,50.48016060,15.42339290,468 +#OL/KR-168,Záleský vrch ,,50.42062580,15.76616570,459 +#OL/KR-169,Buková hora ,,50.44481480,16.11206830,459 +#OL/KR-170,Velká hora ,,50.48389360,15.26499350,456 +#OL/KR-171,Na Zámcích ,,50.45025440,15.48848250,451 +#OL/KR-172,Chlum,,50.39436000,15.56959220,449 +#OL/KR-173,Ovčácký kopec ,,50.55741030,15.84252650,444 +#OL/KR-174,Nový Hrádek ,,50.47028800,15.28351800,427 +#OL/KR-175,Na Kamenici,,50.47863890,15.57301450,415 +#OL/KR-176,Homolka,,50.07091600,16.31684380,401 +#OL/KR-177,Javornická horka ,,50.47687750,15.30926370,373 +#OL/KR-178,Chlum,,50.26541700,16.18028640,359 +#OL/KR-179,Velká hvězda ,,50.25493960,16.11931330,355 +#OL/KR-180,Svíb ,,50.29770580,15.73756870,332 +#OL/KR-181,Vackovská ,,50.23592790,16.01123070,317 +#OL/KR-182,Tátrum ,,50.12118920,15.48965810,264 +#OL/LI-001,Harrachovy kameny,,50.75493850,15.53860040,1421 +#OL/LI-002,Smědavská hora ,,50.85053080,15.24427950,1084 +#OL/LI-003,Sněžné věžičky ,,50.83086390,15.22162780,1063 +#OL/LI-004,Preislerův kopec ,,50.71339060,15.51478140,1035 +#OL/LI-005,Černý vrch ,,50.83105250,15.29842070,1025 +#OL/LI-006,Věžní skály ,,50.83656150,15.34838790,1018 +#OL/LI-007,Ptačí kupy ,,50.84691630,15.17369260,1013 +#OL/LI-008,Polední kameny ,,50.85346610,15.22457620,1007 +#OL/LI-009,Bukovec,,50.81426710,15.35770410,1005 +#OL/LI-010,Milíře ,,50.81259280,15.25979440,1003 +#OL/LI-011,Janova skála,,50.75356330,15.43742230,1002 +#OL/LI-012,Hruškové skály ,,50.80506640,15.33061250,997 +#OL/LI-013,Bílé kameny ,,50.80691540,15.33811920,993 +#OL/LI-014,Studená ,,50.74715730,15.45698000,989 +#OL/LI-015,Pytlácké kameny ,,50.84298760,15.33428930,975 +#OL/LI-016,Čertova pláň ,,50.75089760,15.47516100,974 +#OL/LI-017,Klínový vrch ,,50.87119490,15.26934360,972 +#OL/LI-018,Čihadlo ,,50.82473090,15.23980030,967 +#OL/LI-019,Vídeňská skála ,,50.72099690,15.53515120,967 +#OL/LI-020,Uhlířský vrch ,,50.81807890,15.24714800,966 +#OL/LI-021,Zelený vrch ,,50.82066230,15.28177290,966 +#OL/LI-022,Bílá skála ,,50.73978500,15.37584360,964 +#OL/LI-023,Na Skalce,,50.84681530,15.21289660,963 +#OL/LI-024,Ptáčinec ,,50.76558250,15.45500410,950 +#OL/LI-025,Černý vrch ,,50.72819580,14.98928850,945 +#OL/LI-026,Plochý vrch ,,50.85864470,15.28302470,939 +#OL/LI-027,Zelený kámen ,,50.85666000,15.29994800,933 +#OL/LI-028,Hromovka,,50.74219560,15.39740560,919 +#OL/LI-029,Desenský hřeben ,,50.79353520,15.29812500,908 +#OL/LI-030,Zadní kopec ,,50.85428800,15.26958710,905 +#OL/LI-031,Kobyla,,50.68960960,15.50005970,897 +#OL/LI-032,Velký Jeřábník ,,50.70672000,15.54206980,892 +#OL/LI-033,Olivetská hora ,,50.83901000,15.14162330,886 +#OL/LI-034,Černý vrch ,,50.80948370,15.20937730,877 +#OL/LI-035,Mariánská hora ,,50.78116830,15.26536500,874 +#OL/LI-036,Tišina ,,50.88099470,15.24591710,873 +#OL/LI-037,Bučina ,,50.78946610,15.27040590,868 +#OL/LI-038,Dlouhá skála ,,50.77812780,15.35379730,868 +#OL/LI-039,Poledník ,,50.85482530,15.13649980,864 +#OL/LI-040,Nekras (Královka) ,,50.79222760,15.15714530,859 +#OL/LI-041,Kostelní vrch ,,50.74496390,15.47476080,858 +#OL/LI-042,Kání hnízdo ,,50.80483000,15.31199130,850 +#OL/LI-043,Vlčí kameny ,,50.85253690,15.33464160,848 +#OL/LI-044,Milíř ,,50.81662230,15.12185250,836 +#OL/LI-045,Pustina,,50.71438190,15.25960530,831 +#OL/LI-046,Vlčí kámen ,,50.82354420,15.16741580,827 +#OL/LI-047,Malinový vrch (Maliník) ,,50.78837280,15.13295820,826 +#OL/LI-048,Javorník ,,50.72442510,15.37583400,822 +#OL/LI-049,Slovanka,,50.77292190,15.19730100,820 +#OL/LI-050,Rejdický kopec ,,50.72877970,15.36385370,816 +#OL/LI-051,Černá hora ,,50.75218790,14.98162810,811 +#OL/LI-052,Vysoký hřeben ,,50.78087390,15.14700790,809 +#OL/LI-053,Severák ,,50.77462540,15.18956450,804 +#OL/LI-054,Ořešník ,,50.86088690,15.18789640,800 +#OL/LI-055,Mechovice,,50.73047060,15.39685300,799 +#OL/LI-056,Krásný ,,50.76122910,15.19849960,797 +#OL/LI-057,Dlouhý kopec ,,50.77118960,15.32770750,789 +#OL/LI-058,Muchov,,50.72451880,15.29298320,787 +#OL/LI-059,Svinské čelo ,,50.85960170,15.15697380,781 +#OL/LI-060,Bedřichovské sedlo ,,50.79280320,15.12763600,779 +#OL/LI-061,Měděnec ,,50.90756530,15.25146180,777 +#OL/LI-062,Veisův kopec ,,50.75482140,15.21145830,777 +#OL/LI-063,Aldrov,,50.67872570,15.52012030,776 +#OL/LI-064,Rozsocha,,50.76502710,14.96914500,767 +#OL/LI-065,Skalka,,50.66552680,15.50305130,763 +#OL/LI-066,Hutní hora ,,50.76026290,15.33727250,762 +#OL/LI-067,Svinský vrch ,,50.90285770,15.23186760,756 +#OL/LI-068,Malý Ještěd ,,50.74645680,14.94477770,754 +#OL/LI-069,Dlouhá hora ,,50.79018630,14.92384250,748 +#OL/LI-070,Jírův kopec ,,50.73686580,15.33013220,746 +#OL/LI-071,Kaliště ,,50.76071120,14.97187000,745 +#OL/LI-072,Maršovický vrch ,,50.70341290,15.20414640,743 +#OL/LI-073,Nad Mýtem ,,50.76464950,15.40564980,743 +#OL/LI-074,Žulový vrch ,,50.78915550,15.10634560,743 +#OL/LI-075,Pod Přehradou ,,50.79961550,15.11442930,742 +#OL/LI-076,Desenský vrch ,,50.76937810,15.30596950,732 +#OL/LI-077,Světlý vrch ,,50.76390870,15.29260520,729 +#OL/LI-078,Javorový vrch ,,50.80513340,15.09877500,723 +#OL/LI-079,Petruškovy vrchy ,,50.69525560,15.38568190,720 +#OL/LI-080,Tomášovy vrchy ,,50.71092540,15.38988950,717 +#OL/LI-081,Skalky,,50.82614380,15.09484390,711 +#OL/LI-082,Rapická hora ,,50.91220580,15.26753190,708 +#OL/LI-083,Bouřný ,,50.82969730,14.60821310,703 +#OL/LI-084,Bínův vrch ,,50.74647510,15.25669270,699 +#OL/LI-085,Strmý vrch ,,50.86166380,15.07144270,698 +#OL/LI-086,Závorník,,50.90187790,15.21764150,697 +#OL/LI-087,Hrachový kopec ,,50.74819790,15.22364690,691 +#OL/LI-088,Bradlo,,50.72472980,15.34716130,690 +#OL/LI-089,Kamenné vrchy ,,50.69342440,15.41607860,688 +#OL/LI-090,Zdislavský Špičák ,,50.77477160,14.89890610,688 +#OL/LI-091,Malý Vápenný ,,50.76772980,14.90935820,687 +#OL/LI-092,Skalka,,50.63378520,15.54609480,687 +#OL/LI-093,Praškova skála ,,50.71144330,15.40677680,686 +#OL/LI-094,Homolka,,50.64478380,15.52455430,685 +#OL/LI-095,Homole,,50.66593320,15.48352870,683 +#OL/LI-096,Lom,,50.75737830,14.92083350,682 +#OL/LI-097,Nad Lomem,,50.82658080,15.08791600,681 +#OL/LI-098,Kančí vrch ,,50.86509030,15.05411170,680 +#OL/LI-099,Malý Špičák ,,50.74574970,15.28994070,678 +#OL/LI-100,Vyhlídka ,,50.74320780,15.24121200,678 +#OL/LI-101,Sýkoří ,,50.64737210,15.50042450,677 +#OL/LI-102,Dalešický vrch ,,50.68868490,15.19207760,676 +#OL/LI-103,Dračí vrch,,50.80953780,15.07766490,676 +#OL/LI-104,Novoveský vrch ,,50.72916970,15.20357820,669 +#OL/LI-105,Čihadlo ,,50.84047940,14.63880040,664 +#OL/LI-106,Medvědí vrch ,,50.79569090,14.55435210,663 +#OL/LI-107,Vřesoviště ,,50.84382850,15.10965140,662 +#OL/LI-108,Rousínovský vrch ,,50.80076380,14.58382030,660 +#OL/LI-109,Spálený vrch ,,50.76832980,14.94985700,660 +#OL/LI-110,Baba,,50.66719410,15.53261490,656 +#OL/LI-111,Klášterní vrch ,,50.76110900,15.13066910,654 +#OL/LI-112,Plešivec ,,50.83539120,14.68269260,653 +#OL/LI-113,Buč ,,50.67084330,15.37065120,652 +#OL/LI-114,Kotel,,50.75638270,15.14262130,652 +#OL/LI-115,Bartlův vrch ,,50.71056860,15.18412230,651 +#OL/LI-116,Jítravský vrch ,,50.79525790,14.88058670,651 +#OL/LI-117,Na Kopci,,50.52356200,15.35042330,644 +#OL/LI-118,Klučky ,,50.78040600,14.51024200,642 +#OL/LI-119,Pramenný vrch ,,50.78335470,14.56200180,605 +#OL/LI-120,Vlčí hora ,,50.75675300,14.48077330,641 +#OL/LI-121,Kopřivnice ,,50.83456450,14.63379060,638 +#OL/LI-122,Suchý vrch ,,50.81886780,14.63817930,638 +#OL/LI-123,Císařský kámen ,,50.71340120,15.10436110,637 +#OL/LI-124,Jílový vrch ,,50.76860220,15.12030960,634 +#OL/LI-125,Šenovský vrch ,,50.78308810,14.48161650,632 +#OL/LI-126,Babylon,,50.52602000,15.35436000,631 +#OL/LI-127,Češka ,,50.76013040,14.49627530,629 +#OL/LI-128,Polevský vrch ,,50.79002390,14.52217240,626 +#OL/LI-129,Kobyla,,50.81925760,14.61664780,625 +#OL/LI-130,Loučenský vrch ,,50.75946940,15.17419100,623 +#OL/LI-131,Ovčácký vrch ,,50.79601570,14.50128160,623 +#OL/LI-132,Chmelnice,,50.63302580,15.50717260,621 +#OL/LI-133,Nad Skokem,,50.74267230,15.18482920,620 +#OL/LI-134,Varta,,50.57653860,15.28912670,619 +#OL/LI-135,Na Vrších ,,50.71251640,15.34140550,618 +#OL/LI-136,Kamenný ,,50.70193630,15.01121520,615 +#OL/LI-137,Kočičí kameny ,,50.88686560,15.22428180,611 +#OL/LI-138,Hamštejnský vrch ,,50.61822290,15.24550550,610 +#OL/LI-139,Čertovka ,,50.63804810,15.43496330,609 +#OL/LI-140,Na Vršku ,,50.69273150,15.45701730,609 +#OL/LI-141,Kameniště ,,50.85632550,15.01113850,608 +#OL/LI-142,Paloušův kopec ,,50.71107010,15.43056820,608 +#OL/LI-143,Čachnov ,,50.75548520,14.47080670,605 +#OL/LI-144,Smetanova vyhlídka ,,50.53086380,15.33851260,601 +#OL/LI-145,Kopřivník ,,50.86725200,15.10265790,598 +#OL/LI-146,Kozel,,50.66397640,14.45610190,598 +#OL/LI-147,Panská skála (Varhany) ,,50.74544530,14.47795020,595 +#OL/LI-149,Na Vyhlídce ,,50.76817020,14.49630240,594 +#OL/LI-150,Sokol,,50.80771160,14.74930160,593 +#OL/LI-151,Střední vrch ,,50.80112520,14.47698940,593 +#OL/LI-152,Skuhrovský vrch ,,50.54768460,15.34348840,592 +#OL/LI-153,Bubeníkovy vrchy ,,50.62826870,15.52538850,588 +#OL/LI-154,Přívlasko ,,50.64963710,15.43821050,587 +#OL/LI-155,Havraní vrch ,,50.67899000,14.36203000,586 +#OL/LI-156,Kamenný vrch ,,50.82470020,14.65471020,586 +#OL/LI-157,Zelený vrch ,,50.78408780,14.65444200,586 +#OL/LI-158,Spálený vrch ,,50.85215340,15.00215930,581 +#OL/LI-159,Mikšova hora ,,50.69715950,15.30108170,578 +#OL/LI-160,Skalice,,50.59852340,15.41772810,578 +#OL/LI-161,Malý Bezděz ,,50.54042880,14.71369070,577 +#OL/LI-162,Liberecká výšina ,,50.77810660,15.09188160,573 +#OL/LI-163,Kyselinčí kopec ,,50.72445000,14.95793000,571 +#OL/LI-164,Malý Kozinec ,,50.61807370,15.57424050,571 +#OL/LI-165,Levín ,,50.51983440,15.52802060,569 +#OL/LI-166,Mazova horka,,50.69895030,14.98521720,569 +#OL/LI-167,Tetřeví vrch ,,50.80057460,14.49907610,569 +#OL/LI-168,Výhledy ,,50.86171630,14.96464800,569 +#OL/LI-169,Hůra ,,50.57614060,15.54186900,567 +#OL/LI-170,Hřebenáč ,,50.93841600,15.24007140,566 +#OL/LI-171,Popova skála ,,50.82560110,14.81315390,565 +#OL/LI-172,Skalice,,50.68490610,15.30983640,564 +#OL/LI-173,Kolný ,,50.66164390,14.43462290,563 +#OL/LI-174,Sokol,,50.63240170,15.20542230,563 +#OL/LI-175,Vartiště ,,50.63742600,15.47011300,563 +#OL/LI-176,Holubník ,,50.72171240,14.95432680,562 +#OL/LI-177,Kozinec,,50.61940250,15.48791420,561 +#OL/LI-178,Roubenka,,50.55105290,15.52938560,561 +#OL/LI-179,Simmův kopec ,,50.76256500,14.93160070,561 +#OL/LI-180,Kulich,,50.82592110,14.69252510,560 +#OL/LI-181,Chrástná ,,50.76258210,14.44974170,557 +#OL/LI-182,Na Závodí ,,50.59825790,15.37412190,404 +#OL/LI-183,Veselka,,50.66102430,15.30843420,556 +#OL/LI-184,Na kříbu ,,50.59081850,15.39912480,553 +#OL/LI-185,Malý Stoh ,,50.82871240,14.62599850,552 +#OL/LI-186,Ostrá horka ,,50.71394650,14.96600570,552 +#OL/LI-187,Ostrý ,,50.82731000,15.07383240,552 +#OL/LI-188,Pískový vrch ,,50.81108870,14.82609960,547 +#OL/LI-189,Vlčí jámy ,,50.78149000,14.92241000,547 +#OL/LI-190,Vysoká ,,50.80487710,14.86148850,545 +#OL/LI-191,Chotice,,50.55630320,15.32356130,544 +#OL/LI-192,Medenec,,50.62856030,15.31478200,544 +#OL/LI-193,Sedlecký Špičák ,,50.83322190,14.81005620,544 +#OL/LI-194,Kulovatka,,50.69533070,15.33833570,543 +#OL/LI-195,Hradisko,,50.54397320,15.54347620,541 +#OL/LI-196,Slavíkův kopec ,,50.53936240,15.52123900,540 +#OL/LI-197,Tisový vrch ,,50.72451790,14.60863750,540 +#OL/LI-198,Loupežnický vrch ,,50.81427770,14.79616550,539 +#OL/LI-199,Králův vrch ,,50.67916150,14.42705240,536 +#OL/LI-200,Liščí hora ,,50.80671580,14.79165690,536 +#OL/LI-201,Lovčí vrch ,,50.72008380,15.11310230,536 +#OL/LI-202,Pařez ,,50.80779080,14.60291800,536 +#OL/LI-203,Zámecký vrch ,,50.80790070,14.70694960,536 +#OL/LI-204,Slavíček ,,50.73024900,14.60144850,535 +#OL/LI-205,Bučina ,,50.83075420,14.57119990,534 +#OL/LI-206,Hřebeny ,,50.81613630,14.83408690,534 +#OL/LI-207,Hamry,,50.65974590,14.40035070,532 +#OL/LI-208,Homole,,50.63432600,15.48048940,532 +#OL/LI-209,Zabolky,,50.65384280,15.12906980,531 +#OL/LI-210,Dvorský kopec ,,50.72136340,14.42109790,527 +#OL/LI-211,Tatobitský vrch ,,50.57728000,15.27755000,527 +#OL/LI-212,Malý Sokol ,,50.80514000,14.74543000,523 +#OL/LI-213,Poustevna,,50.73814810,14.47111550,520 +#OL/LI-214,Podkova,,50.82313000,14.80578000,518 +#OL/LI-215,Stránsko ,,50.56252000,15.37364000,515 +#OL/LI-216,Velký Jelení vrch ,,50.67705960,14.82687840,514 +#OL/LI-217,Hvězda ,,50.65368250,15.30974410,511 +#OL/LI-218,Novoveský vrch ,,50.82171990,15.02169270,511 +#OL/LI-219,Ostrý vrch ,,50.81057730,14.84614270,511 +#OL/LI-220,Ptačí vrch ,,50.73978310,14.46678880,511 +#OL/LI-221,Lipka,,50.79000030,14.48290200,510 +#OL/LI-222,Sytovský kopec ,,50.62492990,15.41825190,509 +#OL/LI-223,Kostelní vrch ,,50.77059000,14.92746000,505 +#OL/LI-224,Školský vrch ,,50.76517310,14.86875230,505 +#OL/LI-225,Radečský kopec ,,50.71616640,14.44722570,504 +#OL/LI-226,Činkův kopec ,,50.70635290,14.95547470,502 +#OL/LI-227,Romanova hůra ,,50.48869190,15.40925940,502 +#OL/LI-228,Sokolík ,,50.78950000,14.58992000,501 +#OL/LI-229,Kostelní vrch ,,50.78767330,14.85370840,500 +#OL/LI-230,Malý Jelení vrch ,,50.68159010,14.82550290,500 +#OL/LI-231,Útěchovický Špičák ,,50.71967760,14.84632720,500 +#OL/LI-232,Vraní skály ,,50.81935820,14.82351360,500 +#OL/LI-233,Břidličný vrch ,,50.80154170,14.45791230,499 +#OL/LI-234,Kančí vrch ,,50.81032900,14.72941680,499 +#OL/LI-235,Lán ,,50.52529760,15.46137980,499 +#OL/LI-236,Chotovický vrch ,,50.74513670,14.54145210,498 +#OL/LI-237,Kotelský vrch ,,50.68243130,14.95470470,498 +#OL/LI-238,Valdický vrch ,,50.58170000,15.40252000,498 +#OL/LI-239,Ovčí hora ,,50.79581920,14.97173550,496 +#OL/LI-240,Zelený háj ,,50.56559000,15.30837000,496 +#OL/LI-241,Malý Ovčí vrch ,,50.81442150,14.69680220,495 +#OL/LI-242,Čertův stolec ,,50.67693000,14.94837000,494 +#OL/LI-243,Strážný ,,50.75990620,14.60630080,492 +#OL/LI-244,Antošův kopec ,,50.68332440,14.94086020,491 +#OL/LI-245,Brnišťský kopec ,,50.72911820,14.67785680,491 +#OL/LI-246,Soví vrch ,,50.82206150,14.67528690,491 +#OL/LI-247,Pelousek,,50.67775970,14.96942870,489 +#OL/LI-248,Vršek ,,50.65106000,15.23722000,488 +#OL/LI-249,Hrobka,,50.64878660,15.11383630,487 +#OL/LI-250,Ocasovský vrch ,,50.68548070,14.88879280,487 +#OL/LI-251,Pekelský vrch ,,50.89433520,15.16727130,487 +#OL/LI-252,Kněžsko ,,50.53087550,15.42294360,486 +#OL/LI-253,Pískové návrší ,,50.77499810,14.84342290,485 +#OL/LI-254,Červený kopec ,,50.55508490,15.58154970,484 +#OL/LI-255,Skalický vrch ,,50.73651500,14.52634480,484 +#OL/LI-256,Šišák ,,50.73648210,14.61511320,484 +#OL/LI-257,Prosečský vrch ,,50.72697330,15.12944060,483 +#OL/LI-258,Lázeňský vrch ,,50.68628000,14.89239000,481 +#OL/LI-259,Berkovský vrch ,,50.55692980,14.57975960,480 +#OL/LI-260,Drnclík ,,50.48312810,14.62642130,480 +#OL/LI-261,Kříby ,,50.65149310,15.26389820,479 +#OL/LI-262,Borská skalka ,,50.77421500,14.54479860,478 +#OL/LI-263,Zábrdský kopec ,,50.67867500,14.92512710,477 +#OL/LI-264,Dubový vrch ,,50.89151520,15.17692950,474 +#OL/LI-265,Velký Beškovský vrch ,,50.51923860,14.58212560,474 +#OL/LI-266,Lipka,,50.69536480,14.76292700,473 +#OL/LI-267,Šedina ,,50.56934310,14.59060700,473 +#OL/LI-268,Krkavčí skály ,,50.74435000,14.89563000,472 +#OL/LI-269,Zabitý ,,50.67276050,14.97305480,472 +#OL/LI-270,Buková ,,50.76486410,14.85105700,468 +#OL/LI-271,Dubina,,50.78010000,14.70973000,467 +#OL/LI-272,Holičský vrch ,,50.67835370,14.90395390,467 +#OL/LI-273,Horka,,50.67494290,14.91222600,467 +#OL/LI-274,Březový vrch ,,50.84282300,15.05692660,466 +#OL/LI-275,Korecký vrch ,,50.53565670,14.60692860,465 +#OL/LI-276,Na Chatkách ,,50.87648390,15.17397300,465 +#OL/LI-277,Kamenný vrch ,,50.79995940,14.72516290,462 +#OL/LI-278,Strážný vrch ,,50.81676120,14.77730320,462 +#OL/LI-279,Táhlý vrch ,,50.74991620,14.86437240,462 +#OL/LI-280,Kovářský vrch ,,50.75490580,14.68958820,461 +#OL/LI-281,Špičák ,,50.70315000,14.54877240,459 +#OL/LI-282,Jelení vrch ,,50.79129890,14.68582870,458 +#OL/LI-283,K Radčicům ,,50.81883270,15.05190040,457 +#OL/LI-284,Zbiroh,,50.62382000,15.19034000,453 +#OL/LI-285,Hamerský Špičák ,,50.68997090,14.85095450,452 +#OL/LI-286,Hrouda,,50.77372960,14.60936160,452 +#OL/LI-287,Chrastenský vrch ,,50.69899540,14.87811270,452 +#OL/LI-288,Stráž ,,50.79429110,14.46128790,451 +#OL/LI-289,Mlaka,,50.86822110,15.13932430,450 +#OL/LI-290,Havraní návrší ,,50.75145030,14.88614160,449 +#OL/LI-291,Husa,,50.58848820,14.45233850,449 +#OL/LI-292,Modrý vrch ,,50.65760810,14.37683650,449 +#OL/LI-293,Borný ,,50.58957550,14.66287470,446 +#OL/LI-294,Podlesí ,,50.89381170,15.08616560,446 +#OL/LI-295,Kamenný vrch ,,50.97338720,15.21763370,444 +#OL/LI-296,Nad Pivovarem,,50.74859420,15.08901720,444 +#OL/LI-297,Bulovský kopec ,,50.98010740,15.15361910,443 +#OL/LI-298,Novinská hůrka ,,50.68236670,14.86920990,443 +#OL/LI-299,Kamenitý ,,50.78841000,14.62570000,442 +#OL/LI-300,Malý Vlhošť ,,50.59505610,14.45678350,440 +#OL/LI-301,Kalich,,50.67574600,14.86753000,439 +#OL/LI-302,Chudý vrch ,,50.76432340,14.61488490,433 +#OL/LI-303,Kostelec,,50.57095390,14.45672180,433 +#OL/LI-304,Kamenáč ,,50.76337000,14.69879000,432 +#OL/LI-305,Stružnický vrch ,,50.70980150,14.45534520,432 +#OL/LI-306,Stříbrný vrch ,,50.74843610,14.83262530,432 +#OL/LI-307,Zámecký vrch ,,50.48799950,14.61995480,432 +#OL/LI-308,Závětří ,,50.83866040,15.03022180,432 +#OL/LI-309,Malá Buková ,,50.59561680,14.74726510,431 +#OL/LI-310,Slatinné vrchy ,,50.55393160,14.70446160,430 +#OL/LI-311,Široký kámen ,,50.68652570,14.85742060,430 +#OL/LI-312,Bořejovský vrch ,,50.51408480,14.61049290,429 +#OL/LI-313,Koňský vrch ,,50.57839470,14.43290840,429 +#OL/LI-314,Kavčí kopec ,,50.68986680,14.88629080,428 +#OL/LI-315,Kozí vrch ,,50.70204180,14.38508410,428 +#OL/LI-316,Nad Zátiším ,,50.89594120,15.07576090,427 +#OL/LI-317,Ostrý kopec ,,50.52814840,14.59931590,427 +#OL/LI-318,Petrovický vrch ,,50.80286770,14.77282810,427 +#OL/LI-319,Vysoký vrch ,,50.52940960,14.58959820,427 +#OL/LI-320,Děvín ,,50.69265000,14.85423000,426 +#OL/LI-321,Merboltický kopec ,,50.70348560,14.37249000,426 +#OL/LI-322,Ostrovské vrchy ,,50.67097900,14.85203350,425 +#OL/LI-323,Stejskalův kopec ,,50.70765000,14.90421000,425 +#OL/LI-324,Lipovec,,50.73931620,14.54320960,424 +#OL/LI-325,Vápenný vrch ,,50.89315360,15.13530370,424 +#OL/LI-326,Tisícový kámen ,,50.57915000,14.45379000,423 +#OL/LI-327,Číř ,,50.56363740,14.47725060,422 +#OL/LI-328,Na Konicích ,,50.56571000,15.16184000,420 +#OL/LI-329,Zlatá výšina ,,50.71612800,14.88804040,420 +#OL/LI-330,Lysá skála ,,50.63034310,14.60874120,419 +#OL/LI-331,Velenický kopec ,,50.71253480,14.66493970,417 +#OL/LI-332,Stávek ,,50.54336570,15.18629310,416 +#OL/LI-333,Hájky ,,50.90523720,15.04579550,413 +#OL/LI-334,Špičák ,,50.73269310,14.41358990,412 +#OL/LI-335,Kout,,50.51461300,14.52067030,411 +#OL/LI-336,Rokytská horka ,,50.58207730,14.87039190,410 +#OL/LI-337,Sviňské skály ,,50.76612000,14.83886000,404 +#OL/LI-338,Ptačí vrch ,,50.90498850,15.03726200,403 +#OL/LI-339,Dlouhý vrch ,,50.62194870,14.61570960,402 +#OL/LI-340,Hladový kopec ,,50.73489770,14.43759590,402 +#OL/LI-341,Jezovská hora ,,50.57128290,14.81517840,400 +#OL/LI-342,Dubecko,,50.58443460,15.22137300,399 +#OL/LI-343,Lysý ,,50.61455490,14.90151140,399 +#OL/LI-344,U Rozhledny (Frýdlantský vrch) ,,50.93665720,15.07969810,399 +#OL/LI-345,Horka,,50.66354900,15.09870410,398 +#OL/LI-346,Hrobka,,50.55366000,15.27544000,398 +#OL/LI-347,Na Kamenci,,50.55331000,15.15379000,398 +#OL/LI-348,Rovná Radeč ,,50.54418460,15.16823120,398 +#OL/LI-349,Strážnice ,,50.56538110,14.49745090,398 +#OL/LI-350,Dubová hora ,,50.53996060,14.50878500,397 +#OL/LI-351,Stohánek ,,50.67419000,14.84281000,397 +#OL/LI-352,Malý Beškovský vrch ,,50.52328590,14.58728130,395 +#OL/LI-353,Rač ,,50.51030000,14.50918000,394 +#OL/LI-354,Horka,,50.52742540,14.72144440,390 +#OL/LI-355,Zbynský vrch ,,50.55028630,14.61425980,390 +#OL/LI-356,Mlýnský vrch ,,50.88974010,15.02559150,388 +#OL/LI-357,Supí vrch ,,50.91585190,15.09849710,388 +#OL/LI-358,Čáp ,,50.55485340,14.47576670,387 +#OL/LI-359,Ptačí vrch ,,50.71670460,14.74978740,387 +#OL/LI-360,Vysoký vrch ,,50.61984060,14.65474220,387 +#OL/LI-361,Mlýnský vršek ,,50.70898930,14.87219500,386 +#OL/LI-362,Farský vrch ,,50.73339950,14.45541170,384 +#OL/LI-363,Selský vrch ,,50.75930000,14.72159000,384 +#OL/LI-364,Větrný ,,50.99286780,14.97777150,384 +#OL/LI-365,Máselník ,,50.57282030,14.48754280,383 +#OL/LI-366,Spálenisko ,,50.71849730,14.63792570,383 +#OL/LI-367,Kamenný vrch ,,50.52201290,14.57341130,382 +#OL/LI-368,Skalka,,50.56026330,14.62920020,382 +#OL/LI-369,Žákova hora ,,50.56575780,14.50140040,382 +#OL/LI-370,Kozlov,,50.56164820,15.12650240,381 +#OL/LI-371,Mnišská hora ,,50.67209300,14.48487780,381 +#OL/LI-372,Kamenec ,,50.72157600,14.46563540,380 +#OL/LI-373,Písečný vrch ,,50.97534760,15.24487680,380 +#OL/LI-374,Hadí kopec ,,50.91566710,15.13878310,378 +#OL/LI-375,Kraví hora ,,50.63841160,14.57088780,378 +#OL/LI-376,Rarášek ,,50.56864330,14.47053020,377 +#OL/LI-377,Drchlavský vrch ,,50.56347270,14.52265980,376 +#OL/LI-378,Štrausův vrch ,,50.62874000,14.61384000,376 +#OL/LI-379,Skaliska,,50.50291990,14.49472980,375 +#OL/LI-380,Šroubený ,,50.59431590,14.63627950,375 +#OL/LI-381,Zámecký kopec ,,50.78481130,14.96879150,375 +#OL/LI-382,Pomahačův vrch ,,50.75457000,14.59618000,373 +#OL/LI-383,Vraní vrch ,,50.90254760,15.01405070,373 +#OL/LI-384,Malý Borný ,,50.59434680,14.67086560,372 +#OL/LI-385,Mariánský vrch ,,50.56817000,14.52894000,372 +#OL/LI-386,Obora,,50.69666710,14.62801250,371 +#OL/LI-387,Bukový kopec ,,50.67775130,14.80909920,370 +#OL/LI-388,Malý vrch ,,50.53368000,15.20108000,368 +#OL/LI-389,Ortles (Kupka,,14.43645470,364,Petrova Zahrádka) ,,50.72196530,14.79078620,364 +#OL/LI-391,Strážný ,,50.67287740,14.71277260,362 +#OL/LI-392,Nad Vodárnou ,,50.82717590,14.85869640,358 +#OL/LI-393,Malý Radechov ,,50.54898930,14.82125020,357 +#OL/LI-394,Kluka,,50.49655960,14.69252520,356 +#OL/LI-395,Mlýnský vrch ,,50.49054530,14.60662640,355 +#OL/LI-396,Skleněný vrch ,,50.64293110,14.47942630,355 +#OL/LI-397,Na Borku,,50.68874950,14.70180330,353 +#OL/LI-398,Pruský kámen ,,50.61197240,14.56140440,351 +#OL/LI-399,Rovné skály ,,50.53160000,15.20989000,350 +#OL/LI-400,Rovné skály ,,50.73080020,14.71604590,348 +#OL/LI-401,Hutník ,,50.69749000,14.84110000,343 +#OL/LI-402,Havířský vrch ,,50.58780560,14.67294540,341 +#OL/LI-403,Puchavec,,50.63134610,14.58667530,341 +#OL/LI-404,Rožec ,,50.60767030,14.56528840,340 +#OL/LI-405,Štemberk ,,51.00026190,15.06452970,340 +#OL/LI-406,Čertova zeď ,,50.63308670,14.77590980,337 +#OL/LI-407,Ptačí vršek ,,50.67509460,14.68015150,337 +#OL/LI-408,Kohout,,50.59665000,14.58257000,336 +#OL/LI-409,Šiška ,,50.51159250,14.48719040,336 +#OL/LI-410,Vřesovský kopec ,,50.50890000,14.69143000,311 +#OL/LI-411,Ochranný hřeben ,,50.51909840,14.70005240,331 +#OL/LI-412,Bahno,,50.60912280,14.70807310,328 +#OL/LI-413,Stráž ,,50.53986630,14.47085250,328 +#OL/LI-414,Židovský vrch ,,50.52611220,14.68601280,328 +#OL/LI-415,Hůrka ,,50.67611480,14.55288130,327 +#OL/LI-416,Suchý vrch ,,50.92645890,15.04817830,326 +#OL/LI-417,Zlatý vrch ,,50.57143580,14.74389240,324 +#OL/LI-418,Židovský vršek ,,50.69070860,14.60993820,323 +#OL/LI-419,Dubová hora ,,50.58229190,14.74044350,321 +#OL/LI-420,Liščí vrch ,,50.65182390,14.69479460,321 +#OL/LI-421,Mlýnský vrch ,,50.68588660,14.48042330,321 +#OL/LI-422,Tvarožník ,,50.62155000,14.68056000,321 +#OL/LI-423,Hájka ,,50.53016000,14.47413000,320 +#OL/LI-424,Jelení vrch ,,50.62944010,14.66530440,320 +#OL/LI-425,Kaplanka,,50.52247000,14.52436000,316 +#OL/LI-426,Královský kámen ,,50.56186490,14.68441990,315 +#OL/LI-427,Deštenský vrch ,,50.53021450,14.51802900,313 +#OL/LI-428,Hradec,,50.97710480,15.04877200,313 +#OL/LI-429,Víšek ,,50.60257360,14.73739280,308 +#OL/LI-430,Jelení vršek ,,50.64457640,14.67515390,307 +#OL/LI-431,Čížalka ,,50.52719500,14.66162640,306 +#OL/LI-432,Kamenáč ,,50.96429810,15.05183450,303 +#OL/LI-433,Holý vrch ,,50.68128870,14.51535090,301 +#OL/LI-434,Pohanské kameny ,,50.97351610,15.02119370,297 +#OL/LI-435,Viničný vršek ,,50.68346770,14.57602590,292 +#OL/LI-436,Dědek ,,50.60492040,14.60103840,270 +#OL/LI-437,Nademlýnský vrch ,,50.99616620,15.05494800,263 +#OL/LI-438,Zadní Žalý ,,50.66517050,15.56880120,1036 +#OL/LI-439,Kozlí hřbet ,,50.72833650,15.55789060,1034 +#OL/LI-440,Šeřín ,,50.69640240,15.56347270,1027 +#OL/MO-001,Veselský kopec ,,49.64609146,17.80825996,557 +#OL/MO-002,Suchá ,,49.68392944,17.75428009,578 +#OL/MO-003,Horní Buková ,,49.68119049,17.77725029,542 +#OL/MO-004,Vladař ,,49.68542862,17.84679985,467 +#OL/MO-005,Chrastavec,,49.70500183,17.80460930,532 +#OL/MO-006,Svinec,,49.56685257,17.98382950,546 +#OL/MO-007,Petřkovická hora ,,49.54452515,17.96376228,608 +#OL/MO-008,Dlouhý kopec ,,49.54929352,17.97180748,585 +#OL/MO-009,Strážnice ,,49.55515671,17.98770714,545 +#OL/MO-010,Stranický kopec ,,49.55826950,17.99572563,529 +#OL/MO-011,Homole,,49.56081009,18.01317024,434 +#OL/MO-012,Palackého vrch ,,49.56787872,18.01843262,420 +#OL/MO-013,Nořičí hora ,,49.50770569,18.27084160,1047 +#OL/MO-014,Velká Stolová ,,49.51147842,18.30091095,1046 +#OL/MO-015,Malá Stolová ,,49.50919342,18.31560516,1009 +#OL/MO-016,Malý Smrček ,,49.51534653,18.34734726,711 +#OL/MO-017,Smrček ,,49.52167892,18.36453056,858 +#OL/MO-018,Malý Smrk ,,49.51031494,18.38668633,1174 +#OL/MO-019,Ostrá hora ,,49.55706787,18.39979744,783 +#OL/MO-020,Staškov ,,49.56271744,18.40500450,752 +#OL/MO-021,Tribulka,,49.55028534,18.41083145,691 +#OL/MO-022,Čupel ,,49.52368164,18.42531586,943 +#OL/MO-023,Hradová ,,49.57620621,18.41643906,717 +#OL/MO-024,Kykulka,,49.57363129,18.43623734,996 +#OL/MO-025,Kyčera ,,49.58835220,18.43942451,906 +#OL/MO-026,Řehucí ,,49.52232361,18.46602058,872 +#OL/MO-027,Huserka,,49.53111267,18.48403168,929 +#OL/MO-028,Čupel ,,49.62888336,18.50530243,873 +#OL/MO-029,Kyčera ,,49.63966751,18.52145004,769 +#OL/MO-030,Kyčera u Morávky ,,49.59559250,18.55042648,834 +#OL/MO-031,Lipí ,,49.61966324,18.53820992,902 +#OL/MO-032,Ropička ,,49.61617661,18.55737877,918 +#OL/MO-033,Příslop ,,49.60748291,18.57265472,946 +#OL/MO-034,Velký Lipový ,,49.59975433,18.57448959,999 +#OL/MO-035,Smrčina ,,49.58682251,18.61131859,1015 +#OL/MO-036,Kalužný ,,49.57289124,18.62570953,994 +#OL/MO-037,Babí vrch ,,49.56177902,18.62155151,952 +#OL/MO-038,Mizerov,,49.55746460,18.61105347,965 +#OL/MO-039,Okrouhlice,,49.50776970,18.46863830,832 +#OL/MO-040,Godula,,49.64960098,18.55049896,738 +#OL/MO-041,Gutský vršek ,,49.63663864,18.59240341,742 +#OL/MO-042,Podgruň ,,49.63548279,18.61032104,710 +#OL/MO-043,Malý Javorový ,,49.62792206,18.62744331,947 +#OL/MO-044,Malý Kozinec ,,49.61563492,18.67382050,654 +#OL/MO-045,Žďár ,,49.60880661,18.67446899,748 +#OL/MO-046,Skalka,,49.60587311,18.68535233,649 +#OL/MO-047,Velká Kykula ,,49.59436035,18.67547989,811 +#OL/MO-048,Ondřejník ,,49.58466339,18.31301308,890 +#OL/MO-049,Na Příčnici ,,49.56817627,18.27724266,533 +#OL/MO-050,Ostružná ,,49.64263153,18.28350449,616 +#OL/MO-051,Kabátice ,,49.64263153,18.28350449,601 +#OL/MO-052,Babí hora ,,49.63529205,18.25056076,619 +#OL/MO-053,Přední Babí hora ,,49.63846588,18.24477386,586 +#OL/MO-054,Zadní Babí hora ,,49.63311005,18.23950768,546 +#OL/MO-055,Bačův kopec ,,49.61300278,18.25724602,532 +#OL/MO-056,Hradisko ,,49.61307526,18.25017548,507 +#OL/MO-057,Skalka,,49.60707092,18.24261856,412 +#OL/MO-058,Kazničov ,,49.60702896,18.22002792,601 +#OL/MO-059,Vrchy,,49.63187408,18.20172119,425 +#OL/MO-060,Větřkovická hůrka ,,49.60940933,18.19507027,390 +#OL/MO-062,Kabuďův vrch ,,49.60419846,18.19497871,370 +#OL/MO-063,Kamenice,,49.59157181,18.22810173,447 +#OL/MO-064,Tábor ,,49.58553314,18.24679947,472 +#OL/MO-065,Na Vrchu,,49.58002853,18.22951126,467 +#OL/MO-066,Tichavská hůrka ,,49.58175278,18.20310783,542 +#OL/MO-067,Holý vrch ,,49.58543015,18.18126869,487 +#OL/MO-068,Pískovna ,,49.58402252,18.11237717,511 +#OL/MO-070,Libhošťská hůrka ,,49.61037827,18.07587242,494 +#OL/MO-071,Na Horách ,,49.62537766,18.32566643,453 +#OL/MO-072,Metylovická hůrka ,,49.61956787,18.34335518,524 +#OL/MO-073,Hůrky ,,49.62799454,18.35243034,417 +#OL/MO-074,Místecký les ,,49.64914703,18.33860779,345 +#OL/MO-075,Kozubová ,,49.56696830,18.67265190,982 +#OL/MO-076,Okrouhlá ,,49.68076324,18.27744293,373 +#OL/MO-077,Řepník ,,49.67852783,18.30013466,331 +#OL/MO-078,Štandl,,49.67613983,18.31745529,350 +#OL/MO-079,Kamenná ,,49.69169617,18.27103615,381 +#OL/MO-080,Hončova hůrka ,,49.65995407,18.15426636,338 +#OL/MO-081,Na Výšině ,,49.67148209,18.14255142,324 +#OL/MO-082,Peklisko,,49.64538956,18.10123062,306 +#OL/MO-083,Těšínočka ,,49.49683100,18.45294530,919 +#OL/MO-084,Lučovec ,,49.43706131,18.38627052,908 +#OL/MO-085,Rožnovský vrch ,,49.44371414,18.39511871,902 +#OL/MO-086,Lučkov ,,49.43465424,18.40704727,793 +#OL/MO-087,Magurka,,49.48084641,18.31577301,1067 +#OL/MO-088,Blato,,49.46261978,18.31828308,938 +#OL/MO-089,Ráztočky ,,49.46410370,18.35394287,716 +#OL/MO-090,Okrouhlice,,49.41278076,18.39634705,743 +#OL/MO-091,Malý Čistý ,,49.40656662,18.41646194,864 +#OL/MO-092,Kyčera ,,49.41983795,18.42370033,834 +#OL/MO-093,Klín ,,49.42327881,18.43445015,820 +#OL/MO-094,Ježule ,,49.41952133,18.45517921,760 +#OL/MO-095,Hluchanka,,49.40481567,18.44930649,744 +#OL/MO-096,Javořina ,,49.44973755,18.43550873,832 +#OL/MO-097,Klubovec,,49.46182632,18.39744759,838 +#OL/MO-098,Zbojnická ,,49.43639374,18.46489906,774 +#OL/MO-099,Šorštýn ,,49.44985199,18.47410965,709 +#OL/MO-100,Skalka,,49.45067978,18.48592567,685 +#OL/MO-101,Stupný ,,49.45891953,18.49708366,601 +#OL/MO-102,Stráž ,,49.71453094,17.72980499,548 +#OL/MO-103,Stanovec,,49.56105804,18.30916023,899 +#OL/MO-104,Kozí hřbet ,,49.51938470,18.60650280,986 +#OL/MO-105,Malý Javorník ,,49.51648140,18.17297590,838 +#OL/MO-106,Lyra,,50.09644320,17.29126710,1092 +#OL/MO-107,Vysoká hora ,,50.09731400,17.35205380,1031 +#OL/MO-108,Hradečná ,,50.06864410,17.29055660,1057 +#OL/MO-109,Sokol,,50.09522070,17.24892430,1187 +#OL/MO-110,Na Spáleném ,,50.16584490,17.44324920,794 +#OL/MO-111,Vápenný vrch ,,49.83012570,17.24817210,626 +#OL/MO-112,V Javořinách ,,50.01315370,17.28730230,850 +#OL/MO-113,Na Haldě ,,49.82250150,17.64809880,562 +#OL/MO-114,Oldřichov ,,50.13357720,17.56221000,652 +#OL/MO-115,Hraniční vrch ,,50.17172610,17.60427960,536 +#OL/MO-116,Vysoká ,,50.26634760,17.57446760,451 +#OL/MO-117,Velký kopec ,,50.24370510,17.57493020,452 +#OL/OL-001,Hůrka ,,49.54177475,17.74879265,370 +#OL/OL-002,Křivý ,,49.52569962,17.69659042,410 +#OL/OL-003,Na kopcích ,,49.50297928,17.64411926,448 +#OL/OL-004,Pavelák ,,49.49357986,17.66316986,367 +#OL/OL-005,Hluzovský kopec ,,49.55187988,17.78364944,337 +#OL/OL-006,Vrchy,,49.60126877,17.74970055,455 +#OL/OL-007,Okrouhlík ,,49.61251831,17.72223091,507 +#OL/OL-008,Skalka,,49.59431076,17.68473053,491 +#OL/OL-009,Kopánky ,,49.57603073,17.60857964,584 +#OL/OL-010,Studená ,,49.60203934,17.62520027,626 +#OL/OL-011,Zelený kříž ,,49.61204147,17.56052971,661 +#OL/OL-012,Dobytčí vrch ,,49.58583832,17.55488968,600 +#OL/OL-013,Perná ,,49.60110092,17.61355019,611 +#OL/OL-014,Na Vartě ,,49.65713120,17.73715973,576 +#OL/OL-015,Červená hora ,,50.14427567,17.13577652,1333 +#OL/OL-016,Lysý vrch ,,50.13822174,17.23571396,1128 +#OL/OL-017,Rudná hora ,,50.04655838,17.11601257,915 +#OL/OL-018,Kopřivný ,,50.23146439,17.10175323,823 +#OL/OL-019,Raškovská bouda ,,50.06309509,16.89607620,801 +#OL/OL-020,Žárovec ,,50.06831360,17.01355743,793 +#OL/OL-021,Petrovský vrch ,,49.99403763,17.07151222,778 +#OL/OL-022,Smrk,,50.03238678,16.95999527,742 +#OL/OL-023,Křemenáč ,,50.28731537,17.22483635,735 +#OL/OL-024,Háj ,,49.97087097,16.93361855,631 +#OL/OL-025,Kamenitý kopec ,,50.02728271,17.06333542,616 +#OL/OL-026,Sklenný vrch ,,49.98758698,16.90627480,609 +#OL/OL-027,Michalův vrch (Michalův kopec) ,,49.92857361,16.98398399,507 +#OL/OL-029,Holý kopec ,,49.38599014,17.50178528,360 +#OL/OL-030,Zahradnická Hůrka ,,49.58421326,17.66996956,512 +#OL/OL-031,Varta,,49.66834259,17.75304031,591 +#OL/OL-032,Zlatý Chlum ,,50.23793793,17.23746490,875 +#OL/OL-033,Klín ,,50.20813751,17.05148315,983 +#OL/OL-034,Travná hora ,,50.21854401,17.01560020,1128 +#OL/OL-035,Skály,,49.49139100,16.79724940,724 +#OL/PA-001,Hraniční skály ,,50.18811000,16.80912000,1319 +#OL/PA-002,Podbělka ,,50.16489620,16.84823620,1308 +#OL/PA-003,Hleďsebe ,,50.17178610,16.79898160,1190 +#OL/PA-004,Klepáč (Klepý) ,,50.15694970,16.79052850,1144 +#OL/PA-005,Bradlo,,50.05419470,16.68728850,988 +#OL/PA-006,Jelení vrch ,,50.14438490,16.78171730,936 +#OL/PA-007,Jeřábek ,,50.02125570,16.70087660,900 +#OL/PA-008,Prostřední vrch ,,50.03739760,16.70418410,871 +#OL/PA-009,Bouda,,50.07188950,16.68030690,845 +#OL/PA-010,Vysoký kámen ,,50.07935990,16.65619130,843 +#OL/PA-011,Jeřábek ,,50.04944030,16.79552010,838 +#OL/PA-012,Větrný vrch ,,50.12995000,16.78689000,807 +#OL/PA-013,Hora Matky Boží ,,50.07433000,16.78245000,800 +#OL/PA-014,Špičák ,,49.98540000,16.71462000,798 +#OL/PA-015,Maliník ,,50.12266000,16.81840000,796 +#OL/PA-016,Na Hoblovně ,,50.00372720,16.67413310,794 +#OL/PA-017,Val,,50.07201490,16.79217050,790 +#OL/PA-018,Javorně ,,50.05619960,16.65171940,781 +#OL/PA-019,Lískovec ,,50.06922040,16.77736500,778 +#OL/PA-020,Milovské Perničky ,,49.69597380,16.09111130,757 +#OL/PA-021,Holý vrch ,,49.70839520,16.10914330,756 +#OL/PA-022,Kaštánkův kopec ,,49.71864890,16.11292840,753 +#OL/PA-023,Na Vyhlídce ,,50.12518160,16.76225620,753 +#OL/PA-024,Landrátský kopec ,,49.69828090,16.15556250,742 +#OL/PA-025,Výčnělek ,,50.13525560,16.75036770,741 +#OL/PA-026,Navrátilův kopec ,,49.61988160,16.29653290,737 +#OL/PA-027,Vyhlídka ,,50.08574660,16.79296220,737 +#OL/PA-028,Křížová hora ,,50.03836000,16.75784620,735 +#OL/PA-029,Na Vrších ,,49.99093690,16.69271920,735 +#OL/PA-030,Blatinský kopec ,,49.71884070,16.14128940,731 +#OL/PA-031,Bulík ,,50.02055850,16.66209790,729 +#OL/PA-032,Kamenáč ,,50.05370790,16.76595090,729 +#OL/PA-033,Přední hraniční vrch ,,49.69134100,16.16771030,721 +#OL/PA-035,Veselka,,50.09499430,16.78821790,718 +#OL/PA-036,Peškův vrch ,,49.72016920,16.01806880,717 +#OL/PA-037,U Jamek,,49.64033630,16.27546860,713 +#OL/PA-038,Zadní hraniční vrch ,,50.11083750,16.64631150,712 +#OL/PA-039,Hejnov,,50.07259100,16.63113770,711 +#OL/PA-040,Martinova Hať ,,50.03564920,16.65597170,711 +#OL/PA-041,Výprachtický vrch ,,49.99280530,16.67553970,703 +#OL/PA-042,Panský vrch ,,49.59761190,16.39237150,700 +#OL/PA-043,Přední Hradiště ,,49.73912850,15.89166890,693 +#OL/PA-044,Bezděk ,,49.65562230,16.24957080,690 +#OL/PA-045,Bučina ,,50.11845350,16.58244810,677 +#OL/PA-046,Roudný ,,50.11214070,16.75623850,677 +#OL/PA-047,Vojtěchův kopec ,,49.72863760,15.97894960,674 +#OL/PA-048,Stanov,,49.73415440,16.17501000,670 +#OL/PA-049,Výšina ,,50.09562540,16.76816270,666 +#OL/PA-050,Roh,,49.72443710,16.58580640,660 +#OL/PA-051,Jelínek ,,49.69122890,16.24746090,654 +#OL/PA-052,Na Skalce,,49.96749470,16.70634380,653 +#OL/PA-053,Polní vrch (Homole) ,,50.16233710,16.49070270,653 +#OL/PA-054,Klusákův vrch ,,49.58153770,16.40353480,652 +#OL/PA-055,Dvorský vrch ,,50.03211170,16.77124680,650 +#OL/PA-056,Stráně ,,49.92797150,16.72941520,645 +#OL/PA-057,Mirand,,49.82969400,16.57144720,640 +#OL/PA-058,Na Kopci,,49.67493450,16.22004340,638 +#OL/PA-059,Velký Stanov ,,49.72887820,16.20874010,637 +#OL/PA-060,Ostrý vrch ,,49.60694320,16.79977860,636 +#OL/PA-061,Hřebcov ,,49.77063780,16.58036940,635 +#OL/PA-062,Na Lunáku ,,49.68463500,16.15473990,624 +#OL/PA-063,Na Zmrzlíku ,,50.14238510,16.52277630,624 +#OL/PA-064,Hřebečov ,,49.75326600,16.58252590,623 +#OL/PA-065,Na Vrších ,,50.08879390,16.57817170,620 +#OL/PA-066,Varta,,49.96230690,16.65593570,620 +#OL/PA-067,Šibeniční vrch ,,49.70136320,16.25853760,615 +#OL/PA-068,Strážný vrch ,,49.78678710,16.58078370,610 +#OL/PA-069,Šibeniční vrch ,,50.08901770,16.62196510,607 +#OL/PA-070,Janůvské čihadlo ,,49.67852690,16.58575410,606 +#OL/PA-071,Dvorní ,,49.67776570,16.20392400,601 +#OL/PA-072,Pavlovy vrchy,,50.01619630,16.65011000,595 +#OL/PA-073,Dvorská ,,49.72800040,16.67017880,594 +#OL/PA-074,Mladějovské hradisko ,,49.82177460,16.57702980,591 +#OL/PA-075,Na Vartě ,,50.00473880,16.62063390,588 +#OL/PA-076,Na Vypáleném ,,49.63585480,16.78347610,588 +#OL/PA-077,Ousov,,49.68449670,16.81043240,587 +#OL/PA-078,Strážný ,,49.97964860,16.47606640,584 +#OL/PA-079,Kraví hora ,,49.67345670,16.66248820,583 +#OL/PA-080,Zadní hory ,,50.00704240,16.52502660,511 +#OL/PA-081,Slídový vrch ,,49.70518540,16.66040870,577 +#OL/PA-082,Velká pláň ,,49.85738250,16.54585450,571 +#OL/PA-083,Sněžník ,,49.79180450,16.39533340,569 +#OL/PA-084,Krkanka,,49.89601760,15.57487100,567 +#OL/PA-085,U Pomníku letců ,,49.71573780,16.66221130,567 +#OL/PA-086,Obora,,49.97078830,16.66038270,566 +#OL/PA-087,Na Hranicích ,,49.86661560,15.67025780,565 +#OL/PA-088,Kumperk,,49.64166950,16.66611490,564 +#OL/PA-089,Kameník ,,49.62799400,16.78922670,562 +#OL/PA-090,Javorník ,,49.91217610,16.41060160,561 +#OL/PA-091,Plániva ,,49.69658880,16.77893110,559 +#OL/PA-092,Hůrka u České Rybné ,,49.93483620,16.36605710,557 +#OL/PA-094,Olšina ,,49.82822600,15.65159620,556 +#OL/PA-095,Kamenný vrch ,,49.87089120,16.43400370,554 +#OL/PA-096,Dubina,,49.77544700,16.68092100,553 +#OL/PA-097,Na Bivole,,49.64379670,16.77534400,552 +#OL/PA-098,Hamerky,,49.67914810,16.83420200,551 +#OL/PA-099,Černý vrch ,,49.65979030,16.80616190,550 +#OL/PA-100,Kamenná hora ,,49.64957490,16.77572040,550 +#OL/PA-101,Sušice ,,49.69152430,16.83457080,549 +#OL/PA-102,Žampach ,,50.04076000,16.42794000,546 +#OL/PA-103,Kozinec,,50.05330080,16.41649530,544 +#OL/PA-104,Proklest,,49.62035670,16.78166410,544 +#OL/PA-105,Arnoštovský vrch ,,49.69046260,16.65585820,538 +#OL/PA-106,Kozinec,,49.75702700,16.76425810,538 +#OL/PA-107,Kršňákův kopec ,,49.72826050,16.65708840,536 +#OL/PA-108,Kletná ,,50.08565600,16.37212890,535 +#OL/PA-109,Padělky ,,49.61818620,16.51877920,534 +#OL/PA-110,Pastvina,,49.92669150,16.65691640,531 +#OL/PA-111,Zlatá hora ,,49.96386800,16.47497020,531 +#OL/PA-112,Pilátka ,,50.04681470,16.40399880,530 +#OL/PA-113,Spálený vrch ,,49.71594740,16.68752250,529 +#OL/PA-114,Ducháčkův vrch ,,49.60367320,16.45250180,528 +#OL/PA-115,Podhoří ,,49.98631520,16.36349710,528 +#OL/PA-116,Kopaniny,,49.99308270,16.46927830,527 +#OL/PA-117,Psí kuchyně ,,49.84330590,16.44762490,526 +#OL/PA-118,Zbohovský kopec ,,49.83032970,15.62231340,526 +#OL/PA-119,Přím ,,50.07585240,16.41481170,523 +#OL/PA-120,Člup ,,49.59232280,16.52647200,519 +#OL/PA-121,Světlík ,,49.70167650,16.69645880,518 +#OL/PA-122,Okolník ,,49.95505200,16.63346420,516 +#OL/PA-123,Hůrka ,,50.11597480,16.45854500,515 +#OL/PA-124,Nad Boršovem ,,49.74615310,16.66388910,515 +#OL/PA-125,Na Kříbu ,,49.61720170,16.42355360,514 +#OL/PA-126,Varta,,49.98398120,16.54399410,508 +#OL/PA-127,Vilamovský kopec ,,49.94366960,16.34289140,508 +#OL/PA-128,Na Vrších ,,50.06046400,16.43813890,507 +#OL/PA-129,Hliník ,,50.01583070,16.32820730,506 +#OL/PA-130,Lysina,,49.96862290,16.33176030,506 +#OL/PA-131,Maštale ,,49.81736110,16.14388320,501 +#OL/PA-132,Horka,,49.73764870,16.70437480,499 +#OL/PA-133,Krejsův kopec ,,50.11444860,16.49089360,497 +#OL/PA-134,Brtečník ,,50.03546780,16.33818890,496 +#OL/PA-135,Na Veselíčku ,,50.09988150,16.50453650,492 +#OL/PA-136,Skála ,,49.91602000,15.56671000,490 +#OL/PA-137,Líšnice ,,49.66567650,16.69531710,489 +#OL/PA-138,Homole,,49.72724480,16.77422350,488 +#OL/PA-139,Kubincův kopec ,,49.97859200,16.37466030,487 +#OL/PA-140,Zlatý vrch ,,49.67290730,16.68059910,486 +#OL/PA-141,Na Kozinci,,49.82286350,16.11832050,485 +#OL/PA-142,Zakopanka,,50.06847180,16.51014920,485 +#OL/PA-143,Velký hájek ,,50.07414660,16.49422740,484 +#OL/PA-144,Hrklice,,50.01832100,16.50718030,483 +#OL/PA-145,Na Dubovce,,50.02954510,16.54824730,479 +#OL/PA-146,Strážný ,,49.75231530,16.69056140,479 +#OL/PA-147,Velká Huba ,,49.85479580,16.73256140,479 +#OL/PA-148,Doubravice,,49.72194800,16.73434900,477 +#OL/PA-149,Hradisko,,49.67207430,16.78552120,474 +#OL/PA-150,Kobylí hlava ,,49.87403860,15.58858290,470 +#OL/PA-151,Homole,,49.87224550,16.75531480,463 +#OL/PA-152,Habřina ,,50.04226380,16.37239980,457 +#OL/PA-153,Hradní kopec ,,50.08576000,16.35164000,451 +#OL/PA-154,Kypuš ,,49.92263250,16.57379820,450 +#OL/PA-155,Jarovice,,49.71371750,16.80208550,448 +#OL/PA-156,Kamenec,,49.84176090,16.14323490,447 +#OL/PA-157,Sekorník ,,49.70177360,16.82494340,446 +#OL/PA-158,U Vlčí jámy ,,50.11381000,16.41248920,440 +#OL/PA-159,Lískovec ,,49.72378040,16.78425390,438 +#OL/PA-160,Hejk,,49.64256000,16.74718000,434 +#OL/PA-161,Ostrý ,,49.74639370,16.69690760,434 +#OL/PA-162,Kostelecká hůra ,,49.85671350,15.94953620,432 +#OL/PA-163,Zlatník ,,49.78776200,16.66278580,430 +#OL/PA-164,Hůra ,,49.93346490,16.42030860,428 +#OL/PA-165,Křížový vrch ,,49.75783400,16.67475800,427 +#OL/PA-166,Cimburk - ruins,,49.70872910,16.73287950,420 +#OL/PA-167,Kozinec,,49.85631700,16.09638730,419 +#OL/PA-168,Radkovské hradisko ,,49.74769480,16.73776580,384 +#OL/PA-169,Roveň ,,49.99407830,16.33324470,378 +#OL/PA-170,V Paletíně ,,49.87913570,16.06065910,377 +#OL/PA-171,Chlum,,50.05270290,16.25010280,366 +#OL/PA-172,Chlum,,49.98360440,16.22258860,354 +#OL/PA-173,Homole,,50.13478300,15.99224960,296 +#OL/PA-174,Vrchboř ,,50.16011500,15.90350800,294 +#OL/PA-175,Žernov ,,50.09299020,15.93893050,276 +#OL/PA-176,Borkovský kopec ,,50.13536990,15.84841310,252 +#OL/PL-001,Svaroh,,49.17385101,13.16644955,1334 +#OL/PL-002,Studená hora ,,48.97943115,13.46343040,1299 +#OL/PL-003,Ostrý (Velký Ostrý) ,,49.20296860,13.11032009,1293 +#OL/PL-004,Jezernice,,49.07161713,13.42741203,1266 +#OL/PL-005,Čertův vrch ,,49.00270844,13.53426647,1244 +#OL/PL-006,Skalka ,,49.07928848,13.38882542,1238 +#OL/PL-007,Dřevěná hůl ,,49.11560440,13.34116364,1206 +#OL/PL-008,Habr,,49.19188690,13.25307655,1203 +#OL/PL-009,Špičák ,,49.17299652,13.20862865,1202 +#OL/PL-010,Sklářský vrch ,,49.14324570,13.28264999,1195 +#OL/PL-011,Březová hora ,,49.03327942,13.54409981,1193 +#OL/PL-012,Rozvodí ,,49.17523956,13.20009518,1189 +#OL/PL-013,Jedlová ,,49.20694351,13.26385880,1177 +#OL/PL-014,Jelení vrch ,,49.03779984,13.52355003,1176 +#OL/PL-015,Modravská hora ,,49.01372910,13.47945690,1157 +#OL/PL-016,Břemeno ,,49.07298660,13.55421734,1156 +#OL/PL-017,Lišák ,,49.06509018,13.52552032,1113 +#OL/PL-018,Hůrecký vrch ,,49.13522720,13.33941269,1099 +#OL/PL-019,Lovečná ,,49.21916580,13.12049484,1092 +#OL/PL-020,Adamova hora,,49.04032135,13.48203945,1078 +#OL/PL-021,Prenet,,49.23550415,13.21120358,1071 +#OL/PL-022,Ždánov ,,49.15181732,13.60338020,1065 +#OL/PL-023,Výběžek ,,49.04920578,13.47892189,1027 +#OL/PL-024,Lomničky ,,49.23361206,13.09291172,1026 +#OL/PL-025,Tok,,49.15714264,13.27810955,1023 +#OL/PL-026,Kostelní vrch ,,49.06570816,13.46708012,1016 +#OL/PL-027,Větrný ,,49.09359000,13.40802000,1014 +#OL/PL-028,Spálený ,,49.09080505,13.46844673,1013 +#OL/PL-029,Malý Prenet ,,49.24261856,13.20127392,1006 +#OL/PL-030,Březník ,,49.14945984,13.42549801,1006 +#OL/PL-031,Skalka,,49.38212204,12.77719593,1005 +#OL/PL-032,Na Výšině ,,49.22786713,13.11994457,1005 +#OL/PL-033,Sup,,49.20249557,13.29377842,1001 +#OL/PL-034,Gerlova paseka,,49.17058945,13.32143688,996 +#OL/PL-035,Slunečná ,,49.11407852,13.40184021,996 +#OL/PL-036,Kamenáč ,,49.19528580,13.38286400,989 +#OL/PL-037,Malý Čerchov ,,49.38180161,12.79304028,988 +#OL/PL-038,Na Hofmanově mlýně ,,49.17554855,13.35371017,984 +#OL/PL-039,Plošina ,,49.24773026,13.25781155,972 +#OL/PL-040,Svinenský vrch ,,49.21622467,13.34702682,970 +#OL/PL-041,Dlouhá skála ,,49.37006760,12.77520466,969 +#OL/PL-042,Malinová hora ,,49.38668823,12.77600002,963 +#OL/PL-043,Chlum,,49.14334869,13.58727360,962 +#OL/PL-044,U Školky ,,49.15619278,13.30645180,954 +#OL/PL-045,Rýzmberk ,,49.20800018,13.19648933,942 +#OL/PL-046,Smrčí ,,49.36099243,12.78244591,935 +#OL/PL-047,Sedelský vrch ,,49.10094833,13.47887611,926 +#OL/PL-048,Skalka,,49.39117813,12.76146030,925 +#OL/PL-049,Zámecký vrch ,,49.15969467,13.57638454,921 +#OL/PL-050,Ve Vrchách,,49.07684326,13.46296024,908 +#OL/PL-051,Radkovský vrch ,,49.13695908,13.48921013,907 +#OL/PL-052,Pálenka ,,49.22302628,13.36459923,898 +#OL/PL-053,Havran,,49.74329376,12.40880299,894 +#OL/PL-054,Teleček ,,49.25136185,13.33815765,886 +#OL/PL-055,Hamerský vrch ,,49.22527695,13.30134487,883 +#OL/PL-056,Haltrava,,49.44207764,12.76620770,882 +#OL/PL-057,Kamenitý ,,49.13021851,13.39243984,877 +#OL/PL-058,Vosík ,,49.20105743,13.40980244,873 +#OL/PL-059,Nadějov ,,49.17851257,13.57353973,873 +#OL/PL-060,Lysá ,,49.48864746,12.71868420,870 +#OL/PL-061,Kolářova hora ,,49.23501205,13.36233521,867 +#OL/PL-062,Velký Zvon ,,49.55026245,12.63672638,862 +#OL/PL-063,Bučina ,,49.42355728,12.77620602,860 +#OL/PL-064,Sádek ,,49.42950058,12.78211689,854 +#OL/PL-065,Hamižná ,,49.16268921,13.45242977,853 +#OL/PL-066,Jakubice,,49.15768051,13.44787025,853 +#OL/PL-067,Velká skála ,,49.46321869,12.74129963,852 +#OL/PL-068,Malý Zvon ,,49.53469849,12.63946724,848 +#OL/PL-069,Nad Rejštejnem ,,49.13025665,13.51899433,848 +#OL/PL-070,Sádkova skála ,,49.43400955,12.77381039,847 +#OL/PL-071,Lídlovský kopec ,,49.12569046,13.56189632,834 +#OL/PL-072,Dobřemilický vrch ,,49.25560760,13.32812023,833 +#OL/PL-073,Malečská hora ,,49.17899704,13.67759132,833 +#OL/PL-074,Hvězdník ,,49.26580429,13.28257847,824 +#OL/PL-075,Vršek ,,49.21952820,13.37690926,820 +#OL/PL-076,Zahrádka ,,49.26710892,13.32234287,819 +#OL/PL-077,Bezděkovský kopec ,,49.17602539,13.42630196,819 +#OL/PL-078,Tetřeví vrch ,,49.77145386,12.44874859,815 +#OL/PL-079,Mraveniště ,,49.76179504,12.41881466,813 +#OL/PL-080,Vinice,,49.14397430,13.53372383,812 +#OL/PL-081,Kokšův vrch ,,49.17302704,13.58983231,807 +#OL/PL-082,Šibeniční vrch ,,49.14237595,13.54375362,805 +#OL/PL-083,Nuzerovská Stráž ,,49.19358444,13.46922874,802 +#OL/PL-084,Pleš ,,49.54786301,12.59893036,794 +#OL/PL-085,Lišák ,,49.13652802,13.56531239,794 +#OL/PL-086,Velká skála ,,49.51962280,12.65180111,792 +#OL/PL-087,Květná skalina ,,49.40645981,12.74808025,790 +#OL/PL-088,Volšovská stráž ,,49.20925903,13.46797562,790 +#OL/PL-089,Tišina ,,49.86890411,12.54555035,787 +#OL/PL-090,Háj ,,49.27651978,13.36728954,777 +#OL/PL-091,Seč ,,49.73073578,12.48552513,772 +#OL/PL-092,Štádlerův kopec ,,49.71953964,12.48366165,772 +#OL/PL-093,Želivský vrch ,,49.28035355,13.21222210,770 +#OL/PL-094,Na Skalkách - Šelmberk ruins ,,49.86518097,12.56015682,768 +#OL/PL-096,Křížovka ,,49.25976563,13.43474579,765 +#OL/PL-097,Sklářský vrch ,,49.74316788,12.50465012,763 +#OL/PL-098,Hora,,49.40814972,13.07678223,760 +#OL/PL-099,Vidhošť ,,49.30866623,13.46973801,759 +#OL/PL-100,Rozsocha,,49.76451874,12.59187984,758 +#OL/PL-101,Šibeník ,,49.66421509,12.67722034,757 +#OL/PL-102,Kaltský vrch ,,49.23674393,13.43008804,757 +#OL/PL-103,Stráž ,,49.20314407,13.46816444,755 +#OL/PL-104,Mýtný vrch ,,49.73146057,12.50913620,753 +#OL/PL-105,Vrchy,,49.21591568,13.40163612,753 +#OL/PL-106,Stráž ,,49.51816177,12.70448780,752 +#OL/PL-107,Kameňák ,,49.27078629,13.05221462,751 +#OL/PL-108,Kamenný vrch ,,49.85763550,12.54027748,750 +#OL/PL-109,U Svícnové jedle ,,49.56031418,12.60764122,750 +#OL/PL-110,Čertův vrch ,,49.38774872,13.09202099,750 +#OL/PL-111,Pustý vrch ,,49.74156570,12.52727509,745 +#OL/PL-112,V Zálužském lese ,,49.21349716,13.54550934,745 +#OL/PL-113,Borek,,49.75145340,12.56253815,744 +#OL/PL-114,Bláhovsko ,,49.23105621,13.40367508,741 +#OL/PL-115,Kamenný vrch ,,49.61166382,12.66587543,739 +#OL/PL-116,Na Pláni ,,49.19663620,13.68151379,737 +#OL/PL-117,Vápenice ,,49.17950821,13.60507011,734 +#OL/PL-118,Boněnovský vrch ,,49.92312622,12.80947781,732 +#OL/PL-119,Černá skála ,,49.38064194,13.11500263,731 +#OL/PL-120,Javořina ,,49.81408310,12.49599838,730 +#OL/PL-121,Chloumek,,49.72647858,12.52515602,730 +#OL/PL-122,Borovina,,49.16491318,13.52224064,729 +#OL/PL-123,Mlýnský vrch ,,49.74908066,12.44581318,728 +#OL/PL-124,Chocholatý vrch ,,49.20655441,13.58305740,728 +#OL/PL-125,Kalovy,,49.23435593,13.55017185,727 +#OL/PL-126,Kňourek ,,49.71018219,12.47360229,726 +#OL/PL-127,Apolenský vrch ,,49.63437653,12.66440201,726 +#OL/PL-128,Na Vrchu,,49.28798676,13.35276985,726 +#OL/PL-129,Slepičí vrch ,,49.71151733,12.62513351,724 +#OL/PL-130,Rovná ,,49.36833954,13.40165806,724 +#OL/PL-131,Orlovická hora ,,49.32696915,13.08523273,723 +#OL/PL-132,Štokovský vrch ,,49.85044479,12.60230255,722 +#OL/PL-133,Na Větrníku ,,49.18992996,13.43815804,721 +#OL/PL-134,Radeč ,,49.82306290,13.66595650,721 +#OL/PL-135,Pšeniční vrch ,,49.65746307,12.66002655,720 +#OL/PL-136,Nad Zámečkem ,,49.43004990,12.69270992,720 +#OL/PL-137,Výrovna ,,49.24245834,13.41122150,720 +#OL/PL-138,Sepuska,,49.97963715,13.01447487,719 +#OL/PL-139,Malá Doubrava ,,49.42767334,13.20786572,719 +#OL/PL-140,Na Lejmaru,,49.24385834,13.42931271,718 +#OL/PL-141,Mošna ,,49.52516174,12.70913506,717 +#OL/PL-142,Nad Hutí ,,49.54098511,12.65518665,716 +#OL/PL-143,Na Skále ,,49.32970810,13.37703323,716 +#OL/PL-144,Pahorek,,49.24016190,13.41690063,716 +#OL/PL-145,Stráž ,,49.31154251,13.48604870,716 +#OL/PL-146,Peklo,,49.74037170,12.53555012,715 +#OL/PL-147,Na Mštětíně ,,49.21333694,13.69463539,714 +#OL/PL-148,Holý vrch ,,49.74568939,12.55194283,713 +#OL/PL-149,Velký Bítov ,,49.39994431,13.17866135,713 +#OL/PL-150,Studený vrch ,,49.74790955,12.46453381,711 +#OL/PL-151,Polom,,49.77672958,12.57360458,711 +#OL/PL-152,Liščí vrch ,,49.71582413,12.51826096,710 +#OL/PL-153,Oltář ,,49.84968185,12.50150394,710 +#OL/PL-154,Lišák ,,49.30234146,13.06263638,710 +#OL/PL-155,Úlíkovská hora ,,49.43928146,13.05349255,710 +#OL/PL-156,Lískový vrch ,,49.68259048,12.68577194,709 +#OL/PL-157,Výšina ,,49.55823135,12.68214226,708 +#OL/PL-158,Bruskov,,49.28318405,13.31904697,707 +#OL/PL-159,Barák ,,49.38236237,13.39569187,706 +#OL/PL-160,Ovčí kopec ,,49.66595459,12.65651417,705 +#OL/PL-161,Přenýř ,,49.25582886,13.44696426,702 +#OL/PL-162,Huťský vrch ,,49.73080826,12.45748711,701 +#OL/PL-163,Boušový ,,49.34648132,13.40842438,700 +#OL/PL-164,Slunečný vrch ,,49.18726349,13.53090763,699 +#OL/PL-165,Kozí vrch ,,49.45243835,12.66781902,698 +#OL/PL-166,Planina,,49.62874985,12.66367340,698 +#OL/PL-167,Liščín ,,49.41437149,12.74011040,698 +#OL/PL-168,Ovčí vrch ,,49.89223099,12.93351936,697 +#OL/PL-169,Pálená hora ,,49.22204971,13.65117264,697 +#OL/PL-170,Hostidráž ,,49.29807281,13.46863556,696 +#OL/PL-171,Červený vrch ,,49.71923065,12.45970154,695 +#OL/PL-172,Na Skále ,,49.27000046,13.34930038,695 +#OL/PL-173,Strážný vrch ,,49.72736359,12.62935543,694 +#OL/PL-174,Bitovín ,,49.21176147,13.67638779,694 +#OL/PL-175,Ptačí vršek ,,49.18286514,13.46933937,693 +#OL/PL-176,Hora,,49.21174240,13.42802429,693 +#OL/PL-177,Javořina ,,49.79582977,12.54418945,692 +#OL/PL-178,Farská stráň ,,49.69693375,12.64392948,692 +#OL/PL-179,Jedlový kopec,,49.33786011,13.41993523,692 +#OL/PL-180,Ptáčník ,,49.75923157,12.60391998,691 +#OL/PL-181,Kravař ,,49.41001511,13.05045986,691 +#OL/PL-182,Kněžská hora ,,49.38265228,13.06675529,691 +#OL/PL-183,Mufloní vrch ,,49.56730652,12.63977528,690 +#OL/PL-184,Úliště ,,49.32687759,13.28067493,690 +#OL/PL-185,Malý Bítov ,,49.41414642,13.19423962,688 +#OL/PL-186,Pod Kamenem,,49.56200409,13.71462536,688 +#OL/PL-187,Myslivecký vrch ,,49.72159576,12.50542355,687 +#OL/PL-188,Flusárenský vrch ,,49.71346664,12.50239944,687 +#OL/PL-189,Na Platoři ,,49.19663620,13.52678680,687 +#OL/PL-190,Plesno,,49.41850662,12.75326824,686 +#OL/PL-191,Modřínovec ,,49.47284317,12.77938652,685 +#OL/PL-192,Kokšín ,,49.60002136,13.67797565,684 +#OL/PL-193,Skalka,,49.44279861,12.67446041,683 +#OL/PL-194,Janský vrch ,,49.18638992,13.47599983,683 +#OL/PL-195,Nový Herštejn - ruins ,,49.41486359,13.06504822,681 +#OL/PL-196,Javorný vrch ,,49.70423889,12.52173710,680 +#OL/PL-197,Úšavský vrch ,,49.73920822,12.64188194,680 +#OL/PL-198,Škarman ,,49.40439606,13.04163933,680 +#OL/PL-199,Mitrvald - Radeč ruins ,,49.82386398,13.68879128,680 +#OL/PL-200,Nad Hájenkou ,,49.73234940,12.54051208,678 +#OL/PL-201,Brtník ,,49.74146652,12.60468197,678 +#OL/PL-202,Karkule,,49.38938904,13.40069962,678 +#OL/PL-203,Na Kopci,,49.67077637,12.68866158,677 +#OL/PL-204,Hůrka ,,49.32449341,13.39504051,677 +#OL/PL-205,Václavský kopec ,,49.73860168,12.65277004,676 +#OL/PL-206,Branka,,49.84027481,12.51912594,675 +#OL/PL-207,Milkovské čihadlo ,,49.88943100,12.92183208,675 +#OL/PL-208,Stražín ,,49.33555222,13.45690060,674 +#OL/PL-209,Hřeben ,,49.23868942,13.56290436,674 +#OL/PL-210,V Kopaninách ,,49.42718124,13.53015423,674 +#OL/PL-211,Křemešná ,,49.33138657,13.46286678,673 +#OL/PL-212,Na Skále ,,49.56190491,13.66761017,673 +#OL/PL-213,Skalice,,49.17248917,13.61835957,672 +#OL/PL-214,Kamenec,,49.54029083,12.69902706,671 +#OL/PL-215,Okrouhlík ,,49.33008957,13.44892025,671 +#OL/PL-216,Lískovec ,,49.56270218,12.72231483,670 +#OL/PL-217,Škalice ,,49.35116959,13.42473984,670 +#OL/PL-218,Strážiště ,,49.27021027,13.53988361,670 +#OL/PL-219,Nad Lískovcem ,,49.46788025,12.67326927,669 +#OL/PL-220,Farský vrch ,,49.22774124,13.42960453,669 +#OL/PL-221,Oblý vrch ,,49.89006042,12.84606171,668 +#OL/PL-222,Bezvěrovský vrch ,,49.54763794,12.70664597,666 +#OL/PL-223,Želenov ,,49.23608780,13.68277168,664 +#OL/PL-224,Na Skále ,,49.53687286,13.71285152,663 +#OL/PL-225,Květná hora ,,49.70095062,12.53610706,662 +#OL/PL-226,Mouřenín ,,49.16933823,13.49466991,662 +#OL/PL-227,Maštýř ,,49.55554581,13.65296078,662 +#OL/PL-228,Hraniční vrch ,,49.89863586,12.55300999,660 +#OL/PL-229,Malý Kouřim ,,49.43008804,13.11983871,660 +#OL/PL-230,Doubravický vrch (Kozelka) ,,49.37548447,13.03441238,659 +#OL/PL-232,Vracovská hora ,,49.38757706,13.45108223,659 +#OL/PL-233,Smrčina ,,49.73451233,12.55428219,658 +#OL/PL-234,U Vlčí jámy ,,49.45228577,13.07351017,658 +#OL/PL-235,Nad Myslivnou,,49.78079224,12.53083515,657 +#OL/PL-236,Větrovská ,,49.24700928,13.46032238,657 +#OL/PL-237,Oborský vrch ,,49.81776810,12.53684998,656 +#OL/PL-238,Bukovina,,49.58433151,12.63474751,655 +#OL/PL-239,Kamenice,,49.63907242,12.63331509,655 +#OL/PL-240,Ježek ,,49.39837646,13.42990303,654 +#OL/PL-241,Jelení vrch ,,49.38392258,13.42540359,654 +#OL/PL-242,Čihátko ,,49.82069016,13.69454956,654 +#OL/PL-243,Skalka,,49.32228088,13.46524239,652 +#OL/PL-244,Křížovická hora ,,49.36217499,13.45099926,652 +#OL/PL-245,Židovská stráň ,,49.67013931,12.63934708,651 +#OL/PL-246,Jalovcový vrch ,,49.69039536,12.69176579,651 +#OL/PL-247,Židovská stráň ,,49.67013931,12.63934708,651 +#OL/PL-248,Čertova skála ,,49.71586227,12.58130264,650 +#OL/PL-249,Lazurový vrch ,,49.91269684,12.77573776,650 +#OL/PL-250,Dubovka,,49.41975021,13.10336018,650 +#OL/PL-251,U Linharta,,49.42565918,13.10406971,650 +#OL/PL-252,Buben,,49.23552704,13.46265697,650 +#OL/PL-253,Chocholka,,49.36582184,13.52254009,650 +#OL/PL-254,Rendlíky ,,49.29934692,13.45098877,649 +#OL/PL-255,Na Balkáně ,,49.43681335,13.54608822,649 +#OL/PL-256,Svat,,49.26694870,13.57275105,648 +#OL/PL-257,V Sedle,,49.18830109,13.60958958,648 +#OL/PL-258,Spáleniště ,,49.69091034,12.65392685,647 +#OL/PL-259,Hůrka ,,49.60119247,12.67919254,646 +#OL/PL-260,Ostrá ,,49.30634308,13.41500092,646 +#OL/PL-261,Zbudov,,49.36835861,13.49433231,645 +#OL/PL-262,Halovska,,49.37945175,12.91576099,644 +#OL/PL-263,Čepice ,,49.37192917,13.02849293,644 +#OL/PL-264,Chlumek,,49.35519409,13.06871319,644 +#OL/PL-265,Svatá Markéta ,,49.36223984,13.15636539,642 +#OL/PL-266,Velký Kouřim ,,49.43483353,13.11513329,642 +#OL/PL-267,U Vodojemu,,49.57159424,12.62064552,641 +#OL/PL-268,Dobrá hora ,,49.36587906,13.07512665,641 +#OL/PL-269,Buzrakov,,49.41423416,13.49127483,641 +#OL/PL-270,Ostrý vrch ,,49.75412369,13.76619816,641 +#OL/PL-271,Hora,,49.32379150,13.36830997,640 +#OL/PL-272,Brda,,49.33125687,13.46925735,640 +#OL/PL-273,Háj ,,49.23277283,13.59098911,640 +#OL/PL-274,Na Porovnání ,,49.31169510,13.19600773,639 +#OL/PL-275,Hora,,49.28170013,13.28664589,639 +#OL/PL-276,Rumpál ,,49.81092072,13.63965797,639 +#OL/PL-277,Suchá hora ,,49.41532898,13.09293747,638 +#OL/PL-278,Letná ,,49.22673798,13.47270966,638 +#OL/PL-279,Šibeniční vrch ,,49.68417358,12.64471245,637 +#OL/PL-280,Háj ,,49.31132507,13.37972832,637 +#OL/PL-281,Kozník ,,49.27423859,13.65854836,637 +#OL/PL-282,Mlýnský vrch ,,49.45199203,12.68495083,636 +#OL/PL-283,Cimberk,,49.21498108,13.45988941,636 +#OL/PL-284,Přemětín ,,49.29774857,13.49318409,636 +#OL/PL-285,Hora,,49.57226181,13.64840603,636 +#OL/PL-286,Vusenice,,49.53370285,13.68695259,636 +#OL/PL-287,Kamenný vrch ,,49.90449524,12.75706291,635 +#OL/PL-288,Skalka,,49.35475922,13.46679020,635 +#OL/PL-289,Pavlínova hora ,,49.27141953,13.44504547,633 +#OL/PL-290,Hájek ,,49.22587967,13.66837025,633 +#OL/PL-291,Tomáška ,,49.66479874,12.62807465,632 +#OL/PL-292,Krasíkov - Švamberk ruins ,,49.39603043,13.53610039,632 +#OL/PL-294,Chvojová hora ,,49.31305313,13.26585579,631 +#OL/PL-295,Vrchy,,49.31010437,13.36975288,631 +#OL/PL-296,Nad Křížem ,,49.83479309,12.58327198,630 +#OL/PL-297,Čihadlo ,,49.45315933,13.71736336,629 +#OL/PL-298,Planinka,,49.49003983,13.72076416,629 +#OL/PL-299,Smrková hora ,,49.30018997,13.27138042,628 +#OL/PL-300,Slavník ,,49.36233902,13.61763954,627 +#OL/PL-301,Tisovník ,,49.44458008,13.64662266,627 +#OL/PL-302,Kovětín ,,49.43292236,13.66503906,627 +#OL/PL-303,Hřebenec ,,49.55035400,13.63363743,627 +#OL/PL-304,Borový vrch ,,49.71438599,12.54530430,626 +#OL/PL-305,Kamenný vrch ,,49.69050598,12.62870979,626 +#OL/PL-306,Vyhlídka ,,49.43793869,13.13125992,626 +#OL/PL-307,Pastvina,,49.80524826,12.55405426,625 +#OL/PL-308,Na Výhledech ,,49.65275192,12.64074326,625 +#OL/PL-309,Bukový vrch ,,49.44582367,13.66678619,625 +#OL/PL-310,Březový vrch ,,49.66914368,12.54303741,624 +#OL/PL-311,Korálka ,,49.57885361,13.67069054,624 +#OL/PL-312,Trhoň ,,49.75912857,13.70408916,624 +#OL/PL-313,Plachtínská stráň ,,49.95281982,13.16446877,622 +#OL/PL-314,Hrnčíř ,,49.21245575,13.44327068,622 +#OL/PL-315,Hrádek ,,49.38789368,13.53033543,622 +#OL/PL-316,Na Březinách ,,49.19853210,13.71550655,622 +#OL/PL-317,Pahorky,,49.30219650,13.35515690,621 +#OL/PL-318,Buková ,,49.28834152,13.48939991,621 +#OL/PL-319,Zelený vrch ,,49.82180786,12.57146072,620 +#OL/PL-320,Medvědí vrch ,,49.31301117,13.05946541,620 +#OL/PL-321,Lískovec ,,49.30513000,13.39996243,620 +#OL/PL-322,Na Rejdích ,,49.40369034,13.41870594,620 +#OL/PL-323,Na Homoli,,49.87564087,12.60617638,619 +#OL/PL-324,Racovský vrch ,,49.62131119,12.85561180,619 +#OL/PL-325,Šibeník ,,49.21977997,13.52359009,619 +#OL/PL-326,Osičina ,,49.76168823,13.75378704,619 +#OL/PL-327,Bystřičný vrch ,,49.56790161,12.69333076,618 +#OL/PL-328,Kolinecká hůrka ,,49.30838013,13.42693233,617 +#OL/PL-329,Buč ,,49.51047516,13.47682285,617 +#OL/PL-330,Suchý vrch ,,49.65360641,12.63327503,616 +#OL/PL-331,Světecký vrch ,,49.81095886,12.60692406,616 +#OL/PL-332,Písečný vrch ,,49.89306259,12.79903126,616 +#OL/PL-333,Kvasetická hora ,,49.40238190,13.49026012,616 +#OL/PL-334,Vráž ,,49.43136597,13.60042477,616 +#OL/PL-335,Sedlo,,49.60539246,12.82796192,615 +#OL/PL-336,Ráj ,,49.36367035,13.02738953,615 +#OL/PL-337,Na Kamejkách ,,49.44839096,13.13640022,615 +#OL/PL-338,Rackův vrch ,,49.30172729,13.17986393,615 +#OL/PL-339,Na Skalici,,49.30195999,13.28878021,615 +#OL/PL-340,Na Žďáru ,,49.30659866,13.28171062,615 +#OL/PL-341,Skály ,,49.32553864,13.41022968,615 +#OL/PL-342,Zbyná ,,49.28348923,13.49812889,615 +#OL/PL-343,Stříbrná ,,49.28997803,13.40232277,613 +#OL/PL-344,Pahorek,,49.27751160,13.40635586,613 +#OL/PL-345,Hradec,,49.32323074,13.48822308,612 +#OL/PL-346,Ostrý vrch ,,49.41280365,13.71234989,612 +#OL/PL-347,Dlažovská hůrka ,,49.37778091,13.15181541,611 +#OL/PL-348,Vysoký vrch ,,49.96989441,13.17475224,609 +#OL/PL-349,Červ ,,49.34579086,13.32396412,609 +#OL/PL-350,Ondola,,49.27643204,13.55410862,609 +#OL/PL-351,V Horách ,,49.27574539,13.56259727,609 +#OL/PL-352,Chlum,,49.40673447,13.70997238,609 +#OL/PL-353,Trdlina,,49.88738632,12.81454945,608 +#OL/PL-354,Kamenný vrch ,,49.86190033,12.86022854,608 +#OL/PL-355,Bábovka ,,49.73397827,13.70697975,608 +#OL/PL-356,Třešňovec ,,49.70499420,12.68326473,607 +#OL/PL-357,Přední skála ,,49.37278748,12.92541122,607 +#OL/PL-358,Vršek ,,49.30566788,13.38684750,607 +#OL/PL-359,V Obci,,49.43629074,13.44535542,607 +#OL/PL-360,Pučanka ,,49.28393936,13.66989040,607 +#OL/PL-361,Lísková ,,49.61885834,12.65146351,606 +#OL/PL-362,Holý vrch ,,49.33810043,13.10132027,606 +#OL/PL-363,Prašivý vrch ,,49.91404343,13.20639324,606 +#OL/PL-364,Studánka ,,49.56840134,12.57786655,605 +#OL/PL-365,Javorka,,49.36451340,13.50304413,605 +#OL/PL-366,Plesník ,,49.38978958,13.60789013,605 +#OL/PL-367,Kočičí vrch ,,50.06648254,13.31887627,605 +#OL/PL-368,Radlice,,49.48214340,13.13021660,604 +#OL/PL-369,Malý Špičák ,,49.90219116,13.15725517,604 +#OL/PL-370,Bukoveček ,,49.31317520,13.36304665,604 +#OL/PL-371,Kloudova hora,,49.34563065,13.48973942,604 +#OL/PL-372,Boulín ,,49.41967392,13.44565964,604 +#OL/PL-373,Malá hora ,,49.35585403,13.51223087,604 +#OL/PL-374,Vrchy,,49.41461182,13.68108845,604 +#OL/PL-375,Dmout,,49.41682816,12.90266037,603 +#OL/PL-376,Tomanův kopec ,,49.22669601,13.46413994,603 +#OL/PL-377,Velenovy,,49.35514832,13.53032017,603 +#OL/PL-378,Dubičí ,,49.27132797,13.69986916,603 +#OL/PL-379,K Michalovým horám ,,49.88849258,12.78565025,602 +#OL/PL-380,Selský les ,,49.89236450,12.89708805,602 +#OL/PL-381,Čapka ,,49.62362289,12.67721272,601 +#OL/PL-382,Špička ,,49.34936905,12.86448765,601 +#OL/PL-383,Slupný ,,49.41864014,13.02871704,601 +#OL/PL-384,Libkovská hůrka ,,49.36212540,13.13135719,601 +#OL/PL-385,Tuhošť ,,49.49224472,13.26085758,601 +#OL/PL-386,Čihadlo ,,49.44466019,13.62896156,601 +#OL/PL-387,Salka,,49.38772964,12.89203930,600 +#OL/PL-388,Rozsocha,,49.60483932,12.85993385,600 +#OL/PL-389,Ostrá ,,49.44483948,13.56648922,600 +#OL/PL-390,Buková hora ,,49.42752075,13.63109016,600 +#OL/PL-391,Javorovice,,49.35147476,13.08317947,599 +#OL/PL-392,Na Skále ,,49.45761871,13.14593983,599 +#OL/PL-393,Žebráček ,,49.29615021,13.55408192,599 +#OL/PL-394,Prašivec ,,49.40648270,13.69420815,599 +#OL/PL-395,Horšínský ráj ,,49.53248596,12.68667793,598 +#OL/PL-396,Čárky ,,49.42518234,13.63093853,598 +#OL/PL-397,U Remízku ,,49.28337860,13.41182995,597 +#OL/PL-398,Ve Vrchu,,49.50671768,13.68082333,597 +#OL/PL-399,Huťský vrch ,,49.44147873,12.73686028,596 +#OL/PL-400,Skupečský vrch ,,49.88177109,13.10023499,596 +#OL/PL-401,Křešňovec ,,49.26036072,13.59877968,596 +#OL/PL-402,Kohoutov,,49.90837097,13.77040100,596 +#OL/PL-403,Poustky,,50.06207657,13.30293369,596 +#OL/PL-404,Špičák ,,49.91613007,12.97484684,595 +#OL/PL-405,Černý les ,,49.25863266,13.47942162,595 +#OL/PL-406,Na Spálencích ,,49.31645203,13.43327999,595 +#OL/PL-407,Mýtský kopec ,,49.79819107,12.57431126,594 +#OL/PL-408,Dvorský vrch ,,49.80936432,12.58565140,594 +#OL/PL-409,Ostrý vrch ,,49.34906006,13.06344986,594 +#OL/PL-410,Petřiny ,,49.31459808,13.41869831,594 +#OL/PL-411,Kačer ,,50.07092285,13.35785103,594 +#OL/PL-412,Sklárenský vrch ,,49.68217468,12.61203384,593 +#OL/PL-413,Pastvina,,49.91846848,12.74292850,593 +#OL/PL-414,Hůrka ,,49.28139496,13.26157570,593 +#OL/PL-415,Na Buči ,,49.42961884,13.48473454,593 +#OL/PL-416,Karlovecký hřbet ,,49.28219223,13.69342422,592 +#OL/PL-417,Svitník ,,49.30015182,13.68414593,591 +#OL/PL-418,Ovčí vrch ,,49.34756088,12.83317089,590 +#OL/PL-419,Na Skále ,,49.37318802,12.85662174,590 +#OL/PL-420,V Luhu,,49.42397690,13.05476093,590 +#OL/PL-421,Kopky,,49.29868698,13.42867184,590 +#OL/PL-422,Kněžská hora ,,49.44570541,13.70718384,590 +#OL/PL-423,Vísecká skála (Homberk - Ruins) ,,49.65406799,13.67224407,590 +#OL/PL-424,Konesův vrch ,,49.72698212,13.68651867,590 +#OL/PL-425,Veselá hora ,,49.41950989,12.91020393,589 +#OL/PL-426,Tříslovec ,,49.61354828,12.85622978,589 +#OL/PL-427,Zadní Javorovice ,,49.34706879,13.08643532,589 +#OL/PL-428,Stará pec ,,49.49908066,13.41320038,589 +#OL/PL-429,Chroustov,,49.51918030,13.49324322,589 +#OL/PL-430,Vápencový vrch ,,49.79590607,12.59943962,588 +#OL/PL-431,Na podkově ,,49.38191986,12.84632111,588 +#OL/PL-432,Ledvina,,49.47681427,13.47289753,588 +#OL/PL-433,Hájek ,,49.55534363,13.42587090,588 +#OL/PL-434,Hora,,49.26073837,13.53394985,588 +#OL/PL-435,Vlčí hora ,,49.34006500,13.52118778,588 +#OL/PL-436,Hůrky ,,49.51744461,13.73933601,588 +#OL/PL-437,Hájka ,,50.03898621,13.32821560,588 +#OL/PL-438,Mlýnecký kopec ,,49.46415329,12.78783989,587 +#OL/PL-439,Ve Smrčí ,,49.85758972,12.80676651,587 +#OL/PL-440,Vačina ,,49.62703323,12.83447742,587 +#OL/PL-441,Špičák ,,49.99863052,13.15368176,587 +#OL/PL-442,Beranice,,49.46952438,13.43889332,587 +#OL/PL-443,Kopaniny,,49.75790024,13.80397797,587 +#OL/PL-444,Kařízská hora ,,49.81672287,13.80008221,587 +#OL/PL-445,Hrotek,,49.84328842,12.80018044,586 +#OL/PL-446,Kamenitá ,,49.39239120,13.56056976,586 +#OL/PL-447,Stráž ,,49.27132797,13.69986916,586 +#OL/PL-448,Nad Mlýnem ,,49.78550339,12.55960655,585 +#OL/PL-449,Výhledy ,,49.81781006,12.78498650,585 +#OL/PL-450,Hrádek ,,49.43099976,12.86171627,585 +#OL/PL-451,Malá Křížová ,,49.34826279,13.09773445,585 +#OL/PL-452,Hotín ,,49.27539825,13.49573040,585 +#OL/PL-453,Za Kostelem,,49.37234879,13.62730980,585 +#OL/PL-454,Panský vrch ,,49.61598206,12.81320286,584 +#OL/PL-455,Soví vrch ,,49.82479095,12.76620197,584 +#OL/PL-456,Čihadlo ,,49.80164719,12.79395199,584 +#OL/PL-457,Kožich ,,49.57104874,13.44318104,584 +#OL/PL-458,Vrch,,49.29560852,13.59778023,584 +#OL/PL-459,Křížový vrch ,,49.67652512,12.71178818,583 +#OL/PL-460,Dus,,49.51710510,13.51651859,583 +#OL/PL-461,Bubečná ,,49.25680542,13.59063435,583 +#OL/PL-462,Radost,,49.91647720,13.76807690,583 +#OL/PL-463,Písečný ,,49.60720062,12.86891079,582 +#OL/PL-464,Obecní les ,,49.84973526,12.87178326,582 +#OL/PL-465,Na Pušperské skále ,,49.43483353,13.15077591,582 +#OL/PL-466,Bezí ,,49.40993118,13.21138000,582 +#OL/PL-467,Lipovka,,49.31421280,13.31986237,582 +#OL/PL-468,Číhaná ,,50.08646774,13.28809261,582 +#OL/PL-469,Pískový vrch ,,49.63894272,12.80198002,580 +#OL/PL-470,Týčský vrch ,,49.91011047,13.78495312,580 +#OL/PL-471,Velký vrch ,,49.93606567,13.78296280,580 +#OL/PL-472,Homole,,49.64551544,12.80312443,579 +#OL/PL-473,Dlouhý vrch ,,49.85505295,12.85574436,579 +#OL/PL-474,Zadní skála ,,49.36400986,12.92346954,579 +#OL/PL-475,Buková hora ,,49.49381256,13.14424515,579 +#OL/PL-476,U Rožnova lomu (Čihadlo) ,,49.42621613,12.89513397,578 +#OL/PL-478,Vrch Páně ,,49.35990143,13.04899979,578 +#OL/PL-479,Bouček ,,49.37245178,13.46897030,578 +#OL/PL-480,Na Solích ,,49.84569168,13.66572285,578 +#OL/PL-481,Lišná ,,49.27991800,13.60642070,577 +#OL/PL-482,Skalka,,49.47305298,13.66295433,577 +#OL/PL-483,V Březince ,,49.62809372,12.81421185,576 +#OL/PL-484,Nad Rašelinami ,,49.66074753,12.54756260,575 +#OL/PL-485,Bezkoutí ,,49.36701965,12.99639988,575 +#OL/PL-486,Hřebensko ,,49.88402176,13.23367786,575 +#OL/PL-487,Zabuza,,49.26718521,13.47289085,575 +#OL/PL-488,Levina,,49.32820892,13.52266026,575 +#OL/PL-489,Prašivec ,,49.34348679,13.55864239,575 +#OL/PL-490,Hůrka ,,49.94264984,13.29977512,574 +#OL/PL-491,Dědkův kůň ,,49.25481796,13.64093494,574 +#OL/PL-492,Nad Žihlí ,,50.04366684,13.34861279,574 +#OL/PL-493,Výhled ,,49.66058350,12.75588417,573 +#OL/PL-494,Ptín ,,49.45688629,13.37813568,573 +#OL/PL-495,Oumyšl ,,49.41065800,13.61088420,573 +#OL/PL-496,Hraštice ,,49.27144623,13.67864037,573 +#OL/PL-497,Březina ,,50.00844193,13.46113968,573 +#OL/PL-498,Tchoří vrch ,,49.68200302,12.56235313,572 +#OL/PL-499,Kamenná mohyla ,,49.84452057,12.65306377,572 +#OL/PL-500,Bukov,,49.84163284,13.75362396,572 +#OL/PL-501,Bukač ,,49.61911011,12.61456585,571 +#OL/PL-502,V Bučině ,,49.63997650,12.61609459,571 +#OL/PL-503,Rovenská hora ,,49.32094574,13.24521160,571 +#OL/PL-504,Nevěrná ,,49.53190994,13.41191959,571 +#OL/PL-505,Lískovecká hůrka ,,49.56304932,12.74000168,570 +#OL/PL-506,Zbečná ,,49.23697281,13.59889221,570 +#OL/PL-507,Zlatnice,,49.25274277,13.58778191,570 +#OL/PL-508,Na Kopaninách ,,49.47396088,13.69132042,570 +#OL/PL-509,Holý vrch ,,49.50554276,13.40470600,569 +#OL/PL-510,Dubovec,,49.23554230,13.64805794,569 +#OL/PL-511,Spálený vrch ,,49.81055832,12.80099773,568 +#OL/PL-512,Smrčí ,,49.42768478,13.27009201,568 +#OL/PL-513,Vyšoblak ,,49.22525024,13.58197308,568 +#OL/PL-514,Zlačín ,,49.29459763,13.57976437,568 +#OL/PL-515,Kopec,,49.52196121,13.51918983,568 +#OL/PL-516,Ve Skalách ,,49.66895676,13.64062881,568 +#OL/PL-517,Věží vrch ,,49.48901367,13.67434025,568 +#OL/PL-518,Střebelský vrch ,,49.64860916,12.52500725,567 +#OL/PL-519,Pluhová ,,49.28706360,13.57558060,566 +#OL/PL-520,Panský vrch ,,49.69495010,12.82974052,565 +#OL/PL-521,Suchá hora ,,49.30504227,13.56317616,565 +#OL/PL-522,Vysoká ,,49.79652786,12.61197090,564 +#OL/PL-523,Dlouhý vrch ,,49.89532852,12.66112614,564 +#OL/PL-524,Zámecký vrch ,,49.58553314,12.76375771,564 +#OL/PL-525,Luh,,49.50287247,13.38843918,564 +#OL/PL-526,Předveska ,,49.28049088,13.57389927,564 +#OL/PL-527,Babská skála ,,49.85829544,13.66671181,564 +#OL/PL-528,Kraví vrch ,,49.35908127,12.89171982,563 +#OL/PL-529,Křakovský vrch ,,49.60745239,12.90040588,563 +#OL/PL-530,Očínská výšina ,,49.84954834,12.94123840,563 +#OL/PL-531,Černava ,,49.31323624,13.52793503,563 +#OL/PL-532,Šibeník ,,49.28460312,13.61602402,563 +#OL/PL-533,Panský vrch ,,49.68039322,12.59548473,562 +#OL/PL-534,Skála ,,49.47023392,12.79717350,562 +#OL/PL-535,Nademlýnský vrch ,,49.50835800,12.75136471,562 +#OL/PL-536,Rybniční vrch ,,49.60566330,12.88121414,562 +#OL/PL-537,Stráně ,,49.24932098,13.65526962,562 +#OL/PL-538,U Beraního dvora ,,49.58784485,12.67299080,561 +#OL/PL-539,Ošupaná ,,49.46192551,13.34263897,561 +#OL/PL-540,Na Skalici,,49.49848175,13.54591846,561 +#OL/PL-541,Libyňský vrch ,,50.02613831,13.47710514,561 +#OL/PL-542,Valaší vrch ,,49.85150146,12.83508873,560 +#OL/PL-543,Plátěná hora ,,49.46743393,13.52066898,560 +#OL/PL-544,Světovina ,,49.86728668,13.74372387,560 +#OL/PL-545,Peklo,,49.77507401,12.79671478,559 +#OL/PL-546,Hůrčí ,,49.28815079,13.57048798,559 +#OL/PL-547,Chocenická velká skála ,,49.54751968,13.53716373,559 +#OL/PL-548,Moučanka ,,49.30506897,13.68918991,559 +#OL/PL-549,V Křenči ,,49.44899750,13.74484539,559 +#OL/PL-550,U Křížků ,,49.61400223,12.77353001,558 +#OL/PL-551,Březina ,,49.27058029,13.50698948,558 +#OL/PL-552,Pumperk,,49.26306152,13.56670475,558 +#OL/PL-553,Přecek ,,49.67069626,13.66951847,558 +#OL/PL-554,Přední Vrchovo ,,49.39068985,12.95079041,557 +#OL/PL-555,Nad Vodojemem,,49.86540222,12.93021107,557 +#OL/PL-556,Křepčín ,,49.28317261,13.46293640,557 +#OL/PL-557,Klepný ,,49.38941574,13.00309753,556 +#OL/PL-558,Minovka,,49.25931168,13.54900074,556 +#OL/PL-559,Kněžská hora ,,49.44140625,13.22579575,555 +#OL/PL-560,Chanovec,,49.27440643,13.60003185,555 +#OL/PL-561,Velký Špičák ,,50.00791168,13.48639011,555 +#OL/PL-562,Hájek ,,49.72430420,12.69166946,554 +#OL/PL-563,Lipka,,49.35060883,13.31366634,554 +#OL/PL-564,Pahorek,,49.29008865,13.57874012,554 +#OL/PL-565,Šibeniční vrch ,,49.53789520,12.74558544,552 +#OL/PL-566,Pouzdřím ,,49.48662949,13.50263786,552 +#OL/PL-567,Na Kahynkách ,,49.50422668,13.66414928,552 +#OL/PL-568,Na Prkénce ,,49.83473969,13.67692661,552 +#OL/PL-569,Hřeben ,,49.37167740,13.76830482,552 +#OL/PL-570,Hlásný vrch ,,49.32489777,13.04325390,551 +#OL/PL-571,Hrčoven ,,49.33911896,13.06692028,551 +#OL/PL-572,Kramoly,,49.46367645,13.19517994,551 +#OL/PL-573,Úlehle ,,49.45418167,13.32783985,551 +#OL/PL-574,Plzeňčice ,,49.51388931,13.67223072,551 +#OL/PL-575,Na Vápenici ,,49.23645020,13.64346027,550 +#OL/PL-576,Obrovo hradiště ,,49.47584534,13.50893021,549 +#OL/PL-577,Ve Vrchu,,49.45383835,13.62009525,549 +#OL/PL-578,Hradecký vrch ,,49.72465897,13.65661144,549 +#OL/PL-579,U Kapličky ,,49.87125015,12.65803051,548 +#OL/PL-580,Vraní hora ,,49.50918579,12.76436806,548 +#OL/PL-581,Skála ,,49.37543869,12.98756981,548 +#OL/PL-582,Vápenný vrch ,,49.22459030,13.61688042,548 +#OL/PL-583,V Sedle,,49.33715439,12.86942101,546 +#OL/PL-584,Hora,,49.32076645,13.37556553,546 +#OL/PL-585,V Pahorkách ,,49.42437363,13.46349430,546 +#OL/PL-586,Vrch Anděla Strážce ,,49.23535538,13.52695370,546 +#OL/PL-587,Potvorovský kopec ,,50.01253891,13.38652897,546 +#OL/PL-588,Stinný vrch ,,49.61480331,12.88126087,545 +#OL/PL-589,Stelka,,49.80170059,12.98251629,545 +#OL/PL-590,Holec,,49.49790955,13.13049984,545 +#OL/PL-591,Holý vrch ,,49.35476303,13.31231213,545 +#OL/PL-592,Vráž ,,49.41648865,13.74633694,545 +#OL/PL-593,Jezevky,,49.86038208,13.70461082,545 +#OL/PL-594,Bažantnice ,,49.77109909,12.63544464,544 +#OL/PL-595,Holinka,,49.35241318,13.28485203,544 +#OL/PL-596,Štibřín ,,49.45689011,13.43597984,544 +#OL/PL-597,Hora,,49.31074142,13.62938023,544 +#OL/PL-598,Dubina,,49.68299484,12.85223389,543 +#OL/PL-599,Stramchyně ,,49.50888062,13.28590679,543 +#OL/PL-600,Struhadelský vrch ,,49.44591904,13.45392036,543 +#OL/PL-601,Rapotínský vrch ,,49.76223755,12.66331673,542 +#OL/PL-602,Úborská hůrka ,,49.33505630,13.15308666,542 +#OL/PL-603,Černý les ,,49.53236008,13.36396980,542 +#OL/PL-604,Plešovec ,,49.30106354,13.64483547,542 +#OL/PL-605,Homole,,49.61546326,13.66526413,542 +#OL/PL-606,Hřebeny ,,49.92194366,13.82321739,542 +#OL/PL-607,Ptačinec ,,49.54162979,12.73037338,541 +#OL/PL-608,Zadní hora ,,49.42890167,12.85342026,541 +#OL/PL-609,Kameniště ,,49.37167740,13.76830482,541 +#OL/PL-610,Kolmanův vrch ,,49.22869110,13.61647034,541 +#OL/PL-611,Stříbrnice ,,49.51200104,13.25860977,540 +#OL/PL-612,Pahorek,,49.60114288,13.47123146,540 +#OL/PL-613,Na Průhoně ,,49.28400040,13.59290981,540 +#OL/PL-614,Úvratec ,,50.01099014,13.27402687,540 +#OL/PL-615,Nad Jadružemi ,,49.85919952,12.68694401,539 +#OL/PL-616,Bezovka,,49.35230637,12.92307854,539 +#OL/PL-617,Šibeniční vrch ,,49.66666031,12.98433971,539 +#OL/PL-618,Ovčácký vrch ,,49.28636932,13.58660030,539 +#OL/PL-619,Pohořelec ,,49.60491943,12.72455597,538 +#OL/PL-620,Zhořský vrch ,,49.66427231,12.95505810,538 +#OL/PL-621,Jahodník ,,49.85836411,13.08612537,538 +#OL/PL-622,U Habru,,49.68217850,13.62063026,538 +#OL/PL-623,Mýtský vrch ,,49.79726028,13.71618938,538 +#OL/PL-624,Na Americe,,49.42707062,13.75331974,538 +#OL/PL-625,Pláň ,,49.75549316,12.87346935,537 +#OL/PL-626,Hora,,49.44377518,13.48330498,537 +#OL/PL-627,Farská skála ,,49.64592361,13.46173954,537 +#OL/PL-628,Na Skalicích ,,49.34973145,13.03059006,536 +#OL/PL-629,Chlumec,,49.35502625,13.36573410,536 +#OL/PL-630,Na Palouku,,49.84370422,12.82219505,535 +#OL/PL-631,Václavkova hora ,,49.43897247,12.85695553,535 +#OL/PL-632,Hůrka ,,49.34111404,13.14955521,535 +#OL/PL-633,Vinný vrch ,,49.30852127,13.24845028,535 +#OL/PL-634,Soustov,,49.37895203,13.19398689,535 +#OL/PL-635,Na Čihadle ,,49.49254227,13.33486652,535 +#OL/PL-636,Bor ,,49.47603989,13.38379955,535 +#OL/PL-637,Jindřín ,,49.54608154,13.38558006,535 +#OL/PL-638,Radina,,49.34999847,13.65060043,534 +#OL/PL-639,Chlumec,,49.51662445,13.63524055,534 +#OL/PL-640,U Damětic ,,49.24634933,13.69705963,534 +#OL/PL-641,Na Snadné ,,49.38600922,13.76321030,534 +#OL/PL-642,Třískolupský vrch ,,49.63105774,12.57642174,533 +#OL/PL-643,Skalky,,49.51237869,12.77306461,533 +#OL/PL-644,Na Hlavě ,,49.41193390,12.87765598,533 +#OL/PL-645,Planá hora ,,49.47470093,13.37436962,533 +#OL/PL-646,Suchý vrch ,,49.25635147,13.53464985,533 +#OL/PL-647,Malý Křakovský vrch ,,49.61265945,12.90378094,532 +#OL/PL-648,Kozí vrch ,,49.87966156,13.01312256,532 +#OL/PL-649,Na Vápenici ,,49.29238129,13.24293041,532 +#OL/PL-650,Žďánov ,,49.28424835,13.65433025,532 +#OL/PL-651,Na Hůrce ,,49.44052887,13.61938953,532 +#OL/PL-652,Kouklova hora,,49.72594452,13.67455864,532 +#OL/PL-653,Babí skála ,,49.88064194,13.76776505,532 +#OL/PL-654,Křemenec ,,49.77503967,12.66281223,531 +#OL/PL-655,Tedražicko ,,49.27317047,13.51692009,531 +#OL/PL-656,Na Kobylinkách ,,49.30205917,13.71315002,531 +#OL/PL-657,Na Vrchu,,49.43251038,13.75370979,531 +#OL/PL-658,Hřešín ,,49.58694839,12.81527710,530 +#OL/PL-659,Kozinec,,49.86183548,13.04402161,530 +#OL/PL-660,Pečiště ,,49.83686447,13.73839378,530 +#OL/PL-661,Ušák ,,49.89739990,13.74684143,530 +#OL/PL-662,Kamenec,,49.62093735,12.71572304,529 +#OL/PL-663,Hostouňský vrch ,,49.55947876,12.79360199,528 +#OL/PL-664,Na Klekání ,,49.45470428,13.57878590,528 +#OL/PL-665,Vršky ,,49.68007278,13.59529400,528 +#OL/PL-666,Plzeňský vrch ,,49.79182816,13.67476177,528 +#OL/PL-667,Bílý kámen ,,49.47756195,13.11393547,527 +#OL/PL-668,Kamenná hůrka ,,49.47106934,13.12487030,527 +#OL/PL-669,Lopata,,49.38710022,13.36929989,527 +#OL/PL-670,Myší hora ,,49.29303741,13.69764805,527 +#OL/PL-671,Javoří ,,49.64979172,12.58435822,526 +#OL/PL-672,Medvědí vrch ,,49.36003876,12.87724686,526 +#OL/PL-673,Vlčtejn - Ruins ,,49.61494446,13.49738026,526 +#OL/PL-674,Oběšený ,,49.56781769,13.57207394,526 +#OL/PL-675,Dlouhé pole ,,49.61838913,12.69258118,525 +#OL/PL-676,Na Vrchu,,49.75679398,12.69323730,525 +#OL/PL-677,Ve Spáleném ,,49.50249863,13.24900246,525 +#OL/PL-678,Výhořice ,,49.36516571,13.29068947,525 +#OL/PL-679,Suš ,,49.55789185,13.49282646,525 +#OL/PL-680,Holý vrch ,,49.46319962,13.10256004,524 +#OL/PL-681,Hájsko ,,49.61019897,13.40118217,524 +#OL/PL-682,Na Vrchu,,49.45643616,13.63878918,524 +#OL/PL-683,Kšický vrch ,,49.81185150,12.99521637,523 +#OL/PL-684,Dobrochovec,,49.41289139,13.22936058,523 +#OL/PL-685,Čilina ,,49.73636246,13.54992485,523 +#OL/PL-686,Sirská hora ,,49.93877411,13.76037312,523 +#OL/PL-687,Pasečí ,,49.60216904,12.93274403,522 +#OL/PL-688,Pleš ,,49.42446899,13.23346710,522 +#OL/PL-689,Střížov ,,49.57565308,13.36988640,522 +#OL/PL-690,Na Vrchu,,49.30472183,13.71891022,522 +#OL/PL-691,Na Starcích ,,49.50489044,13.51777172,521 +#OL/PL-692,Hůrka ,,49.43137360,13.02831745,520 +#OL/PL-693,Ostrý vrch ,,49.49353790,13.24169922,520 +#OL/PL-694,Hrádek ,,49.45411682,13.50914764,520 +#OL/PL-695,U Rozcestí ,,49.77228546,12.69061279,519 +#OL/PL-696,Větrný vrch ,,49.79170990,12.68313026,519 +#OL/PL-697,Slatinský vrch ,,49.54335785,12.80870628,519 +#OL/PL-698,Semněvický les ,,49.61142349,12.92914009,519 +#OL/PL-699,Řebřík - ruins ,,49.89282608,13.78382778,519 +#OL/PL-700,Suchý vrch ,,49.48025131,13.53839588,518 +#OL/PL-701,Úvratce ,,50.01910019,13.26781750,518 +#OL/PL-702,Buček ,,49.63948441,12.85769463,517 +#OL/PL-703,Nětice ,,49.26382065,13.63871002,517 +#OL/PL-704,Na Pasece,,49.29639053,13.69194984,517 +#OL/PL-705,Kozdeří ,,49.42964935,13.76914024,517 +#OL/PL-706,Čihadlo ,,49.67225647,12.75484753,516 +#OL/PL-707,Chlumec,,49.38805008,13.34986687,516 +#OL/PL-708,Pramný ,,49.64332581,13.57950783,516 +#OL/PL-709,Pučanka ,,49.30981064,13.68873024,516 +#OL/PL-710,Radlín ,,49.30210114,13.71963978,516 +#OL/PL-711,Vršek ,,49.64157104,12.72938538,515 +#OL/PL-712,Jalovčí ,,49.45399094,12.90478992,515 +#OL/PL-713,Na Skalce,,49.36016846,12.94400978,515 +#OL/PL-714,Matějkovna ,,49.49561691,13.32371330,515 +#OL/PL-715,Šibenice ,,49.47625351,13.58125496,515 +#OL/PL-716,Berdovna,,49.88048553,13.34004402,514 +#OL/PL-717,Svatý Vojtěch ,,49.70188141,13.64703274,514 +#OL/PL-718,Jelení vrch ,,49.64338303,12.57403564,513 +#OL/PL-719,Vojenský vršek ,,49.24726105,13.64527035,513 +#OL/PL-720,Doubrava,,49.25910187,13.64993954,513 +#OL/PL-721,U Kamene,,49.46493530,13.59140778,513 +#OL/PL-722,Vydřiduch ,,49.77092743,13.66577721,513 +#OL/PL-723,Zlamnoha,,49.67754745,13.66777992,513 +#OL/PL-724,Černava ,,49.52134323,12.79023457,512 +#OL/PL-725,Chřebřanský vrch ,,49.58076859,12.86575031,512 +#OL/PL-726,Nad Myslivnou,,49.63453674,12.88605595,512 +#OL/PL-727,Boubínský ,,49.36399841,13.66337967,512 +#OL/PL-728,Lomec,,49.24520111,13.61145020,512 +#OL/PL-729,Šibenec ,,49.86239243,13.79082584,512 +#OL/PL-730,Strážov ,,49.93012238,13.77218819,511 +#OL/PL-731,Velký Kozlík ,,49.49603271,13.10372353,510 +#OL/PL-732,Třebýcinská Planá hora ,,49.99418259,13.45489788,510 +#OL/PL-734,Chlumánek ,,49.54826736,13.51103973,510 +#OL/PL-735,Dědina ,,49.43730927,13.76875877,510 +#OL/PL-736,Farský vrch ,,49.71605301,12.87330532,509 +#OL/PL-737,Ohrada,,49.74825668,13.67805958,509 +#OL/PL-738,Ježovská hůrka ,,49.48136139,13.22203255,508 +#OL/PL-739,Ptáčník ,,49.55324173,12.82153797,507 +#OL/PL-740,Šibeniční vrch ,,49.72340393,12.75931549,507 +#OL/PL-741,Kamenná hora ,,49.56369781,13.11792088,507 +#OL/PL-742,Flaška ,,49.76836014,13.08711815,507 +#OL/PL-743,Skleněný vrch ,,49.39586258,13.22170353,507 +#OL/PL-744,Jezevčiny ,,49.90710068,13.33422852,507 +#OL/PL-745,Dubí ,,49.57970810,13.51617050,507 +#OL/PL-746,Semlina,,49.30609894,13.60826874,507 +#OL/PL-747,Hůrka ,,49.30518341,13.70272064,507 +#OL/PL-748,Stolavec,,49.33920670,13.68233395,507 +#OL/PL-749,Nad Hájovnou ,,49.78367615,12.69885159,506 +#OL/PL-750,Skočická Mýť ,,49.55674744,13.27217388,506 +#OL/PL-751,Kuneš ,,49.27169037,13.64377117,506 +#OL/PL-752,Obecní borek ,,49.58647537,12.70903111,505 +#OL/PL-753,Přešov ,,49.80155945,13.57921886,505 +#OL/PL-754,Na Vrších ,,49.33837891,13.66065979,504 +#OL/PL-755,Ostrovský vrch ,,49.77803421,12.88615131,503 +#OL/PL-756,Strážiště ,,49.57176590,12.94509411,503 +#OL/PL-757,Miškovec ,,49.48857117,13.19967747,503 +#OL/PL-758,Průhon ,,13.44199657,49.63256073,503 +#OL/PL-759,Hora,,49.39875031,13.22920990,502 +#OL/PL-760,Hůrka ,,49.39060974,13.36454964,502 +#OL/PL-761,Rovnička ,,49.86947250,13.61953354,502 +#OL/PL-762,U Jezírka ,,49.62100601,12.53338528,501 +#OL/PL-763,Borek,,49.48416138,12.90767288,500 +#OL/PL-764,Lužanská hora ,,49.53471756,13.32525063,500 +#OL/PL-765,Hrádek ,,49.86994934,13.60515785,500 +#OL/PL-766,Hůrka ,,49.84614563,13.63666725,500 +#OL/PL-767,Na Křídle ,,49.45185089,13.02352047,499 +#OL/PL-768,Na Pohodnici,,49.74182510,13.49035549,499 +#OL/PL-769,Rokošínský vrch ,,49.53167343,12.80745983,498 +#OL/PL-770,Červený vrch ,,49.48288727,12.85393429,498 +#OL/PL-771,Zářecí ,,49.83702087,12.97759724,498 +#OL/PL-772,Na Kalvárii ,,49.82424164,13.60413647,498 +#OL/PL-773,Šibeník ,,49.30686951,13.70576000,498 +#OL/PL-774,Jedlová ,,49.76424408,12.89152813,497 +#OL/PL-775,Babylón ,,49.39604187,13.21444988,497 +#OL/PL-776,V Hřebenu ,,49.44042969,13.26772022,497 +#OL/PL-777,Pokrývadlo ,,49.43220520,13.29829121,497 +#OL/PL-778,Na Vrších ,,49.41313553,13.37318039,496 +#OL/PL-779,Severní vrch ,,49.73695755,12.90670204,495 +#OL/PL-780,Chlum,,49.80966187,13.02677727,495 +#OL/PL-781,Malý Kozlík ,,49.49204254,13.10608673,495 +#OL/PL-782,Svářeč ,,49.63582993,13.56698418,495 +#OL/PL-783,Doubravka,,49.67547989,12.80111027,494 +#OL/PL-784,Kleštiny ,,49.69031906,12.89838982,494 +#OL/PL-785,Hamerský vrch ,,49.66136169,12.80385208,493 +#OL/PL-786,Křemenáč ,,49.83057404,13.58626747,493 +#OL/PL-787,Kněžhora ,,49.50600815,13.23826790,492 +#OL/PL-788,Ptenínská hora ,,49.51761246,13.17915726,492 +#OL/PL-789,Výhořička ,,49.37002182,13.28313732,492 +#OL/PL-790,Na Homolce,,49.59997559,13.38512993,492 +#OL/PL-791,Mirkovický vrch ,,49.57565308,12.78711796,491 +#OL/PL-792,Hůrka ,,49.49201965,13.17160130,491 +#OL/PL-793,Hrádek ,,49.49515915,13.20683861,491 +#OL/PL-794,Hájek ,,49.43898010,13.27702999,491 +#OL/PL-795,Haškovec ,,49.45666885,13.39375973,491 +#OL/PL-796,Na Hájku ,,49.54508972,12.78645325,490 +#OL/PL-797,Zadní kopec ,,49.82554245,13.02134705,490 +#OL/PL-798,Hůrka ,,49.55728912,13.39472389,490 +#OL/PL-799,Chlumec,,49.50088882,13.17745781,489 +#OL/PL-800,Výrovec ,,49.99938583,13.29208088,489 +#OL/PL-801,Oplotecký kopec ,,49.58090591,12.84609413,488 +#OL/PL-802,Klasnice,,49.75363541,13.08014488,488 +#OL/PL-803,Dubí ,,49.52966309,13.24161911,488 +#OL/PL-804,Stradiště ,,49.72007751,13.48625755,488 +#OL/PL-805,Matčina hora ,,49.88757706,13.74342060,487 +#OL/PL-806,Strážiště ,,49.68554306,12.95327759,486 +#OL/PL-807,Černý vrch ,,49.56614304,13.22714233,486 +#OL/PL-808,Hůrka ,,49.28577042,13.64770031,486 +#OL/PL-809,Velký Škarmaň ,,49.44816589,12.94309235,485 +#OL/PL-810,Hůrka ,,49.77415466,13.54535294,485 +#OL/PL-811,Na Pařezech ,,49.29595947,13.70722961,485 +#OL/PL-812,Šárka ,,49.76935577,12.87586212,484 +#OL/PL-813,Paní hora ,,49.57383347,13.22177315,484 +#OL/PL-814,Skalka,,49.52183151,13.32016373,484 +#OL/PL-815,Hora,,49.42296982,13.36645699,484 +#OL/PL-816,Kotrbov,,49.48401260,13.06873035,483 +#OL/PL-817,Holý vrch ,,49.48929977,13.18634033,483 +#OL/PL-818,Ticholovec,,49.56417465,13.35721397,483 +#OL/PL-819,Dublovická hora ,,49.47896576,12.82505703,482 +#OL/PL-820,Petrovka,,49.36800766,13.34745216,482 +#OL/PL-821,Šusty ,,49.45598221,13.41150379,482 +#OL/PL-822,Liščí vrch ,,49.64282227,12.91029930,481 +#OL/PL-823,Vrch,,49.40383911,13.23735046,481 +#OL/PL-824,Holý vrch ,,49.53439331,13.26422691,481 +#OL/PL-825,Chlum,,49.44553375,13.40003204,481 +#OL/PL-826,Na Vrších ,,49.84627151,13.57546043,481 +#OL/PL-827,Holeček ,,49.87625504,13.74783421,481 +#OL/PL-828,Tetřívek ,,49.34460831,12.96800995,480 +#OL/PL-829,U Tuněchod ,,49.67678833,12.93845272,480 +#OL/PL-830,Spáleniště ,,49.51985931,13.21016026,479 +#OL/PL-831,Prašivý vrch ,,49.57326889,13.20646954,479 +#OL/PL-832,Vřesina,,49.69817352,12.89505577,478 +#OL/PL-833,Štítarský vrch ,,49.57278824,12.80860519,477 +#OL/PL-834,Srnčí ,,49.52951813,13.15394974,477 +#OL/PL-835,Merklínská hůrka ,,49.56544113,13.20957565,477 +#OL/PL-836,Hůrka ,,49.47081757,13.40174866,477 +#OL/PL-837,Tlustá hora ,,49.62744904,13.37890434,477 +#OL/PL-838,Boušov ,,49.60839462,13.04466152,476 +#OL/PL-839,Lipová hora ,,49.36515808,13.26589680,476 +#OL/PL-840,Hájek ,,49.45711517,13.35858822,476 +#OL/PL-841,Dvanáctka ,,49.62086105,13.02023602,475 +#OL/PL-842,Holubí hlava ,,49.55355835,13.11853123,475 +#OL/PL-843,Kobylany,,49.49354935,13.08382225,474 +#OL/PL-844,Klítka ,,49.51245499,13.09999371,474 +#OL/PL-845,Ostrý kámen ,,49.77338791,13.53026485,474 +#OL/PL-846,Kopanina,,49.49995422,12.96180630,473 +#OL/PL-847,Jahodový vrch ,,49.58309937,13.22990036,473 +#OL/PL-848,Kolíbka ,,49.66477966,13.45393944,473 +#OL/PL-849,Strážská hůrka ,,49.66572571,12.77992821,472 +#OL/PL-850,Šibeničník ,,49.33594894,12.97035027,472 +#OL/PL-851,Šibeniční vrch ,,49.75294113,12.97187901,472 +#OL/PL-852,Křížový vrch ,,49.75231171,13.01444435,472 +#OL/PL-853,Pod Ostrým ,,49.43144226,13.35988617,472 +#OL/PL-854,Na Pepánku ,,49.50218964,13.08436966,471 +#OL/PL-855,Evangelista,,49.75634384,13.02305508,470 +#OL/PL-856,Hamouz,,49.94039154,13.65998745,470 +#OL/PL-857,V Senci,,49.88217545,13.64723396,469 +#OL/PL-858,Větrný vrch ,,49.49657440,12.85068321,468 +#OL/PL-859,Černá skalka ,,49.95089722,13.73006344,468 +#OL/PL-860,Podhůrka ,,49.72731781,12.96750736,467 +#OL/PL-861,Holý vrch ,,49.58200073,13.22181034,467 +#OL/PL-862,Čihátko ,,49.90290833,13.69188595,467 +#OL/PL-863,Zderaz,,49.51163101,13.21098995,466 +#OL/PL-864,Kluk,,49.65765381,13.35706139,465 +#OL/PL-865,Brodské Čihadlo ,,49.69891357,12.90811539,464 +#OL/PL-866,Pohřebiště ,,49.85585403,13.02656555,464 +#OL/PL-867,Dolíčka ,,49.86777496,13.43488789,464 +#OL/PL-868,Výšina ,,49.56191635,12.86219788,463 +#OL/PL-869,Malechovská hůrka ,,49.44756699,13.26177692,462 +#OL/PL-870,Na Krásnici ,,49.91684341,13.36665726,462 +#OL/PL-871,Jonáková ,,49.58895111,13.51876831,462 +#OL/PL-872,Sedlecká skála ,,49.69104767,13.50629425,462 +#OL/PL-873,Husín ,,49.40787888,13.24972343,461 +#OL/PL-874,Na Borku,,49.44202042,13.18196011,461 +#OL/PL-875,Rážek ,,49.35842514,13.72104168,461 +#OL/PL-876,Smolný vrch ,,49.81710052,13.24301147,460 +#OL/PL-877,Šibeniční vrch ,,49.52071762,12.95994759,459 +#OL/PL-878,Na Kocandě ,,49.71291733,13.47260857,459 +#OL/PL-879,Husina,,49.51062393,12.93461609,458 +#OL/PL-880,Hůrka ,,49.46514893,13.36985970,458 +#OL/PL-881,Oulík ,,49.49443054,13.19487953,457 +#OL/PL-882,Horní Ptačí vrch ,,49.61272430,13.19599342,457 +#OL/PL-883,Dobrák ,,49.73836517,13.19111633,456 +#OL/PL-884,Kosina,,49.86071396,13.43968010,456 +#OL/PL-885,Holý vrch ,,49.85103607,13.54193306,456 +#OL/PL-886,Vicenická hůrka ,,49.45297623,13.30121422,455 +#OL/PL-887,Vrší ,,49.55319595,13.24165916,453 +#OL/PL-888,Vršíček ,,49.75889170,13.56485950,462 +#OL/PL-889,Remíz ,,49.55987930,12.89237976,452 +#OL/PL-890,Lopata,,49.66712189,13.56029987,452 +#OL/PL-891,Sýtná ,,49.78546143,13.34740639,451 +#OL/PL-892,Čelákovská hora ,,49.57992172,13.15570068,450 +#OL/PL-893,Čelín ,,49.80818176,13.15537930,450 +#OL/PL-894,Hájek ,,49.53953171,13.22821617,450 +#OL/PL-895,Hůrka ,,49.47735596,13.03663254,449 +#OL/PL-896,Na Hrádku ,,49.31436920,13.73462009,447 +#OL/PL-897,Kacle,,49.31924057,13.73114014,446 +#OL/PL-898,V Americe,,49.59500885,13.19974709,445 +#OL/PL-899,Lysina,,49.48604584,13.29885483,444 +#OL/PL-900,Pod Višňovkou ,,49.83233261,13.07402611,443 +#OL/PL-901,Smrkový vrch ,,49.76128006,13.55140305,443 +#OL/PL-902,Zámkovská hora ,,49.41822052,13.35678005,442 +#OL/PL-903,Janovcový vrch ,,49.53028107,12.85219097,440 +#OL/PL-904,Řípec ,,49.54965210,13.30328274,440 +#OL/PL-905,Rohatá skála ,,49.59271240,13.52009296,440 +#OL/PL-906,Podháj ,,49.50495529,12.91131687,438 +#OL/PL-907,Roman,,49.74242020,12.96899033,438 +#OL/PL-908,Na Skalce,,49.81670761,13.34356213,437 +#OL/PL-909,Háje ,,49.71987152,13.44092464,436 +#OL/PL-910,Val,,49.68422318,13.41239643,435 +#OL/PL-911,Na Hrbech,,49.91043472,13.38158226,434 +#OL/PL-912,Hůrka ,,49.60136032,13.15079498,433 +#OL/PL-913,Lipový vrch ,,49.54849625,13.18895912,433 +#OL/PL-914,Spálený vrch ,,49.70608139,13.51975822,433 +#OL/PL-915,Střežatka ,,49.93897247,13.68031788,433 +#OL/PL-916,Volkův kříž ,,49.55129623,13.00900269,432 +#OL/PL-917,Mastník ,,49.55312729,13.08337212,431 +#OL/PL-918,Hůrka ,,49.70597076,13.48347855,431 +#OL/PL-919,Březník ,,49.54656219,13.34320545,430 +#OL/PL-920,Hradiště ,,49.76137161,13.51340961,430 +#OL/PL-921,Chlum,,49.82437897,13.53939819,429 +#OL/PL-922,Hůrka ,,49.60687637,13.27007008,426 +#OL/PL-923,Ve Vrších ,,49.62000275,13.31114197,424 +#OL/PL-924,Lazy,,49.92369843,13.41992569,424 +#OL/PL-925,Babina,,49.88447952,13.60473919,423 +#OL/PL-926,Bůrky ,,49.42355728,13.32197857,421 +#OL/PL-927,Skočický holý vrch ,,49.55345917,13.30506039,420 +#OL/PL-928,Kamýk - ruins ,,49.77132797,13.59021378,420 +#OL/PL-929,U Petra,,49.83230000,13.45350000,406 +#OL/PL-930,Mlýnský vrch ,,49.51304245,12.89118767,417 +#OL/PL-931,Čihadlo ,,49.71696854,13.62952232,417 +#OL/PL-932,Na Horách ,,49.83259583,13.36265469,416 +#OL/PL-933,Chlum,,49.76776123,13.43033409,416 +#OL/PL-934,Výchoz ,,49.62410355,13.11980343,415 +#OL/PL-935,Střední vrch ,,49.90124512,13.45162964,415 +#OL/PL-936,Strážka ,,49.77270126,13.18717194,414 +#OL/PL-937,Dubensko (Dlouhý hřeben) ,,49.92697144,13.40153790,410 +#OL/PL-939,Luhová ,,49.82407379,13.41668034,410 +#OL/PL-940,Dubová hora ,,49.69122696,13.33973408,407 +#OL/PL-941,Velká Hůrka ,,49.93426514,13.60397053,407 +#OL/PL-942,Špitál ,,49.82745743,13.34547520,404 +#OL/PL-943,Sylvánský vrch ,,49.76914215,13.34351730,403 +#OL/PL-944,Chrástecký vrch ,,49.79433800,13.50839890,386 +#OL/PL-945,Orlík ,,49.80716324,13.38358307,400 +#OL/PL-946,Zlín ,,49.60709000,13.36526966,396 +#OL/PL-947,Kotlík ,,49.69044113,13.36039257,392 +#OL/PL-948,Březový vrch ,,49.67328262,13.32304668,391 +#OL/PL-949,Kamínek ,,49.66241837,13.27896500,387 +#OL/PL-950,Holý Zlín ,,49.60461044,13.36172390,386 +#OL/PL-951,Za Ovčínem ,,49.89928436,13.52777958,385 +#OL/PL-952,Na Vartě ,,49.85552979,13.49928093,384 +#OL/PL-953,Hůrka ,,49.70580292,13.35765648,378 +#OL/PL-954,Holý vrch ,,49.77180481,13.44731426,373 +#OL/PL-955,Homolka,,49.72362137,13.39798641,371 +#OL/ST-001,Hřebence ,,49.57944489,13.77680588,788 +#OL/ST-002,Kobylí hlava (Hradiště Hengst) ,,49.56259155,13.76679993,750 +#OL/ST-004,Na Skalách ,,49.60554504,13.76795864,744 +#OL/ST-005,Hradecký hřeben ,,49.56983566,13.85007286,721 +#OL/ST-006,Mezivrata,,49.60228348,14.67128181,713 +#OL/ST-007,Jilmový ,,49.56343460,13.79747963,712 +#OL/ST-008,Vrchy,,49.54753876,13.76057053,712 +#OL/ST-009,Kalvarie,,49.57712936,14.65717602,698 +#OL/ST-010,Třemešný vrch ,,49.57515717,13.80690193,697 +#OL/ST-011,Na Vrchu,,49.56026459,13.85737801,695 +#OL/ST-012,Džbány ,,49.65890884,14.69694901,688 +#OL/ST-013,Na Kozině ,,49.62549210,14.68607998,678 +#OL/ST-014,Homole,,49.55292892,14.43259525,670 +#OL/ST-015,Altán ,,49.55232239,13.86906624,669 +#OL/ST-016,Čeřenská hora ,,49.64550400,14.66323376,665 +#OL/ST-017,Velká hora ,,49.55839920,13.81494236,659 +#OL/ST-018,Šibeník ,,49.56204224,14.66624260,656 +#OL/ST-019,Na skalách ,,49.54917908,13.82124901,651 +#OL/ST-020,Výrovna ,,49.56259155,13.76679993,641 +#OL/ST-021,Charvát ,,49.82616043,14.10856724,640 +#OL/ST-022,Hejlový ,,49.56007004,14.63218403,640 +#OL/ST-023,Dubová hora ,,49.62264252,13.81338501,639 +#OL/ST-024,Provazec,,49.77626801,14.04642487,639 +#OL/ST-025,Větrov ,,49.53587723,14.60638237,639 +#OL/ST-026,Kuchyňka ,,49.78686905,14.07577991,636 +#OL/ST-027,Na Skále ,,49.63813782,13.92624760,633 +#OL/ST-028,Holý vrch ,,49.77138901,14.03918839,632 +#OL/ST-029,Malý vrch ,,49.77918243,14.05948067,628 +#OL/ST-030,Hrby,,49.56558228,14.25277710,627 +#OL/ST-031,Dubová hora ,,49.70189285,13.96578217,626 +#OL/ST-032,Starý vrch ,,49.77544022,14.02044106,620 +#OL/ST-033,Hůrka ,,49.64770889,14.67961979,617 +#OL/ST-034,Žďár ,,49.59719467,14.60887814,616 +#OL/ST-035,Velká Baba ,,49.79273224,14.05321598,615 +#OL/ST-036,Levín ,,49.65199280,14.04564190,612 +#OL/ST-037,Perka,,49.58541489,14.68711185,611 +#OL/ST-038,Vraneč ,,49.61778641,14.04276562,608 +#OL/ST-039,Jistebník ,,49.84523773,14.14310074,606 +#OL/ST-040,Na skalkách ,,49.65073013,14.94558430,604 +#OL/ST-041,Mýto ,,49.64360428,14.00657749,599 +#OL/ST-042,Strážný ,,49.71075439,14.03350544,599 +#OL/ST-043,Deboreč ,,49.57572937,14.60263157,598 +#OL/ST-044,Pravětický vrch ,,49.59291077,14.89085388,598 +#OL/ST-045,Kopanina,,49.65096664,14.61432171,592 +#OL/ST-046,Malý Chlum ,,49.75387573,14.04453182,591 +#OL/ST-047,Chlum,,50.05611038,13.48305988,590 +#OL/ST-048,Březina ,,49.55920029,14.09468651,588 +#OL/ST-049,Dvořáček ,,49.61991501,14.50967979,587 +#OL/ST-050,Vysoký ,,49.66808701,14.07814407,583 +#OL/ST-051,Jivina,,49.60546494,14.70381355,583 +#OL/ST-052,Chrastišov ,,49.65961075,14.71833897,583 +#OL/ST-053,Malý Blaník ,,49.63008499,14.86374092,580 +#OL/ST-054,Křížovská hůra ,,49.65141678,14.89704037,580 +#OL/ST-055,Hotětín ,,49.57601547,14.26401615,579 +#OL/ST-056,Radešínská hora ,,49.57281494,14.29349709,578 +#OL/ST-057,Červíková skála ,,49.68227768,14.75014591,578 +#OL/ST-058,Hromovka,,49.77125931,13.82242680,577 +#OL/ST-059,Obraženka ,,49.64733505,14.56437111,577 +#OL/ST-060,Číčová ,,49.65624237,14.07260418,576 +#OL/ST-061,Věž ,,49.70708466,14.77587128,574 +#OL/ST-062,Holý vrch ,,49.61436081,13.97040462,573 +#OL/ST-063,Hodětín ,,49.56552887,14.31384850,572 +#OL/ST-064,Malá Dubová hora ,,49.69764709,13.97397041,570 +#OL/ST-065,Kosí ,,49.60123825,14.57253170,570 +#OL/ST-066,Červená hora ,,49.65507126,14.55587769,570 +#OL/ST-067,Kárník ,,49.68667221,14.69167519,569 +#OL/ST-068,Hradec,,49.58915329,13.89776897,565 +#OL/ST-069,Skuhrovský vrch ,,49.58707809,14.39777660,565 +#OL/ST-070,Jouglovka,,49.93204117,13.83958149,563 +#OL/ST-071,Bukovec,,49.63968658,14.18704605,562 +#OL/ST-072,Býkovická hůrka ,,49.62023926,14.87561989,561 +#OL/ST-073,Číhanice ,,49.61935425,14.56716728,560 +#OL/ST-074,Lampír ,,49.62348938,14.35789490,559 +#OL/ST-075,Semtínská hora ,,49.67280197,14.67247009,559 +#OL/ST-076,Lohovka,,49.71968842,14.71588230,559 +#OL/ST-077,Drahýšov ,,49.57056808,13.91876793,558 +#OL/ST-078,Kněžská hora ,,49.57912827,14.36434269,556 +#OL/ST-079,Bukovec,,49.58639908,14.29031277,554 +#OL/ST-080,Vápenka ,,49.58340836,14.57622910,554 +#OL/ST-081,Skalka,,49.87973785,14.25161457,553 +#OL/ST-082,Velký Pýrný ,,49.61725616,14.37547588,553 +#OL/ST-083,Sýrek ,,49.67546082,14.72600842,553 +#OL/ST-084,Kopaniny,,49.82437134,15.13113117,552 +#OL/ST-085,Spálený ,,49.82024002,14.15877819,551 +#OL/ST-086,Nový vrch ,,49.65695572,14.54001045,551 +#OL/ST-087,Vršky,,49.62856674,14.58735847,549 +#OL/ST-088,Skrýšov ,,49.65795898,14.75148964,548 +#OL/ST-089,Vysoký Tok ,,49.99279022,13.84872341,546 +#OL/ST-090,Radešín ,,49.60354614,14.36900806,546 +#OL/ST-091,Blažejovický vrch ,,49.63143158,15.19852257,546 +#OL/ST-092,Hřebeny ,,49.58815384,14.13599014,544 +#OL/ST-093,Květná ,,49.70541763,14.02373600,543 +#OL/ST-094,Houpačka ,,49.67675400,14.12865543,542 +#OL/ST-095,Vystrkov,,49.77763748,13.96294880,541 +#OL/ST-096,Hořice ,,49.76034927,14.01841259,540 +#OL/ST-097,Spálený vrch ,,49.66916275,14.10550880,540 +#OL/ST-098,Vinice,,49.56975174,13.97123241,539 +#OL/ST-099,Na Hradě (Zvěřinec) ,,49.72668457,14.75435829,539 +#OL/ST-101,Jedlina,,49.63896942,14.33375835,538 +#OL/ST-102,Pilkovy hory,,49.62537384,14.56057930,538 +#OL/ST-103,Nad Kostelem,,50.05599213,13.65710449,537 +#OL/ST-104,Chlumec,,49.59801865,13.93775749,537 +#OL/ST-105,Vraní skála ,,49.92754364,13.94145584,536 +#OL/ST-106,Počepická hora ,,49.59155273,14.37281513,536 +#OL/ST-107,Stráž ,,49.55135727,13.94208717,535 +#OL/ST-108,Obrova stolice,,49.81930161,15.09030342,535 +#OL/ST-109,Velké Čihátko ,,49.94617081,13.91685009,534 +#OL/ST-110,Hůrka ,,49.72327042,13.99096775,534 +#OL/ST-111,Vinice,,49.61336899,14.13975334,533 +#OL/ST-112,Rýšovka ,,49.73225021,14.52941895,533 +#OL/ST-113,Buchovský vrch ,,49.69310760,14.78647327,533 +#OL/ST-114,Vrchy,,49.79676437,14.89117527,533 +#OL/ST-115,Maliník ,,50.09817505,13.50547218,532 +#OL/ST-116,Špička ,,49.97508621,13.86320400,531 +#OL/ST-117,Hradec ,,49.53129196,13.94362640,531 +#OL/ST-118,Kazatelna,,49.80653763,14.13500023,531 +#OL/ST-119,Čihadlo ,,49.77998352,15.12312222,531 +#OL/ST-120,Baba,,49.55805969,14.13364601,530 +#OL/ST-121,Lísek ,,49.69107056,14.72392464,529 +#OL/ST-122,Pod Skálou ,,49.74789047,14.25908661,528 +#OL/ST-123,Bludný ,,49.94342422,13.78478432,527 +#OL/ST-124,Roudný ,,49.98244476,13.80757046,527 +#OL/ST-125,Dráska ,,49.73437119,14.03558922,527 +#OL/ST-126,Zhoř ,,49.57324219,14.45128059,526 +#OL/ST-127,Sukovice,,49.70077896,14.75382328,526 +#OL/ST-128,Horka,,49.68139267,15.02772427,526 +#OL/ST-129,Cizí ,,49.60822678,14.12567043,524 +#OL/ST-130,Strážník ,,49.59839249,14.27519321,524 +#OL/ST-131,V Hoře ,,49.66395950,14.52863693,524 +#OL/ST-132,Machotín ,,49.84262085,14.84834671,524 +#OL/ST-133,Holý vrch ,,49.95311737,13.78989315,523 +#OL/ST-134,Vinice,,49.59044647,14.30530834,523 +#OL/ST-135,Přední vrch ,,49.64529419,14.78712559,523 +#OL/ST-136,Kopanina,,49.63562393,15.13616371,523 +#OL/ST-137,Hudlický vrch ,,49.97456360,13.95291996,522 +#OL/ST-138,Ostrá ,,49.60357285,14.11955261,522 +#OL/ST-139,Pomněnina ,,49.67396927,14.54849911,522 +#OL/ST-140,Zajícův vrch ,,49.61081696,14.29471970,521 +#OL/ST-141,Hradecký vrch ,,49.84860229,14.85544968,521 +#OL/ST-142,Krásná hora ,,49.82953262,14.76651859,520 +#OL/ST-143,Jalovčiny ,,49.72327042,13.99096775,519 +#OL/ST-144,Hradiště ,,49.62421417,14.16658974,519 +#OL/ST-145,Hříva ,,49.65516663,14.83928680,519 +#OL/ST-146,Bučina ,,49.67448044,14.95176697,519 +#OL/ST-147,Dlouhý hřeben ,,50.00281143,13.88030052,519 +#OL/ST-148,Rohatec,,49.73973083,14.28918934,518 +#OL/ST-149,Hůrka ,,49.76092911,14.78662014,518 +#OL/ST-150,Vrchy,,49.62415695,14.91116524,518 +#OL/ST-151,Zadní Hrobce ,,49.98005295,13.87067509,517 +#OL/ST-152,Kalamajka,,49.72518539,14.84371758,517 +#OL/ST-153,Opyš ,,49.87747574,13.85202503,516 +#OL/ST-154,Rampaška ,,49.53884506,13.99167442,516 +#OL/ST-155,Na Altánku ,,49.63006592,14.20061016,516 +#OL/ST-156,Pánův vrch ,,49.76667023,14.25891113,516 +#OL/ST-157,Holý ,,49.81027222,14.48418713,516 +#OL/ST-158,Skalka,,49.92004013,14.79795456,516 +#OL/ST-159,Čihadlo ,,49.53454590,13.98557091,515 +#OL/ST-160,Hrb,,49.59975052,14.32089710,515 +#OL/ST-161,Kamenná ,,49.62936020,14.39238071,515 +#OL/ST-162,Vijanka,,49.79934311,14.82302475,515 +#OL/ST-163,Porostlý ,,49.57526016,14.49961472,514 +#OL/ST-164,Holý vrch ,,49.68649292,15.05822659,514 +#OL/ST-165,Točný vrch ,,49.68006516,14.13879871,512 +#OL/ST-166,Mírovky ,,49.59044647,14.24774837,512 +#OL/ST-167,Merova hora,,49.55416489,14.36544132,509 +#OL/ST-168,Velkonáč ,,49.77414322,14.96455669,509 +#OL/ST-169,Holubí vrch ,,50.02331161,13.54264355,509 +#OL/ST-170,Nečínská besídka ,,49.70701218,14.24672699,508 +#OL/ST-171,Černá skála ,,49.63587189,14.32061672,508 +#OL/ST-172,Čistá ,,49.59272003,14.16004181,507 +#OL/ST-173,Kouty,,49.77587128,14.08621216,507 +#OL/ST-174,Malinová ,,49.81391525,14.15944386,507 +#OL/ST-175,Bukovice,,49.61043930,14.17225075,507 +#OL/ST-176,Kateřinka ,,49.76839447,14.26999474,507 +#OL/ST-177,Skřivánek ,,49.78390121,14.91020679,507 +#OL/ST-178,Větrák ,,49.66902542,14.59289169,506 +#OL/ST-179,Chlum,,49.77211761,14.60836124,506 +#OL/ST-180,Radimovka,,49.93572998,14.62609959,506 +#OL/ST-181,Pohoř ,,49.78417206,15.10790730,506 +#OL/ST-182,Žalý ,,50.16682434,13.85373306,506 +#OL/ST-183,Točná ,,49.83730698,14.20131493,505 +#OL/ST-184,Pačiska ,,49.63276672,14.41084003,505 +#OL/ST-185,Babka,,49.89172363,14.23605919,504 +#OL/ST-186,Drahoušek ,,49.69923019,14.45735168,504 +#OL/ST-187,Zelený vrch ,,49.95920944,13.79442501,503 +#OL/ST-188,Stráž ,,49.70835495,14.80238438,503 +#OL/ST-189,Klásek ,,49.75997162,14.97356415,503 +#OL/ST-190,Čepel ,,49.65578842,14.20528793,502 +#OL/ST-191,Svinný ,,49.71231079,14.49354744,502 +#OL/ST-192,Ve vrchu (Hradiště Tožice) ,,49.67624283,14.89831924,502 +#OL/ST-194,Kobyla,,49.95521927,14.79557705,501 +#OL/ST-195,Velká Pleš ,,49.99172974,13.80789852,500 +#OL/ST-196,Krsov,,49.75204849,14.00478077,500 +#OL/ST-197,Dubovka,,49.83920670,14.78138065,500 +#OL/ST-198,Meduna,,49.84009552,14.75823498,500 +#OL/ST-199,Lhotecký ,,49.71657181,14.49694347,499 +#OL/ST-200,Bukovec,,49.69715500,14.63447857,499 +#OL/ST-201,Kochánov ,,49.79904556,14.77655888,499 +#OL/ST-202,Hájek ,,49.75952911,14.49683285,498 +#OL/ST-203,Beraník ,,50.00987625,13.87433052,498 +#OL/ST-204,Křemení ,,49.74835587,14.79855728,497 +#OL/ST-205,Valová hora ,,49.61957169,14.30223560,496 +#OL/ST-206,Besedná ,,49.76470184,14.37680531,496 +#OL/ST-207,Trkovská hora ,,49.59129715,14.43524933,496 +#OL/ST-208,Dubí ,,49.74563980,14.49686527,496 +#OL/ST-209,Vysoká hora ,,49.64321518,14.48938942,496 +#OL/ST-210,Háj ,,49.79963303,14.52009583,496 +#OL/ST-211,Spálená hora ,,49.85656357,14.89705086,496 +#OL/ST-212,Strážnice ,,49.79038239,15.08258057,496 +#OL/ST-213,Nízký Tok ,,49.98781967,13.85553837,495 +#OL/ST-214,Plešivec ,,49.91385651,13.93963814,495 +#OL/ST-215,U tří skal ,,49.96269608,13.82579422,493 +#OL/ST-216,Vejřice ,,49.69378281,14.51925278,493 +#OL/ST-217,U Vlčí jámy ,,49.78217316,14.75863457,493 +#OL/ST-218,Děd ,,49.96756363,14.03361511,492 +#OL/ST-219,Na Věnci ,,49.63745499,14.39892769,492 +#OL/ST-220,Homolka,,49.76206589,14.82049465,492 +#OL/ST-221,Tři skalky ,,49.96028137,13.87994957,491 +#OL/ST-222,Drásovský chlum ,,49.70083618,14.10670185,490 +#OL/ST-223,Jonáš ,,49.64160156,14.39389038,490 +#OL/ST-224,Na Včelníku ,,49.84910202,14.27690315,490 +#OL/ST-225,Veselý vrch ,,49.74487305,14.34341335,490 +#OL/ST-226,Hůra ,,49.96285248,14.69839191,490 +#OL/ST-227,Radov,,49.80395508,14.82734394,490 +#OL/ST-228,Dubinky,,49.94888687,13.75721455,489 +#OL/ST-229,Krchov,,49.60681534,14.19921875,489 +#OL/ST-230,Hatě ,,49.69485855,14.55451775,489 +#OL/ST-231,Kněží hora ,,49.88214493,14.53208447,489 +#OL/ST-232,Kamenné vrchy ,,50.00526047,13.90313053,489 +#OL/ST-233,Dubiny,,49.72775650,14.52147102,488 +#OL/ST-234,Dubina,,49.59487534,14.26539230,487 +#OL/ST-235,Maršovka ,,49.79393387,14.49947739,487 +#OL/ST-236,Bartošky ,,49.93005371,14.65111256,487 +#OL/ST-237,Krasovická hůra ,,49.65866852,14.88106346,487 +#OL/ST-238,Jordán ,,49.76037598,15.07941914,487 +#OL/ST-239,Červená hora ,,49.82767487,14.40636253,486 +#OL/ST-240,Čihadlo ,,49.81386185,14.96730804,486 +#OL/ST-241,Vysoký vrch ,,50.05883789,14.06441879,486 +#OL/ST-242,Tok,,49.95950699,13.81627941,485 +#OL/ST-243,Černé vrchy ,,49.66864777,14.17137432,485 +#OL/ST-244,Holý vrch ,,49.78692245,14.49165916,485 +#OL/ST-245,Droužková ,,49.57374954,14.19400597,484 +#OL/ST-246,Chlum,,49.67394257,14.18758392,484 +#OL/ST-247,Lísek ,,49.97104263,14.01926517,483 +#OL/ST-248,Ruda,,49.76339722,14.54500294,483 +#OL/ST-249,Chlumec,,49.59849930,14.13348293,482 +#OL/ST-250,Stolec,,49.68814468,14.80779076,482 +#OL/ST-251,Výrův kopec (Přední kopec) ,,49.85711288,14.74112129,481 +#OL/ST-253,Chlum,,49.90861130,14.80390739,481 +#OL/ST-254,Calta,,49.62437820,14.14941788,480 +#OL/ST-255,Cholinská ,,49.66154480,14.21605778,480 +#OL/ST-256,Zámeček ,,49.68825150,14.23892021,480 +#OL/ST-257,Budákův kopec ,,49.75798798,14.56082535,480 +#OL/ST-258,Tobiášův vrch ,,50.13002014,13.50576973,480 +#OL/ST-259,Na Vršku ,,49.61371613,14.32214260,479 +#OL/ST-260,Bukovec,,49.77011108,14.45039463,479 +#OL/ST-261,Sychrov,,49.66254044,14.49916363,479 +#OL/ST-262,Čeřenice ,,49.83837128,14.91255379,479 +#OL/ST-263,Sedlčanský Šiberný ,,49.64939880,14.41252327,478 +#OL/ST-264,Řezáky ,,49.76820374,14.48985481,478 +#OL/ST-265,V Hůrkách ,,49.73737717,14.77595425,478 +#OL/ST-266,Slepičí skála ,,49.59114075,14.85189533,478 +#OL/ST-267,Na Skaliskách ,,49.98837662,13.93688393,477 +#OL/ST-268,Peklo,,49.60440826,14.31795311,477 +#OL/ST-269,Častovka ,,49.84998322,14.73949051,477 +#OL/ST-270,Stříbrný vrch ,,49.71169662,14.35562325,476 +#OL/ST-271,Břeský vrch ,,49.89873123,14.79269695,476 +#OL/ST-272,Hudečka ,,49.90043259,14.87322998,476 +#OL/ST-273,Újezdce ,,49.90364456,14.07488823,474 +#OL/ST-274,Hořič ,,49.63214493,14.15880966,474 +#OL/ST-275,Drábovky ,,49.73334503,14.57037354,474 +#OL/ST-276,Vlčice ,,49.74386215,14.71329880,474 +#OL/ST-277,Na hůrkách ,,49.68891144,14.83895397,473 +#OL/ST-278,Průhonek ,,49.96905518,13.81414890,472 +#OL/ST-279,Vysoká skála ,,49.88482666,14.09729767,472 +#OL/ST-280,Tetřevník ,,49.75959015,14.37642670,472 +#OL/ST-281,Kujanov,,49.63090515,14.78674603,472 +#OL/ST-282,Obora,,49.91974640,14.75750256,472 +#OL/ST-283,Výholec ,,49.74168015,14.85776615,472 +#OL/ST-284,Velký kopec ,,50.01553726,13.60105896,472 +#OL/ST-285,Teplá stráň ,,50.10568619,13.77855778,472 +#OL/ST-286,Krchůvek ,,50.07660294,13.96981907,472 +#OL/ST-287,Zadní vrch,,49.96219254,13.79769707,471 +#OL/ST-288,Sedlo,,49.74480820,14.08024406,471 +#OL/ST-289,Koukolová hora ,,49.92034912,14.02341461,471 +#OL/ST-290,Lipina,,49.65007019,14.33726406,471 +#OL/ST-291,Ostrá ,,49.79958344,14.49108124,471 +#OL/ST-292,Klenka,,49.76701736,15.04143715,471 +#OL/ST-293,Pytlácký vrch ,,50.07858658,13.95825958,471 +#OL/ST-294,Mramor,,49.89852142,14.12878990,470 +#OL/ST-295,Cihelný ,,49.65463638,14.40957832,470 +#OL/ST-296,Farářský ,,49.72035217,14.48957920,470 +#OL/ST-297,Maní hora ,,49.83945847,14.92256451,470 +#OL/ST-298,Vrážský vrch ,,49.85557938,14.80456734,469 +#OL/ST-299,Ve vrších ,,49.68149948,14.83676052,468 +#OL/ST-300,Tobolský vrch ,,49.92838287,14.09102249,467 +#OL/ST-301,Na Vinici ,,49.62824249,14.32061195,467 +#OL/ST-302,Červená hlína ,,49.91600418,14.29807854,467 +#OL/ST-303,Vlachov ,,49.78990173,15.02900887,467 +#OL/ST-304,Nové Mýto ,,50.08872604,13.96553326,467 +#OL/ST-305,Ostrý vrch ,,49.77296448,14.38825417,466 +#OL/ST-306,Štětinec ,,49.77309418,14.33358860,466 +#OL/ST-307,Štejc ,,49.72207260,14.55770874,466 +#OL/ST-308,Bílč ,,49.86065292,14.85257530,466 +#OL/ST-309,Šrámota ,,49.86333847,14.84282684,466 +#OL/ST-310,Stařechov ,,49.83761215,14.99009800,466 +#OL/ST-311,Mokřinka ,,50.00788116,13.85405731,466 +#OL/ST-312,Hromádky ,,49.68582916,14.18949318,465 +#OL/ST-313,Libický vrch ,,49.74288177,14.21974468,465 +#OL/ST-314,Hořejší Křemeny ,,49.83246231,14.18771267,464 +#OL/ST-315,Chruč ,,49.91147232,13.91528797,463 +#OL/ST-316,Bělčí hora ,,49.62049484,14.84881496,463 +#OL/ST-317,Hora ,,49.78424072,14.55736542,462 +#OL/ST-318,Otryby ,,49.80350494,14.98299026,462 +#OL/ST-319,Zadní Vápenec ,,50.06314850,13.94596291,462 +#OL/ST-320,Velký Ždírec ,,49.77630234,14.11431599,461 +#OL/ST-321,Hora ,,49.77548599,14.47711182,461 +#OL/ST-322,Střemoch ,,49.82608032,14.73250008,461 +#OL/ST-323,Strážka ,,49.65287781,15.07425690,461 +#OL/ST-324,Na skalách ,,49.73008728,14.24359417,460 +#OL/ST-325,Zhořský vrch ,,49.61406326,14.26111794,460 +#OL/ST-326,Hůra ,,49.74959564,15.14292336,460 +#OL/ST-327,Chrbina ,,50.03285599,14.11831856,460 +#OL/ST-328,Pravá hora ,,49.93236923,13.96565151,459 +#OL/ST-329,Plešivec ,,49.99277115,14.07139301,459 +#OL/ST-330,Podleský vrch ,,49.77575302,14.26155090,458 +#OL/ST-331,Česká ,,49.77806473,14.54186535,458 +#OL/ST-332,Stará hůrka ,,49.82184601,14.86186886,458 +#OL/ST-333,Kozinec ,,49.73606873,14.20209026,457 +#OL/ST-334,Varta ,,49.73955917,14.21768856,457 +#OL/ST-335,Na Zhorci ,,49.77589035,14.55644131,457 +#OL/ST-336,V hájku ,,49.77919006,14.50107384,457 +#OL/ST-337,Velká hora (Žákova) ,,49.67193222,14.23052597,456 +#OL/ST-338,Kamenný vrch ,,49.92601013,14.91328716,456 +#OL/ST-339,Dubová ,,49.94481659,13.98177528,455 +#OL/ST-340,Vlkův vrch ,,49.78615570,14.13258457,455 +#OL/ST-341,Vrchová ,,50.12797928,13.81179237,455 +#OL/ST-342,Holý vrch ,,49.90643692,14.00364113,454 +#OL/ST-343,Zlatý vrch ,,49.86095810,14.25168228,454 +#OL/ST-344,Zlatý vrch ,,49.71976089,14.39635849,454 +#OL/ST-345,Dubsko ,,49.88644791,14.76501942,454 +#OL/ST-346,Brtevník ,,49.61701584,14.28444099,453 +#OL/ST-347,Deštno ,,49.66555023,14.39159775,453 +#OL/ST-348,Amálie ,,50.17779160,13.75890446,453 +#OL/ST-349,Zámecký vrch ,,49.89900970,13.90598774,452 +#OL/ST-350,Na Hvězdáři ,,49.69441986,14.25801373,452 +#OL/ST-351,Homolka ,,49.80411148,14.44289494,452 +#OL/ST-352,Na Skalách ,,49.73729324,14.70512104,452 +#OL/ST-353,Hrabině ,,49.64026260,14.83434963,452 +#OL/ST-354,Koza ,,50.04111481,13.94432259,452 +#OL/ST-355,Velký Kosov ,,49.93579483,14.06390476,451 +#OL/ST-356,Budkův vrch ,,49.73500061,14.26883030,451 +#OL/ST-357,Okrouhlík ,,49.77985001,14.33171749,451 +#OL/ST-358,Brdce ,,50.07462692,14.07708073,451 +#OL/ST-359,Šiberna ,,49.82657623,14.07424545,451 +#OL/ST-360,Strážiště ,,49.91677856,14.11642551,450 +#OL/ST-361,Zelenský vrch ,,49.83089066,14.23134422,450 +#OL/ST-362,Telecí vrch ,,49.68509293,14.25127983,450 +#OL/ST-363,Ostrý vrch ,,49.73707962,14.33941078,450 +#OL/ST-364,Chlum ,,49.75131989,14.46382236,450 +#OL/ST-365,Bůček ,,49.69725800,14.27427864,449 +#OL/ST-366,Tetřívek ,,49.80104065,14.35110283,449 +#OL/ST-367,Pepř ,,49.88862228,14.48223877,449 +#OL/ST-368,Ostrý vrch ,,50.00254440,13.65837097,449 +#OL/ST-369,Hora ,,49.85857773,14.29713058,448 +#OL/ST-370,Chlum ,,49.83937073,14.41434097,448 +#OL/ST-371,Máj ,,49.83123016,14.45693302,448 +#OL/ST-372,Horní Homole ,,49.73037338,14.70038986,448 +#OL/ST-373,Chlum ,,49.81758499,14.85120487,448 +#OL/ST-374,Chlum ,,49.86196899,14.44445610,447 +#OL/ST-375,Měsíček ,,49.76566315,14.51843166,447 +#OL/ST-376,Horka ,,50.10652542,14.09817219,447 +#OL/ST-377,Požáry ,,49.55471420,14.16821575,446 +#OL/ST-378,Jeterná ,,49.63430405,14.22059441,446 +#OL/ST-379,Sedletiny ,,49.70868683,14.57647133,446 +#OL/ST-380,Hůrecká věž ,,49.75547791,14.72744656,446 +#OL/ST-381,Malý Plešivec ,,50.00080872,14.08686733,446 +#OL/ST-382,Ráj ,,49.56823730,14.16743279,445 +#OL/ST-383,Chlum ,,49.91496658,14.28104496,445 +#OL/ST-384,Habrová stráň ,,50.11550903,13.91225147,445 +#OL/ST-385,Dojka ,,50.08852005,14.05109119,445 +#OL/ST-386,Hrad Točník ,,49.89033508,13.88669205,444 +#OL/ST-387,Na Vrších ,,49.73003387,14.14291000,442 +#OL/ST-388,Ouchody ,,49.68570328,14.21289635,442 +#OL/ST-389,Bába ,,49.62652588,14.26336575,442 +#OL/ST-390,Hrdlo ,,49.87279510,14.57091904,442 +#OL/ST-391,Kryšpínův vrch ,,49.71170044,14.25963688,441 +#OL/ST-392,Hůra ,,49.72938156,14.81073570,441 +#OL/ST-393,Taterův vrch ,,49.57218933,14.14711571,440 +#OL/ST-394,Herinky ,,49.96583176,14.11407757,440 +#OL/ST-395,Žíkov ,,49.53967667,14.17875385,440 +#OL/ST-396,Kobylí hora ,,49.72252655,14.62585258,440 +#OL/ST-397,Horní vrch ,,49.85077667,14.33452415,439 +#OL/ST-398,Holý vrch ,,49.92276382,14.50683784,439 +#OL/ST-399,Vyhlídka ,,49.82199097,14.39241886,438 +#OL/ST-400,Kukle ,,49.93856049,14.86844730,438 +#OL/ST-401,Velký Hejk ,,49.63285446,14.30969048,437 +#OL/ST-402,Kordův vrch ,,49.80053711,14.46339035,437 +#OL/ST-403,Vrtichov,,49.71232605,14.60884285,437 +#OL/ST-404,Na Hejku,,49.64323044,14.37525463,436 +#OL/ST-405,Drnka,,49.89257813,14.51449680,436 +#OL/ST-406,Jestřáb ,,49.87270737,14.93264294,436 +#OL/ST-407,Liščí vrch ,,50.14310455,13.51336575,436 +#OL/ST-408,Malinová hora ,,49.99837112,13.77536297,436 +#OL/ST-409,Žalkov ,,50.02718353,13.74480724,434 +#OL/ST-410,Písečná ,,49.58895493,14.18711472,433 +#OL/ST-411,Hůrka ,,49.90674210,14.56694126,433 +#OL/ST-412,Hůrka ,,49.77772141,14.92444134,433 +#OL/ST-413,Mečná ,,50.07137680,13.87199688,433 +#OL/ST-414,Obecní vrch ,,50.07539368,14.02999592,433 +#OL/ST-415,Doubí ,,49.73171997,14.39943027,432 +#OL/ST-416,Kočičí vrch ,,49.75884247,14.39798450,432 +#OL/ST-417,Sukův kopec ,,49.72600555,14.48208332,432 +#OL/ST-418,Čížov ,,49.85914230,14.59641647,432 +#OL/ST-419,Hřeben ,,49.72780991,15.00865841,432 +#OL/ST-420,Hřeben ,,49.99886703,14.14383316,431 +#OL/ST-421,Lounský vrch ,,49.78229141,14.43958855,431 +#OL/ST-422,Bohatá hora ,,49.67342758,14.20644188,430 +#OL/ST-423,Vápenka ,,49.92806244,14.51737309,430 +#OL/ST-424,Hluchá ,,49.66201019,14.44596004,429 +#OL/ST-425,Michnův vrch ,,49.83716965,14.43439293,429 +#OL/ST-426,Kamenná ,,50.02872086,13.78095722,429 +#OL/ST-427,Homolka,,50.04251480,13.77189350,429 +#OL/ST-428,Veselov,,50.10468674,14.05737305,429 +#OL/ST-429,Želná (SW fm Chotilsko) ,,49.76400757,14.34271049,428 +#OL/ST-430,Bejvy,,49.73724747,14.50283623,428 +#OL/ST-431,Vosník ,,49.96936417,13.78837013,427 +#OL/ST-432,Spálený vrch ,,49.77308655,14.39769650,427 +#OL/ST-433,Ponětov ,,49.82643127,14.49302483,427 +#OL/ST-434,Homole,,49.90428925,13.93193817,426 +#OL/ST-435,Píně ,,50.11524200,13.88405895,426 +#OL/ST-436,Výška ,,49.94827652,14.20357990,425 +#OL/ST-437,Brdce,,49.67068863,14.33121872,425 +#OL/ST-438,Hůrka ,,49.78818512,14.34238338,425 +#OL/ST-439,Hačka ,,50.00255585,14.19668293,425 +#OL/ST-440,Vápenný vrch ,,49.97311401,13.79619789,424 +#OL/ST-441,Mileč ,,49.97729874,13.76284313,424 +#OL/ST-442,Hájek ,,49.72362900,14.32804966,424 +#OL/ST-443,Příkošov ,,49.76739502,14.43887138,424 +#OL/ST-444,Kolátov ,,49.83750534,14.45964432,424 +#OL/ST-445,Sýkorec ,,49.76304626,14.52923203,424 +#OL/ST-446,Peleška ,,49.89740372,14.70982742,424 +#OL/ST-447,U lípy ,,50.05982971,13.86857986,424 +#OL/ST-448,Hůrka ,,50.00916672,13.92849827,424 +#OL/ST-449,Supí hora ,,50.49039459,14.52756977,424 +#OL/ST-450,Perdlák ,,49.65272522,14.22063255,422 +#OL/ST-451,Bořim ,,49.58518219,14.17212486,421 +#OL/ST-452,Opatovický vrch ,,49.58518219,14.17212486,421 +#OL/ST-453,Roškál ,,50.03610229,13.77786636,421 +#OL/ST-454,Nevada,,49.80847549,14.32998943,420 +#OL/ST-455,Březiny ,,49.72689056,14.41125584,420 +#OL/ST-456,Červený kopec ,,49.92628098,14.88932323,420 +#OL/ST-457,Horka,,49.94924927,14.84243679,420 +#OL/ST-458,Horka,,50.09382248,14.03085423,420 +#OL/ST-459,V Prantech,,49.90621948,13.87005997,419 +#OL/ST-460,Makovice,,49.73028183,14.29698658,419 +#OL/ST-461,Želná (SE fm Chotilsko) ,,49.76742172,14.36110592,418 +#OL/ST-462,Střeblov ,,49.81658554,14.44897842,418 +#OL/ST-463,Šiberný ,,49.63326263,14.42357445,418 +#OL/ST-464,Přílepská skála ,,50.12211227,13.64406395,418 +#OL/ST-465,Modrý vrch ,,50.02924347,14.15546799,418 +#OL/ST-466,Týřovický vrch ,,49.98514938,13.76353455,417 +#OL/ST-467,Humna ,,49.64746857,14.21994114,417 +#OL/ST-468,Medník ,,49.87074280,14.44335270,417 +#OL/ST-469,Šibinka ,,49.76122284,14.59956264,417 +#OL/ST-470,Zakopané ,,50.07918549,13.92906284,417 +#OL/ST-471,Švestkovka ,,49.88087463,14.00138378,416 +#OL/ST-472,Mýtka ,,49.72803116,14.25905609,416 +#OL/ST-473,Libešov ,,49.68900681,14.35159779,416 +#OL/ST-474,Na Výstřeší ,,49.72955704,14.37115002,416 +#OL/ST-475,Kozí hůrka ,,49.88084030,14.46394825,416 +#OL/ST-476,U Hruštičky ,,49.81418228,14.50638580,416 +#OL/ST-477,Háj ,,49.79768372,14.74499512,416 +#OL/ST-478,Pánkov ,,49.67884827,14.41671467,415 +#OL/ST-479,Kámen ,,49.92366791,14.31602287,414 +#OL/ST-480,Šiberný ,,49.82423019,14.51707172,414 +#OL/ST-481,Boží skála ,,49.89029694,14.50249100,413 +#OL/ST-482,Bukovec ,,49.89680099,14.62550926,413 +#OL/ST-483,Přední homole ,,49.77298737,14.46502781,412 +#OL/ST-484,Zahrádka ,,49.88301849,14.45245457,412 +#OL/ST-485,Pozdětina ,,50.06015015,13.94044018,412 +#OL/ST-486,Chlumečník ,,49.67267609,14.37831497,411 +#OL/ST-487,Tlustá hora ,,50.02482986,14.04084301,411 +#OL/ST-488,Šiberna ,,49.77597809,14.66888618,410 +#OL/ST-489,V Hrobech ,,49.80841446,14.69001293,410 +#OL/ST-490,Chlum ,,50.01356888,13.91455460,410 +#OL/ST-491,Kolo ,,49.71349716,14.34272671,409 +#OL/ST-492,Vrchová ,,50.06585312,13.83009624,409 +#OL/ST-493,Mrázov ,,49.61388779,14.24506187,408 +#OL/ST-494,Hladomor ,,49.77168274,14.28949928,408 +#OL/ST-495,Brabenčík (Brabeňák) ,,49.88538361,14.81201935,408 +#OL/ST-497,Bukový vrch (Dobřeňský vrch) ,,49.70404053,14.40420914,407 +#OL/ST-499,Běsná hora ,,49.83057785,14.52067947,407 +#OL/ST-500,Blatina ,,50.12121964,13.67911816,407 +#OL/ST-501,Chlumka ,,49.86133575,14.37623119,406 +#OL/ST-502,Chvojen ,,49.77083206,14.63259125,406 +#OL/ST-503,Šibeník ,,50.09896088,13.67693424,406 +#OL/ST-504,V Sečích ,,49.68606186,14.32701492,405 +#OL/ST-505,Hlaváčov ,,50.12927628,13.74359417,405 +#OL/ST-506,Dějkov ,,49.71709442,14.29395866,404 +#OL/ST-507,Prostřední vrch ,,49.78351212,14.59471130,404 +#OL/ST-508,Baba ,,50.02566528,13.88102627,404 +#OL/ST-509,Na Komáru ,,49.84935379,14.48610783,403 +#OL/ST-510,Šibenec ,,49.88269806,13.90824890,402 +#OL/ST-511,Besídka ,,49.76033401,14.23634815,402 +#OL/ST-512,Haknová ,,49.93803024,14.19903851,402 +#OL/ST-513,Otmíčská hora ,,49.86343002,13.94920254,401 +#OL/ST-514,Šiberný ,,49.70220566,14.42542171,401 +#OL/ST-515,Chlum ,,49.83658218,14.51138592,401 +#OL/ST-516,Bílá skála (Václavský vrch) ,,49.75620270,14.22064114,399 +#OL/ST-518,Dlouhá hora ,,50.00556564,13.80297947,399 +#OL/ST-519,Sokolí (Sokolí vrch) ,,50.02901077,13.88103199,399 +#OL/ST-520,Kačerka ,,49.80414200,14.24544334,398 +#OL/ST-521,Holousná ,,49.78244400,14.39791393,398 +#OL/ST-522,Ďábel ,,49.89084625,14.43443489,398 +#OL/ST-523,Homole ,,49.86138916,14.72351170,398 +#OL/ST-524,Šibenný ,,49.65960312,14.28293037,397 +#OL/ST-525,Babka ,,49.87417221,14.35557938,397 +#OL/ST-526,Damil ,,49.94816208,14.09020424,396 +#OL/ST-527,Stříbrnice ,,14.42395973,49.68514633,396 +#OL/ST-528,Obora ,,49.86777115,14.68685055,396 +#OL/ST-529,Hučavka ,,50.05720520,13.85042381,396 +#OL/ST-530,Spálenka ,,49.66396332,14.31335163,395 +#OL/ST-531,Chlumec ,,49.75855255,14.61769009,395 +#OL/ST-532,Malý Hejk ,,49.64475250,14.27838326,394 +#OL/ST-533,Homole ,,49.83723450,14.39089298,394 +#OL/ST-534,Lysina ,,49.79325104,14.54316711,394 +#OL/ST-535,Prostřední vrch ,,50.05691528,14.13140106,394 +#OL/ST-536,Varta ,,49.61481857,14.20185661,393 +#OL/ST-537,Vondrův vrch ,,49.77575302,14.28444004,393 +#OL/ST-538,Ježkův vrch ,,50.00233459,13.95254040,393 +#OL/ST-539,Kluk ,,50.00088501,14.05181313,392 +#OL/ST-540,Čeláková ,,49.65193558,14.24247932,391 +#OL/ST-541,Slepičkův vrch ,,49.83900070,14.44104767,391 +#OL/ST-542,Strhaný ,,49.83692932,14.36096954,390 +#OL/ST-543,Špičák ,,50.48997498,14.56704617,390 +#OL/ST-544,Chocholouš ,,49.85086060,14.63777256,389 +#OL/ST-545,Velký vrch ,,50.02390671,14.13389492,389 +#OL/ST-546,Na Čihadle ,,49.92464828,14.12932205,388 +#OL/ST-547,Radobylka ,,49.63196945,14.25973892,388 +#OL/ST-548,Varta ,,49.66166306,14.26660442,388 +#OL/ST-549,Janův vrch ,,50.01631927,13.99612236,387 +#OL/ST-550,Střevíc ,,49.92491531,14.14592457,385 +#OL/ST-551,Čihadlo ,,49.97612381,14.42261314,385 +#OL/ST-552,Javorka ,,49.93879700,14.18023968,384 +#OL/ST-553,Brdatka ,,49.97993088,14.05880833,383 +#OL/ST-554,Prostřední hora ,,49.93843460,14.16982174,383 +#OL/ST-555,Žižkův vrch ,,49.86858749,14.38682461,382 +#OL/ST-556,Homole ,,49.75101089,14.42917633,382 +#OL/ST-557,Kobylí hlava ,,50.10359573,13.88522434,382 +#OL/ST-558,Sakařův vrch ,,49.82879257,14.35974216,381 +#OL/ST-559,Suchý vrch ,,49.88106537,14.37876034,381 +#OL/ST-560,Žákov ,,49.84493637,14.93813419,381 +#OL/ST-561,Orlí ,,50.57073212,14.89380836,381 +#OL/ST-562,Špičák ,,50.47040558,14.56767559,379 +#OL/ST-563,Na Dubině ,,49.98420715,13.98563099,378 +#OL/ST-564,Na Belvederu ,,49.77679062,14.40398407,378 +#OL/ST-565,Holý vrch ,,49.84923553,14.58247757,378 +#OL/ST-566,V Hoře ,,49.73844910,14.36537266,375 +#OL/ST-567,Na Kobyle ,,50.06145096,13.81488991,375 +#OL/ST-568,Lipový vrch ,,50.03319931,13.89780235,374 +#OL/ST-569,Hřebenáč ,,50.47517776,14.51892757,374 +#OL/ST-570,Na Stakři ,,49.67122650,14.27699375,373 +#OL/ST-571,Kozí hřbety ,,49.72600555,14.42192173,373 +#OL/ST-572,Bělidlo ,,49.97083282,13.71760178,371 +#OL/ST-573,Dubový vrch ,,49.71344757,14.32164288,371 +#OL/ST-574,Jedlový vrch ,,49.71522522,14.31851101,371 +#OL/ST-575,Chlomek ,,49.88523865,14.42046833,365 +#OL/ST-576,Babka ,,49.96247864,14.30866909,364 +#OL/ST-577,Šedivý vrch ,,49.83214951,14.36859703,364 +#OL/ST-578,Na Beránku ,,49.94856262,14.38012314,364 +#OL/ST-579,Plešivec ,,49.93514252,14.18873310,363 +#OL/ST-580,Kněžoles ,,49.85815430,14.47510719,362 +#OL/ST-581,Oborka ,,50.02079010,14.13082409,362 +#OL/ST-582,Malý Kuklík ,,49.96205521,15.24215221,359 +#OL/ST-583,Kněží hora ,,49.94184113,14.18742847,357 +#OL/ST-584,Chlum ,,49.98109818,15.11883640,355 +#OL/ST-585,Rabyňská hora ,,49.80520630,14.41686630,354 +#OL/ST-586,Kaňk ,,49.97206497,15.27855778,353 +#OL/ST-587,Smrkovec,,50.51559067,15.04818153,352 +#OL/ST-588,Káčov ,,50.55106735,14.98577118,351 +#OL/ST-589,Lutov ,,49.84863281,14.66160202,349 +#OL/ST-590,Holé vršky ,,49.84978104,14.50123787,347 +#OL/ST-591,Klapice ,,49.98741531,14.34022903,345 +#OL/ST-592,Ers ,,50.18774796,14.30620670,345 +#OL/ST-593,Ostrá Hůrka ,,49.71080399,14.30070782,344 +#OL/ST-594,Jedlina ,,49.77923584,14.41851139,344 +#OL/ST-595,Křemenice ,,50.39311600,15.08463573,336 +#OL/ST-596,Taranka ,,49.82592773,14.60459042,331 +#OL/ST-597,Slánská hora ,,50.23184204,14.09524918,330 +#OL/ST-598,Mukařov ,,50.02106476,15.08007145,330 +#OL/ST-599,Petřín (Rozhledna) ,,50.08351135,14.39507389,324 +#OL/ST-600,Řípec ,,50.25616074,14.05887604,313 +#OL/ST-601,V Doubcích ,,49.91418839,14.19570065,312 +#OL/ST-602,Stříbrník ,,50.16764069,14.35052109,311 +#OL/ST-603,Šnárova hora ,,50.00864029,13.99014091,303 +#OL/ST-604,Na Kostele ,,50.28773117,15.36890221,299 +#OL/ST-605,Královka ,,50.46560669,14.48441887,298 +#OL/ST-606,Srnčí kopec ,,50.02563858,14.82498646,296 +#OL/ST-607,Velká Sněhurka ,,50.49624570,15.09220780,294 +#OL/ST-608,Městská hora ,,49.96263885,14.06472301,290 +#OL/ST-609,Velký vrch ,,50.18774796,14.30620670,288 +#OL/ST-610,Lovotín ,,50.50017548,14.91810608,284 +#OL/ST-611,Bedřichov ,,50.04519653,15.13698387,279 +#OL/ST-612,Ostrá hůrka ,,50.34027481,15.11905575,278 +#OL/ST-613,Velká Stráž ,,50.05771637,14.98636532,272 +#OL/ST-614,Na Skalách ,,50.24166489,14.43051815,269 +#OL/ST-615,Nehošť ,,50.22738266,14.31662369,268 +#OL/ST-616,Radim ,,50.06814957,15.00212383,268 +#OL/ST-617,Zabitý kopec ,,50.15751648,14.55325699,264 +#OL/ST-618,Špičák ,,50.24264526,14.41782856,250 +#OL/ST-619,Homolka ,,50.32487488,14.87783623,244 +#OL/ST-620,Kuchyňka ,,50.18148422,14.59482765,242 +#OL/ST-621,Šibeník ,,50.04840851,15.37388039,237 +#OL/ST-622,Přerovská hůra ,,50.16207886,14.83927345,236 +#OL/ST-623,U Borku ,,50.24320221,15.25950527,234 +#OL/ST-624,Semická hůra ,,50.16002274,14.86459255,231 +#OL/ST-625,Kobylí hlava ,,50.22868729,14.71679497,215 +#OL/ST-626,Vejčina ,,50.38395309,14.42534924,199 +#OL/ST-627,Špičák ,,50.23583490,13.66585750,488 +#OL/ST-628,Chrby,,50.50062030,15.10857280,346 +#OL/ST-629,Mandava,,49.92638900,14.57055600,480 +#OL/ST-630,Luka,,49.69748500,15.17915640,498 +#OL/US-001,Macecha,,50.39799881,12.99300003,1113 +#OL/US-002,Loučná ,,50.39909744,13.02176571,1019 +#OL/US-003,Vysoká Seč ,,50.40676117,13.04388046,1007 +#OL/US-004,Hájský kopec ,,50.41868210,13.00366211,989 +#OL/US-005,Na kopci,,50.41187668,12.98452377,986 +#OL/US-006,Vlčí kopec ,,50.42863464,13.01338100,973 +#OL/US-007,Kamenný vrch ,,50.44533539,13.03493690,963 +#OL/US-008,Na vrchu,,50.42155457,13.03395081,962 +#OL/US-009,Strážce ,,50.45764542,13.03522491,932 +#OL/US-010,Střední Špičák ,,50.45369339,13.07657242,924 +#OL/US-011,Lesenská pláň ,,50.58225632,13.43708229,921 +#OL/US-012,Mědník ,,50.42448044,13.11155224,910 +#OL/US-013,Komáří vrch ,,50.48326111,13.18363476,906 +#OL/US-014,Malý Špičák ,,50.44962692,13.07131481,904 +#OL/US-015,Halžský vrch ,,50.41331863,13.07823658,897 +#OL/US-016,Vlčí hora ,,50.64671707,13.64176083,891 +#OL/US-017,U Cínovce ,,50.71772766,13.74764442,876 +#OL/US-018,Černopotocký vrch ,,50.49538422,13.09366131,849 +#OL/US-019,Novoveský vrch ,,50.50217819,13.23711777,885 +#OL/US-020,Na Skále ,,50.71813202,13.73267460,883 +#OL/US-021,Kamenná hůrka ,,50.55135345,13.31958866,878 +#OL/US-022,Oldřišský vrch ,,50.70170975,13.67182732,878 +#OL/US-023,Skelný vrch ,,50.50893784,13.20149231,878 +#OL/US-024,Menhartický vrch ,,50.51314926,13.28748798,849 +#OL/US-025,Vrch tří pánů ,,50.67164612,13.67738819,874 +#OL/US-026,Jelení hlava ,,50.66642761,13.54613113,873 +#OL/US-027,Kohoutí vrch ,,50.55183792,13.39213181,873 +#OL/US-028,Pestrý ,,50.66212463,13.53645802,871 +#OL/US-029,Sklářský vrch ,,50.71069336,13.68733788,864 +#OL/US-030,Uhliště ,,50.71533203,13.76411915,856 +#OL/US-031,Přísečnická hora ,,50.48036575,13.05789852,854 +#OL/US-032,Jedlová ,,50.54884338,13.46121025,853 +#OL/US-033,Mračný vrch ,,50.63054276,13.54753494,852 +#OL/US-034,Výšina ,,50.46047211,13.16889668,848 +#OL/US-035,Na Výhledech ,,50.53914642,13.31364346,848 +#OL/US-036,Homolka,,50.56039810,13.47186852,844 +#OL/US-037,Puklá skála ,,50.69547272,13.58802319,840 +#OL/US-038,Kamenná ,,50.69742203,13.60058117,838 +#OL/US-039,Lysá hora ,,50.71829987,13.83160210,836 +#OL/US-040,Klínovčík ,,50.70075226,13.70838928,836 +#OL/US-041,Jilmový vrch ,,50.70234299,13.58742046,826 +#OL/US-042,Strážce ,,50.58387375,13.36233616,825 +#OL/US-043,Kamenec,,50.63055420,13.52550411,814 +#OL/US-044,Jestřábí vrch ,,50.69634247,13.54759884,814 +#OL/US-045,Bernovský vrch ,,50.55388641,13.34304619,838 +#OL/US-046,Hájiště ,,50.46755219,13.11665154,807 +#OL/US-047,Vysoká ,,50.40466690,13.09696674,806 +#OL/US-048,Větrný vrch ,,50.62231445,13.51682758,802 +#OL/US-049,Nad Moldavou,,50.72454834,13.64947605,797 +#OL/US-050,Skleněný vrch ,,50.52081299,13.30978298,796 +#OL/US-051,Na Vyhlídce ,,50.71755219,13.90613079,794 +#OL/US-052,Pěnkavčí vrch ,,50.84816742,14.61092758,792 +#OL/US-053,Flájský vrch ,,50.68009567,13.61764431,790 +#OL/US-054,Jeřabina ,,50.61341476,13.52005482,788 +#OL/US-055,Na Skále ,,50.57932663,13.24166870,783 +#OL/US-056,Bratrská ,,50.61003113,13.51117897,777 +#OL/US-057,Stráž ,,50.49653244,13.28284359,764 +#OL/US-058,Loupežník ,,50.70819092,13.82054138,757 +#OL/US-059,Klenovec,,50.48640823,13.32877350,757 +#OL/US-060,Chlum,,50.50548935,13.30782700,755 +#OL/US-061,Růžový vrch ,,50.60330582,13.44266701,752 +#OL/US-062,Kapucín ,,50.57925797,13.51164055,743 +#OL/US-063,Zelený vrch ,,50.60963821,13.36285496,737 +#OL/US-064,Jelení vrch ,,50.74422836,13.94889545,734 +#OL/US-065,Louchov,,50.43420410,13.18554115,725 +#OL/US-066,Kleč ,,50.54782867,13.88601875,721 +#OL/US-067,Ostrý ,,50.49728394,13.86013603,719 +#OL/US-068,Malý Buk ,,50.80277634,14.55305576,712 +#OL/US-069,Jezeří (Jezeř) ,,50.54696655,13.48334026,707 +#OL/US-070,Pavlovský Špičák ,,50.43570709,13.21790123,695 +#OL/US-071,Zámecký vrch - Nový Žeberk ruins ,,50.73731995,13.96236515,674 +#OL/US-073,Milešovský Kloc ,,50.53920364,13.91532135,674 +#OL/US-074,Kukla,,50.62215805,14.12739277,674 +#OL/US-075,Trpasličí kameny ,,50.62273026,14.11299038,671 +#OL/US-076,Tolštejn ,,50.85694504,14.58166695,670 +#OL/US-077,Široký vrch ,,50.62753296,14.10580254,659 +#OL/US-078,Malý Stožec ,,50.85018158,14.53881073,659 +#OL/US-079,Milíře ,,50.41947970,13.05173230,914 +#OL/US-080,Zvon (Francká hora) ,,50.56019211,13.90372849,653 +#OL/US-081,Chřibský vrch ,,50.84269333,14.49138927,621 +#OL/US-082,Židovský vrch ,,50.69577026,13.79744816,619 +#OL/US-083,Hůrka ,,50.33608246,13.26030540,619 +#OL/US-084,Pákova hora ,,50.51039505,13.89553070,617 +#OL/US-085,Panna,,50.61157227,14.18473148,594 +#OL/US-086,Vysoký Ostrý ,,50.63644409,14.08016491,587 +#OL/US-087,Lysá hora (Holý vrch) ,,50.58077621,14.11023331,577 +#OL/US-088,Hrádek (Oltářík) ,,50.48997498,13.92315960,566 +#OL/US-089,Sukoslav (Hrad Kostomlaty),,50.55425262,13.87949276,563 +#OL/US-090,Spravedlnost,,50.88000107,14.46722221,553 +#OL/US-091,Ostrý ,,50.53153992,13.95134354,553 +#OL/US-092,Soudný kámen ,,50.61111450,14.23504066,546 +#OL/US-093,Blansko - ruins,,50.69749832,14.09926891,545 +#OL/US-094,Malé Sedlo ,,50.60589981,14.25767994,541 +#OL/US-095,Výrovna ,,50.74988556,14.09301186,540 +#OL/US-096,Hradišťko ,,50.47450256,13.84084034,536 +#OL/US-097,Strážiště ,,50.74946594,14.05400944,534 +#OL/US-098,Líska ,,50.46919250,13.84959412,534 +#OL/US-099,Mravenčák ,,50.37244034,13.18000889,531 +#OL/US-100,Mlýnský vrch ,,50.58445358,14.24521923,527 +#OL/US-101,Hradiště ,,50.38040543,13.12142849,524 +#OL/US-102,Magnetovec,,50.65196991,14.15527344,521 +#OL/US-103,Plešivec ,,50.56528091,14.08933067,510 +#OL/US-104,Velký Chlum ,,50.74555588,14.22972202,508 +#OL/US-105,Újezdská hora ,,50.57334137,13.98964024,501 +#OL/US-106,Kibička (Kybička) ,,50.53052902,14.02485657,489 +#OL/US-107,Šibeník ,,50.54379272,13.93929386,487 +#OL/US-108,Litýš - ruins ,,50.59106064,14.24330521,486 +#OL/US-109,Ostroh (Rudolfův kámen) ,,50.46926880,13.82651043,483 +#OL/US-111,Dlouhá (Dlouhá hora) ,,50.45296478,13.79575443,483 +#OL/US-112,Srdov,,50.41727829,13.82068729,482 +#OL/US-113,Košťál ,,50.49032974,13.98478699,481 +#OL/US-114,Číčov ,,50.46105576,13.80183315,476 +#OL/US-115,Jáchym ,,51.02842331,14.34173107,472 +#OL/US-116,Brník ,,50.41961670,13.82399368,471 +#OL/US-117,Perštejn - ruins ,,50.38558960,13.10738087,466 +#OL/US-118,Skřivánčí vrch ,,50.44897079,13.32866955,461 +#OL/US-119,Želenický vrch ,,50.51944351,13.73166656,455 +#OL/US-120,Kamýk ,,50.56459427,14.11670876,455 +#OL/US-121,Dob,,50.48110962,13.77333260,455 +#OL/US-122,Poustevník ,,51.00450516,14.28805161,455 +#OL/US-123,Zaječí kopec ,,50.51814270,13.81601715,452 +#OL/US-124,Trojhora,,50.59226227,14.19067383,451 +#OL/US-125,Křížový vrch ,,50.45351028,13.85581398,450 +#OL/US-126,K Vescům / Rozhledna Vochlice ,,50.51411057,13.98855019,449 +#OL/US-128,Záhorní hora ,,50.47334290,13.79236126,446 +#OL/US-129,Liščín ,,50.56840515,14.18059063,437 +#OL/US-130,Kamýk ,,50.46215057,13.83856487,437 +#OL/US-131,Kaňkov ,,50.53775787,13.72659206,436 +#OL/US-132,Kamenný vrch ,,50.81499863,14.25607395,433 +#OL/US-133,Ovčín ,,50.50497818,14.00486374,431 +#OL/US-134,Hrádek ,,50.92236710,14.61299133,429 +#OL/US-135,Mariina skála (Mariina vyhlídka) ,,50.52880478,13.81733036,422 +#OL/US-137,Erbenova vyhlídka ,,50.67861938,14.05088425,428 +#OL/US-138,Pohradická hora (Aloisova výšina) ,,51.01780319,14.32743931,418 +#OL/US-140,Jestřábí vrch ,,50.18902206,13.52110291,405 +#OL/US-141,Libeš ,,50.46196365,13.86814213,404 +#OL/US-142,Svatý kopeček ,,50.38421631,13.25782681,402 +#OL/US-143,Pastevní vrch ,,50.84412384,14.30100632,402 +#OL/US-144,Vrabinec - ruins,,50.71089554,14.21181870,400 +#OL/US-145,Špičák ,,50.51972198,13.66777802,399 +#OL/US-146,Radobýl ,,50.53036499,14.09333038,399 +#OL/US-147,Hněvín ,,50.52027893,13.63305569,399 +#OL/US-148,Kuzov,,50.47577667,13.90452576,393 +#OL/US-149,Šepetelská hora ,,50.46916962,13.88330173,392 +#OL/US-150,Chrámecký vrch ,,50.46420670,13.77351570,399 +#OL/US-151,Skršínský vrch ,,50.46430969,13.75959206,389 +#OL/US-152,Vintířovský vrch ,,50.31119156,13.27558994,386 +#OL/US-153,Na Výhledech ,,50.17169952,13.43128967,383 +#OL/US-154,Kovářův kopec ,,50.83632660,14.30254364,383 +#OL/US-155,Pahorek,,50.60175323,14.08308792,380 +#OL/US-156,Rozhledna Radejčín ,,50.58297348,14.01122189,375 +#OL/US-157,Chožovská hora ,,50.40324020,13.85575104,359 +#OL/US-158,Dubický kopec ,,50.59517670,14.02510357,358 +#OL/US-159,Tobiášův vrch ,,50.45707703,13.77464485,354 +#OL/US-160,Jánský vrch ,,50.48514938,13.73034668,341 +#OL/US-161,Písečný vrch ,,50.42472076,13.73027802,318 +#OL/US-162,Velký vrch ,,50.37884903,13.84126091,303 +#OL/US-163,Lenešický Chlum ,,50.39543533,13.76465511,297 +#OL/US-164,Horka,,50.70138550,13.94252586,292 +#OL/US-165,Červený vrch (Stříbrník) ,,50.59711075,13.91271877,273 +#OL/US-167,Sovice (Kočka) ,,50.55344391,14.14472198,271 +#OL/US-168,Husův vrch ,,50.58972168,13.81499958,267 +#OL/US-169,Hrádek ,,50.55038452,14.04848576,264 +#OL/US-170,Humenský vrch ,,50.48166656,14.08694363,245 +#OL/US-171,Křemín ,,50.52750015,14.20750046,244 +#OL/US-172,Pramenáč ,,50.69900131,13.73200035,909 +#OL/US-173,Stropník ,,50.64297104,13.67816544,855 +#OL/US-174,Pařez ,,50.54600143,13.87899971,736 +#OL/US-175,Černý vrch ,,50.36399841,13.17700005,678 +#OL/US-176,Úhošť ,,50.35900116,13.23900032,593 +#OL/US-177,Srbsko,,50.47700119,13.87199974,559 +#OL/US-178,Šumná (Šumburk) ,,50.37300110,13.14700031,541 +#OL/US-179,Doubravka,,50.63850021,13.86019993,393 +#OL/US-180,Rašeliniště ,,50.42819214,13.07259369,902 +#OL/US-181,Holý vrch ,,50.47119141,13.14604664,795 +#OL/US-182,Nad Nádražím ,,50.48882294,13.26287842,787 +#OL/US-183,U Hranice ,,50.71918106,13.62747383,785 +#OL/US-184,Liščí vrch ,,50.70204926,13.86747074,777 +#OL/US-185,Legina ,,50.54447174,13.39001083,770 +#OL/US-186,Výhledy (Panenská) ,,50.75482178,13.97246933,722 +#OL/US-187,Homole,,50.61443329,13.36591148,702 +#OL/US-188,Vyhlídka ,,50.62176514,13.37572384,701 +#OL/US-189,Kopřivník ,,50.59690475,13.52443695,699 +#OL/US-190,Javor,,50.82554245,14.50034237,693 +#OL/US-191,Spáleniště ,,50.70147324,13.76824284,693 +#OL/US-192,Kulatý vrch ,,50.51116562,13.33427429,690 +#OL/US-193,Vraní Vrch ,,50.61160660,13.41666794,683 +#OL/US-194,Kočičí vrch ,,50.68262863,14.25148773,679 +#OL/US-195,Vrchovina,,50.59415436,14.13986301,677 +#OL/US-196,Jedlina,,50.47457504,13.34164906,676 +#OL/US-197,Hlaváč ,,50.53680420,13.89965534,674 +#OL/US-198,Matrelík ,,50.66243744,14.25022411,668 +#OL/US-199,Mravenčí vrch ,,50.53554153,13.89144421,660 +#OL/US-200,Malá skála ,,50.46572495,13.32166767,659 +#OL/US-201,Kamenný vrch ,,50.61348343,14.11734867,656 +#OL/US-202,Táhlina ,,50.52210236,13.89886951,656 +#OL/US-203,Štěpánovská hora ,,50.53726578,13.88000107,651 +#OL/US-204,Nad Stěnami ,,50.77890015,14.06396866,623 +#OL/US-205,Slukovský kopec ,,50.67807388,14.27114868,622 +#OL/US-206,Dlouhý vrch ,,50.49352264,13.91075611,618 +#OL/US-207,Stříbrný vrch ,,50.55593491,13.89136124,614 +#OL/US-208,Strážný vrch ,,50.68756485,14.35526180,601 +#OL/US-209,Velký Obr ,,50.51698685,13.87382317,603 +#OL/US-210,Pohorský vrch ,,50.64554977,14.32797337,601 +#OL/US-211,Tisá ,,50.77816772,14.01416874,598 +#OL/US-212,Plešivec ,,50.87040710,14.50998116,597 +#OL/US-213,Matrý ,,50.60507584,14.10009480,595 +#OL/US-214,Plešný ,,50.95874786,14.42316532,593 +#OL/US-215,Křížová hora ,,50.57047653,14.15882206,590 +#OL/US-216,Šibeniční vrch ,,50.86874390,14.55359936,589 +#OL/US-217,Liščí vrch ,,50.56134033,13.94652462,583 +#OL/US-218,Hůrka ,,50.47497559,13.36491871,581 +#OL/US-219,Lhota (Medvědický vrch) ,,50.62908173,14.09417915,571 +#OL/US-221,Opina ,,50.55528259,13.91173363,569 +#OL/US-222,Žulovec ,,50.87508392,14.52835274,566 +#OL/US-223,Houžetín ,,50.49161911,13.87668228,561 +#OL/US-224,Mravenčí vrch ,,50.70545197,13.91531372,558 +#OL/US-225,Kostomlatský vrch ,,50.56182480,13.89026356,557 +#OL/US-226,Boží vrch ,,50.66882324,14.28748131,556 +#OL/US-227,Zaječí vrch ,,50.68841553,14.32772923,556 +#OL/US-228,Kamenec ,,50.55085754,13.94471073,552 +#OL/US-229,Rýdečský vrch ,,50.60145950,14.15499115,551 +#OL/US-230,Líšeň ,,50.50215912,13.90305614,550 +#OL/US-231,Egerberk,,50.36722946,13.18467331,548 +#OL/US-232,Bílský vrch ,,50.56824875,13.92415810,546 +#OL/US-233,Hradiště ,,50.56888962,14.11416721,545 +#OL/US-234,Kubačka ,,50.57106018,14.00886726,543 +#OL/US-235,Dobrná ,,50.76879883,14.30683804,535 +#OL/US-236,Slavíčkův kopec ,,50.72586823,14.24048424,535 +#OL/US-237,Zadní vrch ,,50.62048340,14.16923904,533 +#OL/US-238,Jedlová ,,50.73928070,14.24536991,530 +#OL/US-239,Zámecký vrch ,,50.79148102,14.43324947,530 +#OL/US-240,Kozí vrch ,,50.52016449,13.88255024,521 +#OL/US-241,Blešenský vrch,,50.48118973,13.90703964,520 +#OL/US-242,Žimský vrch (Kamenný vrch) ,,50.68362045,14.21659184,517 +#OL/US-245,Dlouhý vrch ,,50.57145309,13.90783024,514 +#OL/US-246,Bažantnice ,,50.76532364,14.42191696,512 +#OL/US-247,Buková hora ,,51.05250168,14.30694389,512 +#OL/US-248,Světlický vrch (U Petružálkovy skály) ,,50.97951508,14.47156906,512 +#OL/US-250,Hlava ,,50.62448883,14.02654743,511 +#OL/US-251,Strážiště ,,50.48653793,13.40862942,511 +#OL/US-252,Homolka,,50.70536041,14.25157928,510 +#OL/US-253,Lotarův vrch ,,50.75918961,14.13854313,510 +#OL/US-254,Jitrovník (Pytlák) ,,51.00194168,14.50779915,509 +#OL/US-255,Plešivec (Holý vrch) ,,50.48023987,13.83906555,509 +#OL/US-256,Chmelník ,,50.75479889,14.15813065,508 +#OL/US-257,Střední vrch ,,50.57177353,13.90369987,505 +#OL/US-258,Sutomský vrch ,,50.50687408,13.97759151,505 +#OL/US-259,Černová ,,50.61018372,14.04561234,504 +#OL/US-260,Mešník ,,50.62165070,14.27211380,504 +#OL/US-261,Písková hora ,,50.61523056,14.19974995,504 +#OL/US-262,Klobouk ,,50.76743698,14.14497089,502 +#OL/US-263,Pustý vrch ,,50.77265930,14.26162434,499 +#OL/US-264,Strana,,50.57471085,13.96125317,498 +#OL/US-265,Hora,,50.70357132,14.15802860,497 +#OL/US-266,Vysoký kámen ,,50.68980789,14.13505745,493 +#OL/US-267,Jedlová ,,50.72830582,14.26175499,491 +#OL/US-268,Mrzlický vrch ,,50.50677490,13.81630135,491 +#OL/US-269,Jezerka,,50.50055695,13.98583317,487 +#OL/US-270,Arnoltický vrch ,,50.83063126,14.26548100,484 +#OL/US-271,Chlomek,,50.54389572,13.85884285,483 +#OL/US-272,Větrný vrch ,,50.82762909,14.40763092,481 +#OL/US-273,Jehla,,50.80664825,14.42742443,478 +#OL/US-274,Skřivánčí vrch ,,51.03808212,14.28662491,478 +#OL/US-275,Štrbický vrch ,,50.55736923,13.84264946,475 +#OL/US-276,Strážiště ,,50.81647110,14.37180042,469 +#OL/US-277,Kostelní vrch ,,50.57469177,13.92264080,467 +#OL/US-278,Mrchoviště ,,50.83088684,14.13461113,465 +#OL/US-279,Poklona ,,50.70182800,14.21742249,465 +#OL/US-280,Vysoký les ,,50.76429367,14.37542057,464 +#OL/US-281,Lichá ,,50.67804718,14.19052982,462 +#OL/US-282,Roubený ,,51.01546478,14.28213882,461 +#OL/US-283,Veselka,,50.77110672,14.38451958,460 +#OL/US-284,Hradec,,50.60703659,14.28430176,452 +#OL/US-285,Hana,,50.78057480,14.41082764,449 +#OL/US-286,Sedlo,,50.79093552,14.41073322,447 +#OL/US-287,Holý vrch,,50.50333405,13.97833347,458 +#OL/US-288,Teplický vrch ,,50.57424545,13.89883995,444 +#OL/US-289,Na Malinách ,,50.72047043,14.15664959,442 +#OL/US-290,Vrkoč ,,50.62646484,14.03928757,440 +#OL/US-291,Holibka,,50.52219009,13.82960033,438 +#OL/US-292,Vidlák ,,50.83466721,14.19009590,438 +#OL/US-293,Petrův vrch ,,50.72655106,14.16169739,437 +#OL/US-294,Svinky,,50.46878433,13.79504204,435 +#OL/US-295,Hůrka ,,50.56681442,13.84812260,433 +#OL/US-296,Růžový hřeben (Růžová vyhlídka) ,,50.93814850,14.40047741,415 +#OL/US-298,Koňský vrch (Ressl) ,,50.50703049,13.61738682,413 +#OL/US-299,Bynovecký vrch ,,50.82134247,14.28998947,412 +#OL/US-300,Rožanský vrch ,,51.01916122,14.44725227,412 +#OL/US-301,Křížový vrch ,,50.85380173,14.41923237,408 +#OL/US-302,Vinička ,,50.52214050,13.95586205,407 +#OL/US-303,Horka,,50.51046753,13.79048347,405 +#OL/US-304,Hůrka ,,50.76065826,14.39509201,404 +#OL/US-305,Lipový vrch ,,50.85660553,14.47989273,403 +#OL/US-306,Obecní vrch ,,50.58459473,14.17077541,402 +#OL/US-307,Rozmezí ,,50.74879837,14.41146088,402 +#OL/US-308,Kosí vrch ,,50.75416946,14.31510639,401 +#OL/US-309,Pařez ,,50.86862946,14.46566105,390 +#OL/US-310,Ořechovka ,,50.64216614,14.03263187,388 +#OL/US-311,Havraní skála ,,50.59259796,14.07761478,385 +#OL/US-312,Písková výšina ,,50.56478500,14.38811493,382 +#OL/US-313,Kozí vrch ,,50.67607880,14.13689518,380 +#OL/US-314,Varta,,50.65084076,14.11981678,380 +#OL/US-315,Odolický vrch ,,50.43722916,13.77038288,379 +#OL/US-316,Rovný ,,50.62982941,13.97802353,377 +#OL/US-317,Malý vrch ,,50.43196487,13.82515240,375 +#OL/US-318,Hořidla ,,50.54067993,14.26790619,372 +#OL/US-319,Křížové vršky ,,50.42957306,13.82340908,366 +#OL/US-320,Výsluní (Doerellova vyhlídka) ,,50.55276489,14.06292057,362 +#OL/US-324,Trupelník ,,50.53820038,13.80038738,356 +#OL/US-325,Olešský vrch ,,50.79448318,14.35391903,355 +#OL/US-326,Kvítel ,,50.46174622,13.92013741,354 +#OL/US-327,Kupa,,50.57343674,14.32575226,352 +#OL/US-328,Myštický vrch ,,50.57701874,14.17825031,395 +#OL/US-329,Šibeník ,,50.43481827,13.82970047,344 +#OL/US-330,Velká Volavka ,,50.42841339,13.70088959,344 +#OL/US-331,Skalky,,50.53664398,14.25109100,337 +#OL/US-332,Mlýnský vrch ,,50.44184875,13.83482170,336 +#OL/US-333,Čedičový vrch ,,50.84874725,14.38770294,329 +#OL/US-334,Věšťanský vrch ,,50.64152527,13.91135502,324 +#OL/US-335,Dobrý ,,50.67999268,14.16071606,323 +#OL/US-336,Borek,,50.83669281,14.39342785,322 +#OL/US-337,Vyhlídka ,,50.85581589,14.39079285,321 +#OL/US-338,Hradiště u Habří ,,50.62027740,13.93166733,314 +#OL/US-339,Zámecký vrch ,,50.66045761,14.12620163,312 +#OL/US-340,Baba,,50.44250107,13.90527821,306 +#OL/US-341,Vyhlídka ,,50.80363846,14.32221699,305 +#OL/US-342,Břvanský vrch ,,50.39172745,13.70819473,302 +#OL/US-343,Sedlo (Malé Sedlo) - Střekovská vyhlídka ,,50.45611191,14.41111088,281 +#OL/US-345,Strážný ,,50.68373108,14.12123966,275 +#OL/US-346,Trhlávek ,,50.39437485,13.82912064,271 +#OL/US-347,Rohatec,,50.39825439,13.99775791,264 +#OL/US-348,Srna,,50.42326736,13.89947319,254 +#OL/US-349,Stráň ,,50.43147659,13.93893337,249 +#OL/US-350,Mrchový kopec ,,50.48732376,14.21273899,211 +#OL/US-351,Šibeniční vrch ,,50.46173096,13.22280598,811 +#OL/US-352,Holubí vrch ,,50.62247467,13.57294846,716 +#OL/US-353,Hřeben ,,50.60833359,13.54058743,687 +#OL/US-354,Špičák ,,50.62537384,13.66560936,664 +#OL/US-355,Vinný vrch ,,50.71937943,13.92757130,659 +#OL/US-356,Strážný vrch ,,50.68228149,13.79750919,470 +#OL/US-357,Pod Dráhou ,,50.67986298,13.77956676,466 +#OL/US-358,Ve Chvojkách ,,50.62092972,13.82067585,382 +#OL/US-359,Morový pahorek ,,50.61651993,13.85459900,315 +#OL/US-360,Podivák ,,50.38174057,13.81069565,272 +#OL/US-361,Kupa,,50.60813141,13.90997791,254 +#OL/US-362,Radešín ,,50.69771194,14.05969524,550 +#OL/US-363,Vysoký háj ,,50.72431183,14.09361935,538 +#OL/US-364,Farský vrch ,,50.69094849,14.07772636,520 +#OL/US-365,Na Gruntě ,,50.72085571,14.02171898,479 +#OL/US-366,Čepec ,,50.69704819,14.03138924,478 +#OL/US-367,Dobětická výšina ,,50.68207550,14.06544399,459 +#OL/US-368,Ostroh,,50.70753098,14.02845478,454 +#OL/US-369,Jedlová hora ,,50.71067429,13.98397255,382 +#OL/US-370,Vyhlídka ,,50.68573380,14.11010456,370 +#OL/US-371,Zámecký vrch ,,50.70280457,14.03988075,510 +#OL/US-372,Jedovina,,50.62855530,13.94049835,339 +#OL/US-373,Vaňovský vrch ,,50.61447144,14.05954742,561 +#OL/US-374,Smrčník ,,50.60198212,14.01943779,368 +#OL/US-375,Bukový vrch (Březina) ,,50.54638290,13.90056229,679 +#OL/US-376,Kupa,,50.59598160,14.11485004,635 +#OL/US-377,Babinský vrch (Badharreberg) ,,50.60382843,14.13488197,628 +#OL/US-378,Modřín (Skřivánčí vrch) ,,50.70188141,14.28165531,625 +#OL/US-380,Stráž ,,50.68169785,14.26373196,625 +#OL/US-381,Rozhledna Náčkovice ,,50.64940643,14.27675533,616 +#OL/US-382,Setenka,,50.51272202,13.90190792,612 +#OL/US-383,Špičák ,,50.59994507,14.14484501,608 +#OL/US-384,Krkavčí vrch ,,50.67324829,14.33615398,603 +#OL/US-385,Markův kopec ,,50.62319565,13.62065601,622 +#OL/US-386,Slavošov ,,50.71703720,14.12033463,594 +#OL/US-387,Na Úhoru ,,50.67200470,14.30203724,563 +#OL/US-388,Čertova jizba ,,50.61460495,14.09123421,557 +#OL/US-389,Starosti,,50.64999008,14.35861015,551 +#OL/US-390,Klobouk (Hadrový vrch) ,,50.71339798,14.28249931,539 +#OL/US-391,Chvojenec,,50.73572540,14.04510307,509 +#OL/US-392,Liščí kopec ,,50.73953247,14.06214619,505 +#OL/US-393,Pláň ,,50.72891998,14.06666565,502 +#OL/US-394,Hrušovský vrch ,,50.55928421,13.98655319,497 +#OL/US-395,Bradlo,,50.68965912,14.16677284,452 +#OL/US-396,Stráž ,,50.57758331,13.93458080,437 +#OL/US-397,Liščí vrch ,,50.55110168,13.97622585,423 +#OL/US-398,Světecký vrch ,,50.44767380,13.75129414,416 +#OL/US-399,Třešňovka ,,50.48995590,13.94506741,414 +#OL/US-400,Dlouhý vrch ,,50.44624710,13.74592304,413 +#OL/US-401,Vraní vrch ,,50.57643890,13.90630245,406 +#OL/US-402,Široký kámen ,,50.62881470,14.00213909,400 +#OL/US-403,Králičí vrch ,,50.50711441,13.78123283,390 +#OL/US-404,Bělouš ,,50.44797134,13.75894928,397 +#OL/US-405,Homolka,,50.60633087,13.99886990,392 +#OL/US-406,Skála ,,50.44410324,13.76465607,386 +#OL/US-407,Kaňkovský vrch ,,50.54085541,13.74522209,381 +#OL/US-408,Červený vrch ,,50.54726410,13.68689919,366 +#OL/US-409,Bídnice ,,50.54791641,14.09565067,361 +#OL/US-410,Špičák ,,50.48109055,13.74748230,360 +#OL/US-411,Na Horách ,,50.45147000,14.21025000,221 +#OL/US-412,Bečovský vrch ,,50.43820953,13.73946095,363 +#OL/US-413,Bílá stráň ,,50.56003189,14.13698006,354 +#OL/US-414,Sokolský vrch ,,50.73415756,14.28566837,334 +#OL/US-415,Mannsteinův kámen ,,50.53050613,13.98254204,327 +#OL/US-416,Volská hora ,,50.61610413,13.98013115,309 +#OL/US-417,Holý vrch ,,50.52978516,14.23584938,302 +#OL/US-418,Syslík ,,50.42336273,13.86433315,285 +#OL/US-419,Nedvězí ,,50.68470001,13.96730995,284 +#OL/US-420,Hradiště ,,50.66269684,14.11286068,270 +#OL/US-421,Křemencový vrch ,,50.48028946,13.70059586,266 +#OL/US-422,Jezeř ,,50.41330338,13.69443417,262 +#OL/US-423,Malá Volavka ,,50.43750763,13.69692326,261 +#OL/US-424,Třešňovka ,,50.53794479,14.07202053,261 +#OL/US-425,Chlum,,50.45546341,13.70059967,259 +#OL/US-426,Homolka (Na Sychrově) ,,50.54237366,13.35824108,806 +#OL/US-427,Nad Vodárnou ,,50.51719284,13.34816837,768 +#OL/US-428,Dubina,,50.54069519,13.44557667,655 +#OL/US-429,Na Vrškách ,,50.41814804,13.14980698,647 +#OL/US-430,Nad Perštejnem ,,50.39103699,13.11923504,638 +#OL/US-431,Jánský vršek ,,50.40071106,13.14361954,632 +#OL/US-432,Planina,,50.40173721,13.15855217,603 +#OL/US-433,Hájek ,,50.77477264,14.02547359,590 +#OL/US-434,Čertovka ,,50.11270142,13.34799957,587 +#OL/US-435,Holubí vrch (Doupňák) ,,50.40989304,13.18289471,577 +#OL/US-436,Medvědí vrch ,,50.69189072,13.81572628,555 +#OL/US-437,Lipová ,,50.34675217,13.23658276,549 +#OL/US-438,Favorit,,50.42050552,13.20839214,545 +#OL/US-439,Houština ,,50.25653076,13.26457977,531 +#OL/US-440,Holý vrch ,,50.77302551,14.08507633,528 +#OL/US-441,Špičák ,,50.29914474,13.23834419,488 +#OL/US-442,Pravda - Ruins,,50.24113083,13.71164036,484 +#OL/US-443,Kapucín ,,50.12235641,13.36694717,469 +#OL/US-444,Janský vrch ,,50.11606979,13.37796021,468 +#OL/US-445,Stráž (Hlídka) ,,50.25563812,13.28338337,465 +#OL/US-446,Podhora,,50.24889755,13.76020050,459 +#OL/US-447,Čihadlo ,,50.68797302,13.84108067,454 +#OL/US-448,Hůrka ,,50.19976425,13.48795414,437 +#OL/US-449,Želečská výšina ,,50.23155975,13.57837009,428 +#OL/US-450,Jelení ,,50.12636185,13.35997963,427 +#OL/US-451,Sádecký vrch ,,50.24435425,13.60087872,422 +#OL/US-452,Vlčí důl ,,50.26226425,13.61842537,418 +#OL/US-453,Lavička ,,50.27786636,13.79885864,407 +#OL/US-454,Červený vrch ,,50.25632095,13.71996021,400 +#OL/US-455,Dubina,,50.19632339,13.56249142,398 +#OL/US-456,Červený vrch ,,50.19301987,13.58063507,397 +#OL/US-457,U silnice,,50.19881821,13.39595127,397 +#OL/US-458,Kozinec,,50.20490265,13.40415573,392 +#OL/US-459,Červený vrch ,,50.24805832,13.56719017,387 +#OL/US-460,Veselá ,,50.27803040,13.64974499,372 +#OL/US-461,Rubín ,,50.25443649,13.43796539,352 +#OL/US-462,Jankův vrch ,,50.26110840,13.53419971,315 +#OL/US-463,Blšanský Chlum ,,50.34721756,13.84017563,293 +#OL/US-464,Malý vrch ,,50.37921143,13.82890320,292 +#OL/US-465,Chlum,,50.27584839,13.55099964,289 +#OL/US-466,Malý Chlum ,,50.34347916,13.83708954,283 +#OL/US-467,Sovice,,50.46782684,14.30301857,278 +#OL/US-468,Hladový vrch ,,50.38658905,13.84191608,258 +#OL/US-469,Březenský vrch ,,50.35329056,13.73526955,237 +#OL/US-470,Mělce ,,50.35927200,13.76534081,223 +#OL/US-471,Klouček ,,50.43157959,14.32990837,210 +#OL/US-472,Bojiště ,,50.71195602,13.64802456,821 +#OL/US-473,Vodojem,,50.39978027,13.12407017,673 +#OL/US-474,Sokolí hřeben ,,50.65053177,14.17496872,592 +#OL/US-475,Smetánka ,,50.62136841,14.19263458,491 +#OL/US-476,Špičák ,,50.55422974,13.83270359,455 +#OL/US-477,Roudný ,,50.56455612,13.87472343,455 +#OL/US-478,Lysák ,,50.52292252,13.83896351,453 +#OL/US-479,Vinská hora ,,50.56348419,13.85503101,442 +#OL/US-480,Mrtvý vrch ,,50.55509186,13.85322285,441 +#OL/US-481,Lovčí ,,50.57894897,13.99127197,422 +#OL/US-482,Srna,,50.55881500,14.00294018,395 +#OL/US-483,Pískový vrch ,,50.59639359,14.16948032,394 +#OL/US-484,Chlum,,50.55268780,13.77878810,295 +#OL/US-485,Majka,,50.57833099,13.87741756,322 +#OL/US-486,Špičák ,,50.78556000,14.19979670,315 +#OL/US-487,Stoličná hora ,,50.78535970,14.22879650,289 +#OL/US-488,Mostná hora (Mostka) ,,50.54748917,14.13695145,276 +#OL/US-489,Chlomek,,50.55589294,14.02310467,275 +#OL/US-490,Krušina ,,50.42686462,13.87663841,224 +#OL/US-491,Kutný vrch ,,50.70885086,13.77542019,769 +#OL/US-492,Mohelnice,,50.72785950,13.87586975,746 +#OL/US-493,Důlní vrch ,,50.60343933,13.35182095,699 +#OL/US-494,Kukačka ,,50.43938828,13.25174046,642 +#OL/US-495,Velká skála ,,50.53109000,13.89087000,615 +#OL/US-496,Liščí kámen ,,50.75675964,13.99038982,634 +#OL/US-497,Mordovna,,50.78820038,13.95596123,625 +#OL/US-498,Holý vrch ,,50.77247620,13.99227810,616 +#OL/US-499,Kralupský vrch ,,50.44212723,13.28712368,516 +#OL/US-500,Jílový ,,50.45486832,13.76758957,346 +#OL/US-501,Pec,,50.46781158,13.74582005,320 +#OL/US-502,Eduardova skála ,,50.58239746,13.42901230,909 +#OL/US-503,Třtín ,,50.49335861,13.91471481,601 +#OL/US-504,Milíře ,,50.56847000,13.90818214,552 +#OL/US-505,Klůček ,,50.52230072,13.92595100,465 +#OL/US-506,Ptáčník ,,50.56875229,13.87710857,436 +#OL/US-507,Jezerní hora ,,50.38777161,13.21334076,420 +#OL/US-508,Vinice,,50.44933319,13.73164368,353 +#OL/US-509,Běšický chochol ,,50.36554337,13.35017776,350 +#OL/US-510,Čachovický vrch ,,50.36845779,13.36807632,312 +#OL/US-511,Na Bábě (Vyhlídka) ,,50.40494537,13.64929390,285 +#OL/US-512,Ve Skále ,,50.60140991,13.92428493,272 +#OL/US-513,Spálenisko ,,50.80147200,14.24482260,391 +#OL/US-514,Vlčí hora ,,50.13158798,13.48506641,482 +#OL/US-515,Velká Tisová ,,50.83890152,14.54735088,692 +#OL/US-516,Dubový vrch ,,50.32782745,13.23649693,691 +#OL/US-517,Javorek,,50.82908249,14.47076988,686 +#OL/US-518,Srní hora ,,50.83434296,14.55920982,657 +#OL/US-519,Hřebec ,,50.83539200,14.50654221,650 +#OL/US-520,Černý vrch ,,50.83433151,14.47025681,638 +#OL/US-521,Široký kopec ,,50.83238220,14.48425198,611 +#OL/US-522,Křížová hora ,,50.86812973,14.56523991,592 +#OL/US-523,Malá Tisová ,,50.83864975,14.52031231,595 +#OL/US-524,Lipnický vrch ,,50.82476044,14.43901539,585 +#OL/US-525,Na Širokém ,,50.84632111,14.48433018,563 +#OL/US-526,Záhořský les ,,50.15568161,13.27554226,558 +#OL/US-527,Dětaňský Chlum ,,50.19832993,13.30572987,539 +#OL/US-528,Kružínský vrch ,,50.18625259,13.31635571,535 +#OL/US-529,Kunratický vrch ,,50.81333160,14.42620754,505 +#OL/US-530,Spálený vrch ,,50.12155533,13.45538902,500 +#OL/US-531,Nad Hájenkou ,,50.27128983,13.25722027,495 +#OL/US-532,Špičník ,,50.11702347,13.45027542,484 +#OL/US-533,Nepomyšl ,,50.22248459,13.28939629,467 +#OL/US-534,Železný vršík ,,50.84756851,14.50261021,464 +#OL/US-535,Ovčí vrch ,,50.12144852,13.44207478,451 +#OL/US-536,Ptačí vrch ,,50.23099899,13.33059597,437 +#OL/US-537,Vrásník ,,50.79944992,14.22012138,427 +#OL/US-538,Peklo,,50.14096069,13.45924282,416 +#OL/US-539,Kozí hřbet ,,50.23308945,13.35621262,413 +#OL/US-540,Radonický vrch ,,50.28279495,13.27578068,411 +#OL/US-541,Baba,,50.11861420,13.42414951,407 +#OL/US-542,Klíčovka ,,50.15223694,13.42550755,398 +#OL/US-543,Široký vrch ,,50.51737976,13.62261486,386 +#OL/US-544,Mašťovský vrch ,,50.26465988,13.29889011,385 +#OL/US-545,Budina,,50.58145142,14.35441971,319 +#OL/US-546,Keřový vrch ,,50.51539993,13.68061733,319 +#OL/US-547,Strážný vrch ,,50.53456497,14.40126133,314 +#OL/US-548,Vidlák ,,50.37039948,14.34969997,269 +#OL/US-549,Jiřetín ,,50.41669464,14.00862885,252 +#OL/US-550,Nad Hájem ,,50.48638916,14.36555862,246 +#OL/US-551,Nad Vinicí ,,50.48462296,14.38509083,242 +#OL/US-552,Viselec,,50.40444565,13.98985958,227 +#OL/US-553,Skála ,,50.46789169,14.17045021,210 +#OL/US-554,Popovičský vrch ,,50.79396820,14.28439045,530 +#OL/US-555,Hlídka ,,50.75725174,14.27119541,480 +#OL/US-556,Běsenský vrch ,,50.16783142,13.49752045,402 +#OL/US-557,Kotel,,50.72700882,14.37172222,393 +#OL/US-558,Popovický vrch ,,50.76966476,14.17476845,356 +#OL/US-559,Liščí vrch ,,50.72399139,14.34671497,350 +#OL/US-560,Supí hora ,,50.70560074,13.88239002,694 +#OL/US-561,Kamenný vrch ,,50.55318069,13.89283752,670 +#OL/US-563,Farský vrch ,,50.55001000,13.40992000,799 +#OL/US-564,Jedlovec,,50.69565380,13.74879910,792 +#OL/US-566,Nad Mezibořím ,,50.62650740,13.60879580,638 +#OL/US-567,Vlčí kámen ,,50.67795100,13.73511580,614 +#OL/US-568,Lounický vrch ,,50.60663000,13.56560000,535 +#OL/US-569,Výšina ,,50.83545410,14.13929830,448 +#OL/US-570,Jánský vrch ,,50.55252000,13.48909000,738 +#OL/US-571,Točník ,,50.58503150,13.51576700,676 +#OL/US-572,Popelová hora ,,50.81463130,14.55948070,652 +#OL/US-573,Kotolský vrch ,,50.50351000,13.87883000,636 +#OL/US-574,Hasištejn ,,50.44523000,13.25746000,610 +#OL/US-575,Panenský vrch ,,50.57683410,14.15969740,607 +#OL/US-576,Pláň ,,50.64485190,14.19040730,596 +#OL/US-577,Josefinina skála ,,50.56906000,13.50250000,589 +#OL/US-578,U Lomu,,50.68970210,14.30183150,563 +#OL/US-579,Ptačí vrch ,,50.96175550,14.45764490,561 +#OL/US-580,Bukovina,,50.84624470,14.46364430,557 +#OL/US-581,Vápenný vrch ,,50.89910940,14.47668890,548 +#OL/US-582,Valy,,50.90687360,14.56279230,543 +#OL/US-583,Hraniční vrch ,,50.94653200,14.36341560,521 +#OL/US-584,Kamenný vrch ,,50.92527420,14.45613410,509 +#OL/US-585,Sokolí vrch ,,50.78067000,14.27084000,500 +#OL/US-586,Světský kopec ,,50.96212910,14.49275570,498 +#OL/US-587,Jedlina,,50.88244750,14.41813740,490 +#OL/US-588,Bor,,50.88754750,14.43112510,487 +#OL/US-589,Smrčník ,,50.77876000,14.45013000,586 +#OL/US-590,Suchý vrch ,,50.86784860,14.42283830,481 +#OL/US-591,Liščí vrch ,,51.03519810,14.38330950,480 +#OL/US-592,Hřebec ,,50.90477250,14.44124050,478 +#OL/US-593,Ludvíkův kopec ,,50.93696270,14.49160630,478 +#OL/US-594,Strážný vrch ,,51.00289320,14.36917210,475 +#OL/US-595,Hrad,,50.89290110,14.41533410,463 +#OL/US-596,Bouřňák ,,50.87927670,14.33623030,461 +#OL/US-597,Stráž ,,51.04288290,14.32252620,460 +#OL/US-598,Skalky,,50.60878190,14.03699100,455 +#OL/US-599,Jizerský vrch ,,50.62151770,14.00818850,454 +#OL/US-600,Jámy ,,50.78452950,14.31477620,452 +#OL/US-601,Vyhlídka ,,50.97468240,14.59386190,451 +#OL/US-602,Větrovec ,,50.87308320,14.33668780,450 +#OL/US-603,Kopřivník ,,50.83652580,14.16802270,449 +#OL/US-604,Vraní vrch ,,50.89919060,14.44745060,449 +#OL/US-605,Pytlák ,,50.90835820,14.40615130,448 +#OL/US-606,Medvědice ,,50.90880420,14.44187500,447 +#OL/US-607,Křížový vrch ,,50.94811240,14.44778190,446 +#OL/US-608,Brtník ,,50.91199000,14.43103000,444 +#OL/US-609,Bukovinský vrch ,,50.73947000,14.36396000,444 +#OL/US-610,Spálený vrch ,,50.99132590,14.30831590,443 +#OL/US-611,Lounický kopec ,,50.59946250,13.57375790,442 +#OL/US-612,Slunečný vrch ,,50.91470740,14.40268490,442 +#OL/US-613,Kuní vrch ,,50.91105340,14.41633000,441 +#OL/US-614,Špičák ,,50.87468220,14.40829920,440 +#OL/US-615,Severák ,,50.94506890,14.40662320,435 +#OL/US-616,Na Valech,,50.86134680,14.42831800,432 +#OL/US-617,Lobendavský vrch ,,51.02562300,14.30515330,430 +#OL/US-618,Trabice,,50.57938120,14.07114990,429 +#OL/US-619,Český vrch ,,50.86510000,14.44675000,426 +#OL/US-620,Včelí vrch ,,50.89936320,14.42364330,420 +#OL/US-621,Svážný ,,50.78624300,14.32485180,416 +#OL/US-622,Ferdinandova výšina ,,50.98578000,14.29622000,414 +#OL/US-623,Lipová ,,51.02358070,14.37001780,412 +#OL/US-624,Sokolí vrch ,,50.91802370,14.40759320,404 +#OL/US-625,Strážný vrch ,,50.78799450,14.38123340,404 +#OL/US-626,Lukovská Lada ,,50.59606000,14.38031000,403 +#OL/US-627,Hájek ,,50.78757360,14.39701450,399 +#OL/US-628,Havraní skála ,,50.85733510,14.40475370,393 +#OL/US-629,Na Zámečku (Zámecký vrch) ,,50.38615030,13.29229230,364 +#OL/US-633,Spáleniště ,,50.83760160,14.21157520,362 +#OL/US-634,Maják ,,50.81087000,14.39038000,360 +#OL/US-635,Bystřický kopec ,,50.39074760,13.28199750,356 +#OL/US-636,Homole,,50.25121870,13.42875670,354 +#OL/US-637,Jankův kopec ,,50.89460740,14.37832870,348 +#OL/US-638,Újezdský Špičák ,,50.50596000,14.46534000,348 +#OL/US-639,Janovský vrch ,,50.86079570,14.26841780,346 +#OL/US-640,Špičák ,,50.76452000,14.26246000,342 +#OL/US-641,Písky ,,50.51238100,14.40351700,341 +#OL/US-642,Na Pískách ,,50.50085860,14.43005840,335 +#OL/US-643,Malá Kozí horka ,,50.47149200,13.97228170,329 +#OL/US-644,Kobylka,,50.87729530,14.27236680,319 +#OL/US-645,Hřeben ,,50.78750410,14.18444180,317 +#OL/US-646,Vinice,,50.50058000,13.75044000,304 +#OL/US-647,Roháč ,,50.88030000,14.25764000,297 +#OL/US-648,Bílá hora ,,50.55238000,14.17245000,282 +#OL/US-649,Velká Vendula ,,50.54836760,14.05829370,281 +#OL/US-650,Zlatník ,,50.34162680,13.49109920,245 +#OL/US-652,Konopáč (Jelení skály) ,,50.83974280,14.57995140,676 +#OL/US-653,Stožec ,,50.83805810,14.58665570,665 +#OL/US-654,Malá Francka ,,50.56374280,13.90275610,581 +#OL/US-655,Spálený vrch ,,50.60438160,14.14623400,578 +#OL/US-656,Pod Lesem,,50.22007000,13.25708000,542 +#OL/US-657,Na Výšině ,,50.84946100,14.51645150,519 +#OL/US-658,Velká ,,50.21362000,13.32933000,492 +#OL/US-659,Hadí vrch,,50.57179600,13.95904320,488 +#OL/US-660,Za Kolinou,,50.32630000,13.26923000,485 +#OL/US-661,Homole,,50.71629090,14.29078430,448 +#OL/US-662,Skály ,,50.61982520,14.05449250,448 +#OL/US-663,Chlum,,50.75751920,14.22908410,444 +#OL/US-664,Skřivánčí vrch ,,50.75205280,14.38692410,410 +#OL/US-665,Dubový vrch ,,50.72452850,14.39272370,403 +#OL/US-666,Dlouhý vrch,,50.27128000,13.31138000,387 +#OL/US-667,Velká Hůrka ,,50.81807000,14.39996000,382 +#OL/US-668,Malá Hůrka ,,50.81897000,14.40524000,362 +#OL/US-669,Kořínka ,,50.55518110,13.99440550,349 +#OL/US-670,Na Křížku ,,50.56025990,14.14618430,331 +#OL/US-671,Bžanský vrch ,,50.59802170,13.88715110,294 +#OL/US-672,Planík,,50.44525210,14.00792010,278 +#OL/US-673,Krkavčí skála ,,50.58666610,14.08482220,445 +#OL/US-674,Na Stráni ,,50.81924450,14.23965240,416 +#OL/US-675,Horní Falter ,,50.80151080,14.17232010,404 +#OL/US-676,Havraní vrch ,,50.79718920,14.16030680,404 +#OL/US-677,Papertský vrch ,,50.79470090,14.20037850,361 +#OL/US-678,Písečný vrch ,,50.78630790,14.15784890,337 +#OL/US-679,Mariánský vrch ,,50.66454710,14.05096270,265 +#OL/US-680,Kalvárie ,,50.54724000,14.04880000,245 +#OL/US-681,Písečný Vrch (Sandhuebel) ,,50.86385600,14.25160400,310 +#OL/VY-001,Křivý javor ,,49.64288330,16.02182388,824 +#OL/VY-002,Malinská skála ,,49.66099548,16.07138634,811 +#OL/VY-003,Vysoký kopec ,,49.66829681,16.11644936,806 +#OL/VY-004,Šindelný vrch ,,49.66656113,15.94824123,805 +#OL/VY-005,Spálený vrch ,,49.54604340,15.01835823,718 +#OL/VY-006,Holý vrch ,,49.54827499,15.02477264,704 +#OL/VY-007,Hřeben ,,49.53704834,14.97677994,685 +#OL/VY-008,Na Kopci,,49.55331421,14.99601841,659 +#OL/VY-009,Pasecká skála ,,49.61554337,16.08136749,819 +#OL/VY-010,Fryšavský kopec ,,49.63755417,16.00232887,800 +#OL/VY-011,Suchý kopec ,,49.66136169,16.06206894,815 +#OL/VY-012,Lisovská skála ,,49.66177750,16.03823090,802 +#OL/VY-013,Míchův vrch ,,49.23739910,15.35645690,790 +#OL/VY-014,Skelný vrch ,,49.25582250,15.34422130,787 +#OL/VY-015,Velký skalní vrch ,,49.23449350,15.32923760,786 +#OL/VY-016,Kamenice,,49.60117460,16.16428210,780 +#OL/VY-017,Míchova skála ,,49.22856910,15.36117310,773 +#OL/VY-018,Strom,,49.66257280,16.16619020,771 +#OL/VY-019,Sólo ,,49.59543500,16.17237910,770 +#OL/VY-020,Rovina,,49.25447450,15.36147200,761 +#OL/VY-021,Mešnice ,,49.37758970,15.39753160,754 +#OL/VY-022,Prosíčka ,,49.64498560,16.19724200,739 +#OL/VY-023,Čtyřpaličaté skály ,,49.66084680,15.92277250,724 +#OL/VY-026,Na Čermačkách ,,49.69079330,16.02000620,722 +#OL/VY-027,Otrok,,49.67579380,15.96929470,717 +#OL/VY-028,Čertův hrádek ,,49.36680390,15.40548830,714 +#OL/VY-029,Strážník ,,49.46794440,15.45257900,713 +#OL/VY-030,Přední skála ,,49.36245220,15.42500900,712 +#OL/VY-031,Řídelovský kopec ,,49.25184640,15.38694310,712 +#OL/VY-032,Huťský vrch ,,49.36631420,15.44214870,710 +#OL/VY-033,U Osla,,49.70100220,16.04523770,709 +#OL/VY-034,Skalky,,49.48527850,15.49935690,709 +#OL/VY-035,Bukovce,,49.57782700,16.33708390,707 +#OL/VY-036,Farářský kopec ,,49.25896060,15.40302350,706 +#OL/VY-037,Šibenice ,,49.56684320,16.04828940,706 +#OL/VY-038,Píckov ,,49.62352740,16.18464230,700 +#OL/VY-039,Mistrovský kopec ,,49.28830090,15.51254620,699 +#OL/VY-040,Borový vrch ,,49.44222600,15.41344850,697 +#OL/VY-041,Dědkovská hora ,,49.42568090,15.90020610,694 +#OL/VY-042,Zámečníkův kopec ,,49.67171980,16.15460040,689 +#OL/VY-043,Vyštěnec ,,49.25698440,15.42729100,688 +#OL/VY-044,Suchý kopec,,49.69424590,15.89389800,684 +#OL/VY-045,Javorův kopec ,,49.58651750,16.32603150,683 +#OL/VY-046,Kosovský vrch ,,49.49496670,15.51359620,682 +#OL/VY-047,Ostrážná ,,49.58056970,16.28879520,680 +#OL/VY-048,Venušín ,,49.47475320,15.51200440,679 +#OL/VY-049,Ostrážka ,,49.24829570,15.53510600,676 +#OL/VY-050,Malý Špičák ,,49.32034660,15.50737450,673 +#OL/VY-051,Bajerův kopec ,,49.54143580,16.32194960,672 +#OL/VY-052,Zdeňkov ,,49.16923340,15.38422740,671 +#OL/VY-053,V Kopcích ,,49.12992230,15.71367640,669 +#OL/VY-054,Bojanov,,49.47365590,15.38698970,665 +#OL/VY-055,Hora,,49.15045140,15.38413700,664 +#OL/VY-056,Vysoký kámen ,,49.46298330,15.56697300,661 +#OL/VY-057,Boucko,,49.42092140,15.44376980,661 +#OL/VY-058,Kostelecký vrch ,,49.35813220,15.50600040,657 +#OL/VY-059,Lísek ,,49.21821450,15.52747570,656 +#OL/VY-060,Kopec,,49.57513390,15.42342260,655 +#OL/VY-061,Prosekaná ,,49.28485890,15.70193930,655 +#OL/VY-062,Na Skalách ,,49.36298090,16.14104600,654 +#OL/VY-063,Hamr,,49.25202350,15.46347070,651 +#OL/VY-064,Chlumek,,49.52010720,16.04408440,651 +#OL/VY-065,Švábův kopec ,,49.51522050,16.38827600,648 +#OL/VY-066,Spálený vrch ,,49.17750450,15.72440400,647 +#OL/VY-067,Hora (Smutná skála) ,,49.63458320,16.23532160,643 +#OL/VY-068,Dubovice,,49.55519950,16.34603420,640 +#OL/VY-069,Posekaný ,,49.33814720,15.87581260,640 +#OL/VY-070,Máselný kopec ,,49.51264140,15.51969380,634 +#OL/VY-071,Nad drahami,,49.47270100,16.28546530,632 +#OL/VY-072,Skalníky ,,49.30540290,15.87005960,632 +#OL/VY-073,Na Dědkovském ,,49.55243010,16.37045790,631 +#OL/VY-074,Hora,,49.57708700,16.23953410,631 +#OL/VY-075,Holý vrch ,,49.61844710,15.41245240,630 +#OL/VY-076,U Serpentinky,,49.48023890,15.56994700,630 +#OL/VY-077,Na Štěrbáku ,,49.56953270,16.35417360,629 +#OL/VY-078,U Sv. Antonína ,,49.41275270,15.48869460,629 +#OL/VY-079,Chlumek,,49.36400070,15.85401480,628 +#OL/VY-080,Roubšovka ,,49.59699840,16.26398650,628 +#OL/VY-081,Šafranice ,,49.61365570,15.27898780,627 +#OL/VY-082,Vrchy,,49.17893640,15.35422570,626 +#OL/VY-083,Hůlkovice ,,49.52666000,16.37987000,626 +#OL/VY-084,Sokolí hora ,,49.50916090,16.35692650,625 +#OL/VY-085,Soví hať ,,49.48213390,15.36899860,620 +#OL/VY-086,Červený kopec ,,49.31391880,15.86322010,617 +#OL/VY-087,Kalvárie ,,49.57972790,15.44559560,615 +#OL/VY-088,Pavlínovská horka ,,49.35918230,15.88235570,615 +#OL/VY-089,U Knoflíčka ,,49.49595740,16.37810530,614 +#OL/VY-090,Rudný ,,49.43495620,15.58121480,613 +#OL/VY-091,Olšina ,,49.51854870,15.48499530,612 +#OL/VY-092,Dlouhá skála ,,49.46155810,16.29091480,610 +#OL/VY-093,Strážka ,,49.29977440,15.68674570,610 +#OL/VY-094,Strážnice ,,49.41891280,15.94574890,609 +#OL/VY-095,Na Hlavinách ,,49.30681760,15.92533220,606 +#OL/VY-096,Strážnice ,,49.31338000,15.70108000,606 +#OL/VY-097,Holotín ,,49.58165640,16.25208000,602 +#OL/VY-098,Žebrákovský kopec ,,49.68240600,15.36480080,601 +#OL/VY-099,Volský vrch ,,49.66499130,15.56272090,598 +#OL/VY-100,Bednářův kopec ,,49.58906174,16.02815628,762 +#OL/VY-101,Bílá skála ,,49.59136581,16.04357719,777 +#OL/VY-102,Český kopeček ,,49.61796570,15.99157143,763 +#OL/VY-103,Brožova skalka ,,49.62357330,16.01400566,786 +#OL/VY-104,Metodka,,49.60596085,16.14720535,788 +#OL/VY-105,Rychtářův kopec ,,49.57229996,16.14828300,708 +#OL/VY-106,Křiby ,,49.60138702,16.06562424,785 +#OL/VY-107,Na Skále (Vávrova skála) ,,49.54684067,15.38574028,644 +#OL/VY-110,Jelence,,49.56689970,16.29822690,594 +#OL/VY-111,Hora,,49.18439820,15.37921250,593 +#OL/VY-112,Bukovce,,49.43838800,16.00847090,593 +#OL/VY-113,Březová hora ,,49.17338530,15.40127190,592 +#OL/VY-114,Vlčatinský vrch ,,49.30770160,15.95814580,590 +#OL/VY-115,Láč ,,49.07406650,15.67979510,587 +#OL/VY-116,Jahodná ,,49.52058490,16.32745300,587 +#OL/VY-117,Mikulovická hora ,,49.16369010,15.83959100,586 +#OL/VY-118,Rozhledna Rubačka ,,49.32314260,15.95753710,585 +#OL/VY-119,V Kopci,,49.05274590,15.68300810,583 +#OL/VY-120,Křiblík ,,49.39529750,16.17462260,582 +#OL/VY-121,Tašky ,,49.12381190,15.79001400,582 +#OL/VY-122,Brdo,,49.10837490,15.79535920,580 +#OL/VY-123,Holý kopec ,,49.09511240,15.78791470,580 +#OL/VY-124,Bukovec,,49.43406460,15.99249330,580 +#OL/VY-125,Pekelský vrch ,,49.39545620,15.51134500,579 +#OL/VY-126,Vráž ,,49.03564350,15.62788240,576 +#OL/VY-127,Kozlovská horka ,,49.50663640,16.32011370,576 +#OL/VY-128,Březina ,,49.46475350,15.70914300,574 +#OL/VY-129,Hošťanka ,,49.16567830,15.87232760,573 +#OL/VY-130,Horní Chlum ,,49.65422290,15.51881680,570 +#OL/VY-131,Pekelný kopec ,,49.18434160,15.84971100,570 +#OL/VY-132,Radostovický kopec ,,49.62806390,15.41202820,567 +#OL/VY-133,Ochoza,,49.49503210,16.32173490,567 +#OL/VY-134,Zámek Sádek ,,49.15804190,15.80405440,564 +#OL/VY-135,Vršek ,,49.68133320,15.46354600,558 +#OL/VY-136,Na Skalném ,,49.12421810,15.95416690,557 +#OL/VY-137,Svatý Vít ,,49.08226810,15.79297020,557 +#OL/VY-138,Věžná ,,49.45289550,16.27716520,556 +#OL/VY-139,Homole,,49.68550260,15.44628430,554 +#OL/VY-140,Strážnice ,,49.43257450,16.18864280,550 +#OL/VY-141,Hora,,49.42421390,15.97464370,549 +#OL/VY-142,Malá Homole ,,49.67348390,15.44678420,547 +#OL/VY-143,Na Sedlátkách ,,49.45858970,16.31170180,536 +#OL/VY-144,Bransouzský vrch ,,49.30932030,15.73750600,535 +#OL/VY-145,Václavův kříb ,,49.39560340,16.22148830,534 +#OL/VY-146,Lukovská hora ,,49.07339000,15.80143000,530 +#OL/VY-147,Koní vrch ,,49.28533470,16.14313080,526 +#OL/VY-148,Hůlkovice ,,49.52702650,16.37964190,526 +#OL/VY-149,Bítešská horka ,,49.29579260,16.25489020,494 +#OL/VY-150,Hradiště ,,49.75553070,15.68621840,480 +#OL/VY-151,Pyšolec,,49.54447470,16.33539920,467 +#OL/VY-152,Černá hora ,,49.18926530,16.21639990,452 +#OL/VY-153,Jalovcová hora ,,49.47771430,16.33833170,444 +#OL/VY-154,Pastýřka ,,49.15858440,16.17172980,426 +#OL/VY-155,Rovina,,49.14583390,16.23297050,410 +#OL/VY-156,Na Hlinách ,,49.10535000,16.23677000,392 +#OL/VY-157,Kraví hora ,,49.13922270,16.22996150,379 +#OL/VY-158,Na Čihadle ,,49.10271000,16.20820000,377 +#OL/ZL-001,Klokočí ,,49.17699814,17.85099983,622 +#OL/ZL-002,Papradná ,,49.20299911,17.89599991,603 +#OL/ZL-003,Tanečnice ,,49.23600006,17.92799950,602 +#OL/ZL-004,Drdol,,49.18700027,17.77899933,540 +#OL/ZL-005,Klenčov ,,49.17100143,17.72699928,536 +#OL/ZL-006,Buchlovský kámen ,,49.13700104,17.29899979,535 +#OL/ZL-007,Obětová ,,49.11299896,17.78700066,511 +#OL/ZL-008,Ploštiny ,,49.07600021,17.85199928,477 +#OL/ZL-009,Tlustá hora ,,49.20800018,17.64599991,458 +#OL/ZL-010,Tisový ,,49.33392334,17.83687592,652 +#OL/ZL-011,Ovčírna ,,49.08000183,17.75699997,429 +#OL/ZL-012,Maruška ,,49.36591890,17.82864810,664 +#OL/ZL-013,rozhledna Rovnina,,49.07099915,17.51300049,337 +#OL/ZL-014,Křemenná ,,49.27299881,17.52799988,315 +#OL/ZL-015,Kobylec,,48.93398666,17.78790855,845 +#OL/ZL-016,Na Horách ,,49.18552470,17.57135140,327 +#OL/ZL-017,Maková ,,49.16755295,17.49285507,338 +#OL/ZL-018,Gavendova skála ,,49.16255440,17.27811690,569 +#OL/ZL-019,Janova hora,,49.20028687,17.83311844,496 +#OL/ZL-020,Komínky ,,49.18473434,17.36728668,521 +#OL/ZL-021,Buchlov Sv. Barbora,,49.10881805,17.31843567,510 +#OL/ZL-022,Jahodný ,,49.28540802,18.03747177,609 +#OL/ZL-023,rozhledna Doubrava,,49.18378448,17.87290955,676 +#OL/ZL-024,Havránkov ,,49.22786713,17.55937958,252 +#OL/ZL-025,Mikulčin vrch ,,48.94524002,17.80868340,799 +#OL/ZL-026,Mladý Háj ,,49.12575912,17.84637070,535 +#OL/ZL-027,Choryňská stráž ,,49.49943161,17.88908958,376 +#OL/ZL-028,Sedliska,,49.46923065,17.87659073,414 +#OL/ZL-029,Vystrkovská Strážka ,,49.47431183,17.90500069,428 +#OL/ZL-030,U Rozhledny,,49.26293182,17.67032051,384 +#OL/ZL-031,Sýkory ,,49.23366928,17.62855911,316 +#OL/ZL-032,Díly ,,49.21305847,17.68898010,438 +#OL/ZL-033,Barabáš,,49.21215820,17.66518974,410 +#OL/ZL-034,Přední vrch ,,49.25434875,17.64195061,420 +#OL/ZL-035,Jehelník ,,49.39516068,17.75496483,838 +#OL/ZL-036,Smrdutá ,,49.37407810,17.75667250,750 +#OL/ZL-037,Jelenec,,48.86027000,17.70289000,925 +#OL/ZL-038,Malý Lopeník ,,48.92749080,17.77972180,881 +#OL/ZL-039,Vyškovec (Tomkův vrch) ,,48.95052660,17.84449710,710 +#OL/ZL-041,Klemůvka ,,49.02690520,17.89898150,643 +#OL/ZL-042,Smolenka,,49.03618730,17.92190880,632 +#OL/ZL-043,Rozhledna U křížku ,,48.92970000,17.71842000,604 +#OL/ZL-044,Nová hora ,,48.89310910,17.73360430,551 +OY/EY-001,Slættaratindur,,62.29664993,-7.01316977,880 +OY/EY-002,Gráfelli,,62.31063843,-6.99918985,856 +OY/EY-003,Eiðiskollur,,62.31578064,-7.10422993,352 +OY/EY-004,Horn,,62.32846832,-7.00766993,591 +OY/EY-005,Fjallið,,62.33041000,-6.97022009,469 +OY/EY-006,Sandfelli,,62.31945038,-6.98842001,752 +OY/EY-007,Middagsfjall,,62.31066132,-6.94530010,601 +OY/EY-008,Tyril,,62.31499863,-6.92038012,535 +OY/EY-009,Mannsetur,,62.31015015,-7.03176022,615 +OY/NO-001,Kunoyarnakkur,,62.36611176,-6.68249989,719 +OY/NO-002,Villingadalsfjall,,62.38134003,-6.55524206,841 +OY/NO-003,Kúvingafjall,,62.31261444,-6.66814995,830 +OY/SA-001,Tindur,,61.84640884,-6.74433994,479 +OY/SA-002,Skorarnar,,61.84957886,-6.76874018,460 +OY/SA-003,Endin,,61.85660934,-6.78465986,452 +OY/SA-004,Pætursfjall,,61.83953094,-6.72716999,447 +OY/SA-005,Eiriksfjall,,61.87434006,-6.90718985,412 +OY/SA-006,Kneysurin,,61.87033081,-6.90033007,404 +OY/SA-007,Endin,,61.88436890,-6.90764999,401 +OY/SA-008,Vestfelli,,61.80419922,-6.71363020,397 +OY/SA-009,Høgoyggj,,61.69562149,-6.76484013,396 +OY/SA-010,Stórafjall,,61.79695129,-6.69017982,396 +OY/SA-011,Knútur,,61.76816177,-6.85537004,392 +OY/SA-012,Skorin,,61.75003815,-6.82199001,391 +OY/SA-013,Skorin,,61.75389862,-6.67983007,391 +OY/SA-014,Vørðan,,61.86008072,-6.88570023,373 +OY/SA-015,Knúkur,,61.88764191,-6.84494019,369 +OY/SA-016,Fjallið,,61.88843155,-6.83816004,362 +OY/SA-017,Skúvoyarfjall,,61.76784897,-6.67938995,354 +OY/SA-018,Bøllufjall,,61.85420990,-6.87193012,312 +OY/SA-019,Á Kletti,,61.68569946,-6.74607992,308 +OY/SA-020,Húgvan,,61.68444061,-6.74064016,288 +OY/SA-021,Gleðin,,61.90425873,-6.93736982,271 +OY/SA-022,Heiðafjall,,61.81678009,-6.67273998,266 +OY/SA-023,Klettarnir,,61.77896118,-6.83799982,256 +OY/SA-024,Nakkur,,61.75553131,-6.68084002,251 +OY/SA-025,Skálhøvdi,,61.82925034,-6.63732004,203 +OY/SA-026,Salthøvdi,,61.82030106,-6.87551022,139 +OY/SA-027,Høvdin,,61.78419113,-6.85283995,134 +OY/ST-001,Kopsenni,,62.22846985,-7.20662022,789 +OY/ST-002,Ørvisfelli,,62.20846939,-7.15723991,783 +OY/ST-003,Malaknúkur,,62.22533035,-7.21590996,777 +OY/ST-004,Skælingsfjall,,62.08900070,-6.98542976,767 +OY/ST-005,Melin,,62.26576996,-7.17109013,764 +OY/ST-006,Mosarøkur,,62.19815063,-7.18322992,756 +OY/ST-007,Sornfelli,,62.06812668,-6.96724176,749 +OY/ST-008,Sneis,,62.16588974,-7.04631996,747 +OY/ST-009,Stígarnir,,62.18946838,-7.13040018,710 +OY/ST-010,Víkartindur,,62.26168060,-7.15357018,703 +OY/ST-011,Gívrufelli,,62.25392151,-7.15059996,701 +OY/ST-012,Heyggjurin Mikli,,62.28340912,-7.18097019,692 +OY/ST-013,Fjallið millum Botnar,,62.06044006,-6.95692015,686 +OY/ST-014,Húgvan,,62.28002930,-7.20195007,674 +OY/ST-016,Núgvan,,62.05342102,-6.94007015,667 +OY/ST-017,Múlin,,62.08330917,-6.83335018,663 +OY/ST-018,Lágafjall,,62.15785980,-7.04786015,663 +OY/ST-019,Múlin,,62.19287872,-7.11456013,663 +OY/ST-020,Bøllufjall,,62.20318985,-7.17664003,658 +OY/ST-021,Eggjarmúli,,62.27182007,-7.20768976,651 +OY/ST-022,Gívrufjall,,62.14661026,-6.99479008,649 +OY/ST-023,Tosskorarhorn,,62.21591187,-7.22795010,644 +OY/ST-024,Borgin,,62.23120117,-7.17047024,642 +OY/ST-025,Loysingafjall,,62.16957092,-7.12179995,639 +OY/ST-026,Høvdin,,62.25518036,-7.23101997,635 +OY/ST-027,Vørlufjall,,62.13626862,-6.92756987,633 +OY/ST-028,Árnadalstindur,,62.13309860,-6.95708990,633 +OY/ST-029,Postulakirkja,,62.18957138,-7.21476984,626 +OY/ST-030,Moskursfjall,,62.18246841,-7.13465023,624 +OY/ST-031,Snubburnar,,62.29307938,-7.22412014,623 +OY/ST-032,Navirnar,,62.15880966,-6.99708986,622 +OY/ST-033,Sátan,,62.11510849,-7.01036978,621 +OY/ST-034,Egilsfjall,,62.13935852,-7.08935022,618 +OY/ST-035,Bollin,,62.17020035,-7.02651978,616 +OY/ST-036,Stallur,,62.08554840,-6.96193981,614 +OY/ST-037,Pætursfjall,,62.21485138,-7.20498991,613 +OY/ST-038,Vitin,,62.16669846,-7.01989985,605 +OY/ST-039,Langafjall,,62.24031067,-7.11719990,599 +OY/ST-040,Miðalfelli,,62.18288040,-7.09414005,596 +OY/ST-041,Knúkurin,,62.23628998,-7.11034012,589 +OY/ST-042,Kaldbakskambur,,62.09249115,-6.86028004,588 +OY/ST-043,Bøllufjall,,62.14313889,-6.98577976,585 +OY/ST-044,Tindur,,62.13830948,-7.10503006,579 +OY/ST-045,Tindur,,62.18872070,-7.23428011,579 +OY/ST-046,Fjallið Litla,,62.20167160,-7.13670015,572 +OY/ST-047,Mýlingur,,62.30043030,-7.21630001,564 +OY/ST-048,Stiðjafjall,,62.04520035,-6.90456009,547 +OY/ST-049,Sandfelli,,62.22542191,-7.09840012,537 +OY/ST-050,Tungulíðfjall,,62.03612137,-6.89793015,535 +OY/ST-051,Ritufelli,,62.07817078,-6.89572001,499 +OY/ST-052,Konufelli,,62.01337051,-6.89921999,491 +OY/ST-053,Dyllan,,62.11310959,-6.94480991,481 +OY/ST-054,Murufelli,,62.02624130,-6.88946009,479 +OY/ST-055,Gásafelli,,62.13748169,-7.06525993,477 +OY/ST-056,Uppi á Oyggj,,61.99370956,-6.99798012,477 +OY/ST-057,Hægstafjall,,62.28456116,-7.13478994,470 +OY/ST-058,Rossafelli,,62.20925903,-7.05569983,453 +OY/ST-059,Vatnfelli,,62.26332092,-7.12468004,429 +OY/ST-060,Ytriheyggjur,,62.25394058,-7.21308994,425 +OY/ST-061,Múlin,,61.96480942,-6.91632986,421 +OY/ST-062,Eggjarók,,61.95838165,-6.90982008,421 +OY/ST-063,Fjallið,,62.00352097,-6.87229013,417 +OY/ST-064,Heimariheyggjur,,62.25371170,-7.20566988,409 +OY/ST-065,Gásafelli,,62.25981903,-7.10267019,399 +OY/ST-066,Eggjaklettur,,61.98910904,-6.65282011,372 +OY/ST-067,Lambafelli,,62.04330063,-6.87202978,366 +OY/ST-068,Uppi á Manni,,61.98691940,-6.64939022,352 +OY/ST-069,Kirkjubøreyn,,61.98477936,-6.81333017,351 +OY/ST-070,Reynið,,62.16291046,-7.16241980,349 +OY/ST-071,Húsareyn,,62.02330017,-6.82250977,345 +OY/ST-072,Lómfelli,,62.26633835,-7.11202002,345 +OY/ST-073,Kirkjubøkambur,,61.95476151,-6.77873993,306 +OY/ST-074,Hægstafjall,,62.15327072,-7.19888020,296 +OY/ST-075,Melin,,62.16104889,-7.19667006,293 +OY/ST-076,Tvørfelli,,61.98954010,-6.84113979,273 +OY/ST-077,Skúvafjall,,61.97087097,-6.63467979,234 +OY/ST-078,Fjallið (Tórshavn),,62.00765991,-6.81569004,222 +OY/ST-079,Navirnar,,61.93836975,-6.86980009,211 +OY/ST-080,Lítlafjall,,62.00342941,-6.82145977,198 +OY/ST-081,Fjallið,,62.28060913,-7.10288000,188 +OY/ST-082,Líðarfjall,,61.96152878,-6.62045002,152 +OY/ST-083,Fjallið Mikla,,61.98054886,-6.96455002,101 +OY/SU-001,Gluggarnir,,61.54450989,-6.88850021,610 +OY/SU-002,Borgarknappur,,61.50361252,-6.84451914,574 +OY/SU-003,Beinisvørð,,61.42038345,-6.75991106,470 +OY/SU-004,Gjógvaráfjall,,61.47200775,-6.85270596,345 +OY/SU-005,Rávan,,61.63299942,-6.71062994,414 +OY/VA-001,Trælanípa,,62.02764893,-7.22488403,148 +OY/VA-002,Árnafjall,,62.09999847,-7.44999981,772 +OY/VA-003,Eysturtindur,,62.11666870,-7.40000010,714 +OY/VA-004,Heðinsskorarfjall,,62.11336136,-7.59008980,433 +OY/VA-005,Knúkur,,62.10366058,-7.58190012,560 +OY/VA-006,Árnafjall,,62.09465027,-7.55224991,350 +SO/IS-001,Góra Orla,,54.34245000,18.88773000,32 +SO/KA-001,Szrenica,,50.79188610,15.51365690,1362 +SO/LU-001,Gora Zarska (Rueckenberg),,51.59924042,15.12864590,227 +SO/LU-002,Kawcza Gora (Dohlen Berg),,52.86962193,15.68461418,129 +SO/MP-001,Kopiec Pilsudzkiego,,50.06005000,19.84715000,393.6 +SO/PO-001,Grzywacz,,53.95226000,14.50125000,116 +SO/SZ-001,Sine Skałki ,,50.85735220,15.40435080,1122 +SO/SZ-002,Stóg Izerski ,,50.89154060,15.30426690,1107 +SO/SZ-003,Podmokła ,,50.87643830,15.35340420,1001 +V5/ER-001,Koenigstein,,-21.14999962,14.58333015,2573 +V5/ER-002,Zisabspitze,,-21.14999962,14.64999962,2169 +V5/ER-003,Hohenstein,,-21.72766685,15.52799702,2319 +V5/ER-004,Langer Heinrich,,-22.76666641,15.33333302,684 +V5/ER-005,Nubebberg,,-22.03925323,15.62186527,1618 +V5/ER-006,Okenyenya,,-20.83822632,15.32733727,1902 +V5/ER-007,Spitzkoppe,,-21.82472229,15.19416714,1728 +V5/ER-008,Kleine Spitzkoppe,,-21.85499954,15.05194378,1557 +V5/ER-009,Schwarze Spitzkoppe,,-21.66222191,15.13944435,1178 +V5/ER-010,Vogelfederberg,,-23.05666161,14.98530102,527 +V5/HA-001,Koedoeberg,,-23.24243736,17.03553963,1680 +V5/HA-002,Losberg,,-25.06666756,16.03333282,1939 +V5/HA-003,Tsebrisberg,,-23.26399994,16.89100075,1971 +V5/HA-004,Big Daddy,,-24.73350000,15.28934000,650 +V5/HA-005,Bullenkopf,,-24.13140200,16.35241300,1550 +V5/KA-001,Brukkaros,,-25.86722183,17.78138924,1590 +V5/KA-002,Dikwillem (Garubberg),,-26.46666908,16.01667023,1496 +V5/KA-003,Oorlogskop,,-28.70000076,19.06666756,1136 +V5/KA-004,Schlangkopf,,-26.73332977,17.86667061,780 +V5/KA-005,Schroffenstein,,-27.18333054,18.73332977,2202 +V5/KA-006,Verneukberg,,-28.08953094,17.24934387,857 +V5/KA-007,Wasserkuppe,,-27.76666641,16.39999962,640 +V5/KA-008,Wetterkopf,,-27.79222107,17.95055580,1398 +V5/KA-009,Ysterberg,,-28.11666679,18.13333321,1133 +V5/KH-001,Auasende,,-22.61027718,17.28277779,2344 +V5/KH-002,Grossherzog-Friedrich-Berg,,-22.70888901,17.06111145,2336 +V5/KH-003,Kamelberg,,-22.64110947,17.15971947,2194 +V5/KH-004,Kempinskiberg,,-22.66888809,17.13444328,2187 +V5/KH-005,Moltkeblick (Mt. Auas),,-22.65099907,17.18000031,2479 +V5/KH-006,Oorlogstein,,-22.62055969,17.24860954,2392 +V5/KH-007,Regenstein,,-22.73361015,17.03556061,2302 +V5/KH-008,Schakalberg,,-22.60083389,17.21027756,2058 +V5/KH-009,Stormberg,,-22.62249947,17.23194313,2424 +V5/KH-010,Abendstein,,-22.46166611,17.12416649,2051 +V5/KH-011,Bockstein,,-22.43277931,17.12556076,1805 +V5/KH-012,Doebra,,-22.39722061,17.16832924,2023 +V5/KH-013,Erzberg,,-22.42694092,17.19610977,2115 +V5/KH-014,Haynschlucht,,-22.45555687,17.13999939,2067 +V5/KH-015,Kuersteneck,,-22.39999962,17.15943909,1896 +V5/KH-016,Loewenhaupt,,-22.42694092,17.19610977,1974 +V5/KH-017,Ludwigkop,,-22.48333359,17.25527763,2133 +V5/KH-018,Oruhungu,,-22.28944016,17.29972076,1897 +V5/KH-019,Viereckstein,,-22.54306030,17.15888977,1909 +V5/KH-020,Wachter,,-22.47666740,17.12722015,2120 +V5/KH-021,Zagenicht,,-22.49139023,17.12277985,2007 +V5/KH-022,Billstein,,-22.98333359,17.00000000,1857 +V5/KH-023,Bismarckfelsen,,-22.86666679,17.03333282,2417 +V5/KH-024,Gamsberg,,-23.34250069,16.22555542,2347 +V5/KH-025,Humansberg,,-22.72027779,17.49027824,2026 +V5/KH-026,Neudammkuppe,,-22.43840027,17.30724335,2092 +V5/KH-027,Nubuamisberg,,-22.48138809,17.05361176,1776 +V5/KH-028,Paviansberg,,-22.64194489,17.46805573,1814 +V5/KH-029,Schildkroete (Schildkroetenberg),,-22.74865532,17.11851692,2197 +V5/KH-030,Schlangenberg,,-22.61916733,17.16083336,2019 +V5/KH-031,Falkenstein,,-22.73305511,17.12583351,1942 +V5/KH-032,Klein Kuppe,,-22.63361168,17.10305595,1918 +V5/KH-033,Kuduberg,,-22.61777878,17.14666748,1970 +V5/KH-034,Rosaberg,,-22.61833382,17.43361092,2067 +V5/KH-035,Spitzberg,,-22.60694313,17.13972282,1886 +V5/KH-036,Kaiser Wilhelm Berg,,-22.61611176,17.02722168,1997 +V5/KH-037,Hoh Windhoek,,-22.58166695,17.10777855,1880 +V5/KH-038,von-Francois-Feste,,-22.66819000,16.62032700,1638 +V5/KU-001,Fingerklippe,,-20.38284874,15.43392563,929 +V5/KU-002,Grootberg,,-19.83333015,14.13329983,1640 +V5/KU-003,Verbrannter Berg,,-20.62167931,14.41822529,800 +V5/OD-001,Etjo,,-21.10000038,16.46666908,2086 +V5/OD-002,Klein-Etjo,,-21.06500053,16.41500092,1727 +V5/OD-003,Klein-Waterberg,,-20.67499924,17.09000015,1930 +V5/OD-004,Omatakoberge,,-21.20308113,16.71191025,2286 +V5/OD-005,Ombotozo,,-21.64824295,16.83988762,1918 +V5/OD-006,Orosberg,,-20.20000076,17.04500008,1822 +V5/OD-007,Osanakuppe,,-22.13198853,16.86885643,1459 +V5/OD-008,Waterberg,,-20.45049858,17.23804474,1885 +V5/OH-001,Omitaraberg,,-22.23333359,18.01666641,1656 +#hamnet-db +,9a0xbk,,43.98239,15.30576,0 +,9a0xda,,45.59415,17.18404,0 +,9a0xds,,45.82318,16.23535,0 +,9a0xdu-2,,42.64994,18.11034,0 +,9a0xdu,,42.64992,18.07227,0 +,9a0xfe,,45.80153,15.97112,0 +,9a0xgk,,45.30566,15.02857,0 +,9a0xgl,,45.38135,16.12105,0 +,9a0xjp,,45.74929,15.60897,0 +,9a0xka,,45.31644,15.80500,0 +,9a0xkn,,43.92452,16.16975,0 +,9a0xko,,44.78442,15.75641,0 +,9a0xkt,,45.61409,16.75397,0 +,9a0xku,,45.48343,17.84631,0 +,9a0xkz,,46.13149,16.45546,0 +,9a0xlb,,43.57786,16.21530,0 +,9a0xma,,43.34206,17.05384,0 +,9a0xpl,,42.96313,17.36325,0 +,9a0xpu,,45.01994,14.12279,0 +,9a0xri,,45.28773,14.20318,0 +,9a0xse,,44.82749,14.99223,0 +,9a0xsi,,43.73661,15.91604,0 +,9a0xsl,,45.38573,17.33226,0 +,9a0xst,,43.57192,16.36951,0 +,9a0xug,,44.07181,15.15904,0 +,9a0xvi,,43.03033,16.11420,0 +,9a0xvz,,46.18183,16.12610,0 +,9a0xzb-1,,46.18606,15.89350,0 +,9a0xzb-2,,46.18539,15.89588,0 +,9a0xzd,,44.26015,15.78498,0 +,9a0xzg,,45.89931,15.94810,0 +,9a1cqd,,45.51304,16.16365,0 +,9a1dfg,,45.47972,16.36400,0 +,9a1w,,45.81257,15.50728,0 +,9a3ayz,,45.77593,15.98362,0 +,9a3px,,45.77365,15.98451,0 +,9a4gl,,45.73083,15.90179,0 +,9a4mn,,46.02102,16.55247,0 +,9a4v,,45.30347,18.73489,0 +,9a5k,,46.02751,15.88763,0 +,9a7s,,45.34298,16.33901,0 +,9a9t,,46.03551,15.87880,0 +,cq0dbo,,41.69749,-7.43774,0 +,cq0dch,,41.73236,-7.64773,0 +,cq0dpd,,41.56142,-7.51709,0 +,cq0uat,,41.84399,-7.33556,0 +,cq0vmi,,41.54903,-7.68870,0 +,cs5nra,,38.66332,-9.15528,0 +,cs5rat,,41.77000,-7.46875,0 +,ct2keq,,40.66241,-8.63558,0 +,ct7ajl,,38.67899,-9.16443,0 +,da5tor,,52.26329,10.18257,0 +,db0aai,,49.31909,8.08250,670 +,db0aas,,50.25281,6.78226,0 +,db0aat,,47.84116,12.65477,765 +,db0ab,,49.13748,10.60838,521 +,db0abb,,51.60731,9.73621,0 +,db0abc,,49.79180,10.58150,0 +,db0abz,,52.16097,10.43127,153 +,db0aca,,48.21027,9.40388,0 +,db0ach,,50.76277,6.16222,0 +,db0adb,,49.88770,10.85980,0 +,db0ae,,51.81949,9.86100,0 +,db0afz,,51.26689,9.42676,0 +,db0agi,,53.21871,10.46755,0 +,db0agm,,53.25353,10.50822,0 +,db0ahi,,52.11676,9.89678,0 +,db0ais,,49.98820,8.59179,0 +,db0aja,,49.77124,10.02070,0 +,db0ajw,,52.50855,13.27494,58 +,db0alb,,48.30540,8.99211,0 +,db0alg,,52.28600,9.97719,0 +,db0alu,,49.58963,8.32078,110 +,db0amb,,49.04508,11.08766,0 +,db0amk,,52.56050,11.97916,0 +,db0and,,49.30799,10.58131,455 +,db0ant,,52.16852,10.57065,0 +,db0anu,,49.28925,10.57218,470 +,db0arb,,49.11219,13.13560,0 +,db0arh,,48.60499,8.89419,0 +,db0ats,,52.32712,9.80613,0 +,db0atv,,52.04026,6.93233,0 +,db0atw,,51.02000,6.78999,0 +,db0av,,47.85141,12.12173,0 +,db0avh,,52.54033,13.19847,34 +,db0avr,,50.76283,6.21966,0 +,db0ax,,51.56588,8.76933,387 +,db0bac,,49.03473,9.55990,0 +,db0bam,,49.81636,10.85956,0 +,db0bar,,52.63886,13.61003,0 +,db0bay,,49.31946,12.02511,0 +,db0bbg,,49.85009,11.06330,0 +,db0bc,,52.51025,13.29202,0 +,db0bel,,52.13186,12.58492,0 +,db0bgh,,48.17851,12.84092,488 +,db0bgk,,49.72640,10.27219,0 +,db0bh,,48.70514,7.97133,125 +,db0bhn,,53.54850,8.57933,0 +,db0bhv,,53.58766,8.61050,0 +,db0bi,,52.01454,8.47350,312 +,db0bib,,48.09694,9.81309,0 +,db0bio,,51.76464,9.58074,0 +,db0bl,,48.87561,10.38435,600 +,db0bla,,52.32567,13.40057,0 +,db0blh,,51.58942,11.24387,0 +,db0blw,,48.24194,8.86055,0 +,db0bm,,52.25218,8.71797,0 +,db0bmi,,49.66283,9.00844,0 +,db0bn,,50.37225,8.15316,0 +,db0bnv,,53.17289,8.61750,0 +,db0boh,,51.84299,6.61383,0 +,db0bor,,51.83883,6.86050,0 +,db0bos,,49.74020,8.92146,0 +,db0bp,,48.88520,9.20540,0 +,db0bpy,,51.95888,9.32389,0 +,db0bq,,51.73760,8.69476,0 +,db0brh,,50.46040,10.00649,0 +,db0brl,,52.53486,13.48572,57 +,db0bro,,51.80033,10.61833,0 +,db0brv,,53.37250,9.20752,0 +,db0bs,,51.47319,7.22583,0 +,db0bul,,49.21095,12.05342,0 +,db0bux,,53.46903,9.68616,0 +,db0bw,,48.55395,13.34567,0 +,db0bwl,,52.52340,10.77099,0 +,db0ccc,,52.63616,10.09366,0 +,db0cel,,52.63399,10.08603,0 +,db0cfm,,51.17005,6.58502,0 +,db0cha,,49.30680,12.71148,731 +,db0chv,,53.85633,8.67716,0 +,db0chz,,50.74630,12.92531,0 +,db0cj,,49.45327,11.87086,514 +,db0cm,,50.04639,8.97443,0 +,db0cp,,48.54324,11.43129,0 +,db0cpu,,49.47010,8.48236,98 +,db0cra,,49.12065,9.97558,0 +,db0cri,,50.81123,12.37347,0 +,db0cws,,50.31249,9.45833,0 +,db0dah,,48.42402,11.26834,553 +,db0dam,,52.55851,8.21051,124 +,db0dan,,53.06600,10.89550,0 +,db0dar,,49.86015,8.68041,0 +,db0dau,,50.18555,6.86472,0 +,db0db,,47.77684,7.70100,1149 +,db0dba,,48.08266,11.50320,565 +,db0dbr,,54.09433,11.90199,0 +,db0dde,,51.46150,7.02699,0 +,db0dds,,51.46213,7.54367,0 +,db0del,,53.04822,8.62309,0 +,db0deq,,52.77704,11.75871,0 +,db0des,,51.85182,12.24016,0 +,db0dh,,51.38425,6.76162,0 +,db0dhh,,54.33719,9.15735,0 +,db0di,,53.93582,10.30272,0 +,db0dif,,50.09244,8.75203,0 +,db0diz,,53.94495,9.50527,0 +,db0dlg,,48.51326,10.42024,0 +,db0dlr,,52.31554,10.56400,0 +,db0dmb,,54.41219,10.23069,0 +,db0dmo,,51.15591,6.67503,0 +,db0don,,48.73294,10.78901,0 +,db0dor,,51.09277,6.84007,0 +,db0dos,,52.17771,8.04543,316 +,db0dre,,51.61563,7.22565,0 +,db0dri,,51.76879,9.07960,0 +,db0ds,,51.49768,7.47128,0 +,db0dsd,,51.03541,13.63254,0 +,db0dsp,,51.21289,6.76289,43 +,db0dtr,,49.77640,6.57200,0 +,db0dux,,51.20630,6.79050,0 +,db0dvr,,52.22696,10.47411,0 +,db0dy,,52.16797,7.90372,0 +,db0eam,,51.35214,9.26801,35 +,db0eat,,53.72700,9.76700,0 +,db0eb,,51.83332,9.87016,0 +,db0ebe,,48.09010,11.96127,618 +,db0ebq,,51.21613,7.06195,0 +,db0edf,,51.10199,6.46299,0 +,db0ee,,51.86404,6.17161,0 +,db0eeo,,51.84935,6.25673,0 +,db0eg,,52.10001,7.26352,0 +,db0egb,,54.61300,9.34925,0 +,db0egt,,48.09999,8.27555,0 +,db0eh,,49.53697,11.52526,0 +,db0eic,,48.90848,11.19708,546 +,db0eid,,51.52011,10.31656,0 +,db0eif,,50.27111,6.82083,0 +,db0eig,,51.61049,10.21682,0 +,db0ein,,51.84111,9.82250,0 +,db0eir,,51.33010,7.26551,0 +,db0els,,53.24193,8.46652,2 +,db0eml,,50.89163,10.69266,0 +,db0ems,,52.85139,7.52215,0 +,db0end,,51.30770,7.31570,316 +,db0eq,,49.03432,8.99749,0 +,db0erf,,50.96000,11.06000,0 +,db0erk,,51.12183,6.20149,0 +,db0erz,,50.45616,12.64700,0 +,db0ess,,47.55334,10.31670,1667 +,db0et,,53.40575,7.01558,0 +,db0etb,,51.02000,11.25000,0 +,db0eu,,50.65746,6.39410,0 +,db0euf,,53.06550,11.44233,0 +,db0ev,,49.43970,12.55003,0 +,db0ewb,,53.48220,9.03592,0 +,db0fa,,52.89973,10.17288,0 +,db0faa,,48.86086,10.13738,731 +,db0fav,,52.32004,14.52866,0 +,db0fb,,47.87262,8.00565,0 +,db0fbg,,50.92916,13.34850,0 +,db0fbh,,49.60314,7.74573,425 +,db0fc,,52.27627,10.54066,80 +,db0fda,,49.86732,8.63847,0 +,db0fdb,,48.36265,10.98563,0 +,db0feu,,49.15813,10.32723,457 +,db0ffl,,48.58691,12.34399,0 +,db0ffo,,52.11909,14.56845,0 +,db0fha,,48.87194,10.06333,488 +,db0fhc,,50.26491,10.95182,0 +,db0fhf,,54.77517,9.45138,0 +,db0fhh,,52.35602,9.76866,0 +,db0fhn,,49.45275,11.09435,0 +,db0fho,,53.36771,7.18229,0 +,db0fhr,,47.87046,12.11200,450 +,db0fhs,,50.61676,10.72320,0 +,db0fhw,,54.19495,9.12239,0 +,db0fib,,50.42889,12.95499,0 +,db0fks,,49.79395,8.66816,0 +,db0flh,,49.54177,8.31378,0 +,db0flx,,49.87370,8.66096,0 +,db0fn,,50.84259,8.03451,0 +,db0for,,49.61861,11.02967,378 +,db0fox,,48.29740,10.89492,511 +,db0frb,,48.01939,7.83849,0 +,db0frg,,47.90975,7.89135,1201 +,db0fs,,53.59759,9.94652,0 +,db0ft,,50.23180,8.45739,0 +,db0ftc,,49.59451,8.15197,0 +,db0fth,,49.53713,8.37846,0 +,db0fts,,50.61249,10.74516,0 +,db0fue,,49.48072,10.95704,320 +,db0ful,,50.53148,9.72777,0 +,db0fus,,52.39395,9.80216,0 +,db0fuz,,52.43560,13.58666,34 +,db0fws,,50.04530,10.21049,0 +,db0gaj,,47.93656,7.62307,0 +,db0gap,,47.58600,11.10330,0 +,db0gb,,48.83331,9.38320,0 +,db0ge,,49.34066,7.01574,0 +,db0gel,,50.20923,9.21035,0 +,db0gg,,48.74697,9.10384,0 +,db0gh,,48.82069,9.38191,0 +,db0ghb,,53.80709,12.17776,0 +,db0ghh,,50.75443,7.04391,0 +,db0gie,,50.44111,6.42529,0 +,db0gis,,50.65081,8.58034,0 +,db0gk,,49.01079,9.03016,0 +,db0gkm,,48.42482,9.15083,0 +,db0gkn,,49.17561,9.20733,0 +,db0goe,,51.58305,9.95601,0 +,db0gor,,51.10364,6.71904,0 +,db0gos,,51.40930,6.99000,167 +,db0gps,,51.85533,9.32424,0 +,db0grz,,51.12943,14.93268,0 +,db0gsh,,51.90716,10.40616,0 +,db0gv,,50.13092,8.86095,0 +,db0gvn,,-70.67082,-8.27716,0 +,db0gw-2,,51.42769,6.80095,0 +,db0gw,,51.42919,6.78459,0 +,db0gwd,,54.08116,13.40516,0 +,db0gz,,51.96500,9.78583,0 +,db0gzl,,48.44504,10.24339,0 +,db0gzo,,48.37795,10.27506,0 +,db0gzx,,51.97477,9.84029,0 +,db0haa,,51.36458,7.50795,0 +,db0hal,,51.59666,11.96972,0 +,db0ham,,51.30773,7.42793,0 +,db0han,,51.17893,6.99551,0 +,db0has,,50.01366,10.59100,0 +,db0hat,,51.67929,7.78299,0 +,db0hb,,53.61894,9.98182,0 +,db0hbg,,49.06600,10.53611,654 +,db0hbz,,49.21282,12.02797,0 +,db0hcc,,53.73936,9.19692,0 +,db0hdf,,50.90999,11.85400,0 +,db0hem,,52.24040,11.00938,0 +,db0her,,48.57550,8.75420,0 +,db0hew,,53.40968,10.40897,0 +,db0hex,,51.80044,10.61560,0 +,db0hfd,,52.14527,8.72195,160 +,db0hft,,53.07239,8.79340,0 +,db0hg,,48.61362,8.20334,0 +,db0hgw,,54.09527,13.37694,0 +,db0hha,,53.59044,10.03461,0 +,db0hhb,,49.23468,12.93318,0 +,db0hhg,,51.52883,9.85550,0 +,db0hhn,,53.78753,10.06766,0 +,db0hho,,53.64785,10.27589,0 +,db0hir,,50.53799,13.18300,0 +,db0hk,,50.51113,9.22737,0 +,db0hkn,,47.88430,11.69889,0 +,db0hlb,,49.06839,10.52830,0 +,db0hm,,48.87858,8.71852,0 +,db0hmk,,52.09511,9.33861,0 +,db0hml,,52.12051,9.36018,0 +,db0hob,,47.74805,12.25000,1520 +,db0hol,,51.94273,9.40275,306 +,db0hor,,48.57773,8.23278,1034 +,db0hot,,50.82400,12.63700,0 +,db0hpa,,53.88665,9.56897,0 +,db0hr,,50.13476,8.67732,0 +,db0hrb,,50.95135,8.53219,0 +,db0hrc,,51.26000,12.06000,0 +,db0hrf,,50.23208,8.45856,0 +,db0hrh,,47.60207,8.35396,0 +,db0hrm,,51.20780,9.84664,0 +,db0hro,,54.13949,12.04699,0 +,db0hrr,,50.79726,9.46138,0 +,db0hrw,,49.65777,9.06861,0 +,db0hsb,,51.79971,10.61815,0 +,db0hsk,,51.38836,8.28595,0 +,db0hsn,,51.31663,6.57018,0 +,db0hsr,,48.99881,12.09309,376 +,db0hst,,54.33881,13.07420,0 +,db0htv,,50.13540,8.65460,0 +,db0hup-101,,48.56697,13.45139,0 +,db0hup,,48.56570,13.45020,0 +,db0hus,,54.48767,9.04883,0 +,db0huv,,54.49332,9.07926,0 +,db0huw,,54.50831,9.18688,0 +,db0hvf,,52.40866,10.71800,91 +,db0hw,,51.80153,10.53228,0 +,db0hwr,,49.56261,6.78398,0 +,db0hx,,51.76517,9.37016,0 +,db0hyt,,52.23527,9.40733,0 +,db0hzl,,53.69109,10.80469,0 +,db0idn,,50.21661,8.25547,0 +,db0ids,,50.22027,8.24823,0 +,db0if,,54.49513,11.19897,0 +,db0ii,,51.20800,6.40550,79 +,db0ika,,51.31082,7.25344,0 +,db0il,,54.30949,10.16988,0 +,db0in,,48.76752,11.42478,0 +,db0inn,,47.82243,12.77087,1285 +,db0ins,,50.85106,10.46757,0 +,db0io,,49.72981,8.68439,0 +,db0ir,,54.73382,9.34016,0 +,db0is,,51.39477,7.72229,0 +,db0isa,,48.55960,9.43386,0 +,db0isp,,48.92099,8.68868,0 +,db0isw,,47.73511,11.49739,1201 +,db0itv,,48.54309,11.43126,0 +,db0iuk,,49.64715,8.62721,0 +,db0iuz,,51.42763,7.19376,0 +,db0jgk,,49.91001,12.05308,0 +,db0jk,,50.94707,6.93187,0 +,db0jr,,49.86417,9.07516,0 +,db0jw,,50.43107,6.37881,0 +,db0kb,,51.85536,9.32523,0 +,db0kbd,,48.94309,8.49507,0 +,db0kh,,50.91293,9.41814,0 +,db0khh,,50.91555,9.42072,0 +,db0kib,,54.32875,10.13906,0 +,db0kil,,54.30061,10.11836,0 +,db0kit,,49.01232,8.41307,118 +,db0kk-2,,52.42058,13.47928,0 +,db0kk,,52.52762,13.47983,0 +,db0kl,,49.42420,7.75450,0 +,db0kli,,48.10713,8.75602,0 +,db0kn,,48.94892,12.85022,842 +,db0kna,,50.99250,6.66799,0 +,db0ko,,50.86149,6.83600,0 +,db0koe,,50.93420,6.95350,57 +,db0kpg,,50.87290,7.09770,0 +,db0kra,,51.77080,6.04169,0 +,db0kt,,50.48775,9.27493,0 +,db0ktb,,51.85523,9.32413,10 +,db0ktn,,50.14864,11.04348,0 +,db0ku,,51.20116,8.10800,0 +,db0kue,,54.12799,11.69833,0 +,db0kun,,49.30415,9.66531,0 +,db0kv,,51.78871,6.11536,0 +,db0kwd,,51.46500,11.99916,0 +,db0kwe,,50.83782,6.32400,0 +,db0kx,,51.28239,6.34734,45 +,db0kyf,,51.41205,11.07617,0 +,db0lab,,48.80773,8.62428,0 +,db0lam,,52.14443,10.00755,0 +,db0lar,,54.91146,8.32306,0 +,db0lau,,50.84903,14.64674,0 +,db0lb,,48.88462,9.17651,0 +,db0lbg,,48.77059,9.29627,0 +,db0lbh,,51.24567,12.81345,0 +,db0lbx,,48.88283,9.18933,0 +,db0lby,,49.08308,9.39993,0 +,db0lc,,47.57319,9.83730,0 +,db0ldk,,50.53819,8.52945,0 +,db0lds,,52.31608,13.61982,0 +,db0lel,,48.69371,9.11765,0 +,db0len,,51.10666,8.06999,0 +,db0ler,,53.26400,7.43633,2 +,db0lev,,51.03857,7.06790,0 +,db0lhm,,51.96389,9.35249,0 +,db0lhr,,48.34844,7.86380,255 +,db0lic,,50.15901,11.04578,0 +,db0lj,,50.38819,7.34100,149 +,db0lm,,50.34373,8.09066,0 +,db0ln,,51.77149,7.43969,0 +,db0loe,,51.01018,14.65628,0 +,db0los,,52.32136,14.03769,151 +,db0lp,,49.16045,11.72061,552 +,db0lpz,,51.34000,12.42000,0 +,db0lr,,51.17941,8.48905,0 +,db0ls,,51.52778,13.83138,0 +,db0lt,,51.99023,6.89137,0 +,db0luc,,51.78911,13.63894,116 +,db0lud,,52.31579,13.27504,0 +,db0luh,,52.37849,9.72432,0 +,db0lx,,48.89854,9.17908,0 +,db0ly,,53.22833,13.26300,0 +,db0mak,,50.00020,12.13939,0 +,db0mar,,54.00587,10.77077,0 +,db0max,,52.28616,8.45839,0 +,db0mbg,,47.97540,12.78050,494 +,db0mdw,,53.80204,10.43789,0 +,db0mdx,,50.81166,8.81055,0 +,db0meh,,52.31505,10.09152,0 +,db0mfi,,48.95602,10.62254,0 +,db0mfv,,48.96292,10.59274,0 +,db0mg,,51.20800,6.40550,0 +,db0mgh,,49.51086,9.79193,0 +,db0mgl,,47.76853,7.63880,0 +,db0mgn,,50.57716,10.42583,0 +,db0mhb,,49.24391,12.07171,500 +,db0mi,,49.78427,9.29024,0 +,db0min,,52.24183,8.93651,0 +,db0mio,,50.16493,11.11052,0 +,db0mir,,48.08163,11.17070,615 +,db0mlu,,51.48000,11.96999,0 +,db0mm,,47.71310,10.31098,0 +,db0mo,,51.46981,6.65076,0 +,db0moe,,48.59672,8.07330,179 +,db0mon,,50.54225,6.25557,0 +,db0mot,,50.22185,8.44643,0 +,db0mpq,,48.81727,10.51957,468 +,db0mr,,50.33566,7.56949,0 +,db0mrt,,50.15883,7.60183,0 +,db0msc,,51.99492,7.55763,0 +,db0msp,,53.36365,13.06251,0 +,db0mtv,,51.23160,7.14286,0 +,db0mtz,,48.53785,9.28948,0 +,db0mu,,51.95981,7.36483,0 +,db0muc,,48.15358,11.56060,0 +,db0mue,,51.41799,6.88533,0 +,db0mvp,,53.63474,11.39260,0 +,db0mw,,50.83833,9.76722,0 +,db0myk,,50.39683,7.20499,571 +,db0nai,,50.35837,11.58820,0 +,db0nau,,52.61229,12.87916,0 +,db0nbb,,53.57463,13.27332,0 +,db0ndf,,50.19539,8.79618,0 +,db0ndk,,50.80419,7.04098,0 +,db0nds,,53.06694,10.89861,0 +,db0ner,,52.46300,9.60309,48 +,db0nes,,50.27639,10.23499,379 +,db0ngu,,52.49030,6.86510,0 +,db0nhm,,51.69305,10.01472,0 +,db0nis,,50.65830,6.39686,0 +,db0nks,,48.18798,7.71246,171 +,db0nlh,,52.11519,8.28131,0 +,db0nms,,54.10580,9.99779,0 +,db0nn,,52.98250,9.28555,0 +,db0noe,,48.81487,10.51579,0 +,db0nor,,50.80972,6.65444,0 +,db0nos,,51.92444,8.66277,156 +,db0np,,49.21445,8.87718,0 +,db0nq,,50.37831,9.56144,0 +,db0ntv,,48.82963,11.73650,406 +,db0nu,,50.17546,10.73990,0 +,db0nx,,51.30952,7.61690,0 +,db0ny,,51.06440,7.61050,0 +,db0nzz,,48.53977,9.08891,0 +,db0oah,,51.71818,10.26070,0 +,db0oal,,47.55965,10.77914,0 +,db0obo,,52.16433,9.43682,0 +,db0obs,,52.50543,13.30152,0 +,db0obz,,53.01799,9.87192,0 +,db0ode,,49.33115,9.08283,0 +,db0odw,,49.57583,8.98305,0 +,db0ofg,,48.61444,8.20365,0 +,db0ofi,,48.70978,9.30801,0 +,db0oha,,51.66616,10.34333,0 +,db0ohl,,51.60419,7.01483,0 +,db0ohr,,49.18833,9.51942,0 +,db0oi,,52.27291,10.52512,0 +,db0ol,,53.14205,8.24187,0 +,db0or,,51.73428,10.22491,0 +,db0ort,,48.55772,8.10349,525 +,db0osn,,52.28381,8.02527,78 +,db0ov,,53.47695,8.47093,0 +,db0ovl,,48.52236,12.17174,0 +,db0ovm,,51.95040,7.66604,0 +,db0ovn,,51.16339,6.73950,42 +,db0ovp,,54.12078,13.54890,0 +,db0owl,,51.95731,8.66365,0 +,db0ox,,53.59222,7.19138,0 +,db0oz,,53.09580,8.79179,0 +,db0pak,,52.41392,9.79364,0 +,db0pas,,48.58465,13.55579,0 +,db0pbs,,51.70912,8.76872,0 +,db0pc,,54.21740,10.73126,0 +,db0pdf,,52.93548,8.22933,47 +,db0per,,53.07406,11.85066,0 +,db0pi,,53.75033,9.65205,0 +,db0pib,,51.10892,14.35330,0 +,db0pln,,54.16279,10.42346,0 +,db0pm,,47.75469,11.85278,895 +,db0pme,,47.75313,11.77916,862 +,db0pob,,48.65925,11.38302,0 +,db0poc,,51.62649,7.19516,0 +,db0pq,,50.93592,6.37494,0 +,db0pr,,53.97962,9.84970,0 +,db0pra,,50.81610,6.21694,0 +,db0prz,,53.02696,13.90199,0 +,db0psw,,53.51149,13.98291,0 +,db0puc,,48.16962,11.35172,521 +,db0px,,50.13999,8.56318,0 +,db0qp,,48.31456,12.65761,478 +,db0qx,,51.69366,11.05533,0 +,db0ram,,49.60162,8.47953,97 +,db0rbb,,48.69102,9.01303,0 +,db0rbr,,48.78783,8.91652,0 +,db0rbs,,48.88277,9.08527,0 +,db0rdh,,48.94866,12.85161,0 +,db0rdt,,48.83249,11.29282,0 +,db0rec,,51.62649,7.19517,0 +,db0reg,,48.96966,13.15094,0 +,db0rei,,50.62368,8.90158,0 +,db0rem,,48.82013,9.27289,0 +,db0ren,,50.44768,11.45275,0 +,db0res,,51.75766,6.39459,21 +,db0reu,,48.50563,9.19699,0 +,db0rh,,52.85221,9.90776,0 +,db0rhb,,50.57716,6.94666,0 +,db0rig,,48.69036,9.83108,0 +,db0rkb,,50.37006,9.97998,0 +,db0rkd,,51.11837,6.77811,0 +,db0rkn,,51.03936,6.61243,0 +,db0rmk,,48.89093,9.45401,0 +,db0rmm,,48.11240,11.32517,0 +,db0rmv,,54.16027,12.56605,0 +,db0rng,,53.01528,9.67020,0 +,db0rod,,52.29603,9.40349,330 +,db0rom,,50.10247,11.03263,0 +,db0ros,,47.80221,12.22910,0 +,db0row,,53.13114,9.35286,0 +,db0rp,,48.98812,12.09170,0 +,db0rpl,,50.42417,7.73222,559 +,db0rq,,49.93709,12.12193,0 +,db0rt,,48.49114,9.23958,0 +,db0rta,,48.11059,11.32420,0 +,db0rtn,,53.10867,9.39652,0 +,db0rtp,,48.49305,9.20278,0 +,db0rtv,,52.27500,7.41366,0 +,db0rug,,54.41847,13.43292,0 +,db0rv,,47.81042,9.58843,0 +,db0rvb,,51.62133,10.52682,0 +,db0rwt,,51.07183,8.19700,0 +,db0rz,,48.16156,9.55456,0 +,db0saa,,48.79209,10.08658,0 +,db0sac,,47.58242,7.96041,0 +,db0saq,,49.03888,9.04645,0 +,db0sat,,53.50233,9.97049,0 +,db0sau,,48.75350,9.33812,0 +,db0saw,,52.85161,11.13063,0 +,db0sax,,51.30394,13.00968,0 +,db0sb,,50.66519,7.21013,0 +,db0sbg,,48.77486,9.95738,0 +,db0sbw,,48.93131,9.22181,0 +,db0sbx,,50.80699,12.69400,0 +,db0sd,,49.73183,7.33833,0 +,db0sda,,50.77622,6.06936,0 +,db0sdo,,48.80918,9.57657,0 +,db0sdx,,48.97325,9.07477,0 +,db0se,,50.47800,6.52297,0 +,db0seh,,52.31119,9.95403,0 +,db0sel,,48.88151,8.72690,0 +,db0sfa,,52.90565,9.74133,0 +,db0sg,,50.68196,7.24857,0 +,db0sha,,52.38000,9.74360,0 +,db0shg,,52.17138,9.38333,440 +,db0shn,,49.09525,9.20171,0 +,db0sif,,50.58471,8.67673,0 +,db0skf,,48.43659,8.38908,0 +,db0sky,,51.30093,7.45007,0 +,db0sl,,48.87522,13.02342,805 +,db0sle,,50.47852,6.52441,0 +,db0slf,,50.61899,11.34000,0 +,db0slk,,51.97127,11.66447,0 +,db0sm,,52.74722,7.38083,0 +,db0smg,,51.52805,9.94027,0 +,db0sn,,51.47386,9.76587,0 +,db0son,,50.38233,11.18100,0 +,db0sp,,52.41809,13.12732,0 +,db0spb,,50.96054,14.69074,0 +,db0spn,,51.72195,14.34466,0 +,db0sr,,49.33550,7.00872,0 +,db0sre,,51.62461,7.16985,0 +,db0ss,,49.15976,9.23617,0 +,db0st,,48.74742,9.16553,0 +,db0stb-2,,49.06652,9.40342,0 +,db0stb-4,,49.06895,9.40744,0 +,db0std,,49.21906,12.03939,371 +,db0ste,,53.69921,9.14015,0 +,db0sue,,54.66197,9.56193,0 +,db0sun,,52.24666,9.50888,0 +,db0sw,,53.41473,7.72802,0 +,db0swn,,53.59263,11.45695,0 +,db0swr,,49.68732,9.46936,0 +,db0sy,,53.49968,10.19043,0 +,db0sys,,51.11574,6.79373,44 +,db0sz,,52.13729,10.28522,0 +,db0szb,,50.52104,12.75360,0 +,db0tan,,50.49855,9.93771,0 +,db0taw,,50.55815,10.08074,664 +,db0tb,,52.01468,8.47356,0 +,db0tc,,48.43406,11.81928,0 +,db0tdr,,53.95533,11.81033,0 +,db0ten,,52.90210,9.66757,0 +,db0teu,,52.18119,8.03689,74 +,db0tfk,,49.59843,6.82424,0 +,db0tfl,,52.04371,13.49436,0 +,db0tfm,,48.75729,8.40777,0 +,db0tgm,,52.54124,11.96861,0 +,db0tha,,50.67758,10.79255,0 +,db0thf,,50.50434,11.13836,0 +,db0thm,,49.07737,11.17542,0 +,db0ths,,52.02767,10.37290,0 +,db0tit,,47.94750,8.23333,1023 +,db0tk,,49.04017,12.16294,0 +,db0tm,,51.31425,9.34591,0 +,db0tmh,,49.34555,11.56246,639 +,db0tmm,,52.13328,11.64259,0 +,db0tn,,48.33869,8.15399,952 +,db0tnc,,53.57864,7.76388,0 +,db0tod,,47.76613,7.99141,0 +,db0tos,,53.54640,8.23786,0 +,db0ts,,49.54177,12.40097,0 +,db0tst,,48.69696,9.11927,0 +,db0ttb,,47.80084,11.01456,0 +,db0ttm,,49.40577,9.82782,0 +,db0tu,,52.51221,13.32739,0 +,db0tud,,51.02000,13.72999,0 +,db0tuv,,50.92400,6.99233,0 +,db0tv,,51.31219,7.38708,347 +,db0tva,,51.84905,6.24143,0 +,db0tvh,,52.38000,9.74360,0 +,db0tvi,,50.85131,10.46575,0 +,db0tvm,,48.17467,11.55372,511 +,db0tvp,,48.57902,13.46732,0 +,db0ual,,47.94972,10.44277,0 +,db0uc,,50.26509,10.99554,0 +,db0ue,,50.60413,9.67748,0 +,db0uep,,50.93031,6.07533,0 +,db0uhc,,51.05941,6.60719,0 +,db0uhf,,48.93145,9.63642,573 +,db0uhi,,52.30822,9.81358,64 +,db0uka,,49.01304,8.41119,0 +,db0ukw,,49.53174,8.66173,136 +,db0up,,48.90447,8.71918,0 +,db0usk,,54.03033,10.66250,0 +,db0usl,,51.65277,9.58416,0 +,db0ut,,49.74960,7.11861,0 +,db0ux,,48.97045,8.46795,0 +,db0va,,50.10914,8.13354,0 +,db0vc,,54.20948,10.72403,0 +,db0ve,,50.18808,8.86414,0 +,db0vel,,51.33600,7.05473,0 +,db0ver,,52.99836,9.27037,0 +,db0vi,,49.45520,7.08854,0 +,db0vkl,,49.26592,6.85261,0 +,db0vl,,52.52055,7.50416,0 +,db0vox,,49.42597,11.03913,318 +,db0vp,,49.17035,7.61405,0 +,db0vr,,51.14999,7.75000,0 +,db0vt,,49.88050,10.86894,0 +,db0vv,,49.66796,7.32791,0 +,db0vvs,,50.68196,7.24857,0 +,db0vw,,52.39069,10.74794,0 +,db0wa,,50.74517,6.04433,333 +,db0wai,,48.11527,11.55749,521 +,db0wal,,51.61770,7.41636,0 +,db0war,,51.47983,9.15098,0 +,db0wb,,48.17785,12.31919,575 +,db0wbd,,47.82466,8.34200,890 +,db0wbg,,51.88054,12.58100,0 +,db0wd,,52.26527,9.52250,0 +,db0wes,,51.65842,6.62272,0 +,db0wet,,51.35988,7.36267,0 +,db0wgs,,48.60166,13.77924,758 +,db0wgt,,53.66415,9.05126,0 +,db0whm,,49.57311,8.62158,98 +,db0whv,,53.58156,8.13088,0 +,db0wi,,51.12183,6.20149,0 +,db0wil,,49.99004,7.07754,0 +,db0wl,,53.36935,10.19427,0 +,db0wlg,,54.05563,13.75710,0 +,db0wm,,51.96289,7.62861,0 +,db0wml,,51.83774,7.02621,0 +,db0wn,,48.57460,9.50918,0 +,db0wo,,53.23681,7.46717,6 +,db0wof,,51.68199,12.27632,0 +,db0wos,,48.79219,13.53711,0 +,db0wrn,,53.51049,12.69180,0 +,db0ws,,48.80130,9.41984,0 +,db0wth,,49.40794,9.82435,0 +,db0wtl,,49.09022,9.40659,0 +,db0wtv,,53.51580,8.14513,0 +,db0wub,,48.87422,8.80619,0 +,db0wur,,51.75650,10.61933,0 +,db0wv,,47.82277,9.40138,890 +,db0www,,48.57939,8.87674,0 +,db0xf,,48.51849,11.65083,0 +,db0xh,,53.56607,9.78751,0 +,db0xhi,,48.52500,9.22399,0 +,db0xia,,54.38116,10.21166,0 +,db0xj,,53.59558,9.44318,0 +,db0xl,,53.88222,10.66027,0 +,db0xn,,54.64392,8.94421,0 +,db0xq,,48.89973,8.62814,0 +,db0xr,,47.65959,7.95570,0 +,db0xw,,53.56687,7.72204,0 +,db0xx,,52.23995,11.01001,0 +,db0xxl,,52.23249,9.00916,0 +,db0xy,,51.85656,10.35769,0 +,db0xyz,,51.12262,6.85119,0 +,db0ye,,47.77783,7.70144,0 +,db0yi,,52.06193,9.96089,0 +,db0yj,,51.52659,9.96975,0 +,db0yq,,49.67941,12.23541,0 +,db0ys,,50.99007,8.00390,0 +,db0yy,,48.89830,9.17700,0 +,db0yz,,51.70735,9.75462,0 +,db0za,,54.41708,9.69151,0 +,db0zav,,50.21302,8.78831,0 +,db0zb,,50.05172,11.85327,0 +,db0zd,,47.53676,10.21614,0 +,db0zdf,,49.96286,8.20567,0 +,db0ze,,53.51919,10.10280,0 +,db0zeh,,52.95613,13.26513,88 +,db0zf,,48.08089,7.66907,0 +,db0zfm,,51.96186,7.64547,62 +,db0zh,,49.40280,8.73056,0 +,db0zk,,50.30902,7.56939,0 +,db0zka,,48.33798,10.90059,496 +,db0zm,,48.18408,11.61124,500 +,db0zo,,52.17785,8.04421,0 +,db0zp,,52.56690,9.32365,0 +,db0zrb,,48.78615,9.06367,0 +,db0zs,,52.21806,13.46841,0 +,db0zu,,47.42084,10.98470,2962 +,db0zv,,51.37742,7.49475,0 +,db0zw,,49.78750,12.07917,0 +,db0zwi,,50.74600,12.44999,0 +,db1an,,51.64334,6.31560,0 +,db1hef,,47.68941,11.76771,0 +,db5yy,,51.59331,7.24143,0 +,db6jg-1,,54.24225,12.75067,0 +,db6jg,,51.65783,6.18143,0 +,dc0ec,,51.19768,7.18468,0 +,dc0ll,,53.97127,8.96698,0 +,dc0sbk,,51.45336,6.70255,0 +,dc1ld,,54.78822,9.45190,0 +,dc1mil,,48.14870,11.57456,0 +,dc1nf-101,,50.13694,11.01249,0 +,dc1rd,,48.70256,12.96960,0 +,dc2ve,,49.25431,6.91004,0 +,dc3xl,,53.94026,10.65361,0 +,dc4re,,48.63615,13.15383,0 +,dc6ap,,53.75365,9.71266,0 +,dd2mic,,52.88680,10.70399,0 +,dd5ki,,47.87508,11.70306,0 +,df0ann,,49.46719,11.31157,612 +,df0as,,49.52395,11.73958,0 +,df0ec,,49.57445,11.16395,0 +,df0hhh,,53.39663,9.86546,0 +,df0hsa,,48.35483,10.90474,0 +,df0leo,,48.82172,8.92198,0 +,df0mhr,,51.43983,6.84000,0 +,df0mu,,52.10663,7.25681,0 +,df0pw,,49.72645,11.53076,0 +,df1gt,,48.04161,8.16979,0 +,df2be,,54.71483,9.30661,0 +,df2er,,51.34416,6.98199,0 +,df3djs,,48.21277,11.45138,0 +,df3ei,,51.27121,7.24412,0 +,df4dr,,51.51767,7.51774,0 +,df4eu,,53.95454,9.49449,0 +,df4jh,,48.65782,12.36600,0 +,df4qc,,48.15254,11.34310,0 +,df6dp,,51.35130,7.47177,0 +,dg1fdv,,50.22494,8.05908,0 +,dg2maj,,48.36544,10.28800,0 +,dg2ram,,49.38086,12.70046,0 +,dg3rap,,49.03899,12.15510,0 +,dg4ez,,51.48019,6.95433,0 +,dg4mfn,,48.87482,10.54056,0 +,dg5laz,,53.97086,8.94888,0 +,dg5mex,,48.90256,10.65297,0 +,dg5yim-101,,52.90954,9.30601,0 +,dg5yim,,53.35763,8.52305,0 +,dg6rch,,48.65335,12.61023,0 +,dg7dcg,,51.35603,7.26310,0 +,dg7jg,,51.65333,6.63366,0 +,dg7pm,,47.77801,12.11176,0 +,dg7rz-101,,49.40403,11.76585,528 +,dg8las,,50.16616,8.54506,0 +,dg8rbj,,48.68259,12.76362,0 +,dh1nfj,,50.48723,11.38360,0 +,dh3pb,,49.19198,8.06636,0 +,dh4faj-4,,49.90307,9.42914,0 +,dh4faj,,49.98332,8.40442,0 +,dh4hav,,53.64702,10.03626,0 +,dh5rae,,48.90025,13.33199,0 +,dh8mo,,48.17633,11.50619,0 +,dh9fax,,50.33423,8.48122,0 +,dh9yx,,48.50807,13.17910,0 +,dj0abr,,48.82236,13.12919,0 +,dj5hn,,54.26427,10.07136,0 +,dj7wl,,53.70199,10.25216,0 +,dj8aw,,52.32777,10.54765,0 +,dk0bln,,52.46092,13.54969,35 +,dk0cl,,49.71051,10.80959,0 +,dk0ee,,48.29295,11.62035,0 +,dk0fl,,54.80548,9.48419,0 +,dk0fri,,53.53784,7.92534,0 +,dk0il,,48.31660,10.10096,0 +,dk0mav,,52.31087,10.21267,65 +,dk0mw,,50.98000,12.96999,0 +,dk0pa,,51.45004,6.63060,0 +,dk0pu,,51.56521,6.74484,0 +,dk0re,,51.80703,8.19773,0 +,dk0wcy,,54.66844,9.82341,0 +,dk0ya,,51.54829,7.90979,0 +,dk1uu,,51.48234,7.59338,0 +,dk7lj,,54.26305,10.18177,0 +,dk9we,,54.65149,9.37633,0 +,dl0ao,,49.43013,11.79425,445 +,dl0ats,,52.41355,9.45555,0 +,dl0cre,,51.62947,7.25917,0 +,dl0dg,,51.46200,6.79066,0 +,dl0dpm,,50.10422,8.67607,0 +,dl0eb,,48.81966,9.16183,0 +,dl0ef,,50.56943,6.72210,0 +,dl0fhh,,53.54510,10.00172,0 +,dl0igi,,47.80111,11.02450,935 +,dl0ii,,51.25316,6.97483,0 +,dl0ims,,51.48333,6.53777,0 +,dl0ism,,48.22065,11.66626,0 +,dl0kd,,51.42690,6.47308,0 +,dl0lfh,,50.55012,8.76337,0 +,dl0m-10,,51.44836,6.66989,0 +,dl0ml,,48.84537,9.32223,0 +,dl0nd,,52.28594,8.01685,0 +,dl0ptb,,52.29647,10.46416,79 +,dl0rn,,51.40587,6.70783,0 +,dl0ros,,47.86866,12.09666,451 +,dl0ru,,51.42175,6.84075,0 +,dl0rus,,48.12791,11.61346,0 +,dl0rw,,49.54045,12.40328,0 +,dl0sg,,48.95545,12.61337,0 +,dl0vx,,52.27888,7.82203,0 +,dl0wt,,51.66416,6.64066,0 +,dl0xd,,51.15653,6.70643,0 +,dl0xr,,51.24479,7.14939,0 +,dl1afu,,50.71169,7.05047,0 +,dl1bak,,53.95537,9.50024,0 +,dl1com,,48.10876,11.53732,0 +,dl1fac,,54.12942,10.62530,0 +,dl1hrc,,51.50000,11.96000,0 +,dl1jad,,51.11935,13.67222,0 +,dl1jm-2,,53.95106,9.72816,0 +,dl1jm,,53.64614,10.02339,0 +,dl1kgw,,51.23133,7.07770,0 +,dl1mab,,48.66631,13.07813,0 +,dl1mwg,,47.98937,11.86652,0 +,dl1naf,,50.09283,10.97796,0 +,dl1nux-2,,50.25311,10.98467,0 +,dl1nux,,50.23436,10.98371,0 +,dl1rhs,,47.85406,12.18250,0 +,dl1zap,,48.10719,11.32378,0 +,dl2ajb-101,,50.99282,10.59016,0 +,dl2sb,,51.28331,7.14465,0 +,dl3ah,,50.92239,9.23880,0 +,dl3dcl,,51.40584,7.44194,0 +,dl3ncu,,48.30118,11.91441,0 +,dl3rcg-2,,48.54389,12.11498,0 +,dl3rcg,,48.54565,12.20431,0 +,dl4ste-101,,48.62821,12.24158,0 +,dl4ste,,48.60961,12.27690,0 +,dl5bca,,53.33198,8.45996,0 +,dl5daa,,51.43461,7.18378,0 +,dl5kua,,53.63519,10.38668,0 +,dl5la,,54.74377,9.64347,0 +,dl5rdw,,48.96071,12.07933,0 +,dl5sfi,,48.79082,9.01370,0 +,dl6eo,,51.42669,6.97235,0 +,dl6mfy,,48.14637,11.66341,0 +,dl7ate,,48.44754,12.50355,0 +,dl7ho,,51.66339,6.65881,0 +,dl7jp,,48.58450,13.45909,0 +,dl8dav,,51.52154,6.94423,0 +,dl8hav,,53.62761,9.83548,0 +,dl8mew,,47.83839,12.12366,0 +,dl8mfu-101,,48.36267,11.46210,0 +,dl8mfu,,49.29479,12.97218,0 +,dl8rdl,,48.52410,12.13747,0 +,dl9dak,,53.59949,9.96245,0 +,dl9hm,,50.64166,7.82944,0 +,dl9lbg,,54.29614,10.59483,0 +,dl9rc,,48.45211,13.19268,0 +,dl9sk,,49.04233,9.19801,0 +,dm0aab,,54.31076,10.54785,0 +,dm0ai,,48.67634,8.85074,0 +,dm0avh,,50.70199,10.44966,0 +,dm0ax,,49.32393,11.38173,0 +,dm0b,,48.85623,8.17200,0 +,dm0bgh,,48.17705,12.83788,0 +,dm0bit,,47.67972,9.18055,0 +,dm0ess,,47.51199,10.28032,0 +,dm0et,,49.81673,10.87222,0 +,dm0ffl,,48.56822,12.10758,0 +,dm0fl,,54.79184,9.50339,0 +,dm0fox,,48.65153,11.45078,0 +,dm0gap,,47.50910,11.14297,1752 +,dm0ha,,51.36098,7.44712,0 +,dm0hat,,54.15513,10.95084,0 +,dm0hhw,,53.57550,10.08236,0 +,dm0hmb,,53.55713,10.02304,0 +,dm0hrm,,49.98549,8.42368,0 +,dm0hw,,53.98918,9.56983,0 +,dm0lue,,53.82102,10.82903,0 +,dm0max,,52.29054,8.70188,0 +,dm0pr,,54.33255,8.78903,0 +,dm0ram,,53.35267,10.03198,0 +,dm0rdt,,48.68239,11.44660,0 +,dm0sax,,51.10362,12.95969,0 +,dm0sl,,54.52782,9.52906,0 +,dm0svx,,51.49139,11.95583,0 +,dm0sz,,52.12150,10.28824,0 +,dm0tmh,,49.35988,11.56307,0 +,dm0tud,,51.11468,13.74648,0 +,dm0ub,,52.42206,12.88176,0 +,dm0uhf,,51.09999,6.23899,0 +,dm0ulm,,48.43166,10.01777,0 +,dm0wit,,49.53403,9.85656,0 +,dm0wl,,53.35591,10.20784,0 +,dm0ww,,47.64472,11.05500,0 +,dm0za,,51.46889,7.48500,0 +,dm0zba,,49.69906,8.61107,0 +,dm0zf,,48.64319,8.13342,245 +,dm0zgw,,51.26417,7.11950,0 +,dm0zhs,,48.20543,12.05148,0 +,dm0zog,,48.45716,7.94208,156 +,dm4dl,,53.62889,9.90034,0 +,dm5hr,,48.25416,12.85605,0 +,do0dxe,,51.31693,9.48856,0 +,do0erk,,51.20226,7.03583,0 +,do0fr,,53.61599,9.67120,0 +,do0fwh,,52.25694,12.01782,0 +,do0gg,,49.91266,8.47866,0 +,do0jna,,50.89764,11.58508,0 +,do0mal,,53.77716,12.72100,0 +,do0oho,,54.36449,10.97782,0 +,do0smg,,54.55319,13.59396,0 +,do0soc,,54.33329,10.86670,0 +,do0sre,,51.61977,7.17520,0 +,do0tpb,,53.41432,10.58808,0 +,do0yak,,53.85630,13.68900,0 +,do1pk,,51.32014,7.05737,0 +,do1pps,,48.88579,8.54229,0 +,do1tjg,,48.93632,8.86838,0 +,do2fh,,48.36138,11.44416,0 +,do2jsa,,53.89961,9.46764,0 +,do3dhn,,51.34889,7.03808,0 +,do4bz,,52.43918,9.60562,0 +,do5ds,,51.69444,7.74305,0 +,do7hs,,48.60105,12.25294,0 +,do8ng,,54.75008,8.96888,0 +,do8ra,,47.79209,12.10295,0 +,dp6t,,50.28837,9.26701,0 +,ea1iof,,43.45555,-8.15548,0 +,ea2rcf,,42.85060,-2.68989,0 +,ea3dkp-2,,42.42093,2.74924,0 +,ea3dkp,,42.27274,3.16483,0 +,ea3hsp,,41.37489,1.81563,0 +,ea4gmz,,40.46909,-3.68610,0 +,ea4gpz,,40.59586,-3.69924,0 +,ea5fsj,,38.43010,-0.53424,0 +,ea5hjx,,39.47943,-0.34455,0 +,ea5idn,,37.97100,-1.20300,0 +,ea5ijj,,38.98733,-1.85683,0 +,ea8aqi,,28.00164,-15.39531,0 +,eb5jeq,,38.23534,-0.73213,0 +,ed1zaj,,42.03816,-7.35106,0 +,ed2zae,,42.79402,-2.73679,0 +,ed8zab,,27.94900,-15.51399,0 +,f0edr,,48.60932,2.25913,0 +,f0gby,,48.97509,1.91002,0 +,f1ags,,48.78180,2.19800,0 +,f1bdb,,43.68243,7.22359,0 +,f1dwo,,48.61319,1.67834,0 +,f1ebk,,48.94109,2.13264,0 +,f1faq,,48.70285,2.21040,0 +,f1grh,,43.65979,7.13440,0 +,f1jke,,43.58700,6.96899,0 +,f1lqd,,48.85521,1.90006,0 +,f1rfc,,43.72688,7.10457,0 +,f1sca,,48.77365,2.03448,0 +,f1shs,,48.86019,2.34798,0 +,f1tzo,,48.62782,2.28295,0 +,f1tzv,,48.62330,7.69862,0 +,f1zck,,45.39470,4.40189,0 +,f1zcy,,49.37631,1.95130,0 +,f1zdg,,47.98073,7.12564,0 +,f1zet,,48.71649,6.15683,0 +,f1zgk,,48.67449,6.17500,0 +,f1zhl,,49.51567,0.17331,0 +,f1zhm,,49.50581,0.18188,0 +,f1zht,,49.48795,2.34762,0 +,f1zid,,45.34678,4.64669,0 +,f1zoi,,48.88956,2.23628,0 +,f1zpl,,48.88002,2.36196,0 +,f1zpq,,48.89272,2.23657,0 +,f1zvb,,44.17919,5.06033,0 +,f4bit,,48.61133,6.10199,0 +,f4dwb,,48.67766,6.22766,0 +,f4eed,,45.40008,4.35989,0 +,f4exb,,43.58166,7.10738,0 +,f4fgi,,49.28446,2.48524,0 +,f4fsd-1,,49.20989,2.39196,0 +,f4fsd,,49.25653,2.42683,0 +,f4fwh,,49.48606,0.13227,0 +,f4gdl,,48.78203,7.86658,0 +,f4gen,,48.65379,6.10949,0 +,f4gkn,,44.12364,4.83919,0 +,f4gkr,,48.58612,1.81049,0 +,f4glj,,49.02266,2.23750,0 +,f4hbg,,43.69927,7.27794,0 +,f4hgi,,49.65354,-1.65467,0 +,f4hkw,,43.58355,7.10924,0 +,f4hof-100,,48.77492,2.38020,0 +,f4hof-101,,52.33319,4.91966,0 +,f4hof,,45.43185,4.40000,0 +,f5hcc,,49.20966,1.97049,0 +,f5hnk,,48.70683,1.97951,0 +,f5kck,,48.94739,2.16500,0 +,f5kes,,49.02356,2.22738,0 +,f5kia-1,,48.00220,2.74549,0 +,f5kia,,48.00885,2.74336,0 +,f5kmb,,49.50540,2.43368,0 +,f5kpo,,44.00374,4.95893,0 +,f5ktr,,48.88006,2.36191,0 +,f5oci,,48.80076,2.26339,0 +,f5oeo,,46.63008,0.33478,0 +,f5pbg,,48.35333,-4.37666,0 +,f5rvx,,47.86418,-3.88782,0 +,f5sfu-1,,43.72837,7.14968,0 +,f5sfu,,43.73972,7.15177,0 +,f5vmh,,48.73939,1.35229,0 +,f5zap,,48.00923,2.74264,0 +,f5zbr,,45.42993,4.36579,0 +,f5zcq,,49.02808,7.90388,0 +,f5zeq,,48.94039,2.12135,0 +,f5zgi,,43.77046,7.41992,0 +,f5zig,,43.74932,7.14901,0 +,f5zip,,48.68477,2.16909,0 +,f5zmm,,43.69250,6.89873,0 +,f5znx,,48.48831,1.32957,0 +,f5zpu,,43.72616,7.32937,0 +,f5zsm,,48.58442,7.74392,0 +,f5zuk,,48.97864,7.61528,0 +,f5zvb,,48.01256,2.74072,0 +,f6bvp,,48.88461,2.31357,0 +,f6cnb,,48.69226,2.14614,0 +,f6ezi,,48.59114,1.48634,0 +,f6fao-1,,48.71415,2.20660,0 +,f6fao,,48.93324,2.21166,0 +,f6fcd,,48.27791,1.70981,0 +,f6fhv,,48.74011,2.23978,0 +,f6gal,,48.77899,2.33966,0 +,f6hmp,,48.85057,2.30937,0 +,f6hzv-2,,43.61281,7.07757,0 +,f6ini,,48.80761,2.24207,0 +,f6ipg,,47.27360,2.22083,0 +,f6iqf,,48.62675,1.83263,0 +,f6jig,,48.96939,2.19297,0 +,f6kaw,,48.81090,2.39312,0 +,f6kbs,,48.72631,2.16538,0 +,f6kfg,,48.39012,7.26994,0 +,f6kft,,49.12739,6.83165,0 +,f6kfv,,48.80265,2.13601,0 +,f6kfw,,49.64166,-1.65783,0 +,f6kkr,,48.63361,1.82886,0 +,f6koh,,49.50824,0.16247,0 +,f6kqv,,48.57263,7.71143,0 +,f6mpn,,48.70606,2.24886,0 +,f8khq,,48.78575,2.23703,0 +,fr4li,,-21.32805,55.47945,0 +,fr4np,,-20.93750,55.29139,0 +,fr4oa,,-20.88349,55.44780,0 +,fr5fc,,-21.19845,55.29146,0 +,ha2kdr,,47.67613,18.49421,0 +,ha2non-1,,47.64123,18.30258,0 +,ha2non-3,,47.48374,19.07440,0 +,ha2non-4,,47.62508,17.58349,0 +,ha2non-5,,47.64671,18.31214,0 +,ha5kdr,,47.50130,18.97315,0 +,ha6qz,,47.97291,19.77745,0 +,ha7pty,,47.31330,18.90735,0 +,hb9ak-0,,46.90348,7.32685,0 +,hb9ak-14,,46.77073,8.42288,0 +,hb9ak,,47.37089,8.94148,0 +,hb9am-20,,47.42604,8.18819,0 +,hb9am-30,,47.48198,8.39839,0 +,hb9am-40,,47.44643,8.21104,0 +,hb9aw,,47.06700,8.01320,0 +,hb9azt-1,,47.41293,9.58307,0 +,hb9azt-2,,47.37854,9.46659,0 +,hb9azt-3,,47.44915,8.84127,0 +,hb9azt-4,,46.97975,8.20492,0 +,hb9azt-5,,47.74007,8.45474,0 +,hb9ba-1,,47.20183,7.52880,0 +,hb9ba,,47.25246,7.51054,0 +,hb9ca,,47.50873,8.12787,0 +,hb9cc-7,,47.57986,9.15454,0 +,hb9cf-20,,47.04747,8.66430,0 +,hb9cf-30,,47.01789,8.70035,0 +,hb9cf-40,,46.95209,8.57009,0 +,hb9csr,,47.54202,7.60146,0 +,hb9dr-11,,47.20183,7.52880,0 +,hb9dr-20,,47.41551,9.36564,0 +,hb9dr-21,,47.43389,9.39486,0 +,hb9dr-30,,47.22500,8.66167,0 +,hb9dr,,47.16059,8.43959,0 +,hb9eas,,47.45579,7.59306,0 +,hb9eas-7,,47.52805,7.58155,0 +,hb9ebs,,47.44944,7.57750,0 +,hb9ehp,,47.28020,8.45380,0 +,hb9eve,,46.82636,8.65088,0 +,hb9f,,46.64749,7.65333,0 +,hb9f-90,,46.78738,8.04441,0 +,hb9gt,,47.29806,9.02048,0 +,hb9hr,,47.21894,8.32668,0 +,hb9kb,,47.40951,9.04580,0 +,hb9lu-20,,47.04426,8.27339,0 +,hb9lu-30,,47.05217,8.33610,0 +,hb9lu-40,,47.02799,8.21649,0 +,hb9lu-91,,47.06420,8.33820,0 +,hb9lu-92,,47.01449,8.30599,0 +,hb9lu-93,,47.07870,8.35420,0 +,hb9na-80,,47.43231,8.31861,0 +,hb9na-81,,47.41316,8.27429,0 +,hb9na-90,,47.38573,8.26700,0 +,hb9nf,,47.30421,8.88714,0 +,hb9pjt,,47.27991,8.45989,0 +,hb9rf-20,,47.18049,8.42833,0 +,hb9rf-30,,47.02746,8.52216,0 +,hb9rf-40,,47.17825,8.51368,0 +,hb9rf-91,,47.06866,8.46532,0 +,hb9rf-92,,47.06796,8.46810,0 +,hb9rmw,,47.24226,8.46502,0 +,hb9sg,,47.39130,9.45120,0 +,hb9t-1,,46.71046,7.77337,0 +,hb9t,,46.71103,7.77612,0 +,hb9tg,,47.53886,9.00243,0 +,hb9tzu,,46.86523,8.64866,0 +,hb9wad,,47.12456,8.34568,0 +,hb9wad-80,,47.22330,8.46180,0 +,hb9zrh-2,,47.41287,8.53507,0 +,hb9zrh,,47.34957,8.49078,0 +,hg1ma-4,,47.48117,19.06799,0 +,hg1ma-5,,47.45505,19.04021,0 +,hg1pny,,47.58194,17.65833,0 +,hg1rue,,47.58185,17.65849,0 +,hg2ebh-3,,47.66675,17.58349,0 +,hg2ebh-4,,47.68413,17.64562,0 +,hg2ebh,,47.57135,17.87673,0 +,hg2ebh-5,,47.54175,17.58349,0 +,hg2hna,,47.04600,17.65659,0 +,hg2ppa,,47.31753,17.48229,0 +,hg2pvv,,47.42170,17.82743,0 +,hg4hna,,47.25878,18.59623,0 +,hg5hna,,47.54996,19.00149,0 +,hg5hnb,,47.49027,18.98284,0 +,hg5pbp,,47.49273,18.98628,0 +,hg6hna,,47.91630,19.91665,0 +,hg7hna,,47.65364,19.07361,0 +,hg7hnb,,47.31772,18.90219,0 +,hg7hnc,,47.76456,19.15410,0 +,hg8lxl,,46.71222,20.12447,0 +,hg8pka-11,,46.53906,18.99479,0 +,i0ojj,,41.72299,12.99899,234 +,ir3ao,,46.43501,11.86250,3170 +,ir3dv,,46.73908,11.95845,2268 +,ir3eb,,46.61478,10.49207,2754 +,ir3uap,,46.69479,11.73322,0 +,ir3ube,,46.65533,10.59544,1048 +,ir3udz,,46.05616,12.28199,0 +,ir3ufl,,46.80833,10.54083,0 +,ir3ugb,,46.59812,11.72428,2443 +,ir3ugc,,46.98111,11.50888,0 +,ir3ugd,,46.84583,11.30277,0 +,ir3ugm,,46.49323,11.21056,1742 +,ir3uhe,,46.66231,11.12790,775 +,ir3uhf,,46.61499,11.46084,2250 +,ir3uhi,,46.85236,11.68610,2206 +,ir3uia,,46.83610,10.49055,0 +,la4hrr,,58.30349,7.09533,0 +,ld1fr,,59.21533,10.98416,0 +,ld1ot,,59.98484,10.66883,0 +,ld1xg,,59.42306,10.38443,0 +,ld1xi,,59.55039,10.28882,0 +,ld3dv,,59.75597,10.20492,0 +,ld3gl,,59.23440,9.69880,0 +,ld3nm,,59.96478,9.95006,0 +,ld3sm,,59.14179,10.21306,0 +,ld4lk,,58.30349,7.09530,0 +,ld4vf,,59.92333,5.79299,0 +,ld5bg,,60.34016,5.09480,0 +,lx0bgp,,49.58185,6.11579,0 +,lx0drh,,49.84104,5.81170,0 +,lx0drj,,49.71881,6.26378,0 +,lx0duc,,49.86361,6.16023,0 +,lx0e,,49.77716,6.09531,0 +,lx0ist,,49.60250,6.12937,0 +,lx0lu,,49.71102,6.16604,0 +,lx0net,,49.54279,5.83889,0 +,lx0nsr,,49.85146,6.08349,0 +,lx0pac,,49.91110,6.05810,0 +,lx0par,,49.45792,5.99821,0 +,lx0prd,,49.58919,5.97420,0 +,lx0prv,,49.94240,6.15057,0 +,lx0rl,,49.69315,6.19066,0 +,lz1lcd,,42.71076,23.24431,0 +,lz2kac,,42.87551,25.30725,0 +,lz4ny,,43.21949,23.54750,0 +,n5cnb,,29.85468,-96.53480,0 +,oe1kbc,,48.28017,16.41499,0 +,oe1vqs,,48.27215,16.38423,0 +,oe1xac,,48.26345,16.45285,0 +,oe1xar,,48.31066,16.38250,0 +,oe1xaw,,48.18205,16.39177,0 +,oe1xbr,,48.18177,16.43159,0 +,oe1xca,,48.16802,16.34539,0 +,oe1xds,,48.22016,16.34646,0 +,oe1xdt,,48.24021,16.41005,0 +,oe1xfr,,48.16254,16.38861,0 +,oe1xhq,,48.18996,16.34044,0 +,oe1xik,,48.24800,16.43970,0 +,oe1xiu,,48.17423,16.36401,0 +,oe1xlc,,48.18996,16.34044,0 +,oe1xor,,48.17690,16.29166,0 +,oe1xqu,,48.16883,16.38399,0 +,oe1xuu,,48.27645,16.33335,0 +,oe2xal,,47.80929,12.99039,0 +,oe2xap,,47.97362,13.18859,0 +,oe2xbb,,47.77654,13.43361,0 +,oe2xgr,,47.30898,13.23281,0 +,oe2xhm,,47.42055,13.06236,0 +,oe2xkr,,47.28141,12.28777,0 +,oe2xmr,,47.12880,13.62444,0 +,oe2xpr,,47.93750,13.01556,0 +,oe2xsr,,47.05406,12.95772,3106 +,oe2xtr,,47.64941,13.08891,0 +,oe2xwr,,47.18913,12.68524,0 +,oe2xzr,,47.80395,13.10984,1273 +,oe3ukw,,48.40483,16.71580,0 +,oe3xar,,48.05960,15.53967,0 +,oe3xbr,,48.22385,16.11009,0 +,oe3xda,,48.03427,14.95116,0 +,oe3xdb,,47.97440,16.19721,0 +,oe3xer,,48.79339,15.34880,0 +,oe3xfh,,47.83916,16.24819,0 +,oe3xfr,,47.81199,15.24833,0 +,oe3xhb,,48.33452,15.33764,0 +,oe3xhr,,48.86608,15.11416,0 +,oe3xhs,,47.46418,16.22117,0 +,oe3xia-2,,48.24875,16.24409,0 +,oe3xia,,48.24874,16.24427,0 +,oe3xla,,48.71117,16.36759,0 +,oe3xnk,,47.84979,16.07857,0 +,oe3xnr,,48.67879,14.76570,0 +,oe3xrb,,47.99654,14.76447,0 +,oe3xsa,,48.43338,15.47138,0 +,oe3xwu,,47.52992,15.91403,0 +,oe3xww,,47.51070,16.03766,0 +,oe3xyr,,48.20703,15.61763,0 +,oe3xzr,,48.61649,15.15280,0 +,oe4xlc,,47.29257,16.11094,0 +,oe4xsb,,47.65937,16.39016,0 +,oe5drp,,48.63333,13.93233,0 +,oe5eb,,48.12564,12.87711,0 +,oe5xbl,,48.10147,13.31122,0 +,oe5xbr,,48.28901,14.27617,0 +,oe5xdo,,48.50287,13.82562,0 +,oe5xgl,,47.89888,13.81861,0 +,oe5xho,,48.00719,14.45224,0 +,oe5xhr,,48.73693,13.92039,0 +,oe5xim,,48.55979,14.26892,0 +,oe5xkr,,47.52427,13.68919,0 +,oe5xll,,48.38527,14.25500,0 +,oe5xol,,48.41536,14.27412,0 +,oe5xul,,48.20083,13.58194,0 +,oe5xxx,,48.20231,14.29303,0 +,oe5xyp,,48.05320,14.41718,0 +,oe6pwe,,46.99178,15.45700,0 +,oe6xag,,47.19884,15.46694,0 +,oe6xar,,47.25505,14.34482,0 +,oe6xbg,,47.40554,15.35936,0 +,oe6xer,,46.81656,15.77201,0 +,oe6xfe,,46.79420,15.19517,0 +,oe6xkr,,46.82931,15.00002,0 +,oe6xlr,,47.35832,15.18794,0 +,oe6xpd,,46.94991,15.37988,0 +,oe6xrr,,47.08850,15.38566,0 +,oe6xvr,,46.84538,15.93198,0 +,oe6xzg,,47.19834,15.46576,0 +,oe7xar,,47.57402,12.19639,0 +,oe7xbi,,47.24166,11.18138,0 +,oe7xci,,47.26482,11.39865,0 +,oe7xfj,,47.48446,12.42794,0 +,oe7xgr,,47.06349,11.67966,3224 +,oe7xih,,47.18318,11.28221,0 +,oe7xkh,,47.14624,10.62666,0 +,oe7xli,,46.82141,12.70016,0 +,oe7xlr,,47.30557,11.37786,0 +,oe7xtt,,47.16866,11.80000,0 +,oe7xvr,,47.15749,10.21304,0 +,oe7xwi,,47.15816,11.84867,643 +,oe7xxr,,47.46643,11.82653,0 +,oe7xzh,,47.38175,11.87432,0 +,oe7xzr,,47.42113,10.98430,0 +,oe8xdr,,46.60316,13.67193,2138 +,oe8xer,,46.79459,14.95827,0 +,oe8xgr,,46.69265,13.91399,0 +,oe8xhr,,46.95413,14.68533,0 +,oe8xik,,46.73299,14.02850,0 +,oe8xkk,,46.60882,14.14470,0 +,oe8xmk,,46.72809,14.42918,0 +,oe8xmr,,46.61015,14.33028,0 +,oe8xpk,,46.51850,14.77298,0 +,oe8xsr,,46.75932,13.45823,0 +,oe8xvr,,46.61590,13.85758,0 +,oe9xfr,,47.24461,9.56876,0 +,oe9xpr,,47.50601,9.77919,0 +,oe9xvi,,47.20917,9.59106,0 +,oe9xvv,,47.22903,9.73778,0 +,ok0a,,49.54287,15.59305,0 +,ok0aa,,49.37749,15.39731,0 +,ok0aba,,49.20171,16.53376,0 +,ok0acc,,49.74439,13.95230,0 +,ok0ad,,49.81249,18.20833,0 +,ok0ae,,49.80299,13.34148,0 +,ok0ag,,49.14583,16.12500,0 +,ok0ah,,49.02083,17.62500,0 +,ok0b,,50.71091,15.23733,0 +,ok0ba,,49.37744,15.39731,0 +,ok0bab,,49.23487,16.62191,0 +,ok0bac,,49.78500,14.03469,0 +,ok0baf,,49.73527,16.03444,0 +,ok0baj,,49.39759,15.56962,0 +,ok0bap,,49.88805,16.11888,0 +,ok0bbf,,50.05069,16.69354,0 +,ok0bbk,,50.59433,15.26315,0 +,ok0bc,,50.75390,15.50649,0 +,ok0bca,,50.68400,15.70099,0 +,ok0bcn,,50.40111,16.19083,0 +,ok0bd,,49.81249,18.12500,0 +,ok0bdl,,49.54612,18.44833,0 +,ok0bdv,,48.73831,14.72435,0 +,ok0bez,,50.31849,13.54217,0 +,ok0bf,,49.38616,17.50132,0 +,ok0bhd,,49.38972,16.70527,0 +,ok0bhj,,49.55846,16.27963,0 +,ok0bhs,,48.86009,17.36559,0 +,ok0bka,,50.12221,14.25305,0 +,ok0bl,,49.38286,12.78392,0 +,ok0bm,,49.09055,13.55083,0 +,ok0bnh,,49.90988,14.28587,0 +,ok0bnj,,49.52158,14.43235,0 +,ok0bpl,,49.68111,13.46472,0 +,ok0br,,49.65829,13.81778,0 +,ok0brq,,49.19110,16.52694,0 +,ok0bz,,48.85416,16.04166,0 +,ok0bzr,,49.58131,15.96211,0 +,ok0c,,50.65243,15.74171,0 +,ok0chb,,49.19899,17.37969,0 +,ok0cn,,50.25742,16.36128,0 +,ok0d,,49.54612,18.44833,0 +,ok0das,,50.73583,15.74027,0 +,ok0dbf,,50.05083,16.69333,0 +,ok0dhd,,49.41275,16.75425,0 +,ok0dmr,,50.07972,14.39222,0 +,ok0drb,,50.08027,13.50194,0 +,ok0dsk,,49.63261,18.26450,0 +,ok0e,,50.39671,12.96770,0 +,ok0eb,,48.86726,14.28128,0 +,ok0f,,50.05071,16.69351,0 +,ok0h,,48.86921,16.65011,0 +,ok0hcs,,50.08000,14.38444,0 +,ok0j,,50.73270,14.98469,0 +,ok0k,,50.13999,14.07870,0 +,ok0kop,,48.96083,17.79613,0 +,ok0l,,49.43102,13.20317,0 +,ok0mar,,49.18861,16.67944,0 +,ok0mm,,49.52083,14.45833,0 +,ok0n,,50.08157,14.45081,0 +,ok0ncc,,49.93638,14.35583,0 +,ok0ni,,50.70674,13.85685,0 +,ok0o,,49.67456,17.38653,0 +,ok0omx,,50.02411,14.49772,0 +,ok0ozl,,49.20045,17.69091,0 +,ok0pi,,49.30888,14.18861,0 +,ok0por,,49.93833,14.67555,0 +,ok0pv,,49.43138,16.90992,0 +,ok0pvd,,49.43750,16.87499,0 +,ok0q,,49.86150,15.12186,0 +,ok0s,,50.04677,15.76010,0 +,ok0t,,50.64583,13.87500,0 +,ok0x,,50.08277,17.23083,0 +,ok0xgd,,49.68750,17.37499,0 +,ok0z,,49.40040,17.76793,0 +,ok1alx,,49.86166,15.46749,0 +,ok1bc,,48.82064,14.50690,0 +,ok1fqt,,50.63529,15.65290,0 +,ok1khl,,50.08680,16.00620,0 +,ok1lpd,,50.27083,14.87500,0 +,ok1odc,,50.77083,14.20833,0 +,ok1pcb,,49.03613,14.04230,0 +,ok1pjv,,49.39583,13.29166,0 +,ok1por,,49.92972,14.66527,0 +,ok1rpl,,49.76583,13.33138,0 +,ok1xfj,,49.96861,12.50194,0 +,ok1zjv,,48.72352,14.09043,0 +,ok2jf-1,,49.57972,15.97194,0 +,ok2jf-2,,49.55888,15.93416,0 +,ok2kvm,,49.43750,16.04166,0 +,ok2zdl,,49.39763,15.56973,0 +,ok4ps,,49.27083,17.37499,0 +,on0atv,,51.07799,5.38006,0 +,on0das,,51.06520,5.08211,0 +,on0dg,,50.44970,6.17150,0 +,on0dst,,51.00849,5.12198,0 +,on0dxk,,50.82540,3.24927,0 +,on0gl,,50.92230,4.86732,0 +,on0ktk,,50.88600,3.23938,0 +,on0lb,,50.73749,5.50605,0 +,on0lge,,50.62670,5.70338,0 +,on0lil,,51.00650,5.50961,0 +,on0llv,,50.48000,4.25190,0 +,on0mwv,,50.91440,3.26905,0 +,on0rbo,,50.65319,6.16846,0 +,on0sea,,51.34180,3.28664,0 +,on0tb,,50.50209,6.09283,0 +,on0tlo,,50.99830,4.98305,0 +,on0tva,,50.82170,4.34306,0 +,on0vti,,50.99670,3.32805,0 +,on0wv,,51.20825,3.22484,0 +,ov1rep,,56.08363,8.25692,0 +,oz0asr,,56.31278,8.78663,0 +,oz0ch,,55.65489,12.27778,0 +,oz0dmr,,55.56370,11.82255,0 +,oz0dst,,57.46233,10.45366,0 +,oz0gut,,56.78200,8.28333,0 +,oz0kar,,55.73165,12.44366,0 +,oz0kec,,56.12746,12.27752,0 +,oz0rea,,55.21670,11.75000,0 +,oz0reb,,55.22780,11.74425,0 +,oz0red,,54.77666,11.50239,0 +,oz0ref,,55.37690,11.33641,0 +,oz0reg,,55.66919,12.40209,0 +,oz0reh,,55.20734,14.75286,0 +,oz0rep,,56.14231,8.46365,0 +,oz0req,,55.53448,9.70081,0 +,oz0res,,56.48716,8.60074,0 +,oz0ret,,56.61139,8.53939,0 +,oz0reu,,55.63486,12.48295,0 +,oz0rev,,55.38675,10.13749,0 +,oz1ajd,,55.65369,12.59733,0 +,oz1awh,,56.47650,10.44199,0 +,oz1bmo,,55.24420,9.48149,0 +,oz1dhs,,55.47600,8.45466,0 +,oz1diy,,56.54798,8.30072,0 +,oz1esy,,55.31049,10.78999,0 +,oz1kfy,,55.51580,9.62020,0 +,oz1pch,,55.45861,9.88089,0 +,oz1rec,,57.11262,10.03125,0 +,oz1ref,,55.56187,9.76538,0 +,oz1reg,,56.49233,8.59100,0 +,oz1reh,,56.10566,8.98549,0 +,oz1rei,,55.09919,10.56700,0 +,oz1rej,,57.37971,9.72593,0 +,oz1rel,,56.64128,8.56508,0 +,oz1reo,,55.72719,12.46390,0 +,oz1res,,55.97786,8.56610,0 +,oz1ret,,56.10744,12.36532,0 +,oz1rev,,56.75101,8.41477,0 +,oz1rex,,56.17699,9.54800,0 +,oz1rhs,,55.67416,12.46741,0 +,oz1rmo,,56.74398,8.95069,0 +,oz2akm,,55.53249,8.40549,0 +,oz2dmr,,55.84383,11.68649,0 +,oz2dst,,57.27333,9.95049,0 +,oz2erp,,56.10569,8.98558,0 +,oz2fyn,,55.37400,10.50516,0 +,oz2rbf,,55.61519,12.34210,0 +,oz2rea,,55.67199,12.52313,0 +,oz2rec,,56.64049,9.41739,0 +,oz2ree,,55.36670,10.50000,0 +,oz2ref,,55.38330,10.36670,0 +,oz2reg,,55.51176,9.61462,0 +,oz2rel,,56.05480,10.20766,0 +,oz2rem,,55.67124,12.50050,0 +,oz2ren,,55.21301,11.94523,0 +,oz2reo,,55.72719,12.46390,0 +,oz2res,,56.02296,12.57275,0 +,oz2ret,,55.93106,12.32829,0 +,oz2reu,,55.65605,12.55668,0 +,oz2rex,,55.82056,12.09541,0 +,oz3ab,,55.17699,11.86380,0 +,oz3dmr,,55.87787,11.67060,0 +,oz3dsr,,57.02659,10.00449,0 +,oz3dst,,57.03619,9.91248,0 +,oz3kv,,55.58280,12.28449,0 +,oz3rea,,55.65471,12.28950,0 +,oz3red,,56.47000,10.01816,0 +,oz3ree,,56.23027,9.16333,0 +,oz3ref,,55.39580,10.37500,0 +,oz3reg,,55.82693,11.52861,0 +,oz3rei,,55.13329,9.44999,0 +,oz3rej,,55.50006,11.83987,0 +,oz3rek,,55.50232,8.40855,0 +,oz3reo,,55.17840,14.78453,0 +,oz3rep,,54.83717,11.49170,0 +,oz3req,,56.17219,10.20489,0 +,oz3ret,,57.33144,10.51060,0 +,oz3reu,,55.63486,12.48333,0 +,oz3rev,,55.19976,14.95347,0 +,oz3rex,,55.38830,10.11670,0 +,oz3rey,,55.14219,9.43739,0 +,oz4dst,,54.90000,9.63330,0 +,oz4jrh,,55.99540,12.53719,0 +,oz4red,,55.50230,8.45839,0 +,oz4reg,,55.58694,12.29028,0 +,oz4ren,,56.88899,9.81982,0 +,oz4reu,,55.65605,12.55555,0 +,oz4rex,,56.58916,9.00549,0 +,oz4rey,,55.74083,10.94833,0 +,oz5ds,,55.33948,10.79615,0 +,oz5dst,,57.05015,9.89257,0 +,oz5gre,,56.42056,10.86200,0 +,oz5kl,,55.32099,10.79469,0 +,oz5reb,,55.99323,9.79498,0 +,oz5ree,,55.72359,12.35599,0 +,oz5rej,,55.68000,9.11000,0 +,oz5reo,,55.68861,9.52976,0 +,oz5req,,54.77545,11.48499,0 +,oz5reu,,55.34999,10.36670,0 +,oz5rew,,56.58916,9.00549,0 +,oz5rez,,56.04629,9.94539,0 +,oz6dmr,,56.02260,12.56256,0 +,oz6fyn,,55.25956,10.67137,0 +,oz6hot,,55.08198,10.37966,0 +,oz6rec,,55.66299,11.63599,0 +,oz6red,,57.46450,9.94099,0 +,oz6reh,,55.09999,10.53330,0 +,oz6rej,,56.77280,9.80449,0 +,oz6rek,,57.45600,9.99499,0 +,oz6ret,,55.29999,11.19999,0 +,oz6reu,,55.63509,12.48295,0 +,oz6rev,,55.93750,11.70830,0 +,oz6rex,,55.71249,9.45442,0 +,oz6rey,,55.50226,8.45836,0 +,oz7ce,,56.04000,9.92000,0 +,oz7dmr,,56.04440,12.07459,0 +,oz7dsd,,55.96010,9.80669,0 +,oz7dst,,57.46561,9.94203,0 +,oz7gre,,56.42060,10.86240,0 +,oz7kmo,,55.32557,10.80042,0 +,oz7red,,56.75680,8.38897,0 +,oz7ref,,55.09909,10.56717,0 +,oz7rel,,56.95733,9.26366,0 +,oz7rep,,55.71932,11.38282,0 +,oz7rer,,56.08410,8.39760,0 +,oz7res,,55.51116,8.43883,0 +,oz7ret,,55.01670,9.11670,0 +,oz7reu,,55.65605,12.55777,0 +,oz7rez,,54.71195,11.45531,0 +,oz7rog,,55.64451,9.64522,0 +,oz7rsp,,55.62966,12.44199,0 +,oz8afn,,55.24570,12.11500,0 +,oz8afz,,55.16583,14.96638,0 +,oz8dmr,,55.81724,12.47224,0 +,oz8dsd,,55.08330,10.65000,0 +,oz8rcr,,55.59923,12.33156,0 +,oz8reb,,55.31447,10.75165,0 +,oz8rec,,55.53172,8.40162,0 +,oz8reg,,55.01670,11.86670,0 +,oz8reh,,55.09999,8.94999,0 +,oz8rek,,54.83749,11.49170,0 +,oz8rel,,55.73472,12.46142,0 +,oz8rer,,55.71965,12.36363,0 +,oz8res,,55.77080,9.45833,0 +,oz8rey,,55.09930,10.56717,0 +,oz9asr,,55.42975,11.72921,0 +,oz9dst,,55.45994,12.04026,0 +,oz9reb,,55.73043,12.49421,0 +,oz9red,,55.87416,11.53372,0 +,oz9ref,,54.88330,12.03330,0 +,oz9reg,,55.99304,9.79498,0 +,oz9reh,,56.06250,12.20730,0 +,oz9rei,,55.81108,11.57747,0 +,oz9rek,,55.75629,9.25636,0 +,oz9rel,,55.46670,8.37269,0 +,oz9ren,,56.17715,10.12125,0 +,oz9rep,,57.05421,9.91597,0 +,oz9rer,,57.43808,10.54899,0 +,oz9res,,57.11003,8.62466,0 +,oz9ret,,56.75683,8.39020,0 +,oz9reu,,55.74080,10.94830,0 +,oz9rev,,55.09999,8.95199,0 +,oz9rew,,56.70260,8.49993,0 +,oz9rex,,56.75680,8.38897,0 +,oz9rez,,56.46933,10.01866,0 +,oz9rlm,,56.54798,8.30072,0 +,pa0ete,,52.17927,5.40550,0 +,pa0fot,,50.86302,5.77156,0 +,pa0gri,,51.49609,5.39947,0 +,pa0sip,,53.11451,6.10845,0 +,pa1edl,,52.13589,5.49953,0 +,pa1er,,51.80133,4.68280,0 +,pa1jrn,,52.08818,5.06065,0 +,pa1okz,,52.20721,5.08659,0 +,pa1pas,,51.96862,5.89240,0 +,pa2eon,,51.66675,5.36788,0 +,pa2jf,,52.29799,5.14982,0 +,pa3cev,,51.49697,5.38574,0 +,pa3eiv,,51.52741,3.89867,0 +,pa3fym,,52.21195,5.16203,0 +,pa3l,,51.80963,4.66301,0 +,pa3pm,,52.36033,4.79066,0 +,pa4den,,52.78240,6.11086,0 +,pa4tw,,52.27116,5.16733,0 +,pd0ghf,,51.98474,5.84550,0 +,pd0oyf,,53.09973,6.11409,0 +,pd0raf,,52.19752,5.38121,0 +,pd0sdo,,53.11252,6.08363,0 +,pd0zry,,52.14720,5.35707,0 +,pd1aem,,51.79970,4.73480,0 +,pd2lt,,51.55866,3.80258,0 +,pd2nlx,,51.64802,3.91605,0 +,pd4dx,,53.11256,6.06343,0 +,pd8w,,53.00352,6.55341,0 +,pd9fer,,52.68729,5.22689,0 +,pe1ago,,51.84243,4.69509,0 +,pe1bey,,51.50592,5.39149,0 +,pe1chl,,52.06267,5.13856,0 +,pe1itr,,51.44539,5.40086,0 +,pe1plm,,51.45003,4.00615,0 +,pe1pme,,52.10831,5.08440,0 +,pe1pts,,51.50296,3.89835,0 +,pe1pup,,51.95386,5.17841,0 +,pe1rdp,,51.43689,5.38802,0 +,pe1rjv,,52.37364,5.26864,0 +,pe1rln,,50.88583,5.85533,0 +,pe1rmn,,51.72573,3.91147,0 +,pe1rwp,,53.11439,6.11458,0 +,pe5yes,,51.44485,5.51343,0 +,pe9ghz,,51.49091,3.91113,0 +,ph4x,,52.20670,5.37061,0 +,pi1amf,,52.15949,5.40633,0 +,pi1ams,,52.36033,4.79066,0 +,pi1anh,,51.99946,5.90872,0 +,pi1apd,,52.22517,5.90583,0 +,pi1dft,,51.99517,4.33583,0 +,pi1dhg,,52.08079,4.33586,0 +,pi1dra-1,,53.10269,6.10232,0 +,pi1dra,,53.10702,6.12651,0 +,pi1lwd,,53.19399,5.85882,0 +,pi1nlb,,51.68133,5.97172,0 +,pi1nmg,,51.81917,5.86623,0 +,pi1shb,,51.69955,5.34739,0 +,pi1snk,,53.02651,5.64730,0 +,pi1spa,,52.25748,5.37705,0 +,pi1twe,,52.26126,6.78720,0 +,pi1utr,,52.01006,5.05351,0 +,pi1vli,,51.44794,3.56925,0 +,pi1zld,,51.64733,3.93166,0 +,pi2amf,,52.14365,5.36428,0 +,pi2anh,,51.95410,5.90637,0 +,pi2brd,,51.59008,4.82504,0 +,pi2ehv,,51.45373,5.40224,0 +,pi2mst,,50.85623,6.07612,0 +,pi2non-1,,52.95545,5.91896,0 +,pi2non-2,,52.58331,6.19410,0 +,pi2non-3,,52.55493,5.91991,0 +,pi2non,,51.89583,6.24177,0 +,pi2non-5,,52.46070,6.50227,0 +,pi2non-6,,52.99875,6.54858,0 +,pi2non-8,,52.23006,6.91613,0 +,pi2non-9,,52.68259,5.96121,0 +,pi2nos,,52.24250,5.16433,0 +,pi2swk,,52.00955,4.73114,0 +,pi2vli,,51.46320,3.55639,0 +,pi3alk,,52.60939,4.76235,0 +,pi3fld,,52.52637,5.43772,0 +,pi3goe,,51.51082,3.88446,0 +,pi3twe,,52.11676,6.66284,0 +,pi4am-1,,53.44974,5.77504,0 +,pi4am,,53.44304,5.63689,0 +,pi4amf,,52.22973,5.37854,0 +,pi4anh,,51.98542,5.88387,0 +,pi4asd,,52.35507,4.84143,0 +,pi4dec,,51.81184,4.70365,0 +,pi4dr,,52.99341,6.55244,0 +,pi4rcg,,52.21348,5.14544,0 +,pi4rev,,52.06311,4.36810,0 +,pi4tta,,52.02762,5.62450,0 +,pi4tue,,51.44891,5.48749,0 +,pi4vrz,,52.17491,5.82567,0 +,pi4z,,51.53396,3.87560,0 +,pi6alk,,52.70470,4.80932,0 +,pi6anh,,51.98611,5.87583,0 +,pi6ats,,52.17777,5.29791,0 +,pi6ehv,,51.46597,5.47189,0 +,pi6hgl,,52.07136,4.32485,0 +,pi6hgs,,52.90250,6.40333,0 +,pi6ten,,52.21521,5.14574,0 +,pi6zdm,,52.40478,4.84690,0 +,pi9noz-2,,52.33641,4.88693,0 +,pi9noz,,52.09071,5.12134,0 +,pj2a,,12.13341,-68.90616,0 +,pj2nos,,12.14193,-68.84958,0 +,s55tvl,,46.50985,16.24851,0 +,s55yms,,46.73361,16.17763,0 +,s55yvu,,46.64056,15.25284,0 +,s56g,,45.91654,13.62007,0 +,s59dxx,,46.56356,15.64621,0 +,sp2l,,54.54122,18.46927,0 +,sp2pmk,,53.01546,18.59707,0 +,sp3cai,,52.76158,15.20348,0 +,sp6kcn,,50.81740,16.27534,0 +,sp6vxp,,50.82138,16.28226,0 +,sp9oyb,,49.74000,20.36349,0 +,sq4bjo,,53.84371,22.98220,0 +,sq5ccv,,52.18750,20.87499,0 +,sq6oxf,,51.20979,17.27926,0 +,sq6rr,,50.79235,16.23340,0 +,sr1bsz,,53.45534,14.53946,0 +,sr1dsz,,53.45530,14.53919,0 +,sr1ndi,,53.90999,14.25500,0 +,sr1wxz,,53.45610,14.54100,0 +,sr6dwb,,50.77939,16.21079,0 +,sr6dwc,,50.77610,16.24930,0 +,sr6dwh,,50.81082,16.28910,0 +,ym1ist,,41.08316,29.01116,0 +,ym1kd,,41.00500,28.89999,0 +,ym2udm,,41.06400,29.06033,0 +,ym3kb,,40.22666,28.97633,0 +,yo2lgp,,45.76805,21.22029,0 +,yo2lic,,45.73033,21.21241,0 +,yo2llq,,45.78952,21.24704,0 +,yo2llz,,45.79530,20.71914,0 +,yo2loj,,45.72563,21.24538,0 +,yo2miz,,45.70453,21.27151,0 +,yo2mpa,,45.71216,21.27544,0 +,yo6osc,,46.54896,24.51729,0 +,zl2arn,,-40.86630,175.05253,0 +#webcam +,Webcam Achensee Nord,,47.44290,11.70379, +,Webcam Achensee Sued,,47.44290,11.70379, +,Webcam Albrechtsplatz,,51.14037,8.44059, +,Webcam Almanarre,,43.04169,6.12735, +,Webcam Altastenberg,,51.18287,8.48827, +,Webcam Amberg,,49.45000,11.86999, +,Webcam Amberg DL0AO,,49.45000,11.86000, +,Webcam Amlach - Lienz,,46.80482,12.77530, +,Webcam Ammersee,,47.98968,11.16971, +,Webcam Andelsbuch,,47.40319,9.93880, +,Webcam Ankogel Nord,,47.02703,13.19056, +,Webcam Ankogel Sued,,47.02703,13.19056, +,Webcam Astental Ost,,46.95484,12.96108, +,Webcam Astental West,,46.96200,12.98231, +,Webcam Bad Reichenhall,,47.75503,12.84979, +,Webcam Bernau,,47.80166,12.37567, +,Webcam Bielefeld,,52.01514,8.47354, +,Webcam BKK - Bachlift,,46.81245,13.78380, +,Webcam BKK - Brunnach,,46.85683,13.75032, +,Webcam BKK - Golfplatz,,46.80857,13.76444, +,Webcam BKK - Kaiserburg,,46.78609,13.81812, +,Webcam BKK - Maibrunn Berg,,46.78966,13.79378, +,Webcam BKK - Nockalm,,46.82810,13.74237, +,Webcam BKK - Panoramalift,,46.82810,13.74237, +,Webcam BKK - Roemerbad,,46.80837,13.79911, +,Webcam BKK - Scharte,,46.84714,13.73874, +,Webcam BKK - Scharte Berg,,46.84924,13.74504, +,Webcam BKK - Sonnleitenlift,,46.84494,13.76376, +,Webcam BKK - Spitzeck,,46.84968,13.74936, +,Webcam BKK - Strohsack,,46.79040,13.80044, +,Webcam BKK - Thermenschuss,,46.81337,13.79918, +,Webcam BKK - Wiesernock,,46.82950,13.74500, +,Webcam Brauneck Garland,,47.66346,11.52649, +,Webcam Brombachsee,,49.11902,10.93538, +,Webcam Bruneck,,46.80407,11.95315, +,Webcam Buchstein Sued,,47.63264,11.67811, +,Webcam Burghausen,,48.15909,12.82135, +,Webcam Capo Reamol,,45.82837,10.82203, +,Webcam Chieming-Egerer,,47.90496,12.53740, +,Webcam Chiemsee,,47.84821,12.47600, +,Webcam Chiemsee Gstadt,,47.88332,12.41717, +,Webcam Cully Gen\u00e8ve,,46.48707,6.73071, +,Webcam Dellach im Drautal,,46.73081,13.08837, +,Webcam Dietramszell,,47.90682,11.59483, +,Webcam Dobratsch,,46.60354,13.67034, +,Webcam Dorf Tirol,,46.70014,11.15789, +,Webcam Dornbirn,,47.38806,9.75050, +,Webcam Ederplan,,46.82492,12.89779, +,Webcam Falkert Heidialm,,46.86784,13.83282, +,Webcam Fellhorn,,47.34807,10.21616, +,Webcam Flattach,,46.93640,13.07708, +,Webcam Freimann Nord,,48.18396,11.61122, +,Webcam Freimann Sued,,48.18396,11.61122, +,Webcam Freiwandeck,,47.07819,12.75639, +,Webcam Freya Gletscher,,74.38247,-20.78783, +,Webcam Fuerstenfeld,,48.17029,11.24704, +,Webcam Funtenseetauern,,47.48642,12.97145, +,Webcam Furkajoch,,47.26400,9.82774, +,Webcam Gantkofel,,46.49323,11.21056, +,Webcam Gernkogel,,47.30887,13.23280, +,Webcam Gerstruben,,47.37042,10.31381, +,Webcam Gletscher - Alteck,,47.03192,12.98322, +,Webcam Gletscher - Eissee,,47.03101,13.01056, +,Webcam Gletscher - Panorama,,47.03187,13.01037, +,Webcam Gletscher - Schareck,,47.03984,13.02068, +,Webcam Gletscher - Schwarzkopf,,46.99986,13.02295, +,Webcam Gmundner Huette,,47.87298,13.83363, +,Webcam Goldbergkees,,47.05169,12.96441, +,Webcam Grandsberg,,48.94890,12.85191, +,Webcam Grassau,,47.79040,12.45582, +,Webcam Grosser Arber Nord,,49.11471,13.13344, +,Webcam Grosser Arber Ost,,49.11215,13.13719, +,Webcam Grosser Arbersee,,49.09858,13.15911, +,Webcam Grosser Arber Sued,,49.11220,13.13569, +,Webcam Gruentenlifte,,47.59568,10.30804, +,Webcam Gummer,,46.45306,11.46266, +,Webcam Heiligenblut,,47.02099,12.87730, +,Webcam Herzogstand Nord,,47.60696,11.31652, +,Webcam Herzogstand Sued,,47.60663,11.31612, +,Webcam Hittenkirchen,,47.82284,12.34099, +,Webcam Hochfelln-Mittel,,47.76898,12.57571, +,Webcam Hochfelln Nord,,47.76266,12.56063, +,Webcam Hochheidehuette,,51.22949,8.51706, +,Webcam Hochkar,,47.70896,14.91262, +,Webcam Hochkoenig,,47.42013,13.06214, +,Webcam Hochries Ost,,47.74789,12.25022, +,Webcam Hochries Sued,,47.74670,12.24917, +,Webcam Hochries West,,47.74720,12.24903, +,Webcam Hofern - Kiens,,46.82023,11.83907, +,Webcam Hohenbogen Ost,,49.23456,12.93329, +,Webcam Hohenbogen West,,49.23456,12.93329, +,Webcam Hohenpeissenberg,,47.80078,11.01457, +,Webcam Hoher Kasten,,47.28388,9.48568, +,Webcam Innervillgraten,,46.80366,12.37840, +,Webcam Innichen,,46.73684,12.28549, +,Webcam Innsbruck,,47.30557,11.37786, +,Webcam Irschenberg,,47.82839,11.92089, +,Webcam Jachenau Hoefen,,47.60457,11.51795, +,Webcam Jenner Ost,,47.57560,13.02467, +,Webcam Jenner Sued,,47.57560,13.02467, +,Webcam Kals,,47.00747,12.64753, +,Webcam Kals Nord,,46.98332,12.62694, +,Webcam Kandahar-Lodge,,47.48954,11.08057, +,Webcam Kartitsch,,46.72520,12.48743, +,Webcam Karwendelbahn,,47.43027,11.29562, +,Webcam Kirchheimerhof,,46.81649,13.78452, +,Webcam Klausberg Almboden,,46.98320,11.98207, +,Webcam Klausberg Tal,,46.98470,11.97898, +,Webcam Kleinfleisskees,,47.04626,12.94305, +,Webcam Koblenz,,50.39699,7.62335, +,Webcam Kochelsee,,47.61465,11.34184, +,Webcam Koeppelturm,,50.43043,7.75131, +,Webcam Kolm-Saigurn,,47.06948,12.98460, +,Webcam Konkordiahuette,,46.50026,8.05344, +,Webcam Kronplatz,,46.74051,11.95922, +,Webcam Kronplatz-Gipfel,,46.73863,11.95324, +,Webcam Laax,,46.83454,9.21618, +,Webcam Landshut,,48.56943,12.11279, +,Webcam Leogang - Asitz,,47.40246,12.70228, +,Webcam Lienz Zettersfeld,,46.86000,12.78999, +,Webcam Maishofen Sausteige,,47.38223,12.76477, +,Webcam Malcesine Addicted,,45.76153,10.80795, +,Webcam Mals - Vinschgau,,46.70110,10.50679, +,Webcam Mariahilfberg,,49.45000,11.86999, +,Webcam Marquartstein,,47.76213,12.47995, +,Webcam Marquartstein Oed,,47.75000,12.46000, +,Webcam Massenricht,,49.59239,11.95330, +,Webcam Maxhuette,,49.49396,11.78146, +,Webcam Meilerhuette,,47.41246,11.12882, +,Webcam Meran,,46.66231,11.12790, +,Webcam Meran Hochmuth,,46.70199,11.13152, +,Webcam Moertschach,,46.89654,12.91570, +,Webcam Moertschachberg,,46.92341,12.92173, +,Webcam Mooserboden,,47.16623,12.71145, +,Webcam Naturns - Plaus,,46.65682,11.04098, +,Webcam Niederdielfen,,50.85301,8.09786, +,Webcam Niederdorf,,46.74690,12.13991, +,Webcam Norderney,,53.70970,7.14319, +,Webcam Nussbaumen,,47.48684,8.29271, +,Webcam Oberstaufen,,47.57237,10.04313, +,Webcam Obervellach,,46.94814,13.16818, +,Webcam Oelberg,,50.68192,7.24827, +,Webcam Olang Geiselsberg,,46.74643,12.00119, +,Webcam OTH Regensburg,,49.00281,12.09600, +,Webcam Pass Thurn,,47.29519,12.43087, +,Webcam Pendling Ost,,47.57279,12.11215, +,Webcam Pendling West,,47.57279,12.11215, +,Webcam Pfalzen,,46.81029,11.88086, +,Webcam Pfronten,,47.48954,11.08056, +,Webcam Piz Chavalatsch,,46.61479,10.49208, +,Webcam Poertschach Sued,,46.64389,14.13002, +,Webcam Pognana Lario,,45.87865,9.15681, +,Webcam Prasserbad,,47.69648,11.74571, +,Webcam Raas - Brixen,,46.74865,11.65734, +,Webcam Radevormwald,,51.19139,7.31302, +,Webcam Ramsau Hintersee,,47.60834,12.85297, +,Webcam Rangersdorf,,46.85111,12.92894, +,Webcam Rein in Taufers,,46.94846,12.06130, +,Webcam Reischach,,46.77492,11.95724, +,Webcam Ritten,,46.56382,11.41371, +,Webcam Rosenheim,,47.86029,12.13182, +,Webcam Saalfelden,,47.41672,12.84778, +,Webcam Salzburg,,47.75503,12.84979, +,Webcam Schareben,,49.12955,13.05224, +,Webcam Schareck Nord,,47.03984,13.02068, +,Webcam Schlackenberg NO,,49.48200,11.76235, +,Webcam Schlackenberg NW,,49.48200,11.76235, +,Webcam Schladitzersee,,51.26149,12.20297, +,Webcam Schlappin Klosters,,46.90904,9.89885, +,Webcam Schlegeis,,47.04054,11.70246, +,Webcam Schloss Kammer,,47.36528,12.82094, +,Webcam Schroecken,,47.25675,10.09400, +,Webcam Schwarzenbach,,47.63613,16.36159, +,Webcam Seebruck,,47.93897,12.47391, +,Webcam Siegsdorf,,47.81694,12.63068, +,Webcam Sillian,,46.74813,12.41466, +,Webcam Sistrans Nord,,47.23366,11.44728, +,Webcam Sistrans West,,47.23366,11.44728, +,Webcam Skiflugschanze,,47.37699,10.26708, +,Webcam Soma Bay,,26.84872,33.99007, +,Webcam Sonnblick,,47.05397,12.95748, +,Webcam Sonnenbichl,,47.69988,11.71007, +,Webcam Spitzingsee,,47.66314,11.88779, +,Webcam Starnberger See,,47.90372,11.33378, +,Webcam St. Christina Groeden,,46.55982,11.71604, +,Webcam Steinhagen,,52.01514,8.47353, +,Webcam Sternwarte-Suedtirol,,46.45306,11.46266, +,Webcam St. Jakob - Ahrntal,,46.99628,12.02051, +,Webcam St.Pauls - Eppan,,46.47516,11.25217, +,Webcam Stroheim,,48.33872,13.95655, +,Webcam St.Veit in Defereggen,,46.92765,12.43571, +,Webcam Taisten Pustertal,,46.76689,12.10274, +,Webcam Tegelberghaus,,47.45497,10.99322, +,Webcam Tegernsee,,47.71851,11.76287, +,Webcam Tiroler Ache,,47.75219,12.46406, +,Webcam Toblach Ratsberg,,46.74877,12.21741, +,Webcam Torbole,,45.87039,10.87310, +,Webcam Turrach Ost,,46.92106,13.86049, +,Webcam Turrach West,,46.92155,13.88970, +,Webcam Tuxertal,,47.18426,11.77521, +,Webcam Unterammergau,,47.45497,10.99322, +,Webcam Untersiggenthal,,47.48684,8.29270, +,Webcam Ursensollen,,49.40026,11.76356, +,Webcam Vachendorf,,47.83983,12.62435, +,Webcam Vallendar,,50.39710,7.62335, +,Webcam Villgraten,,46.80713,12.32090, +,Webcam Vorderloiplsau,,47.62068,12.91170, +,Webcam Walchensee,,47.61465,11.34184, +,Webcam WaldWipfelWeg,,49.01129,12.78195, +,Webcam Wallackhaus Nord,,47.06921,12.83886, +,Webcam Wallackhaus Sued,,47.07291,12.83958, +,Webcam Wallberg,,47.66061,11.79115, +,Webcam Wankhaus,,47.50790,11.14404, +,Webcam Wendelstein Ost,,47.70179,12.01198, +,Webcam Wendelstein West,,47.70179,12.01198, +,Webcam Wernberg - Duel,,46.60786,13.94776, +,Webcam Wien Donaustadt,,48.23351,16.41117, +,Webcam Wien Favoriten,,48.16242,16.33622, +,Webcam Winklern,,46.87288,12.86306, +,Webcam Woerthsee,,47.90372,11.33378, +,Webcam Wolfgangsee,,47.44257,13.24116, +,Webcam WuhrsteinAlm,,47.70030,12.34973, +,Webcam Zell am See,,47.33481,12.82268, +,Webcam Zugspitze Baustelle,,47.42144,10.98444, +,Webcam Zugspitze Gipfel,,47.42083,10.98472, +,Webcam Zugspitze Stuetze,,47.44075,10.98904, +,Webcam Zugspitze Sued,,47.42082,10.98471, +,Webcam Zugspitze Tal,,47.45497,10.99323, diff --git a/aprsmap_common/symbols.png b/aprsmap_common/symbols.png new file mode 100644 index 0000000..02d83a5 Binary files /dev/null and b/aprsmap_common/symbols.png differ diff --git a/doc/Changelog.txt b/doc/Changelog.txt new file mode 100644 index 0000000..2a47d86 --- /dev/null +++ b/doc/Changelog.txt @@ -0,0 +1,27 @@ + + +04.01.2018: + +sondemod/sondeudp: + - added decoding PilotSonde + - added decoding M10 + - improve decoding DFM + - writing *.cal files to /tmp + +sondemod: + - write last radiosonde data to /tmp/sonde.csv (parameter -e) + - when rinex too old, file /tmp/toold are created + - sending decoded data to SP9SKP database https://skp.wodzislaw.pl/sondy + +sdrtst: + - waterfall on console + - write waterfall to /tmp/wtf.bin (parameter -n) + - offset to AFC (new parameter in file with frequencies) + example: + f 404.000 15 -6500 50 0 24000 # M10 + f 401.465 50 1200 0 0 12000 # pilotSonde + f 403.000 5 0 0 70 12000 # RS41,RS92 and others + +www: + - require lighttpd and php + - simple monitoring and configuration by web \ No newline at end of file diff --git a/doc/licenses/Exceptions b/doc/licenses/Exceptions new file mode 100644 index 0000000..e72217b --- /dev/null +++ b/doc/licenses/Exceptions @@ -0,0 +1,3 @@ +GPL License Exception: + +- there currenty are no exclusions diff --git a/doc/licenses/README b/doc/licenses/README new file mode 100644 index 0000000..bc0de28 --- /dev/null +++ b/doc/licenses/README @@ -0,0 +1,65 @@ +dxlAPRS is Free Software toolchain to operate APRS(r). The toolchain contains: +- afskmodem soundmodem for 300-19200bd afsk/fsk modulation, 2 channels +- aprsmap powerful aprs-viewer using open street map +- gps2aprs aprs-tracker using connected gps-mouse +- gps2digipos generate pos-beacon for digi/igate using connected gps +- sondemod decode data produced by a RS92 wx-sonde, received with sondeudp +- sondeudp soundmodem for RS92 wx-sonde +- udpbox intelligent aprs-digipeater +- udpflex interface between serial RMNC/KISS and AXUDP +- udpgate4 aprs-igate +- udphub L2-switch for AX25, one AXUDP port from a digipeater interfaced + to many users +- udprfnet + +The whole toolchain is copyrighted by Christian Rabler (oe5dxl) and many others +who contributed code (see the actual source code and the git commit messages +for details). You can redistribute dxlAPRS toolchain and/or modify it under +the terms of version 2 of the GNU General Public License as published by the +Free Software Foundation. Most of it can also be distributed, at your option, +under any later version of the GNU General Public License -- see individual +files for exceptions. + +Also note that the GPL and the other licenses are copyrighted by the Free +Software Foundation and other organizations, but the instance of code that they +refer to (the dxlAPRS toolchain source code) is copyrighted by me and others +who actually wrote it. +-- Christian Rabler (oe5dxl) + +Like many other projects, dxlAPRS toolchain has a tradition of including big +blocks of License headers in all files. This not only blows up the source code +with mostly redundant information, but also makes it very difficult to generate +License Clearing Reports. An additional problem is that even the same licenses +are referred to by a number of slightly varying text blocks (full, abbreviated, +different indentation, line wrapping and/or white space, with obsolete address +information, ...) which makes automatic processing a nightmare. + +To make this easier, such license headers in the source files will be replaced +with a single line reference to Unique License Identifiers as defined by the +Linux Foundation's SPDX project [1]. For example, in a source file the full +"GPL v2.0 or later" header text will be replaced by a single line: + + SPDX-License-Identifier: GPL-2.0+ + +Ideally, the license terms of all files in the source tree should be defined by +such License Identifiers; in no case a file can contain more than one such +License Identifier list. + +If a "SPDX-License-Identifier:" line references more than one Unique License +Identifier, then this means that the respective file can be used under the +terms of either of these licenses, i. e. with + + SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause + +you can chose between GPL-2.0+ and BSD-3-Clause licensing. + +We use the SPDX Unique License Identifiers here; these are available +at [2]. + +[1] http://spdx.org/ +[2] http://spdx.org/licenses/ + +Full name SPDX Identifier OSI Approved File name URI +======================================================================================================================================= +GNU General Public License v2.0 only GPL-2.0 Y gpl-2.0.txt http://www.gnu.org/licenses/gpl-2.0.txt +GNU General Public License v2.0 or later GPL-2.0+ Y gpl-2.0.txt http://www.gnu.org/licenses/gpl-2.0.txt diff --git a/doc/licenses/gpl-2.0.txt b/doc/licenses/gpl-2.0.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/doc/licenses/gpl-2.0.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/doc/start/CHECK_TOOLD b/doc/start/CHECK_TOOLD new file mode 100755 index 0000000..1811f03 --- /dev/null +++ b/doc/start/CHECK_TOOLD @@ -0,0 +1,23 @@ +#!/bin/bash + +cd /tmp + +if ls /tmp/toold > /dev/null 2>&1 +then + + if ls /tmp/rinex_de > /dev/null 2>&1 + then + rm /tmp/rinex_de + cd /tmp + /usr/bin/python /root/SDR/getrinex_us.py + #wget http://aprs.ehamnet.cz/gps_rinex.txt -O rinex + else + touch /tmp/rinex_de + cd /tmp + /usr/bin/python /root/SDR/getrinex_de.py #de + fi + rm /tmp/toold + sleep 20 + rm /tmp/toold + +fi diff --git a/doc/start/RINEX b/doc/start/RINEX new file mode 100755 index 0000000..18b843d --- /dev/null +++ b/doc/start/RINEX @@ -0,0 +1,4 @@ +#!/bin/bash + +cd /tmp +/usr/bin/python /root/SDR/getrinex_de.py diff --git a/doc/start/START b/doc/start/START new file mode 100755 index 0000000..3aec104 --- /dev/null +++ b/doc/start/START @@ -0,0 +1,67 @@ +#!/bin/bash + +/root/SDR/RINEX + +cp /root/SDR/sdrcfg0.txt /tmp/sdrcfg0.txt +cp /root/SDR/sdrcfg1.txt /tmp/sdrcfg1.txt +cp /root/SDR/sdrcfg2.txt /tmp/sdrcfg2.txt + +mkfifo /root/SDR/fifo0 +mkfifo /root/SDR/fifo1 +mkfifo /root/SDR/fifo2 + +chown www-data:www-data /tmp/*.txt + +cd /root/SDR + +#sleep 20 + +set -x +killall -9 rtl_tcp udpgate4 sondemod sondeudp sdrtst screen + +if test `find "rinex" -mmin +1440` +then + ./RINEX +fi + +screen -S rs -t bash -A -d -m /bin/bash + + + +screen -S rs -X screen -t rtl_tcp0 +screen -S rs -p rtl_tcp0 -X stuff $'/usr/local/bin/rtl_tcp0 -a 127.0.0.1 -p 1234 -g 40 -P 0 -d 0 -b 15 \n' +screen -S rs -X screen -t rtl_tcp1 +screen -S rs -p rtl_tcp1 -X stuff $'/usr/local/bin/rtl_tcp1 -a 127.0.0.1 -p 1235 -g 40 -P 0 -d 1 -b 15 \n' +screen -S rs -X screen -t rtl_tcp2 +screen -S rs -p rtl_tcp2 -X stuff $'/usr/local/bin/rtl_tcp2 -a 127.0.0.1 -p 1236 -g 40 -P 0 -d 2 -b 15 \n' +sleep 2 + +screen -S rs -X screen -t sdrtst0 +screen -S rs -p sdrtst0 -X stuff $'/root/SDR/bin/sdrtst -t 127.0.0.1:1234 -Z 100 -c /tmp/sdrcfg0.txt -v -s /root/SDR/fifo0 -r 25000 -n 1 \n' +screen -S rs -X screen -t sdrtst1 +screen -S rs -p sdrtst1 -X stuff $'/root/SDR/bin/sdrtst -t 127.0.0.1:1235 -Z 100 -c /tmp/sdrcfg1.txt -v -s /root/SDR/fifo1 -r 25000 -n 2 \n' +screen -S rs -X screen -t sdrtst2 +screen -S rs -p sdrtst2 -X stuff $'/root/SDR/bin/sdrtst -t 127.0.0.1:1236 -Z 100 -c /tmp/sdrcfg2.txt -v -s /root/SDR/fifo2 -r 16000 -n 3 \n' +sleep 5 + +screen -S rd -t bash -A -d -m /bin/bash + +screen -S rd -X screen -t sondeudp0 +screen -S rd -p sondeudp0 -X stuff $'/root/SDR/bin/sondeudp -f 25000 -l 128 -c 0 -o /root/SDR/fifo0 -I N0CALL-14 -v -u 127.0.0.1:4000 \n' +screen -S rd -X screen -t sondeudp1 +screen -S rd -p sondeudp1 -X stuff $'/root/SDR/bin/sondeudp -8 -f 25000 -l 128 -c 0 -o /root/SDR/fifo1 -I N0CALL-14 -v -u 127.0.0.1:4000 \n' +screen -S rd -X screen -t sondeudp2 +screen -S rd -p sondeudp2 -X stuff $'/root/SDR/bin/sondeudp -8 -1 -f 16000 -l 128 -c 0 -o /root/SDR/fifo2 -I N0CALL-14 -v -u 127.0.0.1:4000 \n' + +sleep 5 + +screen -S rd -X screen -t sondemod +screen -S rd -p sondemod -X stuff $'while [ 1 ] ; do /root/SDR/bin/sondemod -v -x /tmp/rinex -T 1440 -r 127.0.0.1:4010 -o 4000 -I N0CALL-14 -R 30 -d -A 3000 -B 2 -b 45 -p 0 -K DB_PASS -e 10 ; done\n' + +#screen -S rd -X screen -t almanach +#screen -S rd -p almanach -X stuff $'while [ 1 ] ; do sleep 1800; /root/SDR/RINEX ; done \n' + +screen -S rd -X screen -t udpgate +screen -S rd -p udpgate -X stuff $'/root/SDR/bin/udpgate4 -v -R 127.0.0.1:4011:4010 -s N0CALL-15 -n 20:/root/SDR/beacon.txt -t 14580 -g poland.aprs2.net:14580 -p APRS_PASS \n' + +#radiosondy.info diff --git a/doc/start/beacon.txt b/doc/start/beacon.txt new file mode 100644 index 0000000..eb2687f --- /dev/null +++ b/doc/start/beacon.txt @@ -0,0 +1,2 @@ +!4900.00N/01800.00E` + diff --git a/doc/start/cron.txt b/doc/start/cron.txt new file mode 100644 index 0000000..b8a4e3c --- /dev/null +++ b/doc/start/cron.txt @@ -0,0 +1,2 @@ +* * * * * /root/SDR/CHECK_TOOLD +0 4 * * * rm /tmp/*.cal diff --git a/doc/start/getrinex_de.py b/doc/start/getrinex_de.py new file mode 100644 index 0000000..46dad04 --- /dev/null +++ b/doc/start/getrinex_de.py @@ -0,0 +1,57 @@ +import os, sys, string +import datetime +import urllib + + +today = datetime.datetime.now() + + +def GetFtpPath(day_offset): + res = '' + res += 'ftp://cddis.gsfc.nasa.gov/gps/data/daily/' + res += str( datetime.datetime.now().timetuple().tm_year ) + res += "/brdc/brdc" + res += string.zfill( ( datetime.datetime.now().timetuple().tm_yday + day_offset ), 3 ) + res += '0.' + res += str( datetime.datetime.now().timetuple().tm_year )[2:] + res += 'n.Z' + return res + + +def GetFtpPathDe(day_offset): + res = '' + res += 'ftp://igs.bkg.bund.de/IGS/BRDC/' + res += str( datetime.datetime.now().timetuple().tm_year ) + res += "/" + res += today.strftime('%j') + res += "/brdc" + res += string.zfill( ( datetime.datetime.now().timetuple().tm_yday + day_offset ), 3 ) + res += '0.' + res += str( datetime.datetime.now().timetuple().tm_year )[2:] + res += 'n.Z' + return res + + +def FtpGet(remoteFile, out): + urllib.urlretrieve('ftp://server/path/to/file', out) + +def main(): + remoteFile = GetFtpPathDe(0) + print remoteFile + try: + urllib.urlretrieve( remoteFile, '/tmp/rinex.Z' ) + except: + remoteFile = GetFtpPathDe(-1) + print remoteFile + urllib.urlretrieve( remoteFile, '/tmp/rinex.Z' ) + + try: + os.system('7z e ' + '/tmp/rinex.Z -aoa') + os.system('rm /tmp/rinex.Z') + except: + print "extraction requires cygwin" + + +if __name__ == '__main__': + main() + diff --git a/doc/start/getrinex_us.py b/doc/start/getrinex_us.py new file mode 100644 index 0000000..b7d8c93 --- /dev/null +++ b/doc/start/getrinex_us.py @@ -0,0 +1,58 @@ +import os, sys, string +import datetime +import urllib + + +today = datetime.datetime.now() + + +def GetFtpPath(day_offset): + res = '' + res += 'ftp://cddis.gsfc.nasa.gov/gps/data/daily/' + res += str( datetime.datetime.now().timetuple().tm_year ) + res += "/brdc/brdc" + res += string.zfill( ( datetime.datetime.now().timetuple().tm_yday + day_offset ), 3 ) + res += '0.' + res += str( datetime.datetime.now().timetuple().tm_year )[2:] + res += 'n.Z' + return res + + +def GetFtpPathDe(day_offset): + res = '' + res += 'ftp://igs.bkg.bund.de/IGS/BRDC/' + res += str( datetime.datetime.now().timetuple().tm_year ) + res += "/" + res += today.strftime('%j') + res += "/brdc" + res += string.zfill( ( datetime.datetime.now().timetuple().tm_yday + day_offset ), 3 ) + res += '0.' + res += str( datetime.datetime.now().timetuple().tm_year )[2:] + res += 'n.Z' + return res + + +def FtpGet(remoteFile, out): + urllib.urlretrieve('ftp://server/path/to/file', out) + +def main(): + remoteFile = GetFtpPath(0) + print remoteFile + try: + urllib.urlretrieve( remoteFile, '/tmp/rinex.Z' ) + except: + remoteFile = GetFtpPath(-1) + print remoteFile + urllib.urlretrieve( remoteFile, '/tmp/rinex.Z' ) + + try: + os.system('7z e ' + '/tmp/rinex.Z -aoa') + os.system('rm /tmp/rinex.Z') + except: + print "extraction requires cygwin" + + +if __name__ == '__main__': + main() + + diff --git a/doc/start/sdrcfg0.txt b/doc/start/sdrcfg0.txt new file mode 100644 index 0000000..4a128e6 --- /dev/null +++ b/doc/start/sdrcfg0.txt @@ -0,0 +1,16 @@ +p 5 0 +p 8 1 +f 400.600 10 0 0 60 12000 #poprad +f 401.000 10 0 0 60 12000 #wieden +f 401.100 10 0 0 60 12000 #praga +f 401.465 50 1200 0 0 12000 #pilotSonde +f 401.500 10 0 90 60 12000 #poprad +f 401.600 10 28 30 60 12000 #? +#f 402.000 5 0 60 60 12000 #? +f 402.000 2 -6500 60 0 24000 #M10 +f 402.010 2 0 80 60 12000 #Segedyn +f 402.100 10 0 0 60 12000 #Prosciejow +f 402.200 10 0 70 60 12000 #? +f 402.300 10 0 70 60 12000 #Greifswald +#f 402.470 50 0 0 0 12000 #pilotSonde +f 402.470 30 1200 0 0 12000 #pilotSonde diff --git a/doc/start/sdrcfg1.txt b/doc/start/sdrcfg1.txt new file mode 100644 index 0000000..dad8de0 --- /dev/null +++ b/doc/start/sdrcfg1.txt @@ -0,0 +1,18 @@ +p 5 0 +p 8 1 +f 404.000 15 -6500 50 0 24000 #M10 +f 403.790 10 0 70 60 12000 #Lindenberg-DFM09 +f 403.750 10 0 60 60 12000 #Senica-DFM09 +#f 403.690 60 0 70 0 12000 # +f 403.670 10 0 60 60 12000 #Senica-DFM06 +#f 403.630 60 0 0 0 12000 # +#f 403.590 60 0 0 0 12000 # +f 403.500 10 0 0 70 12000 #Åeba +f 403.400 10 0 70 60 12000 # +#f 403.390 60 0 0 0 12000 # +f 403.350 5 0 70 70 12000 #WiedeÅ„ +f 403.100 5 0 70 70 12000 #Åeba, +#f 403.010 5 0 0 60 12000 #Budapeszt-DFM09 +f 403.000 5 0 0 70 12000 #Åeba, +f 402.870 20 0 70 60 12000 #Amberg +f 402.700 20 0 70 60 12000 #Amberg diff --git a/doc/start/sdrcfg2.txt b/doc/start/sdrcfg2.txt new file mode 100644 index 0000000..1d4f338 --- /dev/null +++ b/doc/start/sdrcfg2.txt @@ -0,0 +1,7 @@ +p 5 0 +p 8 1 + +f 405.700 10 0 70 70 #Linda +f 405.300 10 0 70 70 #Linda +f 405.100 10 0 0 70 #Linda +f 404.500 10 0 0 70 #Legionowo-RS41 diff --git a/src/Execlogin.c b/src/Execlogin.c new file mode 100644 index 0000000..e7166aa --- /dev/null +++ b/src/Execlogin.c @@ -0,0 +1,174 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +/* "@(#)Execlogin.c May 11 0:17:50 2017" */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef Execlogin_H_ +#include "Execlogin.h" +#endif +#define Execlogin_C_ +#include +#include +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#include +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#include + + + +/*FROM stat IMPORT stat, stat_t;*/ +/*, execv*/ +/*IMPORT ptty; */ +/**********************************************************************/ +/* Find a currently unused pseudo tty and open its master side; + * return-value: 0=ok, <0=error + * on successfull function return, fd will contain the file descriptor, + * and PtyName the absolute path to the master-pty in the file system */ + +static int32_t GetNewTty(int32_t * fd, char ptsname[], + uint32_t ptsname_len) +{ + int32_t res; + struct termios term; + *fd = open("/dev/ptmx", O_RDWR+O_NONBLOCK); + if (*fd<0L) osi_WrStrLn("error /dev/ptmx open", 21ul); + if (osi_getptsname(*fd, (char *)ptsname, ptsname_len)) { + osi_WrStrLn("no ttyname", 11ul); + } + /* WrStrLn(ptsname); */ + if (osic_grantpts(*fd)) osi_WrStrLn("error ptty grant", 17ul); + if (osic_unlockpts(*fd)) osi_WrStrLn("error ptty unlock", 18ul); + res = tcgetattr(*fd, &term); + term.c_lflag = 0UL; + res = tcsetattr(*fd, 0L, &term); + return 0L; +} /* end GetNewTty() */ + +/**********************************************************************/ +/* open the corresponding slave of a pseudo tty pair, adjust the + * terminal setting, redirect our stdin/out/err to this tty, and + * finalle make it our controlling terminal. + * return: 0=success, -1=failure */ + +static int32_t GetSlavePty(char name[], uint32_t name_len) +{ + int32_t fd; + int32_t res; + struct termios term; + struct termios * anonym; + int32_t GetSlavePty_ret; + X2C_PCOPY((void **)&name,name_len); + res = chown((char *)name, 0L, 0L); + res = chmod((char *)name, 384L); + /* IF setsid()<0 THEN Close(fd); RETURN -1; END; */ + /* fd:=open(name, O_RDWR+O_NOCTTY); */ + fd = open(name, O_RDWR); + if (fd<0L) { + GetSlavePty_ret = -1L; + goto label; + } + /* now adjust the terminal settings */ + res = tcgetattr(fd, &term); + { /* with */ + struct termios * anonym = &term; + anonym->c_lflag = (uint32_t)((uint32_t)anonym->c_lflag|0x8UL|0x2UL) + ; + anonym->c_oflag = (uint32_t)((uint32_t)anonym->c_oflag|0x4UL); + anonym->c_iflag = (uint32_t)(((uint32_t) + anonym->c_iflag|0x100UL|0x1UL)&~0x1000UL); + } + /* c_cflag := CARDINAL( BITSET(c_cflag)-BITSET(CLOCAL)); */ + res = tcsetattr(fd, 0L, &term); + /* create new session id, and set controlling terminal */ + if (setsid()<0L) { + osic_Close(fd); + GetSlavePty_ret = -1L; + goto label; + } + if (ioctl(fd, 21518L, 0)<0L) { + osic_Close(fd); + GetSlavePty_ret = -1L; + goto label; + } + /* and finally redirect stdin, stdout, stderr */ + if (fd) res = dup2(fd, 0L); + if (fd!=1L) res = dup2(fd, 1L); + if (fd!=2L) res = dup2(fd, 2L); + if (fd>2L) osic_Close(fd); + GetSlavePty_ret = 0L; + label:; + X2C_PFREE(name); + return GetSlavePty_ret; +} /* end GetSlavePty() */ + +/**********************************************************************/ +/* Construct an array of arguments, and execute /bin/login with it. + * 'name' contains the username, which will be passed to /bin/login. + * it may be empty, in which case login will ask for the name. + * 'host' may optionally contain the users remote hostname, which e.g. + * is displayed by the 'who' command. + * 'passwd' can be set TRUE to force skipping the password authentication. + * This requires 'name' to be non-empty. */ + +extern int32_t Execlogin_StartLogin(struct Execlogin_tEXEC * cmd) +{ + int32_t res; + int32_t PtyFd; + char PtyName[1024]; + if (GetNewTty(&PtyFd, PtyName, 1024ul)<0L) return -1L; + res = fork(); + if (res<0L) { + osic_Close(PtyFd); + return -1L; + } + if (res>0L) { + /* daddy */ + /* signal(SIGINT, SIG_IGN); */ + signal(SIGCHLD, SIG_IGN); + return PtyFd; + } + else { + /* child */ + for (res = 0L; res<=1023L; res++) { + osic_Close(res); + } /* end for */ + osic_Close(PtyFd); + /* + signal.signal(signal.SIGINT, signal.SIG_IGN); + signal.signal(signal.SIGHUP, signal.SIG_IGN); + */ + res = GetSlavePty(PtyName, 1024ul); + if (res<0L) exit(1L); + res = execv(cmd->cmdfn, cmd->args); + /* res := execve(cmd.cmdfn^, cmd.args^, NIL); */ + /* RETURN -1; */ + X2C_ABORT(); + } + return 0; +} /* end StartLogin() */ + + +extern void Execlogin_BEGIN(void) +{ + static int Execlogin_init = 0; + if (Execlogin_init) return; + Execlogin_init = 1; + aprsstr_BEGIN(); + osi_BEGIN(); +} + diff --git a/src/Execlogin.h b/src/Execlogin.h new file mode 100644 index 0000000..54519ce --- /dev/null +++ b/src/Execlogin.h @@ -0,0 +1,31 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef Execlogin_H_ +#define Execlogin_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif +#include + +struct Execlogin_tEXEC; + + +struct Execlogin_tEXEC { + char * cmdfn; + X2C_pCHAR * args; +}; + +extern int32_t Execlogin_StartLogin(struct Execlogin_tEXEC *); + + +extern void Execlogin_BEGIN(void); + + +#endif /* Execlogin_H_ */ diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..675b7cf --- /dev/null +++ b/src/Makefile @@ -0,0 +1,292 @@ +# +# Makefile for dxlAPRS toolchain containing: +# - afskmodem soundmodem for afsk/fsk up to 19200 bd using Linux OSS +# - gps2aprs aprs-tracker using some serial gps, produces axudp frames which +# may be sent with afskmodem +# - gps2digipos generates a beaconfile for a (mobile) aprs-digi, +# using some serial GPS +# - sondeudp soundmodem for RS92 (and other) wx-ballons using Linux OSS, +# the produced axudp frames are beeing post-processed by sondemod +# to generate aprs-beacons +# - sondemod RS92 (and other) wx-ballon decoder (takes data from sondeudp +# and generates aprs-beacons) +# - udpbox very powerful aprs-digi and axudp "distributor" +# - udpgate4 very powerful aprs-igate server (with http-interface) +# - udpflex interfaces serial stuff like TNC2, TNC3, KISS, RMNC +# to axudp frames +# - udphub L2 AX25 switch to process many Packet Radio clients on one +# single AXUDP interface from Flexnet, XNET, ... +# - aprsmap powerful APRS viewer based on Openstreetmap +# ---------------------- common section --------------------------------------- +HOSTARCH := $(shell uname -m | \ + sed -e s/i.86/x86/ \ + -e s/sun4u/sparc64/ \ + -e s/arm.*/arm/ \ + -e s/sa110/arm/ \ + -e s/ppc64/powerpc/ \ + -e s/ppc/powerpc/ \ + -e s/macppc/powerpc/\ + -e s/sh.*/sh/) +export HOSTARCH + +HOSTOS := $(shell uname -s) +export HOSTOS + +ifeq ($(HOSTOS),Darwin) +# Using gcc as symlink to Mac's clan +GCCVERSION_GE4 := true +STRIPFLAGS = +else +GCCVERSION := $(shell $(CROSS_COMPILE)gcc --version | \ + grep gcc | sed 's/.*gcc (.*) //g' | cut -d '.' -f 1) + +GCCVERSION_GE4 := $(shell [ $(GCCVERSION) -ge 4 ] && echo true) +STRIPFLAGS = -s +endif + +.SUFFIXES: + MAKEFLAGS += -r + +CC = $(CROSS_COMPILE)gcc +STRIP = $(CROSS_COMPILE)strip +INCL = . +ifeq ($(GCCVERSION_GE4),true) +CDEFS = -Wall \ + -Wno-unused-variable -Wno-parentheses -Wno-pointer-sign \ + -Wno-format -Wno-return-type -Wno-char-subscripts \ + -Wno-uninitialized \ + -Werror=implicit-function-declaration +else +CDEFS = -w +endif + +ifeq ($(HOSTOS),Darwin) +CFLAGS = -I$(INCL) -c -O2 -fdata-sections -ffunction-sections -I/usr/X11/include -DMACOS +LFLAGS = -L/usr/X11/lib -lX11 +else +CFLAGS = -I$(INCL) -c -O2 -fdata-sections -ffunction-sections +LFLAGS = -Wl,--gc-sections +endif +# ---------------------- armv6 (raspberry pi 1) specific ----------------------- +ifeq ($(PLATFORM), armv6tce) +EXTLIB = lib_armv6/ +XLIBS = $(EXTLIB)libpng15/libpng.a \ + $(EXTLIB)libz.a \ + $(EXTLIB)libjpeg.a \ + $(EXTLIB)libxcb.so.1 $(EXTLIB)libXdmcp.so.6 $(EXTLIB)libXau.so.6 \ + -L$(EXTLIB) -lXext -lX11 +CFLAGS += -march=armv6zk -mfpu=vfp -mfloat-abi=hard -mcpu=arm1176jzf-s +CFLAGS += -Ilib_armv6/libpng15/ -I$(EXTLIB) -I. +LFLAGS += +else ifeq ($(PLATFORM), armv6) +EXTLIB = lib_armv6/ +XLIBS = $(EXTLIB)libpng16/libpng.a \ + $(EXTLIB)libz.a \ + $(EXTLIB)libjpeg.a \ + $(EXTLIB)libxcb.so.1 $(EXTLIB)libXdmcp.so.6 $(EXTLIB)libXau.so.6 \ + -L$(EXTLIB) -lXext -lX11 +CFLAGS += -march=armv6zk -mfpu=vfp -mfloat-abi=hard -mcpu=arm1176jzf-s +CFLAGS += -Ilib_armv6/libpng16/ -I$(EXTLIB) -I. +LFLAGS += +# ---------------------- armv7hf (bur am335x pp) specific --------------------- +else ifeq ($(PLATFORM), armv7hf) +EXTLIB = lib_armv7hf/ +XLIBS = $(EXTLIB)libpng.a \ + $(EXTLIB)libz.a \ + $(EXTLIB)libjpeg.a \ + $(EXTLIB)libxcb.so $(EXTLIB)libXdmcp.so $(EXTLIB)libXau.so \ + -L$(EXTLIB) -lXext -lX11 +CFLAGS += -march=armv7-a -mfpu=neon -mfloat-abi=hard +CFLAGS += -I$(EXTLIB) +LFLAGS += +# -------------------------- x86_64 specific ----------------------------------- +else ifeq ($(HOSTARCH), x86_64) +TARGETS = aprsmap-static +XLIBS = -lpng -ljpeg -lXext -lX11 +APRSMAP_STATIC = aprsmap-$(HOSTARCH) +ifeq ($(PLATFORM), x86_32) + CFLAGS += -m32 + LFLAGS += -m32 + APRSMAP_STATIC = aprsmap-x86 +endif +# -------------------------- x86_32 (default) specific ------------------------ +else ifeq ($(HOSTARCH), x86) +TARGETS = aprsmap-static +EXTLIB = /usr/lib/i386-linux-gnu/ +XLIBS = $(EXTLIB)libz.a \ + $(EXTLIB)libjpeg.a \ + -lpng -lXext -lX11 +APRSMAP_STATIC = aprsmap-$(HOSTARCH) +else +XLIBS += -lpng -ljpeg -lXext -lX11 +endif +# ------------------ objects enumeration ------------------ +OBJ_COMMON = \ + Select.o \ + aprspos.o \ + aprsstr.o \ + osic.o \ + osi.o \ + soundctl.o \ + tcp.o \ + udp.o + +OBJ_AFSKMODEM = \ + afskmodem.o \ + afskmodemptt.o + +OBJ_GPS2APRS = gps2aprs.o +OBJ_GPS2DIGIPOS = gps2digipos.o + +OBJ_SONDEMOD = \ + geodesy.o \ + gps.o \ + gpspos.o \ + navigation.o \ + rinex.o \ + sem.o \ + sondeaprs.o \ + time_conversion.o \ + yuma.o \ + sondemod.o + +OBJ_SONDEUDP = sondeudp.o \ + rsc.o \ + rsc_decode.o + +OBJ_UDPBOX = udpbox.o +OBJ_UDPGATE4 = udpgate4.o +OBJ_UDPFLEX = udpflex.o +OBJ_UDPHUB = udphub.o +OBJ_APRSMAP = \ + aprsdecode.o \ + aprsmap.o \ + aprstat.o \ + aprstext.o \ + beep.o \ + maptool.o \ + pngread.o \ + pngwrite.o \ + jpgdec.o \ + useri.o \ + xosi.o + +OBJ_SDRTST = tcpb.o sdr.o sdrtest.o +OBJ_SDRRADIO = tcpb.o sdr.o radio.o +OBJ_L2CAT = l2.o frameio.o deflate.o Execlogin.o cleanup.o l2cat.o +OBJ_ADSB2APRS = adsb2aprs.o tcpb.o + +TARGETS += \ + afskmodem \ + gps2aprs \ + gps2digipos \ + udpbox \ + udpgate4 \ + udpflex \ + udphub \ + sondemod \ + sondeudp \ + aprsmap \ + sdrtst \ + sdrradio \ + adsb2aprs + +ifneq ($(HOSTOS), Darwin) + TARGETS += l2cat +endif + +OBJS = \ + $(OBJ_COMMON) \ + $(OBJ_AFSKMODEM) \ + $(OBJ_GPS2APRS) \ + $(OBJ_GPS2DIGIPOS) \ + $(OBJ_SONDEMOD) \ + $(OBJ_SONDEUDP) \ + $(OBJ_UDPBOX) \ + $(OBJ_UDPGATE4) \ + $(OBJ_UDPFLEX) \ + $(OBJ_UDPHUB) \ + $(OBJ_APRSMAP) \ + $(OBJ_SDRTST) \ + $(OBJ_SDRRADIO) \ + $(OBJ_L2CAT) \ + $(OBJ_ADSB2APRS) + +# ------------------- target make rules ------------------- +# ----------------- +%.o: %.c + @echo [compiling] $@ + @$(CC) $(CDEFS) $(CFLAGS) -o $@ $< + +all: $(TARGETS) + +clean: + rm -f $(OBJS) $(TARGETS) aprsmap-x86 aprsmap-x86_64 + +afskmodem: $(OBJ_AFSKMODEM) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o afskmodem $(OBJ_COMMON) $(OBJ_AFSKMODEM) -lm + $(STRIP) afskmodem $(STRIPFLAGS) + +gps2aprs: $(OBJ_GPS2APRS) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o gps2aprs $(OBJ_COMMON) $(OBJ_GPS2APRS) -lm + $(STRIP) gps2aprs $(STRIPFLAGS) + +gps2digipos: $(OBJ_GPS2DIGIPOS) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o gps2digipos $(OBJ_COMMON) $(OBJ_GPS2DIGIPOS) -lm + $(STRIP) gps2digipos $(STRIPFLAGS) + +sondemod: $(OBJ_SONDEMOD) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o sondemod $(OBJ_COMMON) $(OBJ_SONDEMOD) -lm -L/usr/lib/i386-linux-gnu -lssl -lcrypto -lcurl + $(STRIP) sondemod $(STRIPFLAGS) + +sondeudp: $(OBJ_SONDEUDP) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o sondeudp $(OBJ_COMMON) $(OBJ_SONDEUDP) -lm + $(STRIP) sondeudp $(STRIPFLAGS) + +udpbox: $(OBJ_UDPBOX) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o udpbox $(OBJ_COMMON) $(OBJ_UDPBOX) -lm + $(STRIP) udpbox $(STRIPFLAGS) + +udpgate4: $(OBJ_UDPGATE4) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o udpgate4 $(OBJ_COMMON) $(OBJ_UDPGATE4) -lm + $(STRIP) udpgate4 $(STRIPFLAGS) + +udpflex: $(OBJ_UDPFLEX) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o udpflex $(OBJ_COMMON) $(OBJ_UDPFLEX) -lm + $(STRIP) udpflex $(STRIPFLAGS) + +udphub: $(OBJ_UDPHUB) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o udphub $(OBJ_COMMON) $(OBJ_UDPHUB) -lm + $(STRIP) udphub $(STRIPFLAGS) + +aprsmap-static: $(OBJ_APRSMAP) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o $(APRSMAP_STATIC) $(OBJ_APRSMAP) $(OBJ_COMMON) \ + $(XLIBS) -lpthread -lxcb -lXau -lXdmcp -lm -lpthread -ldl -lz \ + -static + $(STRIP) $(APRSMAP_STATIC) $(STRIPFLAGS) +aprsmap : $(OBJ_APRSMAP) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o aprsmap $(OBJ_APRSMAP) $(OBJ_COMMON) $(XLIBS) -lm + $(STRIP) aprsmap $(STRIPFLAGS) +aprsmap-cleanobj: + rm -f $(OBJ_APRSMAP) $(OBJ_COMMON) + +sdrtst : $(OBJ_SDRTST) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o sdrtst $(OBJ_SDRTST) $(OBJ_COMMON) -lm + $(STRIP) sdrtst $(STRIPFLAGS) + +sdrradio : $(OBJ_SDRRADIO) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o sdrradio $(OBJ_SDRRADIO) $(OBJ_COMMON) -lm + $(STRIP) sdrradio $(STRIPFLAGS) + +l2cat : $(OBJ_L2CAT) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o l2cat $(OBJ_L2CAT) $(OBJ_COMMON) -lm + $(STRIP) l2cat $(STRIPFLAGS) + +adsb2aprs: $(OBJ_ADSB2APRS) $(OBJ_COMMON) + $(CC) $(LFLAGS) -o adsb2aprs $(OBJ_ADSB2APRS) $(OBJ_COMMON) -lm + $(STRIP) adsb2aprs $(STRIPFLAGS) + +diag: + echo $(HOSTARCH) + +# end of makefile diff --git a/src/NEW-aprs.txt b/src/NEW-aprs.txt new file mode 100644 index 0000000..e8ea91b --- /dev/null +++ b/src/NEW-aprs.txt @@ -0,0 +1,141 @@ + +afskmodem +--------- +22.6.2013 + + Timeout fuer Frames im Sendepuffer, default auf 60s, sollte aber fuer aprs + mit -T bei den Modem Parametern auf 5 bis 15s gestellt werden + damit bei Ueberreichweiten oder nach sonstigem Dauer-DCD keine "historischen" + Frames abgesetzt werden. Sehr kurze Zeit hilft durch Sendeverzicht dynamisch + stark belegten Kanal zu entlasten. + + +udpgate4 +-------- +9.7.2013 + + tcp connect zu AprsIs auf NODELAY, also werden nimmer mehrere Zeilen + zu einem tcp Frame zusammengfasst. Macht etwas mehr Krach am Netz aber + ist paar ms schneller. Laut aprs.fi so gewollt. + + Der (-T) 15s-Verzoegerungs-Check ist nun beim allen outgoing Connects weils + zuvor den Check auf den Test-connect (ob ein bevorzugter Server wieder geht) + umgschatet hat und der eigentlich laufende Link dann unbeobachtet haengen konnte. + + WWW-Heard Liste nun nach Call, Port, Uhrzeit, Framezahl, und QRB auf + und absteigend sortierbar. Anklicken der Spalte in der Kopfzeile schaltet + auf das jeweilige Sortierkriterium, nochmal anklicken invertiert. + Der Zustand wird wie bei der Reload-Zeit im url gespeichert, es gibt weder + cookies noch ip Nummern speicherung. Einschraenkung: die getestenten Brauser + verwursteln den sortier-Schalter beim einstellen einer neuen Reload-Zeit + also bei Bedarf Zeit vorher eingeben. + +11.7.2013 + + WWW-Link mit Klick auf ein Call in der Heard Liste mittels File "calllink.txt" + im www Server root directory (-D). Es gilt nur die 1. Zeile im File. + Beispiel fuer findu.com, db0anf oder aprs.fi: + +"http://www.findu.com/cgi-bin/raw.cgi?call=$c" target="_blank" + +"http://www.db0anf.de/app/aprs/stations/basic?call=$c" target="_blank" + +"http://aprs.fi/?c=raw&call=$c&limit=5&view=decoded" target="_blank" + + $c wird ersetzt durch das angeklickte Call, $$ wird zu $. + Es koennen HTML link Optionen angegegen werden, hier zB. target="_blank" + fuer oeffnen eines neuen Tab oder Fenster. + + Mit diesen URLs zuerst eine kleine www-Seite oeffnen zum Auswaehlen von + Servern waere praktisch. + + +udpbox +------ +24.7.2013 + + Im Digimodus (-d) werden Messages zu sich selbst (from=to) nicht mehr gesendet. + + +udpgate4 +-------- +26.7.2013 + + MH-counter Tabelle von 8 auf 16 Bit erweitert. Aufgrund der sortierbaren + Liste werden lange Speicherzeiten bevorzugt und bei schnellen Baken liefen + die einzelnen (mhzeit/48) Zaehler in die Begrenzung. + + +30.7.2013 + + Eingestellte bit/s fuer Messages net>rf (-R -M) werden auf der www Seite + unter "Connects" "UDP" txport "Range Filter" angezeigt. + + +7.10.2013 + + Ziffer+Buchstaben ist kein "Call" mehr und daher geht keine Messages von dem + Absender in den Speicher. Geht aber in Echtzeit als 3rd-Party-Frame raus, da + nicht-Call-Absender wie WHOIS oder WLNK zu direkt gehoerten Usern muessen. + + Logserver: -r schreibt 24h rawlog in je ein File mit Datum am + Filenamen hinten dran. + + +3. 2. 2014 (v 0.50) + + Gate to Rf, wenn von Rf empfangen zeige (original APRS101.pdf) den via Pfad + soweit er durchlaufen is. Wenn via TCPIP, Pfad entfernen (aprs.fi). + Gate to Rf >0km sende Messages (ausser an sich selber) wenn das Ziel via + gehoert aber nicht direkt gehoert. + +src path gate to rf gate to net msg to rf msg from net msg via msg dir +------------------------------------------------------------------------------------ +net + + 1) + +net igatecall 1) +net RFONLY 1) +net NOGATE + +net TCPXX + +net TCPIP + + 1) + +net qA? + + 1) + +------------------------------------------------------------------------------------ +rf + + 2) +rf igatecall +rf RFONLY + +rf NOGATE + +rf TCPXX +rf TCPIP + +rf qA? + +------------------------------------------------------------------------------------ +1) if source is non-call (WINLINK WHO-IS...) and destination heard direct +2) if source heard direct else to msg via + + + + + + +gps2aprs: +--------- +1.11.2013 + + Zeit (ddhhmm oder hhmmss) oder File in Kommentar einfuegen + + +udpbox +------ +21.1.2014 + \\rm als Macro in einer Bakenzeile loescht das Bakenfile, + der Inhalt wird also genau 1x gesendet. + Das verschwundene File kann als Handshake zu einem Task + dienen, wieder neuen Inhalt zu generieren. + + -P piggyback-beacon, Baken werden maximal um diese Zeit + frueher gesendet als der Bakentimer eingestellt ist + sofern gerade ein anderer Frame gesendet werden soll. + Zweck ist die Bake direkt an den anderen Frame dran + ohne extra Txdelay und Kollisionswahrscheinlichkeit + zu senden. + + -S laesst die (default ausgefilterten) Msg an sich selbst durch. + diff --git a/src/NEW-aprsmap.txt b/src/NEW-aprsmap.txt new file mode 100644 index 0000000..d46c247 --- /dev/null +++ b/src/NEW-aprsmap.txt @@ -0,0 +1,874 @@ ++ libpng und libz statisch dazu gelinkt + ++ font symbol und osm karten nun im png format + ++ 4 kursor tasten zum karte verschieben und backspace fuer letzte position(en) + (sofern die bei allen x11 gleichen hexcode haben) + ++ osm karten in unterverzeichnissen nach zoom faktor 1..16 + vorhandene maps loeschen oder einsortieren + ++ wenn tiles fehlen wird sofern vorhanden die mit dem naechste zoomfaktor gedehnt eingesetzt + ++ ./gm.sh starten bzw anpassen nach bedarf zum karten holen + ++ linke maus auf karte klicken oder auf track oder symbol offnet menue + viele funktionen mit klick erreichbar aber noch nicht alle + menues noch chaotisch aber mal zum testen + ++ wetter grafik + statistik auf x11 abrufbar + ++ ESC taste zum menues schliessen + ++ funktion der klicks auf symbol/text/map/track getrennt konfigurierbar + ++ 5 watch calls (ohne wildcard) statt "follow car" + ++ wetter symbol etwas besser anklickbar (symbols.png) + (alpha kanal nach heller verschoben, sollte mal nach 255 wenn alle symbole dafuer adaptiert) + ++ rechte maustaste = BACKSPACE (back in zoom/pan-history) (bei www version lokal back am browser) + ++ map move steps teil der fenstergroesse + + +6.1.2013 + ++ marker auf "Next click to Map": ohne einrasten auf symbole + "Next click to Symbol oder Text": mit einrasten auf genaue position wenn vorhanden + ++ marker loeschen und keycode "@" + ++ zoom to markers wieder da "Y" + ++ kmh histogramm und animation entsprechend der eingestellten sichtbarkeits zeit des tracks + ++ blaue popup menues sortiert nach der groesse angereiht von links oben + ++ "Expandes Tiles" geht auch weg wenn alle tiles 1:1 + ++ call in die watchlist mit click + + +7.1.2013 + ++ Taste "@" umgewidmet auf "on click" Reset + ++ Taste ":" loescht beide Marker + ++ 30s langer Retry Mechanismus zum Tiles Laden, + sobald "gettiles" geloescht, je Sekunde 1 Ladeversuch aller benoetigten oder expandierter + Tiles und was fehlt oder "png error" hat wird erneut im "gettiles" angefordert. + + +7.1.2013 + ++ Tasten "<" und ">" entsprechend "Debug Track" raw+decoded Text der Waypoints oder Baken + durchsteppen und setzt Marker 1 + ++ Backspace history size 20 statt 10 + +10. 1. 2013 + ++ Tasten < > getauscht und Textinfo bleibt sichtbar + ++ Click to WxSymbol neu und dort dann entweder 1 nicht-Wetter Messwert oder beliebig viele + Wetterwerte zugleich ein/aus schaltbar (Menue bleibt offen) + + +14. 1. 2013 + ++ Letzter Wettermesswert in der Kopfzeile der Wettergrafik + ++ Wettergrafik passt sich der Fensterbreite an (ab 320 Breite) + ++ Raw+Decoded Fenster bleibt trotz "Marker to Klick" Messdaten Fenster offen + + +16. 1. 2013 + ++ Decodiert positionless Wx Daten + ++ Decodiert negative NN im "/A="-Format + ++ Zoom to Markers geht auch bei Zoomlevel>14 + ++ Fractional Map Zoom rechnet etwa 2x so schnell und richtiger + ++ Shift-Taste bei Map Move macht 1/10 Schrittweite + ++ Shift-Taste bei Zoom (derzeit nur mit Maus) macht 1/10 Zoom Schritte + + +20. 1. 2013 + ++ Klick auf Track mit Raw+Decoded fuer den Geklickten Wegpunkt + ++ Raw+Decoded mit Wegpunkt Nummer / Gesamtpunkte zur Orientierung wo man ist + ++ Cut + Paste Puffer wird mit angeklicktem Call gefuellt + ++ Paste in Texteingabefelder + +- leider geht beides nicht nach aussen weil die fenster heute mit "selections" + miteinander telefonieren und das ist etwa so aufwendig wie das gesamte interface + zum X11 bis jetzt + ++ (derzeit noch nicht ein/ausschaltbares) Textfenster mit Scrollbalken fuer lange + Texte. Zum Test mit Rawdaten von tcp connect. + +- nach 4 Tagen Suche noch nicht gefunden wie man Kill des Fensters abfangen kann + ohne dass dabei alles abschmiert. Da auch die ganzen Xlib Aufrufe zum Text + reinzeichnen keiner auf Windoof/sontswas portieren wird, wirds wieder abgeschafft. + + +26. 1. 2013 + +- Textfenster mal wieder weg + ++ rawlog File wird nun auch nach dem Einlesen geschlossen und wie bisher beim Schreiben + fuer jede Zeile neu geoeffnet + ++ Marker 1 zu klick misst, wenn genau 1 objekt mit klick erfasst wird mit Einrasten + auf dieses, wenn "on next click set marker 2" immer ohne Einrasten + +3. 2. 2013 + ++ (minimierbare) fixe Toolbar (die minimierte verdeckt noch manchmal Text Messages) + ++ Popup Menues ausgemistet, z.B "Show All" nur wenns nicht schon ist + ++ Von den neuen Kommandos aus der Toolbar gehen erst ein paar wirklich (W V Q S) + Messages, Listen, Config noch nicht + + +6. 2. 2013 + ++ Fahrtrichtungspfeil + Windfahne bei Wx Symbol, 20kmh pro Strich + beides als Teil vom Symbol anklickbar und abschaltbar + + +10. 2. 2013 + ++ Auswahl ob Toolbar oder Popup Fenster, damit beim Start normale Toolbar da ist. + Muss noch optimiert werden was in welchem Menue sein soll und was offen bleibt + oder verschwindet. Histogramme verdecken die Pulldown Menues aus der Toolbar. + ++ Hoehenangabe bei den Symbolen, noch nicht abschaltbar weil alle Symbol-Attribute + ab einem einstellbaren Wert (mindest meter, km/h) konfigurierbar erscheinen sollten. + + +13. 2. 2013 + ++ Text Editor mit Scrollen fuer Config und (wenn fertig) Messages, Parameter werden + erst einzelne ausgewertet + ++ Screenshot mit Filename + ++ rawlog einlesen mit Filenamen (Datum Eingabe noch nicht ausgewertet) + + +16. 2. 2013 + ++ Watch Calls per Click suchen freien Platz in der Liste weil jetzt tastaturlos + auch wieder abschaltbar + ++ Watch Calls mit * als Wildcard + ++ Setzen der Start Map Position auf Bildmitte per Lokator, Long/Lat, oder mit "?" + im Config und dann Marker 1 setzen auf der Map + ++ eigene Position im Config auch mit "?" mit Marker 1 uebertragbar. + ++ Config File Speichern/Laden beim Start verwenden und automatisch bei Quit + Speichren + +- fehlt noch Auswerten einiger Config Parameter zb Helligkeiten und "next click to Wx" + + +15. 2. 2013 + ++ Ausser Igate/Network und LogDatum Configs sollten alle gehen und gekoppelt sein mit den + Schiebereglern. Manche Werte, die beim teilweise eingegeben sein Unfug machen, werden + erst bei "Save" "Reload" oder Start ausgewertet. + + +28. 2. 2013 + ++ Bei Click auf Pixel das zu mehr als 1 Objekt gehoert, werden die gefundenen Objekte + bei jedem weiteren Click der Reihe nach an die 1. Stelle cykliert + ++ Logfile Import mit Datum + ganze Stunde + ++ Netbeacon aus Configparametern damit per Modem empfangenes ein Symbol fuer MH hat + (noch nicht per tcp gesendet) + + +3. 3. 2013 + ++ Objekte Loeschen + ++ Filtern von Call, Igate, Objekt/Item-Absender (erst mal ohne Wildcards) + + +7. 3. 2013 + ++ transparente Menues oder schwarzer oder grauer Hintergrund + (Config Transparency 2..100, 1, 0) + ++ Config Baken Symbol mit Auswahlmenu ("My Symbol" clicken) + ++ Objekt loeschen mit DEL-Taste + + +17. 4. 2013 + ++ Nach wochenlangem Kampf mit den Windoof Compilern ist nun etwa Gleichstand bei der + Win32 Version und es kann wieder am gemeinsamen Teil weiter gebaut werden. + Die innere Struktur ist etwas umgekrempelt zwecks minimiertem systemabhaengigen + Teil. Leider hat sich die "Tile" Filestruktur (mit schnell mal 3500 Files in einem + Verzeichnis) am Win als Bremse erwiesen und daher ist noch eine Unterverzeichnis- + Ebene dazu gekommen und die Struktur nun gleich wie auf den Servern und "Marble". + Zum Konvertieren der vorhandenen Maps ist das "rentile" script dabei das man + noch anpassen muss und mit der Kommandozeile, die drin angegeben ist, Aufrufen. + Es wird nix geloescht nur kopiert. "gm.sh" ist auch darauf angepasst. + ++ Neu sind nur ein paar Filter im Config und fuer Besitzer eines Mausrades damit Zoomen + und Pull der Map mit der mittleren Maustaste. Fuer Touchpad-geschaedigte muss man sich + noch eine Alternative mit Shift/Alt oder Klick auf die leere Map ausdenken. + Screenshot geht nun auch als "bmp" wenns File .bmp heisst. + + +17. 4. 2013 + ++ Pull Map auch mit linker Maustaste auf leere Map (configurierbar ?) + ++ Shift + Click to Map: Set Marker 1 (configurierbare andere kommandos ?) + ++ On next Click to Wxsymbol: Raw+Decoded zu den Wettergrafiken dazu einschaltbar + + +20. 4. 2013 + ++ tcp Connect zum Server mit neuer Syntax, -g :[#] -g 44.143.100.1:14580#m/300 + MYCALL und PASSWORT jetzt schon aus dem Config statt -s -p + ++ Netzbake: "File" > "Config" -> Mycall, MyPos, Net Beacontext, My Symbol, + Netbeacontime mit Enable, PassCode mit Enable + My Symbol Anklicken fuer Auswahl + My Position "?" an 1. Stelle und dann Marker 1 Setzen + + +29. 4. 2013 + ++ tcp Connect nun probisorisch im File>Config, wenn man editiert gruen ausschalten und wenn + fertig wieder ein. + ++ auf Wunsch Massstab auf der Karte (noch nicht schaltbar) und auch problematisch wegen + nicht entfernungstreuer Merkator Karten bei kleinem Zoom + + +4. 5. 2013 + ++ Vorschlag von dl8rdl eingebaut, Maps Download im Hintergrund komplett fuer das sichtbare + Fenster von Zoom 1 bis einstellbarem maximalen Zoom mit Vorkalkulation der Datenmenge, + abbrechen, weitertun, und Fortschrittsanzeige. + ++ Messages empfangen (derzeit erst von tcp) + + +6. 5. 2013 + ++ "DAO"-Erweiterung in Frame-Decoder eingebaut zum Position auf etwa 20cm genau uebertragen + und auch genauere Auswertung vom GPS-raw-Format und Anpassung der Rundung auf Feldmitte + (leider ist die fliesskomma Genauigkeit nur etwa 1-2m) + + +8. 5. 2013 + ++ Mehr Status Meldungen von "on/off" Schaltern und (Shortcut) Funktionen + ++ legt "map.y4m" auch auf Linux neu an wenn nicht (zB. als named-pipe) vorhanden, + meldet Schreibvorgang, refresht alle 1s den Bildschirm und ist abbrechbar. + ++ Buttons mit noch nicht implementierter Funktion melden das. + ++ Im Screenshot Filenamen wird "%t" durch Datum-Uhrzeit und %n durch "000" bis "999" + ersetzt bis der Filename neu ist. + ++ Shortcut Tasten Liste im + + +10. 5. 2013 + ++ 4 direkt waehlbare Map Positionen + Zooms im Zoom-Menue oder per "1..4" Tasten. + Dabei kann entweder der Zoomlevel oder die Position oder beides abgerufen werden. + Der Eintrag dieser "Views" kann manuell im File>Config>View durch "Zoomfaktor Position" + (wobei Position auch ein QTH-Lokator sein kann), oder eines von beiden, oder viel + schneller durch "Shift" + Click auf einen der 3 "Views" im Zoom Menue erfolgen. + Dabei wird die aktuelle Karten-Position mit Zoom gespeichert. + Shortcuts anders: "1" (one user) nun "." + "2" +rf nun "=" + "On next click" neu einstellen erforderlich + + +12. 5. 2013 + ++ Tooltipps mit Text aus externem File "hints.txt" und schon etlichen Texten drin. + Darf natuerlich verbessert oder uebersetzt werden wobei das Ergebnis der Arbeit + sofort aktiv ist sobald das hints.txt gespeichert ist. + |Buttonnummer Text + die fehlenden Texte werden als " hint text" gezeigt + die Struktur des File>Config wird noch umgebaut daher mit den hints dafuer abwarten + + + +15. 5. 2013 + ++ "Zitter"-Toleranz fuer Mausposition innerhalb der die Hints sichtbar bleiben ++ Zeigt aktuelle "Mbytes written" des Video Files ++ List>Internals zeigt System Zustand ++ "L" Shortcut nun "toggle Labels on/off" Labels=Text bei den Symbolen ++ Fine Zoom Steps im Config + + +17. 5. 2013 + ++ "L" und "O" bzw "Labels off" "Objects off" wird nun nimmer in Form von 0% Helligkeit + im Config verewigt + ++ In Vorbereitung auf ein Text-Fenster kommt nun mal List>Messages und List>Bulletins + auf das Start Terminal Fenster raus, wobei die Bulletins noch nach + Absender/Eintreffzeit sortiert sind und nicht nach der BLN + ++ Angeklickte Objekte kann man in Infos>List Raw oder Infos>+Decoded auf das Textfenster + auflisten lassen (ohne farbige Fehlermeldungen) + + + +18. 5. 2013 + ++ Config>Show Incoming "n" Zeigt TCP-Frames auf dem Textfenster, "n+" Dekodiert + fuer die Radio Ports entsprechend 1 2 3 ... und 1+ 2+ ... Dekodiert + + + +21. 5. 2013 + ++ Raw+Decoded Sprechblase aktualisiert sich mit ankommenden Daten falls sie den letzten + Wegpunkt anzeigt + ++ Delete Waypoint, wenn mit Debug oder Raw+Decoded markiert. Mit DEL-Taste zum entfernen + von (falschen) Wegpunkten. Marker 1 springt dann zum naechsten (vermutlichen) Fehler weiter. + (Wann alles loeschen oder nur Waypoint muss noch besser definiertbar sein) + ++ Hoehe wird auch bei Symbolen ohne km/h Daten angezeigt falls Hoehendaten vorhanden und + eingeschaltet. + + + +23. 5. 2013 + ++ UDP-Port im Config (erst mal 1 Stueck) ++ Fenstergroesse veraendern schneller ++ Trackfilter Fehlererkennung verbessert ++ Bei Debug Funktionen Verzoegerungszeit von doppelten Waypoints in Sekunden sichtbar + + + +29. 5. 2013 + ++ Zwecks schnellem Tracks Debuggen mit "E" oder File>Infos>Waypoints-Button toggelt + alle, oder nur die als verdaechtig markierte Waypoints anzeigen mit den "<"">" Tasten + oder den Buttons daneben. + ++ rawlog mit lesbarem Datum/Zeitstempel, das alte Format wird lesend auch akzeptiert. + ++ axudp-kiss (usb)seriell Interface (udpflex) erweitert, sodass nebst an/abstecken von + usb-Seriellen auch ein resetteter TNC2 an empfangenen (nun nicht mehr kiss) Daten + erkannt und wieder auf kiss geschaltet wird. Geht mit init File auch fuer andere TNC + wie in THD7x oder TMD7x. + udpflex (linux), udpflex.exe (win32) + + +8. 6. 2013 + ++ Configurierbare default Speed fuer Animation ++ Parkplatzzittern-Erkennung fuer Animation Startzeit verbessert ++ Source Code Entruempelung zum einfacheren Compilieren fuer verschiedene Prozessoren + + +15. 6. 2013 + ++ km/h und/oder Hoehe in Animation und Video wobei Lesbarkeit bei schneller Aenderung + noch verbessert werden kann. ++ Uhrzeit beim Log schreiben laeuft nun auch waehrend Animation in Echtzeit. ++ +-24h Zeitversatz Systemzeit/angezeigte Zeit einstellbar + + + +5. 7. 2013 + ++ Objekte mit extra "keep in memory time" zB um den schon nach 5 bis 6h recycelten + Blitz-Object-Namen keinen Track erzeugen zu lassen. + ++ Logfile browsen geht gleichzeitig mit online Betrieb. Dazu wurde eine zweite + Uhrzeit geschaffen die den Logdaten folgt und die Echtzeit Daten werden unabhaengig + von den Logdaten (wie sonst auch) im RAM und writelog gepspeichert. + Es kann jederzeit zwischen Log und Echtzeit gschalten werden und in den Logdaten + an Anfang, Ende, und in "Fullbright" Zeitspruengen vor und zurueck gegangen werden + womit immer alle Daten einmal sichtbar sind. + ++ Status Bar zeigt Betriebszustand, erst mal experimentell zum sehen was man braucht + mit Buchstaben bis Symbole entworfen sind. Bei TCP (Internet) und und UDP (Funk) + wandert die Farbe von gruen nach rot binnen 1 Min. solang keine Daten ankommen. + Message soll mal anstatt dem Popup Fenster vorhandene Messages anzeigen und erst bei + draufklicken Inhalt zeigen. + + +16. 7. 2013 + ++ Hoehen Diagramm ueber Wegstrecke, mit Trackfiler on "F" wird versucht die manchmal + ungenaue Hoehenmessung etwas glatt zu buegeln. + ++ Beim Track anklicken wird der Wegpunkt ausgewaehlt der der Klickpunkt am naechten + liegt. + ++ Popup Meldungen, die Befehle bestaetigen, werden nach ein paar Sekunden wieder + entfernt. Da, um CPU Zeit zu sparen, der Bildschirm nur aktualisiert wird wenn neue + Daten kommn, geschieht das Loeschen nur im Zuge einem Updates. + + + +19. 7. 2013 + ++ "On Next Click To Track" mit Speed oder Altitude aktiviert, setzt eine Marke auf + dem Diagramm, die der angeklicken Stelle am Track entspricht. + ++ "On Next Click To Track" kann mit 1 Click Wegpunkt loeschen aktivert werden. + ++ Ein angewaehltes Objekt kann mit "Save" als Logfile mit dem Filenamen des Objekts + gespeichert werden (derzeit nur im Startverzeichnis). Existiert das File, wird + hinten dran geschrieben. Es werden alle Daten aus dem RAM geschrieben auch wenn + mit Trackfilter oder Fullbright Time ausgeblendet. + Manuell geloeschte Baken/Wegpunkte sind weg. + + +22. 7. 2013 + ++ Video/Animation Speed Einstellbereich erweitert von 1:1 (Echtzeit) bis 200s/Frame + womit die Speed-Zahl statt (Echt-)Sekunden zu Frames jetzt multiplikator fuer + Echtzeit ist. ++ Start Delay fuer beschleunigte Darstellung (wenn sich nichts bewegt) einstellbar + ++ Log Import fuer ein Call wobei immer auf eine Zeitspanne gesucht wird in der das + Call aktiv war (keine wildcards) + + +25. 7. 2013 + ++ "On Next Click" mit mehreren Optionen gleichzeitig (wo es Sinn macht). + + +9. 8. 2013 + ++ Durch erweitern der Menue-Darstellung auf Tabellen mit Farben und verbessern des + Zeilen-Editors (Maus kann Cursor setzen ...) ist Messages erstellen und verwalten + moeglich geworden. Empfangene Messages sind noch ohne Tabelle. + + +2. 9. 2013 + ++ Nach komplettem Umbau des Konfigurations-Tools mit dynamischer Anzahl der + Eintraege geht nun Messages senden, mehrere Aprs-Server-urls die abgeklappert + werden bis einer antwortet, beliebig viele Watchcalls, Filtereintraege, Baken... + Der Texteditor kann Insert/Overtype und Cursor setzen mit der Maus. + Mit Shift-Linksklick auf die Karte wird die Position in die Editorzeile + kopiert (jetzt einfach wiederholbar bis man "getroffen" hat) + (Die eigene Position und die Zoom>"Views" muessen neu eingegeben werden) + ++ Die aktuelle Fenstergroesse wird im Konfigfile mit gespeichert. + "View 1" wird beim Programmstart dargestellt. + (speichern der aktuellen Ansicht mit Shift-Linksklick im Zoom-Menue) + ++ Nach der Frage "was brauch ich alles um online zu gehn" ist dies nun in + einem Menue. Dabei kann man abgestuft von ganz ohne Call bis Call und eigene + Position nur dem Server sagen (zwecks funktionieren der m/... Filter) bis + Bake und Messages ins Netz senden konfigurieren. + ++ Igate-Funktion ist nur in der Linux Version vorhanden da das Win-tcp-System + keine Info ueber bestaetigte Daten hat und dann einen als "haengend" erkannten + Link nicht terminieren kann, ohne die veralteten Daten noch rauszuweinen. + Das waere im aktuellen AprsIs-Netz ohne Timestamps nicht mehr akzeptabel. + Auch die Linux Igate-Funktion sollte auf keinen Fall fuer einen Digi verwendet + werden da zB. beim Logfiles durchsuchen die Durchlaufzeit erheblich werden kann. + Fuer Igate gibts ohnhin ein eigenes Tool. + ++ UDP-Ports fuer Funk rx/tx mit Soundmodem oder mittels "udpflex" (USB)seriellen + TNC gibts derzeit 4. Eine dynamische Anzahl braucht noch Aufwand bei den + Schaltknöpfen in den Menues. + + Der Funk-Baken/Objekt/Items-Editor ist noch in Entwicklung, dort dann auch + wieder die verschwundene "Rfbeacomtime" fuer jede Bake extra. + (bis da hin 1 Bake manuell ins aprsmap.cfg) + + + + +4. 9. 2013 + ++ Baken senden mit Macros fuer Uhrzeit und File einfuegen (Wetterbake). Jede Bake + mit Port und Intervall Angabe und Zielport geht auch Net. Mit Beacons Shift Time + wird die Startzeit jeder weiteren Bake so verschoben, dass sie nicht innerhalb der + "dupe delete" zeit (meinst 57s) der Igates landen. + Syntax: intervall(s):port:rawformat 600:1:NOCALL>CQ:>test + \\z tag+zeit, \\h zeit, \\:filename:, \\\ \\ + + +8. 9. 2013 + ++ Maus Hint Texte verbessert und deren Erscheinen an der Status Bar. ++ User Infos erweitert, gefahrene km, Zaehler fuer Baken, Messages, Acks, Rejects + + + +9. 9. 2013 + ++ "Show Objects of Sender" zeigt alle (anderen) Objekte und Items von dem Absender + des Ausgewaehlten Objekts auf einer dafuer gezoomten Karte unter "Info>Objects of.." + ++ Shift-Click auf die Status-Bar (die bunten Laempchen) oeffnet direkt das zugehoerige + Config-Menue soweit Sinnvoll. + + +11. 9. 2013 + ++ Menue Positionierung korrigiert und Menues nimmer schliessen bei Shift-Click + auf Map zum Position in Editor Zeile kopieren + + +13. 9. 2013 + ++ Statusbar Netzwerk-Buttons Mouse-Over wenn nicht online normale Hints, + wenn online, Status Info. X/N zeigt offline/online (sollten mal Symbole werden) ++ "w" Temperatur-Karte wie bisher, "W" (w mit Shift) Regen-Karte mit blau fuer + 24h und rot fuer aktuellen Regen (noch ohne Fehlerfilter, luegende Stationen + anklicken und mit DEL entsorgen). + + +16. 9. 2013 + ++ Logfile lesen mitn Binaersuche fuer den Anfang ab wo ins RAM eingelesen wird + mit dem Vorteil, dass auch lange Logs beim Programmstart und Log Import schnell + nach Datum durchsucht sind, aber das Logfile muss nach Datum sortiert sein. + Derzeit max 4GB Logfile. + + +19. 9. 2013 + ++ Message (Query) Kommandowoerter + Antworten in Config > Rf-Ports. + Standard Querys (?APRSP) als auch beliebige Woerter koennen definiert + werden und in der Antwort Macros wie \\h Uhrzeit, \\p Path, \\l Position, + \\v Programm Version, \\ File senden, \\>filename> schreiben, + letzteres zum aktivieren von einem Programm zum was Steuern oder Sprachausgabe + "TALK:\\>/tmp/talk.txt>Text um \\h Gesprochen!" + "?HELP:?APRSP, ?VER, TALK" + + +22. 9. 2013 + ++ Windfahne und Temperatur beim Symbol mit Timeout. ++ 1 Kommastelle mehr bei Koordinaten-Ausgabe und bei Maus-Koordinaten + Grad/Minuten/Sekunden-Schreibweise zuaetzlich. ++ Win32: bei der (oder mehr) Start-Fenstergroesse die der Bildschirm kann, + "Maximized" Fenster. + + + +7. 10. 2013 + ++ Filesystem auf "Longfiles" umgestellt damit sollte Logfile >2GB geschrieben + und dank Binaersuche auch flott importiert werden koennen. + ++ Programm Starter fuer Maps-Downloader bei Bedarf (gm.sh bzw gm.bat) + der kann sich nach getaner Arbeit beenden. Status in der Status-Bar + mit "D" statt "E" fuer Downloader laeuft erkennbar. + ++ Beliebige Map-Typen configurierbar mit korrektur der Basis-Helligkeit, + die ersten 3 wie gewohnt mit Shortcut "7" "8" "9", die 1. beim Start aktiv. + Sat-Maps erst wenn ein JPEG-Dekoder vorhanden ist (ausser man wandelt + sie beim Download in PNG). Neu (voreingestellt): cyclemap + + +11. 10. 2013 + ++ Wegstrecken Summe (ohne Track) auf der Map (shift-click, click, click...) ++ Log Import (bis auf Suche rueckwaerts nach Call) bei unsortiertem File + versucht etwas zu verbessern + + + +13. 10. 2013 + ++ Schriftgroesse einstellbar (Config > Map Paramter > Font Size) + + +15. 10. 2013 + ++ Screenshot auch als ".png" (vorerst nur Linux Version) + und osm-Verzeichnispfad wieder configurierbar ++ "On next click to Track" bei mehrfacher Auswahl mit "Zoom to" wird erst gezoomt + und dann im 1 Track Mode die anderen Funktionen aktiv. + + + +31. 10. 2013 + ++ Beep-Sounds mit beliebiger Frequenz und Dauer wenn Message oder Ack eintrifft, + wenn sich wer in den Warnradius bewegt mit steigender Frequenz und/oder Dauer + je naeher er zum Zentrum kommt und wenn ein Call aus der Watch Liste aktiv wird. + Alle getrennt schaltbar und limitiert auf maximal alle 5s. + Windoof 7 oder 8 geschaedigte koennten evtl. keinen Piepser haben dann gibts als + Ersatz 3 System-Sounds (mit 0ms einschalten, bis 500, bis 1000, ab 1000Hz + jeweils ein anderer Gong). + Config > Map Moving > Bell/Sound + + +6. 11. 2013 + ++ In Animation und gedimmten nicht-movern wird die schrift der "mover" im + nun Vordergrund gehalten + ++ Einfaches Hyperlink Hilfetext System mit File "help.txt" unter "Help" + erreichbar mit ein bisschen Text als Beispiel + + + +18. 11. 2013 + ++ Einstellbarer Timer zum Verzoegern vom Mapdownload Start waehrend Karte + verschieben, wer so vermeiden will, dass in hohem Zoom der Streifen an Karten + entlang der Bewegung durch die Botanik geladen wird. Config / Timers + ++ Index Taste im Help Fenster + ++ Schutz vor ewig loopenden Mapdownloads wenn durch zB volle Platte oder nicht + identischem Schreib/Lese-Pfad immer die gleichen Karten angefordert werden. + Kommt ein Kartenteil immer wieder, wird nach ein paar Versuchen 1. nur mehr + 1 Karte angefordert, 2. die Pause zwischen Anforderungen immer Verdoppelt + und 3. poppt eine Fehlermeldung auf. + ++ Copy/Paste hinein ins Program (rechte Maustaste im Textfeld oder ctrl-v) + (bei linux jetzt mit dem aktuellen "keiner verstehts..." selection-Verfahren) + + + +22. 11. 2013 + ++ "Ok" im config-Zeileneditor schliesst das Fenster nach dem Speichern. ++ Map download Timing (im Fehlerfall) optimiert, dass mit dem in entwicklung + befindlichen hochgeschwindigkeits-Downloader von oe5krn bei falscher + Einstellung oder voller Platte keine "Gigabyte" ins Nirvana geladen werden. + + + +28. 11. 2013 + ++ "B" und "M" (gross) fuer Bakeneditor und Message senden + ++ Index bei Helptext + ++ Umfangreicher Baken/Objekt/Item Editor mit verschiebbarem Fenster, + Import von vorhandenen Objekten auf der Karte durch anklicken. + + Testen lokal vorm Senden. + + Einmal senden oder mit Timer und Verschiebung der Sendezeiten, dass die + Duplikatloeschung in den Igates Sendungen mit gleichen Inhalt aber + verschiedener Frequenz (oder direkt per tcp) im Netz sichtbar laesst. + + Einfaches Fernloeschen von Items und Objects. + + Normal/Mic-E/Compressed mit DAO Erweiterung fuer 20cm Genauigkeit + (die aber je nach Fliesskommaarithmetik nur etwa 1m schafft) + mit Bytezaehler der Gesamtlaenge beim editieren der Kommentarzeile zum + optimieren der Kompressionsart. + + Macros zum Einfuegen von Files zB fuer Wetterbake + ++ Query standard Antworten (?APRST ...) vorkonfiguriert mit opt-out wers + nicht will. Config > Rf Ports > Query Keywords + ++ Fehler behoben, Decodieren von Items mit kurzem Label. + + Unsichtbare User wegen keinem oder falschem Symbol (die aber trotzdem + watch/approxy-piepsen) haben nun Label und Track + ++ Listings im "Show 1 Modus" zeigen nun nur was zu dem User gehoert + + + +4. 12. 2013 + ++ Config > Rf-Ports > Monitor Headline + Damit kann man 0 bis 20 Calls + Tempertur oder km/h als "Ticker" + von aktuellen Frames auf der Fenster-Ueberschrift durchlaufen lassen. + Bei minimiertem Fenster ist das aktuellste Call in der Taskleiste. + N> kommt von, N< get ans Netz, 1> 2> Funkports, N- heisst der Frame + ist entweder in den Callfiltern oder ohne verwertbarem Inhalt. + ++ (grosses) "F" Shortcut Find (Call, Locator, Breite/Laenge) + ++ Bakeneditor "Draw" schreibt nimmer ins rawlog + + + + +10. 12. 2013 + ++ Calls + Temp,km/h,Hoehe der ankommenden und abgehenden Daten in der + Fenster-Kopfzeile. Anzahl der Calls Config>Rf-Ports>Monitor Headline. + Updaterate auf (Mittelwert) 1s limitiert. + ++ Maus-Verhalten umgestellt (aehnlich anderen Programmen). + Linksklick wartet auf Maus-Bewegung (mit ein bisschen Zitter Toleranz) + und zieht Karte (auch wenn ein Symbol getroffen) oder, am oberen Rand + angefasst, konnen einige Menues und die Status-Bar positioniert werden + mit "ankleben" an den Fensterrand und gespeichert in aprsmap.cfg. + Beim auslassen der Maustaste, wenn nicht bewegt, wird der normale Klick + ausgeloest. + + Mittlere Maustaste zieht alles was ziehbar ist und an beliebiger Stelle + angefasst. + + Rechte Maustaste wie bisher Back-in-zoom-History oder in einer + Texteingabe "Paste" (falls was im copy/paste Puffer ist) + + + +15. 12. 2013 + ++ Message Senden nun bis 67 Zeichen wie im Protokoll vorgesehen statt 57. ++ Umlautwandler auf "Ae Oe Ue ss" (bis mal ein 8 Bit Zeichensatz definiert ist). ++ Message Eingabezeile geleert wenn die vorherige Message abgeschickt wurde oder + an ein anderes Call als zuvor gesendet werden soll. + ++ Schnelles Zoomen mit Shift-Linksklick und Rahmen um den gewuenschten Inhalt + aufziehen. + ++ (nur Linux) jpeg-Dekoder fuer Maps wobei erst .png versucht wird dann + jpeg in .png Filenamen und zuletzt jpeg als .jpg (gm.sh modifizieren). + + + + +16. 1. 2014 + ++ Config / Online / Serverfilter Aenderungen werden bei "Ok" sofort zum + Server geschickt. (sofern der die "# filter ..." Syntax versteht) + ++ mit "<" ">" durch einen Track wandern geht mit gleichzeitig geoeffneter + Altitude- und Speed-Statistik und zeigt dort die Stelle am Track und die + Messwerte numerisch. + ++ Tools / List neu mit verschieb- maximier-, ikonisierbarem Textfenster + mit Scrollbalken (und Cursortasten und Mausrad) und nach Zeit und + alfabetisch sortierbarem Inhalt. + Es kann Rohdaten und dekodiert listen. Text kann man markieren und mit + "Paste" in andere Anwendungen kopieren (auch auf Win ohne umstaendlichen + Dialog). Gibt man in Tools / Find ("F"-Taste) ein Wort ein, werden alle + gleichnamigen Stellen farblich hervorgehoben zB. "APLM01" oder ein Call. + + Klickt man auf eine Zeile, wird auf der Landkarte die Herkunft gezeigt, + sofern die Zeile eine Position enthaelt und wenn nicht, die letzte + bekannte Position vom Absender der Zeile. + + Das Live-Monitor-Fenster fuer empfangene und gesendete Daten hat anstatt + sortieren "Clr" fuer Inhalt loeschen, es stoppt raufscrollen wenn man + mindesten 1 Zeile herunter geschoben hat, und kann mit "u"-Taste an und aus + geschaltet werden. (Beachten: bei Batteriebetrieb durch den laufenden + Bild-Update evtl mehr CPU/Akkuverbrauch) + Das Aktivieren des Monitors ist, bis eine selbsterklaerende Menue-Struktur + erfunden ist, noch wie zuvor unter Config / Rf-Ports / Monitor Frames. + ++ Linux: F11-Taste (bei "seltsamen" Fenstermachern die selber kein Maximieren + oder dann wieder kleiner machen koennen) toggelt Fullscreen/Normal. + ++ Win: Kein extra Textfenster mehr da Listings eingebaut. + + + +20. 1. 2014 (Ver 0.32) + ++ Funkport (Soundmodem / udpflex) Kommandozeile in Config / Rf Ports / + Serial Interface + Task wird automatisch gestartet. + ++ Monitor Ports off/raw/decoded einzeln mit Klick schaltbar Tools/List/Monitor. + + +3. 2. 2014 (Ver 0.32) + ++ Message Rx: Schalter fuer Pop-up Fenster + Schalter fuer zeigen von Messages an andere SSID + Schalter fuer Messages an sich selber weg filtern (default on) + + + + + + + + + + + + + + + + + + + + + +h264 in mpeg4 Container: +Linux: 1 mal machen: mknod map.y4m p + fuer jedes Video starten: x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m + +win: File / Make Video gibt unkomprimiertes Videofile map.y4m + (.y4m sollten mplayer oder vlc abspielen koennen) + klein packen mit x264.exe "x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m" + (crf=22..27 qualitaet gut bis sparsam) + vorher mit Animate und auf Map klicken passende Geschwindigkeit einstellen + + + +files/dirs: + aprsmap programm + aprsmap.cfg beispiel config, wenn nicht vorhanden werden default werte erzeugt + hints.txt tipps beim verweilen mit der maus auf buttons + help.txt Hyperlink-Hilfetext unter Help > Helptext + gm.sh shell script zum osm karten holen + (geht nun auch mit der busybox am tinycore) ./gm.sh + (darf/soll verbessert werden HI) + symbols.png icons + font.png buchstaben + gettiles vom aprsmap erzeugte liste fehlender map tiles + rawlog timestamp+aprsis format wenn vorhanden beim start eingelesen + bei connect zu aprs server kommts neue dazu + dargestellt werden die eingestellten minuten vom ende des logs + mit connect zu server eingestellte minuten von jetzt + file darf editiert, beschnitten, gefiltert werden + wird nach timestamp sortiert eingelesen + (langes file einlesen geht mit serverconnect schneller + da erst ab "jetzt-darstellzeit" decodiert wird) + osm/tiles/ karten im osm format + osm/tiles_sat/ + osm/tiles_topo/ + udpflex axudp<->kiss/smack/flexkiss interface fuer TNC, TMx7xx ... + kisson.txt kiss initialisierung fuer TMD72 mit udpflex + getosm.exe Win: Schneller Maplader von OE5KRN + +oe5dxl diff --git a/src/README b/src/README new file mode 100644 index 0000000..b58138f --- /dev/null +++ b/src/README @@ -0,0 +1,45 @@ +compiling hints for C-Sources by OE5HPM@OE5XBL.#OE5.AUT.EU + +build for X86 with i386 (32-bit) host system +or +build on some native ARM machine (like raspbian on rpi) +================================================================================ +install following packages: +- build-essential (sudo apt-get install build-essential) +- libX11-dev (sudo apt-get install libX11-dev) +- libXext-dev (sudo apt-get install libXext-dev) +- libpng-dev (sudo apt-get install libpng-dev) +- libjpeg-dev (sudo apt-get install libjpeg-dev) + +make all + +build for X86 with i686 (64-bit) host system +================================================================================ +install following packages: +- build-essential (sudo apt-get install build-essential) +- libX11-dev (sudo apt-get install libX11-dev) +- libXext-dev (sudo apt-get install libXext-dev) +- zlib1g-dev +- libjpeg-dev (sudo apt-get install libjpeg-dev) + +make all + +cross-build for ARMV6 (raspberry pi) on x86 host system +================================================================================ +install following packages: +- build-essential (sudo apt-get install build-essential) +- lib32z1 (sudo apt-get install lib32z1) +- rpi-tools (git clone https://github.com/raspberrypi/tools.git ~/rpi-tools) + +PLATFORM=armv6 CROSS_COMPILE=~/rpi-tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- make all + +cross-build for ARMV7hf (bur am335x pp, bananapi, beaglebone) on x86 host system +================================================================================ +install following packages: +- build-essential (sudo apt-get install build-essential) +- linaro-toolchain + cd ~/ + wget https://releases.linaro.org/components/toolchain/binaries/latest-5.1/arm-linux-gnueabihf/gcc-linaro-5.1-2015.08-x86_64_arm-linux-gnueabihf.tar.xz + tar -xf gcc-linaro-5.1-2015.08-x86_64_arm-linux-gnueabihf.tar.xz + +PLATFORM=armv7hf CROSS_COMPILE=/opt/gcc-linaro-5.1-2015.08-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make all diff --git a/src/Select.c b/src/Select.c new file mode 100644 index 0000000..6cceeb1 --- /dev/null +++ b/src/Select.c @@ -0,0 +1,126 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include +#include +#include +#include +#include + +static fd_set rset, wset; +static unsigned maxfd; + +int selectrw(long sec, long usec) +{ + struct timeval tv; + + tv.tv_sec = sec; + tv.tv_usec = usec; + return select(maxfd+1, &rset, &wset, NULL, &tv); +} + +int selectr(long sec, long usec) +{ + struct timeval tv; + + tv.tv_sec = sec; + tv.tv_usec = usec; + return select(maxfd+1, &rset, NULL, NULL, (usec == 0 && sec == 0) ? NULL : &tv); +} + +void fdclr() +{ + FD_ZERO(&rset); + FD_ZERO(&wset); + maxfd = 0; +} + +void fdsetr(long n) +{ + if (n>maxfd) maxfd = n; + FD_SET(n, &rset); +} + +void fdsetw(long n) +{ + if (n>maxfd) maxfd = n; + FD_SET(n, &wset); +} + +unsigned issetr(long n) +{ + if (FD_ISSET(n, &rset)) return 1; + return 0; +} + +unsigned issetw(long n) +{ + if (FD_ISSET(n, &wset)) return 1; + return 0; +} + +int selectrwt(long *sec, long *usec) +{ + struct timeval tv; + int ret; +#ifdef MACOS + struct timeval spec1, spec2; + time_t s; + long us; + gettimeofday(&spec1, NULL); +#endif + + tv.tv_sec = *sec; + tv.tv_usec = *usec; + ret=select(maxfd+1, &rset, &wset, NULL, &tv); +#ifdef MACOS + /* MacOS does not update tv value in select */ + gettimeofday(&spec2, NULL); + s = spec2.tv_sec-spec1.tv_sec; + us = spec2.tv_usec - spec1.tv_usec; + if (us < 0) { + us += 1000000; + s -= 1; + } + *sec -= s; + *usec -= us; + if (*usec < 0) { + *usec += 1000000; + *sec -= 1; + } + if (*sec < 0) { + *sec = 0; + *usec = 0; + } +#else + *sec = tv.tv_sec; + *usec= tv.tv_usec; +#endif + return ret; +} + +/* +void Usleep(long microseconds) +{ + usleep(microseconds); +} +*/ +/* +unsigned Systime() +{ + struct timespec tv; + clock_gettime(CLOCK_REALTIME, &tv); + return tv.tv_sec; +} + +unsigned monotonictime() +{ + struct timespec tv; + clock_gettime(CLOCK_MONOTONIC, &tv); + return tv.tv_sec; +} +*/ diff --git a/src/Select.h b/src/Select.h new file mode 100644 index 0000000..ae14806 --- /dev/null +++ b/src/Select.h @@ -0,0 +1,29 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef Select_H_ +#define Select_H_ +#include "X2C.h" + +extern long selectrw(unsigned long, unsigned long); + +extern long selectr(unsigned long, unsigned long); + +extern void fdclr(void); + +extern void fdsetr(unsigned long); + +extern char issetr(unsigned long); + +extern void fdsetw(unsigned long); + +extern char issetw(unsigned long); + +extern long selectrwt(unsigned long *, unsigned long *); + + +#endif /* Select_H_ */ diff --git a/src/X2C.h b/src/X2C.h new file mode 100644 index 0000000..34d0d7c --- /dev/null +++ b/src/X2C.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) Hannes Schmelzer + * + * this files substitutes the absolute minimum of the original XDS lib + * for our project. + */ +#ifndef X2C_H_ +#define X2C_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define X2C_ADDRESS char * +#define X2C_pCHAR char * +#define X2C_LSET_SIZE (sizeof(uint32_t) * 8) + +#define X2C_max_longint 0x7FFFFFFFL +#define X2C_min_longint (-0x7FFFFFFFL-1) +#define X2C_max_longcard 0xFFFFFFFFUL +#define X2C_max_real ((float)FLT_MAX) +#define X2C_min_real (-((float)FLT_MAX)) +#define X2C_max_longreal ((double)DBL_MAX) +#define X2C_min_longreal (-((double)DBL_MAX)) +#define X2C_max_longdouble ((X2C_LONGDOUBLE)LDBL_MAX) +#define X2C_min_longdouble (-((X2C_LONGDOUBLE)LDBL_MAX)) + +#define X2C_ASSERT(x) assert(x) +#define X2C_TRAP(x) assert(0) +#define X2C_CASE_TRAP 0 + +#define X2C_ABORT(void) exit(-1) +#define X2C_EXIT(void) exit(0) +#define X2C_HALT(x) (exit(x)) + +#define X2C_CAP(x) toupper(x) + +#define X2C_DIVL(a, b) ((a)/(b)) +#define X2C_DIVR(a, b) ((b) != 0.0f ? (a)/(b) : (a)) +#define X2C_EXPRI(a, b) (pow(a,b)) +#define X2C_PFREE(p) (free(p)) +#define X2C_COPY(src, src_len, dst, dst_len) \ + memcpy(dst, src, src_len <= dst_len ? src_len : dst_len) + +#define X2C_MOVE(source, dest, size) memcpy(dest, source, size) +#define X2C_STRCMP(a, alen, b, blen) strncmp(a, b, alen < blen ? alen : blen) + +#define X2C_CHKNIL(T, p) ((T)(osic_chkptr((void *)(p)))) +#define X2C_CHKPROC(T, p) ((T)(osic_chkptr((void *)(p)))) + +#define X2C_CAST(val, fr, to, to_ref) \ + ((sizeof(fr) < sizeof(to)) ? (assert(0), (to_ref)0) : (to_ref)(val)) + +#define X2C_MAIN_DEFINITION +#define X2C_STACK_LIMIT(x) + +#endif diff --git a/src/adsb2aprs.c b/src/adsb2aprs.c new file mode 100644 index 0000000..bc72c44 --- /dev/null +++ b/src/adsb2aprs.c @@ -0,0 +1,648 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define adsb2aprs_C_ +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef tcp_H_ +#include "tcp.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef tcpb_H_ +#include "tcpb.h" +#endif + +/* dump1090 tcp output to aprs beacon by OE5DXL */ +#define adsb2aprs_TIMETOL 20 +/* max seconds between dir/speed and pos */ + +#define adsb2aprs_PURGETIME 120 +/* seconds keep context */ + +#define adsb2aprs_DEFAULTBEACONTIME 20 + +#define adsb2aprs_SYMBOL "/^" + +#define adsb2aprs_KNOTS 1.852 +/* nautic miles */ + +#define adsb2aprs_FEET 0.3048 + +typedef char CSV[100][21]; + +struct FLY; + +typedef struct FLY * pFLY; + + +struct FLY { + pFLY next; + char hex[6]; + char name[21]; + float lat; + float long0; + float alt; + float speed; + float dir; + uint32_t speedtime; + uint32_t postime; + uint32_t lasttime; + uint32_t lastbeacon; + char newpos; +}; + +static char url[1001]; + +static char port[1001]; + +static char reconn; + +static char verb; + +static char verb2; + +static int32_t fd; + +static pFLY dbase; + +static uint32_t btime; + +static char mycall[10]; + +static char symbol[2]; + +static int32_t udpsock; + +static uint32_t ipnum; + +static uint32_t toport; + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_Werr(text, text_len); + osi_WerrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + + +static char GetNum(const char h[], uint32_t h_len, char eot, + uint32_t * p, uint32_t * n) +{ + *n = 0UL; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + return h[*p]==eot; +} /* end GetNum() */ + + +static uint32_t truncc(double r) +{ + if (r<=0.0) return 0UL; + else if (r>=2.147483647E+9) return 2147483647UL; + else return (uint32_t)X2C_TRUNCC(r,0UL,X2C_max_longcard); + return 0; +} /* end truncc() */ + + +static uint32_t truncr(float r) +{ + if (r<=0.0f) return 0UL; + else if (r>=2.147483647E+9f) return 2147483647UL; + else return (uint32_t)X2C_TRUNCC(r,0UL,X2C_max_longcard); + return 0; +} /* end truncr() */ + + +static int32_t GetIp(char h[], uint32_t h_len, uint32_t * p, + uint32_t * ip0, uint32_t * port0) +{ + uint32_t n; + uint32_t i; + char ok0; + int32_t GetIp_ret; + X2C_PCOPY((void **)&h,h_len); + *p = 0UL; + h[h_len-1] = 0; + *ip0 = 0UL; + for (i = 0UL; i<=4UL; i++) { + n = 0UL; + ok0 = 0; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + ok0 = 1; + n = (n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + if (!ok0) { + GetIp_ret = -1L; + goto label; + } + if (i<3UL) { + if (h[*p]!='.' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + *ip0 = *ip0*256UL+n; + } + else if (i==3UL) { + *ip0 = *ip0*256UL+n; + if (h[*p]!=':' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + } + else if (n>65535UL) { + GetIp_ret = -1L; + goto label; + } + *port0 = n; + ++*p; + } /* end for */ + GetIp_ret = 0L; + label:; + X2C_PFREE(h); + return GetIp_ret; +} /* end GetIp() */ + + +static void Parms(void) +{ + char s[1001]; + uint32_t n; + uint32_t m; + reconn = 0; + verb = 0; + verb2 = 0; + strncpy(url,"127.0.0.1",1001u); + strncpy(port,"30003",1001u); + mycall[0] = 0; + btime = 20UL; + strncpy(symbol,"/^",2u); + for (;;) { + osi_NextArg(s, 1001ul); + if (s[0U]==0) break; + if ((s[0U]=='-' && s[1U]) && s[2U]==0) { + if (s[1U]=='t') { + osi_NextArg(s, 1001ul); /* url */ + n = 0UL; + while ((n<1000UL && s[n]) && s[n]!=':') { + if (n<1000UL) url[n] = s[n]; + ++n; + } + if (n>1000UL) n = 1000UL; + url[n] = 0; + if (s[n]==':') { + m = 0UL; + ++n; + while ((n<1000UL && s[n]) && m<1000UL) { + port[m] = s[n]; + ++n; + ++m; + } + if (m>1000UL) m = 1000UL; + port[m] = 0; + } + } + else if (s[1U]=='k') reconn = 1; + else if (s[1U]=='b') { + osi_NextArg(s, 1001ul); + n = 0UL; + if (!GetNum(s, 1001ul, 0, &n, &btime)) Error("-b ", 7ul); + } + else if (s[1U]=='I') { + osi_NextArg(mycall, 10ul); + if (aprsstr_Length(mycall, 10ul)<3UL || aprsstr_Length(mycall, + 10ul)>9UL) Error("-I ", 14ul); + } + else if (s[1U]=='s') { + osi_NextArg(symbol, 2ul); + if (aprsstr_Length(symbol, 2ul)!=2UL || symbol[0U]=='-') { + Error("-s ", 12ul); + } + } + else if (s[1U]=='u') { + osi_NextArg(s, 1001ul); + n = 0UL; + if (GetIp(s, 1001ul, &n, &ipnum, &toport)<0L) { + Error("-u ip:port number", 18ul); + } + udpsock = openudp(); + if (udpsock<0L) Error("cannot open udp socket", 23ul); + } + else if (s[1U]=='v') verb = 1; + else if (s[1U]=='V') { + verb = 1; + verb2 = 1; + } + else if (s[1U]=='h') { + osi_WrStrLn("", 1ul); + osi_WrStrLn("dump1090 basestation format tcp output to aprs objec\ +t beacon", 61ul); + osi_WrStrLn("", 1ul); + osi_WrStrLn(" -b aprs minimum send intervall -b \ +10 (20)", 60ul); + osi_WrStrLn(" -h help", 26ul); + osi_WrStrLn(" -I Sender of Object Callsign -I OE\ +0AAA", 57ul); + osi_WrStrLn(" -k keep tcp connection", 41ul); + osi_WrStrLn(" -s aprs symbol (/^)", 38ul); + osi_WrStrLn(" -t connect dump1090 tcp server (12\ +7.0.0.1:30003)", 67ul); + osi_WrStrLn(" -u : send AXUDP -u 127.0.0.1:9001 us\ +e udpgate4 or aprsmap as receiver", 86ul); + osi_WrStrLn(" -v verbous", 29ul); + osi_WrStrLn("example: -t 127.0.0.1:30003 -I YOURCALL-11 -u 127.0.\ +0.1:9002 -k -v", 67ul); + osi_WrStrLn("before this start \"dump1090 --net\"", 35ul); + osi_WrStrLn("", 1ul); + X2C_ABORT(); + } + else Error("-h", 3ul); + } + else Error("-h", 3ul); + } +} /* end Parms() */ + + +static void decodeline(const char line0[], uint32_t line_len, + CSV csv0) +{ + uint32_t j; + uint32_t w; + uint32_t i; + memset((char *)csv0,(char)0,2100UL); + i = 0UL; + j = 0UL; + w = 0UL; + while (i<=line_len-1 && (uint8_t)line0[i]>=' ') { + if (line0[i]!=',') { + if (w<=99UL && j<=20UL) { + csv0[w][j] = line0[i]; + ++j; + } + } + else { + ++w; + j = 0UL; + } + ++i; + } +} /* end decodeline() */ + + +static char num(uint32_t n) +{ + return (char)(n%10UL+48UL); +} /* end num() */ + + +static uint32_t dao91(double x) +/* radix91(xx/1.1) of dddmm.mmxx */ +{ + double a; + a = fabs(x); + return ((truncc((a-(double)(float)truncc(a))*6.E+5)%100UL) + *20UL+11UL)/22UL; +} /* end dao91() */ + + +static void sendaprs(char dao, uint32_t time0, char mycall0[], + uint32_t mycall_len, char destcall[], + uint32_t destcall_len, char via[], uint32_t via_len, + char sym[], uint32_t sym_len, char obj[], + uint32_t obj_len, double lat, double long0, + double alt, double course, double speed, + char comm[], uint32_t comm_len) +{ + char ds[201]; + char h[201]; + char b[201]; + char raw[361]; + int32_t rp; + uint32_t n; + uint32_t i; + float a; + X2C_PCOPY((void **)&mycall0,mycall_len); + X2C_PCOPY((void **)&destcall,destcall_len); + X2C_PCOPY((void **)&via,via_len); + X2C_PCOPY((void **)&sym,sym_len); + X2C_PCOPY((void **)&obj,obj_len); + X2C_PCOPY((void **)&comm,comm_len); + b[0] = 0; + aprsstr_Append(b, 201ul, mycall0, mycall_len); + aprsstr_Append(b, 201ul, ">", 2ul); + aprsstr_Append(b, 201ul, destcall, destcall_len); + if (via[0UL]) { + aprsstr_Append(b, 201ul, ",", 2ul); + aprsstr_Append(b, 201ul, via, via_len); + } + aprsstr_Append(b, 201ul, ":;", 3ul); + aprsstr_Assign(h, 201ul, obj, obj_len); + aprsstr_Append(h, 201ul, " ", 10ul); + h[9U] = 0; + aprsstr_Append(b, 201ul, h, 201ul); + aprsstr_Append(b, 201ul, "*", 2ul); + aprsstr_DateToStr(time0, ds, 201ul); + ds[0U] = ds[11U]; + ds[1U] = ds[12U]; + ds[2U] = ds[14U]; + ds[3U] = ds[15U]; + ds[4U] = ds[17U]; + ds[5U] = ds[18U]; + ds[6U] = 0; + aprsstr_Append(b, 201ul, ds, 201ul); + aprsstr_Append(b, 201ul, "h", 2ul); + i = aprsstr_Length(b, 201ul); + a = (float)fabs(lat); + n = truncr(a); + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + n = truncr((a-(float)n)*6000.0f); + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = '.'; + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + if (lat>=0.0) b[i] = 'N'; + else b[i] = 'S'; + ++i; + b[i] = sym[0UL]; + ++i; + a = (float)fabs(long0); + n = truncr(a); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + n = truncr((a-(float)n)*6000.0f); + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = '.'; + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + if (lat>=0.0) b[i] = 'E'; + else b[i] = 'W'; + ++i; + b[i] = sym[1UL]; + ++i; + if (speed>0.5) { + n = truncr((float)(course+1.5)); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + b[i] = '/'; + ++i; + n = truncr((float)(speed*5.3995680345572E-1+0.5)); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + if (alt>0.5) { + b[i] = '/'; + ++i; + b[i] = 'A'; + ++i; + b[i] = '='; + ++i; + n = truncr((float)fabs(alt*3.2808398950131+0.5)); + if (alt>=0.0) b[i] = num(n/100000UL); + else b[i] = '-'; + ++i; + b[i] = num(n/10000UL); + ++i; + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + if (dao) { + b[i] = '!'; + ++i; + b[i] = 'w'; + ++i; + b[i] = (char)(33UL+dao91(lat)); + ++i; + b[i] = (char)(33UL+dao91(long0)); + ++i; + b[i] = '!'; + ++i; + } + b[i] = 0; + aprsstr_Append(b, 201ul, comm, comm_len); + if (verb) osi_WrStrLn(b, 201ul); + aprsstr_mon2raw(b, 201ul, raw, 361ul, &rp); + rp = udpsend(udpsock, raw, rp, toport, ipnum); + X2C_PFREE(mycall0); + X2C_PFREE(destcall); + X2C_PFREE(via); + X2C_PFREE(sym); + X2C_PFREE(obj); + X2C_PFREE(comm); +} /* end sendaprs() */ + + +static void aprs(const struct FLY f) +{ + char h[31]; + aprsstr_Assign(h, 31ul, f.name, 21ul); + h[9U] = 0; + while (aprsstr_Length(h, 31ul)<9UL) aprsstr_Append(h, 31ul, " ", 2ul); + sendaprs(0, f.postime, mycall, 10ul, "APLFR1", 7ul, "", 1ul, "/^", 3ul, h, + 31ul, (double)f.lat, (double)f.long0, + (double)f.alt, (double)f.dir, + (double)(f.speed*1.852f), "", 1ul); +} /* end aprs() */ + + +static void store(const CSV csv0) +{ + pFLY f0; + pFLY f1; + pFLY f; + uint32_t msg; + uint32_t t; + float oalt; + float olong; + float olat; + t = osic_time(); + if ((((csv0[0U][0U]=='M' && csv0[0U][1U]=='S') && csv0[0U][2U]=='G') + && aprsstr_StrToCard(csv0[1U], 21ul, + &msg)) && ((msg==1UL || msg==3UL) || msg==4UL)) { + f = dbase; + f0 = 0; + while (f && !aprsstr_StrCmp(f->hex, 6ul, csv0[4U], 21ul)) { + f1 = f->next; + if (f->lasttime+120ULnext = f1; + if (verb2) { + osi_WrStr("purge ", 7ul); + osi_WrStrLn(f->hex, 6ul); + } + osic_free((char * *) &f, sizeof(struct FLY)); + } + else f0 = f; + f = f1; + } + if (f==0) { + osic_alloc((char * *) &f, sizeof(struct FLY)); + if (f==0) { + osi_WerrLn("Out of Memory", 14ul); + return; + } + memset((char *)f,(char)0,sizeof(struct FLY)); + f->next = dbase; + dbase = f; + aprsstr_Assign(f->hex, 6ul, csv0[4U], 21ul); + if (verb2) { + osi_WrStr("new ", 5ul); + osi_WrStrLn(f->hex, 6ul); + } + } + f->lasttime = t; + if (msg==1UL) { + if (verb2 && f->name[0U]==0) { + osi_WrStr("found name ", 12ul); + osi_WrStr(f->hex, 6ul); + osi_WrStr(" ", 2ul); + osi_WrStrLn(f->name, 21ul); + } + aprsstr_Assign(f->name, 21ul, csv0[10U], 21ul); + } + else if (msg==4UL) { + if (((aprsstr_StrToFix(&f->speed, csv0[12U], + 21ul) && aprsstr_StrToFix(&f->dir, csv0[13U], + 21ul)) && f->dir>=0.0f) && f->dir<=360.0f) f->speedtime = t; + } + else if (msg==3UL) { + if (((((((aprsstr_StrToFix(&oalt, csv0[11U], + 21ul) && aprsstr_StrToFix(&olat, csv0[14U], + 21ul)) && olat>(-90.0f)) && olat<90.0f) + && aprsstr_StrToFix(&olong, csv0[15U], + 21ul)) && olong>(-180.0f)) && olong<180.0f) + && (olong!=f->long0 || olat!=f->lat)) { + f->postime = t; + f->newpos = 1; + f->lat = olat; + f->long0 = olong; + f->alt = oalt*0.3048f; + } + } + if (f->lastbeacon>t) f->lastbeacon = t; + if (((((((f->newpos && f->name[0U]) && f->postime+20UL>=t) + && f->speedtime+20UL>=t) && f->speed>0.0f) && f->lat!=0.0f) + && f->long0!=0.0f) && f->lastbeacon+btimenewpos = 0; + f->lastbeacon = t; + } + } +} /* end store() */ + +static char ibuf[201]; + +static char line[201]; + +static uint32_t ip; + +static uint32_t lp; + +static CSV csv; + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + if (sizeof(CSV)!=2100) X2C_ASSERT(0); + aprsstr_BEGIN(); + osi_BEGIN(); + Parms(); + fd = -1L; + dbase = 0; + fd = connecttob(url, port); + lp = 0UL; + for (;;) { + if (fd>=0L) { + if (readsockb(fd, (char *)ibuf, 201L)<0L) { + /* connect lost */ + osic_Close(fd); + fd = -1L; + } + else { + for (ip = 0UL; ip<=200UL; ip++) { + if ((uint8_t)ibuf[ip]<' ') { + if (lp<200UL) line[lp] = 0; + if (verb) osi_WrStrLn(line, 201ul); + decodeline(line, 201ul, csv); + store(csv); + lp = 0UL; + } + else if (lp<200UL) { + line[lp] = ibuf[ip]; + ++lp; + } + } /* end for */ + } + } + else if (reconn) { + osi_WerrLn("connection lost", 16ul); + usleep(1000000UL); + fd = connecttob(url, port); + } + else break; + } + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/afskmodem.c b/src/afskmodem.c new file mode 100644 index 0000000..fdbd849 --- /dev/null +++ b/src/afskmodem.c @@ -0,0 +1,2789 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define afskmodem_C_ +#ifndef soundctl_H_ +#include "soundctl.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#include +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#include +#ifndef afskmodemptt_H_ +#include "afskmodemptt.h" +#endif +#include + +/* (a)fsk - kiss/axudp stereo soundcard afsk/fsk multimodem by OE5DXL */ +/*FROM setsighandler IMPORT SIGTERM, SIGINT, setsignalproc, SIGPROC; */ +#define afskmodem_MAXLEN 339 + +#define afskmodem_MAXMODEMS 8 + +#define afskmodem_TXBUFLEN 60 +/* default kiss buffers */ + +#define afskmodem_ADCBUFLEN 4096 + +#define afskmodem_BAUDSAMP 65536 + +#define afskmodem_PLLSHIFT 4096 + +#define afskmodem_DEFTIMEOUT 60 +/* then unsent frames are discarded */ + +#define afskmodem_AFIRLEN 32 +/*32, 64*/ + +#define afskmodem_AOVERSAMP 16 +/*16*/ + +#define afskmodem_DFIRLEN 64 + +#define afskmodem_DOVERSAMP 16 + +#define afskmodem_TFIRLEN 64 +/* 2^ */ +/*32/5*/ + +#define afskmodem_SHIFTBITS 6 + +#define afskmodem_TFIRFINE 128 + +#define afskmodem_MAXVOL 25000.0 +/* max dac / overswing */ + +static uint32_t afskmodem_POLYNOM = 0x8408UL; + +static uint32_t afskmodem_CRCINIT = 0xFFFFUL; + +static uint32_t afskmodem_CRCRESULT = 0x9F0BUL; + +#define afskmodem_MINFLEN 9 + +#define afskmodem_STUFFLEN 5 + +#define afskmodem_FEND 192 + +#define afskmodem_FESC 219 + +#define afskmodem_TFEND 220 + +#define afskmodem_TFESC 221 + +struct KISSBUF; + +typedef struct KISSBUF * pKISSNEXT; + + +struct KISSBUF { + pKISSNEXT next; + char port; + uint32_t time0; + uint32_t len; + char data[341]; /* +2 byte crc */ +}; + +typedef float TXFIRTAB[128][64]; + +typedef char FILENAME[1024]; + +enum MONITOR {afskmodem_off, afskmodem_noinfo, afskmodem_normal, + afskmodem_passall}; + + +enum CHANNELS {afskmodem_LEFT, afskmodem_RIGHT}; + + +typedef float DFIRTAB[1024]; + +typedef float DFIR[64]; + +typedef float AFIRTAB[512]; + +struct MPAR; + + +struct MPAR { + uint8_t ch; + int32_t baudfine; + int32_t pllshift; + float left; + float tcnt; + float freq; + float afskmidfreq; + float clamp; + float squelchdcd; + float noise; + float afshift; + float afmid; + float txvolum; + float afskhighpass; + uint8_t monitor; + float sqmed[2]; + uint32_t dfin; + DFIRTAB dfirtab; + DFIR dfir; + AFIRTAB afirtab; + char afsk; + char cbit; + char oldd; + char plld; + char scramb; + char data1; + char axudp2; + char dcdmsgs; + char haddcd; + char hadtxdata; + char haddcdrand; + char flagbeg; + uint32_t flagc; /* for statistic */ + uint32_t flags; + uint32_t flage; + uint32_t rxstuffc; + uint32_t rxbyte; + uint32_t rxbitc; + uint32_t rxp; + uint32_t demodbaud; + uint32_t txbaud; + uint32_t port16; + uint32_t dcdclockm; + uint32_t bertc; + uint32_t berterr; + uint32_t txdel; + uint32_t txtail; + uint32_t rxcrc; + uint32_t scrambler; + char rxbuf[339]; + pKISSNEXT txbufin; + pKISSNEXT txbufout; + uint32_t timeout; + uint32_t configbaud; + uint32_t configtxdel; + uint32_t configtxtail; + uint32_t txdelpattern; + uint32_t configafskshift; + uint32_t configafskmid; + uint32_t confignyquist; + int32_t configequalizer; + int32_t leveldcd; + int32_t bert; + char configured; + char kissignore; + int32_t udpsocket; + uint32_t udpport; + uint32_t udpbind; + uint32_t udpip; + char checkip; +}; + +enum TXSTATE {afskmodem_receiv, afskmodem_slotwait, afskmodem_sendtxdel, + afskmodem_senddata, afskmodem_sendtxtail}; + + +enum DUPLEX {afskmodem_simplex, afskmodem_shiftdigi, afskmodem_fullduplex, + afskmodem_onetx}; + + +struct CHAN; + + +struct CHAN { + uint32_t gmqtime; + uint32_t gmcnt; /* gm900 quiet tx time after ptt */ + uint32_t dcdclock; + uint32_t pttsoundbufs; + uint32_t dds; + uint32_t txbaudgen; + uint32_t addrandom; + uint32_t tbyte; + uint32_t tbytec; + int32_t txstuffc; + int32_t tbitc; + char * hptt; + char pttstate; + char tnrzi; + uint8_t state; + uint8_t duplex; + float persist; + float hipasscap; + uint32_t tscramb; + int32_t adcmax; + int32_t actmodem; + uint32_t configpersist; + float afir[32]; +}; + +static int32_t pipefd; + +static int32_t soundfd; + +static int32_t debfd; + +static char esc; + +static char abortonsounderr; + +static char badsounddriver; + +static char deb01; + +static uint32_t debp; + +static uint32_t getst; + +static uint32_t afin; + +static uint32_t soundbufs; + +static uint32_t maxsoundbufs; + +static uint32_t adcrate; + +static uint32_t adcbuflen; + +static uint32_t adcbytes; + +static uint32_t fragmentsize; + +static uint32_t extraaudiodelay; + +static uint32_t clock0; + +static uint32_t systime; + +static uint8_t maxchannels; + +static struct CHAN chan[2]; + +static pKISSNEXT pTxFree; + +static pKISSNEXT pGetKiss; + +static TXFIRTAB TFIR; + +static struct MPAR modpar[8]; + +static float SIN[32768]; + +static uint8_t CRCL[256]; + +static uint8_t CRCH[256]; + +static FILENAME soundfn; + +static char debb[81]; + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + +/* +PROCEDURE SetStatLine(fd:INTEGER; rts, dtr:BOOLEAN):BOOLEAN; +VAR arg : ARRAY[0..255] OF CARDINAL; + r:INTEGER; +BEGIN + arg[0]:=TIOCM_RTS; + IF rts THEN r:=ioctl(fd, TIOCMBIS, ADR(arg)) ELSE r:=ioctl(fd, TIOCMBIC, + ADR(arg)) END; + IF r>=0 THEN + arg[0]:=TIOCM_DTR; + IF dtr THEN r:=ioctl(fd, TIOCMBIS, ADR(arg)) ELSE r:=ioctl(fd, TIOCMBIC, + ADR(arg)) END; + END; + RETURN r>=0 +END SetStatLine; +*/ + +static void Hamming(float f[], uint32_t f_len) +{ + uint32_t i; + uint32_t tmp; + tmp = f_len-1; + i = 0UL; + if (i<=tmp) for (;; i++) { + f[i] = f[i]*(0.54f+0.46f*osic_cos(3.1415926535898f*(X2C_DIVR((float) + i,(float)(1UL+(f_len-1)))))); + if (i==tmp) break; + } /* end for */ +} /* end Hamming() */ + + +static void initdfir(DFIRTAB dfirtab, uint32_t fg) +{ + uint32_t f; + uint32_t i; + float t[512]; + float e; + float f1; + uint32_t tmp; + for (i = 0UL; i<=511UL; i++) { + t[i] = 0.5f; + } /* end for */ + f1 = X2C_DIVR((float)(fg*64UL),(float)adcrate); + tmp = (uint32_t)X2C_TRUNCC(f1,0UL,X2C_max_longcard)+1UL; + f = 1UL; + if (f<=tmp) for (;; f++) { + e = 1.0f; + if (f==(uint32_t)X2C_TRUNCC(f1,0UL,X2C_max_longcard)+1UL) { + e = f1-(float)(uint32_t)X2C_TRUNCC(f1,0UL,X2C_max_longcard); + } + for (i = 0UL; i<=511UL; i++) { + t[i] = t[i]+e*osic_cos(X2C_DIVR(3.1415926535898f*(float)(i*f), + 512.0f)); + } /* end for */ + if (f==tmp) break; + } /* end for */ + /* + FOR f:=1 TO fg*DFIRLEN DIV adcrate DO + FOR i:=0 TO HIGH(t) DO t[i]:=t[i]+cos(pi*FLOAT(i*f)/FLOAT(HIGH(t)+1)) + END; + END; + */ + Hamming(t, 512ul); + /* FOR i:=0 TO HIGH(t) DO t[i]:=t[i]*(0.54+0.46*cos(pi*(FLOAT(i) + /FLOAT(1+HIGH(t))))) END; */ + for (i = 0UL; i<=511UL; i++) { + dfirtab[511UL+i] = t[i]; + dfirtab[511UL-i] = t[i]; + } /* end for */ +/* +IO.WrLn; +FOR i:=0 TO HIGH(dfirtab) DO IO.WrFixed(dfirtab[i], 2,8) END; +IO.WrLn; +*/ +/* +fd:=FIO.Create("/tmp/td.raw"); +FOR i:=0 TO HIGH(dfirtab) DO n:=VAL(INTEGER, dfirtab[i]*2000.0); + FIO.WrBin(fd,n,2) END; +FIO.Close(fd); +*/ +} /* end initdfir() */ + + +static void initafir(AFIRTAB atab, uint32_t F0, uint32_t F1, + float eq) +{ + uint32_t f; + uint32_t i; + float t[256]; + float f10; + float f00; + float e; + uint32_t tmp; + f00 = X2C_DIVR((float)(F0*32UL),(float)adcrate); + f10 = X2C_DIVR((float)(F1*32UL),(float)adcrate); + for (i = 0UL; i<=255UL; i++) { + t[i] = 0.0f; + } /* end for */ + tmp = (uint32_t)X2C_TRUNCC(f10,0UL,X2C_max_longcard)+1UL; + f = (uint32_t)X2C_TRUNCC(f00,0UL,X2C_max_longcard); + if (f<=tmp) for (;; f++) { + e = 1.0f+eq*((X2C_DIVR((float)f,X2C_DIVR((float)((F0+F1)*32UL), + (float)adcrate)))*2.0f-1.0f); + /* + e:=1.0 + eq*(FLOAT(f)/FLOAT((F0+F1)*AFIRLEN DIV adcrate)*2.0-1.0); + */ + if (e<0.0f) e = 0.0f; + if (f==(uint32_t)X2C_TRUNCC(f00,0UL,X2C_max_longcard)) { + e = e*(1.0f-(f00-(float)(uint32_t)X2C_TRUNCC(f00,0UL, + X2C_max_longcard))); + } + if (f==(uint32_t)X2C_TRUNCC(f10,0UL,X2C_max_longcard)+1UL) { + e = e*(f10-(float)(uint32_t)X2C_TRUNCC(f10,0UL, + X2C_max_longcard)); + } + /* + IF eq<>0 THEN IO.WrFixed(e,2,2);IO.WrLn; END; + */ + if (f==0UL) { + for (i = 0UL; i<=255UL; i++) { + t[i] = t[i]+e*0.5f; + } /* end for */ + } + else { + for (i = 0UL; i<=255UL; i++) { + t[i] = t[i]+e*osic_cos(X2C_DIVR(3.1415926535898f*(float)(i*f), + 256.0f)); + } /* end for */ + } + if (f==tmp) break; + } /* end for */ + Hamming(t, 256ul); + for (i = 0UL; i<=255UL; i++) { + atab[255UL+i] = t[i]; + atab[255UL-i] = t[i]; + } /* end for */ + if (F0>0UL) { + /* make dc level zero */ + e = 0.0f; + for (i = 0UL; i<=511UL; i++) { + e = e+atab[i]; + } /* end for */ + e = X2C_DIVR(e,512.0f); + for (i = 0UL; i<=511UL; i++) { + atab[i] = atab[i]-e; + } /* end for */ + } +/* +IO.WrLn; +FOR i:=0 TO HIGH(atab) DO IO.WrFixed(atab[i], 2,8) END; +IO.WrLn; +*/ +/* +IF eq<>0.0 THEN +debfd:=FIO.Create("/tmp/ta.raw"); +FOR i:=0 TO HIGH(atab) DO f:=VAL(INTEGER, atab[i]*1000.0); + FIO.WrBin(debfd,f,2) END; +FIO.Close(debfd); +END; +*/ +} /* end initafir() */ + + +static void initTFIR(void) +{ + uint32_t b; + uint32_t f; + uint32_t j; + uint32_t i; + float sym[384]; + float sum[128]; + float s[774]; + float max0; + float k; + float fr; + for (i = 0UL; i<=383UL; i++) { + sym[i] = 0.5f; + } /* end for */ + fr = 2.88f; + for (f = 1UL; f<=3UL; f++) { + if (f==(uint32_t)X2C_TRUNCC(fr,0UL,X2C_max_longcard)+1UL) { + k = fr-(float)(uint32_t)X2C_TRUNCC(fr,0UL,X2C_max_longcard); + } + else k = 1.0f; + for (i = 0UL; i<=383UL; i++) { + sym[i] = sym[i]+k*osic_cos(X2C_DIVR(3.1415926535898f*(float)(i*f) + ,384.0f)); + } /* end for */ + } /* end for */ + Hamming(sym, 384ul); + for (i = 0UL; i<=773UL; i++) { + s[i] = 0.0f; + } /* end for */ + max0 = 0.0f; + for (i = 0UL; i<=383UL; i++) { + s[383UL+i+3UL] = sym[i]; + s[(383UL-i)+3UL] = sym[i]; + if ((float)fabs(sym[i])>max0) max0 = (float)fabs(sym[i]); + } /* end for */ + max0 = X2C_DIVR(2.0f,max0); + for (j = 0UL; j<=63UL; j++) { + for (i = 0UL; i<=127UL; i++) { + sum[i] = 0.0f; + } /* end for */ + for (b = 0UL; b<=5UL; b++) { + for (i = 0UL; i<=127UL; i++) { + sum[i] = sum[i]+s[i+b*128UL]*((float)(uint32_t)X2C_IN(b,32, + (uint32_t)j)-0.5f); + } /* end for */ + } /* end for */ + for (i = 0UL; i<=127UL; i++) { + TFIR[i][j] = sum[i]*max0; + } /* end for */ + } /* end for */ +} /* end initTFIR() */ + + +static void SetMixer(char mixfn[], uint32_t mixfn_len, + uint32_t chan0, uint32_t left, uint32_t right) +{ + int32_t fd; + X2C_PCOPY((void **)&mixfn,mixfn_len); + fd = osi_OpenRW(mixfn, mixfn_len); + if (fd>=0L) { + if (chan0==255UL) chan0 = recnum(); + setmixer(fd, chan0, (right<<8)+left); + } + else { + osi_WrStr(mixfn, mixfn_len); + Error(" open", 6ul); + } + X2C_PFREE(mixfn); +} /* end SetMixer() */ + + +static void OpenSound(void) +{ + int32_t s; + int32_t i; + soundfd = osi_OpenRW(soundfn, 1024ul); + if (soundfd>=0L) { + i = samplesize(soundfd, 16UL); /* 8, 16 */ + i = channels(soundfd, (uint32_t)maxchannels+1UL); /* 1, 2 */ + i = setfragment(soundfd, fragmentsize); /* 2^bufsize * 65536*bufs*/ + if (i) { + osi_WrStr("sound setfragment returns ", 27ul); + osic_WrINT32((uint32_t)i, 1UL); + osic_WrLn(); + } + i = sampelrate(soundfd, adcrate); /* 8000..48000 */ + s = (int32_t)getsampelrate(soundfd); + if (s!=(int32_t)adcrate) { + osi_WrStr("sound device returns ", 22ul); + osic_WrINT32((uint32_t)s, 1UL); + osi_WrStrLn("Hz!", 4ul); + } + } + else if (abortonsounderr) { + /* + IF s>=0 THEN Error("") END; + */ + osi_WrStr(soundfn, 1024ul); + Error(" open", 6ul); + } +} /* end OpenSound() */ + + +static void ttypar(char fn[], uint32_t fn_len) +{ + struct termios term; + int32_t fd; + int32_t res; + X2C_PCOPY((void **)&fn,fn_len); + fd = osi_OpenNONBLOCK(fn, fn_len); + if (fd>=0L) { + res = tcgetattr(fd, &term); + /* + term.c_lflag:=CAST(CARDINAL, CAST(BITSET, + term.c_lflag) - CAST(BITSET, ECHO)); + */ + term.c_lflag = 0UL; + res = tcsetattr(fd, 0L, &term); + } + /* + res:=tcsetattr (fd, 0, term); + */ + osic_Close(fd); + X2C_PFREE(fn); +} /* end ttypar() */ + + +static int32_t Opentty(char linkname[], uint32_t linkname_len) +{ + int32_t fd; + char voidok; + char ptsname[4096]; + int32_t Opentty_ret; + X2C_PCOPY((void **)&linkname,linkname_len); + fd = osi_OpenNONBLOCK("/dev/ptmx", 10ul); + if (fd<0L) Error("/dev/ptmx open", 15ul); + if (osi_getptsname(fd, (char *)ptsname, 4096UL)) { + Error("no ttyname", 11ul); + } + /* + IO.WrStr(ptsname); IO.WrLn; + */ + if (osic_grantpts(fd)) Error("ptty grant", 11ul); + if (osic_unlockpts(fd)) Error("ptty unlock", 12ul); + ttypar(ptsname, 4096ul); + /*make link*/ + osi_Erase(linkname, linkname_len, &voidok); + if (osi_symblink((char *)ptsname, (char *)linkname)) { + osi_WrStr("cannot create link <", 21ul); + osi_WrStr(linkname, linkname_len); + osi_WrStrLn(">, starting without kiss interface", 35ul); + osic_Close(fd); + fd = -1L; + } + Opentty_ret = fd; + X2C_PFREE(linkname); + return Opentty_ret; +} /* end Opentty() */ + + +static void Makekissbufs(uint32_t n) +{ + pKISSNEXT pt; + uint32_t i; + pTxFree = 0; + pGetKiss = 0; + i = 0UL; + for (;;) { + if (i>=n) break; + osic_alloc((char * *) &pt, sizeof(struct KISSBUF)); + ++i; + if (pt==0) break; + pt->next = pTxFree; + pTxFree = pt; + } +} /* end Makekissbufs() */ + + +static void StoBuf(int32_t m, pKISSNEXT p) +{ + struct MPAR * anonym; + { /* with */ + struct MPAR * anonym = &modpar[m]; + if (anonym->configured && pTxFree) { + p->next = 0; + if (anonym->txbufin==0) anonym->txbufin = p; + else anonym->txbufout->next = p; + anonym->txbufout = p; + } + else { + p->next = pTxFree; /* discard frame, out of memory */ + pTxFree = p; + } + } +} /* end StoBuf() */ + + +static void ExtractWord(char w[], uint32_t w_len, char s[], + uint32_t s_len) +{ + uint32_t j; + uint32_t i; + w[0UL] = 0; + i = 0UL; + while ((i<=s_len-1 && s[i]) && s[i]!=':') { + if (i<=w_len-1) w[i] = s[i]; + ++i; + } + if (i<=w_len-1) w[i] = 0; + j = 0UL; + if (i<=s_len-1 && s[i]) { + ++i; + while (i<=s_len-1 && s[i]) { + s[j] = s[i]; + ++i; + ++j; + } + } + s[j] = 0; +} /* end ExtractWord() */ + + +static void Config(void) +{ + int32_t i; + uint8_t c; + struct CHAN * anonym; + struct MPAR * anonym0; + for (c = afskmodem_LEFT;; c++) { + { /* with */ + struct CHAN * anonym = &chan[c]; + anonym->persist = (float) + ((anonym->configpersist*adcrate*((uint32_t)maxchannels+1UL) + )/adcbuflen)*0.001f; /* ms */ + } + if (c==afskmodem_RIGHT) break; + } /* end for */ + for (i = 0L; i<=7L; i++) { + { /* with */ + struct MPAR * anonym0 = &modpar[i]; + anonym0->txbaud = (anonym0->configbaud*65536UL)/adcrate; + anonym0->demodbaud = anonym0->txbaud*2UL; + anonym0->txdel = (anonym0->configbaud*anonym0->configtxdel)/8000UL; + anonym0->txtail = 2UL+2UL*(uint32_t) + anonym0->scramb+(anonym0->configbaud*anonym0->configtxtail) + /8000UL; + anonym0->afskmidfreq = X2C_DIVR((float) + anonym0->configafskmid*2.0f,(float)adcrate); + anonym0->afshift = X2C_DIVR(0.5f*(float) + (anonym0->configafskshift*32768UL),(float)adcrate); + anonym0->afmid = X2C_DIVR((float)(anonym0->configafskmid*32768UL) + ,(float)adcrate); + if (anonym0->afsk) { + initafir(anonym0->afirtab, + (anonym0->configafskmid-anonym0->configafskshift/2UL) + -anonym0->configbaud/4UL, + anonym0->configafskmid+anonym0->configafskshift/2UL+anonym0->configbaud/4UL, + X2C_DIVR((float)anonym0->configequalizer,100.0f)); + initdfir(anonym0->dfirtab, + (anonym0->configbaud*anonym0->confignyquist)/100UL); + } + else { + initafir(anonym0->afirtab, 0UL, + (anonym0->configbaud*anonym0->confignyquist)/100UL, + X2C_DIVR((float)anonym0->configequalizer,100.0f)); + } + anonym0->baudfine = 0L; + anonym0->left = 0.0f; + anonym0->tcnt = 0.0f; + anonym0->freq = 0.0f; + anonym0->dfin = 0UL; + anonym0->cbit = 0; + anonym0->rxp = 0UL; + anonym0->rxbitc = 0UL; + anonym0->rxcrc = 0xFFFFUL; + } + } /* end for */ +} /* end Config() */ + +/* +PROCEDURE GetIp(h:ARRAY OF CHAR; VAR ip:IPNUM; VAR dp, lp:UDPPORT; + VAR fd:INTEGER; VAR check:BOOLEAN):INTEGER; +VAR i, p, n:CARDINAL; + ok:BOOLEAN; +BEGIN + p:=0; + h[HIGH(h)]:=0C; + ip:=0; + n:=0; + FOR i:=0 TO 5 DO + n:=0; + ok:=FALSE; + WHILE (h[p]>="0") & (h[p]<="9") DO + ok:=TRUE; + n:=n*10+ORD(h[p])-ORD("0"); + INC(p); + END; + IF NOT ok THEN RETURN -1 END; + IF i<3 THEN + IF (h[p]<>".") OR (n>255) THEN RETURN -1 END; + ip:=ip*256+n; + ELSIF i=3 THEN + ip:=ip*256+n; + IF (h[p]<>":")OR (n>255) THEN RETURN -1 END; + ELSIF i=4 THEN + check:=h[p]<>"/"; + IF (h[p]<>":") & (h[p]<>"/") OR (n>65535) THEN RETURN -1 END; + dp:=n; + ELSIF n>65535 THEN RETURN -1 END; + lp:=n; + INC(p); + END; + + fd:=udp.openudp(); + IF (fd<0) OR (udp.bindudp(fd, lp)<0) (*OR (udp.udpnonblock(fd)<0)*) THEN RETURN -1 END; + RETURN 0 + +END GetIp; +*/ + +static int32_t GetIp(char h[], uint32_t h_len, uint32_t * ip, + uint32_t * dp, uint32_t * lp, int32_t * fd, + char * check) +{ + int32_t GetIp_ret; + X2C_PCOPY((void **)&h,h_len); + if (aprsstr_GetIp2(h, h_len, ip, dp, lp, check)<0L) { + GetIp_ret = -1L; + goto label; + } + *fd = openudp(); + if (*fd<0L || bindudp(*fd, *lp)<0L) { + /*OR (udp.udpnonblock(fd)<0)*/ + GetIp_ret = -1L; + goto label; + } + GetIp_ret = 0L; + label:; + X2C_PFREE(h); + return GetIp_ret; +} /* end GetIp() */ + + +static void bertstart(void) +{ + pKISSNEXT p; + uint32_t i; + struct MPAR * anonym; + for (i = 0UL; i<=7UL; i++) { + { /* with */ + struct MPAR * anonym = &modpar[i]; + if (anonym->bert>0L && pTxFree) { + p = pTxFree; + pTxFree = pTxFree->next; + p->port = (char)i; + p->len = 0UL; + p->time0 = X2C_max_longcard; + StoBuf((int32_t)i, p); + } + } + } /* end for */ +} /* end bertstart() */ + + +static void Parms(void) +{ + char err; + FILENAME pipefn; + FILENAME mixfn; + FILENAME h1; + FILENAME h; + char ptth[4096]; + uint32_t right; + uint32_t left; + uint32_t cnum; + uint32_t kissbufs; + int32_t inum; + int32_t modem; + int32_t channel; + uint8_t c; + struct CHAN * anonym; + struct MPAR * anonym0; + struct MPAR * anonym1; + err = 0; + abortonsounderr = 0; + adcrate = 16000UL; + adcbytes = 2UL; + adcbuflen = 256UL; + fragmentsize = 9UL; + maxchannels = afskmodem_LEFT; + extraaudiodelay = 1UL; + debfd = -1L; + deb01 = 0; + debp = 0UL; + badsounddriver = 0; + for (cnum = 0UL; cnum<=32767UL; cnum++) { + SIN[cnum] = osic_cos(X2C_DIVR((float)cnum*2.0f*3.1415926535898f, + 32768.0f)); + } /* end for */ + for (c = afskmodem_LEFT;; c++) { + { /* with */ + struct CHAN * anonym = &chan[c]; + anonym->state = afskmodem_receiv; + anonym->pttsoundbufs = 0UL; + anonym->dds = 0UL; + anonym->duplex = afskmodem_simplex; + anonym->persist = 800.0f; + anonym->actmodem = -1L; + anonym->hptt = 0; + anonym->configpersist = 800UL; + anonym->tscramb = 0x1UL; /* for bert */ + anonym->gmqtime = 0UL; + } + if (c==afskmodem_RIGHT) break; + } /* end for */ + for (cnum = 0UL; cnum<=7UL; cnum++) { + { /* with */ + struct MPAR * anonym0 = &modpar[cnum]; + anonym0->configured = cnum==0UL; + anonym0->configbaud = 1200UL; + anonym0->configtxdel = 300UL; + anonym0->configtxtail = 20UL; + anonym0->configafskshift = 1000UL; + anonym0->configafskmid = 1700UL; + anonym0->confignyquist = 75UL; + anonym0->configequalizer = 0L; + anonym0->kissignore = 0; + anonym0->leveldcd = 10L; + anonym0->pllshift = 4096L; + anonym0->ch = afskmodem_LEFT; + anonym0->afsk = 1; + anonym0->monitor = afskmodem_normal; + anonym0->scramb = 0; + anonym0->clamp = 0.996f; + anonym0->port16 = cnum*16UL; + anonym0->squelchdcd = 0.14f; + anonym0->txbufin = 0; + anonym0->bert = 0L; + anonym0->txdelpattern = 126UL; + anonym0->txvolum = 25000.0f; + anonym0->afskhighpass = 0.0f; + anonym0->timeout = 60UL; + anonym0->udpsocket = -1L; + } + } /* end for */ + kissbufs = 60UL; + channel = -1L; + modem = -1L; + X2C_COPY("/dev/dsp",9ul,soundfn,1024u); + pipefn[0U] = 0; + X2C_COPY("/dev/mixer",11ul,mixfn,1024u); + maxsoundbufs = 10UL; + for (;;) { + osi_NextArg(h, 1024ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + if (h[1U]=='a') { + if (modem>=0L) modpar[modem].afsk = 0; + else if (channel<=0L) abortonsounderr = 1; + else Error("need modem number -M before -a", 31ul); + } + else if (h[1U]=='b') { + osi_NextArg(h, 1024ul); + if (modem>=0L) { + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>=adcrate) { + Error("sampelrate -f too low for this baud", 36ul); + } + modpar[modem].configbaud = cnum; + } + else { + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + maxsoundbufs = cnum; + } + } + else if (h[1U]=='B') { + if (modem<0L && channel<0L) { + badsounddriver = 1; + } + else { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToInt(h, 1024ul, &inum)) err = 1; + if (modem>=0L) modpar[modem].bert = inum*8000L; + else Error("need modem number -M before -B", 31ul); + } + } + else if (h[1U]=='C') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>1UL) Error("channel 0 to 1", 15ul); + channel = (int32_t)cnum; + } + else if (h[1U]=='c') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) { + if (cnum>(uint32_t)maxchannels) { + Error("channel too high", 17ul); + } + modpar[modem].ch = (uint8_t)cnum; + } + else { + if (cnum<1UL || cnum>2UL) Error("maxchannels 1..2", 17ul); + maxchannels = (uint8_t)(cnum-1UL); + } + } + else if (h[1U]=='D') { + osi_NextArg(h1, 1024ul); + debfd = creat(h1, 420L); + inum = 0L; + while (inum<1023L && h1[inum]) ++inum; + deb01 = (((inum>=4L && h1[inum-4L]=='.') && h1[inum-3L]=='t') + && h1[inum-2L]=='x') && h1[inum-1L]=='t'; + } + else if (h[1U]=='d') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) { + modpar[modem].squelchdcd = X2C_DIVR((float)cnum,400.0f); + } + else Error("need modem number -M before -d", 31ul); + } + else if (h[1U]=='e') { + osi_NextArg(h, 1024ul); + if (modem>=0L) { + if (!aprsstr_StrToInt(h, 1024ul, &inum)) err = 1; + if (labs(inum)>999L) Error("equalizer -999..999", 20ul); + modpar[modem].configequalizer = inum; + } + else { + if (channel>=0L) { + Error("need modem number -M before -e", 31ul); + } + if (!aprsstr_StrToCard(h, 1024ul, &extraaudiodelay)) err = 1; + } + } + else if (h[1U]=='f') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) modpar[modem].configafskmid = cnum; + else if (channel>=0L) { + if (cnum>3UL) Error("duplex 0..3", 12ul); + chan[channel].duplex = (uint8_t)cnum; + } + else { + if (cnum<8000UL || cnum>96000UL) { + Error("sampelrate 8000..96000", 23ul); + } + adcrate = cnum; + } + } + else if (h[1U]=='g') { + if (modem>=0L) modpar[modem].scramb = 1; + else if (channel>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum) || cnum>999UL) { + Error("-g ", 8ul); + } + chan[channel].gmqtime = (cnum*adcrate)/1000UL; + } + else Error("need modem number -M before -g", 31ul); + } + else if (h[1U]=='H') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) modpar[modem].afskhighpass = (float)cnum*0.01f; + else Error("need modem number -M before -H", 31ul); + } + else if (h[1U]=='i') { + if (modem>=0L) modpar[modem].kissignore = 1; + else osi_NextArg(pipefn, 1024ul); + } + else if (h[1U]=='k') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) { + if (cnum>7UL) Error("kissports 0..7", 15ul); + modpar[modem].port16 = cnum*16UL; + } + else kissbufs = cnum; + } + else if (h[1U]=='l') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>=16UL && cnum<=4096UL) adcbuflen = cnum; + else Error("sound buffer out of range", 26ul); + } + else if (h[1U]=='M') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>7UL) Error(">maxmodems", 11ul); + modem = (int32_t)cnum; + modpar[modem].configured = 1; + } + else if (h[1U]=='m') { + osi_NextArg(h, 1024ul); + if (modem<0L && channel<0L) { + while (h[0U]) { + ExtractWord(h1, 1024ul, h, 1024ul); + if (h1[0U]=='/') X2C_COPY(h1,1024u,mixfn,1024u); + else { + if (!aprsstr_StrToCard(h1, 1024ul, &cnum)) err = 1; + ExtractWord(h1, 1024ul, h, 1024ul); + if (!aprsstr_StrToCard(h1, 1024ul, &left)) err = 1; + ExtractWord(h1, 1024ul, h, 1024ul); + if (!aprsstr_StrToCard(h1, 1024ul, &right)) err = 1; + if (!err) SetMixer(mixfn, 1024ul, cnum, left, right); + } + } + } + else { + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>3UL) Error("monitor 0..3", 13ul); + if (modem>=0L) modpar[modem].monitor = (uint8_t)cnum; + else Error("need modem number -M before -m", 31ul); + } + } + else if (h[1U]=='n') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) modpar[modem].confignyquist = cnum; + else Error("need modem number -M before -n", 31ul); + } + else if (h[1U]=='o') osi_NextArg(soundfn, 1024ul); + else if (h[1U]=='p') { + if (modem>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + modpar[modem].pllshift = (int32_t)(cnum*256UL); + } + else if (channel>=0L) { + osi_NextArg(h1, 1024ul); + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToInt(h, 1024ul, &inum)) err = 1; + inum = labs(inum)+1L; + if (h[0U]=='-') inum = -inum; + chan[channel].hptt = pttinit((char *)h1, inum); + } + } + else if (h[1U]=='q') { + if (modem>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + modpar[modem].leveldcd = (int32_t)cnum; + } + else Error("need modem number -M before -q", 31ul); + } + else if (h[1U]=='r') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (channel>=0L) { + if (!aprsstr_StrToCard(h, 1024ul, + &chan[channel].configpersist)) err = 1; + } + else Error("need channel number -C before -r", 33ul); + } + else if (h[1U]=='s') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) modpar[modem].configafskshift = cnum; + else fragmentsize = cnum; + } + else if (h[1U]=='t') { + if (modem>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + modpar[modem].configtxdel = cnum; + } + } + else if (h[1U]=='u') { + if (channel>=0L) pttSetclaim(chan[channel].hptt, 1L); + } + else if ((h[1U]=='U' || h[1U]=='L') || h[1U]=='P') { + if (modem>=0L) { + modpar[modem].axudp2 = h[1U]!='U'; /* switch on axudp2 */ + modpar[modem].dcdmsgs = h[1U]=='P'; + /* send dcd change & txbuffer empty messages*/ + osi_NextArg(h, 1024ul); + { /* with */ + struct MPAR * anonym1 = &modpar[modem]; + if (GetIp(h, 1024ul, &anonym1->udpip, &anonym1->udpport, + &anonym1->udpbind, &anonym1->udpsocket, + &anonym1->checkip)<0L) Error("cannot open udp socket", 23ul); + } + } + else Error("need modem number -M before -U", 31ul); + } + else if (h[1U]=='v') { + if (modem>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>100UL) cnum = 100UL; + modpar[modem].txvolum = (float)cnum*250.0f; + } + else Error("need modem number -M before -w", 31ul); + } + else if (h[1U]=='T') { + if (modem>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + modpar[modem].timeout = cnum; + } + else Error("need modem number -M before -T", 31ul); + } + else if (h[1U]=='w') { + if (modem>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + modpar[modem].txdelpattern = cnum; + } + else Error("need modem number -M before -w", 31ul); + } + else if (h[1U]=='x') { + if (modem>=0L) { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + modpar[modem].configtxtail = cnum; + } + else Error("need modem number -M before -x", 31ul); + } + else if (h[1U]=='z') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (modem>=0L) { + modpar[modem].clamp = X2C_DIVR((float)cnum,1000.0f); + } + else Error("need modem number -M before -z", 31ul); + } + else { + if (h[1U]=='h') { + osi_WrStrLn("first for all modems", 21ul); + osi_WrStrLn(" -a abort on sounddevice error else r\ +etry to open", 62ul); + osi_WrStrLn(" -b tx dacbuffers (10) (more to avoid\ + underruns)", 61ul); + osi_WrStrLn(" -B bad sound driver repair, sending \ +continuous quietness to avoid receive", 87ul); + osi_WrStrLn(" sample loss on start/stop of soun\ +d output. Use for stereo or fullduplex)", 89ul); + osi_WrStrLn(" -c maxchannels (1) (1=mono, 2=stereo\ +)", 51ul); + osi_WrStrLn(" -D (debug) write raw soundcard input\ + data to file or pipe", 71ul); + osi_WrStrLn(" -D .txt (debug) write demodulated bit\ +s as \"01..\" to file or pipe", 77ul); + osi_WrStrLn(" -e additional ptt hold time (if soun\ +dsystem has delay) unit=adcbuffers (1)", 88ul); + osi_WrStrLn(" -f adcrate (16000) (8000..96000)", + 46ul); + osi_WrStrLn(" -h help", 21ul); + osi_WrStrLn(" -i kiss pipename (/dev/kiss/soundmod\ +em)", 53ul); + osi_WrStrLn(" -k tx kiss bufs (60)", 34ul); + osi_WrStrLn(" -l adcbuffer length (256) more: lowe\ +r system load but slower reaction", 83ul); + osi_WrStrLn(" -m [:]:: (0..25\ +5) ossmixer (/dev/mixer)", 74ul); + osi_WrStrLn(" -o oss devicename (/dev/dsp)", + 42ul); + osi_WrStrLn(" -s fragment size in 2^n (9)", 41ul); + osic_WrLn(); + osi_WrStrLn("repeat for each channel -C ... :", 33ul); + osi_WrStrLn(" -C (0..1) channel parameters\ + follow (repeat for each channel)", 83ul); + pttHelp((char *)ptth, 4096UL); + osi_WrStrLn(ptth, 4096ul); + osi_WrStrLn(" -f (0) (0=halfduplex, 1=mast\ +er fullduplex, 2=all fullduplex,", 82ul); + osi_WrStrLn(" 3=simplex \'stereo never \ +both tx same time\')", 68ul); + osi_WrStrLn(" -g GM900 audio quiet time af\ +ter ptt on (0)", 64ul); + osi_WrStrLn(" -r max random wait time afte\ +r dcd before start tx (ms) (800)", 82ul); + osic_WrLn(); + osi_WrStrLn("repeat for each modem -M ... :", 31ul); + osi_WrStrLn(" -M (0..7) modem parameters follow (repea\ +t for each modem)", 67ul); + osi_WrStrLn(" -a afsk off, fsk on (on)", 34ul); + osi_WrStrLn(" -b baud (1200) (1..32000)", 35ul); + osi_WrStrLn(" -B send BERT, (negative bytes receive \ +only)", 55ul); + osi_WrStrLn(" -c use stereo channel 0=left (or mono), \ +1=right", 57ul); + osi_WrStrLn(" -d dcdlevel, 0 no dcd (56) (0..100)", + 45ul); + osi_WrStrLn(" -e demod equalizer (0) 100=6db/oct highp\ +ass (-999..999)", 67ul); + osi_WrStrLn(" -f afsk mid frequency, tx and rx (hz) (1\ +700)", 54ul); + osi_WrStrLn(" -g g3ruh scrambler on (off)", 37ul); + osi_WrStrLn(" -H afsk tx highpass (0) (0..100)", + 42ul); + osi_WrStrLn(" -i ignore modem parameters from kiss (of\ +f)", 52ul); + osi_WrStrLn(" -k received data send to this kiss port \ +(0) (0..7)", 60ul); + /* + WrStrLn("# -l filterlow (hz)"); + */ + osi_WrStrLn(" -m monitor (2) (0=off, 1=header, 2=all, \ +3=passall)", 60ul); + osi_WrStrLn(" -n nyquist filter baseband -6db point in\ + % of baudrate (65) (0..100)", 78ul); + osi_WrStrLn(" -P same as -U but use AXUDP v2, send dcd and t\ +xbuffer empty messages", 72ul); + osi_WrStrLn(" -p receive clock pll aquisition speed (1\ +6) (num/256 of bit time)", 74ul); + osi_WrStrLn(" -q quiet adc level to save cpu or avoid \ +reciption of channel crosstalk (0)", 84ul); + /* + WrStrLn("# -r rzi -1 1"); + */ + osi_WrStrLn(" -s afsk shift tx (for rx bandfilter widt\ +h) (1000) (hz)", 64ul); + osi_WrStrLn(" -t txdelay (300) (ms)", 31ul); + osi_WrStrLn(" -T timeout for tx buffered frame (60\ +) (s)", 55ul); + /* + WrStrLn("# -u filterup (hz)"); + */ + osi_WrStrLn(" -U <[x.x.x.x]:destport:listenport> use axudp i\ +nstead of kiss /listenport check ip", 85ul); + osi_WrStrLn(" -L same as -U but use AXUDP v2 (no dcd and txb\ +uffer empty messages)", 71ul); + osi_WrStrLn(" -v tx loudness (100)", 30ul); + osi_WrStrLn(" -w txdelay pattern before 1 flag (126) (\ +0..255)", 57ul); + osi_WrStrLn(" -x txtail (20) (ms), ptt hold for fulldu\ +plex", 54ul); + osi_WrStrLn(" -z fsk rx baseband dc regeneration clamp\ + speed (996) (0=off, 1=fast, 999=slow)", 88ul); + osi_WrStrLn("example: ./afskmodem -f 22050 -c 2 -C 0 -p /dev/t\ +tyS0 0 -M 0 -c 0 -b 1200 -M 1 -c 1 -b 9600 -a -g -U 127.0.0.1:6001:1093", + 121ul); + X2C_ABORT(); + } + err = 1; + } + } + else { + /* + h[0]:=0C; + */ + err = 1; + } + if (err) break; + } + if (err) { + osi_WrStr(">", 2ul); + osi_WrStr(h, 1024ul); + osi_WrStrLn("< use -h", 9ul); + X2C_ABORT(); + } + Config(); + OpenSound(); + pipefd = -1L; + if (pipefn[0U]) pipefd = Opentty(pipefn, 1024ul); + Makekissbufs(kissbufs); + bertstart(); +} /* end Parms() */ + + +static void AppCRC(char frame[], uint32_t frame_len, int32_t size) +{ + uint8_t h; + uint8_t l; + uint8_t b; + int32_t i; + int32_t tmp; + l = 0U; + h = 0U; + tmp = size-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + b = (uint8_t)((uint8_t)(uint8_t)frame[i]^l); + l = CRCL[b]^h; + h = CRCH[b]; + if (i==tmp) break; + } /* end for */ + frame[size] = (char)l; + frame[size+1L] = (char)h; +} /* end AppCRC() */ + + +static void Kisscmd(void) +{ + uint32_t x; + uint32_t cmd; + int32_t modem; + struct MPAR * anonym; + cmd = (uint32_t)(uint8_t)pGetKiss->port; + modem = (int32_t)(cmd>>4&7UL); + cmd = cmd&15UL; + osi_WrStr("p=", 3ul); + osic_WrINT32((uint32_t)modem, 1UL); + osic_WrLn(); + { /* with */ + struct MPAR * anonym = &modpar[modem]; + if (anonym->configured && !anonym->kissignore) { + x = (uint32_t)(uint8_t)pGetKiss->data[0U]; + if (cmd==1UL) { + anonym->configtxdel = x*10UL; + osi_WrStr("txdel=", 7ul); + osic_WrINT32(anonym->configtxdel, 1UL); + osic_WrLn(); + } + else if (cmd==2UL) { + chan[modpar[modem].ch].configpersist = 10UL*(255UL-x); + osi_WrStr("persist=", 9ul); + osic_WrINT32(chan[modpar[modem].ch].configpersist, 1UL); + osic_WrLn(); + } + else if (cmd==4UL) { + /*3 SlotTime*/ + anonym->configtxtail = x*10UL; + osi_WrStr("txtail=", 8ul); + osic_WrINT32(anonym->configtxtail, 1UL); + osic_WrLn(); + } + else if (cmd==5UL) { + if (x<=2UL) chan[modpar[modem].ch].duplex = (uint8_t)x; + osi_WrStr("duplex=", 8ul); + osic_WrINT32(x, 1UL); + osic_WrLn(); + } + Config(); + } + } +} /* end Kisscmd() */ + + +static void getkiss(void) +{ + char b[1024]; + int32_t i; + int32_t l; + int32_t m; + int32_t tmp; + for (;;) { + if (pipefd<0L) break; + l = read(pipefd, (char *)b, 1024UL); + if (l<=0L) break; + tmp = l-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + /*allocate buffer*/ + if (pGetKiss==0) { + if (pTxFree==0) goto loop_exit; + pGetKiss = pTxFree; + pTxFree = pTxFree->next; + } + /*allocate buffer*/ + if (b[i]=='\300') { + esc = 0; + if (getst>2UL) { + pGetKiss->len = getst-2UL; + getst = 0UL; + /*store frame*/ + m = (int32_t)((uint32_t)(uint8_t)pGetKiss->port>>4&7UL); + if (m<=7L) { + if (((uint32_t)(uint8_t)pGetKiss->port&15UL)==0UL) { + /* data frame */ + pGetKiss->port = (char)m; + AppCRC(pGetKiss->data, 341ul, (int32_t)pGetKiss->len); + pGetKiss->time0 = systime+modpar[m].timeout; + StoBuf(m, pGetKiss); + pGetKiss = 0; + } + else Kisscmd(); + } + } + else { + /*store frame*/ + getst = 1UL; + } + } + else if (b[i]=='\333' && getst>0UL) esc = 1; + else { + if (esc) { + if (b[i]=='\335') b[i] = '\333'; + else if (b[i]=='\334') b[i] = '\300'; + esc = 0; + } + if (getst==1UL) { + pGetKiss->port = b[i]; + getst = 2UL; + } + else if (getst>=2UL && getst-2UL<339UL) { + pGetKiss->data[getst-2UL] = b[i]; + ++getst; + } + } + if (i==tmp) break; + } /* end for */ + } + loop_exit:; +} /* end getkiss() */ + + +static float dB(uint32_t v) +{ + if (v>0UL) return osic_ln((float)v)*8.685889638f-96.5f; + else return 0.0f; + return 0; +} /* end dB() */ + + +static float noiselevel(uint32_t m) +/* 0.0 perfect, ~0.25 noise only*/ +{ + struct MPAR * anonym; + { /* with */ + struct MPAR * anonym = &modpar[m]; + if (anonym->sqmed[1]==anonym->sqmed[0]) return 0.0f; + else return X2C_DIVR(anonym->noise,anonym->sqmed[1]-anonym->sqmed[0]); + } + return 0; +} /* end noiselevel() */ + + +static void app(uint32_t * i, uint32_t * p, char b[501], char c, + int32_t v) +{ + char s[51]; + b[*p] = c; + ++*p; + aprsstr_IntToStr(v, 0UL, s, 51ul); + *i = 0UL; + while (s[*i]) { + b[*p] = s[*i]; + ++*p; + ++*i; + } + b[*p] = ' '; + ++*p; +} /* end app() */ + + +static void sendaxudp2(uint32_t modem, uint32_t datalen, + char parms, char data[], uint32_t data_len) +{ + char b[501]; + int32_t ret; + uint32_t ff; + uint32_t i; + uint32_t p; + float q; + struct MPAR * anonym; + X2C_PCOPY((void **)&data,data_len); + { /* with */ + struct MPAR * anonym = &modpar[modem]; + if (anonym->udpsocket>=0L) { + b[0U] = '\001'; + b[1U] = (char)(48UL+(uint32_t) + anonym->haddcdrand*2UL+(uint32_t) + anonym->hadtxdata*4UL+(uint32_t)chan[anonym->ch].pttstate); + p = 2UL; + if (parms) { + app(&i, &p, b, 'D', (int32_t)(uint32_t)(chan[anonym->ch].duplex==afskmodem_fullduplex)); + app(&i, &p, b, 'B', (int32_t)anonym->configbaud); + app(&i, &p, b, 't', (int32_t)anonym->configtxdel); + } + if (datalen>0UL) { + /* with data */ + ff = (anonym->flags*1000UL)/anonym->configbaud; + if (ff>0UL) app(&i, &p, b, 'T', (int32_t)ff); + app(&i, &p, b, 'V', (int32_t)X2C_TRUNCI(dB((uint32_t)chan[anonym->ch].adcmax), + X2C_min_longint,X2C_max_longint)); /* volume in dB */ + q = noiselevel(modem); + if (q>0.0f) { + q = 100.5f-q*200.0f; + if (q<1.0f) q = 1.0f; + app(&i, &p, b, 'Q', (int32_t)X2C_TRUNCI(q,X2C_min_longint, + X2C_max_longint)); /* quality in % */ + } + b[p] = 0; /* end of axudp2 header */ + ++p; + i = 0UL; + do { + b[p] = data[i]; + ++p; + ++i; + } while (iudpsocket, b, (int32_t)(p+2UL), + anonym->udpport, anonym->udpip); + } + } + X2C_PFREE(data); +} /* end sendaxudp2() */ + + +static void getudp(void) +{ + pKISSNEXT p; + uint32_t i; + int32_t ulen; + uint32_t fromport; + uint32_t fromip; + char crc2; + char crc1; + char udp2[100]; + struct MPAR * anonym; + for (i = 0UL; i<=7UL; i++) { + { /* with */ + struct MPAR * anonym = &modpar[i]; + if (anonym->udpsocket>=0L && pTxFree) { + ulen = udpreceive(anonym->udpsocket, pTxFree->data, 341L, + &fromport, &fromip); + if ((ulen>2L && ulen<341L) + && (!anonym->checkip || fromip==anonym->udpip)) { + crc1 = pTxFree->data[ulen-2L]; + crc2 = pTxFree->data[ulen-1L]; + AppCRC(pTxFree->data, 341ul, ulen-2L); + if (crc1==pTxFree->data[ulen-2L] + && crc2==pTxFree->data[ulen-1L]) { + if (pTxFree->data[0U]=='\001') { + aprsstr_extrudp2(pTxFree->data, 341ul, udp2, 100ul, + &ulen); + AppCRC(pTxFree->data, 341ul, ulen-2L); + } + /* axudp2 */ + if (ulen>2L) { + p = pTxFree; + pTxFree = pTxFree->next; + p->port = (char)i; + p->len = (uint32_t)(ulen-2L); + p->time0 = systime+anonym->timeout; + StoBuf((int32_t)i, p); + } + else if (udp2[1U]=='?' && udp2[2U]==0) { + sendaxudp2(i, 0UL, 1, udp2, 100ul); + /* on axudp2 header only send dcd & txbuf status */ + } + } + } + } + } + } /* end for */ +/* else crc error */ +/* else wrong len or source ip */ +} /* end getudp() */ + + +static void sendkiss(char data[], uint32_t data_len, int32_t len, + uint32_t port16) +{ + char b[683]; + int32_t i; + int32_t l; + char d; + uint32_t po; + struct MPAR * anonym; + int32_t tmp; + /* + FOR i:=0 TO len-1 DO IO.WrHex(ORD(data[i]),3) END; IO.WrLn; + */ + po = port16>>4&7UL; + if (po<=7UL && modpar[po].udpsocket>=0L) { + { /* with */ + struct MPAR * anonym = &modpar[po]; + if (anonym->axudp2) { + sendaxudp2(po, (uint32_t)len, 0, data, data_len); + /* makes new crc */ + } + else { + i = udpsend(anonym->udpsocket, data, len+2L, anonym->udpport, + anonym->udpip); + } + } + } + else if (pipefd>=0L) { + b[0U] = '\300'; + b[1U] = (char)port16; + l = 2L; + tmp = len-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + d = data[i]; + if (d=='\300') { + b[l] = '\333'; + ++l; + b[l] = '\334'; + } + else if (d=='\333') { + b[l] = '\333'; + ++l; + b[l] = '\335'; + } + else b[l] = d; + ++l; + if (i==tmp) break; + } /* end for */ + b[l] = '\300'; + ++l; + i = write(pipefd, (char *)b, (uint32_t)l); + } +} /* end sendkiss() */ + + +static void WrQuali(float q) +{ + if (q>0.0f) { + q = 100.5f-q*200.0f; + if (q<0.0f) q = 0.0f; + osi_WrStr(" q:", 4ul); + osic_WrINT32((uint32_t)X2C_TRUNCC(q,0UL,X2C_max_longcard), 1UL); + } +} /* end WrQuali() */ + + +static void WrdB(int32_t volt) +{ + if (volt>0L) { + osic_WrFixed(dB((uint32_t)volt), 1L, 6UL); + osi_WrStr("dB", 3ul); + } +} /* end WrdB() */ + + +static void WrTXD(uint32_t ms) +{ + osi_WrStr(" txd:", 6ul); + osic_WrINT32(ms, 1UL); + osi_WrStr("ms", 3ul); +} /* end WrTXD() */ + + +static void WCh(char c) +{ + if (c!='\015') { + if ((uint8_t)c<' ' || (uint8_t)c>='\177') osi_WrStr(".", 2ul); + else osi_WrStr((char *) &c, 1u/1u); + } +} /* end WCh() */ + + +static void ShowCall(char f[], uint32_t f_len, uint32_t pos) +{ + uint32_t e; + uint32_t i; + uint32_t tmp; + e = pos; + tmp = pos+5UL; + i = pos; + if (i<=tmp) for (;; i++) { + if (f[i]!='@') e = i; + if (i==tmp) break; + } /* end for */ + tmp = e; + i = pos; + if (i<=tmp) for (;; i++) { + WCh((char)((uint32_t)(uint8_t)f[i]>>1)); + if (i==tmp) break; + } /* end for */ + if ((uint32_t)(uint8_t)f[pos+6UL]>>1&15UL) { + osi_WrStr("-", 2ul); + osic_WrINT32((uint32_t)(uint8_t)f[pos+6UL]>>1&15UL, 1UL); + } +} /* end ShowCall() */ + +static uint32_t afskmodem_UA = 0x63UL; + +static uint32_t afskmodem_DM = 0xFUL; + +static uint32_t afskmodem_SABM = 0x2FUL; + +static uint32_t afskmodem_DISC = 0x43UL; + +static uint32_t afskmodem_FRMR = 0x87UL; + +static uint32_t afskmodem_UI = 0x3UL; + +static uint32_t afskmodem_RR = 0x1UL; + +static uint32_t afskmodem_REJ = 0x9UL; + +static uint32_t afskmodem_RNR = 0x5UL; + + +static void Showctl(uint32_t com, uint32_t cmd) +{ + uint32_t cm; + char PF[4]; + char tmp; + osi_WrStr(" ctl ", 6ul); + cm = (uint32_t)cmd&~0x10UL; + if ((cm&0xFUL)==0x1UL) { + osi_WrStr("RR", 3ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + } + else if ((cm&0xFUL)==0x5UL) { + osi_WrStr("RNR", 4ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + } + else if ((cm&0xFUL)==0x9UL) { + osi_WrStr("REJ", 4ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + } + else if ((cm&0x1UL)==0UL) { + osi_WrStr("I", 2ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>1&7UL)),&tmp), + 1u/1u); + } + else if (cm==0x3UL) osi_WrStr("UI", 3ul); + else if (cm==0xFUL) osi_WrStr("DM", 3ul); + else if (cm==0x2FUL) osi_WrStr("SABM", 5ul); + else if (cm==0x43UL) osi_WrStr("DISC", 5ul); + else if (cm==0x63UL) osi_WrStr("UA", 3ul); + else if (cm==0x87UL) osi_WrStr("FRMR", 5ul); + else osi_WrHex(cmd, 1UL); + strncpy(PF,"v^-+",4u); + if (com==0UL || com==3UL) osi_WrStr("v1", 3ul); + else { + osi_WrStr((char *) &PF[(com&1UL)+2UL*(uint32_t) + ((0x10UL & (uint32_t)cmd)!=0)], 1u/1u); + } +} /* end Showctl() */ + + +static void ShowFrame(char f[], uint32_t f_len, uint32_t len, + int32_t modem, int32_t volt, char noinfo) +{ + uint32_t ff; + uint32_t i; + char d; + char v; + char tmp; + X2C_PCOPY((void **)&f,f_len); + i = 0UL; + while (!((uint32_t)(uint8_t)f[i]&1)) { + ++i; + if (i>len) goto label; + } + /* no address end mark found */ + /* + IF i=1 THEN + flexmon(f, len); + i:=13; + END; + */ + if (i%7UL!=6UL) goto label; + /* address end not modulo 7 error */ + osi_WrStr((char *)(tmp = (char)((modem&7L)+48L),&tmp), 1u/1u); + osi_WrStr(":fm ", 5ul); + ShowCall(f, f_len, 7UL); + osi_WrStr(" to ", 5ul); + ShowCall(f, f_len, 0UL); + i = 14UL; + v = 1; + while (i+6UL=128UL && (((uint32_t)(uint8_t) + f[i+6UL]&1) || (uint32_t)(uint8_t)f[i+13UL]<128UL)) { + osi_WrStr("*", 2ul); + } + i += 7UL; + } + /* + IO.WrStr(" ctl "); IO.WrHex(ORD(f[i]),1); + */ + Showctl((uint32_t)((0x80U & (uint8_t)(uint8_t)f[6UL])!=0) + +2UL*(uint32_t)((0x80U & (uint8_t)(uint8_t)f[13UL])!=0) + , (uint32_t)(uint8_t)f[i]); + ++i; + if (i0L) { + WrQuali(noiselevel((uint32_t)modem)); + WrdB(volt); + ff = (modpar[modem].flags*1000UL)/modpar[modem].configbaud; + if (ff>0UL) WrTXD(ff); + } + /* + IO.WrCard(bufree(), 3); + */ + osic_WrLn(); + if (!noinfo) { + d = 0; + while (i>1)^0x8408UL); + else crc = crc>>1; + } /* end for */ + CRCL[c] = (uint8_t)crc; + CRCH[c] = (uint8_t)(255UL-(crc>>8)); + } /* end for */ +} /* end Gencrctab() */ + + +static float Fir(uint32_t in, uint32_t sub, uint32_t step, + float fir[], uint32_t fir_len, float firtab[], + uint32_t firtab_len) +{ + float s; + uint32_t i; + s = 0.0f; + i = sub; + do { + s = s+fir[in]*firtab[i]; + ++in; + if (in>fir_len-1) in = 0UL; + i += step; + } while (i<=firtab_len-1); + return s; +} /* end Fir() */ + + +static void demodbit(int32_t m, char d) +{ + char xor; + struct MPAR * anonym; + { /* with */ + struct MPAR * anonym = &modpar[m]; + /*descrambler*/ + if (anonym->scramb) { + /* + scrambler:=CAST(BITSET, CAST(CARDINAL, scrambler)*2 + ORD(d)); + + */ + anonym->scrambler = X2C_LSH(anonym->scrambler,32,1); + if (d) anonym->scrambler |= 0x1UL; + d = ((0x1UL & anonym->scrambler)!=0) + ==(((0x1000UL & anonym->scrambler)!=0) + ==((0x20000UL & anonym->scrambler)!=0)); + /*result is xor bit 0 12 17*/ + } + /*nrzi*/ + xor = d; + d = d==anonym->data1; + anonym->data1 = xor; + if (deb01) { + debb[debp] = (char)(48UL+(uint32_t)d); + ++debp; + if (debp>=80UL) { + debb[80U] = '\012'; + debp = (uint32_t)write(debfd, (char *)debb, debp+1UL); + debp = 0UL; + } + } + /*bert*/ + if (anonym->bert) { + if (!d) ++anonym->berterr; + ++anonym->bertc; + if (anonym->bert<0L) { + /* receive only */ + ++anonym->bert; + if (anonym->bert==0L) osi_WrStrLn("---- end BERT", 14ul); + } + if (anonym->bertc>2000UL) { + osic_WrINT32(anonym->berterr, 4UL); + osic_WrINT32((uint32_t)m, 2UL); + WrQuali(noiselevel((uint32_t)m)); + WrdB(chan[anonym->ch].adcmax); + osic_WrLn(); + anonym->bertc = 0UL; + anonym->berterr = 0UL; + } + } + if (anonym->rxstuffc<5UL) { + /*bit to byte*/ + anonym->rxbyte = anonym->rxbyte/2UL+((uint32_t)d<<7); + ++anonym->rxbitc; + /*crc*/ + xor = d!=((0x1UL & anonym->rxcrc)!=0); /*databit xor crcbit0*/ + /* + rxcrc:=CAST(BITSET, CAST(CARDINAL, rxcrc) DIV 2); + (*shift right crc register*) + */ + anonym->rxcrc = X2C_LSH(anonym->rxcrc,32,-1); + if (xor) anonym->rxcrc = anonym->rxcrc^0x8408UL; + /*byte to frame*/ + if (anonym->rxbitc>=8UL) { + if (anonym->rxp<339UL) { + anonym->rxbuf[anonym->rxp] = (char)anonym->rxbyte; + ++anonym->rxp; + } + /*else frame too long error*/ + anonym->rxbitc = 0UL; + if (anonym->flagbeg) { + /* start of data */ + if (anonym->flage>2UL) anonym->flagc = 0UL; + anonym->flags = anonym->flagc; + anonym->flagbeg = 0; + } + else if (anonym->rxbyte && anonym->flagc>64UL) { + ++anonym->flage; /* looks like data not txdel patterns */ + } + } + } + else if (anonym->rxstuffc>5UL) { + /*flag*/ + /*flag*/ + if (((!d && anonym->rxbitc==6UL) && anonym->rxp>=9UL) + && anonym->rxp<339UL) { + /*0111111x 0 is flag else abort*/ + /*bits modulo 8 ?*/ + /*frame long enough ?*/ + if (anonym->rxcrc==0x9F0BUL) { + sendkiss(anonym->rxbuf, 339ul, (int32_t)(anonym->rxp-2UL), + anonym->port16); + } + if (anonym->monitor==afskmodem_passall || anonym->rxcrc==0x9F0BUL && anonym->monitor) + { + ShowFrame(anonym->rxbuf, 339ul, anonym->rxp-2UL, m, + chan[anonym->ch].adcmax, anonym->monitor==afskmodem_noinfo); + anonym->flagc = 0UL; + anonym->flage = 0UL; + } + } + anonym->rxp = 0UL; + anonym->rxbitc = 0UL; + anonym->rxcrc = 0xFFFFUL; /*init crc register*/ + anonym->flagbeg = 1; + } + if (d) ++anonym->rxstuffc; + else anonym->rxstuffc = 0UL; + } +/*destuffing*/ +} /* end demodbit() */ + + +static void demod(float u, int32_t m) +{ + char d; + struct MPAR * anonym; + d = u>=0.0f; + { /* with */ + struct MPAR * anonym = &modpar[m]; + if (anonym->cbit) { + demodbit(m, d); + if (d!=anonym->oldd) { + if (d==anonym->plld) anonym->baudfine += anonym->pllshift; + else anonym->baudfine -= anonym->pllshift; + anonym->oldd = d; + } + else if (d!=anonym->plld) { + anonym->flagc = 0UL; + anonym->flage = 0UL; + anonym->flagbeg = 0; + } + /*squelch*/ + anonym->sqmed[d] = anonym->sqmed[d]+(u-anonym->sqmed[d])*0.05f; + anonym->noise = anonym->noise+((float)fabs(u-anonym->sqmed[d]) + -anonym->noise)*0.05f; + /*squelch*/ + ++anonym->flagc; + } + else anonym->plld = d; + anonym->cbit = !anonym->cbit; + } +} /* end demod() */ + + +static void Afsk(int32_t m) +{ + float ff; + float b; + float a; + float d; + float mid; + float right; + struct MPAR * anonym; + { /* with */ + struct MPAR * anonym = &modpar[m]; + right = Fir(afin, 0UL, 16UL, chan[anonym->ch].afir, 32ul, + anonym->afirtab, 512ul); + if (anonym->left<0.0f!=right<0.0f) { + d = X2C_DIVR(anonym->left,anonym->left-right); + a = (float)(uint32_t)X2C_TRUNCC(d*16.0f+0.5f,0UL, + X2C_max_longcard); + b = a*0.0625f; + if ((uint32_t)X2C_TRUNCC(a,0UL, + X2C_max_longcard)>0UL && (uint32_t)X2C_TRUNCC(a,0UL, + X2C_max_longcard)<16UL) { + mid = Fir(afin, 16UL-(uint32_t)X2C_TRUNCC(a,0UL, + X2C_max_longcard), 16UL, chan[anonym->ch].afir, 32ul, + anonym->afirtab, 512ul); + if (anonym->left<0.0f!=mid<0.0f) { + d = (X2C_DIVR(anonym->left,anonym->left-mid))*b; + } + else d = b+(X2C_DIVR(mid,mid-right))*(1.0f-b); + } + if (anonym->tcnt+d!=0.0f) { + anonym->freq = X2C_DIVR(1.0f,anonym->tcnt+d); + } + anonym->tcnt = 0.0f-d; + } + anonym->tcnt = anonym->tcnt+1.0f; + anonym->left = right; + anonym->dfir[anonym->dfin] = anonym->freq-anonym->afskmidfreq; + anonym->dfin = anonym->dfin+1UL&63UL; + anonym->baudfine += (int32_t)anonym->demodbaud; + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + if (anonym->baudfine<65536L) { + /* normal alway true */ + ff = Fir(anonym->dfin, (uint32_t)(16L-anonym->baudfine/4096L), + 16UL, anonym->dfir, 64ul, anonym->dfirtab, 1024ul); + demod(ff, m); + } + } + } +} /* end Afsk() */ + + +static void Fsk(int32_t m) +{ + float ff; + int32_t lim; + struct MPAR * anonym; + { /* with */ + struct MPAR * anonym = &modpar[m]; + lim = (int32_t)anonym->demodbaud; + for (;;) { + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + ff = Fir(afin, (uint32_t)((anonym->baudfine&65535L)/4096L), + 16UL, chan[anonym->ch].afir, 32ul, anonym->afirtab, 512ul); + demod(ff-(anonym->left+anonym->freq)*0.5f, m); + /*clamp*/ + if (!anonym->cbit) { + if (ff>anonym->left) { + anonym->left = anonym->left+(ff-anonym->left)*1.0f; + } + if (fffreq) { + anonym->freq = anonym->freq+(ff-anonym->freq)*1.0f; + } + anonym->left = anonym->left*anonym->clamp; + anonym->freq = anonym->freq*anonym->clamp; + } + } + /*clamp*/ + anonym->baudfine += lim; + lim = 0L; + if (anonym->baudfine<131072L) break; + } + } +} /* end Fsk() */ + +/* +(*pp065*) +PROCEDURE setppout(fd:INTEGER; mask:SET32):BOOLEAN; +CONST PORTCFG=40026206H; + +VAR pc:SET32; + r:CARDINAL; +BEGIN + r:=100; + LOOP + pc:=SET32{30}; + IF ioctl(fd, CAST(INTEGER, PORTCFG), ADR(pc))=0 THEN EXIT END; + DEC(r); + IF r=0 THEN pc:=SET32{}; EXIT END; + END; + pc:=pc*SET32{0..15}+SET32{31}+mask+SHIFT(mask,1); + RETURN ioctl(fd, CAST(INTEGER, PORTCFG), ADR(pc))=0; +END setppout; + +PROCEDURE ppbitset(fd:INTEGER; port:CARDINAL; on:BOOLEAN); +CONST PARWR=40026207H; +VAR res:INTEGER; +BEGIN +--IO.WrInt(port, 3); IO.WrInt(ORD(on) , 3); IO.WrStrLn("ppout"); + res:=ioctl(fd, CAST(INTEGER, PARWR), CAST(ADDRESS,SET32{port+ORD(NOT on)*8} + )); +END ppbitset; +(*pp065*) + + + +PROCEDURE Ptt; +VAR lptfd, b:INTEGER; + map, mask:SET8; + c:CHANNELS; + ppmask:SET32; +BEGIN +--WrInt(ORD(chan[LEFT].pttstate),2); WrInt(ORD(chan[RIGHT].pttstate),1); + WrStrLn("=ptts"); +(*tty*) + IF ttyfn[0]<>0C THEN + IF ttyfd<0 THEN ttyfd:=open(ttyfn, 0) END; + IF ttyfd>=0 THEN + + IF NOT SetStatLine(ttyfd, chan[LEFT].pttstate, chan[RIGHT].pttstate) + OR closetty THEN + Close(ttyfd); + ttyfd:=-1; + END; (* else keep open for alzheimer usb devices *) + ELSE WrStrLn("tty port open error") END; + END; +(*tty*) + + IF parporttyp=1 THEN +(*parport*) + mask:=SET8{}; + map:=SET8{}; + FOR c:=LEFT TO RIGHT DO + b:=chan[c].lptpttbit; + IF b<>0 THEN + IF chan[c].pttstate=(b>=0) THEN INCL(map, ABS(b)-1) END; + INCL(mask, ABS(b)-1); + END; + END; + IF mask<>SET8{} THEN + lptfd:=OpenRW(lptfn); + IF (lptfd<0) OR (lpt.ppclaim(lptfd)<0) + THEN WrStrLn("lpt port open error"); + ELSE + map:=(CAST(SET8, lpt.ppdevrdata(lptfd))-mask) + map; + lpt.ppdevdata(lptfd, CAST(CHAR, map)); + END; + IF (lptfd>=0) THEN Close(lptfd) END; + END; +(*parport*) + + ELSIF parporttyp=2 THEN +(*pp065*) + lptfd:=OpenRW(lptfn); + IF lptfd>=0 THEN + ppmask:=SET32{}; + FOR c:=LEFT TO RIGHT DO + b:=chan[c].lptpttbit; + IF b<>0 THEN INCL(ppmask, (ABS(b)-1)*2) END; + END; + IF setppout(lptfd, ppmask) THEN + FOR c:=LEFT TO RIGHT DO + b:=chan[c].lptpttbit; + IF b<>0 THEN + ppbitset(lptfd, ABS(b)-1, chan[c].pttstate=(b>=0)); + END; + END; + END; + Close(lptfd); + ELSE WrStr(lptfn); WrStrLn(" port open error") END; + END; +(*pp065*) + + +END Ptt; +*/ + +static void startrandom(uint8_t ch) +{ + struct CHAN * anonym; + { /* with */ + struct CHAN * anonym = &chan[ch]; + anonym->addrandom = 2UL+(uint32_t)X2C_TRUNCC(osic_Random() + *(double)anonym->persist,0UL,X2C_max_longcard); + /* store ramdom wait */ + anonym->dcdclock = clock0; /* start txwait after we sent */ + } +} /* end startrandom() */ + + +static char CheckRandom(int32_t modem) +{ + uint32_t clk; + struct MPAR * anonym; + struct CHAN * anonym0; + { /* with */ + struct MPAR * anonym = &modpar[modem]; + { /* with */ + struct CHAN * anonym0 = &chan[anonym->ch]; + if (anonym0->duplex==afskmodem_shiftdigi) { + clk = modpar[modem].dcdclockm; /* use dcd of this modulation */ + } + else clk = anonym0->dcdclock; + return anonym0->duplex!=afskmodem_fullduplex && (clock0-clk<=anonym0->addrandom || anonym0->duplex==afskmodem_onetx) + ; + } + } +} /* end CheckRandom() */ + +/* (usb) soundcard died */ + +static void repairsound(void) +{ + /* pttok:=FALSE; */ + ptt(chan[afskmodem_LEFT].hptt, -1L); + ptt(chan[afskmodem_RIGHT].hptt, -1L); + if (abortonsounderr) Error("Sounddevice Failure", 20ul); + osic_Close(soundfd); + usleep(100000UL); + /*WrStrLn("openA"); */ + OpenSound(); +} /* end repairsound() */ + + +static void getadc(void) +{ + short buf[4096]; + int32_t minr; + int32_t maxr; + int32_t minl; + int32_t maxl; + int32_t sl; + int32_t m; + int32_t i; + int32_t l; + uint8_t c; + char ndcd; + struct MPAR * anonym; + struct MPAR * anonym0; + l = read(soundfd, (char *)buf, adcbuflen*adcbytes); + for (m = 0L; m<=7L; m++) { + modpar[m].noise = modpar[m].noise*0.99f; /* clear dcd on silence */ + } /* end for */ + if (l<=0L) { + repairsound(); + return; + } + if (debfd>=0L && !deb01) { + i = write(debfd, (char *)buf, (uint32_t)l); + } + l = (int32_t)((uint32_t)l/adcbytes); + for (c = afskmodem_LEFT;; c++) { + chan[c].adcmax = chan[c].adcmax*15L>>4; + if (c==afskmodem_RIGHT) break; + } /* end for */ + maxl = -32768L; + maxr = -32768L; + minl = 32767L; + minr = 32767L; + i = 0L; + while (imaxl) maxl = sl; + if (slchan[afskmodem_LEFT].adcmax) { + chan[afskmodem_LEFT].adcmax = maxl-minl; + } + if (maxchannels>afskmodem_LEFT) { + sl = (int32_t)buf[i+1L]; + chan[afskmodem_RIGHT].afir[afin] = (float)sl; + if (sl>maxr) maxr = sl; + if (slchan[afskmodem_RIGHT].adcmax) { + chan[afskmodem_RIGHT].adcmax = maxr-minr; + } + } + afin = afin+1UL&31UL; + for (m = 0L; m<=7L; m++) { + { /* with */ + struct MPAR * anonym = &modpar[m]; + if ((anonym->configured && chan[anonym->ch] + .adcmax>=anonym->leveldcd) + && (!chan[anonym->ch].pttstate || chan[anonym->ch] + .duplex && chan[anonym->ch].duplex!=afskmodem_onetx)) { + /* save cpu and echo reception */ + if (anonym->afsk) Afsk(m); + else Fsk(m); + /* + IF (m=0) & (clock MOD 64=0) + THEN IO.WrInt(chan[modpar[m].ch].adcmax,6); IO.WrLn; END; + */ + if (noiselevel((uint32_t)m)squelchdcd) { + chan[anonym->ch].dcdclock = clock0; /* tx wise dcd */ + anonym->dcdclockm = clock0; + /* modem wise dcd for shift digi*/ + } + } + else anonym->rxp = 0UL; + } + } /* end for */ + i += (int32_t)((uint32_t)maxchannels+1UL); + } + for (m = 0L; m<=7L; m++) { + { /* with */ + struct MPAR * anonym0 = &modpar[m]; + if (anonym0->configured) { + ndcd = chan[anonym0->ch] + .adcmax>=anonym0->leveldcd && noiselevel((uint32_t)m) + squelchdcd; + if (ndcd) { + chan[anonym0->ch].dcdclock = clock0; /* tx wise dcd */ + anonym0->dcdclockm = clock0; + /* modem wise dcd for shift digi*/ + } + if (ndcd!=anonym0->haddcd) { + if (ndcd) startrandom(anonym0->ch); + anonym0->haddcd = ndcd; + } + ndcd = CheckRandom(m); + if (ndcd!=anonym0->haddcdrand) { + anonym0->haddcdrand = ndcd; + if (anonym0->dcdmsgs) { + sendaxudp2((uint32_t)m, 0UL, 0, "", 1ul); + } + } + } + } + } /* end for */ +} /* end getadc() */ + + +static void txmon(pKISSNEXT pf) +{ + if (pf && modpar[(uint8_t)pf->port].monitor) { + ShowFrame(pf->data, 341ul, pf->len, + (int32_t)(uint32_t)(uint8_t)pf->port, 0L, + modpar[(uint8_t)pf->port].monitor==afskmodem_noinfo); + } +} /* end txmon() */ + + +static float Phasemod(float * uc, float u, float hp) +{ + float ud; + ud = u-*uc; + *uc = *uc+ud*hp; + return ud; +} /* end Phasemod() */ + + +static void Free(pKISSNEXT * tb) +{ + pKISSNEXT ph; + if (*tb) { + ph = (*tb)->next; + (*tb)->next = pTxFree; + pTxFree = *tb; + *tb = ph; + } +} /* end Free() */ + + +static char frames2tx(int32_t modem) +{ + char txo; + char tx; + tx = 0; + if (modpar[modem].txbufin) { + if (modpar[modem].txbufin->time0<=systime) { + Free(&modpar[modem].txbufin); /* frame too old */ + } + else tx = 1; + } + if (modpar[modem].dcdmsgs) { + /* axudp2 check if txbuffer run empty*/ + txo = modpar[modem].hadtxdata; + modpar[modem].hadtxdata = tx; + if (txo && !tx) { + sendaxudp2((uint32_t)modem, 0UL, 0, "", 1ul); + /* send tx ready msg */ + } + } + return tx; +} /* end frames2tx() */ + + +static void sendmodem(void) +{ + short buf[4096]; + int32_t i; + float samp; + uint8_t c; + struct CHAN * anonym; + struct CHAN * anonym0; + struct MPAR * anonym1; + struct CHAN * anonym2; + uint8_t tmp; + int32_t tmp0; + if (soundbufs>0UL) --soundbufs; + tmp = maxchannels; + c = afskmodem_LEFT; + if (c<=tmp) for (;; c++) { + { /* with */ + struct CHAN * anonym = &chan[c]; + if (anonym->pttsoundbufs>0UL) --anonym->pttsoundbufs; + if (anonym->state==afskmodem_receiv) { + for (i = 0L; i<=7L; i++) { + /* has any modem data? */ + /* + IF modpar[i].txbufin<>NIL THEN + IF c=modpar[i].ch THEN actmodem:=i END; + END; + */ + if (frames2tx(i) && c==modpar[i].ch) anonym->actmodem = i; + } /* end for */ + /* + IF (actmodem<0) OR (modpar[actmodem].txbufin=NIL) + THEN (* no data to send *) + */ + if (anonym->actmodem<0L || !frames2tx(anonym->actmodem)) { + /* no data to send */ + /* + IF soundctl.getoutfilled(soundfd) + <=0 THEN soundctl.pcmsync(soundfd) END; + IF soundctl.getoutfilled(soundfd) + >0 THEN IO.WrInt(soundctl.getoutfilled(soundfd),1); IO.WrLn; + END; + */ + if (anonym->pttstate && anonym->pttsoundbufs==0UL) { + anonym->pttstate = 0; + ptt(anonym->hptt, 0L); + /* guess all sound buffers are sent*/ + if (modpar[anonym->actmodem].dcdmsgs) { + sendaxudp2((uint32_t)anonym->actmodem, 0UL, 0, "", + 1ul); + } + } + } + else if (anonym->pttstate) { + /* more data, ptt is on*/ + anonym->state = afskmodem_sendtxdel; + anonym->tbitc = 0L; + anonym->tbytec = 0UL; + txmon(modpar[anonym->actmodem].txbufin); + } + else { + /* data ptt off */ + anonym->tbytec = 0UL; + anonym->state = afskmodem_slotwait; + startrandom(c); + } + } + if (anonym->state==afskmodem_slotwait) { + if (!CheckRandom(anonym->actmodem) || !chan[(uint32_t) + maxchannels-(uint32_t)c].pttstate) { + /* onetx: tx locks tx of other channel */ + /* + IF duplex=shiftdigi THEN + clk:=modpar[actmodem].dcdclockm; + (* use dcd of this modulation *) + ELSE clk:=dcdclock END; + (* use dcd of latest heard modulation *) + + IF (duplex=fullduplex) OR (clock-clk > addrandom) + & ((duplex<>onetx) OR NOT chan[VAL(CHANNELS, + ORD(maxchannels)-ORD(c))].pttstate) + THEN (* onetx: tx locks tx of other channel *) + */ + if (frames2tx(anonym->actmodem)) { + txmon(modpar[anonym->actmodem].txbufin); + chan[c].pttstate = 1; /*WrInt(ORD(c),1); WrStrLn(" ptton"); + */ + ptt(chan[c].hptt, 1L); + if (modpar[anonym->actmodem].dcdmsgs) { + sendaxudp2((uint32_t)anonym->actmodem, 0UL, 0, "", + 1ul); + } + chan[c].gmcnt = chan[c].gmqtime; + anonym->pttsoundbufs = soundbufs+extraaudiodelay; + anonym->state = afskmodem_sendtxdel; + anonym->tbitc = 0L; + anonym->tbytec = 0UL; + } + else anonym->state = afskmodem_receiv; + } + } + } + if (c==tmp) break; + } /* end for */ + /* WHILE (soundbufs=sendtxdel) + OR (chan[RIGHT].state>=sendtxdel)) DO */ + while (soundbufs=afskmodem_sendtxdel) + || chan[afskmodem_RIGHT].state>=afskmodem_sendtxdel)) { + tmp0 = (int32_t)(adcbuflen-1UL); + i = 0L; + if (i<=tmp0) for (;; i++) { + if (maxchannels==afskmodem_RIGHT) c = (uint8_t)(i&1L); + else c = afskmodem_LEFT; + { /* with */ + struct CHAN * anonym0 = &chan[c]; + if (anonym0->state>=afskmodem_sendtxdel) { + samp = TFIR[anonym0->txbaudgen/512UL][(uint32_t) + anonym0->tscramb&63UL]; + if (modpar[anonym0->actmodem].afsk) { + anonym0->dds = anonym0->dds+(uint32_t) + X2C_TRUNCC(samp*modpar[anonym0->actmodem] + .afshift+modpar[anonym0->actmodem].afmid,0UL, + X2C_max_longcard)&32767UL; + buf[i] = (short)(int32_t) + X2C_TRUNCI(Phasemod(&anonym0->hipasscap, + SIN[anonym0->dds]*modpar[anonym0->actmodem].txvolum, + modpar[anonym0->actmodem].afskhighpass),X2C_min_longint, + X2C_max_longint); + } + else { + buf[i] = (short)(int32_t) + X2C_TRUNCI(samp*modpar[anonym0->actmodem].txvolum, + X2C_min_longint,X2C_max_longint); + } + if (anonym0->gmcnt>0UL) { + buf[i] = 0; + --anonym0->gmcnt; + } + anonym0->txbaudgen = anonym0->txbaudgen+modpar[anonym0->actmodem] + .txbaud; + if (anonym0->txbaudgen>=65536UL) { + anonym0->txbaudgen -= 65536UL; + /*send next bit */ + if (anonym0->tbitc<=0L) { + anonym0->tbitc = 8L; + if (anonym0->state==afskmodem_sendtxdel) { + if (modpar[anonym0->actmodem].bert>0L) { + anonym0->tbyte = 255UL; + modpar[anonym0->actmodem].bert -= 8L; + } + else { + anonym0->tbyte = modpar[anonym0->actmodem] + .txdelpattern; + ++anonym0->tbytec; + } + if (anonym0->tbytec>=modpar[anonym0->actmodem].txdel) + anonym0->tbyte = 126UL; + if (anonym0->tbytec>modpar[anonym0->actmodem].txdel) { + anonym0->state = afskmodem_senddata; + anonym0->tbytec = 0UL; + anonym0->txstuffc = 0L; + } + } + if (anonym0->state==afskmodem_sendtxtail) { + anonym0->tbyte = 126UL; + ++anonym0->tbytec; + /*next frame*/ + if (modpar[anonym0->actmodem].txbufin) { + /* same modem */ + anonym0->tbytec = 0UL; + anonym0->state = afskmodem_senddata; + anonym0->txstuffc = 0L; + txmon(modpar[anonym0->actmodem].txbufin); + } + else if (anonym0->tbytec>modpar[anonym0->actmodem] + .txtail) { + anonym0->state = afskmodem_receiv; + /* no data for this modem */ + } + } + if (anonym0->state==afskmodem_senddata) { + { /* with */ + struct MPAR * anonym1 = &modpar[anonym0->actmodem] + ; + if (anonym1->txbufin==0 || anonym0->tbytec>=anonym1->txbufin->len+2UL) + { + /*frame sent*/ + Free(&anonym1->txbufin); + anonym0->state = afskmodem_sendtxtail; + anonym0->tbyte = 126UL; + anonym0->tbytec = 0UL; + } + else { + anonym0->tbyte = (uint32_t)(uint8_t) + anonym1->txbufin->data[anonym0->tbytec]; + ++anonym0->tbytec; + } + } + } + } + /*stuff*/ + if ((anonym0->tbyte&1) + && anonym0->state==afskmodem_senddata) { + ++anonym0->txstuffc; + if (anonym0->txstuffc>=5L) { + anonym0->tbyte += anonym0->tbyte-1UL; + ++anonym0->tbitc; + anonym0->txstuffc = 0L; + } + } + else anonym0->txstuffc = 0L; + /*stuff*/ + /* nrzi */ + if (!(anonym0->tbyte&1)) anonym0->tnrzi = !anonym0->tnrzi; + /* + IF modpar[actmodem].scramb THEN + tscramb:=CAST(BITSET, CAST(CARDINAL, + tscramb)*2+ORD(tnrzi <> ((11 IN tscramb) <> (16 IN tscramb))) + ); + ELSE tscramb:=CAST(BITSET, CAST(CARDINAL, + tscramb)*2+ORD(tnrzi)) END; + */ + anonym0->tscramb = X2C_LSH(anonym0->tscramb,32,1); + if (modpar[anonym0->actmodem].scramb) { + if (anonym0->tnrzi!=(((0x1000UL & anonym0->tscramb)!=0) + !=((0x20000UL & anonym0->tscramb)!=0))) { + anonym0->tscramb |= 0x1UL; + } + } + else if (anonym0->tnrzi) anonym0->tscramb |= 0x1UL; + anonym0->tbyte = anonym0->tbyte>>1; + --anonym0->tbitc; + } + } + else buf[i] = 0; + } + if (i==tmp0) break; + } /* end for */ + /* WrBin(soundfd, buf, adcbuflen*adcbytes); */ + i = write(soundfd, (char *)buf, adcbuflen*adcbytes); + for (c = afskmodem_LEFT;; c++) { + { /* with */ + struct CHAN * anonym2 = &chan[c]; + if (anonym2->state>=afskmodem_sendtxdel) ++anonym2->pttsoundbufs; + } + if (c==afskmodem_RIGHT) break; + } /* end for */ + ++soundbufs; + } +} /* end sendmodem() */ + +static void afskmodemcleanup(int32_t); + + +static void afskmodemcleanup(int32_t signum) +{ + pttDestroy(chan[afskmodem_LEFT].hptt); + pttDestroy(chan[afskmodem_RIGHT].hptt); + osi_WrStr("exit ", 6ul); + osic_WrINT32((uint32_t)signum, 0UL); + osi_WrStrLn("!", 2ul); + X2C_HALT((uint32_t)signum); +} /* end afskmodemcleanup() */ + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + if (sizeof(FILENAME)!=1024) X2C_ASSERT(0); + aprsstr_BEGIN(); + osi_BEGIN(); + signal(SIGTERM, afskmodemcleanup); + signal(SIGINT, afskmodemcleanup); + memset((char *)modpar,(char)0,sizeof(struct MPAR [8])); + Parms(); + Gencrctab(); + initTFIR(); + /* + tfd:=FIO.Create("/tmp/t.raw"); + */ + getst = 0UL; + esc = 0; + afin = 0UL; + soundbufs = 0UL; + ptt(chan[afskmodem_LEFT].hptt, -1L); + ptt(chan[afskmodem_RIGHT].hptt, -1L); + for (;;) { + getadc(); + ++clock0; + if ((clock0&63UL)==0UL) { + ptt(chan[afskmodem_LEFT].hptt, -1L); + /* sync ptt to hardware sometime */ + ptt(chan[afskmodem_RIGHT].hptt, -1L); + systime = osic_time(); + } + getkiss(); + getudp(); + sendmodem(); + } +/* +IO.WrStr("len="); IO.WrCard(txbuf[txp].len, 1); IO.WrStr("cmd="); + IO.WrHex(ORD(txbuf[txp].cmd), 1); + +FOR i:=1 TO txbuf[txp].len DO IO.WrHex(ORD(txbuf[txp].data[i-1]), 3) END; +IO.WrLn; +*/ +/* + FIO.Close(pipefd); +*/ +/* +FIO.Close(tfd); +*/ + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/afskmodemptt.c b/src/afskmodemptt.c new file mode 100644 index 0000000..cc3a603 --- /dev/null +++ b/src/afskmodemptt.c @@ -0,0 +1,414 @@ +/* + * afskmodem-ptt.c + * This module handles PTT of several modems on different hw-interfaces + * + * Copyright (C) 2014 Hannes Petermaier + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include +#include +#include +#include +#include +#include +#ifndef MACOS +#include +#endif +#include + +/*#define _DEBUG*/ + +#ifdef _DEBUG +# define DBG(...) printf(__VA_ARGS__) +#else +# define DBG(...) +#endif + +#ifndef MACOS + +struct ttydev_t { + char *name; /* name of tty */ + int fd; /* responsible fd of tty */ +}; + +struct pttcmn_t { + struct ttydev_t ttydevs[16]; /* ttyDevs, since we use last + * entry for "end-detection" + * this entry always must beu + * zero + */ +}; + +struct ptt_t { + struct pttcmn_t *pcmn; /* pointer to common instance */ + char devname[1024]; /* name of the device */ + int bit; /* bit within device */ + unsigned int laststate; /* last written state from modem */ + unsigned int origportstate; /* Portstate on open, used to restore + * device-state upon exit + */ + int ttyrelease; /* close tty after every switch-cycle */ + int fd; /* handle of ptt-device */ + int (*switchfct)(struct ptt_t *pInst, int value); + int (*destroyfct)(struct ptt_t *pInst); +}; + +struct pttcmn_t *gpcmn = NULL; + +static int tty_search_byname(struct pttcmn_t *pInst, char *name) +{ + struct ttydev_t *ptty = pInst->ttydevs; + while (ptty->fd != 0) { + if (strcmp(ptty->name, name) == 0) { + return ptty->fd; + } + ptty++; + } + return -1; +} + +static int tty_register(struct pttcmn_t *pInst, char *name, int fd) +{ + unsigned int i; + struct ttydev_t *ptty = pInst->ttydevs; + + for (i=0; i<(sizeof(pInst->ttydevs)/sizeof(pInst->ttydevs[0])-1); i++) { + if (ptty->fd == 0) { + ptty->fd = fd; + ptty->name = name; + break; + } + ptty++; + } + if (i<(sizeof(pInst->ttydevs)/sizeof(pInst->ttydevs[0]))-1) + return 0; + + return -1; +} + +static int ptt_parport(struct ptt_t *pInst, int value) +{ + int switchval = (pInst->bit > 0 ? 0 : 1) ^ value; + int fd; + int rc = -1; + + unsigned short port; + + fd = open(pInst->devname, O_WRONLY); + if (fd < 0 || ioctl(fd, PPCLAIM) < 0) { + printf("cannot open %s!\n", pInst->devname); + } else { + rc = ioctl(fd, PPRDATA, &port); + + if (switchval) + port |= (0x01 << abs(pInst->bit)-1); + else + port &= ~(0x01 << abs(pInst->bit)-1); + rc = ioctl(fd, PPWDATA, &port); + } + if (fd > 0) { + ioctl(fd, PPRELEASE); + close(fd); + } + + return rc; +} + +static int ptt_gpio(struct ptt_t *pInst, int value) +{ + int switchval = (pInst->bit > 0 ? 0 : 1) ^ value; + int fd, rc; + char buf[64]; + + snprintf(buf, sizeof(buf), + "/sys/class/gpio/gpio%d/value", abs(pInst->bit)-1); + + fd = open(buf, O_WRONLY); + if (fd > 0) { + if (switchval) + rc = write(fd, "1", 1); + else + rc = write(fd, "0", 1); + + close(fd); + return rc; + } else { + return -1; + } +} + +static int ptt_gpioDestroy(struct ptt_t *pInst) +{ + int fd; + char buf[64]; + + /* turn ptt off * + * may not be the ultimative trick, because we afterwards reset the + * device into original state. + * Further kernel takes over control upon we've closed it. + */ + pInst->switchfct(pInst, 0); + + /* unexport the used gpio to give them to other users */ + fd = open("/sys/class/gpio/unexport", O_WRONLY); + if (fd > 0) { + snprintf(buf, sizeof(buf), + "%d", abs(pInst->bit)-1); + write(fd, buf, strlen(buf)); + close(fd); + return 0; + } + return -1; +} + +static int ptt_tty(struct ptt_t *pInst, int value) +{ + int switchval = (pInst->bit > 0 ? 0 : 1) ^ value; + int rc, flags, first = 0; + int fd; + + if (pInst->fd <= 0) { + fd = tty_search_byname(pInst->pcmn, pInst->devname); + if (fd > 0) { + pInst->fd = fd; + DBG("%s: reuse allready open fd (%d) on %s\n", + __func__, pInst->fd, pInst->devname); + } else { + DBG("%s: try to open %s ...\n", + __func__, pInst->devname); + fd = open(pInst->devname, O_RDONLY); + if (fd > 0) { + if (tty_register(pInst->pcmn, + pInst->devname, + fd) == 0 + ) { + pInst->fd = fd; + first = 1; + } else { + close(fd); + } + } + } + } + + if (pInst->fd > 0) { + if (first) { + flags = TIOCM_RTS | TIOCM_DTR; + switchval = 0; + } + else { + flags = abs(pInst->bit)-1 == 0 ? TIOCM_RTS : TIOCM_DTR; + } + + if (switchval) + rc = ioctl(pInst->fd, TIOCMBIS, &flags); + else + rc = ioctl(pInst->fd, TIOCMBIC, &flags); + + if (pInst->ttyrelease || rc != 0) { + pInst->destroyfct(pInst); + pInst->fd = -1; + } + return rc; + } else { + return -1; + } +} + +static int ptt_ttyDestroy(struct ptt_t *pInst) +{ + struct ttydev_t *ptty = pInst->pcmn->ttydevs; + int flags = TIOCM_RTS | TIOCM_DTR; + + while (ptty->fd > 0) { + ioctl(ptty->fd, TIOCMBIC, &flags); + close(ptty->fd); + ptty++; + } + + return 0; +} + +void *pttinit(char *devname, int bit) +{ + struct ptt_t *pInst; + int fd; + char buf[64]; + unsigned int tmp; + int busycnt; + + if (gpcmn == NULL) { + gpcmn = (struct pttcmn_t *)malloc(sizeof(struct pttcmn_t)); + if (gpcmn != NULL) + memset(gpcmn, 0, sizeof(struct pttcmn_t)); + else { + printf("%s: cannot allocate memory for common instance", + __func__); + return 0; + } + } + + if ( (pInst = (struct ptt_t *)malloc(sizeof(struct ptt_t))) != 0) { + memset(pInst, 0, sizeof(struct ptt_t)); + pInst->bit = bit; + pInst->pcmn = gpcmn; + strncpy(pInst->devname, devname, sizeof(pInst->devname)); + + if (strstr(devname, "tty") != 0) { + if (pInst->bit > 2 || pInst->bit < -2) { + printf("fail: %s has only to switchable bits!\n", + pInst->devname); + goto errorExit; + } + pInst->fd = -1; + pInst->switchfct = &ptt_tty; + pInst->destroyfct = &ptt_ttyDestroy; + } else if (strcmp(devname, "gpio") == 0) { + fd = open("/sys/class/gpio/export", O_WRONLY); + if (fd > 0) { + snprintf(buf, sizeof(buf), + "%d", abs(pInst->bit)-1); + write(fd, buf, strlen(buf)); + close(fd); + } else { + goto errorExit; + } + snprintf(buf, sizeof(buf), + "/sys/class/gpio/gpio%d/direction", + abs(pInst->bit)-1); + fd = open(buf, O_WRONLY); + if (fd > 0) { + write(fd, "out", 3); + close(fd); + } else { + goto errorExit; + } + pInst->switchfct = &ptt_gpio; + pInst->destroyfct = &ptt_gpioDestroy; + } else if (strstr(devname, "parport") != 0) { + if (pInst->bit > 8 || pInst->bit < -8) { + printf("fail: parport has only 8 bits!\n"); + goto errorExit; + } + pInst->switchfct = &ptt_parport; + } else { + goto errorExit; + } + return pInst; + } + + return 0; + + errorExit: + printf("PTT setup on device %s failed.\n", pInst->devname); + if (fd > 0) + close(fd); + free(pInst); + + return 0; +} + +void pttDestroy(void *arg) +{ + struct ptt_t *pInst = (struct ptt_t *)arg; + + if (!pInst) + return; + + if(pInst->destroyfct) { + pInst->destroyfct(pInst); + } + free(pInst); +} + +int ptt(void *arg, unsigned int val) +{ + struct ptt_t *pInst = (struct ptt_t *)arg; + + if (!pInst) + return -1; + + if(pInst->switchfct) { + if (val != -1) { + pInst->laststate = val; + DBG("ptt (0x%08x) switch to %d\n", + (unsigned int)pInst, val); + return pInst->switchfct(pInst, val); + } else { + DBG("ptt (0x%08x) switch to %d (cyclic)\n", + (unsigned int)pInst, pInst->laststate); + return pInst->switchfct(pInst, pInst->laststate); + } + } + + return -1; +} + +void pttSetclaim(void *arg, int val) +{ + struct ptt_t *pInst = (struct ptt_t *)arg; + + if (!pInst) + return; + pInst->ttyrelease = val; +} + +void pttHelp(char *str, unsigned int maxsize) +{ + char *helptext = \ + " -p pttport and bit to switch\n" \ + " * /dev/ttyXX for serial\n" \ + " * /dev/parport0 for parallel\n" \ + " * gpio for kernel gpio-interface\n" \ + " choose value for :\n" \ + " * tty: 0=RTS, 1=DTR\n" \ + " * parport: 0...7 / -0...-7 (inverted)\n" \ + " -u close ptt-tty file between switch actions, " \ + "may not work on USB tty"; + + strncpy(str, helptext, maxsize); +} +#else /* MACOS */ +static int ptt_ttyDestroy(struct ptt_t *pInst) +{ + return 0; +} + +void *pttinit(char *devname, int bit) +{ + return NULL; +} + +void pttDestroy(void *arg) +{ + return; +} + +int ptt(void *arg, unsigned int val) +{ + return 0; +} + +void pttSetclaim(void *arg, int val) +{ + return; +} + +void pttHelp(char *str, unsigned int maxsize) { + char *helptext = "PTT not supported yet on MacOS"; + strncpy(str, helptext, maxsize); +} +#endif diff --git a/src/afskmodemptt.h b/src/afskmodemptt.h new file mode 100644 index 0000000..29498e5 --- /dev/null +++ b/src/afskmodemptt.h @@ -0,0 +1,16 @@ +#ifndef afskmodemptt_H_ +#define afskmodemptt_H_ +#include "X2C.h" + +extern X2C_ADDRESS pttinit(X2C_ADDRESS, long); + +extern void pttDestroy(X2C_ADDRESS); + +extern void pttSetclaim(X2C_ADDRESS, long); + +extern void pttHelp(X2C_ADDRESS, unsigned long); + +extern void ptt(X2C_ADDRESS, long); + + +#endif /* afskmodemptt_H_ */ diff --git a/src/aprsdecode.c b/src/aprsdecode.c new file mode 100644 index 0000000..92a9311 --- /dev/null +++ b/src/aprsdecode.c @@ -0,0 +1,6925 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif +#define aprsdecode_C_ +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef xosi_H_ +#include "xosi.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef tcp_H_ +#include "tcp.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef useri_H_ +#include "useri.h" +#endif +#ifndef aprstext_H_ +#include "aprstext.h" +#endif + +aprsdecode_SET256 aprsdecode_SYMTABLE = {0x00000000UL,0x03FF8000UL, + 0x17FFFFFEUL,0x07FFFFFEUL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +uint32_t aprsdecode_systime; +uint32_t aprsdecode_realtime; +uint32_t aprsdecode_lastlooped; +uint32_t aprsdecode_rxidle; +char aprsdecode_quit; +char aprsdecode_verb; + + +struct aprsdecode__D0 aprsdecode_click; +struct aprspos_POSITION aprsdecode_mappos; +int32_t aprsdecode_inittilex; +int32_t aprsdecode_inittiley; +int32_t aprsdecode_initxsize; +int32_t aprsdecode_initysize; +int32_t aprsdecode_parmzoom; +int32_t aprsdecode_initzoom; +float aprsdecode_finezoom; +float aprsdecode_parmfinezoom; +char aprsdecode_mapdir[1025]; +aprsdecode_pMOUNTAIN aprsdecode_mountains; + + +struct aprsdecode__D1 aprsdecode_lums; + + +struct aprsdecode__D2 aprsdecode_tracenew; +aprsdecode_pTXMESSAGE aprsdecode_txmessages; +aprsdecode_pMSGFIFO aprsdecode_msgfifo0; +float aprsdecode_spikesens; +float aprsdecode_maxhop; +aprsdecode_pOPHIST aprsdecode_ophist2; +aprsdecode_pOPHIST aprsdecode_ophist0; + + +struct aprsdecode__D3 aprsdecode_gateways[10]; +aprsdecode_pTCPSOCK aprsdecode_tcpsocks; +struct aprsdecode_UDPSOCK aprsdecode_udpsocks0[4]; +uint32_t aprsdecode_lasttcptx; +uint32_t aprsdecode_lastanyudprx; +uint32_t aprsdecode_lastpurge; +uint32_t aprsdecode_lasttcprx; +aprsdecode_FRAMEBUF aprsdecode_testbeaconbuf; +struct xosi_PROCESSHANDLE aprsdecode_serialpid; +struct xosi_PROCESSHANDLE aprsdecode_serialpid2; +struct xosi_PROCESSHANDLE aprsdecode_maploadpid; +/* connect to aprs-is gateway and decode data for archive and map by OE5DXL */ +/*FROM Storage IMPORT ALLOCATE, DEALLOCATE; */ +/*FROM TimeConv IMPORT time; */ +#define aprsdecode_CALLLEN 7 + +#define aprsdecode_HASHSIZE 65536 + +#define aprsdecode_GATECONNDELAY 30 + +#define aprsdecode_WATCH 180 + +#define aprsdecode_QMAXTIME 15 + +#define aprsdecode_MIDMOD 62 + +#define aprsdecode_HOLDT 0x0FFFFFFFF + +#define aprsdecode_BEEPINVERVALL 5 +/* min time between beeps */ + +#define aprsdecode_TICKEROFFTIME 60 +/* switch off window headline ticker after no data*/ + +#define aprsdecode_cUSERMESSAGE ":" + +#define aprsdecode_cTHIRDPARTY "}" + +#define aprsdecode_DUPHASHSIZE 65536 + +#define aprsdecode_PINGTIMEOUT 10 +/* ping-pong ping timeout */ + +#define aprsdecode_PINGINTERVALL 20 +/* ping-pong ping intervall */ + +#define aprsdecode_DIRIN ">" + +#define aprsdecode_DIROUT "<" + +#define aprsdecode_DIRHAVIT "-" + +#define aprsdecode_DIRJUNC "#" + +#define aprsdecode_cMSGACK "{" + +typedef uint32_t CHSET[4]; + + +struct BEACON { + uint32_t bintervall; + aprsdecode_FILENAME bfile; + uint32_t btime; +}; + +typedef char TICKERCALL[31]; + +struct UDPSET; + + +struct UDPSET { + int32_t txd; + int32_t level; + int32_t quali; +}; + +static char sentemptymsg; + +static uint32_t uptime; + +static aprsdecode_FILENAME logframename; +/* netbeaconintervall, */ + +static uint32_t beaconrandomstart; + +static uint32_t nextbeep; + +static uint32_t rfbecondone; + +static uint32_t lastmsgtx; + +static uint32_t qwatchtime; + +static uint32_t connecttime; + +static uint32_t cycleservers; + +static uint32_t qas; + +static uint32_t qasc; + +static int32_t logframes; +/* passwd : ARRAY[0..5] OF CHAR; */ + +static uint32_t trygate; +/* actudp : pUDPSOCK; */ + +static aprsdecode_MONCALL ungate[7]; + +static uint32_t timehash[65536]; + +static uint32_t rfbeacont; + +static uint32_t dupetime; + +static uint32_t msgmid; + +static TICKERCALL frameticker[20]; + +/* calls in ticker headline */ +static uint32_t tickertime; + +static float maxspeed; + +static uint16_t crctable12[256]; + + +static void Err(const char text[], uint32_t text_len) +{ + osi_WrStr("aprsmap: ", 10ul); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); +} /* end Err() */ + + +extern uint32_t aprsdecode_trunc(float r) +{ + if (r<=0.0f) return 0UL; + else if (r>=2.E+9f) return 2000000000UL; + else return (uint32_t)X2C_TRUNCC(r,0UL,X2C_max_longcard); + return 0; +} /* end trunc() */ + + +extern float aprsdecode_floor(float r) +{ + float f; + f = (float)osi_realint(r); + if (f>r) f = f-1.0f; + return f; +} /* end floor() */ + + +static float sqr(float x) +{ + return x*x; +} /* end sqr() */ + + +extern void aprsdecode_posinval(struct aprspos_POSITION * pos) +{ + pos->long0 = 0.0f; + pos->lat = 0.0f; +} /* end posinval() */ + + +static char Watchclock(uint32_t * t, uint32_t intervall) +{ + uint32_t tn; + if (intervall>0UL || *t==0UL) { + /* send once */ + tn = aprsdecode_realtime; + if (*t<=tn) { + *t += intervall; + if (*t<=tn) *t = tn+intervall; + return 1; + } + if (*t>tn+intervall) *t = tn+intervall; + } + return 0; +} /* end Watchclock() */ + + +extern void aprsdecode_beeplim(int32_t lev, uint32_t hz, uint32_t ms) +/* beep with minimum quiet time */ +{ + if (aprsdecode_realtime>=nextbeep) { + xosi_beep(lev, hz, ms); + nextbeep = aprsdecode_realtime+5UL; + } +} /* end beeplim() */ + + +static void filepath(char s[], uint32_t s_len) +/* get path out of path + filename */ +{ + uint32_t j; + uint32_t i; + i = 0UL; + j = 0UL; + while (i='A' && (uint8_t)c<='Z' || (uint8_t) + c>='0' && (uint8_t)c<='9') || c=='-') || c=='+') || c=='_') + || c=='(') || c==')') || c=='=') { + s[j] = c; + ++j; + } + ++i; + } + if (j<=s_len-1) s[j] = 0; +} /* end alfanum() */ + + +static int32_t GetNum(char h[], uint32_t h_len, uint32_t * p, + uint32_t * n) +{ + char ok0; + int32_t GetNum_ret; + X2C_PCOPY((void **)&h,h_len); + h[h_len-1] = 0; + *n = 0UL; + ok0 = 0; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + ok0 = 1; + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + if (!ok0) { + GetNum_ret = -1L; + goto label; + } + GetNum_ret = 0L; + label:; + X2C_PFREE(h); + return GetNum_ret; +} /* end GetNum() */ + + +static void parms(void) +{ + char h[4096]; + char err; + char lasth; + uint32_t n; + uint32_t i; + uint32_t gatecnt; + int32_t ii; + err = 0; + aprsdecode_verb = 0; + gatecnt = 0UL; + for (;;) { + osi_NextArg(h, 4096ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + lasth = h[1U]; + if (lasth=='x') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n>=30UL) { + aprsdecode_initxsize = (int32_t)n; + } + else Err("-x xsize", 9ul); + } + else if (lasth=='y') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n>=20UL) { + aprsdecode_initysize = (int32_t)n; + } + else Err("-y xsize", 9ul); + } + else if (lasth=='z') { + osi_NextArg(h, 4096ul); + if (!aprsstr_StrToFix(&aprsdecode_parmfinezoom, h, + 4096ul) || aprsdecode_parmfinezoom<=1.0f) { + Err("-z zoomlevel", 13ul); + } + n = aprsdecode_trunc(aprsdecode_parmfinezoom); + aprsdecode_parmfinezoom = (1.0f+aprsdecode_parmfinezoom) + -(float)n; + aprsdecode_parmzoom = (int32_t)n; + } + else if (lasth=='m') { + osi_NextArg(h, 4096ul); + if (!aprsstr_StrToFix(&aprsdecode_mappos.long0, h, 4096ul)) { + Err("-m long lat", 12ul); + } + osi_NextArg(h, 4096ul); + if (!aprsstr_StrToFix(&aprsdecode_mappos.lat, h, 4096ul)) { + Err("-m long lat", 12ul); + } + aprsdecode_mappos.long0 = aprspos_rad0(aprsdecode_mappos.long0); + aprsdecode_mappos.lat = aprspos_rad0(aprsdecode_mappos.lat); + } + else if (lasth=='c') osi_NextArg(aprsdecode_lums.configfn, 257ul); + else if (lasth=='g') { + osi_NextArg(h, 4096ul); + if (gatecnt>9UL) Err("-g gateway table full", 22ul); + h[4095U] = 0; + if (h[0U]=='[') { + ii = 1L; + while (h[ii] && h[ii]!=']') ++ii; + if (h[ii]!=']' || h[ii+1L]!=':') Err("-g [url]:port", 14ul); + h[ii] = 0; + i = 1UL; + while (i<=4095UL) { + h[i-1UL] = h[i]; + ++i; + } + } + else ii = aprsstr_InStr(h, 4096ul, ":", 2ul); + if (ii>=0L) h[ii] = 0; + aprsstr_Assign(aprsdecode_gateways[gatecnt].url, 256ul, h, + 4096ul); + if (ii>0L) { + /* port number */ + ++ii; + i = 0UL; + while (ii<=4095L) { + h[i] = h[ii]; + ++i; + ++ii; + } + } + else osi_NextArg(h, 4096ul); + h[4095U] = 0; + ii = aprsstr_InStr(h, 4096ul, "#", 2ul); + if (ii>=0L) h[ii] = 0; + if (h[0U]==0) Err("-g url:port", 12ul); + aprsstr_Assign(aprsdecode_gateways[gatecnt].port, 6ul, h, + 4096ul); + if (ii>0L) { + /* we have a filter string */ + ++ii; + i = 0UL; + while (ii<=4095L) { + if (h[ii]==',') h[ii] = ' '; + h[i] = h[ii]; + ++i; + ++ii; + } + aprsstr_Assign(aprsdecode_gateways[gatecnt].filterst, 256ul, + h, 4096ul); + } + ++gatecnt; + } + else { + if (lasth=='h') { + osi_WrStrLn(" -c ", 21ul); + osi_WrStrLn(" -g :# connect to APRS-IS gat\ +eway, repeat -g to other", 74ul); + osi_WrStrLn(" gateways write favorites first fo\ +r 1 activ link to the best", 76ul); + osi_WrStrLn(" reachable and a polling link to r\ +evert immediately to preferred again", 86ul); + osi_WrStrLn(" -g www.db0anf.de:14580#m/300 -g 1\ +27.0.0.1:3000 -g [::1]:3000", 77ul); + osi_WrStrLn(" text sent to out connec\ +ted server -f m/50", 68ul); + osi_WrStrLn(" if blanks dont pass parameter set\ +tings use , (-f m/30,-d/CW)", 77ul); + osi_WrStrLn(" ipv6 if enabled by kernel", + 42ul); + osi_WrStrLn(" -h this", 21ul); + osi_WrStrLn(" -M :/[+[:]]", + 47ul); + osi_WrStrLn(" udp rf port (monitor frame format\ +) for local (t)rx", 67ul); + osi_WrStrLn(" : read from any ip,\ + dport=0 no tx", 64ul); + osi_WrStrLn(" +byte/s enable inet to rf for ser\ +vices like WLNK, WHO-IS", 73ul); + osi_WrStrLn(" :radius enable all inet to rf gat\ +e (from km around digi)", 73ul); + osi_WrStrLn(" repeat -M for each radio port wit\ +h a tx", 56ul); + osi_WrStrLn(" -o out file, delete after read", + 44ul); + osi_WrStrLn(" -R same as -M but axudp format", + 44ul); + osi_WrStrLn(" -v show frames and analytics on stdo\ +ut", 52ul); + osic_WrLn(); + X2C_ABORT(); + } + if (lasth=='C') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=100UL) { + aprsdecode_lums.centering = (int32_t)n; + } + else Err("-C center%", 11ul); + } + else if (lasth=='X') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=1024UL) { + aprsdecode_lums.sym = (int32_t)n; + } + else Err("-X symbollumen", 15ul); + } + else if (lasth=='O') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=1024UL) { + aprsdecode_lums.obj = (int32_t)n; + } + else Err("-O objectlumen", 15ul); + } + else if (lasth=='W') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=1024UL) { + aprsdecode_lums.waypoint = (int32_t)n; + } + else Err("-W waypointlumen", 17ul); + } + else if (lasth=='A') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=1024UL) { + aprsdecode_lums.text = (int32_t)n; + } + else Err("-A textlumen", 13ul); + } + else if (lasth=='T') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=1024UL) { + aprsdecode_lums.track = (int32_t)n; + } + else Err("-T tracklumen", 14ul); + } + else if (lasth=='F') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n>0UL) { + aprsdecode_lums.firstdim = n*60UL; + } + else Err("-F fadetime (min)", 18ul); + } + else if (lasth=='V') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n>0UL) { + aprsdecode_lums.fps = (int32_t)n; + } + else Err("-V fps", 7ul); + } + else if (lasth=='B') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n>0UL) { + aprsdecode_lums.maxdim = n*60UL; + } + else Err("-B blanktime (min)", 19ul); + } + else if (lasth=='P') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n>0UL) { + aprsdecode_lums.purgetime = n*60UL; + } + else Err("-P purgetime (min)", 19ul); + } + else if (lasth=='r') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=1024UL) { + aprsdecode_lums.rf = (int32_t)n; + } + else Err("-r rftracklumen", 16ul); + } + else if (lasth=='o') { + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetNum(h, 4096ul, &i, &n)>=0L && n<=1024UL) { + aprsdecode_lums.map = (int32_t)n; + } + else Err("-o maplumen", 12ul); + } + else if (lasth=='v') aprsdecode_verb = 1; + else err = 1; + } + } + else { + /*h[0]:=0C;*/ + err = 1; + } + if (err) break; + } + if (err) { + aprsstr_Append(h, 4096ul, " ? use -h", 10ul); + Err(h, 4096ul); + } +} /* end parms() */ + + +static void getval(const char s[], uint32_t s_len, uint32_t * i, + int32_t * v) +{ + char m; + ++*i; + *v = 0L; + m = s[*i]=='-'; + if (m) ++*i; + while ((*i='0') && (uint8_t)s[*i]<='9') { + *v = *v*10L+(int32_t)((uint32_t)(uint8_t)s[*i]-48UL); + ++*i; + } + while (*i' ') ++*i; + while (*itxd = res; + break; + case 'V': + getval(ub, ub_len, &i, &res); + modeminfo->level = res; + break; + case 'Q': + getval(ub, ub_len, &i, &res); + modeminfo->quali = res; + break; + default:; + getval(ub, ub_len, &i, &res); + break; + } /* end switch */ + } + } +} /* end decodeudp2() */ + + +static char getudp(uint32_t usock, aprsdecode_FRAMEBUF buf, + struct UDPSET * modeminfo, aprsstr_GHOSTSET ghostset) +{ + uint32_t fromport; + uint32_t ipn; + char crc2; + char crc1; + int32_t len; + uint32_t mlen; + aprsdecode_FRAMEBUF mbuf; + char udp2[100]; + aprsstr_GHOSTSET tmp; + ghostset = (uint32_t *)memcpy(tmp,ghostset,36u); + if ((int32_t)aprsdecode_udpsocks0[usock].fd<0L) return 0; + len = udpreceive(aprsdecode_udpsocks0[usock].fd, buf, 512L, &fromport, + &ipn); + if ((len>2L && len<512L) && (!aprsdecode_udpsocks0[usock].checkip || aprsdecode_udpsocks0[usock].ip==ipn) + ) { + /*WrInt(udpsend(usock^.fd, buf, len, usock^.dport, usock^.ip), 1); + WrStrLn(" us"); */ + memset((char *)modeminfo,(char)0,sizeof(struct UDPSET)); + buf[len] = 0; + if (aprsdecode_udpsocks0[usock].rawread) { + len -= 2L; + crc1 = buf[len]; + crc2 = buf[len+1L]; + aprsstr_AppCRC(buf, 512ul, len); + if (crc1!=buf[len] || crc2!=buf[len+1L]) { + if (aprsdecode_verb) osi_WrStrLn(" axudp crc error", 17ul); + buf[0UL] = 0; + } + else { + if (buf[0UL]=='\001') { + aprsstr_extrudp2(buf, 512ul, udp2, 100ul, &len); + decodeudp2(udp2, 100ul, modeminfo); + } + /*WrInt(modeminfo.txd, 5); WrInt(modeminfo.level, 5); + WrInt(modeminfo.quali, 5); WrStrLn(" modem"); */ + aprsstr_raw2mon(buf, 512ul, mbuf, 512ul, (uint32_t)len, &mlen, + ghostset); + memcpy(buf,mbuf,512u); + } + } + } + else return 0; + return 1; +} /* end getudp() */ + + +static int32_t Gettcp(int32_t fd, aprsdecode_FRAMEBUF line, + aprsdecode_FRAMEBUF buf, int32_t * pos) +{ + int32_t j; + int32_t i; + int32_t len; + int32_t tmp; + i = *pos; + if (i>=512L) i = 0L; + /* + len:=RdBin(fd, line, SIZE(line)-i); + IF len<=0 THEN RETURN -1 END; + (* disconnected *) + */ + /* + IF len<0 THEN len:=0 END; + */ + len = readsock(fd, line, 512L-i); + if (len<0L) return -1L; + if (*pos>=512L) { + /* hunt mode */ + i = 0L; + while (i=len) return 0L; + /* no line start found */ + *pos = 0L; + ++i; + j = 0L; + while (i0L) { + for (i = len-1L; i>=0L; i--) { + line[i+*pos] = line[i]; /* move up new */ + } /* end for */ + tmp = *pos-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + line[i] = buf[i]; /* ins buf before */ + if (i==tmp) break; + } /* end for */ + len += *pos; + *pos = 0L; + } + i = 0L; + while (i=len) { + /* no line end found */ + while (*pos=0L) { + res = sendsock(*fd, s, (int32_t)aprsstr_Length(s, s_len)); + osic_CloseSock(*fd); + *fd = -1L; + } + X2C_PFREE(s); +} /* end saybusy() */ + + +static void saylinkbad(int32_t s) +{ + char hh[101]; + char h[101]; + strncpy(h,"AprsIs uplink delays ",101u); + aprsstr_IntToStr(s, 1UL, hh, 101ul); + aprsstr_Append(h, 101ul, hh, 101ul); + aprsstr_Append(h, 101ul, "s", 2ul); + useri_textautosize(0L, 5L, 4UL, 10UL, 'r', h, 101ul); +} /* end saylinkbad() */ + + +static void WatchTXQ(aprsdecode_pTCPSOCK sock) +{ + int32_t sent; + int32_t j; + int32_t i; + int32_t rb; + int32_t acked; + int32_t qb; + char rest; + int32_t tmp; + qb = getunack(sock->fd); /* tcp unack sendqueue in byte */ + if (sock->lastping==0UL && qb==-1L) { + /* windoof */ + sock->lastping = 1UL; /* switch on ping-pong mode */ + return; + } + /* + configbool(fALLOWGATE, FALSE); + textautosize(0, 5, 6, 5, "r", + "TCP-Stack on this OS not usable for Igate, + gateing switched off"); + END; + */ + sent = (int32_t)(sock->txbytes-sock->qwatch.lasttb); + /* last second sent bytes */ + if (qb<=0L || sent<0L) sock->qwatch.qsize = 0L; + else { + /* we have unack bytes */ + acked = (sock->qwatch.lastqb-qb)+sent; /* acked bytes in last s */ + j = 0L; + rest = 0; + tmp = sock->qwatch.qsize-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + rb = sock->qwatch.txbyte[i]-acked; + sock->qwatch.txbyte[j] = rb; + if (rb>0L) rest = 1; + else acked = -rb; + if (rest) { + acked = 0L; + ++j; + } + if (i==tmp) break; + } /* end for */ + sock->qwatch.qsize = j; + if (sock->qwatch.qsize<=59L) { + sock->qwatch.txbyte[sock->qwatch.qsize] = sent; + ++sock->qwatch.qsize; + if (sock->qwatch.qsize>1L) saylinkbad(sock->qwatch.qsize); + if (sock->qwatch.qsize>15L) { + stoptxrx(sock->fd, 2L); /* delete unsent data */ + saybusy(&sock->fd, "\015\012", 3ul); /* close tcp immediately */ + } + } + } + /* sock^.slowlink:=TRUE; + (* for log message *) */ + sock->qwatch.lastqb = qb; + sock->qwatch.lasttb = sock->txbytes; +} /* end WatchTXQ() */ + + +static void tickermon(const char port[], uint32_t port_len, + char dir, uint32_t ot, const char s[], + uint32_t s_len) +{ + struct aprsdecode_DAT dat; + TICKERCALL h2; + TICKERCALL h1; + TICKERCALL h; + uint32_t cnt; + uint32_t i; + uint32_t tmp; + cnt = (uint32_t)useri_conf2int(useri_fWRTICKER, 0UL, 0L, 99L, 1L); + if (cnt==0UL && ot==0UL) cnt = 1UL; + if ((ot!=1UL && cnt>0UL) && aprsdecode_Decode(s, s_len, &dat)>=0L) { + h2[0] = 0; + if (cnt==1UL) { + if (ot==0UL) strncpy(h2,"New User: ",31u); + else if (ot<=aprsdecode_realtime) { + strncpy(h2,"since ",31u); + ot = aprsdecode_realtime-ot; + if (ot<180UL) { + aprsstr_IntToStr((int32_t)ot, 3UL, h1, 31ul); + aprsstr_Append(h1, 31ul, "s: ", 4ul); + } + else if (ot<10790UL) { + aprsstr_IntToStr((int32_t)((ot+10UL)/60UL), 3UL, h1, 31ul); + aprsstr_Append(h1, 31ul, "m: ", 4ul); + } + else { + aprsstr_IntToStr((int32_t)((ot+10UL)/3600UL), 3UL, h1, + 31ul); + aprsstr_Append(h1, 31ul, "h: ", 4ul); + } + aprsstr_Append(h2, 31ul, h1, 31ul); + } + } + aprsstr_Assign(h1, 31ul, port, port_len); + h1[0U] = X2C_CAP(h1[0U]); + aprsstr_Append(h2, 31ul, h1, 31ul); + aprsstr_Append(h2, 31ul, (char *) &dir, 1u/1u); + aprsstr_Append(h2, 31ul, dat.symcall, 9ul); + if (dat.wx.temp!=1.E+6f) { + aprsstr_FixToStr(aprstext_FtoC(dat.wx.temp), 2UL, h, 31ul); + aprsstr_Append(h2, 31ul, " ", 2ul); + aprsstr_Append(h2, 31ul, h, 31ul); + aprsstr_Append(h2, 31ul, "C", 2ul); + } + else if ((dat.altitude=1000L) + && dat.altitude>=useri_conf2int(useri_fALTMIN, 0UL, -10000L, + 65535L, -10000L)) { + aprsstr_Append(h2, 31ul, " ", 2ul); + aprsstr_IntToStr(dat.altitude, 1UL, h, 31ul); + aprsstr_Append(h2, 31ul, h, 31ul); + aprsstr_Append(h2, 31ul, "m", 2ul); + } + else if (dat.speed>0UL && dat.speed<2147483647UL) { + useri_confstr(useri_fKMH, h1, 31ul); + if (h1[0U]) { + aprsstr_IntToStr((int32_t)aprsdecode_trunc((float) + dat.speed*1.852f), 1UL, h, 31ul); + aprsstr_Append(h2, 31ul, " ", 2ul); + aprsstr_Append(h2, 31ul, h, 31ul); + aprsstr_Append(h2, 31ul, h1, 31ul); + } + } + for (i = 19UL; i>=1UL; i--) { + memcpy(frameticker[i],frameticker[i-1UL],31u); + } /* end for */ + memcpy(frameticker[0U],h2,31u); + if (tickertime!=aprsdecode_realtime) { + aprsstr_Assign(xosi_headmh, 251ul, h2, 31ul); + if (cnt>19UL) cnt = 19UL; + tmp = cnt-1UL; + i = 1UL; + if (i<=tmp) for (;; i++) { + aprsstr_Append(xosi_headmh, 251ul, " * ", 6ul); + aprsstr_Append(xosi_headmh, 251ul, frameticker[i], 31ul); + if (i==tmp) break; + } /* end for */ + tickertime = aprsdecode_realtime; + } + } +} /* end tickermon() */ + + +static void Stopticker(void) +{ + aprsstr_Assign(xosi_headmh, 251ul, "\015", 2ul); + tickertime = 0x0FFFFFFC3UL; + memset((char *)frameticker,(char)0,620UL); +} /* end Stopticker() */ + + +static void wrmon(uint32_t port, char dir, + const struct UDPSET modeminfo, uint32_t oldtime, + const char s[], uint32_t s_len) +{ + char mcon[10]; + char ms[31]; + if (port==0UL) strncpy(mcon,"n",10u); + else aprsstr_IntToStr((int32_t)port, 0UL, mcon, 10ul); + if ((dir=='>' || dir=='-') && useri_configon(useri_fWRTICKER)) { + tickermon(mcon, 10ul, dir, oldtime, s, s_len); + } + /*IF configon(fWRINCOM) THEN */ + useri_confstr(useri_fWRINCOM, ms, 31ul); + if (aprsstr_InStr(ms, 31ul, mcon, 10ul)>=0L) { + aprsstr_Append(mcon, 10ul, "+", 2ul); + aprstext_listin(s, s_len, X2C_CAP(mcon[0U]), dir, aprsstr_InStr(ms, + 31ul, mcon, 10ul)>=0L, modeminfo.quali, modeminfo.txd, + modeminfo.level); + } +/*END; */ +} /* end wrmon() */ + + +static char filtdupes(const char tb[], uint32_t tb_len, + uint32_t oport, uint32_t dt) +{ + uint32_t n2; + uint32_t n1; + uint32_t n; + uint32_t p; + uint8_t hashh; + uint8_t hashl; + struct aprsdecode_UDPSOCK * anonym; + hashl = 0U; + hashh = 0U; + p = 0UL; + n1 = 0UL; + n2 = 0UL; + for (;;) { + while (tb[p] && tb[p]!=':') ++p; + if (tb[p]!=':') break; + n1 = p; + ++p; + if (tb[p]!='}') break; + ++p; + n2 = p; + } + p = n2; + while (ppdupetimes==0) { + osic_alloc((char * *) &anonym->pdupetimes, 262144UL); + useri_debugmem.req = 262144UL; + useri_debugmem.mon += 262144UL; + if (anonym->pdupetimes==0) { + osi_WrStrLn("duptime out of memory", 22ul); + useri_wrheap(); + return 0; + } + memset((char *)anonym->pdupetimes,(char)0,262144UL); + } + if (anonym->pdupetimes[n]+dt>aprsdecode_realtime) return 0; + /* it is a dupe */ + anonym->pdupetimes[n] = aprsdecode_realtime; + } + return 1; +} /* end filtdupes() */ + + +static char Sendtcp(aprsdecode_pTCPSOCK to, + const aprsdecode_FRAMEBUF buf) +{ + int32_t i; + int32_t len; + char ok0; + struct UDPSET modeminfo; + struct aprsdecode_TCPSOCK * anonym; + int32_t tmp; + ok0 = 0; + if (to) { + if (to->connt>0UL) { + memset((char *) &modeminfo,(char)0,sizeof(struct UDPSET)); + wrmon(0UL, '<', modeminfo, 1UL, buf, 512ul); + } + len = (int32_t)aprsstr_Length(buf, 512ul); + { /* with */ + struct aprsdecode_TCPSOCK * anonym = to; + if (anonym->tlen+len<512L) { + tmp = len-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + anonym->tbuf[anonym->tlen] = buf[i]; + ++anonym->tlen; + if (i==tmp) break; + } /* end for */ + ++anonym->txframes; + anonym->txbytes += (uint32_t)len; + aprsdecode_lasttcptx = aprsdecode_realtime; + ok0 = 1; + } + else if (aprsdecode_verb) osi_WrStrLn("tx buf overflow", 16ul); + } + } + return ok0; +} /* end Sendtcp() */ + + +static int32_t Sendudp(const char s[], uint32_t s_len, + uint32_t uport, uint32_t dupetime0) +{ + int32_t len; + aprsdecode_FRAMEBUF raw; + struct UDPSET modeminfo; + struct aprsdecode_UDPSOCK * anonym; + len = -1L; + if ((uport<=3UL && (int32_t)aprsdecode_udpsocks0[uport].fd>=0L) + && aprsdecode_udpsocks0[uport].dport>0UL) { + if (dupetime0==0UL || filtdupes(s, s_len, uport, dupetime0)) { + aprsstr_mon2raw(s, s_len, raw, 512ul, &len); + if (len>1L) { + len = udpsend(aprsdecode_udpsocks0[uport].fd, raw, len, + aprsdecode_udpsocks0[uport].dport, + aprsdecode_udpsocks0[uport].ip); + if (len>0L) { + memset((char *) &modeminfo,(char)0, + sizeof(struct UDPSET)); + wrmon(uport+1UL, '<', modeminfo, 1UL, s, s_len); + { /* with */ + struct aprsdecode_UDPSOCK * anonym = &aprsdecode_udpsocks0[uport] + ; + ++anonym->txframes; + anonym->txbytes += (uint32_t)len; + anonym->lastudptx = aprsdecode_realtime; + if (anonym->starttime==0UL) { + anonym->starttime = aprsdecode_realtime; + } + } + } + } + else if (aprsdecode_verb) { + osi_WrStrLn("wrong rf monitor format", 24ul); + } + } + else len = 0L; + } + return len; +} /* end Sendudp() */ + +#define aprsdecode_MAXTXBIT 2000 +/* clamp to +- bit */ + +#define aprsdecode_MSGPREF 1000 +/* prefer msg time space */ + + +static char Checkbps(uint32_t uport, uint32_t bps, + uint32_t bytes, char msgprefer) +/* check/set bit/s for net>rf*/ +{ + uint32_t t; + struct aprsdecode_UDPSOCK * anonym; + if (bps>0UL && uport<=3UL) { + t = 2000UL/bps; + { /* with */ + struct aprsdecode_UDPSOCK * anonym = &aprsdecode_udpsocks0[uport]; + if (bytes==0UL) { + /* check */ + /*WrInt(bpstime-realtime, 10); WrStrLn(" check tx"); */ + if (anonym->bpstime<=aprsdecode_realtime+(1000UL/bps) + *(uint32_t)msgprefer) return 1; + t += aprsdecode_realtime; + if (anonym->bpstime>t) anonym->bpstime = t; + } + else { + /* set next tx time */ + if (anonym->bpstime+tbpstime = aprsdecode_realtime-t; + /* limit transmission at once */ + } + anonym->bpstime += (bytes*8UL)/bps; + } + } + } + /*WrInt(bpstime-realtime, 10); WrStrLn(" next tx"); */ + return 0; +} /* end Checkbps() */ + +#define aprsdecode_RAININCH 3.9370078740157 + +#define aprsdecode_SEP "," + + +static char csvget(char w[], uint32_t w_len, const char s[], + uint32_t s_len, uint32_t n) +{ + uint32_t j; + uint32_t i; + w[0UL] = 0; + i = 0UL; + while (n>0UL) { + if (i>s_len-1 || s[i]==0) return 0; + if (s[i]==',') --n; + ++i; + } + j = 0UL; + while (((j<=w_len-1 && i=0.0f && s[i]=='-') div0 = -div0; + else if ((uint8_t)s[i]>='0' && (uint8_t)s[i]<='9') { + *x = *x*10.0f+(float)((uint32_t)(uint8_t)s[i]-48UL); + if (*x>1.E+6f) { + val = 0; + break; + } + if (dot) div0 = div0*0.1f; + val = 1; + } + else if (!dot && s[i]=='.') dot = 1; + else break; + ++i; + if (i>s_len-1) break; + } + *x = *x*div0; + return val; +} /* end getreal() */ + + +static void apd(char ws[], uint32_t ws_len, char c, float v, + uint32_t f) +{ + int32_t d; + int32_t n; + char tmp; + if (c) aprsstr_Append(ws, ws_len, (char *) &c, 1u/1u); + n = (int32_t)X2C_TRUNCI(v+0.5f,X2C_min_longint,X2C_max_longint); + if (n<0L) { + aprsstr_Append(ws, ws_len, "-", 2ul); + n = -n; + --f; + } + d = 1L; + while (f>1UL) { + d = d*10L; + --f; + } + do { + aprsstr_Append(ws, ws_len, (char *)(tmp = (char)((n/d)%10L+48L), + &tmp), 1u/1u); + d = d/10L; + } while (d); +} /* end apd() */ + + +static void wxmacro(char ws[], uint32_t ws_len, char wms[], + uint32_t wms_len) +/* \\!wx.txt,,t,,h,b,,w3.6,d! */ +{ + struct aprsdecode_WX w; + uint32_t n; + int32_t payload; + int32_t len; + int32_t f; + float mul; + float v; + float winddir; + float wind; + char cb[1024]; + char ns[1024]; + char fn[1024]; + char cn[21]; + char c; + struct aprsdecode_DAT d; + X2C_PCOPY((void **)&wms,wms_len); + if (csvget(fn, 1024ul, wms, wms_len, 0UL)) { + /* csv filename */ + len = 0L; + if (fn[0U]) { + f = osi_OpenRead(fn, 1024ul); + if (osic_FdValid(f)) { + n = (uint32_t)osic_Size(f); + if (n>1024UL) osic_Seek(f, n-1024UL); + len = osi_RdBin(f, (char *)cb, 1024u/1u, 1024UL); + } + if (len>0L) { + while (len>0L && (uint8_t)cb[len-1L]<=' ') { + --len; /* find first visable char from end */ + } + if (len<=1023L) cb[len] = 0; + while (len>0L && (uint8_t)cb[len-1L]>=' ') { + --len; /* find begin of last csv line */ + } + aprsstr_Delstr(cb, 1024ul, 0UL, (uint32_t)len); + } + else cb[0U] = 0; + if (cb[0U]==0) { + aprsstr_Assign(ns, 1024ul, "wx csv file not readable ", 26ul); + aprsstr_Append(ns, 1024ul, fn, 1024ul); + useri_xerrmsg(ns, 1024ul); + wms[0UL] = 0; + goto label; + } + w.temp = 1.E+6f; + winddir = 1.E+6f; + wind = 1.E+6f; + w.gust = 1.E+6f; + w.hygro = 1.E+6f; + w.baro = 1.E+6f; + w.lum = 1.E+6f; + w.rain1 = 1.E+6f; + w.rain24 = 1.E+6f; + w.raintoday = 1.E+6f; + n = 1UL; + while (csvget(cn, 21ul, wms, wms_len, n)) { + c = cn[0U]; /* w3.6 */ + if (c) { + aprsstr_Delstr(cn, 21ul, 0UL, 1UL); /* 3.6 */ + if (!getreal(&mul, cn, 21ul)) mul = 1.0f; + if (csvget(ns, 1024ul, cb, 1024ul, n-1UL) && getreal(&v, ns, + 1024ul)) { + v = v*mul; + switch ((unsigned)c) { + case 't': + if (v>=(-60.0f) && v<=79.0f) w.temp = v; + break; + case 'g': + if (v>=0.0f && v<=500.0f) w.gust = v; + break; + case 'w': + if (v>=0.0f && v<=500.0f) wind = v; + break; + case 'd': + if (v>=0.0f && v<360.0f) winddir = v; + break; + case 'b': + if (v>=900.0f && v<=1100.0f) w.baro = v; + break; + case 'h': + if (v>=0.0f && v<=100.0f) w.hygro = v; + break; + case 'L': + if (v>=0.0f && v<=1500.0f) w.lum = v; + break; + case 'r': + if (v>=0.0f && v<=500.0f) w.rain1 = v; + break; + case 'P': + if (v>=0.0f && v<=500.0f) w.rain24 = v; + break; + case 'p': + if (v>=0.0f && v<=500.0f) w.raintoday = v; + break; + } /* end switch */ + } + } + ++n; + } + d.postyp = 'g'; + payload = aprsstr_InStr(ws, ws_len, ":", 2ul); + if (payload>0L) { + aprspos_GetPos(&d.pos, &d.speed, &d.course, &d.altitude, &d.sym, + &d.symt, ws, ws_len, 0UL, (uint32_t)(payload+1L), + d.comment0, 256ul, &d.postyp); + /* exchange spd/dir */ + if (d.postyp=='c') { + aprsstr_Delstr(ws, ws_len, (uint32_t)(payload+2L), ws_len); + d.speed = aprsdecode_trunc(X2C_DIVR(wind,1.609f)); + d.course = aprsdecode_trunc(winddir); + cb[0U] = d.symt; + cb[1U] = d.sym; + cb[2U] = 0; + aprstext_compressdata(d.pos, d.speed, d.course, 0L, cb, + 1024ul, cb, 1024ul); + aprsstr_Append(ws, ws_len, cb, 1024ul); + } + else if (d.postyp!='g') { + aprsstr_Assign(ns, 1024ul, "wx beacon not MICE encodable", + 29ul); + useri_xerrmsg(ns, 1024ul); + } + } + if (d.postyp!='c') { + if (winddir!=1.E+6f) apd(ws, ws_len, 0, winddir+1.0f, 3UL); + else aprsstr_Append(ws, ws_len, "...", 4ul); + if (wind!=1.E+6f) { + apd(ws, ws_len, '/', X2C_DIVR(wind,1.609f), 3UL); + } + else aprsstr_Append(ws, ws_len, "/...", 5ul); + } + if (w.gust!=1.E+6f) { + apd(ws, ws_len, 'g', X2C_DIVR(w.gust,1.609f), 3UL); + } + else aprsstr_Append(ws, ws_len, "g...", 5ul); + if (w.temp!=1.E+6f) { + apd(ws, ws_len, 't', aprstext_CtoF(w.temp), 3UL); + } + else aprsstr_Append(ws, ws_len, "t...", 5ul); + if (w.rain1!=1.E+6f) { + apd(ws, ws_len, 'r', w.rain1*3.9370078740157f, 3UL); + } + if (w.rain24!=1.E+6f) { + apd(ws, ws_len, 'P', w.rain24*3.9370078740157f, 3UL); + } + if (w.raintoday!=1.E+6f) { + apd(ws, ws_len, 'p', w.raintoday*3.9370078740157f, 3UL); + } + if (w.hygro!=1.E+6f) apd(ws, ws_len, 'h', w.hygro, 2UL); + if (w.baro!=1.E+6f) apd(ws, ws_len, 'b', w.baro*10.0f, 5UL); + if (w.lum!=1.E+6f) { + if (w.lum>=1000.0f) apd(ws, ws_len, 'l', w.lum-1000.0f, 3UL); + else apd(ws, ws_len, 'L', w.lum, 3UL); + } + } + else { + aprsstr_Assign(ns, 1024ul, "wx beacon macro needs valid filename ", + 38ul); + useri_xerrmsg(ns, 1024ul); + ws[0UL] = 0; + } + } + else { + aprsstr_Assign(ns, 1024ul, "wx beacon macro \\\\!filename,...! ", + 34ul); + useri_xerrmsg(ns, 1024ul); + ws[0UL] = 0; + } + label:; + X2C_PFREE(wms); +} /* end wxmacro() */ + +#define aprsdecode_MSYM "\\" + +#define aprsdecode_INSOPEN "<" + +#define aprsdecode_INSCLOSE ">" + +#define aprsdecode_DELOPEN "[" + +#define aprsdecode_DELCLOSE "]" + +#define aprsdecode_WROPEN ">" + +#define aprsdecode_WRCLOSE "<" + +#define aprsdecode_WXOPEN "!" + +#define aprsdecode_WXCLOSE "!" + + +static void beaconmacros(char s[], uint32_t s_len, + const char path[], uint32_t path_len, char wdata[], + uint32_t wdata_len, char all) +{ + uint32_t i; + int32_t j; + int32_t len; + char ns[256]; + char ds[256]; + char fn[1024]; + int32_t f; + char ok0; + char rwc; + char rw; + struct aprspos_POSITION pos; + X2C_PCOPY((void **)&wdata,wdata_len); + i = 0UL; + ns[0U] = 0; + while (i') rwc = '<'; + else if (rw=='[') rwc = ']'; + else if (rw=='!') rwc = '!'; + else rwc = 0; + if (rwc) { + /* insert or write file or insert and delete */ + fn[0U] = 0; + ++i; + while ((i') { + if (wdata[0UL]) { + /* write file */ + f = osi_OpenWrite(fn, 1024ul); + if (osic_FdValid(f)) { + osi_WrBin(f, (char *)wdata, (wdata_len)/1u, + aprsstr_Length(wdata, wdata_len)); + osic_Close(f); + } + } + } + else if (rw=='!') wxmacro(ns, 256ul, fn, 1024ul); + } + else if (s[i]=='\\') { + aprsstr_Append(ns, 256ul, "\\\\", 3ul); + } + else if (s[i]=='v') { + aprsstr_Append(ns, 256ul, "aprsmap(cu) 0.66", 17ul); + } + else if (s[i]=='l') { + if (aprstext_getmypos(&pos)) { + aprstext_postostr(pos, '2', ds, 256ul); + aprsstr_Append(ns, 256ul, ds, 256ul); + } + } + else if (s[i]=='p') aprsstr_Append(ns, 256ul, path, path_len); + else { + aprsstr_Assign(s, s_len, "bad beacon macro ", 18ul); + aprsstr_Append(s, s_len, ns, 256ul); + aprsstr_Append(s, s_len, "???", 4ul); + useri_xerrmsg(s, s_len); + s[0UL] = 0; + goto label; + } + } + else { + aprsstr_Append(ns, 256ul, "\\\\", 3ul); + aprsstr_Append(ns, 256ul, (char *) &s[i], 1u/1u); + } + } + else aprsstr_Append(ns, 256ul, (char *) &s[i], 1u/1u); + ++i; + } + aprsstr_Assign(s, s_len, ns, 256ul); + label:; + X2C_PFREE(wdata); +} /* end beaconmacros() */ + + +static void BuildNetBeacon(char h[], uint32_t h_len) +/* "!ddmm.mmNsdddmm.mms....." */ +{ + struct aprspos_POSITION mypos; + char h3[301]; + char h2[301]; + char h1[301]; + useri_confstr(useri_fMYSYM, h3, 301ul); + useri_confstr(useri_fNBTEXT, h2, 301ul); + if (!aprstext_getmypos(&mypos)) { + useri_xerrmsg("netbeacon: wrong my position", 29ul); + h[0UL] = 0; + return; + } + if (aprsstr_Length(h3, 301ul)!=2UL) { + useri_xerrmsg("netbeacon: wrong symbol", 24ul); + h[0UL] = 0; + return; + } + aprstext_postostr(mypos, '2', h1, 301ul); + aprsstr_Assign(h, h_len, "=", 2ul); + h1[8U] = h3[0U]; + h1[18U] = h3[1U]; + h1[19U] = 0; + aprsstr_Append(h, h_len, h1, 301ul); + beaconmacros(h2, 301ul, "", 1ul, "", 1ul, 1); + aprsstr_Append(h, h_len, h2, 301ul); +} /* end BuildNetBeacon() */ + + +static void SendNetBeacon(aprsdecode_pTCPSOCK cp, + const aprsdecode_FRAMEBUF b, char manual, + char errtxt[], uint32_t errtxt_len) +{ + int32_t ret; + struct aprsdecode_DAT dat; + uint32_t t; + if (b[0UL]==0 || aprsdecode_Decode(b, 512ul, &dat)<0L) { + aprsstr_Assign(errtxt, errtxt_len, "Net Beacon not Decodable", 25ul); + return; + } + if (!Sendtcp(cp, b)) { + if (manual) { + aprsstr_Assign(errtxt, errtxt_len, "Netport not connected", 22ul); + } + return; + } + if (aprsdecode_lums.logmode) { + ret = aprsdecode_Stoframe(&aprsdecode_ophist2, b, 512ul, + aprsdecode_realtime, 0, &t, dat); + } + else { + ret = aprsdecode_Stoframe(&aprsdecode_ophist0, b, 512ul, + aprsdecode_realtime, 0, &t, dat); + } +} /* end SendNetBeacon() */ + + +static void SendNet(aprsdecode_pTCPSOCK cp, char mycall[], + uint32_t mycall_len, const char data[], + uint32_t data_len, char manual, char errtxt[], + uint32_t errtxt_len) +/* make net header append string and send */ +{ + aprsdecode_FRAMEBUF s; + char pass[51]; + char h[51]; + uint32_t i; + X2C_PCOPY((void **)&mycall,mycall_len); + errtxt[0UL] = 0; + if (!useri_configon(useri_fALLOWNETTX) || !useri_configon(useri_fCONNECT)) + { + if (manual) { + aprsstr_Assign(errtxt, errtxt_len, + "Net Port not configured to Send", 32ul); + } + goto label; + } + if (mycall[0UL]) aprsstr_Assign(s, 512ul, mycall, mycall_len); + else useri_confstr(useri_fMYCALL, s, 512ul); + i = 0UL; + while (i<511UL && s[i]) { + if ((uint8_t)s[i]<=' ' || (uint8_t)s[i]>='\177') s[0UL] = 0; + ++i; + } + if (aprstext_callwrong(s, 512ul)) { + aprsstr_Assign(errtxt, errtxt_len, "netbeacon: no valid mycall", 27ul); + goto label; + } + useri_confstr(useri_fMSGNETDEST, h, 51ul); + if (h[0U]==0) { + aprsstr_Assign(errtxt, errtxt_len, "netbeacon: no destination call", + 31ul); + goto label; + } + if (manual) { + useri_confstr(useri_fPW, pass, 51ul); + if (pass[0U]==0) { + useri_xerrmsg("sending to Net without Passcode", 32ul); + } + } + aprsstr_Append(s, 512ul, ">", 2ul); + aprsstr_Append(s, 512ul, h, 51ul); + aprsstr_Append(s, 512ul, ",TCPIP*:", 9ul); + aprsstr_Append(s, 512ul, data, data_len); + aprsstr_Append(s, 512ul, "\015\012", 3ul); + SendNetBeacon(cp, s, manual, errtxt, errtxt_len); + label:; + X2C_PFREE(mycall); +} /* end SendNet() */ + + +static void makeping(uint32_t t, char pong, char b[], + uint32_t b_len) +{ + char s[21]; + if (pong) aprsstr_Assign(b, b_len, "pong ", 6ul); + else aprsstr_Assign(b, b_len, "ping ", 6ul); + aprsstr_IntToStr((int32_t)(t%86400UL), 0UL, s, 21ul); + aprsstr_Append(b, b_len, s, 21ul); +} /* end makeping() */ + + +static void sendping(aprsdecode_pTCPSOCK tp) +{ + char h[21]; + aprsdecode_FRAMEBUF s; + char ok0; + if (aprsdecode_realtimelastping) tp->lastping = aprsdecode_realtime; + if (aprsdecode_realtime>=tp->lastping+20UL) { + tp->lastping = aprsdecode_realtime; + if (tp->waitpong<=1U) ++tp->waitpong; + strncpy(s,"#",512u); + makeping(tp->lastping, 0, h, 21ul); + aprsstr_Append(s, 512ul, h, 21ul); + aprsstr_Append(s, 512ul, "\015\012", 3ul); + ok0 = Sendtcp(tp, s); + } +} /* end sendping() */ + + +static void getpong(aprsdecode_pTCPSOCK tp, const char mb[], + uint32_t mb_len) +{ + char s[21]; + makeping(tp->lastping, 1, s, 21ul); + if (aprsdecode_realtime<=tp->lastping+10UL && aprsstr_InStr(mb, mb_len, s, + 21ul)>=1L) { + tp->lastpong = aprsdecode_realtime; + tp->waitpong = 0U; + } +} /* end getpong() */ + + +static void Timebeacon(aprsdecode_pTCPSOCK cp) +{ + aprsdecode_FRAMEBUF h; + uint32_t bt; + char err[100]; + if (useri_configon(useri_fALLOWNETTX) && useri_configon(useri_fCONNECT)) { + bt = (uint32_t)useri_conf2int(useri_fNETBTIME, 0UL, 0L, + X2C_max_longint, 0L); + if ((bt>=1UL || cp->beacont==0UL) && Watchclock(&cp->beacont, bt)) { + if ((bt<60UL && bt>0UL) && cp->connt>0UL) { + useri_xerrmsg("Netbeacon: too fast", 20ul); + } + BuildNetBeacon(h, 512ul); + SendNet(cp, "", 1ul, h, 512ul, 0, err, 100ul); + useri_xerrmsg(err, 100ul); + } + if (cp->lastping>0UL && useri_configon(useri_fALLOWGATE)) sendping(cp); + } +} /* end Timebeacon() */ + +/* +PROCEDURE nibb(n:CARDINAL; VAR s:ARRAY OF CHAR); +BEGIN IF n<=9 THEN Append(s, CHR(n+ORD("0"))) ELSE Append(s, + CHR(n+(ORD("a")-10))) END END nibb; +*/ + +extern int32_t aprsdecode_knottokmh(int32_t kn) +{ + if (kn>=0L && kn<50000L) { + return (int32_t)aprsdecode_trunc((float)kn*1.852f+0.5f); + } + else return 0L; + return 0; +} /* end knottokmh() */ + + +static void NoWX(struct aprsdecode_WX * wx) +{ + wx->gust = 1.E+6f; + wx->temp = 1.E+6f; + wx->rain1 = 1.E+6f; + wx->rain24 = 1.E+6f; + wx->raintoday = 1.E+6f; + wx->hygro = 1.E+6f; + wx->baro = 1.E+6f; + wx->lum = 1.E+6f; + wx->sievert = 1.E+6f; + wx->storm = aprsdecode_WXNOWX; + wx->sustaind = 0.0f; + wx->radiushurr = 0.0f; + wx->radiusstorm = 0.0f; + wx->wholegale = 0.0f; +} /* end NoWX() */ + + +static void wpar(uint32_t * p, char buf[], uint32_t buf_len, + float * v, int32_t mindig, int32_t maxdig) +{ + char empty; + char dot; + char sn; + char c; + float x; + float div0; + dot = 0; + empty = 1; + sn = buf[*p]=='t'; + x = 0.0f; + div0 = 1.0f; + for (;;) { + ++*p; + c = buf[*p]; + if (sn && c=='-') { + div0 = -div0; + empty = 0; + --mindig; + --maxdig; + } + else if ((uint8_t)c>='0' && (uint8_t)c<='9') { + if (!dot && maxdig<=0L) { + x = 0.0f; + break; + } + x = x*10.0f+(float)((uint32_t)(uint8_t)buf[*p]-48UL); + if (x>1.E+5f) return; + if (dot) div0 = div0*0.1f; + else { + --mindig; + --maxdig; + } + empty = 0; + } + else if (empty) { + if (c!=' ' && c!='.') break; + } + else if (c=='.') { + if (dot) break; + dot = 1; + } + else break; + sn = 0; + } + if (!empty && mindig<=0L) *v = x*div0; +} /* end wpar() */ + + +static void wexp(char buf[], uint32_t buf_len, uint32_t * p, + float * v, float mul) +{ + uint32_t n; + float x; + x = 0.0f; + ++*p; + if ((uint8_t)buf[*p]>='0' && (uint8_t)buf[*p]<='9') { + x = 10.0f*(float)((uint32_t)(uint8_t)buf[*p]-48UL); + } + else return; + ++*p; + if ((uint8_t)buf[*p]>='0' && (uint8_t)buf[*p]<='9') { + x = x+(float)((uint32_t)(uint8_t)buf[*p]-48UL); + } + else return; + ++*p; + if ((uint8_t)buf[*p]>='0' && (uint8_t)buf[*p]<='9') { + n = (uint32_t)(uint8_t)buf[*p]-48UL; + while (n>0UL) { + x = x*10.0f; /* exponent */ + --n; + } + ++*p; + } + else return; + *v = x*mul; +} /* end wexp() */ + + +static void GetWX(struct aprsdecode_WX * wx, uint32_t * course, + uint32_t * speed, char buf[], uint32_t buf_len, + char storm) +{ + float wdir; + float wwind; + uint32_t p; + p = 0UL; + NoWX(wx); + wwind = 1.E+6f; + wdir = 1.E+6f; + /* IF buf[p]="_" THEN INC(p, 9) END; (* positionless wx *) */ + if (storm) { + /* storm data */ + /*4903.50N\07202.75W@088/036/HC/150^200/0980>090&030%040 */ + if (((buf[0UL]=='/' && buf[3UL]=='/') && buf[7UL]=='^') + && buf[11UL]=='/') { + ++p; + if (buf[1UL]=='T' && buf[2UL]=='S') wx->storm = aprsdecode_WXTS; + else if (buf[1UL]=='H' && buf[2UL]=='C') { + wx->storm = aprsdecode_WXHC; + } + else if (buf[1UL]=='T' && buf[2UL]=='D') { + wx->storm = aprsdecode_WXTD; + } + if (wx->storm) { + p += 2UL; + wpar(&p, buf, buf_len, &wx->sustaind, 3L, 3L); + wpar(&p, buf, buf_len, &wx->gust, 3L, 3L); + wpar(&p, buf, buf_len, &wx->baro, 4L, 4L); + if (buf[p]=='>') wpar(&p, buf, buf_len, &wx->radiushurr, 3L, 3L); + if (buf[p]=='&') { + wpar(&p, buf, buf_len, &wx->radiusstorm, 3L, 3L); + } + if (buf[p]=='%') wpar(&p, buf, buf_len, &wx->wholegale, 3L, 3L); + } + } + } + else { + /* normal wx */ + for (;;) { + switch ((unsigned)buf[p]) { + case 'g': + wpar(&p, buf, buf_len, &wx->gust, 3L, 3L); + break; + case 't': + wpar(&p, buf, buf_len, &wx->temp, 3L, 3L); + break; + case 'r': + wpar(&p, buf, buf_len, &wx->rain1, 3L, 3L); + break; + case 'p': + wpar(&p, buf, buf_len, &wx->rain24, 3L, 3L); + break; + case 'P': + wpar(&p, buf, buf_len, &wx->raintoday, 3L, 3L); + break; + case 'h': + wpar(&p, buf, buf_len, &wx->hygro, 2L, 3L); + break; + case 'b': + wpar(&p, buf, buf_len, &wx->baro, 5L, 5L); + break; + case 'L': + wpar(&p, buf, buf_len, &wx->lum, 3L, 3L); + break; + case 'l': + wpar(&p, buf, buf_len, &wx->lum, 3L, 3L); + wx->lum = wx->lum+1000.0f; + break; + case 'c': + wpar(&p, buf, buf_len, &wdir, 3L, 3L); + break; + case 's': + wpar(&p, buf, buf_len, &wwind, 3L, 3L); + break; + case 'X': + wexp(buf, buf_len, &p, &wx->sievert, 1.E-9f); + break; + default:; + goto loop_exit; + } /* end switch */ + } + loop_exit:; + wx->storm = aprsdecode_WXNORMAL; + } + wdir = wdir+0.5f; + if (wdir>=1.0f && wdir<361.0f) *course = aprsdecode_trunc(wdir); + if (wwind>=0.0f && wwind<1000.0f) *speed = aprsdecode_trunc(wwind); + aprsstr_Delstr(buf, buf_len, 0UL, p); +/* X123 is 12 * 10^3 nanosieverts/hr*/ +} /* end GetWX() */ + +#define aprsdecode_DATELEN 15 + + +static char wrlog(const char b[], uint32_t b_len, + uint32_t time0, char wfn[], uint32_t wfn_len, + int32_t good) +{ + int32_t f; + char h[1001]; + uint32_t i; + uint32_t l; + char wrlog_ret; + X2C_PCOPY((void **)&wfn,wfn_len); + if (wfn[0UL]==0) { + wrlog_ret = 0; + goto label; + } + l = aprsstr_Length(b, b_len); + while (l>0UL && (uint8_t)b[l-1UL]<='\015') --l; + if (l>0UL) { + aprsstr_cleanfilename(wfn, wfn_len); + f = osi_OpenAppendLong(wfn, wfn_len); + if (!osic_FdValid(f)) f = osi_OpenWrite(wfn, wfn_len); + if (!osic_FdValid(f)) { + wrlog_ret = 0; + goto label; + } + aprsstr_DateToStr(time0, h, 1001ul); + h[4U] = h[5U]; + h[5U] = h[6U]; + h[6U] = h[8U]; + h[7U] = h[9U]; + h[8U] = ':'; + h[9U] = h[11U]; + h[10U] = h[12U]; + h[11U] = h[14U]; + h[12U] = h[15U]; + h[13U] = h[17U]; + h[14U] = h[18U]; + if (good>=0L) h[15U] = ' '; + else h[15U] = '-'; + if (l>=984UL) l = 984UL; + i = 0UL; + do { + h[i+16UL] = b[i]; + ++i; + } while (icall,9u)) op = op->next; + return op; +} /* end findop() */ + + +static void poplogerr(char fn[], uint32_t fn_len) +{ + char h[1001]; + X2C_PCOPY((void **)&fn,fn_len); + strncpy(h,"\012logfile write error ",1001u); + aprsstr_Append(h, 1001ul, fn, fn_len); + aprsstr_Append(h, 1001ul, "\012", 2ul); + useri_textautosize(0L, 5L, 6UL, 4UL, 'e', h, 1001ul); + X2C_PFREE(fn); +} /* end poplogerr() */ + + +extern void aprsdecode_savetrack(void) +{ + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST pf; + char h[101]; + char fn[1001]; + char ap; + aprsdecode_MONCALL name; + name[0UL] = 0; + if (aprsdecode_click.mhop[0UL]) memcpy(name,aprsdecode_click.mhop,9u); + else if (aprsdecode_click.entries>0UL && aprsdecode_click.table[aprsdecode_click.selected] + .opf) { + memcpy(name,aprsdecode_click.table[aprsdecode_click.selected].opf->call, + 9u); + } + if (name[0UL]) { + op = findop(name, 0); + if (op) { + aprsstr_Assign(fn, 1001ul, op->call, 9ul); /* make 0C terminated */ + alfanum(fn, 1001ul); /* remove bad chars */ + aprsdecode_makelogfn(fn, 1001ul); + ap = osi_Exists(fn, 1001ul); + pf = op->frames; + while (pf) { + if (!wrlog(pf->vardat->raw, 500ul, pf->time0, fn, 1001ul, 0L)) { + poplogerr(fn, 1001ul); + return; + } + pf = pf->next; + } + if (ap) strncpy(h,"Append to logfile ",101u); + else strncpy(h,"Write logfile ",101u); + aprsstr_Append(h, 101ul, fn, 1001ul); + useri_say(h, 101ul, 4UL, 'b'); + } + } +} /* end savetrack() */ + + +static char replyack(char rep[], uint32_t rep_len, + char restack[], uint32_t restack_len, + const char ack[], uint32_t ack_len) +{ + aprsstr_Assign(rep, rep_len, ack, ack_len); + aprsstr_Assign(restack, restack_len, ack, ack_len); + if (aprsstr_Length(ack, ack_len)>2UL && ack[2UL]=='}') { + /* {xx}yy */ + rep[0UL] = ack[3UL]; + rep[1UL] = ack[4UL]; + if (rep_len-1>=2UL) rep[2UL] = 0; + if (restack_len-1>=2UL) restack[2UL] = 0; + return 1; + } + return 0; +} /* end replyack() */ + + +static char iscall(const aprsdecode_MONCALL b) +{ + uint32_t i; + uint32_t nu; + uint32_t li; + char c; + li = 0UL; + nu = 0UL; + for (i = 0UL; i<=2UL; i++) { + c = b[i]; + if ((uint8_t)c>='A' && (uint8_t)c<='Z') ++li; + else if ((uint8_t)c>='0' && (uint8_t)c<='9') { + if (i==0UL) ++li; + else ++nu; + } + } /* end for */ + return (nu+li==3UL && nu>=1UL) && nu<=2UL; +} /* end iscall() */ + + +static char viaghost(const char b[], uint32_t b_len) +/* n<>N */ +{ + uint32_t i; + char c; + i = aprsstr_Length(b, b_len); + if (i>3UL) { + c = b[i-1UL]; + if (((uint8_t)c>='0' && (uint8_t)c<='9') && c!=b[i-3UL]) return 1; + } + return 0; +} /* end viaghost() */ + +/* +PROCEDURE viaghost(b-:ARRAY OF CHAR):BOOLEAN; + (* ECHO GATE RELAY n=n ELSE ghost *) +VAR i:CARDINAL; + c:CHAR; +BEGIN + IF (b[0]="E") & (b[1]="C") & (b[2]="H") & (b[3]="O") & (b[4]=0C) + THEN RETURN FALSE END; + IF (b[0]="G") & (b[1]="A") & (b[2]="T") & (b[3]="E") & (b[4]=0C) + THEN RETURN FALSE END; + IF (b[0]="R") & (b[1]="E") & (b[2]="L") & (b[3]="A") & (b[4]="Y") + & (b[5]=0C) THEN RETURN FALSE E + i:=Length(b); + c:=b[i-1]; + IF (i>3) & (b[i-2]="-") & (c=b[i-3]) & (c>="1") & (c<="7") + THEN RETURN FALSE END; + RETURN TRUE +END viaghost; +*/ + +static float num(char buf[], uint32_t buf_len, uint32_t * p) +{ + char c; + char sig; + float f; + float r; + r = 0.0f; + sig = 0; + f = 1.0f; + for (;;) { + if (*p>buf_len-1 || (float)fabs(r)>=2.147483647E+9f) break; + c = buf[*p]; + if (sig==0 && c=='-' || c=='+') sig = c; + else if (f>0.5f && c=='.') f = f*0.1f; + else if ((uint8_t)c>='0' && (uint8_t)c<='9') { + if (f>0.5f) r = r*10.0f+(float)((uint32_t)(uint8_t)c-48UL); + else { + r = r+(float)((uint32_t)(uint8_t)c-48UL)*f; + f = f*0.1f; + } + } + else break; + ++*p; + if (sig==0) sig = '\001'; + } + if (r>=2.147483647E+9f) r = 2.147483647E+9f; + if (sig=='-') r = -r; + return r; +} /* end num() */ + + +static void skip(char buf[], uint32_t buf_len, uint32_t * p) +{ + if (*p<=buf_len-1 && buf[*p]==',') ++*p; +} /* end skip() */ + + +static uint32_t corrtime(uint32_t syst, uint32_t mt, uint32_t span) +/* complete modulo time to absolute */ +{ + mt = (span+mt%span)-syst%span; + if (mtspan+span/2UL) mt -= span; + mt += syst; + if (mt>=span) mt -= span; + return mt; +} /* end corrtime() */ + +#define aprsdecode_H 3600 + +#define aprsdecode_DAY 86400 + +#define aprsdecode_DEGUNIT 1.7453292519444E-7 +/* 1/100000 deg = 1.1111m*/ + + +static void GetHRT(struct aprspos_POSITION * pos, int32_t * altitude, + uint32_t * speed, const char buf[], uint32_t buf_len, + struct aprsdecode_HRTPOS hrtposes[], + uint32_t hrtposes_len, uint32_t * hrtlen, + uint32_t * hrttime) +{ + uint32_t p; + char cmd; + uint32_t i; + uint32_t crc; + uint32_t duration; + uint32_t wcnt; + float r; + float unit; + uint32_t ts; + struct aprspos_POSITION posh; + struct aprspos_POSITION dao; + char newcompos; + struct aprsdecode_HRTPOS * anonym; + uint32_t tmp; + /* $HR[t46531u1.5p48.0235,13.1512a367d15,11w-479,622,33w-5, + 2-4w7+2-3ww4-1-5wg435644353-10c27001] + t s utc modulo 24h modulo 1h or absolut since 1970 + p deg lat/long + a m altitude + v m/s speed + y m/s climb + d deg lat/long dao + w deg,deg,m,s lat long alt time + u 0.00001 deg,m unit + g direct heard gateway + c crc + q qrv mhz + r rx freq mhz or hz + */ + /*WrStrLn(buf); */ + *hrtlen = 0UL; + *hrttime = 0UL; + p = 0UL; + newcompos = 1; + /*WrInt(p, 10);WrStrLn(" compos"); */ + for (;;) { + if (p+3UL>buf_len-1 || buf[p]==0) return; + if (((buf[p]=='$' && buf[p+1UL]=='H') && buf[p+2UL]=='R') + && buf[p+3UL]=='[') break; + /*WrStrLn(" newcompos"); */ + ++p; + newcompos = 0; + } + p += 4UL; + ts = aprsdecode_systime; + unit = 1.0f; + duration = 0UL; + wcnt = 0UL; + dao.lat = 0.0f; + dao.long0 = 0.0f; + memset((char *)hrtposes,(char)0, + hrtposes_len*sizeof(struct aprsdecode_HRTPOS)); + crc = 0UL; + for (;;) { + cmd = buf[p]; + ++p; + if (cmd==0 || p>buf_len-1) { + *hrtlen = 0UL; /* end of string? */ + return; + } + if (cmd=='t') { + ts = aprsdecode_trunc(num(buf, buf_len, &p)+0.5f); + if (ts<3600UL) { + ts = corrtime(aprsdecode_systime, ts, 3600UL); + /* move system time max +-30min */ + } + else if (ts<90000UL) { + ts = corrtime(aprsdecode_systime, ts-3600UL, 86400UL); + /* move system time max +-12h */ + } + /* absolute time */ + *hrttime = ts; + } + else if (cmd=='u') unit = num(buf, buf_len, &p); + else if (cmd=='p') { + /* take position from extension if correct */ + posh.lat = aprspos_rad0(num(buf, buf_len, &p)); + skip(buf, buf_len, &p); + posh.long0 = aprspos_rad0(num(buf, buf_len, &p)); + if (aprspos_posvalid(posh)) *pos = posh; + } + else if (cmd=='a') { + /* take altitude from extension if correct */ + r = num(buf, buf_len, &p); + if (r>(-1.E+4f) && r<50000.0f) { + *altitude = (int32_t)X2C_TRUNCI(r+0.5f,X2C_min_longint, + X2C_max_longint); + } + } + else if (cmd=='v') { + /* take speed from extension if correct */ + r = num(buf, buf_len, &p); + if (r>0.0f && r<50000.0f) { + *speed = (uint32_t)(int32_t)X2C_TRUNCI(r+0.5f, + X2C_min_longint,X2C_max_longint); + } + } + else if (cmd=='d') { + /* ELSIF cmd="i" THEN (* define constant time intervall *) + */ + /* duration:=trunc(num()+0.5); */ + /* DAO, correct position */ + dao.lat = num(buf, buf_len, &p); + skip(buf, buf_len, &p); + dao.long0 = num(buf, buf_len, &p); + } + else if (cmd=='w') { + /* waypoints, first is difference from now */ + if (wcnt<=hrtposes_len-1) { + { /* with */ + struct aprsdecode_HRTPOS * anonym = &hrtposes[wcnt]; + anonym->dlat = num(buf, buf_len, &p); + skip(buf, buf_len, &p); + anonym->dlong = num(buf, buf_len, &p); + skip(buf, buf_len, &p); + anonym->dalt = num(buf, buf_len, &p); + anonym->notinterpolated = (anonym->dlat!=0.0f || anonym->dlong!=0.0f) + || anonym->dalt!=0.0f; + skip(buf, buf_len, &p); + r = num(buf, buf_len, &p); + anonym->dtime = aprsdecode_trunc((float)fabs(r)+0.5f); + if (r<0.0f) anonym->dtime = 0UL-anonym->dtime; + } + ++wcnt; + } + } + else if (cmd=='c') { + /* crc incl sender call and destination without ssid */ + crc = aprsdecode_trunc(num(buf, buf_len, &p)+0.5f); + } + else if (cmd==']') break; + } + /* + IF (wcnt>0) & (hrtposes[0].dtime>0) THEN + r:=1.0/FLOAT(wcnt); + kt:=r*FLOAT(hrtposes[0].dtime); + kx:=r*hrtposes[0].dlong; + ky:=r*hrtposes[0].dlat; + kh:=r*hrtposes[0].dalt; + FOR i:=1 TO wcnt-1 DO + r:=FLOAT(wcnt-i); + hrtposes[i].dtime:=trunc(kt*r + 0.5)-hrtposes[i].dtime; + hrtposes[i].dlong:=hrtposes[i].dlong + kx*r; + hrtposes[i].dlat :=hrtposes[i].dlat + ky*r; + hrtposes[i].dalt :=hrtposes[i].dalt + kh*r; + END; + + r:=unit*DEGUNIT; + pos.long:=pos.long + dao.long*r; + pos.lat :=pos.lat + dao.lat *r; + + FOR i:=0 TO wcnt-1 DO + hrtposes[i].dtime:=ts - hrtposes[i].dtime; + hrtposes[i].dlong:=pos.long + hrtposes[i].dlong*r; + hrtposes[i].dlat :=pos.lat + hrtposes[i].dlat*r; + hrtposes[i].dalt :=VAL(REAL, altitude) + hrtposes[i].dalt*unit; + --WrInt(hrtposes[i].dtime, 6); WrFixed(r, 8,15); WrFixed(dao.lat*r, 8,15); + WrFixed(hrtposes[i].dlat*360.0/PI2, 8,15); + WrFixed(hrtposes[i].dlong*360.0/PI2, 8,15); + WrInt(VAL(INTEGER, hrtposes[i].dalt), 6);WrStrLn(""); + + END; + hrtlen:=wcnt; + END; + */ + if (wcnt>0UL && hrtposes[0UL].dtime>0UL) { + tmp = wcnt-1UL; + i = 1UL; + if (i<=tmp) for (;; i++) { + hrtposes[i].dtime += hrtposes[i-1UL].dtime-hrtposes[i-1UL] + .dtime/((wcnt-i)+1UL); + if (hrtposes[i-1UL].dtime>0UL) { + r = X2C_DIVR((float)hrtposes[i].dtime, + (float)hrtposes[i-1UL].dtime); + hrtposes[i].dlong = hrtposes[i].dlong+hrtposes[i-1UL].dlong*r; + hrtposes[i].dlat = hrtposes[i].dlat+hrtposes[i-1UL].dlat*r; + hrtposes[i].dalt = hrtposes[i].dalt+hrtposes[i-1UL].dalt*r; + } + if (i==tmp) break; + } /* end for */ + r = unit*1.7453292519444E-7f; + pos->long0 = pos->long0+dao.long0*r; + pos->lat = pos->lat+dao.lat*r; + tmp = wcnt-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + hrtposes[i].dtime = ts-hrtposes[i].dtime; + hrtposes[i].dlong = pos->long0+hrtposes[i].dlong*r; + hrtposes[i].dlat = pos->lat+hrtposes[i].dlat*r; + hrtposes[i].dalt = (float)*altitude+hrtposes[i].dalt*unit; + if (i==tmp) break; + } /* end for */ + /*WrInt(hrtposes[i].dtime, 6); WrFixed(r, 8,15); + WrFixed(dao.lat*r, 8,15); + WrFixed(hrtposes[i].dlat*360.0/PI2, 8,15); + WrFixed(hrtposes[i].dlong*360.0/PI2, 8,15); + WrInt(VAL(INTEGER, hrtposes[i].dalt), 6);WrStrLn(""); */ + *hrtlen = wcnt; + } +/* IF newcompos THEN compos:=p END; */ +/*WrInt(compos, 10);WrStrLn(" composret"); */ +} /* end GetHRT() */ + + +static char r91(uint16_t * n, char c) +{ + if ((uint8_t)c<'!' || (uint8_t)c>'|') return 0; + *n = (uint16_t)((uint32_t)( *n*91U)+((uint32_t)(uint8_t)c-33UL)); + return 1; +} /* end r91() */ + + +static void GetTLM(aprsdecode_TELEMETRY v, char b[], uint32_t b_len) +{ + uint32_t ib; + uint32_t ia; + uint32_t j; + uint32_t i; + aprsdecode_TELEMETRY t; + uint32_t tmp; + ia = 0UL; + ib = 0UL; + i = 0UL; + while (i0UL && (ia-ib&1)) && ia-ib>=5UL) && ia-ib<=15UL) { + /*& (b[ia]=0C)*/ + i = 0UL; + j = ib; + do { + t[i] = 0U; + if (!r91(&t[i], b[j]) || !r91(&t[i], b[j+1UL])) return; + ++i; + j += 2UL; + } while (j+1ULsize = 0UL; + md->linetyp = 'a'; + md->filltyp = '0'; + i = 0UL; + s = 0UL; + *delfrom = (buf_len-1)+1UL; + while (i='a' && (uint8_t)c<='l') { + md->linetyp = c; + s = 3UL; + } + else s = 0UL; + } + else if (s==3UL) { + if ((uint8_t)c>='0' && (uint8_t)c<='9') { + md->filltyp = c; + s = 4UL; + } + else s = 0UL; + } + else if (s==4UL) { + if ((uint8_t)c>='!' && (uint8_t)c<='q') { + scale = osic_exp((float)((uint32_t)(uint8_t)c-33UL) + *1.15129255E-1f)*1.7453292519444E-6f; + /* 10^(x/20)*0.0001 deg */ + s = 5UL; + idx = 0UL; + } + else s = 0UL; + } + else if (s==5UL || s==6UL) { + if ((uint8_t)c>='!' && (uint8_t)c<='z') { + if (idx<=40UL) { + v = ((float)(uint32_t)(uint8_t)c-78.0f)*scale; + /*WrFixed(v/RAD, 5, 10); WrStrLn(" deg"); */ + if (s==5UL) { + md->vec[idx].lat = v; + s = 6UL; + } + else { + md->vec[idx].long0 = -v; + s = 5UL; + ++idx; + } + } + else s = 0UL; + } + else if (s==5UL && c=='{') s = 7UL; + else s = 0UL; + /* + ELSIF (s>=7) & (s<=11) THEN + IF c>" " THEN INC(s) ELSE s:=0 END; + IF s=12 THEN + md.size:=idx; + RETURN (* protocol done *) + + END; + */ + if (s==7UL) { + md->size = idx; + return; + } + } + else { + /* protocol done */ + s = 0UL; + } + ++i; + } +} /* end GetMultiline() */ + + +extern char aprsdecode_ismultiline(char editing) +{ + char s[251]; + uint32_t i; + struct aprsdecode_MULTILINE ml; + if (editing) { + useri_confstr(useri_fRBPOSTYP, s, 251ul); + if (s[0U]!='L') return 0; + } + useri_confstr(useri_fRBCOMMENT, s, 251ul); + aprsdecode_GetMultiline(s, 251ul, &i, &ml); + return ml.size>=2UL; +} /* end ismultiline() */ + +#define aprsdecode_GRIDSIZE 88 + +#define aprsdecode_RA 3.4377467707849E+7 + + +static void app(char buf[], uint32_t buf_len, float d) +{ + char tmp; + /*WrFixed(d, 5, 8); WrStr(" "); */ + d = d+78.5f; + if (d>=33.0f && d<=209.0f) { + aprsstr_Append(buf, buf_len, + (char *)(tmp = (char)aprsdecode_trunc(d),&tmp), + 1u/1u); + } +} /* end app() */ + + +static void EncMultiline(char buf[], uint32_t buf_len, + struct aprspos_POSITION * center, + struct aprsdecode_MULTILINE md) +{ + uint32_t i; + uint32_t scaler; + float scale; + struct aprspos_POSITION max0; + struct aprspos_POSITION min0; + /* find size */ + struct aprspos_POSITION * anonym; + char tmp; + min0.lat = 6.283185307f; + min0.long0 = 6.283185307f; + max0.lat = (-6.283185307f); + max0.long0 = (-6.283185307f); + i = 0UL; + while (ilatlat; + if (anonym->lat>max0.lat) max0.lat = anonym->lat; + if (anonym->long0long0; + if (anonym->long0>max0.long0) max0.long0 = anonym->long0; + } + ++i; + } + center->lat = (max0.lat+min0.lat)*0.5f; + center->long0 = (max0.long0+min0.long0)*0.5f; + scale = max0.lat-min0.lat; + if (max0.long0-min0.long0>scale) scale = max0.long0-min0.long0; + /*WrFixed(scale, 10, 15); WrStrLn(" scaleo"); */ + if (scale<1.57079632675f) { + if (scale>0.0f) { + scaler = aprsdecode_trunc(X2C_DIVR(osic_ln(X2C_DIVR(scale, + 1.5358897417111E-4f)),1.15129255E-1f)+1.0f); + /*WrInt(scaler, 10);WrStrLn(" scaler"); */ + scale = osic_exp((float)scaler*1.15129255E-1f) + *1.5358897417111E-4f; /* 10^(x/20)*0.0001 deg */ + /*WrFixed(scale, 10, 15); WrStrLn(" scale"); */ + scale = X2C_DIVR(88.0f,scale); + } + else { + scaler = 0UL; + scale = 0.0f; + } + aprsstr_Assign(buf, buf_len, " }", 3ul); + aprsstr_Append(buf, buf_len, (char *) &md.linetyp, 1u/1u); + aprsstr_Append(buf, buf_len, (char *) &md.filltyp, 1u/1u); + aprsstr_Append(buf, buf_len, + (char *)(tmp = (char)(33UL+scaler),&tmp), 1u/1u); + i = 0UL; + while (ilat)*scale); + app(buf, buf_len, (center->long0-md.vec[i].long0)*scale); + ++i; + } + /* scale:=ln(scale/(0.0001*RAD))/(2.3025851/20.0); */ + aprsstr_Append(buf, buf_len, "{", 2ul); + } + else { + /* + lati :=trunc(ABS(center.lat) *RA); + longi:=trunc(ABS(center.long)*RA); + latd :=VAL(CARDINAL, lati ) MOD 100; + longd:=VAL(CARDINAL, longi) MOD 100; + lati :=lati -latd; + longi:=longi-longd; + + WrInt(latd,0); WrStrLn(" latd"); + */ + /*WrStrLn(" <-appended"); */ + buf[0UL] = 0; + } +} /* end EncMultiline() */ + + +extern void aprsdecode_appendmultiline(struct aprspos_POSITION pos) +{ + char h[251]; + char cso[251]; + char cs[251]; + struct aprsdecode_MULTILINE ml; + struct aprspos_POSITION center; + uint32_t i; + char msgc; + /* make absolute */ + struct aprspos_POSITION * anonym; + useri_confstr(useri_fRBPOS, cs, 251ul); + if (cs[0U]) aprstext_deganytopos(cs, 251ul, ¢er); + else aprsdecode_posinval(¢er); + useri_confstr(useri_fRBCOMMENT, cso, 251ul); + aprsdecode_GetMultiline(cso, 251ul, &i, &ml); + if (i<=250UL) cso[i] = 0; + if (ml.size<2UL) aprsdecode_click.insreplaceline = 1; + /*WrStr("<<<");WrStr(cso);WrStrLn(">>> csodel"); */ + i = 0UL; + while (ilat = anonym->lat+center.lat; + anonym->long0 = anonym->long0+center.long0; + } + ++i; + } + if (ml.size>40UL) ml.size = 41UL; + if (aprsdecode_click.polilinecursor>=ml.size) { + aprsdecode_click.polilinecursor = ml.size; + } + if (aprspos_posvalid(pos)) { + if (aprsdecode_click.insreplaceline) { + if (ml.size<40UL) { + /* insert line */ + i = 40UL; + while (i>0UL && i>aprsdecode_click.polilinecursor) { + ml.vec[i] = ml.vec[i-1UL]; + --i; + } + ml.vec[aprsdecode_click.polilinecursor] = pos; + if (aprsdecode_click.polilinecursor>=ml.size) { + ++aprsdecode_click.polilinecursor; + } + ++ml.size; + } + } + else ml.vec[aprsdecode_click.polilinecursor] = pos; + } + else { + /* delete line */ + i = aprsdecode_click.polilinecursor; + while (i<40UL) { + ml.vec[i] = ml.vec[i+1UL]; + ++i; + } + if (ml.size>0UL) --ml.size; + } + if (ml.size<=33UL) msgc = 'b'; + else if (ml.size<40UL) msgc = 'r'; + else msgc = 'e'; + aprsstr_IntToStr((int32_t)ml.size, 0UL, h, 251ul); + aprsstr_Append(h, 251ul, " elements", 10ul); + useri_textautosize(0L, 0L, 6UL, 2UL, msgc, h, 251ul); + EncMultiline(cs, 251ul, ¢er, ml); + aprsstr_Append(cso, 251ul, cs, 251ul); + useri_AddConfLine(useri_fRBCOMMENT, 1U, cso, 251ul); + /*WrInt(ml.size, 10); WrStr("<<<");WrStr(cso);WrStrLn(">>> csoapp"); */ + aprstext_postostr(center, '3', cs, 251ul); + useri_AddConfLine(useri_fRBPOS, 1U, cs, 251ul); /* update new center */ + aprsdecode_tracenew.winevent = 2000UL; +} /* end appendmultiline() */ + + +extern void aprsdecode_modmultiline(uint32_t n) +{ + struct aprspos_POSITION pos; + struct aprsdecode_MULTILINE ml; + uint32_t i; + char s[251]; + uint32_t v; + if (n==1UL) { + /* del line */ + aprsdecode_posinval(&pos); + aprsdecode_appendmultiline(pos); + } + else { + useri_confstr(useri_fRBCOMMENT, s, 251ul); + aprsdecode_GetMultiline(s, 251ul, &i, &ml); + if (n==2UL) { + /* colour */ + if (ml.size>0UL) { + v = (uint32_t)(uint8_t)s[i+2UL]; + v += 3UL; + if (v>108UL) v -= 12UL; + s[i+2UL] = (char)v; + } + } + else if (n==3UL) { + /* colour */ + if (ml.size>0UL) { + v = (uint32_t)(uint8_t)s[i+2UL]; + ++v; + if (v%3UL==1UL) v -= 3UL; + s[i+2UL] = (char)v; + } + } + else if (n==4UL) { + /* poliline/poligone */ + if (ml.size>0UL) { + s[i+3UL] = (char)((uint32_t)(uint8_t)s[i+3UL]+1UL); + if ((uint8_t)s[i+3UL]<'0' || (uint8_t)s[i+3UL]>'9') { + s[i+3UL] = '0'; + } + } + } + useri_AddConfLine(useri_fRBCOMMENT, 1U, s, 251ul); + } + aprsdecode_tracenew.winevent = 2000UL; +} /* end modmultiline() */ + +/* === multiline */ +/* +PROCEDURE checksymb(symt, symb:CHAR):BOOLEAN; + (* true for bad symbol *) +BEGIN +(* + RETURN (symt<>"/") & (symt<>"\") & ((InStr("#&0>AW^_acnsuvz", symb)<0) + OR ((symt<"0") OR (symt>"9")) & ((symt<"A") OR (symt>"Z"))) +*) + RETURN (symt<>"/") & (symt<>"\") & (((symt<"0") OR (symt>"9")) + & ((symt<"A") OR (symt>"Z")) & ((symt<"a") OR (symt>"z"))) +END checksymb; +*/ +static aprsdecode_SET256 _cnst = {0x00000000UL,0x03FF8000UL,0x17FFFFFEUL, + 0x07FFFFFEUL,0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL}; + +extern int32_t aprsdecode_Decode(char buf[], uint32_t buf_len, + struct aprsdecode_DAT * dat) +{ + uint32_t ia; + uint32_t iv; + uint32_t micedest; + uint32_t len; + uint32_t p; + uint32_t i; + char thirdparty; + memset((char *)dat,(char)0,sizeof(struct aprsdecode_DAT)); + dat->speed = X2C_max_longcard; + dat->altitude = X2C_max_longint; + NoWX(&dat->wx); + len = 0UL; + while ((lenlen || buf[i-1UL]!='}')); + thirdparty = p!=0UL; + i = 0UL; + while (buf[p]!='>') { + /* source call */ + if (p>=len || i>8UL) return -1L; + dat->symcall[i] = buf[p]; + ++p; + ++i; + } + memcpy(dat->srcall,dat->symcall,9u); + ++p; + micedest = p; + i = 0UL; + while (buf[p]!=',' && buf[p]!=':') { + /* dest call */ + if (p>=len || i>8UL) return -1L; + dat->dstcall[i] = buf[p]; + ++p; + ++i; + } + iv = 0UL; + while (buf[p]==',') { + if (iv>9UL) iv = 9UL; + ++p; + if (((((thirdparty && buf[p]=='T') && buf[p+1UL]=='C') + && buf[p+2UL]=='P') && buf[p+3UL]=='I') + && buf[p+4UL]=='P' || ((buf[p]=='q' && buf[p+1UL]=='A') + && buf[p+2UL]!='C') && iv<9UL) dat->igatep = iv+1UL; + if (dat->igatep==iv) dat->igaterawp = p; + i = 0UL; + while (buf[p]!=',' && buf[p]!=':') { + if (p>=len) return -1L; + if (buf[p]=='*') { + if (dat->igatep==0UL && dat->hbitp==0UL) dat->hbitp = iv+1UL; + } + else if (i<=8UL) { + dat->viacalls[iv][i] = buf[p]; + ++i; + } + ++p; + } + /* IF dat.igatep=iv THEN dat.igatelen:=p-dat.igaterawp END; */ + if (dat->igatep==iv) dat->igatelen = i; + ++iv; + } + if (dat->hbitp>0UL || iv>(uint32_t)(dat->igatep!=0UL) + *2UL && viaghost(dat->viacalls[0UL], 9ul)) { + /* maybe not direct */ + i = 0UL; + while ((i<9UL && ihbitp) && iscall(dat->viacalls[i])) ++i; + dat->hbitp = i+1UL; + } + else dat->hbitp = 0UL; + /*WrInt(dat.hbitp, 1);WrStrLn("=h"); */ + if (p+1UL>=len || buf[p]!=':') return -1L; + ++p; + dat->payload = p; + dat->typc = buf[dat->payload]; + switch ((unsigned)dat->typc) { + case '\034': + case '\035': + case '\'': + case '`': + dat->type = aprsdecode_MICE; + break; + case '!': + case '$': + case '/': + case '=': + case '@': + dat->type = aprsdecode_POS; + break; + case '#': + case '*': + dat->type = aprsdecode_WETH; + break; + case '_': + dat->type = aprsdecode_PWETH; + dat->sym = '_'; /* positionless wx */ + dat->symt = '/'; + break; + case ':': + dat->type = aprsdecode_MSG; + break; + case ';': + dat->type = aprsdecode_OBJ; + break; + case ')': + dat->type = aprsdecode_ITEM; + break; + case '<': + dat->type = aprsdecode_SCAP; + break; + case '>': + dat->type = aprsdecode_STAT; + break; + case 'T': + dat->type = aprsdecode_TELE; + break; + case '?': + dat->type = aprsdecode_QUERY; + break; + default:; + dat->type = aprsdecode_UNKNOWN; + break; + } /* end switch */ + ++p; + if (dat->type==aprsdecode_OBJ) { + /* object */ + if (buf[p+9UL]=='_' || buf[p+9UL]=='*') { + memcpy(dat->objectfrom,dat->symcall,9u); + i = 0UL; + while (i<=8UL) { + if (p+i>=len) return -1L; + dat->symcall[i] = buf[p+i]; + ++i; + } + if (buf[p+i]=='_') dat->objkill = '1'; + else if (buf[p+i]!='*') dat->type = aprsdecode_UNKNOWN; + dat->timestamp = buf[p+16UL]; + while (i>0UL && (uint8_t)dat->symcall[i-1UL]<=' ') { + dat->symcall[i-1UL] = 0; + --i; + } + } + else dat->type = aprsdecode_UNKNOWN; + } + else if (dat->typc==')') { + /* item */ + memcpy(dat->objectfrom,dat->symcall,9u); + i = 0UL; + while (buf[p+i]!='!' && buf[p+i]!='_') { + if (p+i>=len) return -1L; + if (i<=8UL) dat->symcall[i] = buf[p+i]; + ++i; + } + if (i<=8UL) dat->symcall[i] = 0; + if (buf[p+i]=='_') dat->objkill = '1'; + } + else if (dat->typc==':') { + /* msg, bulletin */ + if (buf[p+9UL]==':') { + i = 0UL; + while (i<9UL && p' ') dat->msgto[i] = buf[p]; + ++i; + ++p; + } + if (X2C_STRCMP(dat->msgto,9u,dat->symcall,9u)==0) { + dat->type = aprsdecode_TELE; /* msg to itself */ + } + ++p; + i = 0UL; + if ((buf[p]=='r' && buf[p+1UL]=='e') && buf[p+2UL]=='j') { + dat->ackrej = aprsdecode_MSGREJ; /* reject */ + } + else if ((buf[p]=='a' && buf[p+1UL]=='c') && buf[p+2UL]=='k') { + dat->ackrej = aprsdecode_MSGACK; /* ack */ + } + if (dat->ackrej>aprsdecode_MSGMSG) { + p += 3UL; + while ((i<=4UL && (uint8_t)buf[p]>' ') && packtext[i] = buf[p]; + ++i; + ++p; + } + } + else { + i = p; + ia = len; + while (imsgtext[i] = buf[p]; + ++i; + ++p; + } + dat->ackrej = aprsdecode_MSGMSG; + if (buf[p]=='{') { + /* message ack */ + i = 0UL; + ++p; + while ((i<=4UL && (uint8_t)buf[p]>' ') && packtext[i] = buf[p]; + ++i; + ++p; + } + } + } + } + } + else if (dat->typc=='?') { + /* general query */ + i = 0UL; + while ((i<9UL && (uint8_t)buf[p]>' ') && pmsgto[i] = buf[p]; + ++i; + ++p; + } + } + /* dat.course:=MAX(CARDINAL); */ + dat->course = 0UL; + if (X2C_IN((int32_t)dat->type,12,0xCEU)) { + aprspos_GetPos(&dat->pos, &dat->speed, &dat->course, &dat->altitude, + &dat->sym, &dat->symt, buf, buf_len, micedest, dat->payload, + dat->comment0, 256ul, &dat->postyp); + aprspos_GetSym(dat->dstcall, 9ul, &dat->sym, &dat->symt); + if (!X2C_INL((uint8_t)dat->symt,256,_cnst)) { + dat->symt = 0; /* wrong symbol */ + dat->sym = 0; + } + if (dat->postyp=='A' && dat->type==aprsdecode_OBJ) { + /* area object */ + dat->areasymb.typ = (char)((dat->course/100UL)%10UL+48UL); + dat->areasymb.color = (uint8_t)(dat->speed/100UL); + dat->areasymb.dpos.lat = sqr((float)(dat->course%100UL)) + *1.454441043287E-6f; + dat->areasymb.dpos.long0 = sqr((float)(dat->speed%100UL)) + *1.454441043287E-6f; + if (dat->areasymb.typ=='6') { + dat->areasymb.dpos.long0 = -dat->areasymb.dpos.long0; + /* line to left down */ + } + dat->pos.lat = dat->pos.lat-dat->areasymb.dpos.lat; + dat->pos.long0 = dat->pos.long0+dat->areasymb.dpos.long0; + /* shift pos to middle of area */ + dat->speed = 0UL; + dat->course = 0UL; + } + if (dat->type==aprsdecode_OBJ || dat->type==aprsdecode_ITEM) { + aprsdecode_GetMultiline(dat->comment0, 256ul, &i, &dat->multiline); + if (dat->multiline.size>0UL) dat->postyp = 'L'; + } + GetHRT(&dat->pos, &dat->altitude, &dat->speed, dat->comment0, 256ul, + dat->hrtposes, 32ul, &dat->hrtlen, &dat->hrttime); + GetTLM(dat->tlmvalues, dat->comment0, 256ul); + } + else { + i = 0UL; + p = dat->payload+(uint32_t)(dat->type!=aprsdecode_UNKNOWN); + while (pcomment0[i] = buf[p]; + ++p; + ++i; + } + } + if (X2C_IN((int32_t)dat->type,12,0xCCU)) { + if (dat->sym=='_' || dat->type==aprsdecode_PWETH) { + if (dat->type==aprsdecode_PWETH) { + aprsstr_Delstr(dat->comment0, 256ul, 0UL, 8UL); + } + GetWX(&dat->wx, &dat->course, &dat->speed, dat->comment0, 256ul, 0); + } + else if (dat->sym=='@') { + GetWX(&dat->wx, &dat->course, &dat->speed, dat->comment0, 256ul, 1); + } + /* + IF dat.wx.storm>WXNORMAL THEN + dat.areasymb.typ:="5"; (* circle *) + dat.areasymb.color:=5; + dat.areasymb.dpos.lat :=0.006; + dat.areasymb.dpos.long:=0.0; + END; + */ + if (dat->course<1UL || dat->course>360UL) dat->course = 0UL; + } + return 0L; +} /* end Decode() */ + + +static char getbeaconparm(char s[], uint32_t s_len, + uint32_t * time0, char * port) +/* time:port:rawframe */ +{ + uint32_t i; + *port = s[0UL]; + if ((uint8_t)*port<' ' || s[1UL]!=':') return 0; + *time0 = 0UL; + i = 2UL; + while ((uint8_t)s[i]>='0' && (uint8_t)s[i]<='9') { + *time0 = ( *time0*10UL+(uint32_t)(uint8_t)s[i])-48UL; + ++i; + } + if (s[i]!=':') return 0; + aprsstr_Delstr(s, s_len, 0UL, i+1UL); + return 1; +} /* end getbeaconparm() */ + + +extern void aprsdecode_getbeaconname(char raw[], uint32_t raw_len, + char name[], uint32_t name_len, char symb[], + uint32_t symb_len, char * isobj, + char * isdel, char * isbad) +/* item object else src name */ +{ + struct aprsdecode_DAT dat; + char port; + uint32_t time0; + X2C_PCOPY((void **)&raw,raw_len); + *isobj = 0; + *isdel = 0; + *isbad = 1; + name[0UL] = 0; + if (getbeaconparm(raw, raw_len, &time0, &port)) { + beaconmacros(raw, raw_len, "", 1ul, "", 1ul, 0); + if (aprsdecode_Decode(raw, raw_len, &dat)==0L) { + aprsstr_Assign(name, name_len, dat.symcall, 9ul); + aprsstr_Assign(symb, symb_len, (char *) &dat.symt, 1u/1u); + aprsstr_Append(symb, symb_len, (char *) &dat.sym, 1u/1u); + *isobj = dat.type==aprsdecode_OBJ || dat.type==aprsdecode_ITEM; + *isdel = dat.objkill=='1'; + *isbad = (uint8_t)dat.symt<' ' || (uint8_t)name[0UL]<=' '; + } + else *isbad = 1; + } + X2C_PFREE(raw); +} /* end getbeaconname() */ + + +extern void aprsdecode_extractbeacon(char raw[], uint32_t raw_len, + char withparm, char macros) +/* monitor line to beacon config */ +{ + struct aprsdecode_DAT dat; + char port; + uint32_t i; + uint32_t time0; + int32_t j; + char s[1000]; + X2C_PCOPY((void **)&raw,raw_len); + if (withparm) { + if (getbeaconparm(raw, raw_len, &time0, &port)) { + if (macros) beaconmacros(raw, raw_len, "", 1ul, "", 1ul, 0); + aprsstr_IntToStr((int32_t)time0, 0UL, s, 1000ul); + useri_AddConfLine(useri_fRBTIME, 1U, s, 1000ul); + useri_AddConfLine(useri_fRBPORT, 1U, (char *) &port, 1u/1u); + } + else { + useri_say("\012beacon syntax wrong, delete line!\012", 36ul, 4UL, + 'e'); + } + } + if (aprsdecode_Decode(raw, raw_len, &dat)==0L) { + if (dat.type==aprsdecode_OBJ || dat.type==aprsdecode_ITEM) { + aprsstr_Assign(s, 1000ul, dat.symcall, 9ul); + } + else { + useri_confstr(useri_fMYCALL, s, 1000ul); + if (aprstext_callwrong(s, 1000ul)) { + useri_xerrmsg("need legal \'My Call\' to build Beacon", 37ul); + } + } + useri_AddConfLine(useri_fRBNAME, 1U, s, 1000ul); + if (aprspos_posvalid(dat.pos)) { + if (dat.postyp=='A' && dat.type==aprsdecode_OBJ) { + /* area object */ + dat.pos.lat = dat.pos.lat+dat.areasymb.dpos.lat; + dat.pos.long0 = dat.pos.long0-dat.areasymb.dpos.long0; + /* shift pos to upleft of area */ + } + aprstext_postostr(dat.pos, '3', s, 1000ul); + useri_AddConfLine(useri_fRBPOS, 1U, s, 1000ul); + } + useri_AddConfLine(useri_fRBCOMMENT, 1U, dat.comment0, 256ul); + s[0U] = dat.symt; + s[1U] = dat.sym; + s[2U] = 0; + useri_AddConfLine(useri_fRBSYMB, 1U, s, 1000ul); + useri_AddConfLine(useri_fRBSPEED, 1U, "", 1ul); + useri_AddConfLine(useri_fRBDIR, 1U, "", 1ul); + if ((uint8_t)dat.areasymb.typ>='0') { + /* IntToStr(dat.areasymb.color*100+trunc(sqrt(dat.areasymb.dpos.long/(RAD/200.0/60.0) + )), 1, s); */ + aprsstr_IntToStr((int32_t)((uint32_t) + dat.areasymb.color*100UL+aprsdecode_trunc(osic_sqrt(X2C_DIVR((float) + fabs(dat.areasymb.dpos.long0),1.454441043287E-6f)))), 1UL, s, + 1000ul); + useri_AddConfLine(useri_fRBSPEED, 1U, s, 1000ul); + aprsstr_IntToStr((int32_t)(((uint32_t)(uint8_t) + dat.areasymb.typ-48UL) + *100UL+aprsdecode_trunc(osic_sqrt(X2C_DIVR((float) + fabs(dat.areasymb.dpos.lat),1.454441043287E-6f)))), 1UL, s, + 1000ul); + useri_AddConfLine(useri_fRBDIR, 1U, s, 1000ul); + } + else if (dat.speed>0UL && dat.speed<2147483647UL) { + aprsstr_IntToStr((int32_t)aprsdecode_trunc((float) + dat.speed*1.852f), 1UL, s, 1000ul); + useri_AddConfLine(useri_fRBSPEED, 1U, s, 1000ul); + if (dat.course>0UL) { + aprsstr_IntToStr((int32_t)(dat.course%360UL), 1UL, s, 1000ul); + useri_AddConfLine(useri_fRBDIR, 1U, s, 1000ul); + } + } + if (dat.altitude=0L) { + aprsstr_Assign(s, 1000ul, dat.dstcall, 9ul); + aprsstr_Delstr(s, 1000ul, 0UL, (uint32_t)j); + dat.dstcall[j] = 0; + } + if (dat.type==aprsdecode_MICE) strncpy(dat.dstcall,"APLM01",9u); + useri_AddConfLine(useri_fRBDEST, 1U, dat.dstcall, 9ul); + useri_AddConfLine(useri_fRBNAME, 1U, dat.symcall, 9ul); + i = 0UL; + while (i<=9UL && dat.viacalls[i][0UL]) { + /* make via path */ + if (s[0U]) aprsstr_Append(s, 1000ul, ",", 2ul); + aprsstr_Append(s, 1000ul, dat.viacalls[i], 9ul); + ++i; + } + useri_AddConfLine(useri_fRBPATH, 1U, s, 1000ul); + } + else useri_AddConfLine(useri_fRBDEST, 1U, "APLM01", 7ul); + } + X2C_PFREE(raw); +} /* end extractbeacon() */ + + +extern void aprsdecode_importbeacon(void) +{ + /* op last pos frame to beacon config */ + aprsdecode_pOPHIST opf; + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST pl; + aprsdecode_pFRAMEHIST pf; + struct aprsdecode_DAT dat; + if (useri_beaconediting && aprsdecode_click.entries>0UL) { + opf = aprsdecode_click.table[aprsdecode_click.selected].opf; + if (opf) { + op = aprsdecode_ophist0; + while (op && X2C_STRCMP(opf->call,9u,op->call,9u)) op = op->next; + if (op) { + pl = 0; + pf = op->frames; + while (pf) { + if (aprspos_posvalid(pf->vardat->pos)) pl = pf; + pf = pf->next; + } + if ((pl && pl->vardat) && aprsdecode_Decode(pl->vardat->raw, + 500ul, &dat)==0L) { + aprsdecode_extractbeacon(pl->vardat->raw, 500ul, 0, 0); + useri_beaconed = 1; + useri_textautosize(0L, 0L, 5UL, 5UL, 'b', "Object Cloned to Be\ +acon Editor!", 32ul); + } + } + } + } +} /* end importbeacon() */ + + +static void beepmsg(char isack) +{ + if (useri_configon(useri_fBEEPMSG)) { + aprsdecode_beeplim(100L, (uint32_t)useri_conf2int(useri_fBEEPMSG, + (uint32_t)isack*2UL, 20L, 8000L, 1000L), + (uint32_t)useri_conf2int(useri_fBEEPMSG, + (uint32_t)isack*2UL+1UL, 0L, 5000L, 250L)); + } +} /* end beepmsg() */ + + +static void popupmessage(const char from[], uint32_t from_len, + const char to[], uint32_t to_len, const char txt[], + uint32_t txt_len, const char ack[], + uint32_t ack_len, uint32_t time0, char port, + char isquery0, char kill, + struct aprspos_POSITION pos, const char item[], + uint32_t item_len) +{ + aprsdecode_pMSGFIFO pl; + aprsdecode_pMSGFIFO pm; + int32_t cnt; + pm = aprsdecode_msgfifo0; + pl = 0; + while (pm) { + /* delete older same messages */ + if (((aprsstr_StrCmp(pm->from, 9ul, from, + from_len) && aprsstr_StrCmp(pm->to, 9ul, to, + to_len)) && aprsstr_StrCmp(pm->txt, 67ul, txt, + txt_len)) && aprsstr_StrCmp(pm->ack, 5ul, ack, ack_len)) { + if (pl==0) aprsdecode_msgfifo0 = pm->next; + else pl->next = pm->next; + osic_free((char * *) &pm, sizeof(struct aprsdecode_MSGFIFO)); + pm = aprsdecode_msgfifo0; + pl = 0; + } + else { + pl = pm; + pm = pm->next; + } + } + osic_alloc((char * *) &pm, sizeof(struct aprsdecode_MSGFIFO)); + if (pm==0) { + osi_WrStrLn("msg out of memory", 18ul); + return; + } + aprsstr_Assign(pm->from, 9ul, from, from_len); + aprsstr_Assign(pm->to, 9ul, to, to_len); + aprsstr_Assign(pm->txt, 67ul, txt, txt_len); + aprsstr_Assign(pm->ack, 5ul, ack, ack_len); + aprsstr_Assign(pm->itemname, 9ul, item, item_len); + pm->itempos = pos; + pm->time0 = time0; + pm->port = port; + pm->query = isquery0; + pm->next = 0; + pm->deleteitem = kill; + cnt = 1L; + if (aprsdecode_msgfifo0==0) aprsdecode_msgfifo0 = pm; + else { + cnt = 2L; + pl = aprsdecode_msgfifo0; + while (pl->next) { + pl = pl->next; + ++cnt; + } + pl->next = pm; + } + if (useri_nextmsg==0L) { + if (useri_configon(useri_fPOPUPMSG)) useri_nextmsg = -cnt; + } + else useri_nextmsg = -labs(useri_nextmsg); +} /* end popupmessage() */ + + +extern void aprsdecode_getactack(aprsdecode_MONCALL call, char ack[], + uint32_t ack_len) +/* get actual message ack */ +{ + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST pf; + struct aprsdecode_DAT dat; + char mid[2]; + char aa[2]; + char ok0; + aprsdecode_MONCALL my; + ack[0UL] = 0; + op = findop(call, 0); + if (op) { + useri_confstr(useri_fMYCALL, my, 9ul); + pf = op->frames; + while (pf) { + if (((aprsdecode_Decode(pf->vardat->raw, 500ul, + &dat)>=0L && dat.type==aprsdecode_MSG) + && dat.ackrej==aprsdecode_MSGMSG) && X2C_STRCMP(dat.msgto,9u, + my,9u)==0) { + ok0 = replyack(aa, 2ul, mid, 2ul, dat.acktext, 5ul); + if (mid[0U]) aprsstr_Assign(ack, ack_len, mid, 2ul); + } + pf = pf->next; + } + } +} /* end getactack() */ + + +static char ch(uint32_t n) +{ + if (n<10UL) n += 48UL; + else if (n<36UL) n += 55UL; + else n += 61UL; + return (char)n; +} /* end ch() */ + + +extern void aprsdecode_acknumstr(char aa[], uint32_t aa_len, + uint32_t n) +{ + aa[0UL] = ch((n/62UL)%62UL); + aa[1UL] = ch(n%62UL); + if (aa_len-1>=2UL) aa[2UL] = 0; +} /* end acknumstr() */ + + +static char sendtxmsg(uint32_t acknum, const aprsdecode_MONCALL to, + const char txt[], uint32_t txt_len, char port, + char rfonly, uint32_t ackcnt, char errm[], + uint32_t errm_len) +{ + uint32_t i; + aprsdecode_FRAMEBUF s; + aprsdecode_FRAMEBUF rfs; + char am[51]; + char h1[51]; + char h[51]; + char tmp; + if (ackcnt==0UL) strncpy(am,"Ack ",51u); + else strncpy(am,"Msg ",51u); + errm[0UL] = 0; + if (to[0UL]==0) return 0; + useri_confstr(useri_fMYCALL, rfs, 512ul); + if (aprstext_callwrong(rfs, 512ul)) { + aprsstr_Assign(errm, errm_len, "Msg not sent (no valid Mycall)", 31ul); + return 0; + } + aprsstr_Append(rfs, 512ul, ">", 2ul); + if (rfonly) useri_confstr(useri_fMSGRFDEST, h, 51ul); + else useri_confstr(useri_fMSGNETDEST, h, 51ul); + aprsstr_Append(rfs, 512ul, h, 51ul); + if (h[0U]==0) { + aprsstr_Assign(errm, errm_len, am, 51ul); + aprsstr_Append(errm, errm_len, "not sent (no Port set)", 23ul); + return 0; + } + if (port=='A' || (uint8_t)port>='1' && (uint8_t)port<='9') { + /* radio so add via path */ + useri_confstr(useri_fMSGPATH, h, 51ul); + if ((uint8_t)h[0U]>='1' && (uint8_t)h[0U]<='7') { + aprsstr_Append(rfs, 512ul, "-", 2ul); + aprsstr_Append(rfs, 512ul, (char *) &h[0U], 1u/1u); + } + else if (h[0U]) { + aprsstr_Append(rfs, 512ul, ",", 2ul); + aprsstr_Append(rfs, 512ul, h, 51ul); + } + } + aprsstr_Append(rfs, 512ul, ":", 2ul); + strncpy(s,":",512u); + aprsstr_Append(s, 512ul, to, 9ul); + for (i = aprsstr_Length(to, 9ul); i<=8UL; i++) { + aprsstr_Append(s, 512ul, " ", 2ul); + } /* end for */ + aprsstr_Append(s, 512ul, ":", 2ul); + if (ackcnt==0UL) aprsstr_Append(s, 512ul, "ack", 4ul); + aprsstr_Append(s, 512ul, txt, txt_len); + if (acknum>0UL) { + aprsstr_Append(s, 512ul, "{", 2ul); + aprsdecode_acknumstr(h, 51ul, acknum); + aprsstr_Append(s, 512ul, h, 51ul); + aprsstr_Append(s, 512ul, "}", 2ul); + aprsdecode_getactack(to, h, 51ul); + if (h[0U]) aprsstr_Append(s, 512ul, h, 51ul); + } + /*WrInt(ORD(rfonly), 10);WrStrLn(port); */ + aprsstr_Append(rfs, 512ul, s, 512ul); + for (i = 0UL; i<=3UL; i++) { + /* try the rf ports */ + if ((useri_configon((uint8_t)(36UL+i)) + && (port=='A' || port==(char)(i+49UL))) && Sendudp(rfs, + 512ul, i, 0UL)>0L) { + memcpy(h,am,51u); + if (ackcnt==1UL) aprsstr_Append(h, 51ul, "sent", 5ul); + else { + aprsstr_Append(h, 51ul, "resent(", 8ul); + aprsstr_IntToStr((int32_t)ackcnt, 0UL, h1, 51ul); + aprsstr_Append(h, 51ul, h1, 51ul); + aprsstr_Append(h, 51ul, ")", 2ul); + } + aprsstr_Append(h, 51ul, " to ", 5ul); + aprsstr_Append(h, 51ul, to, 9ul); + aprsstr_Append(h, 51ul, " on Port ", 10ul); + aprsstr_Append(h, 51ul, (char *)(tmp = (char)(i+49UL),&tmp), + 1u/1u); + useri_say(h, 51ul, 2UL, 'b'); + return 1; + } + } /* end for */ + /* make it better */ + if (!rfonly && port=='N') { + SendNet(aprsdecode_tcpsocks, "", 1ul, s, 512ul, 1, errm, errm_len); + if (errm[0UL]) { + memcpy(h,am,51u); + aprsstr_Append(h, 51ul, "not sent ", 10ul); + aprsstr_Append(h, 51ul, errm, errm_len); + aprsstr_Assign(errm, errm_len, h, 51ul); + } + else { + memcpy(h,am,51u); + aprsstr_Append(h, 51ul, "(re)sent to ", 13ul); + aprsstr_Append(h, 51ul, to, 9ul); + aprsstr_Append(h, 51ul, " on Net", 8ul); + useri_say(h, 51ul, 2UL, 'b'); + } + return 1; + } + else { + aprsstr_Assign(errm, errm_len, am, 51ul); + aprsstr_Append(errm, errm_len, "not sent (delete Msg or open outgoing P\ +ort)", 44ul); + return 0; + } + return 0; +} /* end sendtxmsg() */ + + +static void iteminmsg(const char from[], uint32_t from_len, + const char to[], uint32_t to_len, const char txt[], + uint32_t txt_len, struct aprspos_POSITION * pos, + char name[], uint32_t name_len, char * del) +/* test for and draw item in a message */ +{ + char h[1000]; + char s[1000]; + struct aprsdecode_DAT dat; + aprsdecode_posinval(pos); + aprsstr_Assign(s, 1000ul, from, from_len); + aprsstr_Append(s, 1000ul, ">", 2ul); + aprsstr_Append(s, 1000ul, to, to_len); + aprsstr_Append(s, 1000ul, ":", 2ul); + aprsstr_Append(s, 1000ul, txt, txt_len); + if ((aprsdecode_Decode(s, 1000ul, + &dat)>=0L && dat.type==aprsdecode_ITEM) + && aprspos_posvalid(dat.pos)) { + aprsstr_Assign(h, 1000ul, "0:0:", 5ul); + aprsstr_Append(h, 1000ul, s, 1000ul); + aprsdecode_drawbeacon(h, 1000ul); + *pos = dat.pos; + aprsstr_Assign(name, name_len, dat.symcall, 9ul); + *del = dat.objkill=='1'; + } +} /* end iteminmsg() */ + + +static void ackmsg(const char from[], uint32_t from_len, + const char rep[], uint32_t rep_len, uint8_t rej) +{ + aprsdecode_pTXMESSAGE pm; + char bb[2]; + char aa[2]; + /* + WrStr("replyack:"); + WrStr(from); + WrStr("|"); + WrStr(rep); + WrStr("|"); + WrLn; + */ + if (rej==aprsdecode_MSGMSG) { + if (!replyack(bb, 2ul, aa, 2ul, rep, rep_len)) return; + } + else { + /* message only */ + aprsstr_Assign(bb, 2ul, rep, rep_len); + } + pm = aprsdecode_txmessages; + while (pm) { + if (pm->acktime==0UL && X2C_STRCMP(from,from_len,pm->to,9u)==0) { + aprsdecode_acknumstr(aa, 2ul, pm->acknum); + if (X2C_STRCMP(aa,2u,bb,2u)==0) { + /* message acked now */ + pm->acktime = aprsdecode_realtime; + pm->rej = rej==aprsdecode_MSGREJ; + useri_refresh = 1; + /*WrInt(ORD(rej), 10); WrStrLn("=rej"); */ + beepmsg(1); + } + } + pm = pm->next; + } +} /* end ackmsg() */ + +#define aprsdecode_QUERYRESPONSEWINDOW 30 +/* time after sending a msg to display already received query response */ + + +static void showmsg(const char from[], uint32_t from_len, + const char to[], uint32_t to_len, const char txt[], + uint32_t txt_len, const char ack[], + uint32_t ack_len, uint8_t rej, char my, + char query, char port) +{ + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST opf; + aprsdecode_ACKTEXT aack; + aprsdecode_ACKTEXT rep; + aprsdecode_MONCALL call; + struct aprsdecode_DAT dat; + struct aprspos_POSITION itempos; + aprsdecode_MONCALL itemname; + char delitem; + char s[501]; + opf = 0; + if (ack[0UL]) { + aprsstr_Assign(call, 9ul, from, from_len); + op = findop(call, 1); /* find sender of msg */ + if (op) { + opf = op->frames; + for (;;) { + if (opf==0) break; + if ((((aprsdecode_Decode(opf->vardat->raw, 500ul, + &dat)>=0L && dat.type==aprsdecode_MSG) + && dat.ackrej==aprsdecode_MSGMSG) && X2C_STRCMP(dat.msgto,9u, + to,to_len)==0) && X2C_STRCMP(txt,txt_len,dat.msgtext, + 67u)==0) { + if (ack[0UL]==0) { + if (lastmsgtx+30ULnext; + } + } + } + if (opf==0) { + if (my || useri_configon(useri_fMSGALLSSID) && (!aprsstr_StrCmp(from, + from_len, to, to_len) || useri_configon(useri_fPASSSELFMSG))) { + if (!useri_configon(useri_fPOPUPMSG)) { + if (query) strncpy(s,"Query from ",501u); + else strncpy(s,"Message from ",501u); + aprsstr_Append(s, 501ul, from, from_len); + aprsstr_Append(s, 501ul, " to ", 5ul); + aprsstr_Append(s, 501ul, to, to_len); + aprsstr_Append(s, 501ul, " (click on M Button)", 21ul); + useri_textautosize(0L, 5L, 6UL, 0UL, 'y', s, 501ul); + } + iteminmsg(from, from_len, to, to_len, txt, txt_len, &itempos, + itemname, 9ul, &delitem); + popupmessage(from, from_len, to, to_len, txt, txt_len, ack, ack_len, + aprsdecode_realtime, port, query, delitem, itempos, + itemname, 9ul); + ++aprsdecode_tracenew.winevent; + beepmsg(0); + } + } + else if (aprsdecode_verb) { + osi_WrStr("seen msg:", 10ul); + osi_WrStr(from, from_len); + osi_WrStr(">", 2ul); + osi_WrStr(to, to_len); + osi_WrStr("|", 2ul); + osi_WrStr(txt, txt_len); + osi_WrStr("|", 2ul); + osi_WrStr(ack, ack_len); + osi_WrStr("|", 2ul); + osi_WrStr((char *) &port, 1u/1u); + osic_WrLn(); + } +} /* end showmsg() */ + + +static char isquery(const struct aprsdecode_DAT dat, char port) +{ + uint32_t j; + uint32_t i; + char err[201]; + char wdata[201]; + char key[201]; + char path[201]; + char s[201]; + /* IF dat.msgtext[0]<>"?" THEN RETURN FALSE END; */ + aprsstr_Assign(path, 201ul, dat.symcall, 9ul); + aprsstr_Append(path, 201ul, ">", 2ul); + aprsstr_Append(path, 201ul, dat.dstcall, 9ul); + i = 0UL; + while (dat.viacalls[i][0UL]) { + aprsstr_Append(path, 201ul, ",", 2ul); + aprsstr_Append(path, 201ul, dat.viacalls[i], 9ul); + if (i+2UL==dat.hbitp) aprsstr_Append(path, 201ul, "*", 2ul); + ++i; + } + i = 0UL; + for (;;) { + useri_confstrings(useri_fQUERYS, i, 0, s, 201ul); + if (s[0U]==0) break; + j = (uint32_t)aprsstr_InStr(s, 201ul, ":", 2ul); + if (j>0UL) { + aprsstr_Assign(key, 201ul, s, 201ul); + key[j] = 0; + aprsstr_Delstr(s, 201ul, 0UL, j+1UL); + if (aprsstr_InStr(dat.msgtext, 67ul, key, 201ul)==0L) { + aprsstr_Assign(wdata, 201ul, dat.msgtext, 67ul); + aprsstr_Delstr(wdata, 201ul, 0UL, aprsstr_Length(key, 201ul)); + beaconmacros(s, 201ul, path, 201ul, wdata, 201ul, 1); + if (s[0U]==0) return 1; + if (!sendtxmsg(0UL, dat.symcall, s, 201ul, port, port!='N', 1UL, + err, 201ul)) { + useri_xerrmsg(err, 201ul); + return 0; + } + else { + useri_xerrmsg(err, 201ul); + return 1; + } + } + } + ++i; + } + /*WrStrLn(port);WrStrLn(dat.symcall);WrStrLn(dat.msgtext); */ + return 0; +} /* end isquery() */ + + +static void getmessage(aprsdecode_pTCPSOCK cp, uint32_t up, + const struct aprsdecode_DAT dat) +/* if first: popup, if full match & lastack>10s: send ack */ +{ + uint32_t i; + char void0; + char query; + char fit; + char my[100]; + char h[100]; + char port; + /* my:MONCALL; */ + char ch0; + useri_confstr(useri_fMYCALL, my, 100ul); + if (aprstext_callwrong(my, 100ul)) return; + aprsstr_Assign(h, 100ul, dat.msgto, 9ul); + fit = 0; + i = 0UL; + while (h[i]==my[i] && h[i]) { + if (h[i]=='-' || my[i]=='-') fit = 1; + ++i; + } + if (i==0UL) return; + ch0 = my[i]; + if (h[i]==0 && ch0=='-' || h[i]=='-' && ch0==0) fit = 1; + if (cp) port = 'N'; + else port = (char)(up+48UL); + if (ch0==0 && h[i]==0) { + /* WrStr("my message "); */ + if (dat.ackrej==aprsdecode_MSGMSG) { + /*FOR i:=0 TO HIGH(dat.acktext) DO WrInt(ORD(dat.acktext[i]), 4); + END; WrStrLn("=ack"); */ + query = isquery(dat, port); + showmsg(dat.symcall, 9ul, dat.msgto, 9ul, dat.msgtext, 67ul, + dat.acktext, 5ul, dat.ackrej, 1, query, port); + if (!query && dat.acktext[0UL]) { + void0 = sendtxmsg(0UL, dat.symcall, dat.acktext, 5ul, port, + port!='N', 0UL, h, 100ul); + useri_xerrmsg(h, 100ul); + } + } + if (dat.acktext[0UL]) { + ackmsg(dat.symcall, 9ul, dat.acktext, 5ul, dat.ackrej); + } + } + else if (fit && dat.ackrej==aprsdecode_MSGMSG) { + /* WrStr("other ssid message "); */ + showmsg(dat.symcall, 9ul, dat.msgto, 9ul, dat.msgtext, 67ul, + dat.acktext, 5ul, dat.ackrej, 0, 0, port); + } +} /* end getmessage() */ + +#define aprsdecode_SETPORT 2 + +#define aprsdecode_DEL 6 + +#define aprsdecode_KICK 5 + +#define aprsdecode_RESTART 4 + +#define aprsdecode_HOLD 3 + +#define aprsdecode_EDIT 1 + + +extern void aprsdecode_deltxmsg(uint32_t cmd, uint32_t n) +/* delete/edit tx message number */ +{ + aprsdecode_pTXMESSAGE po; + aprsdecode_pTXMESSAGE pm; + pm = aprsdecode_txmessages; + if (pm) { + if (cmd==6UL || cmd==1UL) { + if (n==0UL) aprsdecode_txmessages = aprsdecode_txmessages->next; + else { + do { + po = pm; + pm = pm->next; + --n; + } while (!(n==0UL || pm==0)); + if (pm) po->next = pm->next; + } + if (pm) { + if (cmd==1UL) { + useri_AddConfLine(useri_fMSGTEXT, 0U, pm->msgtext, 67ul); + useri_AddConfLine(useri_fMSGTO, 0U, pm->to, 9ul); + useri_AddConfLine(useri_fMSGPORT, 0U, (char *) &pm->port, + 1u/1u); + } + osic_free((char * *) &pm, + sizeof(struct aprsdecode_TXMESSAGE)); + } + } + else { + while (n>0UL && pm) { + pm = pm->next; + --n; + } + if (pm && pm->acktime==0UL) { + if (cmd==5UL) pm->txtime = 0UL; + else if (cmd==4UL) { + pm->txtime = 0UL; + pm->acktime = 0UL; + pm->txcnt = 0UL; + pm->heard = 0; + } + else if (cmd==3UL) pm->txtime = X2C_max_longcard; + else if (cmd==2UL) { + useri_confstr(useri_fMSGPORT, (char *) &pm->port, 1u/1u); + } + } + } + } +} /* end deltxmsg() */ + + +extern void aprsdecode_makemsg(char ack) +{ + aprsdecode_pTXMESSAGE pn; + aprsdecode_pTXMESSAGE pm; + char po; + char ht[101]; + char hm[101]; + char mes[101]; + int32_t i; + char c; + struct aprsdecode_TXMESSAGE * anonym; + int32_t tmp; + mes[0U] = 0; + useri_confstr(useri_fMSGPORT, (char *) &po, 1u/1u); + if (po==' ' || X2C_CAP(po)=='A') po = 'A'; + else if (X2C_CAP(po)=='N' || X2C_CAP(po)=='I') po = 'N'; + else if ((uint8_t)po<'0' || (uint8_t)po>'9') { + strncpy(mes,"need Port where to send",101u); + } + useri_confstr(useri_fMSGTO, ht, 101ul); /* no destination call */ + if (ht[0U]==0) strncpy(mes,"need call to send to",101u); + useri_confstr(useri_fMSGTEXT, hm, 101ul); + if (hm[0U]==0) { + /* empty message line */ + if (!sentemptymsg) { + strncpy(mes,"send empty line? if so, enter again",101u); + sentemptymsg = 1; + } + else sentemptymsg = 0; + } + else sentemptymsg = 0; + pn = aprsdecode_txmessages; /* look for same msg pending */ + while (pn) { + if (((((ack && pn->acknum>0UL) && pn->acktime==0UL) + && aprsstr_StrCmp(pn->to, 9ul, ht, + 101ul)) && aprsstr_StrCmp(pn->msgtext, 67ul, hm, + 101ul)) && pn->port==po) { + strncpy(mes,"same message pending, try [kick] or delete",101u); + } + pn = pn->next; + } + if (mes[0U]==0) { + osic_alloc((char * *) &pm, sizeof(struct aprsdecode_TXMESSAGE)); + if (pm==0) Err("out of memory", 14ul); + memset((char *)pm,(char)0,sizeof(struct aprsdecode_TXMESSAGE)); + { /* with */ + struct aprsdecode_TXMESSAGE * anonym = pm; + anonym->port = po; + useri_confstr(useri_fMSGTO, anonym->to, 9ul); + aprsstr_Caps(anonym->to, 9ul); + useri_confstr(useri_fMSGTEXT, anonym->msgtext, 67ul); + tmp = (int32_t)aprsstr_Length(anonym->msgtext, 67ul)-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + c = anonym->msgtext[i]; + if (c=='|' || c=='~') { + /* OR (c=cMSGACK) */ + anonym->msgtext[i] = ' '; + } + if (i==tmp) break; + } /* end for */ + if (ack) { + if (msgmid==0UL) { + msgmid = (aprsdecode_realtime%68400UL)/30UL; + /* init msg number with 30s daytime */ + } + msgmid = (msgmid+1UL)%3843UL; + anonym->acknum = msgmid+1UL; /* 0 is query with no ack */ + } + } + pn = aprsdecode_txmessages; + if (pn==0) aprsdecode_txmessages = pm; + else { + while (pn->next) pn = pn->next; + pn->next = pm; + } + useri_clrmsgtext("", 1ul); + useri_textautosize(0L, 5L, 6UL, 5UL, 'b', "Msg Stored", 11ul); + } + useri_xerrmsg(mes, 101ul); +} /* end makemsg() */ + +#define aprsdecode_MAXMSGTXTIME 3600 + +#define aprsdecode_MAXMSGRETRY 20 + +#define aprsdecode_MAXNOACKRETRY 1 + +#define aprsdecode_MSGNOTXTIME 10 + +#define aprsdecode_MSGTXTIME 15 + +/* my:MONCALL; */ + +static void sendmsg(void) +{ + aprsdecode_pTXMESSAGE pn; + aprsdecode_pTXMESSAGE pm; + uint32_t t; + uint32_t maxret; + uint32_t tc; + char port; + char sent; + char err[101]; + if (lastmsgtx>aprsdecode_realtime) lastmsgtx = aprsdecode_realtime; + /* confstr(fMYCALL, my); */ + /* IF (lastmsgtx+MSGNOTXTIME=3) THEN */ + if (lastmsgtx+10ULacknum>0UL) maxret = 20UL; + else maxret = 1UL; + if ((pm->acktime==0UL && pm->txtime!=X2C_max_longcard) + && (pm->txcnttxtime==0UL)) { + tc = pm->txcnt; + t = 15UL; + for (;;) { + if (tc<=1UL) break; + t += t; + --tc; + if (t>3600UL) { + t = 3600UL; + break; + } + } + if (pm->txtime+t<=aprsdecode_realtime) { + pn = aprsdecode_txmessages; + while (pn!=pm && ((((pn->acknum==0UL || pn->acktime>0UL) + || pn->txcnt>=20UL) || !aprsstr_StrCmp(pn->to, 9ul, pm->to, + 9ul)) || pn->txtime==X2C_max_longcard)) pn = pn->next; + if (pn==pm) { + /* not older unacked msg to this call */ + port = pm->port; + sent = 0; + if ((pm->txcnt<=(uint32_t)pm->heard || pm->txtime==0UL) + && (port=='N' || port=='A')) { + if (sendtxmsg(pm->acknum, pm->to, pm->msgtext, 67ul, + 'N', 0, pm->txcnt+1UL, err, 101ul) && err[0U]==0) sent = 1; + } + if (port=='A' || (uint8_t)port>='1' && (uint8_t) + port<='9') { + if (sendtxmsg(pm->acknum, pm->to, pm->msgtext, 67ul, + port, sent || port!='A', pm->txcnt+1UL, err, + 101ul) && err[0U]==0) sent = 1; + else if (sent || pm->txcnt>0UL) err[0U] = 0; + } + if (sent) { + ++pm->txcnt; + pm->txtime = aprsdecode_realtime; + lastmsgtx = aprsdecode_realtime; + useri_refresh = 1; + break; /* send 1 msg a time */ + } + } + } + } + pm = pm->next; + } + useri_xerrmsg(err, 101ul); + } +} /* end sendmsg() */ + + +static void setmsgheard(const aprsdecode_MONCALL us) +/* set heard flag in tx msg if user heard now */ +{ + aprsdecode_pTXMESSAGE pm; + pm = aprsdecode_txmessages; + for (;;) { + if (pm==0) break; + if ((pm->acktime==0UL && pm->txcnt==1UL) && aprsstr_StrCmp(pm->to, 9ul, + us, 9ul)) pm->heard = 1; + pm = pm->next; + } +} /* end setmsgheard() */ + + +extern aprsdecode_pOPHIST aprsdecode_selop(void) +{ + if (aprsdecode_click.entries>0UL) { + return aprsdecode_click.table[aprsdecode_click.selected].opf; + } + else return 0; + return 0; +} /* end selop() */ + +/* +PROCEDURE objsender(op:pOPHIST; VAR s:ARRAY OF CHAR); + (* find (last) sender of an item/object *) +VAR dat:DAT; + f:pFRAMEHIST; +BEGIN + s[0]:=0C; + IF (op<>NIL) & (ISOBJECT IN op^.drawhints) THEN + f:=op^.frames; + IF f<>NIL THEN + WHILE f^.next<>NIL DO f:=f^.next END; + (* goto last frame *) + IF (Decode(f^.vardat^.raw, dat)>=0) & ((dat.type=OBJ) OR (dat.type=ITEM)) + THEN Assign(s, dat.objectfrom) END; + END; + END; +END objsender; +*/ + +extern void aprsdecode_objsender(aprsdecode_pOPHIST op, char s[], + uint32_t s_len) +/* find (last) sender of an item/object */ +{ + struct aprsdecode_DAT dat; + aprsdecode_pFRAMEHIST f; + aprsdecode_pOPHIST o; + s[0UL] = 0; + if (op) { + if ((0x2U & op->drawhints)) { + f = op->frames; + if (f) { + while (f->next) f = f->next; + if (aprsdecode_Decode(f->vardat->raw, 500ul, + &dat)>=0L && (dat.type==aprsdecode_OBJ || dat.type==aprsdecode_ITEM) + ) aprsstr_Assign(s, s_len, dat.objectfrom, 9ul); + } + } + else { + o = aprsdecode_ophist0; + for (;;) { + if (o==0) break; + f = o->frames; + if (((f && aprsdecode_Decode(f->vardat->raw, 500ul, + &dat)>=0L) && (dat.type==aprsdecode_OBJ || dat.type==aprsdecode_ITEM) + ) && X2C_STRCMP(dat.objectfrom,9u,op->call,9u)==0) { + aprsstr_Assign(s, s_len, op->call, 9ul); + break; + } + o = o->next; + } + } + } +} /* end objsender() */ + +#define aprsdecode_MAXDELAY 30 +/* add seconds to time */ + + +static void timespeed(aprsdecode_pFRAMEHIST lastf, + struct aprspos_POSITION pos1, uint32_t time1, + uint8_t * err) +{ + float d; + uint32_t t; + if (((((*err&0xFU)!=0U || lastf==0) || (lastf->nodraw&0xFU)!=0U) + || !aprspos_posvalid(lastf->vardat->pos)) + || !aprspos_posvalid(pos1)) return; + d = aprspos_distance(lastf->vardat->pos, pos1); + /* + IF d>50.0 THEN INCL(err, eDIST) END; + */ + if (lastf->time0>=time1) t = 0UL; + else t = time1-lastf->time0; + if (X2C_DIVR(d*3600.0f,(float)(t+30UL))>maxspeed) *err |= 0x10U; +} /* end timespeed() */ + +#define aprsdecode_MINHOP 20.0 + +#define aprsdecode_HOPPART 0.5 +/* MINSPIKE=0.02; (* min distance to mark as spike *) */ + +#define aprsdecode_SPIKEANGLE 30.0 +/* min deg spanned by 3 waypoints for no SPIKE */ + + +/* 1 wayout, delete before, 2 wayout join last good with last else delete before */ +static void joinchunk(aprsdecode_pOPHIST op) +{ + aprsdecode_pFRAMEHIST lbad; + aprsdecode_pFRAMEHIST bad; + aprsdecode_pFRAMEHIST lllpf; + aprsdecode_pFRAMEHIST llpf; + aprsdecode_pFRAMEHIST lpf; + aprsdecode_pFRAMEHIST pf; + aprsdecode_pVARDAT v; + float kml; + float km; + float ang; + float waylen; + waylen = (float)op->lastkmh*0.03f+20.0f; + lllpf = 0; + llpf = 0; + lpf = 0; + pf = op->frames; + lbad = 0; + while (pf) { + v = pf->vardat; + if (aprspos_posvalid(v->pos) && (pf->nodraw&0xCU)==0U) { + if (lpf) { + km = aprspos_distance(lpf->vardat->pos, v->pos); + if (llpf && km!=0.0f) { + /* we have 3 waypoints */ + kml = aprspos_distance(lpf->vardat->pos, llpf->vardat->pos); + if (kml!=0.0f) { + ang = (float)fabs(aprspos_azimuth(lpf->vardat->pos, + v->pos)-aprspos_azimuth(lpf->vardat->pos, + llpf->vardat->pos)); + if (ang>180.0f) ang = 360.0f-ang; + if (ang<30.0f) { + /* a spike */ + if (lllpf==0) { + /* first spike */ + lpf->nodraw = lpf->nodraw&~0x10U|0x2U; + pf->nodraw &= ~0x10U; + lllpf = llpf; + } + else { + /* second spike */ + if (km>aprspos_distance(llpf->vardat->pos, v->pos)) { + lpf->nodraw = lpf->nodraw&~0x10U|0x2U; + pf->nodraw &= ~0x10U; + llpf->nodraw &= ~0x2U; /* the second is bad */ + } + lllpf = 0; + } + } + else lllpf = 0; + } + } + if (aprsdecode_maxhop>0.0f) { + if (km>waylen) lbad = pf; + else { + waylen = waylen+km*0.5f; + /* inc max hop if there are some steps */ + if (waylen>aprsdecode_maxhop) waylen = aprsdecode_maxhop; + } + } + } + if ((pf->nodraw&0xCU)==0U) { + /* use only until now ok waypoints */ + llpf = lpf; + lpf = pf; + } + } + pf = pf->next; + } + if (lbad) { + /* there is a dist */ + bad = 0; + lpf = 0; + pf = op->frames; + for (;;) { + /* find last long hop in track */ + if (pf==0) break; + if (aprspos_posvalid(pf->vardat->pos) && (pf->nodraw&0x1EU)==0U) { + if (lpf && aprspos_distance(lpf->vardat->pos, + pf->vardat->pos)>waylen) bad = pf; + lpf = pf; + } + if (lpf==lbad) break; + pf = pf->next; + } + if (bad) { + /* hide path until last bad */ + pf = op->frames; + while (pf!=bad) { + pf->nodraw |= 0x20U; + pf = pf->next; + } + } + } +} /* end joinchunk() */ + + +extern void aprsdecode_makelogfn(char s[], uint32_t s_len) +{ + aprsdecode_FILENAME fn; + useri_confstr(useri_fLOGWFN, fn, 1024ul); + filepath(fn, 1024ul); + if (fn[0UL]) aprsstr_Append(fn, 1024ul, "/", 2ul); + aprsstr_Append(fn, 1024ul, s, s_len); + aprsstr_Assign(s, s_len, fn, 1024ul); +/*WrStr("<"); WrStr(s);WrStrLn(">"); */ +} /* end makelogfn() */ + + +static void inwindow(aprsdecode_pOPHIST op, const char rawbuf[], + uint32_t rawbuf_len) +{ + uint32_t matchlen; + uint32_t j; + uint32_t ii; + uint32_t i; + char in; + aprsdecode_pFRAMEHIST pf; + char wc[100]; + aprsdecode_FILENAME fn; + aprsdecode_pVARDAT pv; + uint8_t doset; + struct aprspos_POSITION * anonym; + in = 0; + aprsdecode_tracenew.call[0UL] = 0; + doset = 0U; + if (op) { + setmsgheard(op->call); + pf = op->frames; + while (pf && !in) { + /* find waypoint inside screen */ + pv = pf->vardat; + if (aprspos_posvalid(pv->pos)) { + { /* with */ + struct aprspos_POSITION * anonym = &pv->pos; + if (((anonym->long0>aprsdecode_tracenew.winpos0.long0 && anonym->latlong0lat>aprsdecode_tracenew.winpos1.lat) in = 1; + } + } + pf = pf->next; + } + if (in) ++aprsdecode_tracenew.winevent; + /*find user in watchlist */ + /* IF posvalid(op^.lastpos) THEN */ + j = 0UL; + matchlen = 0UL; + for (;;) { + useri_confstrings(useri_fWATCH, j, 1, wc, 100ul); + if (wc[0U]==0) break; + i = 0UL; + ii = 0UL; + for (;;) { + if (((i>99UL || ii>8UL) || wc[i]==0) || op->call[ii]==0) { + if ((ii>8UL || op->call[ii]==0) && (wc[i]==0 || wc[i]=='*')) { + if (i>=matchlen) { + memcpy(aprsdecode_tracenew.call,op->call,9u); + doset = useri_confflags(useri_fWATCH, j); + matchlen = i; + } + } + break; + } + if (wc[i]=='*') { + if (wc[i+1UL]) ++i; + } + else { + if (X2C_CAP(wc[i])!=X2C_CAP(op->call[ii])) break; + ++i; + } + ++ii; + } + ++j; + } + /* END; */ + aprsdecode_tracenew.beep = (char)(doset&1); + aprsdecode_tracenew.follow = (char)(doset/2U&1); + if ((!aprsdecode_tracenew.follow && aprsdecode_click.watchmhop) + && X2C_STRCMP(op->call,9u,aprsdecode_click.mhop,9u)==0) { + aprsdecode_tracenew.follow = 1; + memcpy(aprsdecode_tracenew.call,op->call,9u); + } + /*WrStrLn(op^.call); WrStrLn(click.mhop); + WrInt(ORD(click.watchmhop), 1); + WrInt(ORD(tracenew.follow), 1); WrStrLn(""); */ + if ((doset/4U&1)) { + /* append to watchcall file */ + aprsstr_Assign(fn, 1024ul, op->call, 9ul); + alfanum(fn, 1024ul); /* remove bad chars */ + /* + confstr(fLOGWFN, fn); + filepath(fn); + IF fn[0]<>0C THEN Append(fn, DIRSEP) END; + Append(fn, wc); + */ + aprsdecode_makelogfn(fn, 1024ul); + if (!wrlog(rawbuf, rawbuf_len, aprsdecode_realtime, fn, 1024ul, + 0L)) poplogerr(op->call, 9ul); + } + } +} /* end inwindow() */ + + +extern uint32_t aprsdecode_finddup(aprsdecode_pFRAMEHIST pf, + aprsdecode_pFRAMEHIST frame) +/* return delay time if dupe found */ +{ + struct aprspos_POSITION apos; + uint32_t ret; + uint32_t dupedelay; + uint32_t speed; + uint32_t course; + int32_t altitude; + struct aprsdecode_DAT dat; + /* search from begin to 1 frame before */ + struct aprsdecode_VARDAT * anonym; + apos = frame->vardat->pos; + ret = 0UL; + if ((pf!=frame && aprspos_posvalid(apos)) + && aprsdecode_Decode(frame->vardat->raw, 500ul, &dat)>=0L) { + speed = dat.speed; + course = dat.course; + altitude = dat.altitude; + dupedelay = frame->time0-aprsdecode_lums.dupemaxtime; + while (pf->next!=frame) { + { /* with */ + struct aprsdecode_VARDAT * anonym = pf->vardat; + if (pf->time0>=dupedelay && (frame->vardat==pf->vardat || ((((apos.lat==anonym->pos.lat && apos.long0==anonym->pos.long0) + && aprsdecode_Decode(anonym->raw, 500ul, + &dat)>=0L) && speed==dat.speed) && course==dat.course) + && altitude==dat.altitude)) { + /* dupe pos found */ + ret = frame->time0-pf->time0; + } + else if (ret>0UL) return ret; + } + /* pos changed so we have real dupe */ + pf = pf->next; + } + } + return 0UL; +} /* end finddup() */ + +#define aprsdecode_POLY13 0x112D + +#define aprsdecode_TOPBIT 12 + + +static void initcrc12(void) +{ + uint16_t remainder; + uint32_t bit; + uint32_t dividend; + for (dividend = 0UL; dividend<=255UL; dividend++) { + remainder = X2C_LSH((uint16_t)dividend,16,4); + for (bit = 8UL;; bit--) { + if ((0x1000U & remainder)) { + remainder = X2C_LSH(remainder,16,1)^0x112DU; + } + else remainder = X2C_LSH(remainder,16,1); + if (bit==0UL) break; + } /* end for */ + crctable12[dividend] = remainder&0x1FFFU; + } /* end for */ +} /* end initcrc12() */ + +typedef uint8_t * RAW; + +#define aprsdecode_TOPBIT0 12 + + +static void crca12(const RAW data, int32_t len, uint16_t * rem) +{ + int32_t i; + int32_t tmp; + tmp = len-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + *rem = X2C_LSH(*rem,16,8)^crctable12[(uint16_t)(X2C_LSH(*rem,16, + -5)&0xFFU)]^(uint16_t)data[i]; + if (i==tmp) break; + } /* end for */ +} /* end crca12() */ + +struct _0; + + +struct _0 { + aprsdecode_pFRAMEHIST wayp; + uint16_t next; +}; + + +static char lookup(uint32_t * wridx, struct _0 table[4096], + uint16_t index[8192], aprsdecode_pFRAMEHIST waypoint) +{ + uint32_t sum; + uint16_t ojp; + uint16_t jp; + uint16_t ip; + struct aprsdecode_DAT dat1; + struct aprsdecode_DAT dat; + uint16_t rem; + struct aprsdecode_FRAMEHIST * anonym; + if (aprsdecode_Decode(waypoint->vardat->raw, 500ul, + &dat)>=0L && aprspos_posvalid(dat.pos)) { + rem = 0U; + crca12((RAW) &dat.speed, 2L, &rem); + crca12((RAW) &dat.course, 2L, &rem); + crca12((RAW) &dat.altitude, 2L, &rem); + crca12((RAW) &dat.pos.lat, (int32_t)sizeof(float), &rem); + crca12((RAW) &dat.pos.long0, (int32_t)sizeof(float), &rem); + sum = (uint32_t)(rem&0x1FFFU); + ip = index[sum]; + /*WrInt(sum, 10);WrInt(ip, 10);WrStrLn("=ip"); */ + if (ip) { + /* starts with 1, not found */ + --ip; + jp = ip; + for (;;) { + { /* with */ + struct aprsdecode_FRAMEHIST * anonym = table[jp].wayp; + if (anonym->vardat==waypoint->vardat || ((((anonym->vardat->pos.lat==dat.pos.lat && anonym->vardat->pos.long0==dat.pos.long0) + && aprsdecode_Decode(anonym->vardat->raw, 500ul, + &dat1)>=0L) && dat1.speed==dat.speed) + && dat1.course==dat.course) && dat1.altitude==dat.altitude) { + if (anonym->time0+aprsdecode_lums.dupemaxtime>waypoint->time0) + return 1; + else break; + } + } + ojp = jp; + jp = table[jp].next; + if (jp>4095U || ojp<=jp==((uint32_t)ojp<*wridx==(uint32_t) + jp<*wridx)) { + /*WrInt(ORD(jp>HIGH(table)), 2); WrInt(ojp, 6); WrInt(jp, 6); + WrInt(wridx, 6); WrStr("o"); */ + break; + } + } + } + else { + /*INC(collis); */ + ip = 65535U; + } + index[sum] = (uint16_t)(*wridx+1UL); + table[*wridx].wayp = waypoint; + table[*wridx].next = ip; + *wridx = *wridx+1UL&4095UL; + } + return 0; +} /* end lookup() */ + + +extern void aprsdecode_Checktrack(aprsdecode_pOPHIST op, + aprsdecode_pFRAMEHIST lastf) +{ + aprsdecode_pFRAMEHIST f; + aprsdecode_pFRAMEHIST frame; + struct aprspos_POSITION last2; + struct aprspos_POSITION last; + struct aprspos_POSITION apos; + uint32_t starttime; + char cmp; + uint32_t wridx; + uint16_t index[8192]; + struct _0 table[4096]; + struct aprsdecode_OPHIST * anonym; + if (lastf) frame = lastf->next; + else { + op->margin0.long0 = 3.1415926535f; + op->margin0.lat = (-1.57079632675f); + op->margin1.long0 = (-3.1415926535f); + op->margin1.lat = 1.57079632675f; + frame = op->frames; + while (frame) { + frame->vardat->refcnt = 0UL; + frame = frame->next; + } + frame = op->frames; + while (frame) { + ++frame->vardat->refcnt; + frame = frame->next; + } + frame = op->frames; + } + if (frame==0) return; + starttime = frame->time0; /* from this waypoint dupes will be set */ + f = op->frames; + while (f && f->time0+aprsdecode_lums.dupemaxtimenext; + memset((char *)index,(char)0,16384UL); + wridx = 0UL; + lastf = 0; + cmp = 0; + aprsdecode_posinval(&last); + aprsdecode_posinval(&last2); + while (f) { + if (f==frame) cmp = 1; + apos = f->vardat->pos; + if (aprspos_posvalid(apos)) { + if (cmp) { + { /* with */ + struct aprsdecode_OPHIST * anonym = op; + if (apos.long0margin0.long0) { + anonym->margin0.long0 = apos.long0; + } + if (apos.long0>anonym->margin1.long0) { + anonym->margin1.long0 = apos.long0; + } + if (apos.lat>anonym->margin0.lat) { + anonym->margin0.lat = apos.lat; + } + if (apos.latmargin1.lat) { + anonym->margin1.lat = apos.lat; + } + } + f->nodraw &= ~0x8U; + } + if (lookup(&wridx, table, index, f) && cmp) { + if (apos.lat!=last.lat || apos.long0!=last.long0) { + if (apos.lat!=last2.lat || apos.long0!=last2.long0) { + f->nodraw |= 0x8U; + } + } + } + if (maxspeed>0.0f) timespeed(lastf, apos, f->time0, &f->nodraw); + if (!(f->nodraw&~0x14U) || !aprspos_posvalid(op->lastpos)) { + op->lastpos = apos; + } + last2 = last; + last = apos; + } + else f->nodraw |= 0x40U; + lastf = f; + f = f->next; + } + joinchunk(op); +} /* end Checktrack() */ + + +static char strcmp0(const char a[], uint32_t a_len, + const char b[], uint32_t b_len) +/* faster but needs 0 termination */ +{ + uint32_t i; + i = 0UL; + for (;;) { + if (a[i]!=b[i]) return 0; + if (a[i]==0) return 1; + ++i; + } + return 0; +} /* end strcmp() */ + + +static char callfilt(uint8_t v, const char str[], + uint32_t str_len, char fullmatch) +{ + uint32_t j; + uint32_t i; + char s[31]; + if (str[0UL]==0) return 0; + i = 0UL; + for (;;) { + useri_confstrings(v, i, 0, s, 31ul); + if (s[0U]==0) return 0; + s[30U] = 0; + /* IF fullmatch THEN IF StrCmp(s, str) THEN RETURN TRUE END; */ + if (fullmatch) { + j = 0UL; + for (;;) { + if (s[j]=='*') { + if (s[j+1UL]==0 || str[j]==0) return 1; + } + else { + if (s[j]!=str[j]) break; + if (str[j]==0) return 1; + } + ++j; + if (j>str_len-1) return 1; + } + } + else if (aprsstr_InStr(str, str_len, s, 31ul)>=0L) return 1; + /* comment filter */ + ++i; + } + return 0; +} /* end callfilt() */ + + +static void inserthrt(const struct aprsdecode_DAT dat, + aprsdecode_pOPHIST * op, uint8_t errs) +{ + aprsdecode_pFRAMEHIST lastf; + aprsdecode_pFRAMEHIST f; + aprsdecode_pVARDAT v; + uint32_t len; + uint32_t ih; + uint32_t i; + uint32_t stime; + char s[51]; + char rb[51]; + struct aprsdecode_VARDAT * anonym; + uint32_t tmp; + f = (*op)->frames; + lastf = 0; + tmp = dat.hrtlen-1UL; + ih = 0UL; + if (ih<=tmp) for (;; ih++) { + if (dat.hrtposes[ih].notinterpolated) { + /* interpolating does vector drawer */ + stime = dat.hrtposes[ih].dtime; + while (f && f->time0next; + } + if (f==0 || f->time0!=stime) { + /* not a redundant same time frame */ + osic_alloc((char * *) &f, + sizeof(struct aprsdecode_FRAMEHIST)); + useri_debugmem.req = sizeof(struct aprsdecode_FRAMEHIST); + useri_debugmem.mon += useri_debugmem.req; + if (f==0) return; + memset((char *)f,(char)0, + sizeof(struct aprsdecode_FRAMEHIST)); + if ((float)fabs(dat.hrtposes[ih].dalt)<2.147483646E+9f) { + aprsstr_IntToStr((int32_t)X2C_TRUNCI(dat.hrtposes[ih].dalt, + X2C_min_longint,X2C_max_longint), 0UL, s, 51ul); + strncpy(rb,">:$HR[a",51u); + aprsstr_Append(rb, 51ul, s, 51ul); + aprsstr_Append(rb, 51ul, "]", 2ul); + } + else rb[0U] = 0; + len = (sizeof(struct aprsdecode_VARDAT)-499UL)+aprsstr_Length(rb, + 51ul); + osic_alloc((char * *) &v, len); + useri_debugmem.req = len; + useri_debugmem.mon += len; + if (v==0) return; + memset((char *)v,(char)0,len); + { /* with */ + struct aprsdecode_VARDAT * anonym = v; + anonym->pos.long0 = dat.hrtposes[ih].dlong; + anonym->pos.lat = dat.hrtposes[ih].dlat; + i = 0UL; + do { + anonym->raw[i] = rb[i]; + ++i; + } while (rb[i]); + } + v->lastref = f; + f->vardat = v; + f->time0 = stime; + f->nodraw = errs; + if (lastf==0) { + f->next = (*op)->frames; + (*op)->frames = f; /* new track */ + } + else { + f->next = lastf->next; /* not nil if insert older frame */ + lastf->next = f; /* append waypoint */ + } + } + } + if (ih==tmp) break; + } /* end for */ +} /* end inserthrt() */ + + +static void settempspeed(aprsdecode_pOPHIST op, + const struct aprsdecode_DAT dat) +{ + float rv; + op->drawhints = op->drawhints&~0x3U; + if (dat.objectfrom[0UL]) op->drawhints |= 0x2U; + /* EXCL(op^.drawhints, MIRRORSYM); */ + if (dat.sym=='_') { + op->lastinftyp = 0U; + op->lasttempalt = -32768; + rv = aprstext_FtoC(dat.wx.temp); + if (rv>=(-99.0f) && rv<=99.0f) { + op->lasttempalt = (short)X2C_TRUNCI(rv,-32768,32767); + op->temptime = aprsdecode_systime; + op->lastinftyp = 100U; + } + if (dat.course>=1UL && dat.course<=360UL) { + op->lastinftyp = (uint8_t)(110UL+(dat.course%360UL)/4UL); + op->temptime = aprsdecode_systime; + } + else op->lastinftyp = 100U; + if (dat.speed<500UL) { + op->lastkmh = (short)X2C_TRUNCI((float)dat.speed*1.609f+0.5f, + -32768,32767); + if (op->lastinftyp<100U) op->lastinftyp = 100U; + op->temptime = aprsdecode_systime; + } + else op->lastkmh = 0; + } + else if (dat.speed<30000UL) { + op->lastkmh = (short)X2C_TRUNCI((float)dat.speed*1.852f+0.5f, + -32768,32767); + if (dat.speed>0UL && dat.course>180UL) op->drawhints |= 0x1U; + if (dat.course<=360UL) { + op->lastinftyp = (uint8_t)(10UL+dat.course/4UL); + } + else op->lastinftyp = 1U; + } + else if (op->lastinftyp<100U) op->lastinftyp = 0U; + if (op->lastinftyp<100U) { + if (dat.altitude>-10000L && dat.altitude<55535L) { + op->lasttempalt = (short)(dat.altitude+(-22768L)); + } + else op->lasttempalt = -32768; + } +} /* end settempspeed() */ + + +static char widefilt(void) +{ + char s[101]; + useri_confstr(useri_fFINGERPRINT, s, 101ul); + return aprsstr_InStr(s, 101ul, "0:2", 4ul)>=0L; +} /* end widefilt() */ + +#define aprsdecode_SAMETIME 27 +/* max time diff for merged in frames */ + +static CHSET _cnst0 = {0x30000000UL,0x280086BAUL,0x80000001UL,0x00000001UL}; + +extern int32_t aprsdecode_Stoframe(aprsdecode_pOPHIST * optab, + char rawbuf[], uint32_t rawbuf_len, uint32_t stime, + char logmode, uint32_t * oldtime, + struct aprsdecode_DAT dat) +{ + aprsdecode_pOPHIST opo; + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST lastf; + aprsdecode_pFRAMEHIST frame; + aprsdecode_pVARDAT same; + aprsdecode_MONCALL igate; + uint32_t cnt; + uint32_t len; + uint32_t i; + uint16_t ch0; + uint16_t hash; + struct aprsdecode_VARDAT * anonym; + int32_t aprsdecode_Stoframe_ret; + X2C_PCOPY((void **)&rawbuf,rawbuf_len); + *oldtime = 1UL; /* say not "new user" if filtered out */ + i = 0UL; + hash = 0U; + do { + ch0 = (uint16_t)(uint8_t)rawbuf[i]; + hash += ch0; + ++i; + } while (ch0); + do { + --i; + } while (!(i==0UL || (rawbuf[i]!='\015' && rawbuf[i]!='\012') && rawbuf[i])); + rawbuf[i+1UL] = 0; /* remove trailing CR LF */ + /*FOR len:=0 TO i DO WrInt(ORD(rawbuf[len]), 4) END; WrLn; */ + /* IF NOT logmode THEN */ + if (dat.igatep>0UL && dat.igatep<=9UL) { + memcpy(igate,dat.viacalls[dat.igatep],9u); + } + else igate[0UL] = 0; + if (((((callfilt(useri_fOPFILT, dat.symcall, 9ul, + 1) || callfilt(useri_fIGATEFILT, igate, 9ul, + 1)) || callfilt(useri_fOBJSRCFILT, dat.objectfrom, 9ul, + 1)) || callfilt(useri_fDESTFILT, dat.dstcall, 9ul, + 0)) || callfilt(useri_fSTRFILT, dat.comment0, 256ul, + 0)) || callfilt(useri_fRAWFILT, rawbuf, rawbuf_len, 0)) { + aprsdecode_Stoframe_ret = -1L; + goto label; + } + if (useri_configon(useri_fMUSTBECALL)) { + if (dat.type==aprsdecode_OBJ || dat.type==aprsdecode_ITEM) { + if (!aprstext_isacall(dat.objectfrom, 9ul)) { + aprsdecode_Stoframe_ret = -1L; + goto label; + } + } + else if (!aprstext_isacall(dat.symcall, 9ul)) { + aprsdecode_Stoframe_ret = -1L; + goto label; + } + } + /* END; */ + *oldtime = 0UL; + cnt = 0UL; /* check for 2 WIDE chunk */ + if (widefilt()) { + i = 0UL; + while (((cnt<2UL && i<=9UL) && dat.viacalls[i][0UL]) + && (dat.igatep==0UL || icall,9u)) { + opo = op; + op = op->next; + } + if (op==0) { + osic_alloc((char * *) &op, sizeof(struct aprsdecode_OPHIST)); + useri_debugmem.req = sizeof(struct aprsdecode_OPHIST); + useri_debugmem.mon += useri_debugmem.req; + if (op==0) { + aprsdecode_Stoframe_ret = -2L; + goto label; + } + memset((char *)op,(char)0,sizeof(struct aprsdecode_OPHIST)); + memcpy(op->call,dat.symcall,9u); + if (logmode || opo==0) { + /* store it at begin of list for quick find */ + op->next = *optab; + *optab = op; + } + else opo->next = op; + } + else if (logmode && opo) { + /* move it to begin of list */ + opo->next = op->next; + op->next = *optab; + *optab = op; + } + else *oldtime = op->lasttime; + if (dat.hrttime>0UL) stime = dat.hrttime; + if (op->lasttime<=stime) { + /* new waypoint */ + settempspeed(op, dat); + op->lasttime = stime; + } + frame = op->frames; + lastf = 0; + same = 0; + if (logmode) { + /* refcnt used as raw string hash */ + while (frame && (frame->vardat->refcnt!=(uint32_t) + hash || !strcmp0(frame->vardat->raw, 500ul, rawbuf, + rawbuf_len))) { + lastf = frame; + frame = frame->next; + } + } + else { + /* online data find without hash */ + while (frame && !strcmp0(frame->vardat->raw, 500ul, rawbuf, + rawbuf_len)) { + lastf = frame; + frame = frame->next; + } + } + if (frame) { + /* found same frame */ + same = frame->vardat; + lastf = same->lastref; + while (lastf->next) lastf = lastf->next; + } + if (lastf && lastf->time0>stime) { + /* older frame to insert */ + lastf = 0; + frame = op->frames; + while (frame && frame->time0next; + } + if (frame && frame->time0-stime<27UL) { + aprsdecode_Stoframe_ret = -2L; + goto label; + } + } + /* not insert same frame */ + osic_alloc((char * *) &frame, sizeof(struct aprsdecode_FRAMEHIST)); + useri_debugmem.req = sizeof(struct aprsdecode_FRAMEHIST); + useri_debugmem.mon += useri_debugmem.req; + if (frame==0) { + aprsdecode_Stoframe_ret = -2L; + goto label; + } + memset((char *)frame,(char)0,sizeof(struct aprsdecode_FRAMEHIST)); + if (same==0) { + /* found new data */ + len = (sizeof(struct aprsdecode_VARDAT)-499UL)+aprsstr_Length(rawbuf, + rawbuf_len); + osic_alloc((char * *) &same, len); + useri_debugmem.req = len; + useri_debugmem.mon += len; + if (same==0) { + aprsdecode_Stoframe_ret = -2L; + goto label; + } + memset((char *)same,(char)0,len); + { /* with */ + struct aprsdecode_VARDAT * anonym = same; + anonym->pos = dat.pos; + /* altitude:=dat.altitude; */ + if (dat.hbitp==0UL && dat.igaterawp<=255UL) { + /* direct to igate */ + anonym->igatepos = (uint8_t)dat.igaterawp; + anonym->igatelen = (uint8_t)dat.igatelen; + } + i = 0UL; + do { + anonym->raw[i] = rawbuf[i]; + ++i; + } while (rawbuf[i]); + if (logmode) anonym->refcnt = (uint32_t)hash; + } + } + else if (!logmode) ++same->refcnt; + if (same->lastref==0 || same->lastref->time0<=stime) { + same->lastref = frame; + } + frame->vardat = same; + frame->time0 = stime; + if (X2C_INL((int32_t)(uint8_t)dat.typc,128,_cnst0)) { + if (((X2C_INL((uint8_t)dat.symt,256, + _cnst) && (uint8_t)dat.sym>' ') && (uint8_t) + dat.sym<'\177') && op->sym.tab!='\001') { + op->sym.tab = dat.symt; + op->sym.pic = dat.sym; + } + else frame->nodraw |= 0x4U; + if (cnt>=2UL || dat.objkill=='1') { + op->sym.tab = '\001'; + op->sym.pic = 0; + } + } + op->areasymb = dat.areasymb; + op->poligon = dat.multiline.size>2UL; + op->lastrxport = dat.lastrxport; + if (lastf==0) { + frame->next = op->frames; + op->frames = frame; /* new track */ + } + else { + frame->next = lastf->next; /* not nil if insert older frame */ + lastf->next = frame; /* append waypoint */ + } + if (dat.hrtlen>0UL) { + inserthrt(dat, &op, frame->nodraw); + } + if (!logmode) { + /* read log check whole track at end */ + aprsdecode_Checktrack(op, lastf); + inwindow(op, rawbuf, rawbuf_len); + } + if (!(frame->nodraw&~0x1U)) aprsdecode_Stoframe_ret = 0L; + else aprsdecode_Stoframe_ret = -1L; + label:; + X2C_PFREE(rawbuf); + return aprsdecode_Stoframe_ret; +} /* end Stoframe() */ + + +static char locked(aprsdecode_pOPHIST op) +/* prevent entries in click table from purge */ +{ + uint32_t i; + i = 0UL; + while (iraw, + 500ul); + osic_free((char * *) &v, alen); + useri_debugmem.mon -= alen; +} /* end freevardat() */ + +#define aprsdecode_CHKINTERVALL 120 +/* seconds to next check track */ + + +extern void aprsdecode_purge(aprsdecode_pOPHIST * ops, uint32_t oldt, + uint32_t oldobj) +{ + aprsdecode_pOPHIST opx; + aprsdecode_pOPHIST lastop; + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST frame; + aprsdecode_pVARDAT v; + uint32_t old; + char chk; + /*chkptr(ops); */ + /* + WrInt(ORD(lums.logmode), 1); + IF ops=ophist THEN WrStrLn("purge oph") + ELSIF ops=ophist2 THEN WrStrLn("purge oph2") + ELSE WrStrLn("purge error") END; + */ + op = *ops; + lastop = 0; + while (op) { + /*WrStr("op:"); WrStr(op^.call); WrStr(" "); */ + if (op->sym.tab=='\001') old = X2C_max_longcard; + else if ((0x2U & op->drawhints) && op->lastinftyp<100U) { + old = oldobj; /* object but no wx obj for wx graphs */ + } + else old = oldt; + chk = 0; + for (;;) { + frame = op->frames; + if (frame==0) break; + /*WrCard(systime-frame^.time, 6); + IF frame^.next<>NIL THEN WrStr("+") END; */ + if (frame->time0>=old || locked(op)) break; + if (frame->next && frame->time0/120UL!=frame->next->time0/120UL) { + chk = 1; + } + v = frame->vardat; + if (v->lastref==frame) freevardat(v); + else --v->refcnt; + op->frames = frame->next; + /*WrStr("(purge)"); */ + useri_debugmem.mon -= sizeof(struct aprsdecode_FRAMEHIST); + osic_free((char * *) &frame, + sizeof(struct aprsdecode_FRAMEHIST)); + } + if (op->frames==0 && !locked(op)) { + /* empty op */ + opx = op; + op = op->next; + if (lastop==0) *ops = op; + else lastop->next = op; + /*WrStr(opx^.call); WrStrLn("(purgop) "); */ + useri_debugmem.mon -= sizeof(struct aprsdecode_OPHIST); + osic_free((char * *) &opx, sizeof(struct aprsdecode_OPHIST)); + } + else { + if (chk) { + aprsdecode_Checktrack(op, 0); /*WrStr(op^.call); WrStr(" ")*/ + } + lastop = op; + op = op->next; + } + } +/*WrLn; */ +/*WrStrLn(" --purge"); */ +} /* end purge() */ + + +extern void aprsdecode_delwaypoint(aprsdecode_pOPHIST op, + aprsdecode_pFRAMEHIST * frame) +{ + aprsdecode_pFRAMEHIST lastf; + aprsdecode_pFRAMEHIST lf; + aprsdecode_pFRAMEHIST f; + int32_t mi; + int32_t di; + int32_t i; + struct aprsdecode_DAT dat; + if (op==0 || *frame==0) return; + i = 0L; + di = 0L; + mi = 0L; + lf = 0; + f = op->frames; + while (f) { + if (f->next==*frame) { + lf = f; /* next frame is to delete */ + di = mi; + } + if (f->vardat==(*frame)->vardat) ++i; + f->vardat->refcnt = 0UL; + ++mi; + f = f->next; + } + if (i==1L) freevardat((*frame)->vardat); + if (lf==0) op->frames = (*frame)->next; + else lf->next = (*frame)->next; + useri_debugmem.mon -= sizeof(struct aprsdecode_FRAMEHIST); + osic_free((char * *)frame, sizeof(struct aprsdecode_FRAMEHIST)); + f = op->frames; + while (f) { + if (f->vardat->refcnt<65535UL) ++f->vardat->refcnt; + f->vardat->lastref = f; + f->nodraw = 0U; /* mark errors new later */ + f = f->next; + } + aprsdecode_Checktrack(op, 0); + i = 0L; /* set new marker to the nearest from deleted with error */ + mi = X2C_max_longint; + *frame = 0; + lf = 0; + lastf = 0; + f = op->frames; + while (f) { + if ((!aprsdecode_lums.errorstep || (f->nodraw&~0x40U)!=0U) + && labs(i-di)next; + } + if (*frame==0) *frame = lf; + if (lastf) { + if (aprsdecode_Decode(lastf->vardat->raw, 500ul, &dat)>=0L) { + settempspeed(op, dat); + } + op->lasttime = lastf->time0; + /* deleted last frame so correct op time */ + } +} /* end delwaypoint() */ + + +static char cmpfrom(const char a[], uint32_t a_len, + uint32_t from, const char b[], uint32_t b_len) +{ + uint32_t i; + i = 0UL; + while (from<=a_len-1 && b[i]) { + if (a[from]!=b[i]) return 0; + ++i; + ++from; + } + return 1; +} /* end cmpfrom() */ + +/* +PROCEDURE AppQ(VAR h:ARRAY OF CHAR; q-:ARRAY OF CHAR; appcall:BOOLEAN); +BEGIN + Append(h, ">"+TOCALL+","); + Append(h, q); + IF appcall THEN Append(h, servercall) END; + Append(h, ":"); +END AppQ; +*/ + +static char callchk(uint32_t * qpos, char * tablechk, + char buf[], uint32_t buf_len, uint32_t * p, + uint32_t tablen, uint32_t * pssid, char withstar, + char iscall0) +{ + uint32_t lit; + uint32_t num1; + uint32_t u; + uint32_t j; + uint32_t i; + char c; + *pssid = 0UL; + u = 0UL; + for (;;) { + if (u>=tablen) break; + j = 0UL; + i = *p; + while (ungate[u][j]==buf[i]) { + ++i; + ++j; + if (ungate[u][j]==0) { + *tablechk = 1; + goto loop_exit; + } + } + ++u; + } + loop_exit:; + if (iscall0) { + /* we want a callsign */ + num1 = 0UL; + lit = 0UL; + for (;;) { + c = buf[*p]; + if ((uint8_t)c>='0' && (uint8_t)c<='9') ++num1; + else if ((uint8_t)c>='A' && (uint8_t)c<='Z') ++lit; + else break; + ++*p; + } + if ((lit<2UL || num1==0UL) || num1>2UL) return 0; + *pssid = *p; + if (buf[*p]=='-') { + ++*p; + if (buf[*p]=='1') { + ++*p; + if ((uint8_t)buf[*p]>='0' && (uint8_t)buf[*p]<='5') ++*p; + } + else { + if ((uint8_t)buf[*p]<'1' || (uint8_t)buf[*p]>'9') return 0; + ++*p; + } + } + } + else if ((buf[*p]=='q' && buf[*p+1UL]=='A') && (uint8_t) + buf[*p+2UL]>='A') { + /* qAx */ + *qpos = *p+2UL; + *p += 3UL; + } + else { + /* we skip any text */ + for (;;) { + c = buf[*p]; + if (c=='-') *pssid = *p; + if (((((uint8_t)c<=' ' || c=='>') || c=='*') || c==',') || c==':') + break; + ++*p; + } + } + if (*pssid==0UL) *pssid = *p; + if (buf[*p]=='*' && withstar) ++*p; + return 1; +} /* end callchk() */ + + +static void Iconstruct(char qtext[32], uint32_t * pins, + char logcall[], uint32_t logcall_len, char buf[], + uint32_t buf_len, uint32_t * p) +{ + uint32_t k; + uint32_t j; + uint32_t i; + if (*p<=4UL || buf[*p-2UL]!='I') return; + /* ,CALL,I: */ + i = *p-4UL; + while (buf[i]!=',') { + /* hop back call */ + if (i==0UL) return; + --i; + } + k = i; /* "," before call */ + ++i; + j = 0UL; + while (j<=logcall_len-1 && logcall[j]) { + if (logcall[j]!=buf[i]) return; + ++i; + ++j; + } + /* logcall = call,I */ + *pins = k; + i = *p-1UL; + *p = k+1UL; /* payload */ + for (;;) { + buf[k] = buf[i]; + if (i>=buf_len-1 || buf[i]==0) break; + ++k; + ++i; + } + /* delete ,call,I */ + strncpy(qtext,",qAR,",32u); /* insert ,qAR,call */ + aprsstr_Append(qtext, 32ul, logcall, logcall_len); +/* +OE0AAA-9>T8SV40,WIDE1-1,DB0WGS,I:test +OE0AAA-9>T8SV40,WIDE1-1:test +OE0AAA-9>T8SV40,WIDE1-1,qAR,DB0WGS:test +*/ +} /* end Iconstruct() */ + + +static int32_t AprsIs(char buf[], uint32_t buf_len, + uint32_t tablen, const char logcall[], + uint32_t logcall_len, uint32_t udpchan, + char valid, char chkrfcall, + char * tablechk) +{ + uint32_t qpos; + uint32_t ha; + uint32_t ilen; + uint32_t psum1; + uint32_t psum0; + uint32_t pssid; + uint32_t pins; + uint32_t len; + uint32_t p; + uint32_t i; + uint8_t hashh; + uint8_t hashl; + char qtext[32]; + uint32_t tmp; + hashl = 0U; + hashh = 0U; + p = 0UL; + pins = 0UL; + pssid = 0UL; /* for savety */ + len = 0UL; + while ((lenbuf_len-1) return -2L; + qpos = 0UL; + *tablechk = 0; + for (;;) { + psum0 = p; + if (!callchk(&qpos, tablechk, buf, buf_len, &p, tablen, &pssid, 0, + udpchan && chkrfcall)) return -3L; + if (buf[p]!='>') return -1L; + ++p; + if (!callchk(&qpos, tablechk, buf, buf_len, &p, tablen, &pssid, 0, 0)) { + return -3L; + } + psum1 = pssid; + while (buf[p]==',') { + ++p; + if (!callchk(&qpos, tablechk, buf, buf_len, &p, tablen, &pssid, 1, + 0)) return -3L; + } + if (buf[p]!=':') return -1L; + if (pins==0UL) pins = p; + ++p; + if (buf[p]!='}') break; + ++p; + } + if (p>=len) return -2L; + qtext[0U] = 0; + if (qpos>0UL) { + /* qA */ + if (X2C_CAP(buf[qpos])=='Z') return -3L; + if (X2C_CAP(buf[qpos])=='I') { + aprsstr_Append(qtext, 32ul, ",", 2ul); /* qAI */ + useri_confappend(useri_fMYCALL, qtext, 32ul); + } + } + else if (udpchan) { + aprsstr_Append(qtext, 32ul, ",qAU,", 6ul); + useri_confappend(useri_fMYCALL, qtext, 32ul); + } + else if (logcall[0UL]) { + if (cmpfrom(buf, buf_len, 0UL, logcall, logcall_len)) { + strncpy(qtext,",qAC,",32u); + } + else strncpy(qtext,",qAS,",32u); + useri_confappend(useri_fMYCALL, qtext, 32ul); + Iconstruct(qtext, &pins, logcall, logcall_len, buf, buf_len, &p); + } + if (buf[p]=='?') return -4L; + tmp = psum1-1UL; + i = psum0; + if (i<=tmp) for (;; i++) { + aprsstr_HashCh(buf[i], &hashl, &hashh); + if (i==tmp) break; + } /* end for */ + while ((paprsdecode_realtime) return -5L; + /* a duplicate */ + if (udpchan || valid) timehash[ha] = aprsdecode_realtime; + if (udpchan==0UL && !valid) return -1L; + buf[p] = '\015'; + ++p; + buf[p] = '\012'; + ++p; + buf[p] = 0; + ++p; + ilen = aprsstr_Length(qtext, 32ul); + if (ilen>0UL) { + while (p>pins) { + --p; + buf[p+ilen] = buf[p]; + } + i = 0UL; + while (iipnum, 64ul); + aprsstr_Append(s, s_len, ":", 2ul); + aprsstr_Append(s, s_len, anonym->port, 6ul); + } +} /* end connstr() */ + + +static void wrconnected(aprsdecode_pTCPSOCK cp) +{ + char h[301]; + connstr(cp, h, 301ul); + useri_textautosize(0L, 5L, 6UL, 5UL, 'b', h, 301ul); +} /* end wrconnected() */ + + +extern void aprsdecode_tcpconnstat(char s[], uint32_t s_len) +{ + aprsdecode_pTCPSOCK tcp0; + char h[100]; + struct aprsdecode_TCPSOCK * anonym; + tcp0 = aprsdecode_tcpsocks; + while (tcp0) { + { /* with */ + struct aprsdecode_TCPSOCK * anonym = tcp0; + if (anonym->connt>0UL && anonym->conntipnum, 64ul); + aprsstr_Append(s, s_len, ":", 2ul); + aprsstr_Append(s, s_len, anonym->port, 6ul); + aprsstr_Append(s, s_len, "\012 Connecttime:", 16ul); + aprsstr_TimeToStr(aprsdecode_realtime-anonym->connt, h, 100ul); + aprsstr_Append(s, s_len, h, 100ul); + if (aprsdecode_lasttcprx<=aprsdecode_realtime && aprsdecode_realtime-aprsdecode_lasttcprx<3600UL) + { + aprsstr_Append(s, s_len, "\012 No rx since:", 16ul); + aprsstr_TimeToStr(aprsdecode_realtime-aprsdecode_lasttcprx, h, + 100ul); + aprsstr_Append(s, s_len, h, 100ul); + } + aprsstr_Append(s, s_len, "\012 Rx Frames:", 14ul); + aprsstr_IntToStr((int32_t)anonym->rxframes, 1UL, h, 100ul); + aprsstr_Append(s, s_len, h, 100ul); + aprsstr_Append(s, s_len, "\012 Rx Bytes:", 13ul); + aprsstr_IntToStr((int32_t)anonym->rxbytes, 1UL, h, 100ul); + aprsstr_Append(s, s_len, h, 100ul); + aprsstr_Append(s, s_len, "\012 Tx Frames:", 14ul); + aprsstr_IntToStr((int32_t)anonym->txframes, 1UL, h, 100ul); + aprsstr_Append(s, s_len, h, 100ul); + aprsstr_Append(s, s_len, "\012 Tx Bytes:", 13ul); + aprsstr_IntToStr((int32_t)anonym->txbytes, 1UL, h, 100ul); + aprsstr_Append(s, s_len, h, 100ul); + } + tcp0 = anonym->next; + } + } +} /* end tcpconnstat() */ + + +extern void aprsdecode_udpconnstat(uint32_t port, char s[], + uint32_t s_len) +{ + char h[51]; + uint32_t i; + struct aprsdecode_UDPSOCK * anonym; + if (port<=3UL) { + { /* with */ + struct aprsdecode_UDPSOCK * anonym = &aprsdecode_udpsocks0[port]; + if (anonym->starttime>0UL) { + if (aprsdecode_realtimestarttime) { + anonym->starttime = aprsdecode_realtime; + } + if (s[0UL]) aprsstr_Append(s, s_len, "\012", 2ul); + aprsstr_Append(s, s_len, "Rf ", 4ul); + aprsstr_IntToStr((int32_t)(port+1UL), 1UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + aprsstr_Append(s, s_len, ":", 2ul); + i = 1UL; + for (;;) { + useri_conf2str((uint8_t)(36UL+port), i, h, 51ul); + if (h[0U]==0) break; + if (i>1UL) aprsstr_Append(s, s_len, " ", 2ul); + aprsstr_Append(s, s_len, h, 51ul); + ++i; + } + aprsstr_Append(s, s_len, "\012 ", 4ul); + aprsstr_ipv4tostr(anonym->ip, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + aprsstr_Append(s, s_len, ":", 2ul); + aprsstr_IntToStr((int32_t)anonym->dport, 0UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + if (anonym->checkip) aprsstr_Append(s, s_len, "/", 2ul); + else aprsstr_Append(s, s_len, ":", 2ul); + aprsstr_IntToStr((int32_t)anonym->bindport, 0UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + aprsstr_Append(s, s_len, "\012 Uptime :", 12ul); + aprsstr_TimeToStr(aprsdecode_realtime-anonym->starttime, h, + 51ul); + aprsstr_Append(s, s_len, h, 51ul); + if (anonym->lastudprx>0UL && anonym->lastudprx<=aprsdecode_realtime) + { + aprsstr_Append(s, s_len, "\012 Last rx:", 12ul); + aprsstr_TimeToStr(aprsdecode_realtime-anonym->lastudprx, h, + 51ul); + aprsstr_Append(s, s_len, h, 51ul); + } + if (anonym->lastudptx>0UL && anonym->lastudptx<=aprsdecode_realtime) + { + aprsstr_Append(s, s_len, "\012 Last tx:", 12ul); + aprsstr_TimeToStr(aprsdecode_realtime-anonym->lastudptx, h, + 51ul); + aprsstr_Append(s, s_len, h, 51ul); + } + if (aprsdecode_realtimebpstime && anonym->bpstime-aprsdecode_realtime<3600UL) + { + aprsstr_Append(s, s_len, "\012 Next net>rf(s):", 19ul); + aprsstr_IntToStr((int32_t) + (anonym->bpstime-aprsdecode_realtime), 1UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + } + aprsstr_Append(s, s_len, "\012 Rx Frames:", 14ul); + aprsstr_IntToStr((int32_t)anonym->rxframes, 1UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + aprsstr_Append(s, s_len, "\012 Rx Bytes:", 13ul); + aprsstr_IntToStr((int32_t)anonym->rxbytes, 1UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + aprsstr_Append(s, s_len, "\012 Tx Frames:", 14ul); + aprsstr_IntToStr((int32_t)anonym->txframes, 1UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + aprsstr_Append(s, s_len, "\012 Tx Bytes:", 13ul); + aprsstr_IntToStr((int32_t)anonym->txbytes, 1UL, h, 51ul); + aprsstr_Append(s, s_len, h, 51ul); + } + } + } +} /* end udpconnstat() */ + + +extern void aprsdecode_tcpclose(aprsdecode_pTCPSOCK w, char fin) +{ + char h[201]; + struct aprsdecode_TCPSOCK * anonym; + { /* with */ + struct aprsdecode_TCPSOCK * anonym = w; + if ((int32_t)anonym->fd>=0L) osic_CloseSock(anonym->fd); + anonym->fd = -1L; + aprsdecode_lasttcprx = 0UL; + strncpy(h,"\012TCP Close ",201u); + aprsstr_Append(h, 201ul, anonym->ipnum, 64ul); + aprsstr_Append(h, 201ul, ":", 2ul); + aprsstr_Append(h, 201ul, anonym->port, 6ul); + aprsstr_Append(h, 201ul, "\012", 2ul); + useri_textautosize(0L, 5L, 6UL, 4UL, 'e', h, 201ul); + } +} /* end tcpclose() */ + + +static void Watchbeacon(aprsdecode_pTCPSOCK cp) +{ + char ok0; + aprsdecode_FRAMEBUF tmp; + ok0 = Sendtcp(cp, *(aprsdecode_FRAMEBUF *)memcpy(&tmp,"# watchbeacon\015\01\ +2",16u)); + cp->watchtime = aprsdecode_realtime; +} /* end Watchbeacon() */ + + +static void appfilter(char s[], uint32_t s_len, char nulltoo) +/* build string "filter m/300" */ +{ + char h[1000]; + useri_confstr(useri_fSERVERFILT, h, 1000ul); + if (nulltoo || h[0U]) { + aprsstr_Append(s, s_len, " filter ", 9ul); + aprsstr_Append(s, s_len, h, 1000ul); + } +} /* end appfilter() */ + + +static void updatefilters(aprsdecode_pTCPSOCK cp) +{ + char ok0; + aprsdecode_FRAMEBUF s; + strncpy(s,"#",512u); + appfilter(s, 512ul, 1); + aprsstr_Append(s, 512ul, "\015\012", 3ul); + ok0 = Sendtcp(cp, s); + strncpy(s,"Sent to Server",512u); + appfilter(s, 512ul, 1); + useri_textautosize(0L, 5L, 6UL, 4UL, 'b', s, 512ul); +} /* end updatefilters() */ + + +static char tcpconn(aprsdecode_pTCPSOCK * sockchain, int32_t f) +{ + aprsdecode_pTCPSOCK cp; + aprsdecode_FRAMEBUF h; + int32_t res; + char ok0; + char s[100]; + struct aprsdecode_TCPSOCK * anonym; + if ((int32_t)f<0L) return 0; + osic_alloc((char * *) &cp, sizeof(struct aprsdecode_TCPSOCK)); + useri_debugmem.req = sizeof(struct aprsdecode_TCPSOCK); + useri_debugmem.mon += useri_debugmem.req; + if (cp==0) { + osic_CloseSock(f); + if (aprsdecode_verb) osi_WrStrLn("tcp conn out of memory", 23ul); + return 0; + } + memset((char *)cp,(char)0,sizeof(struct aprsdecode_TCPSOCK)); + { /* with */ + struct aprsdecode_TCPSOCK * anonym = cp; + anonym->fd = f; + res = socknonblock(f); + /* txbuf:=NIL; */ + anonym->watchtime = aprsdecode_realtime; + } + cp->next = *sockchain; + *sockchain = cp; + useri_confstr(useri_fMYCALL, s, 100ul); + if (s[0U]) { + if (aprstext_callwrong(s, 100ul)) { + useri_xerrmsg("illegal \'My Call\' in login", 27ul); + } + aprsstr_Assign(h, 512ul, "user ", 6ul); + aprsstr_Append(h, 512ul, s, 100ul); + useri_confstr(useri_fPW, s, 100ul); + if (s[0U]) { + /* & configon(fPW)*/ + aprsstr_Append(h, 512ul, " pass ", 7ul); + aprsstr_Append(h, 512ul, s, 100ul); + } + aprsstr_Append(h, 512ul, " vers ", 7ul); + aprsstr_Append(h, 512ul, "aprsmap(cu) 0.66", 17ul); + appfilter(h, 512ul, 0); + /* IF filter[0]<>0C THEN Append(h, " filter "); + Append(h, filter) END; */ + aprsstr_Append(h, 512ul, "\015\012", 3ul); + ok0 = Sendtcp(cp, h); + } + cp->txframes = 0UL; + cp->txbytes = 0UL; + return 1; +} /* end tcpconn() */ + +/* +PROCEDURE Gateconn(VAR cp:pTCPSOCK); +VAR fd:SOCKET; + p, act, try, kill:pTCPSOCK; + max:CARDINAL; +BEGIN +--WrStrLn(" gateconn"); +(* + IF cp<>NIL THEN + IF (cp^.fd<>CAST(SOCKET,-1)) & NOT configon(fSERVERURL) THEN + saybusy(kill^.fd, ""); + END; + ELSIF +*) + act:=NIL; + try:=NIL; + p:=cp; + WHILE p<>NIL DO + IF p^.connt>0 THEN (* we have gate connect *) + IF act<>NIL THEN (* we have 2 connects *) + IF act^.gatepri>p^.gatepri THEN (* stop second best *) + kill:=act; + act:=p; + ELSE kill:=p END; (* stop second best *) + saybusy(kill^.fd, "# remove double connect"+CR+LF) + ELSE act:=p END; + ELSE try:=p END; (* trying to connect *) + p:=p^.next; + END; + IF (try=NIL) & Watchclock(connecttime, + GATECONNDELAY) THEN (* no trials *) + IF act=NIL THEN max:=HIGH(gateways) ELSE max:=act^.gatepri END; + (* try only better *) + IF (trygate>=max) OR (trygate>HIGH(gateways)) + OR (gateways[trygate].url[0]=0C) THEN trygate:=0 END; + (* loop thru table *) + + IF trygate0C THEN + fd:=connectto(url, port); +--WrInt(fd, 1);WrStrLn(" connfd"); + + IF CAST(INTEGER,fd)>=0 THEN + IF tcpconn(cp, fd, filterst) THEN + Assign(cp^.ipnum, url); + Assign(cp^.port, port); + cp^.gatepri:=trygate; +-- Assign(h, servercall); +-- Append(h, " connected to "); Append(h, url); Append(h, ":"); + Append(h, port); +-- xerrmsg(h); + END; + END; + END; + END; + END; + INC(trygate); + + END; +END Gateconn; +*/ + +static void urlport(char s[], uint32_t s_len, char url[], + uint32_t url_len, char port[], uint32_t port_len) +/* url:port to url port */ +{ + int32_t i; + X2C_PCOPY((void **)&s,s_len); + aprsstr_Assign(url, url_len, s, s_len); + i = aprsstr_InStr(url, url_len, ":", 2ul); + if (i>0L) { + url[i] = 0; + aprsstr_Delstr(s, s_len, 0UL, (uint32_t)(i+1L)); + aprsstr_Assign(port, port_len, s, s_len); + } + else port[0UL] = 0; + X2C_PFREE(s); +} /* end urlport() */ + +#define aprsdecode_DEFAULTPORT "14580" + + +static void Gateconn(aprsdecode_pTCPSOCK * cp) +{ + int32_t fd; + char port[1000]; + char ip[1000]; + char s[1000]; + /*WrInt(cycleservers, 5); WrStrLn(" gateconn"); */ + if (*cp) { + if ((int32_t)(*cp)->fd>=0L && !useri_configon(useri_fCONNECT)) { + saybusy(&(*cp)->fd, "", 1ul); + } + } + else if (useri_configon(useri_fCONNECT) && Watchclock(&connecttime, + 30UL)) { + for (;;) { + useri_confstrings(useri_fSERVERURL, cycleservers, 0, s, 1000ul); + if (s[0U] || cycleservers==0UL) break; + cycleservers = 0UL; + } + if (s[0U]) { + ++cycleservers; + urlport(s, 1000ul, ip, 1000ul, port, 1000ul); + if (port[0U]==0) strncpy(port,"14580",1000u); + /*WrInt(cycleservers, 5);WrStr(" <"); WrStr(ip);WrStr("><"); + WrStr(port);WrStrLn(">"); */ + fd = connectto(ip, port); + if ((int32_t)fd>=0L) { + if (tcpconn(cp, fd)) { + aprsstr_Assign((*cp)->ipnum, 64ul, ip, 1000ul); + aprsstr_Assign((*cp)->port, 6ul, port, 1000ul); + (*cp)->beacont = 0UL; /* send next beacon now */ + } + } + } + else useri_xerrmsg("Net: No Online/Server URL configured", 37ul); + } +} /* end Gateconn() */ + + +static void porttext(uint32_t p, char s[], uint32_t s_len) +{ + char h[31]; + aprsstr_IntToStr((int32_t)(p+1UL), 1UL, h, 31ul); + aprsstr_Assign(s, s_len, "UDP ", 5ul); + aprsstr_Append(s, s_len, h, 31ul); +} /* end porttext() */ + + +static void rfbeacons(void) +{ + uint32_t i; + uint32_t nb; + int32_t j; + uint32_t shift; + uint32_t bshift; + uint32_t bn; + uint32_t bt; + aprsdecode_FRAMEBUF s; + char h[101]; + char says[101]; + char port; + struct aprsdecode_DAT dat; + char tmp; + nb = 0UL; + shift = beaconrandomstart; + bshift = (uint32_t)useri_conf2int(useri_fRFBTSHIFT, 0UL, 0L, 86400L, + 120L); + if (rfbecondone==0UL || rfbecondone>aprsdecode_realtime) { + rfbecondone = aprsdecode_realtime; + } + for (;;) { + if (aprsdecode_testbeaconbuf[0UL]) { + /* manual sent beacon */ + aprsstr_Assign(s, 512ul, aprsdecode_testbeaconbuf, 512ul); + aprsdecode_testbeaconbuf[0UL] = 0; + strncpy(says,"Sent: ",101u); + aprsstr_Append(says, 101ul, s, 512ul); + if (getbeaconparm(s, 512ul, &bt, &port)) bt = 1UL; + else bt = 0UL; + } + else { + useri_confstrings(useri_fRBTEXT, nb, 0, s, 512ul); + if (s[0UL]==0) break; + if (!getbeaconparm(s, 512ul, &bt, &port)) bt = 0UL; + says[0U] = 0; + } + if (bt>0UL) { + /* valid time */ + bn = (aprsdecode_realtime+shift)%bt; + /*WrInt(realtime MOD 86400, 10); WrInt(realtime-rfbecondone, 4); + WrInt(bshift, 4); WrInt(shift, 14); WrStrLn(" bshift"); */ + if (bn=0L) { + if ((uint8_t)dat.symt<' ') { + strncpy(h,"beacon warning: no symbol: ",101u); + aprsstr_Append(h, 101ul, s, 512ul); + useri_xerrmsg(h, 101ul); + } + if (X2C_CAP(port)=='N') { + /* beacon to net */ + if (dat.type!=aprsdecode_MICE) { + j = aprsstr_InStr(s, 512ul, ":", 2ul); + if (j>=0L) { + aprsstr_Delstr(s, 512ul, 0UL, (uint32_t)(j+1L)); + /* remove rf adress */ + SendNet(aprsdecode_tcpsocks, dat.srcall, 9ul, s, + 512ul, 1, h, 101ul); + if (h[0U]) { + strncpy(says,"beacon: not sent ",101u); + aprsstr_Append(says, 101ul, h, 101ul); + } + } + } + else strncpy(says,"beacon: not sent mic-e to Net",101u); + } + else if ((uint8_t)port>='1') { + if (s[0UL]) { + i = (uint32_t)(uint8_t)port-49UL; + if (i<4UL && useri_configon((uint8_t)(36UL+i))) { + if (Sendudp(s, 512ul, i, 1UL)<0L) { + strncpy(says,"beacon: Rfport ",101u); + aprsstr_Append(says, 101ul, + (char *)(tmp = (char)(i+49UL),&tmp), 1u/1u); + aprsstr_Append(says, 101ul, " not configured to\ + send", 24ul); + } + } + else { + strncpy(says,"beacon: Rfport ",101u); + aprsstr_Append(says, 101ul, + (char *)(tmp = (char)(i+49UL),&tmp), 1u/1u); + aprsstr_Append(says, 101ul, " not enabled", 13ul); + } + } + } + if (says[0U]) useri_say(says, 101ul, 2UL, 'b'); + } + else { + strncpy(h,"rfbeacon not decodeable: ",101u); + aprsstr_Append(h, 101ul, s, 512ul); + useri_xerrmsg(h, 101ul); + } + } + } + shift += bshift; /* delay next beacon by shift time to before beacon */ + } + ++nb; + } + rfbecondone = aprsdecode_realtime; +} /* end rfbeacons() */ + + +static void startserial(struct xosi_PROCESSHANDLE * pid, uint8_t cfg) +{ + char h[1001]; + char s[1001]; + if (useri_configon(cfg)) { + if (!(pid->runs || pid->started)) { + useri_confstr(cfg, s, 1001ul); + if (s[0U]) { + xosi_StartProg(s, 1001ul, pid); + pid->started = 1; + if (pid->runs) { + useri_say("Start Serial Interface", 23ul, 3UL, 'g'); + } + else { + strncpy(h,"can not start ",1001u); + aprsstr_Append(h, 1001ul, s, 1001ul); + useri_xerrmsg(h, 1001ul); + useri_configbool(cfg, 0); + useri_refresh = 1; + } + } + } + } + else pid->started = 0; +} /* end startserial() */ + + +extern void aprsdecode_tcpjobs(void) +{ + aprsdecode_pTCPSOCK acttcp; + int32_t i; + int32_t len; + char ok0; + char s[1000]; + struct aprsdecode_TCPSOCK * anonym; + struct aprsdecode_UDPSOCK * anonym0; + if (qwatchtime!=aprsdecode_realtime) { + acttcp = aprsdecode_tcpsocks; + while (acttcp) { + { /* with */ + struct aprsdecode_TCPSOCK * anonym = acttcp; + Timebeacon(acttcp); + if (anonym->watchtime+180ULnext; + } + } + qwatchtime = aprsdecode_realtime; + Gateconn(&aprsdecode_tcpsocks); + rfbeacons(); + } + /*UDP */ + for (i = 0L; i<=3L; i++) { + { /* with */ + struct aprsdecode_UDPSOCK * anonym0 = &aprsdecode_udpsocks0[i]; + if (useri_configon((uint8_t)(36UL+(uint32_t)i)) + && !useri_isupdated((uint8_t)(36UL+(uint32_t)i))) { + if ((int32_t)anonym0->fd<0L) { + ok0 = 0; + useri_confstr((uint8_t)(36UL+(uint32_t)i), s, 1000ul); + if (s[0U]) { + memset((char *) &aprsdecode_udpsocks0[i],(char)0, + sizeof(struct aprsdecode_UDPSOCK)); + anonym0->fd = -1L; + if (aprsstr_GetIp2(s, 1000ul, &anonym0->ip, + &anonym0->dport, &anonym0->bindport, &anonym0->checkip)<0L) { + anonym0->rawread = 1; + porttext((uint32_t)i, s, 1000ul); + aprsstr_Append(s, 1000ul, " Config Error ", 39ul); + /* textautosize(0, 5, 6, 10, "e", s); */ + useri_xerrmsg(s, 1000ul); + } + else { + anonym0->fd = openudp(); + anonym0->rawread = 1; + porttext((uint32_t)i, s, 1000ul); + if ((int32_t)anonym0->fd<0L || bindudp(anonym0->fd, + anonym0->bindport)<0L) { + aprsstr_Append(s, 1000ul, " Bindport Error, Illegal (\ +Rx)Port or in Use", 44ul); + /* textautosize(0, 5, 6, 10, "e", s); + */ + useri_xerrmsg(s, 1000ul); + osic_CloseSock(anonym0->fd); + anonym0->fd = -1L; + } + else { + aprsstr_Append(s, 1000ul, " Open", 6ul); + len = socknonblock(anonym0->fd); + useri_textautosize(0L, 5L, 6UL, 5UL, 'b', s, 1000ul); + ok0 = 1; + } + } + } + else { + porttext((uint32_t)i, s, 1000ul); + aprsstr_Append(s, 1000ul, " Not Configured", 16ul); + /* textautosize(0, 5, 6, 10, "e", s); */ + useri_xerrmsg(s, 1000ul); + } + if (!ok0) { + useri_configbool((uint8_t)(36UL+(uint32_t)i), 0); + } + } + } + else if ((int32_t)anonym0->fd>=0L) { + osic_CloseSock(anonym0->fd); + anonym0->fd = -1L; + anonym0->starttime = 0UL; + porttext((uint32_t)i, s, 1000ul); + aprsstr_Append(s, 1000ul, " Close", 7ul); + /* textautosize(0, 5, 6, 4, "e", s); */ + useri_xerrmsg(s, 1000ul); + } + } + } /* end for */ + startserial(&aprsdecode_serialpid, useri_fSERIALTASK); + startserial(&aprsdecode_serialpid2, useri_fSERIALTASK2); + sendmsg(); + /*WrInt(tickertime, 15); WrInt(realtime, 15); WrLn; */ + if (tickertime+60ULcall,9u,call,call_len)) { + op = op->next; + } + if (op) { + mino = 30000.0f; + mind = 30000.0f; + pf = op->frames; + while (pf) { + if (pf->time0+180UL>aprsdecode_realtime && (pf->nodraw&0x4FU) + ==0U) { + d = aprspos_distance(pf->vardat->pos, mypos); + /* + FixToStr(distance(pf^.vardat^.pos, mypos), 4, s); + WrStr(s); WrStr(" "); + FixToStr(distance(mypos, pf^.vardat^.pos), 4, s); + WrStr(s); WrStr(" "); + postostr(pf^.vardat^.pos, s); WrStr(s); WrStr(" "); + postostr(mypos, s); WrStrLn(s); + */ + mino = mind; + if (dnext; + } + if ((mino<29000.0f && mino!=d) && mino>d) { + beepprox(d, km); + strncpy(h,"approach ",101u); + aprsstr_FixToStr(d, 3UL, s, 31ul); + aprsstr_Append(h, 101ul, s, 31ul); + aprsstr_Append(h, 101ul, "km ", 4ul); + aprsstr_Append(h, 101ul, call, call_len); + useri_textautosize(0L, 5L, 6UL, 120UL, 'r', h, 101ul); + if (!osi_Exists("proxwarn", 9ul)) { + fd = osi_OpenWrite("proxwarn", 9ul); + if (osic_FdValid(fd)) { + aprsstr_Assign(h, 101ul, call, call_len); + aprsstr_IntToStr((int32_t) + aprsdecode_trunc(d*1000.0f), 0UL, s, 31ul); + aprsstr_Append(h, 101ul, " p ", 4ul); + aprsstr_Append(h, 101ul, s, 31ul); + osi_WrBin(fd, (char *)h, 101u/1u, + aprsstr_Length(h, 101ul)); + osic_Close(fd); + } + } + } + } + } + } + } +} /* end approxywarn() */ + +#define aprsdecode_DUPTIME 27 + +#define aprsdecode_NN "n" + +#define aprsdecode_BAD "x" + +#define aprsdecode_VIA "v" + + +static void app0(uint32_t * viac, aprsdecode_FRAMEBUF tb, uint32_t * tp, + char c) +{ + if (*tp<511UL) { + tb[*tp] = c; + ++*tp; + } + if (c==',') ++*viac; +} /* end app() */ + + +static char via(char words[], uint32_t words_len, + aprsdecode_FRAMEBUF b, char typ, uint32_t from, + uint32_t to) +{ + uint32_t i; + char h[31]; + if (from>=to) return 0; + h[0U] = typ; + i = 1UL; + while (i<28UL && from=0L; +} /* end via() */ + + +static char num0(aprsdecode_FRAMEBUF b, uint32_t i, uint32_t * n) +{ + if ((i<511UL && (uint8_t)b[i]>='0') && (uint8_t)b[i]<='9') { + *n = (uint32_t)(uint8_t)b[i]-48UL; + return 1; + } + return 0; +} /* end num() */ + + +static char scanpath(char words[], uint32_t words_len, + uint32_t * tp, aprsdecode_FRAMEBUF tb, uint32_t * viac, + aprsdecode_FRAMEBUF b, uint32_t * p, uint32_t to, + char store) +{ + uint32_t hp; + hp = *p; + while (*p=to || b[*p]==',') { + if (via(words, words_len, b, 'x', hp+1UL, + *p+(uint32_t)(*p+1UL>=to))) return 0; + /* bad word */ + hp = *p; + } + ++*p; + } + return 1; +} /* end scanpath() */ + + +static void digi(const aprsdecode_FRAMEBUF b, char fromrf, + uint32_t outport, char directonly, + char appendrest, uint32_t nomovetime, + uint32_t radius, char words[], uint32_t words_len, + int32_t * txbyte) +{ + struct aprsdecode_DAT dat; + uint32_t pn; + uint32_t viac; + uint32_t n2; + uint32_t n1; + uint32_t n; + uint32_t ssid; + uint32_t len; + uint32_t tp; + uint32_t p; + aprsdecode_FRAMEBUF tb; + /* hashl, hashh:SET8; */ + uint32_t dt; + char norout; + struct aprspos_POSITION mypos; + char s2[31]; + char s1[31]; + char mycall[31]; + *txbyte = 0L; + if (nomovetime<27UL) nomovetime = 27UL; + if (fromrf) { + tp = 0UL; + p = 0UL; + len = 0UL; + ssid = 0UL; + viac = 0UL; + useri_confstr(useri_fMYCALL, mycall, 31ul); + if (aprstext_callwrong(mycall, 31ul)) { + useri_xerrmsg("Digi needs \'My Call\'", 21ul); /* no mycall */ + return; + } + norout = aprsstr_InStr(words, words_len, " x-", 4ul)>=0L; + /* ssid routing off */ + if (aprsstr_InStr(words, words_len, " xi", 4ul)<0L) { + aprsstr_Append(words, words_len, " v", 3ul); + /* if not disabled append mycall for via */ + aprsstr_Append(words, words_len, mycall, 31ul); + } + aprsstr_Append(words, words_len, " x", 3ul); /* mycall as badword */ + aprsstr_Append(words, words_len, mycall, 31ul); + aprsstr_Append(words, words_len, " ", 2ul); + while ((len<511UL && b[len]) && b[len]!=':') ++len; + while (p7UL) norout = 1; + n = p; + while (n0UL) { + /* write old or new ssid */ + app0(&viac, tb, &tp, '-'); + if (ssid>=10UL) app0(&viac, tb, &tp, '1'); + app0(&viac, tb, &tp, (char)(ssid%10UL+48UL)); + } + if (n0UL) && n1<=7UL) && b[p-2UL]=='-') && num0(b, + p-1UL, &n2)) && n2>0UL) && n2<=n1) { + if (directonly && n1!=n2) { + return; + } + /* not direct heard */ + if (appendrest && n2>1UL) { + /* append not n-0 */ + app0(&viac, tb, &tp, ','); + pn = n; + while (pn+3UL7UL) return; + /* too much via */ + p = len; + while (p<511UL && b[p]) { + app0(&viac, tb, &tp, b[p]); + ++p; + } + app0(&viac, tb, &tp, 0); + } + else memcpy(tb,b,512u); + if (aprsdecode_Decode(tb, 512ul, &dat)<0L) return; + /*radius */ + if (dat.type!=aprsdecode_MSG && radius>0UL) { + if (!aprstext_getmypos(&mypos)) { + useri_xerrmsg("Digi with Radius needs MY Position", 35ul); + return; + } + if (!aprspos_posvalid(dat.pos) || aprspos_distance(mypos, + dat.pos)>(float)radius) return; + } + if (dat.type==aprsdecode_MSG && aprstext_isacall(dat.msgto, 9ul)) { + dt = 27UL; /* real messages fast dupetime */ + } + else dt = nomovetime; + if (outport>0UL && outport-1UL<=3UL) { + *txbyte = Sendudp(tb, 512ul, outport-1UL, dt); + if (*txbyte<0L) { + strncpy(s1,"aprsdigi:can not send to port ",31u); + aprsstr_IntToStr((int32_t)outport, 0UL, s2, 31ul); + aprsstr_Append(s1, 31ul, s2, 31ul); + useri_xerrmsg(s1, 31ul); + } + } +} /* end digi() */ + +#define aprsdecode_MAXPAYLOAD 200 +/* spare min 36 byte for 3rd party header */ + +#define aprsdecode_MSGMHTIME 3600 +/* last heard age for msgs sending */ + + +static void digitorf(const aprsdecode_FRAMEBUF b, uint32_t outport, + uint32_t nomovetime, uint32_t radius, int32_t maxbps, + char words[], uint32_t words_len) +{ + uint32_t j; + uint32_t i; + int32_t sentbytes; + aprsdecode_pOPHIST op; + char ok0; + aprsdecode_FRAMEBUF tb; + struct aprsdecode_DAT dat; + char via0[201]; + char ww[201]; + char w[201]; + /*"OH4ZZZ-5>APZ123,WIDE2-2:}OH2XYZ-11>APZYXW-4,TCPIP,OH4ZZZ-5*:>packet "*/ + /*WrStr(words); WrStrLn(b); */ + if (aprsdecode_Decode(b, 512ul, &dat)<0L || dat.igatep==0UL) return; + aprsstr_Assign(w, 201ul, words, words_len); + do { + aprsstr_Extractword(w, 201ul, ww, 201ul); + } while (!(ww[0U]==0 || ww[0U]=='n')); + if (ww[0U]==0) return; + aprsstr_Delstr(ww, 201ul, 0UL, 1UL); + if (!aprsstr_StrToInt(ww, 201ul, &maxbps)) return; + aprsstr_Extractword(w, 201ul, via0, 201ul); /* via path */ + if (via0[0U]=='n') aprsstr_Delstr(via0, 201ul, 0UL, 1UL); + else via0[0U] = 0; + if (maxbps<0L) { + if (dat.type!=aprsdecode_MSG) return; + /* if neg bps send msg only */ + /*WrStr(dat.msgto); WrStrLn(" msgto"); */ + op = findop(dat.msgto, 1); + /*IF (op<>NIL) THEN WrStr(op^.lastrxport); WrStrLn(" opok") END; */ + if ((op==0 || op->lastrxport!=(char)(outport+48UL)) + || op->lasttime+3600ULAPLM01", 8ul); + if (via0[0U]) { + if (via0[0U]!='-') aprsstr_Append(tb, 512ul, ",", 2ul); + else if (((uint8_t)via0[1U]<'1' || (uint8_t)via0[1U]>'9') + || via0[2U]) return; + /* not correct ssid */ + aprsstr_Append(tb, 512ul, via0, 201ul); + } + aprsstr_Append(tb, 512ul, ":}", 3ul); + aprsstr_Append(tb, 512ul, dat.srcall, 9ul); + aprsstr_Append(tb, 512ul, ">", 2ul); + aprsstr_Append(tb, 512ul, dat.dstcall, 9ul); + aprsstr_Append(tb, 512ul, ",TCPIP,", 8ul); + aprsstr_Append(tb, 512ul, dat.viacalls[dat.igatep], 9ul); + aprsstr_Append(tb, 512ul, "*:", 3ul); + i = dat.payload; + j = aprsstr_Length(tb, 512ul); + while (((i<=511UL && b[i]) && b[i]!='\015') && j<511UL) { + tb[j] = b[i]; + ++j; + ++i; + } + tb[j] = 0; + if (i-dat.payload>200UL) return; + /* frame too long */ + w[0] = 0; + digi(tb, 0, outport, 0, 1, nomovetime, radius, w, 201ul, &sentbytes); + if (sentbytes>0L) { + ok0 = Checkbps(outport-1UL, (uint32_t)labs(maxbps), + (uint32_t)sentbytes, 0); /* sum up txbytes */ + } +} /* end digitorf() */ + + +static void digipeat(const aprsdecode_FRAMEBUF b, uint32_t udpch) +{ + uint32_t line; + uint32_t outport; + uint32_t radius; + int32_t sentbytes; + uint32_t nomovetime; + char directonly; + char appendrest; + char words[201]; + char word[11]; + char cin; + char c; + line = 0UL; + for (;;) { + useri_confstrings(useri_fDIGI, line, 0, words, 201ul); + if (words[0U]==0) break; + cin = words[0U]; /* input port */ + if ((cin=='*' && udpch>0UL || cin==(char)(udpch+48UL)) + || cin=='N' && udpch==0UL) { + /* input port, 0 is from net */ + c = words[1U]; /* output port */ + if ((uint8_t)c>='1') outport = (uint32_t)(uint8_t)c-48UL; + else outport = 0UL; + directonly = 1; + appendrest = 0; + switch ((unsigned)words[2U]) { /* direct/delpath */ + case '1': + appendrest = 1; + break; + case '2': + directonly = 0; + break; + case '3': + directonly = 0; + appendrest = 1; + break; + } /* end switch */ + aprsstr_Extractword(words, 201ul, word, 11ul); + aprsstr_Extractword(words, 201ul, word, 11ul); + if (aprsstr_StrToCard(word, 11ul, &nomovetime)) { + aprsstr_Extractword(words, 201ul, word, 11ul); + if (aprsstr_StrToCard(word, 11ul, &radius)) { + if (cin=='N') { + digitorf(b, outport, nomovetime, radius, -5L, words, + 201ul); + } + else if (udpch>0UL) { + digi(b, 1, outport, directonly, appendrest, nomovetime, + radius, words, 201ul, &sentbytes); + } + } + } + } + ++line; + } +} /* end digipeat() */ + +#define aprsdecode_PURGEINTERVALL 10 +/* seconds+1 with no purge */ + + +static void storedata(aprsdecode_FRAMEBUF mb, aprsdecode_pTCPSOCK cp, + uint32_t udpch, const struct UDPSET modeminfo, + char valid, char local) +{ + int32_t res; + char fn[1000]; + char s[21]; + aprsdecode_MONCALL server; + char tabchk; + char ok0; + aprsdecode_pTCPSOCK tp; + struct aprsdecode_DAT dat; + char dir; + uint32_t otime; + char tmp; + if (aprsdecode_lastpurge!=aprsdecode_realtime/10UL) { + if (aprsdecode_lums.logmode) { + aprsdecode_purge(&aprsdecode_ophist2, + aprsdecode_realtime-aprsdecode_lums.purgetime, + aprsdecode_realtime-aprsdecode_lums.purgetimeobj); + } + else { + aprsdecode_purge(&aprsdecode_ophist0, + aprsdecode_realtime-aprsdecode_lums.purgetime, + aprsdecode_realtime-aprsdecode_lums.purgetimeobj); + } + aprsdecode_lastpurge = aprsdecode_realtime/10UL; + } + if (cp) memcpy(server,cp->user.call,9u); + else server[0UL] = 0; + /*WrInt(rxidle, 15); WrInt(lastlooped+IGATEMAXDELAY, 15); + WrInt(time(), 15); WrStrLn(" ig"); */ + if (local) res = 0L; + else if (aprsdecode_rxidle>=3UL && aprsdecode_lastlooped+5UL>=osic_time()) + { + /* not too long delayd data */ + digipeat(mb, udpch); + res = AprsIs(mb, 512ul, 6UL, server, 9ul, udpch, valid, + useri_configon(useri_fMUSTBECALL), &tabchk); + if (((res>=0L && useri_configon(useri_fALLOWGATE)) && !tabchk) + && udpch>0UL) { + useri_confstr(useri_fALLOWGATE, s, 21ul); + if (aprsstr_InStr(s, 21ul, + (char *)(tmp = (char)(udpch+48UL),&tmp), 1u/1u)>=0L) { + tp = aprsdecode_tcpsocks; + while (tp) { + if (tp->lastping>0UL && (tp->waitpong==1U && tp->lastping+10ULwaitpong>1U) + ) { + if (tp->lastpong>0UL) { + saylinkbad((int32_t)(aprsdecode_realtime-tp->lastpong) + ); + } + useri_xerrmsg("Ping-Timeout, Rf to AprsIs transfer stopped \ +temporarily", 56ul); + } + else ok0 = Sendtcp(tp, mb); + tp = tp->next; + } + } + } + } + else { + /* delayed */ + res = 0L; + if (aprsdecode_verb) { + osi_WrStrLn("---discarded delayed digpeat-frame", 35ul); + } + } + otime = 0UL; + if (aprsdecode_verb && udpch>0UL) { + osic_WrINT32((uint32_t)res, 3UL); + osi_WrStr(" udp ", 6ul); + osi_WrStrLn(mb, 512ul); + } + if (res>=0L && aprsdecode_Decode(mb, 512ul, &dat)>=0L) { + if (udpch>0UL) dat.lastrxport = (char)(udpch+48UL); + else dat.lastrxport = 'N'; + if (dat.type==aprsdecode_MSG) { + if (udpch>0UL) getmessage(0, udpch, dat); + else getmessage(cp, 0UL, dat); + } + if (aprsdecode_lums.logmode) { + res = aprsdecode_Stoframe(&aprsdecode_ophist2, mb, 512ul, + aprsdecode_realtime, 0, &otime, dat); + } + else { + res = aprsdecode_Stoframe(&aprsdecode_ophist0, mb, 512ul, + aprsdecode_realtime, 0, &otime, dat); + } + if (!local) { + if (useri_configon(useri_fLOGWFN)) { + useri_confstr(useri_fLOGWFN, fn, 1000ul); + aprstext_logfndate(aprsdecode_realtime, fn, 1000ul); + if (!wrlog(mb, 512ul, aprsdecode_realtime, fn, 1000ul, res)) { + poplogerr(fn, 1000ul); + } + } + if (aprspos_posvalid(dat.pos) && useri_configon(useri_fAPPROXY)) { + approxywarn(dat.pos, dat.symcall, 9ul); + } + } + } + if (res==-2L) { + dir = '#'; + } + else if (res<0L) dir = '-'; + else dir = '>'; + if (udpch>0UL) wrmon(udpch, dir, modeminfo, otime, mb, 512ul); + else wrmon(0UL, dir, modeminfo, otime, mb, 512ul); +} /* end storedata() */ + + +extern void aprsdecode_drawbeacon(char raw[], uint32_t raw_len) +{ + aprsdecode_FRAMEBUF b; + char port; + uint32_t time0; + struct UDPSET modeminfo; + aprsstr_Assign(b, 512ul, raw, raw_len); + if (getbeaconparm(b, 512ul, &time0, &port)) { + beaconmacros(b, 512ul, "", 1ul, "", 1ul, 1); + if (b[0UL]) { + memset((char *) &modeminfo,(char)0,sizeof(struct UDPSET)); + storedata(b, 0, 0UL, modeminfo, 0, 1); + if (aprsdecode_lums.logmode) { + useri_say("drawn to Realtime Data not to imported Log!", 44ul, + 5UL, 'r'); + } + else if (aprsdecode_click.mhop[0UL]) { + useri_say("switch to \"show all\" to see new object", 39ul, 5UL, + 'r'); + } + } + } + else useri_xerrmsg("decode error", 13ul); + aprsdecode_tracenew.winevent = 2000UL; +} /* end drawbeacon() */ + +static aprsstr_GHOSTSET _cnst2 = {0xFFFFFFFFUL,0xFFFFFFFFUL,0xFFFFFFFFUL, + 0xFFFFFFFFUL,0xFFFFFFFFUL,0xFFFFFFFFUL,0xFFFFFFFFUL, + 0xFFFFFFFFUL,0x00000001UL}; +static aprsstr_GHOSTSET _cnst1 = {0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL}; + +static void getghostset(uint32_t port, aprsstr_GHOSTSET g) +{ + uint32_t n; + uint32_t i; + char s[11]; + char p; + p = (char)(port+49UL); + memcpy(g,_cnst1,36u); + i = 0UL; + for (;;) { + useri_conf2str(useri_fFINGERPRINT, i, s, 11ul); + if (s[0U]==0) break; + if (s[0U]==p) { + if (s[1U]==':') { + aprsstr_Delstr(s, 11ul, 0UL, 2UL); + if (aprsstr_StrToCard(s, 11ul, &n) && n<=256UL) { + X2C_INCL(g,n,257); + } + } + else if (s[1U]==0) memcpy(g,_cnst2,36u); + } + ++i; + } +} /* end getghostset() */ + + +extern void aprsdecode_udpin(uint32_t port) +{ + aprsdecode_FRAMEBUF mbuf; + struct UDPSET modeminfo; + aprsstr_GHOSTSET gs; + struct aprsdecode_UDPSOCK * anonym; + getghostset(port, gs); + while (getudp(port, mbuf, &modeminfo, gs)) { + if (mbuf[0UL]) { + { /* with */ + struct aprsdecode_UDPSOCK * anonym = &aprsdecode_udpsocks0[port]; + + anonym->lastudprx = aprsdecode_realtime; + ++anonym->rxframes; + anonym->rxbytes += aprsstr_Length(mbuf, 512ul); + if (anonym->starttime==0UL) { + anonym->starttime = aprsdecode_realtime; + } + } + aprsdecode_lastanyudprx = aprsdecode_realtime; + storedata(mbuf, 0, port+1UL, modeminfo, 0, 0); + } + else if (aprsdecode_verb) osi_WrStrLn("axudp decode error", 19ul); + } +} /* end udpin() */ + + +extern int32_t aprsdecode_tcpout(aprsdecode_pTCPSOCK acttcp) +{ + int32_t i; + int32_t res; + struct aprsdecode_TCPSOCK * anonym; + int32_t tmp; + if ((int32_t)acttcp->fd>=0L) { + { /* with */ + struct aprsdecode_TCPSOCK * anonym = acttcp; + res = sendsock(anonym->fd, anonym->tbuf, anonym->tlen); + if (res>0L) { + tmp = anonym->tlen-1L; + i = res; + if (i<=tmp) for (;; i++) { + anonym->tbuf[i-res] = anonym->tbuf[i]; + if (i==tmp) break; + } /* end for */ + anonym->tlen -= res; + if (anonym->connt==0UL) { + anonym->connt = aprsdecode_realtime; + wrconnected(acttcp); + } + anonym->watchtime = aprsdecode_realtime; + } + } + } + else { + /* ELSE tlen:=0; (* should not happen *) */ + res = -1L; + } + return res; +} /* end tcpout() */ + + +extern void aprsdecode_tcpin(aprsdecode_pTCPSOCK acttcp) +{ + int32_t res; + aprsdecode_FRAMEBUF mbuf; + struct UDPSET modeminfo; + if ((int32_t)acttcp->fd>=0L) { + for (;;) { + res = Gettcp(acttcp->fd, mbuf, acttcp->rbuf, &acttcp->rpos); + /*WrInt(res, 1);WrStrLn(" gettcp"); */ + if (res<0L) { + /*WrStrLn("closesock"); */ + osic_CloseSock(acttcp->fd); + acttcp->fd = -1L; + break; + } + if (res<=0L) break; + ++acttcp->rxframes; + acttcp->rxbytes += aprsstr_Length(mbuf, 512ul); + acttcp->watchtime = aprsdecode_realtime; + /* WrMon(mbuf); */ + if (mbuf[0UL]=='#') getpong(acttcp, mbuf, 512ul); + memset((char *) &modeminfo,(char)0,sizeof(struct UDPSET)); + storedata(mbuf, acttcp, 0UL, modeminfo, 1, 0); + aprsdecode_lasttcprx = aprsdecode_realtime; + } + } +} /* end tcpin() */ + + +extern void aprsdecode_initparms(void) +{ + uint32_t i; + struct aprsdecode__D1 * anonym; + initcrc12(); + memset((char *)aprsdecode_gateways,(char)0, + sizeof(struct aprsdecode__D3 [10])); + memset((char *)aprsdecode_udpsocks0,(char)0, + sizeof(struct aprsdecode_UDPSOCK [4])); + for (i = 0UL; i<=3UL; i++) { + aprsdecode_udpsocks0[i].fd = -1L; + } /* end for */ + connecttime = 0UL; + cycleservers = 0UL; + logframename[0UL] = 0; + logframes = 6L; + aprsdecode_testbeaconbuf[0UL] = 0; + /* servercall[0]:=0C; */ + /* passwd[0]:=0C; */ + /* igatedelay:=TRUE; */ + rfbeacont = 0UL; + qas = 0UL; + qasc = 0UL; + aprsdecode_initxsize = 0L; + aprsdecode_initysize = 0L; + aprsdecode_initzoom = 0L; + aprsdecode_finezoom = 1.0f; + aprsdecode_posinval(&aprsdecode_mappos); + aprsdecode_spikesens = 2.0f; + aprsdecode_maxhop = 100.0f; + maxspeed = 1000.0f; + nextbeep = 0UL; + { /* with */ + struct aprsdecode__D1 * anonym = &aprsdecode_lums; + anonym->map = 350L; + anonym->rfbri = 350L; + anonym->track = 1000L; + anonym->waypoint = 800L; + anonym->sym = 1000L; + anonym->obj = 1000L; + anonym->text = 750L; + anonym->nomov = 90L; + anonym->maxdim = 3600UL; + anonym->firstdim = 82800UL; + anonym->purgetime = 90000UL; + anonym->purgetimeobj = 90000UL; + anonym->dupemaxtime = 10800UL; + anonym->fps = 0L; + /* mapmode:=REFLATER; */ + strncpy(anonym->mapname,"tiles",41u); + anonym->maplumcorr = -128L; + anonym->gamma = 2.2f; + anonym->centering = 40L; + anonym->movestep = 10UL; + strncpy(anonym->configfn,"aprsmap.cfg",257u); + anonym->wxcol = 0; + } + aprsdecode_lastpurge = 0UL; + aprsdecode_lastanyudprx = 0UL; + aprsdecode_lasttcprx = 0UL; + strncpy(aprsdecode_mapdir,"osm",1025u); + parms(); + aprsdecode_ophist0 = 0; + aprsdecode_ophist2 = 0; + aprsdecode_txmessages = 0; + aprsdecode_msgfifo0 = 0; + msgmid = 0UL; + aprsdecode_realtime = osic_time(); + uptime = aprsdecode_realtime; + trygate = 0UL; + dupetime = 60UL; + ungate[0U][0] = 0; + strncpy(ungate[1U],"NOGATE",9u); + strncpy(ungate[2U],"RFONLY",9u); + strncpy(ungate[3U],"TCPIP",9u); + strncpy(ungate[4U],"TCPXX",9u); + strncpy(ungate[5U],"q",9u); + ungate[6U][0] = 0; + aprsdecode_tcpsocks = 0; + Stopticker(); + tickertime = 0UL; + sentemptymsg = 0; + beaconrandomstart = osic_time(); + /* set a beacon scheduler start second in minute */ + beaconrandomstart = (beaconrandomstart/60UL)%60UL+(beaconrandomstart%60UL) + *60UL; +} /* end initparms() */ + + +extern void aprsdecode_BEGIN(void) +{ + static int aprsdecode_init = 0; + if (aprsdecode_init) return; + aprsdecode_init = 1; + if (sizeof(aprsdecode_SET256)!=32) X2C_ASSERT(0); + if (sizeof(aprsdecode_MONCALL)!=9) X2C_ASSERT(0); + if (sizeof(aprsdecode_FRAMEBUF)!=512) X2C_ASSERT(0); + if (sizeof(aprsdecode_WWWB)!=1401) X2C_ASSERT(0); + if (sizeof(aprsdecode_FILENAME)!=1024) X2C_ASSERT(0); + if (sizeof(aprsdecode_DUPETIMES)!=262144) X2C_ASSERT(0); + if (sizeof(aprsdecode_MSGTEXT)!=67) X2C_ASSERT(0); + if (sizeof(aprsdecode_ACKTEXT)!=5) X2C_ASSERT(0); + if (sizeof(aprsdecode_ACKREPTEXT)!=2) X2C_ASSERT(0); + if (sizeof(uint8_t)!=1) X2C_ASSERT(0); + if (sizeof(uint8_t)!=1) X2C_ASSERT(0); + if (sizeof(uint16_t)!=2) X2C_ASSERT(0); + if (sizeof(aprsdecode_TELEMETRY)!=14) X2C_ASSERT(0); + if (sizeof(uint16_t)!=2) X2C_ASSERT(0); + if (sizeof(aprsdecode_MAPNAME)!=41) X2C_ASSERT(0); + if (sizeof(aprsdecode_SYMBOLSET)!=24) X2C_ASSERT(0); + if (sizeof(CHSET)!=16) X2C_ASSERT(0); + if (sizeof(TICKERCALL)!=31) X2C_ASSERT(0); + aprstext_BEGIN(); + useri_BEGIN(); + aprspos_BEGIN(); + aprsstr_BEGIN(); + osi_BEGIN(); + xosi_BEGIN(); +} + diff --git a/src/aprsdecode.h b/src/aprsdecode.h new file mode 100644 index 0000000..c5185d6 --- /dev/null +++ b/src/aprsdecode.h @@ -0,0 +1,728 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef aprsdecode_H_ +#define aprsdecode_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef xosi_H_ +#include "xosi.h" +#endif + +/* connect to aprs-is gateway and decode data for archive and map by OE5DXL */ +typedef uint32_t aprsdecode_SET256[8]; + +#define aprsdecode_CR "\015" + +#define aprsdecode_LF "\012" + +#define aprsdecode_DEGSYM "\177" + +#define aprsdecode_DELETSYM "\001" + +#define aprsdecode_WXNIL 1.E+6 + +#define aprsdecode_MSGSIZE 67 + +#define aprsdecode_ACKSIZE 5 + +#define aprsdecode_REPLYACK "}" + +#define aprsdecode_UDPSOCKS 4 + +#define aprsdecode_DESTCALL "APLM01" + +#define aprsdecode_SHOWTEMPWIND 3600 +/* till seconds after last wx info show temp or windvane */ + +#define aprsdecode_MAXTEMP 99 +/* ignore out of range temps */ + +#define aprsdecode_MINTEMP (-99) +/* ignore out of range temps */ + +#define aprsdecode_IGATEMAXDELAY 5 +/* seconds to discard igate frames if mainloop is too slow */ + +#define aprsdecode_BEGINOFTIME 1388534400 +/* oldest possible log date */ + +#define aprsdecode_MAXMULTILINES 40 +/* AE5PL limits to 23 multiline elements */ + +extern aprsdecode_SET256 aprsdecode_SYMTABLE; + +#define aprsdecode_VERS "aprsmap(cu) 0.66" + +typedef char aprsdecode_MONCALL[9]; + +typedef char aprsdecode_FRAMEBUF[512]; + +typedef char aprsdecode_WWWB[1401]; + +typedef char aprsdecode_FILENAME[1024]; + +struct aprsdecode_POSCALL; + + +struct aprsdecode_POSCALL { + aprsdecode_MONCALL call; + char typ; + struct aprspos_POSITION pos; +}; + +struct aprsdecode_WWWBUF; + +typedef struct aprsdecode_WWWBUF * aprsdecode_pWWWBUF; + + +struct aprsdecode_WWWBUF { + aprsdecode_WWWB buf; + int32_t tlen; + char push; + aprsdecode_pWWWBUF next; +}; + +struct aprsdecode_QWatch; + + +struct aprsdecode_QWatch { + uint32_t lasttb; + int32_t qsize; + int32_t lastqb; + int32_t txbyte[60]; +}; + +struct aprsdecode_TCPSOCK; + +typedef struct aprsdecode_TCPSOCK * aprsdecode_pTCPSOCK; + + +struct aprsdecode_TCPSOCK { + aprsdecode_pTCPSOCK next; + int32_t fd; + uint32_t watchtime; + uint32_t beacont; + uint32_t connt; + uint32_t gatepri; + char ipnum[64]; + char port[6]; + struct aprsdecode_POSCALL user; + uint32_t txframes; + uint32_t txbytes; + uint32_t rxframes; + uint32_t rxbytes; + int32_t rpos; + int32_t tlen; + aprsdecode_FRAMEBUF rbuf; + aprsdecode_FRAMEBUF tbuf; + struct aprsdecode_QWatch qwatch; + uint8_t waitpong; + uint32_t lastpong; + uint32_t lastping; + uint32_t windoofwatch; +}; + +typedef uint32_t aprsdecode_DUPETIMES[65536]; + +struct aprsdecode_UDPSOCK; + + +struct aprsdecode_UDPSOCK { + int32_t fd; + char rawread; + char checkip; + uint32_t ip; + uint32_t bindport; + uint32_t dport; + int32_t chan; /* channel number 1.. */ + uint32_t lastudprx; + uint32_t lastudptx; + uint32_t starttime; + uint32_t bpstime; + uint32_t rxframes; + uint32_t rxbytes; + uint32_t txframes; + uint32_t txbytes; /* for tx bit/s limiter */ + uint32_t uip; + uint32_t * pdupetimes; +}; + +typedef char aprsdecode_MSGTEXT[67]; + +typedef char aprsdecode_ACKTEXT[5]; + +typedef char aprsdecode_ACKREPTEXT[2]; + +enum aprsdecode_ERRFLAGS {aprsdecode_eDIST, aprsdecode_eSPIKE, + aprsdecode_eSYMB, aprsdecode_eDUPE, aprsdecode_eSPEED, + aprsdecode_eNODRAW, aprsdecode_eNOPOS}; + + +typedef uint8_t aprsdecode_ERRSET; + +enum aprsdecode_DRAWHINTS {aprsdecode_MIRRORSYM, aprsdecode_ISOBJECT, + aprsdecode_HIDE, aprsdecode_MARKED, aprsdecode_MOVES}; + + +typedef uint8_t aprsdecode_sDRAWHINTS; + +struct aprsdecode_SYMBOL; + + +struct aprsdecode_SYMBOL { + char tab; + char pic; +}; + +struct aprsdecode_AREASYMB; + + +struct aprsdecode_AREASYMB { + char typ; + uint8_t color; + struct aprspos_POSITION dpos; +}; + +struct aprsdecode_FRAMEHIST; + +typedef struct aprsdecode_FRAMEHIST * aprsdecode_pFRAMEHIST; + +struct aprsdecode_VARDAT; + +typedef struct aprsdecode_VARDAT * aprsdecode_pVARDAT; + + +struct aprsdecode_FRAMEHIST { + aprsdecode_pFRAMEHIST next; + uint32_t time0; + aprsdecode_pVARDAT vardat; + uint8_t nodraw; +}; + + +struct aprsdecode_VARDAT { + aprsdecode_pFRAMEHIST lastref; + struct aprspos_POSITION pos; + uint32_t refcnt; /* starts at 0 */ + /* altitude :INT16;*/ + uint8_t igatepos; + uint8_t igatelen; + char raw[500]; /* last part allocatet with real size */ +}; + +struct aprsdecode_OPHIST; + +typedef struct aprsdecode_OPHIST * aprsdecode_pOPHIST; + + +struct aprsdecode_OPHIST { + aprsdecode_pOPHIST next; + aprsdecode_pFRAMEHIST frames; + struct aprspos_POSITION margin0; /* movement frame for quick draw */ + struct aprspos_POSITION margin1; + struct aprspos_POSITION lastpos; + uint32_t lasttime; + uint32_t temptime; + short lastkmh; /* drive kmh, wx kmh */ + short lasttempalt; /* drive altitude, wx temp */ + float framerate; /* thruput frames/s */ + aprsdecode_MONCALL call; + struct aprsdecode_SYMBOL sym; + uint8_t drawhints; + signed char trackcol; + signed char textpos; + signed char valuepos; + uint8_t lastinftyp; /*0 no inf, 10..99 drive dir, 100 wx no dir 110..199 wind dir*/ + char lastrxport; /* for msg routing, in future remove if port is seen in rawframes */ + struct aprsdecode_AREASYMB areasymb; /* area object data */ + char poligon; +}; + +enum aprsdecode_STORM {aprsdecode_WXNOWX, aprsdecode_WXNORMAL, + aprsdecode_WXTS, aprsdecode_WXHC, aprsdecode_WXTD}; + + +struct aprsdecode_WX; + + +struct aprsdecode_WX { + float gust; + float temp; + float hygro; + float baro; + float rain1; + float rain24; + float raintoday; + float lum; + float sievert; + uint8_t storm; + float sustaind; + float radiushurr; + float radiusstorm; + float wholegale; +}; + +enum aprsdecode_TYPES {aprsdecode_UNKNOWN, aprsdecode_MICE, aprsdecode_POS, + aprsdecode_WETH, aprsdecode_PWETH, aprsdecode_MSG, + aprsdecode_OBJ, aprsdecode_ITEM, aprsdecode_SCAP, + aprsdecode_STAT, aprsdecode_TELE, aprsdecode_QUERY}; + + +typedef uint16_t aprsdecode_TYPSET; + +enum aprsdecode_ACKREJ {aprsdecode_MSGMSG, aprsdecode_MSGACK, + aprsdecode_MSGREJ}; + + +struct aprsdecode_HRTPOS; + + +struct aprsdecode_HRTPOS { + float dlong; + float dlat; + float dalt; + uint32_t dtime; + char notinterpolated; +}; + +struct aprsdecode_MULTILINE; + + +struct aprsdecode_MULTILINE { + uint32_t size; + char linetyp; + char filltyp; + struct aprspos_POSITION vec[41]; +}; + +typedef uint16_t aprsdecode_TELEMETRY[7]; + +struct aprsdecode_DAT; + + +struct aprsdecode_DAT { + aprsdecode_MONCALL srcall; + aprsdecode_MONCALL symcall; + aprsdecode_MONCALL dstcall; + aprsdecode_MONCALL viacalls[10]; + aprsdecode_MONCALL msgto; + aprsdecode_MONCALL objectfrom; + uint32_t hbitp; + uint32_t igaterawp; + uint32_t igatelen; + uint32_t igatep; + uint32_t payload; + char postyp; + char typc; + struct aprsdecode_AREASYMB areasymb; + struct aprspos_POSITION pos; + uint32_t speed; + uint32_t course; + int32_t altitude; + char sym; + char symt; + char timestamp; + char objkill; + char lastrxport; + struct aprsdecode_WX wx; + uint8_t type; + float moved; + /* + stack : CARDINAL; + */ + aprsdecode_MSGTEXT msgtext; + aprsdecode_ACKTEXT acktext; + uint8_t ackrej; + struct aprsdecode_HRTPOS hrtposes[32]; + uint32_t hrtlen; + uint32_t hrttime; /* if non zero is hrt defined */ + struct aprsdecode_MULTILINE multiline; + aprsdecode_TELEMETRY tlmvalues; + /* 5 analog and if all 5 valid the sixth is bitset, 0 undef, + incremented by 1 */ + char comment0[256]; +}; + +enum aprsdecode_WXSET {aprsdecode_wTEMP, aprsdecode_wBARO, aprsdecode_wHYG, + aprsdecode_wWIND, aprsdecode_wWINDDIR, aprsdecode_wRAIN, + aprsdecode_wLUMI, aprsdecode_wSHIST, aprsdecode_wBHIST, + aprsdecode_wAHIST, aprsdecode_wSIEV}; + + +typedef uint16_t aprsdecode_sWXSET; + +enum aprsdecode_CLICKTYPS {aprsdecode_tTEXT, aprsdecode_tTRACK, + aprsdecode_tSYMBOL, aprsdecode_tMAP, aprsdecode_tOBJECT, + aprsdecode_tOBJECTTEXT, aprsdecode_tRFPATH, + aprsdecode_tKMHOBJ, aprsdecode_tKMH, + aprsdecode_tDEGREE, aprsdecode_tDEGREEOBJ, aprsdecode_tMETEOCOLOR}; + + +struct aprsdecode_TXMESSAGE; + +typedef struct aprsdecode_TXMESSAGE * aprsdecode_pTXMESSAGE; + + +struct aprsdecode_TXMESSAGE { + aprsdecode_pTXMESSAGE next; + uint32_t txtime; + uint32_t acktime; + uint32_t txcnt; + char port; + aprsdecode_MONCALL to; + aprsdecode_MSGTEXT msgtext; + uint32_t acknum; + char heard; + char rej; +}; + +struct aprsdecode_MSGFIFO; + +typedef struct aprsdecode_MSGFIFO * aprsdecode_pMSGFIFO; + + +struct aprsdecode_MSGFIFO { + aprsdecode_pMSGFIFO next; + uint32_t time0; + char port; + aprsdecode_MONCALL itemname; + aprsdecode_MONCALL from; + aprsdecode_MONCALL to; + aprsdecode_MSGTEXT txt; + aprsdecode_ACKTEXT ack; + char query; + char deleteitem; + struct aprspos_POSITION itempos; +}; + +struct aprsdecode_ZOOMFRAME; + + +struct aprsdecode_ZOOMFRAME { + int32_t x0; + int32_t y00; + int32_t x1; + int32_t y1; +}; + +struct aprsdecode_COLTYP; + + +struct aprsdecode_COLTYP { + uint32_t r; + uint32_t g; + uint32_t b; +}; + +struct aprsdecode_MOUNTAIN; + +typedef struct aprsdecode_MOUNTAIN * aprsdecode_pMOUNTAIN; + + +struct aprsdecode_MOUNTAIN { + aprsdecode_pMOUNTAIN next; + struct aprspos_POSITION pos; + short alt; + char name[32]; +}; + +struct aprsdecode_CLICKOBJECT; + + +struct aprsdecode_CLICKOBJECT { + aprsdecode_pOPHIST opf; + aprsdecode_pFRAMEHIST pff; + aprsdecode_pFRAMEHIST pff0; + uint8_t typf; +}; + +typedef char aprsdecode_MAPNAME[41]; + +typedef uint32_t aprsdecode_SYMBOLSET[6]; + +extern uint32_t aprsdecode_systime; + +extern uint32_t aprsdecode_realtime; + +extern uint32_t aprsdecode_lastlooped; + +extern uint32_t aprsdecode_rxidle; + +extern char aprsdecode_quit; + +extern char aprsdecode_verb; + +struct aprsdecode__D0; + + +struct aprsdecode__D0 { + char dryrun; + char withradio; + char chkmaps; + char panorama; + char altimap; + char watchmhop; + char lastpoi; + char insreplaceline; + char watchlast; + int32_t x; + int32_t y; + int32_t min0; + aprsdecode_MONCALL mhop; + struct aprsdecode_SYMBOL onesymbol; + aprsdecode_SYMBOLSET onesymbolset; + aprsdecode_pOPHIST ops; + aprsdecode_pFRAMEHIST pf; + aprsdecode_pFRAMEHIST pf0; + int32_t zoomtox; + int32_t zoomtoy; + uint8_t typ; + char cmd; + char cmdatt; + struct aprspos_POSITION pullpos; + struct aprspos_POSITION clickpos; + struct aprspos_POSITION squerpos0; + struct aprspos_POSITION squerpos1; + struct aprspos_POSITION measurepos; + struct aprspos_POSITION markpos; + uint32_t markpost; /* waypoint time to markpos to make uniqe */ + uint32_t marktime; /* delete marker if no set by set marker */ + int32_t markalti; /* for geoprofile */ + struct aprspos_POSITION sumpos; /* store last clickpos for waysum */ + float waysum; /* sum up marker set distances */ + uint16_t graphset; /* update graphs if marked last waypoint */ + uint32_t selected; + uint32_t entries; + struct aprspos_POSITION bubblpos; /* found position of POI */ + char bubblstr[50]; /* found text of POI */ + struct aprsdecode_CLICKOBJECT table[10]; + uint32_t polilinecursor; /* edit which edge of polinine object */ +}; + +extern struct aprsdecode__D0 aprsdecode_click; + +extern struct aprspos_POSITION aprsdecode_mappos; + +extern int32_t aprsdecode_inittilex; + +extern int32_t aprsdecode_inittiley; + +extern int32_t aprsdecode_initxsize; + +extern int32_t aprsdecode_initysize; + +extern int32_t aprsdecode_parmzoom; + +extern int32_t aprsdecode_initzoom; + +extern float aprsdecode_finezoom; + +extern float aprsdecode_parmfinezoom; + +extern char aprsdecode_mapdir[1025]; + +extern aprsdecode_pMOUNTAIN aprsdecode_mountains; + +struct aprsdecode__D1; + + +struct aprsdecode__D1 { + char moving; + char moded; + char errorstep; + char logmode; + char headmenuy; + aprsdecode_MAPNAME mapname; + char configfn[257]; + int32_t maplumcorr; + int32_t map; + int32_t rf; + int32_t rfbri; + int32_t track; + int32_t waypoint; + int32_t sym; + int32_t obj; + int32_t text; + int32_t nomov; + int32_t centering; + int32_t fps; + int32_t actfps; + uint32_t fontysize; + char wxcol; + uint32_t movestep; + uint32_t dupemaxtime; + uint32_t kmhtime; + uint32_t purgetime; + uint32_t purgetimeobj; + uint32_t firstdim; + uint32_t maxdim; + float gamma; + char menutransp; + struct aprsdecode_COLTYP menubackcol; + struct aprsdecode_COLTYP menucol; +}; + +extern struct aprsdecode__D1 aprsdecode_lums; + +struct aprsdecode__D2; + + +struct aprsdecode__D2 { + struct aprspos_POSITION winpos0; + struct aprspos_POSITION winpos1; + aprsdecode_MONCALL call; + uint32_t winevent; + char follow; + char beep; +}; + +extern struct aprsdecode__D2 aprsdecode_tracenew; + +extern aprsdecode_pTXMESSAGE aprsdecode_txmessages; + +extern aprsdecode_pMSGFIFO aprsdecode_msgfifo0; + +extern float aprsdecode_spikesens; + +extern float aprsdecode_maxhop; + +extern aprsdecode_pOPHIST aprsdecode_ophist2; + +extern aprsdecode_pOPHIST aprsdecode_ophist0; + +struct aprsdecode__D3; + + +struct aprsdecode__D3 { + char url[256]; + char port[6]; + char filterst[256]; +}; +/* + servercall : MONCALL; +*/ + +extern struct aprsdecode__D3 aprsdecode_gateways[10]; + +extern aprsdecode_pTCPSOCK aprsdecode_tcpsocks; + +extern struct aprsdecode_UDPSOCK aprsdecode_udpsocks0[4]; + +extern uint32_t aprsdecode_lasttcptx; + +extern uint32_t aprsdecode_lastanyudprx; + +extern uint32_t aprsdecode_lastpurge; + +extern uint32_t aprsdecode_lasttcprx; + +extern aprsdecode_FRAMEBUF aprsdecode_testbeaconbuf; + /* fill with port:time:beacon then sent once */ + +extern struct xosi_PROCESSHANDLE aprsdecode_serialpid; + +extern struct xosi_PROCESSHANDLE aprsdecode_serialpid2; + +extern struct xosi_PROCESSHANDLE aprsdecode_maploadpid; + +extern int32_t aprsdecode_Decode(char [], uint32_t, + struct aprsdecode_DAT *); + +extern int32_t aprsdecode_Stoframe(aprsdecode_pOPHIST *, char [], + uint32_t, uint32_t, char, uint32_t *, + struct aprsdecode_DAT); + +extern void aprsdecode_Checktrack(aprsdecode_pOPHIST, aprsdecode_pFRAMEHIST); + +extern void aprsdecode_purge(aprsdecode_pOPHIST *, uint32_t, uint32_t); + +extern int32_t aprsdecode_knottokmh(int32_t); + +extern void aprsdecode_posinval(struct aprspos_POSITION *); + +extern uint32_t aprsdecode_trunc(float); + +extern float aprsdecode_floor(float); + +extern int32_t aprsdecode_tcpout(aprsdecode_pTCPSOCK); + +extern void aprsdecode_tcpin(aprsdecode_pTCPSOCK); + +extern void aprsdecode_udpin(uint32_t); + +extern void aprsdecode_tcpclose(aprsdecode_pTCPSOCK, char); + +extern void aprsdecode_tcpjobs(void); + +extern void aprsdecode_initparms(void); + +extern void aprsdecode_delwaypoint(aprsdecode_pOPHIST, + aprsdecode_pFRAMEHIST *); + +extern uint32_t aprsdecode_finddup(aprsdecode_pFRAMEHIST, + aprsdecode_pFRAMEHIST); + +extern void aprsdecode_savetrack(void); + +extern void aprsdecode_makemsg(char); + +extern void aprsdecode_deltxmsg(uint32_t, uint32_t); + +extern void aprsdecode_acknumstr(char [], uint32_t, uint32_t); + +extern void aprsdecode_getactack(aprsdecode_MONCALL, char [], + uint32_t); + +extern void aprsdecode_objsender(aprsdecode_pOPHIST, char [], + uint32_t); + +extern aprsdecode_pOPHIST aprsdecode_selop(void); + +extern void aprsdecode_tcpconnstat(char [], uint32_t); + +extern void aprsdecode_udpconnstat(uint32_t, char [], uint32_t); + +extern void aprsdecode_beeplim(int32_t, uint32_t, uint32_t); + +extern void aprsdecode_importbeacon(void); + +extern void aprsdecode_extractbeacon(char [], uint32_t, char, + char); + +extern void aprsdecode_getbeaconname(char [], uint32_t, char [], + uint32_t, char [], uint32_t, char *, + char *, char *); + +extern void aprsdecode_drawbeacon(char [], uint32_t); + +extern void aprsdecode_makelogfn(char [], uint32_t); +/* +PROCEDURE checksymb(symt, symb:CHAR):BOOLEAN; + (* true for bad symbol *) +*/ + +extern void aprsdecode_appendmultiline(struct aprspos_POSITION); + +extern void aprsdecode_GetMultiline(char [], uint32_t, uint32_t *, + struct aprsdecode_MULTILINE *); + +extern char aprsdecode_ismultiline(char); + +extern void aprsdecode_modmultiline(uint32_t); + + +extern void aprsdecode_BEGIN(void); + + +#endif /* aprsdecode_H_ */ diff --git a/src/aprsmap.c b/src/aprsmap.c new file mode 100644 index 0000000..de16cd2 --- /dev/null +++ b/src/aprsmap.c @@ -0,0 +1,5360 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define aprsmap_C_ +#ifndef useri_H_ +#include "useri.h" +#endif +#ifndef maptool_H_ +#include "maptool.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif +#ifndef xosi_H_ +#include "xosi.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef aprstext_H_ +#include "aprstext.h" +#endif +#include + +/* aprs tracks on osm map by oe5dxl */ +#define aprsmap_MINLIG 60 + +#define aprsmap_MAXZOOMOBJ 14 + +#define aprsmap_MAXCOLORS 10 + +#define aprsmap_MINCOLOR 48 + +#define aprsmap_MAPGETTIMEOUT 30 + +#define aprsmap_HISTSIZE 20 + +#define aprsmap_VIDEOFN "map.y4m" + +#define aprsmap_FLOATERRCORR (-6.E-7) +/* try to correct summed rounding errors by multiple zoom in */ + +#define aprsmap_VIDEORATE 25 + +#define aprsmap_MARKERTIME 10 +/* marker life time for unimportant marker settings */ + +#define aprsmap_NOSYMT "/" +/* show this symbol if user has none */ + +#define aprsmap_NOSYMB "/" + +enum MHOPS {aprsmap_OPHEARD, aprsmap_OPSENT, aprsmap_OPOBJ}; + + +struct VIEW; + + +struct VIEW { + struct aprspos_POSITION pos; + float zoom; + aprsdecode_MONCALL mhop; + struct aprsdecode_SYMBOL onesymbol; + aprsdecode_SYMBOLSET onesymbolset; + int32_t rf; + uint8_t mhtxv; + char wxcol; + int32_t lumtrack; + int32_t lumwaypoint; + int32_t lummap; + int32_t lumsym; + int32_t lumobj; + int32_t lumtext; + aprsdecode_MAPNAME mapname; + /* altimap, */ + char focus; +}; + +struct TABS; + + +struct TABS { + uint32_t stkpo; + uint32_t stktop; + struct VIEW posstk[20]; +}; + +static char logdone; + +static maptool_pIMAGE image; + +static maptool_pIMAGE rfimg; + +static char withx; + +static uint32_t lastxupdate; + +static uint32_t maptime; + +static uint32_t laststatref; + +static uint32_t realday; + +static uint32_t cycleorder; + +static uint32_t maptrys; + +static uint32_t uptime; + +static struct aprspos_POSITION newpos0; + +static struct aprspos_POSITION newpos1; +/* squerpos: RECORD pos0, pos1:POSITION END; */ + +static int32_t videofd; + +static char gammatab[1024]; + +static uint8_t mhtx; + +static char pandone; + +static char onetipp; + +static struct TABS tabview; + +static struct TABS alttabview; + +static char * vidbuf; + +static char mestxt[201]; + +struct _0; + + +struct _0 { + char wasaltimap; + char wasradio; + struct aprspos_POSITION markpos; + struct aprspos_POSITION measurepos; + struct aprspos_POSITION mappos; + int32_t initzoom; + float finezoom; + int32_t ant1; + int32_t ant2; + int32_t ant3; + int32_t bri; + int32_t contr; + int32_t qual; + struct aprsdecode_COLTYP c1; + struct aprsdecode_COLTYP c2; +}; + +static struct _0 radio; + +static struct aprspos_POSITION clickwatchpos; + + +static void Error(char text0[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text0,text_len); + osi_WrStr(text0, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text0); +} /* end Error() */ + + +static float sqr(float x) +{ + return x*x; +} /* end sqr() */ + +#define aprsmap_GAMMA 4.5454545454545E-1 + + +static uint32_t gammac(uint32_t c) +{ + if (c==0UL) return 0UL; + if (c<1024UL) { + return aprsdecode_trunc(osic_exp(osic_ln(X2C_DIVR((float)c, + 1024.0f))*4.5454545454545E-1f)*255.5f); + } + return 255UL; +} /* end gammac() */ + + +static void makegammatab(void) +{ + uint32_t i; + for (i = 0UL; i<=1023UL; i++) { + gammatab[i] = (char)gammac(i); + } /* end for */ +} /* end makegammatab() */ + + +static void tooltips(char typ) +{ + char s[21]; + struct aprspos_POSITION pos; + if (typ==' ') { + if (aprsdecode_initzoom<=1L && uptime+2UL==aprsdecode_realtime) { + useri_starthint(10005UL, 1); + } + } + else if (typ=='n') { + if (useri_configon(useri_fCONNECT) && uptime+60UL>aprsdecode_realtime) { + useri_confstr(useri_fSERVERFILT, s, 21ul); + if (X2C_CAP(s[0U])=='M' && !(aprstext_getmypos(&pos) + && useri_configon(useri_fALLOWNETTX))) { + useri_starthint(10007UL, 1); + } + else useri_starthint(10006UL, 1); + } + } + else if (typ=='m') { + if (uptime+180UL>aprsdecode_realtime) useri_starthint(10010UL, 1); + } + else if (typ=='b') { + if (!onetipp) useri_starthint(10015UL, 1); + onetipp = 1; + } + else if (typ=='B') { + if (!onetipp) useri_starthint(10016UL, 1); + onetipp = 1; + } +} /* end tooltips() */ + + +static void mapbri(int32_t v) +{ + char h[100]; + char s[100]; + v += (int32_t)((uint32_t)aprsdecode_lums.map/10UL); + if (v<0L) v = 0L; + else if (v>100L) v = 100L; + aprsdecode_lums.map = v*10L; + useri_int2cfg(useri_fLMAP, v); + strncpy(s,"Brightness Map ",100u); + aprsstr_IntToStr(v, 1UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "%", 2ul); + useri_say(s, 100ul, 4UL, 'b'); +} /* end mapbri() */ + + +static void fullbritime(char down) +{ + char h[100]; + char s[100]; + uint32_t n; + uint32_t d; + d = 1800UL; + if (aprsdecode_lums.firstdim<900UL) d = 60UL; + else if (aprsdecode_lums.firstdim<3600UL) d = 300UL; + else if (aprsdecode_lums.firstdim<10800UL) d = 900UL; + n = aprsdecode_lums.firstdim/d; + if (down) { + if (n>1UL) --n; + } + else ++n; + aprsdecode_lums.firstdim = n*d; + if (aprsdecode_lums.firstdim>aprsdecode_lums.purgetime) { + aprsdecode_lums.firstdim = aprsdecode_lums.purgetime; + } + useri_int2cfg(useri_fTFULL, (int32_t)(aprsdecode_lums.firstdim/60UL)); + strncpy(s,"Fullbright Time ",100u); + aprsstr_IntToStr((int32_t)(aprsdecode_lums.firstdim/60UL), 1UL, h, + 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "Min", 4ul); + useri_say(s, 100ul, 4UL, 'b'); +} /* end fullbritime() */ + + +static float movest(uint32_t width) +{ + return osic_power(2.0f, -maptool_realzoom(aprsdecode_initzoom, + aprsdecode_finezoom))*(float)width*(float) + aprsdecode_lums.movestep*0.0002f; +} /* end movest() */ + + +static float shiftfine(void) +{ + float s; + if (xosi_Shift) s = 0.1f; + else s = 1.0f; + if (useri_configon(useri_fINVMOV)) s = -s; + return s; +} /* end shiftfine() */ + +static uint32_t aprsmap_MON[13] = {0UL,0UL,31UL,59UL,90UL,120UL,151UL, + 181UL,212UL,243UL,273UL,304UL,334UL}; + +static uint32_t _cnst[13] = {0UL,0UL,31UL,59UL,90UL,120UL,151UL,181UL, + 212UL,243UL,273UL,304UL,334UL}; + +static char rdlogdate(const char s[], uint32_t s_len, + uint32_t * t, uint32_t * p) +/* 20130526:235959 */ +{ + uint32_t i; + uint32_t y; + uint32_t d; + char c; + char dt; /* second since 1970 or yyyymmdd:hhmmss */ + dt = s[8UL]==':'; + i = 0UL; + d = 0UL; + for (;;) { + c = s[i]; + if ((uint8_t)c<'0' || (uint8_t)c>'9') break; + d = (d*10UL+(uint32_t)(uint8_t)c)-48UL; + ++i; + if (dt) { + if (i==4UL) { + /* year */ + if (d<1970UL || d>2100UL) return 0; + *t = (d-1970UL)*365UL+(d-1969UL)/4UL; /* days since 1970 */ + y = d; + d = 0UL; + } + else if (i==6UL) { + /* month */ + if (d>12UL) return 0; + *t += _cnst[d]; + if ((y&3UL)==0UL && d>2UL) ++*t; + d = 0UL; + } + else if (i==8UL) { + /* day */ + if (d<=0UL) return 0; + *t = ((*t+d)-1UL)*86400UL; + ++i; + d = 0UL; + } + else if (i==11UL) { + *t += d*3600UL; + d = 0UL; + } + else if (i==13UL) { + *t += d*60UL; + d = 0UL; + } + else { + if (i==15UL) { + *t += d; + break; + } + if (i>15UL) return 0; + } + } + } + if (!dt) *t = d; + *p = i; + return 1; +} /* end rdlogdate() */ + + +static char cmpcall(const char a[], uint32_t a_len, + uint32_t i, const char b[], uint32_t b_len) +{ + uint32_t j; + j = 0UL; + do { + if (a[i]!=b[j]) return 0; + ++i; + ++j; + } while (b[j]); + return a[i]=='>'; +} /* end cmpcall() */ + +#define aprsmap_MINSTEP 5000 +/* stop binary search */ + +#define aprsmap_SEEKBUF 1024 +/* buffer size while binary search */ + +#define aprsmap_RETR 200 +/* if unsort file break binary search */ + + +static void binseek(uint32_t * i, int32_t fc, uint32_t * wp, + uint32_t time0, char bof, uint32_t * first, + uint32_t * last) +{ + int32_t seekstep; + int32_t len; + int32_t rp; + char sb[1024]; + aprsdecode_FRAMEBUF mbuf; + uint32_t retry; + uint32_t lfc; + uint32_t ftime; + retry = 0UL; + *first = 0UL; + *last = 0UL; + seekstep = 1073741823L; + for (;;) { + len = 0L; + rp = 0L; + *wp = 0UL; + if (bof) lfc = 2UL; + else lfc = 0UL; + bof = 0; + for (;;) { + if (rp>=len) { + len = osi_RdBin(fc, (char *)sb, 1024u/1u, 1024UL); + rp = 0L; + } + if (len<=0L) { + lfc = 0UL; + break; + } + mbuf[*wp] = sb[rp]; + if (mbuf[*wp]=='\012') { + mbuf[*wp] = 0; + *wp = 0UL; + ++lfc; + if (lfc>=2UL) break; + } + else if (*wp<510UL) ++*wp; + else { + *wp = 0UL; + lfc = 0UL; + } + ++rp; + } + if (lfc>=2UL && rdlogdate(mbuf, 512ul, &ftime, i)) { + /* we are in file */ + if (*first==0UL) { + *first = ftime; + if (time0<*first) { + time0 = 0UL; + break; + } + } + if (ftime>*last) *last = ftime; + } + else ftime = X2C_max_longcard; + if (ftime=0L && seekstep<5000L || retry>=200UL) break; + osic_Seekcur(fc, seekstep-1024L); + ++retry; + } + if (time0<=*first) osic_Seek(fc, 0UL); + else if (retry>=200UL) { + osic_Seek(fc, 0UL); + useri_say("unsort logfile, trying linear search", 37ul, 180UL, 'r'); + } + else { + /* WrStrLn("unsort logfile, trying linear search"); */ + osic_Seekcur(fc, -6024L); /* set back for safety */ + } +} /* end binseek() */ + + +static void rdlonglog(aprsdecode_pOPHIST * optab, char fn[], + uint32_t fn_len, uint32_t from, uint32_t to, + uint32_t * firstread, uint32_t * lastread, + int32_t * lines) +{ + int32_t fc; + int32_t ret; + int32_t len; + int32_t rp; + char ib[32768]; + uint32_t j; + uint32_t i; + uint32_t wp; + aprsdecode_FRAMEBUF mbuf; + uint32_t ot; + uint32_t end; + uint32_t start; + aprsdecode_pOPHIST op; + struct aprsdecode_DAT dat; + uint32_t lfc; + X2C_PCOPY((void **)&fn,fn_len); + *lines = 0L; + aprsstr_cleanfilename(fn, fn_len); + if (fn[0UL]==0) goto label; + fc = osi_OpenReadLong(fn, fn_len); + if (!osic_FdValid(fc)) goto label; + *firstread = 0UL; + *lastread = 0UL; + end = 0UL; + if (from>0UL) { + binseek(&i, fc, &wp, from, 1, &start, &end); + if (from>end) from = end; + if (from=len) { + len = osi_RdBin(fc, (char *)ib, 32768u/1u, 32768UL); + if (len<=0L) break; + rp = 0L; + } + mbuf[wp] = ib[rp]; + if (mbuf[wp]=='\012') { + ++lfc; + mbuf[wp] = 0; + if ((lfc>=2UL && rdlogdate(mbuf, 512ul, &start, + &i)) && start>=from) { + if (*firstread==0UL) *firstread = start; + if (from=to) break; + /* systime:=start; */ + ++i; + j = 0UL; + do { + mbuf[j] = mbuf[i]; + ++j; + ++i; + } while (!(i>=511UL || mbuf[i]==0)); + mbuf[j] = 0; + if (aprsdecode_Decode(mbuf, 512ul, &dat)>=0L) { + aprsdecode_systime = *lastread; + ret = aprsdecode_Stoframe(optab, mbuf, 512ul, start, 1, &ot, + dat); + ++*lines; + if (*firstread==0UL) *firstread = start; + *lastread = start; + } + } + wp = 0UL; + } + else if (wp<510UL) ++wp; + ++rp; + } + osic_Close(fc); + op = *optab; + while (op) { + aprsdecode_Checktrack(op, 0); + op = op->next; + } + label:; + X2C_PFREE(fn); +} /* end rdlonglog() */ + + +static void rdlog(aprsdecode_pOPHIST * optab, char fn[], + uint32_t fn_len, uint32_t from, uint32_t to, + char find0[], uint32_t find_len, + uint32_t * firstread, uint32_t * lastread, + int32_t * lines) +{ + int32_t fc; + int32_t ret; + int32_t len; + int32_t rp; + char ib[32768]; + char s[100]; + uint32_t j; + uint32_t i; + uint32_t wp; + aprsdecode_FRAMEBUF mbuf; + aprsdecode_pOPHIST op; + struct aprsdecode_DAT dat; + uint32_t ot; + uint32_t start; + uint32_t t; + aprsdecode_FILENAME fnd; + aprsdecode_FILENAME fnn; + char fo; + X2C_PCOPY((void **)&fn,fn_len); + X2C_PCOPY((void **)&find0,find_len); + *firstread = 0UL; + *lastread = 0UL; + *lines = -1L; /* file not found */ + aprsstr_cleanfilename(fn, fn_len); + if (fn[0UL]==0) goto label; + aprsstr_Assign(fnn, 1024ul, fn, fn_len); /* check if dayly log */ + memcpy(fnd,fnn,1024u); + aprstext_logfndate(from, fnd, 1024ul); + if (X2C_STRCMP(fnd,1024u,fnn,1024u)==0) { + if (find0[0UL]) { + useri_textautosize(0L, 0L, 5UL, 6UL, 'e', "\012Call search only in d\ +ayly-Log Mode\012", 37ul); + } + rdlonglog(optab, fn, fn_len, from, to, firstread, lastread, lines); + /* single log file mode */ + goto label; + } + /*WrInt(to-from, 10); WrStrLn(fnd); */ + find0[find_len-1] = 0; + len = 0L; + rp = 0L; + wp = 0UL; + t = from; + aprsstr_Assign(fnn, 1024ul, fn, fn_len); + fo = 0; + for (;;) { + while (rp>=len) { + if (len<32768L) { + do { + if (t>to) goto loop_exit; + memcpy(fnd,fnn,1024u); + aprstext_logfndate(t, fnd, 1024ul); + t = (t/86400UL+1UL)*86400UL; + if (fo) osic_Close(fc); + fc = osi_OpenRead(fnd, 1024ul); + } while (!osic_FdValid(fc)); + fo = 1; + if (*lines<0L) *lines = 0L; + } + useri_say(fnd, 1024ul, 0UL, 'b'); + len = osi_RdBin(fc, (char *)ib, 32768u/1u, 32768UL); + rp = 0L; + } + mbuf[wp] = ib[rp]; + if (mbuf[wp]=='\012') { + mbuf[wp] = 0; + if (rdlogdate(mbuf, 512ul, &start, &i) && start>=from) { + if (find0[0UL]==0 || cmpcall(mbuf, 512ul, i+1UL, find0, + find_len)) { + if (start>=to) break; + ++i; + j = 0UL; + do { + mbuf[j] = mbuf[i]; + ++j; + ++i; + } while (!(i>=511UL || mbuf[i]==0)); + mbuf[j] = 0; + if (aprsdecode_Decode(mbuf, 512ul, &dat)>=0L) { + aprsdecode_systime = *lastread; + ret = aprsdecode_Stoframe(optab, mbuf, 512ul, start, 1, + &ot, dat); + ++*lines; + if ( *lines%500L==0L && aprsdecode_realtime+2ULnext; + } + } + label:; + X2C_PFREE(fn); + X2C_PFREE(find0); +} /* end rdlog() */ + + +static char moving(aprsdecode_pOPHIST op) +{ + struct aprsdecode_OPHIST * anonym; + { /* with */ + struct aprsdecode_OPHIST * anonym = op; + return !aprsdecode_lums.moving || ((anonym->lastinftyp>0U && anonym->lastinftyp<100U) + && anonym->lastkmh>0) + && aprsdecode_systimelasttime+aprsdecode_lums.kmhtime; + + } +} /* end moving() */ + + +static uint32_t fade(uint32_t t1, aprsdecode_pOPHIST op) +{ + uint32_t l; + uint32_t t0; + if (!moving(op)) return (uint32_t)aprsdecode_lums.nomov; + t0 = aprsdecode_systime-aprsdecode_lums.firstdim; + if (t0aprsdecode_lums.maxdim) t0 = aprsdecode_lums.maxdim; + if (aprsdecode_lums.maxdim>0UL) { + l = 60UL+(196UL*(aprsdecode_lums.maxdim-t0))/aprsdecode_lums.maxdim; + } + else l = 256UL; + return l; +} /* end fade() */ + +/* +PROCEDURE runaway(x0,y0,x1,y1:REAL); +BEGIN + IF (x0<0.0)<>(x1<0.0) THEN y0:=y0+(y1-y0)*x0/(x1-x0); x0:=0; + ELSIF (x0(x1(y1<0.0) THEN x0:=x0+(x1-x0)*y0/(y1-y0); y0:=0; + ELSIF (y0(y1trackcol; + if (c<48UL) { + pos = opn->lastpos; + cs = 0UL; + if (aprspos_posvalid(pos)) { + op = aprsdecode_ophist0; + while (op) { + if ((op->trackcol>=48 && op->trackcol<58) + && aprspos_distance(op->lastpos, pos)<50.0f) { + cs |= (1UL<trackcol-48); + } + op = op->next; + } + } + c = 0UL; + i = 0UL; + while (i<=8UL && opn->call[i]) { + c += (uint32_t)(uint8_t)opn->call[i]; + ++i; + } + c = c%10UL; /* checksum default color */ + if (X2C_IN(c,32,cs)) { + /* color in use */ + n = 0UL; + max1 = 0UL; + imax = 0UL; + for (i = 0UL; i<=9UL; i++) { + if (X2C_IN(i,32,cs)) n = 0UL; + else { + ++n; /* count free colors */ + if (n>max1) { + max1 = n; + imax = i; + } + } + } /* end for */ + if (max1>0UL) c = imax-max1/2UL; + } + c = c%10UL+48UL; + } + return c; +} /* end findfreecol() */ + + +static void changecolor(aprsdecode_pOPHIST op) +{ + if (op && op->trackcol>=48) op->trackcol = ((op->trackcol-48)+1)%11+48; +} /* end changecolor() */ + + +static char isvis(const uint8_t vismask) +{ + struct aprsdecode_OPHIST * anonym; + { /* with */ + struct aprsdecode_OPHIST * anonym = aprsdecode_click.ops; + return (((anonym->drawhints&vismask)!=0U && anonym->sym.tab!='\001') + && maptool_vistime(anonym->lasttime)) + && (aprsdecode_lums.wxcol==0 || anonym->lastinftyp>=100U && anonym->temptime+3600UL>aprsdecode_systime) + ; + } +} /* end isvis() */ + + +static char isdrivespeed(uint8_t inf) +{ + return inf>=10U && inf<100U; +} /* end isdrivespeed() */ + + +static char IsTrackObj(aprsdecode_pOPHIST op) +{ + aprsdecode_pFRAMEHIST f; + struct aprsdecode_DAT dat; + if ((0x2U & op->drawhints)==0 || isdrivespeed(op->lastinftyp)) return 1; + f = op->frames; + while (f) { + if (aprsdecode_Decode(f->vardat->raw, 500ul, + &dat)>=0L && (dat.speed>0UL && dat.speed0UL) + ) return 1; + /* draw track if has any speed or course */ + f = f->next; + } + return 0; +/* object with no speed or course */ +} /* end IsTrackObj() */ + +#define aprsmap_MAXDIST 5.E+5 + +#define aprsmap_MINWPDIST 9.0 +/* waypoints on tracks minimum distance */ + + +static void tracks(maptool_pIMAGE img, aprsdecode_pOPHIST op, + char highlight0, uint32_t tilltime) +{ + float y1; + float x1; + float y00; + float x0; + uint32_t ligw; + uint32_t lig; + struct aprspos_POSITION oldpos; + struct aprsdecode_COLTYP col; + signed char coln; + char otrk; + char nfilt; + struct aprsdecode_VARDAT * anonym; + aprsdecode_click.ops = op; + if (!highlight0) aprsdecode_click.typ = aprsdecode_tTRACK; + nfilt = !useri_configon(useri_fTRACKFILT); + otrk = useri_configon(useri_fOBJTRACK); + while (aprsdecode_click.ops) { + if ((((isvis(0x18U) && aprsdecode_click.ops->trackcol<58) + && aprsdecode_click.ops->areasymb.typ==0) + && !aprsdecode_click.ops->poligon) + && (otrk || IsTrackObj(aprsdecode_click.ops))) { + /* make a random track color */ + coln = (signed char)findfreecol(aprsdecode_click.ops); + maptool_Colset(&col, (char)coln); + aprsdecode_click.pf0 = 0; + aprsdecode_click.pf = aprsdecode_click.ops->frames; + aprsdecode_posinval(&oldpos); + while (aprsdecode_click.pf && aprsdecode_click.pf->time0<=tilltime) { + { /* with */ + struct aprsdecode_VARDAT * anonym = aprsdecode_click.pf->vardat; + + if (((nfilt || !(aprsdecode_click.pf->nodraw&~0x1U)) + && aprspos_posvalid(anonym->pos)) + && maptool_vistime(aprsdecode_click.pf->time0)) { + if (aprspos_posvalid(oldpos)) { + if (highlight0) lig = 700UL; + else { + lig = (fade(aprsdecode_click.pf->time0, + aprsdecode_click.ops)*600UL)/256UL; + } + if ((maptool_mapxy(oldpos, &x0, + &y00)>=-1L && maptool_mapxy(anonym->pos, &x1, + &y1)>=-1L) && sqr(x0-x1)+sqr(y00-y1)>=9.0f) { + /* collect short tracks to 1 */ + aprsdecode_click.ops->trackcol = coln; + ligw = (lig*(uint32_t)aprsdecode_lums.waypoint) + /1024UL; + lig = (lig*(uint32_t)aprsdecode_lums.track)/1024UL; + maptool_vector(img, x0, y00, x1, y1, + (int32_t)((lig*col.r)/256UL), + (int32_t)((lig*col.g)/256UL), + (int32_t)((lig*col.b)/256UL), 450UL, 0.0f); + if (!aprsdecode_click.dryrun) { + maptool_waypoint(img, x0, y00, 1.5f, + (int32_t)ligw, (int32_t)ligw, (int32_t)ligw); + } + oldpos = anonym->pos; + aprsdecode_click.pf0 = aprsdecode_click.pf; + } + else aprsdecode_click.pf0 = aprsdecode_click.pf; + } + else { + oldpos = anonym->pos; + aprsdecode_click.pf0 = aprsdecode_click.pf; + } + } + } + aprsdecode_click.pf = aprsdecode_click.pf->next; + } + aprsdecode_click.pf0 = 0; + if (highlight0) return; + } + aprsdecode_click.ops = aprsdecode_click.ops->next; + } +} /* end tracks() */ + + +static void stormcicle(maptool_pIMAGE image0, struct aprspos_POSITION center, + float hurr, float storm, float whole, + uint32_t lig) +{ + struct aprsdecode_AREASYMB asymb; + asymb.dpos.long0 = 0.0f; + if (hurr!=0.0f) { + asymb.typ = '5'; /* circle */ + asymb.color = 4U; + asymb.dpos.lat = hurr*2.5274112897407E-4f; + maptool_drawareasym(image0, center, asymb, lig); + } + if (storm!=0.0f) { + asymb.typ = '5'; /* circle */ + asymb.color = 1U; + asymb.dpos.lat = storm*2.5274112897407E-4f; + maptool_drawareasym(image0, center, asymb, lig); + } + if (whole!=0.0f) { + asymb.typ = '0'; /* circle */ + asymb.color = 0U; + asymb.dpos.lat = whole*2.5274112897407E-4f; + maptool_drawareasym(image0, center, asymb, lig); + } +} /* end stormcicle() */ + + +static void tolastframe(aprsdecode_pFRAMEHIST * pfm) +{ + if (*pfm==0) { + *pfm = aprsdecode_click.ops->frames; + if (*pfm) while ((*pfm)->next) *pfm = (*pfm)->next; + } +} /* end tolastframe() */ + +#define aprsmap_HOVERDIST 64 + + +static void symbols(aprsdecode_pOPHIST op, char objects, + char highlight0, + struct aprsdecode_CLICKOBJECT * hoverobj) +{ + float hovery; + float hoverx; + float hdmin; + float hd; + float y; + float x; + uint32_t lig; + struct aprsdecode_COLTYP col; + struct aprsdecode_DAT dat; + aprsdecode_pFRAMEHIST pfm; + aprsdecode_click.ops = op; + if (!highlight0) { + if (objects) aprsdecode_click.typ = aprsdecode_tOBJECT; + else aprsdecode_click.typ = aprsdecode_tSYMBOL; + } + hdmin = X2C_max_real; + hoverx = (float)useri_xmouse.x; + hovery = (float)useri_mainys()-(float)useri_xmouse.y; + if (aprsdecode_click.entries>0UL) { + pfm = aprsdecode_click.table[aprsdecode_click.selected].pff0; + /* to step thru multiline path */ + } + else pfm = 0; + while (aprsdecode_click.ops) { + if ((isvis(0x8U) && ((0x2U & aprsdecode_click.ops->drawhints)!=0) + ==objects) && maptool_mapxy(aprsdecode_click.ops->lastpos, + &x, &y)>=0L) { + hd = (x-hoverx)*(x-hoverx)+(y-hovery)*(y-hovery); + /* dist mouse to symbol */ + if (hdopf = aprsdecode_click.ops; + hoverobj->pff = 0; + hoverobj->pff0 = 0; + } + } + if (highlight0) lig = 1000UL; + else { + lig = fade(aprsdecode_click.ops->lasttime, aprsdecode_click.ops); + } + if (objects) lig = (lig*(uint32_t)aprsdecode_lums.obj)/1024UL; + else lig = (lig*(uint32_t)aprsdecode_lums.sym)/1024UL; + if (aprsdecode_click.ops->areasymb.typ) { + if (pfm==0) { + maptool_drawareasym(image, aprsdecode_click.ops->lastpos, + aprsdecode_click.ops->areasymb, lig); + } + else if (aprsdecode_Decode(pfm->vardat->raw, 500ul, &dat)>=0L) { + maptool_drawareasym(image, dat.pos, dat.areasymb, lig); + } + } + else if (aprsdecode_click.ops->poligon) { + tolastframe(&pfm); + if (pfm && aprsdecode_Decode(pfm->vardat->raw, 500ul, &dat)>=0L) { + maptool_drawpoligon(image, dat.pos, dat.multiline, dat.symt, + dat.sym, lig); + } + } + else { + maptool_drawsym(image, aprsdecode_click.ops->sym.tab, + aprsdecode_click.ops->sym.pic, + (0x1U & aprsdecode_click.ops->drawhints)!=0, osic_floor(x), + osic_floor(y), lig); + if (aprsdecode_click.ops->sym.pic=='@') { + /* storm circles */ + tolastframe(&pfm); + if ((pfm && aprsdecode_Decode(pfm->vardat->raw, 500ul, + &dat)>=0L) && dat.wx.storm>aprsdecode_WXNORMAL) { + stormcicle(image, dat.pos, dat.wx.radiushurr, + dat.wx.radiusstorm, dat.wx.wholegale, lig); + } + } + } + if (aprsdecode_click.ops->lastkmh>0) { + if (isdrivespeed(aprsdecode_click.ops->lastinftyp)) { + if (useri_configon(useri_fARROW) + && aprsdecode_click.ops->lasttime+aprsdecode_lums.kmhtime>aprsdecode_systime) + { + col.r = 500UL; + col.g = 500UL; + col.b = 0UL; + maptool_drawarrow(image, x, y, 22.0f, + (float)(aprsdecode_click.ops->lastinftyp-10U) + *(-6.9813170079773E-2f), 0UL, lig, col); + } + } + else if (aprsdecode_click.ops->lastinftyp>=110U && aprsdecode_click.ops->lastinftyp<200U) + { + if (useri_configon(useri_fWINDSYM) + && aprsdecode_click.ops->temptime+3600UL>aprsdecode_systime) { + col.r = 0UL; + col.g = 400UL; + col.b = 400UL; + maptool_drawarrow(image, x, y, 19.0f, + (float)(aprsdecode_click.ops->lastinftyp-110U) + *(-6.9813170079773E-2f), + (uint32_t)(uint16_t)aprsdecode_click.ops->lastkmh, lig, + col); + } + } + } + } + if (highlight0) return; + aprsdecode_click.ops = aprsdecode_click.ops->next; + } +} /* end symbols() */ + + +static void text(aprsdecode_pOPHIST op, char yesno, + char objmove, char highlight0, + char withvalues) +{ + float y; + float x; + uint32_t lumtext; + uint32_t lig; + char s1[256]; + char s[256]; + struct aprsdecode_COLTYP colo; + struct aprsdecode_COLTYP colw; + struct aprsdecode_COLTYP col; + char temponly; + char object; + char fix; + temponly = aprsdecode_lums.wxcol && aprsdecode_lums.text==0L; + /* labels off but wxonly */ + if (temponly) lumtext = 700UL; + else lumtext = (uint32_t)aprsdecode_lums.text; + aprsdecode_click.ops = op; + useri_ColConfset(&colw, useri_fCOLMAPTEXT); + useri_ColConfset(&colo, useri_fCOLOBJTEXT); + while (aprsdecode_click.ops) { + object = (0x2U & aprsdecode_click.ops->drawhints)!=0; + if ((isvis(0x8U) && (objmove && object==yesno || !objmove && moving(aprsdecode_click.ops) + ==yesno)) && maptool_mapxy(aprsdecode_click.ops->lastpos, &x, + &y)>=0L) { + lig = (fade(aprsdecode_click.ops->lasttime, + aprsdecode_click.ops)*lumtext)/256UL; + if (object) { + if (lig>(uint32_t)aprsdecode_lums.obj) { + lig = (uint32_t)aprsdecode_lums.obj; + } + col = colo; + } + else col = colw; + fix = aprsdecode_click.dryrun; + if (highlight0) { + lig = 1000UL; + fix = 1; + } + else aprsdecode_click.typ = aprsdecode_tTEXT; + aprsstr_Assign(s, 256ul, aprsdecode_click.ops->call, 9ul); + if (!temponly) { + maptool_drawstr(image, s, 256ul, osic_floor(x+7.0f), + osic_floor(y-(float)(aprsdecode_lums.fontysize/2UL)), lig, + 1UL, col, &aprsdecode_click.ops->textpos, 3UL, fix, + aprsdecode_click.dryrun); + } + if (withvalues) { + if (aprsdecode_click.ops->lastinftyp>=100U) { + /* temperature */ + if (((useri_configon(useri_fTEMP) + && aprsdecode_click.ops->lasttempalt>=-99) + && aprsdecode_click.ops->lasttempalt<=99) + && aprsdecode_click.ops->temptime+3600UL>aprsdecode_systime) { + if (object) aprsdecode_click.typ = aprsdecode_tDEGREEOBJ; + else aprsdecode_click.typ = aprsdecode_tDEGREE; + aprsstr_IntToStr((int32_t) + aprsdecode_click.ops->lasttempalt, 1UL, s, 256ul); + aprsstr_Append(s, 256ul, "\177C", 3ul); + if (aprsdecode_click.ops->lasttempalt<0) { + col.r = 20UL; + col.g = 180UL; + col.b = 255UL; + } + else if (aprsdecode_click.ops->lasttempalt<40) { + maptool_Colset(&col, 'Y'); + } + else maptool_Colset(&col, 'R'); + /* drawstr(image, s, VAL(INTEGER,x+6), + VAL(INTEGER,y-6), lig, 1, col, click.ops^.valuepos, 4, fix); + */ + maptool_drawstr(image, s, 256ul, osic_floor(x+6.0f), + osic_floor(y-(float)(aprsdecode_lums.fontysize/2UL)), lig, + 0UL, col, &aprsdecode_click.ops->valuepos, 4UL, fix, + aprsdecode_click.dryrun); + } + } + else { + /* ELSIF click.ops^.lastinftyp<100 THEN (* kmh *) + */ + s[0] = 0; + if (useri_configon(useri_fKMH)) { + /* & (click.ops^.lastinftyp>0) THEN */ + if (object) aprsdecode_click.typ = aprsdecode_tKMHOBJ; + else aprsdecode_click.typ = aprsdecode_tKMH; + if ((aprsdecode_click.ops->lastinftyp>0U && aprsdecode_click.ops->lastkmh>0) + && aprsdecode_click.ops->lasttime+aprsdecode_lums.kmhtime>aprsdecode_systime) + { + aprsstr_IntToStr((int32_t) + aprsdecode_click.ops->lastkmh, 1UL, s, 256ul); + useri_confappend(useri_fKMH, s, 256ul); + } + } + if ((int32_t)aprsdecode_click.ops->lasttempalt+22768L>useri_conf2int(useri_fALTMIN, + 0UL, -10000L, 65535L, -10000L)) { + if (s[0U]) aprsstr_Append(s, 256ul, " ", 2ul); + aprsstr_IntToStr((int32_t) + aprsdecode_click.ops->lasttempalt+22768L, 1UL, s1, 256ul); + aprsstr_Append(s, 256ul, s1, 256ul); + aprsstr_Append(s, 256ul, "m", 2ul); + } + if (s[0U]) { + maptool_Colset(&col, 'Y'); + maptool_drawstr(image, s, 256ul, osic_floor(x+7.0f), + osic_floor(y-(float)(aprsdecode_lums.fontysize/2UL)), lig, + 0UL, col, &aprsdecode_click.ops->valuepos, 4UL, fix, + aprsdecode_click.dryrun); + } + } + } + } + if (highlight0) return; + aprsdecode_click.ops = aprsdecode_click.ops->next; + } +} /* end text() */ + + +static char getgate(aprsdecode_pVARDAT v, aprsdecode_pOPHIST * gate) +{ + aprsdecode_MONCALL digi; + struct aprsdecode_VARDAT * anonym; + { /* with */ + struct aprsdecode_VARDAT * anonym = v; + if (anonym->igatelen==0U) return 0; + aprstext_strcp(anonym->raw, 500ul, (uint32_t)anonym->igatepos, + (uint32_t)anonym->igatelen, digi, 9ul); + *gate = aprsdecode_ophist0; + while (*gate && X2C_STRCMP((*gate)->call,9u,digi,9u)) { + *gate = (*gate)->next; + } + if (((*gate==0 || !maptool_vistime((*gate)->lasttime)) + || !aprspos_posvalid((*gate)->lastpos)) || (uint8_t)(*gate) + ->sym.tab<=' ') return 0; + } + return 1; +} /* end getgate() */ + + +static void rftracks(const aprsdecode_MONCALL opcall, char * clrimg) +{ + aprsdecode_pOPHIST op; + aprsdecode_pOPHIST ig; + float y; + float x; + float y00; + float x0; + uint32_t lig; + /* track filter off */ + char trk; /* show no waypoints so show no rfpath to this */ + char nofilt; + struct aprsdecode_VARDAT * anonym; + op = aprstext_oppo(opcall); + aprsdecode_click.ops = op; + aprsdecode_click.typ = aprsdecode_tRFPATH; + nofilt = !useri_configon(useri_fTRACKFILT); + trk = aprsdecode_lums.track>1L; + if (aprsdecode_click.ops) { + aprsdecode_click.pf = aprsdecode_click.ops->frames; + while (aprsdecode_click.pf) { + if ((trk || aprsdecode_click.pf->next==0) + && maptool_vistime(aprsdecode_click.pf->time0)) { + { /* with */ + struct aprsdecode_VARDAT * anonym = aprsdecode_click.pf->vardat; + + if (anonym->lastref==aprsdecode_click.pf && (nofilt || !(aprsdecode_click.pf->nodraw&~0x9U) + )) { + if ((getgate(aprsdecode_click.pf->vardat, + &ig) && maptool_mapxy(anonym->pos, &x0, + &y00)>=0L) && maptool_mapxy(ig->lastpos, &x, &y)>=-1L) { + /* + lig:=fade(click.pf^,time, click.ops); + lig:=lig*240 DIV 1024*(refcnt+1); + */ + if (*clrimg) { + maptool_clr(rfimg); + *clrimg = 0; + } + lig = 60UL*(anonym->refcnt+1UL); + maptool_vector(rfimg, x0, y00, x, y, (int32_t)lig, + (int32_t)lig, (int32_t)lig, 256UL, 25.0f); + } + } + } + } + aprsdecode_click.pf = aprsdecode_click.pf->next; + } + } +} /* end rftracks() */ + + +static void mhtracks(const aprsdecode_MONCALL hcall, char * clrimg) +{ + float y; + float x; + float y00; + float x0; + uint32_t lig; + aprsdecode_MONCALL digi; + aprsdecode_pOPHIST hop; + /* track filter off */ + char trk; /* show no waypoints so show no rfpath to this */ + char nofilt; + struct aprsdecode_VARDAT * anonym; + hop = aprstext_oppo(hcall); + if (hop==0) return; + aprsdecode_click.ops = aprsdecode_ophist0; + aprsdecode_click.typ = aprsdecode_tRFPATH; + nofilt = !useri_configon(useri_fTRACKFILT); + trk = aprsdecode_lums.track>1L; + while (aprsdecode_click.ops) { + if (((0x2U & aprsdecode_click.ops->drawhints) + ==0 && (0x8U & aprsdecode_click.ops->drawhints)) + && (uint8_t)aprsdecode_click.ops->sym.tab>' ') { + aprsdecode_click.pf = aprsdecode_click.ops->frames; + while (aprsdecode_click.pf) { + if ((trk || aprsdecode_click.pf->next==0) + && maptool_vistime(aprsdecode_click.pf->time0)) { + { /* with */ + struct aprsdecode_VARDAT * anonym = aprsdecode_click.pf->vardat; + + if (anonym->lastref==aprsdecode_click.pf && (nofilt || !(aprsdecode_click.pf->nodraw&~0x9U) + )) { + if (anonym->igatelen>0U && maptool_mapxy(anonym->pos, + &x0, &y00)>=0L) { + aprstext_strcp(anonym->raw, 500ul, + (uint32_t)anonym->igatepos, (uint32_t)anonym->igatelen, + digi, 9ul); + if (X2C_STRCMP(hop->call,9u,digi, + 9u)==0 && maptool_mapxy(hop->lastpos, &x, &y)>=-1L) { + if (*clrimg) { + maptool_clr(rfimg); + *clrimg = 0; + } + lig = 50UL*(anonym->refcnt+1UL); + maptool_vector(rfimg, x0, y00, x, y, + (int32_t)lig, (int32_t)lig, (int32_t)lig, 256UL, + 25.0f); + } + } + } + } + } + aprsdecode_click.pf = aprsdecode_click.pf->next; + } + } + aprsdecode_click.ops = aprsdecode_click.ops->next; + } +} /* end mhtracks() */ + +#define aprsmap_TMIN (-30) + +#define aprsmap_TMAX 50 + +#define aprsmap_INCH 0.254 + +#define aprsmap_WXNIL 10000.0 + +static int32_t aprsmap_RED[39] = {33L,63L,112L,156L,199L,47L,104L,156L, + 255L,255L,7L,7L,7L,7L,7L,0L,0L,0L,0L,0L,255L,255L,255L,255L, + 255L,255L,255L,255L,255L,219L,156L,128L,104L,82L,63L,43L,26L, + 13L,4L}; + +static int32_t aprsmap_GRN[39] = {33L,63L,112L,156L,199L,7L,7L,7L,7L,82L, + 0L,33L,82L,156L,255L,47L,81L,128L,186L,255L,255L,219L,186L, + 156L,128L,104L,82L,47L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}; + +static int32_t aprsmap_BLU[39] = {33L,63L,112L,156L,199L,47L,104L,156L, + 255L,255L,156L,255L,255L,255L,255L,0L,0L,0L,0L,0L,7L,7L,7L, + 7L,7L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}; + +#define aprsmap_MAX24 50.0 + +#define aprsmap_MAX1 5.0 + +#define aprsmap_TIMESPAN 3600 + + +static int32_t getrain(char what, aprsdecode_pOPHIST op) +{ + aprsdecode_pFRAMEHIST f; + struct aprsdecode_DAT dat; + float max1; + float r; + int32_t ret; + ret = 0L; + f = op->frames; + while (f) { + if ((f->next==0 && f->time0+3600UL>=aprsdecode_systime) + && aprsdecode_Decode(f->vardat->raw, 500ul, &dat)>=0L) { + if (what=='1') { + max1 = 5.0f; + r = dat.wx.rain1; + } + else { + max1 = 50.0f; + r = dat.wx.rain24; + } + if (r<10000.0f) { + r = r*0.254f; + if (r>200.0f) r = 0.0f; + if (r>max1) r = max1; + if (r>=0.1f) { + ret = (int32_t)aprsdecode_trunc((X2C_DIVR(r, + max1))*32767.0f); + } + } + } + f = f->next; + } + return ret; +} /* end getrain() */ + + +static int32_t gettemp(aprsdecode_pOPHIST op) +{ + int32_t t; + t = (int32_t)op->lasttempalt; + if (t>=-30L && t<=50L || (t>=-80L && t<80L) + && !useri_configon(useri_fTRACKFILT)) { + /* show or not garbage */ + if (t<-30L) t = -30L; + else if (t>50L) t = 50L; + t = ((t-(-30L))*32766L)/80L+1L; + } + else t = 0L; + return t; +} /* end gettemp() */ + +static int32_t _cnst2[39] = {33L,63L,112L,156L,199L,47L,104L,156L,255L, + 255L,156L,255L,255L,255L,255L,0L,0L,0L,0L,0L,7L,7L,7L,7L,7L, + 0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}; +static int32_t _cnst1[39] = {33L,63L,112L,156L,199L,7L,7L,7L,7L,82L,0L,33L, + 82L,156L,255L,47L,81L,128L,186L,255L,255L,219L,186L,156L, + 128L,104L,82L,47L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L,0L}; +static int32_t _cnst0[39] = {33L,63L,112L,156L,199L,47L,104L,156L,255L, + 255L,7L,7L,7L,7L,7L,0L,0L,0L,0L,0L,255L,255L,255L,255L,255L, + 255L,255L,255L,255L,219L,156L,128L,104L,82L,63L,43L,26L,13L, + 4L}; + +static void metercolor(char what) +{ + float oor; + float f1; + float f; + float qq; + float y; + float x; + int32_t xii; + int32_t rbr; + int32_t radius; + int32_t q; + int32_t y00; + int32_t x0; + int32_t my; + int32_t mx; + int32_t yi; + int32_t xi; + int32_t t; + uint32_t gb1; + uint32_t gb; + struct maptool_PIX * anonym; + struct maptool_PIX * anonym0; + int32_t tmp; + int32_t tmp0; + radius = (int32_t)aprsdecode_trunc(osic_power(2.0f, + maptool_realzoom(aprsdecode_initzoom, + aprsdecode_finezoom)+0.2f)); + if (radius>1000L) radius = 1000L; + if (what=='1') radius = radius/2L; + rbr = radius*radius; + oor = X2C_DIVR(1.0f,(float)radius); + aprsdecode_click.ops = aprsdecode_ophist0; + aprsdecode_click.typ = aprsdecode_tMETEOCOLOR; + while (aprsdecode_click.ops) { + if ((((((aprspos_posvalid(aprsdecode_click.ops->lastpos) && (uint8_t) + aprsdecode_click.ops->sym.tab>' ') + && (aprsdecode_lums.obj>0L || (0x2U & aprsdecode_click.ops->drawhints) + ==0)) && maptool_vistime(aprsdecode_click.ops->lasttime)) + && maptool_mapxy(aprsdecode_click.ops->lastpos, &x, + &y)>=-1L) && aprsdecode_click.ops->temptime+3600UL>aprsdecode_systime) + && ((aprsdecode_click.ops->lastinftyp>=100U || what=='1') + || what=='R')) { + x0 = (int32_t)X2C_TRUNCI(x,X2C_min_longint,X2C_max_longint); + y00 = (int32_t)X2C_TRUNCI(y,X2C_min_longint,X2C_max_longint); + if (((x0>-radius && x0-radius) + && y000L) { + tmp = radius; + yi = -radius; + if (yi<=tmp) for (;; yi++) { + my = y00+yi; + if (my>0L && my0L && mxAdr[(mx) + *rfimg->Len0+my]; + gb = aprsdecode_trunc(f*1.E+7f)+1UL; + if (what=='T' && anonym->r==0U) { + anonym->r = (uint16_t)t; + } + else { + gb1 = (uint32_t)anonym->g+(uint32_t) + anonym->b*65536UL; + f1 = (float)gb1*1.E-7f; + if (what=='T') { + anonym->r = (uint16_t)(int32_t) + X2C_TRUNCI(X2C_DIVR((float)t*f+(float)anonym->r*f1, + f+f1),X2C_min_longint,X2C_max_longint); + } + else { + anonym->r = (uint16_t)(int32_t) + X2C_TRUNCI(X2C_DIVR((float)t*f*(1.0f-X2C_DIVR((float)q, + (float)rbr))+(float)anonym->r*f1,f+f1),X2C_min_longint, + X2C_max_longint); + } + if (anonym->r<=0U) { + anonym->r = 1U; + } + gb += gb1; + } + anonym->g = (uint16_t)((uint32_t) + gb&0xFFFFUL); + anonym->b = (uint16_t)X2C_LSH((uint32_t) + gb,32,-16); + } + } + } + else { + if (xii<0L) break; + xi = 0L; + xii = -1L; + } + xi += xii; + } + } + if (yi==tmp) break; + } /* end for */ + } + } + } + aprsdecode_click.ops = aprsdecode_click.ops->next; + } + tmp = maptool_ysize-1L; + yi = 0L; + if (yi<=tmp) for (;; yi++) { + tmp0 = maptool_xsize-1L; + xi = 0L; + if (xi<=tmp0) for (;; xi++) { + { /* with */ + struct maptool_PIX * anonym0 = &rfimg->Adr[(xi)*rfimg->Len0+yi]; + if (anonym0->r>0U) { + if (what=='T') { + t = (int32_t)(((uint32_t)anonym0->r*80UL)/32768UL); + t = t/2L; + if (t<0L) t = 0L; + else if (t>38L) t = 38L; + anonym0->r = (uint16_t)(_cnst0[t]*2L); + anonym0->g = (uint16_t)(_cnst1[t]*2L); + anonym0->b = (uint16_t)(_cnst2[t]*2L); + } + else if (what=='1') { + anonym0->r = (uint16_t)((((uint32_t) + anonym0->r*1000UL+1048576UL)/2097152UL)*64UL); + anonym0->b = 0U; + anonym0->g = 0U; + } + else { + anonym0->b = (uint16_t)((((uint32_t) + anonym0->r*1000UL+1048576UL)/2097152UL)*64UL); + anonym0->r = 0U; + anonym0->g = anonym0->b; + } + } + } + if (xi==tmp0) break; + } /* end for */ + if (yi==tmp) break; + } /* end for */ +} /* end metercolor() */ + + +static void revert(void) +{ + aprsdecode_pOPHIST on; + aprsdecode_pOPHIST oo; + aprsdecode_pOPHIST o; + oo = 0; + o = aprsdecode_ophist0; + while (o) { + on = o->next; + o->next = oo; + oo = o; + o = on; + } + aprsdecode_ophist0 = oo; +} /* end revert() */ + +#define aprsmap_DAY 86400 + + +static char deletelogfile(char all) +{ + aprsdecode_FILENAME fn; + aprsdecode_FILENAME fnd; + uint32_t days; + uint32_t t; + uint32_t cnt; + char ok0; + char s[101]; + t = aprsdecode_realtime; + if (!all) { + days = (uint32_t)useri_conf2int(useri_fLOGDAYS, 0UL, 0L, 1000000L, + 31L); + if (days==0UL) return 0; + /* keep files forever */ + if (t>days*86400UL) t -= days*86400UL; + else t = 0UL; + if (t<1388534400UL) return 1; + } + useri_confstr(useri_fLOGWFN, fn, 1024ul); + aprsstr_Assign(fnd, 1024ul, fn, 1024ul); + cnt = 0UL; + do { + memcpy(fnd,fn,1024u); + aprstext_logfndate(t, fnd, 1024ul); + if (X2C_STRCMP(fnd,1024u,fn,1024u)==0) return 0; + /* not dayly log */ + osi_Erase(fnd, 1024ul, &ok0); + if (ok0) ++cnt; + t -= 86400UL; + } while (t>=1388534400UL); + /* oldest possible file */ + if (cnt>0UL) { + aprsstr_IntToStr((int32_t)cnt, 1UL, s, 101ul); + aprsstr_Append(s, 101ul, " Rawlog(s) Deleted", 19ul); + useri_textautosize(0L, 0L, 5UL, 6UL, 'b', s, 101ul); + } + return 1; +} /* end deletelogfile() */ + +#define aprsmap_TODATE "\003" + +#define aprsmap_TOSTART "\001" + +#define aprsmap_BACK "\002" + +#define aprsmap_FORW "\004" + +#define aprsmap_TOEND "\005" + +#define aprsmap_TONOW "\006" + +#define aprsmap_RDWLOG "\007" + +#define aprsmap_ASKDELLOG "\010" + +#define aprsmap_NODELLOG "\011" + +#define aprsmap_DELLOG "\012" + +#define aprsmap_DAY0 86400 + + +static void toend(int32_t * logredcnt, uint32_t * lastread, + uint32_t * logstarttime, char find0[13], + char fn[1025], uint32_t * fromto) +{ + *fromto = aprsdecode_realtime; + for (;;) { + if (aprsdecode_quit) break; + *fromto -= aprsdecode_lums.firstdim; + rdlog(&aprsdecode_ophist0, fn, 1025ul, *fromto, + *fromto+aprsdecode_lums.firstdim, find0, 13ul, logstarttime, + lastread, logredcnt); + if (*logredcnt<0L) *fromto = ( *fromto/86400UL)*86400UL; + if (*logredcnt>0L || *fromto<1388534400UL) break; + } +} /* end toend() */ + + +static void tobegin(int32_t * logredcnt, uint32_t * lastread, + uint32_t * logstarttime, char find0[13], + char fn[1025], uint32_t * fromto) +{ + *fromto = 1388534400UL; + for (;;) { + if (aprsdecode_quit) break; + rdlog(&aprsdecode_ophist0, fn, 1025ul, *fromto, + *fromto+aprsdecode_lums.firstdim, find0, 13ul, logstarttime, + lastread, logredcnt); + if (*logredcnt>0L || *fromto>aprsdecode_realtime) break; + if (find0[0U] && *logredcnt>=0L) { + /* look for call so read whole day */ + *fromto += aprsdecode_lums.firstdim; + } + else *fromto = ( *fromto/86400UL+1UL)*86400UL; + } +} /* end tobegin() */ + + +static void clrstk(void) +{ + tabview.stkpo = 0UL; + tabview.stktop = 0UL; + aprsdecode_click.mhop[0UL] = 0; + aprsdecode_click.onesymbol.tab = 0; + aprsdecode_click.entries = 0UL; +} /* end clrstk() */ + + +static void importlog(char cmd) +{ + uint32_t th; + uint32_t logstarttime; + uint32_t lastread; + uint32_t fromto; + char h1[1025]; + char h[1025]; + char fn[1025]; + char find0[13]; + char color; + char ok0; + int32_t logredcnt; + char tmp; + h[0U] = 0; + find0[0U] = 0; + fn[0U] = 0; + color = 'e'; + logredcnt = 0L; + logstarttime = 0UL; + /*WrInt(ORD(cmd), 1); WrStrLn(" cmd"); */ + if (cmd=='\012') { + useri_confstr(useri_fLOGWFN, fn, 1025ul); + ok0 = 0; + if (fn[0U]) { + if (deletelogfile(1)) ok0 = 1; + else osi_Erase(fn, 1025ul, &ok0); + } + if (ok0) { + strncpy(h,"[",1025u); + aprsstr_Append(h, 1025ul, fn, 1025ul); + aprsstr_Append(h, 1025ul, "] deleted", 10ul); + } + else { + strncpy(h,"cannot delete [",1025u); + aprsstr_Append(h, 1025ul, fn, 1025ul); + aprsstr_Append(h, 1025ul, "]", 2ul); + } + } + else if (cmd=='\010') { + useri_confstr(useri_fLOGWFN, fn, 1025ul); + if (fn[0U]==0) strncpy(h,"no logfile defined",1025u); + else { + if (useri_guesssize(fn, 1025ul, h, 1025ul)>=0L) { + aprsstr_Append(fn, 1025ul, "] ", 3ul); + aprsstr_Append(fn, 1025ul, " ", 2ul); + aprsstr_Append(fn, 1025ul, h, 1025ul); + strncpy(h,"Logfile [",1025u); + aprsstr_Append(h, 1025ul, fn, 1025ul); + } + else strncpy(h,"no logfile found",1025u); + color = 'r'; + } + } + else if (cmd!='\011') { + useri_confstr(useri_fLOGDATE, h, 1025ul); + if (!aprsstr_StrToTime(h, 1025ul, &fromto)) fromto = 0UL; + else if (fromto>useri_localtime()) fromto -= useri_localtime(); + lastread = fromto; + if (cmd=='\006' || cmd=='\007') { + if (aprsdecode_lums.logmode) { + /* exit logmode */ + clrstk(); + aprsdecode_purge(&aprsdecode_ophist0, X2C_max_longcard, + X2C_max_longcard); + aprsdecode_ophist0 = aprsdecode_ophist2; + aprsdecode_ophist2 = 0; + aprsdecode_lums.logmode = 0; + aprsdecode_systime = aprsdecode_realtime; + } + if (cmd=='\007') { + useri_confstr(useri_fLOGWFN, fn, 1025ul); + clrstk(); + aprsdecode_purge(&aprsdecode_ophist0, X2C_max_longcard, + X2C_max_longcard); + aprsdecode_systime = osic_time(); + if (fn[0U]) { + rdlog(&aprsdecode_ophist0, fn, 1025ul, + aprsdecode_systime-aprsdecode_lums.purgetime, + aprsdecode_systime, "", 1ul, &logstarttime, &lastread, + &logredcnt); + revert(); + aprsdecode_purge(&aprsdecode_ophist0, + aprsdecode_systime-aprsdecode_lums.purgetime, + aprsdecode_systime-aprsdecode_lums.purgetimeobj); + aprsdecode_tracenew.winevent = 0UL; + } + else strncpy(h,"need filename",1025u); + } + fromto = aprsdecode_systime; + } + else { + useri_confstr(useri_fLOGFN, fn, 1025ul); + if (aprsdecode_lums.logmode) { + clrstk(); + aprsdecode_purge(&aprsdecode_ophist0, X2C_max_longcard, + X2C_max_longcard); + } + else { + aprsdecode_ophist2 = aprsdecode_ophist0; + aprsdecode_ophist0 = 0; + aprsdecode_lums.logmode = 1; + } + useri_confstr(useri_fLOGDATE, h, 1025ul); + if (!aprsstr_StrToTime(h, 1025ul, &fromto)) fromto = 0UL; + else if (fromto>useri_localtime()) fromto -= useri_localtime(); + logredcnt = 0L; + if (fromto>aprsdecode_realtime) fromto = aprsdecode_realtime; + else if (fromto<1388534400UL) fromto = 1388534400UL; + useri_confstr(useri_fLOGFIND, find0, 13ul); /* find call in log */ + if (cmd=='\001') { + tobegin(&logredcnt, &lastread, &logstarttime, find0, fn, + &fromto); + } + else if (cmd=='\002') { + for (;;) { + if (aprsdecode_quit) break; + fromto -= aprsdecode_lums.firstdim; + rdlog(&aprsdecode_ophist0, fn, 1025ul, fromto, + fromto+aprsdecode_lums.firstdim, find0, 13ul, &logstarttime, + &lastread, &logredcnt); + if (logredcnt<0L) fromto = (fromto/86400UL)*86400UL; + if (logredcnt>0L || fromto<1388534400UL) break; + } + if (logredcnt<=0L) { + tobegin(&logredcnt, &lastread, &logstarttime, find0, fn, + &fromto); + } + } + else if (cmd=='\005') { + toend(&logredcnt, &lastread, &logstarttime, find0, fn, &fromto); + } + else if (cmd=='\004') { + for (;;) { + if (aprsdecode_quit) break; + fromto += aprsdecode_lums.firstdim; + rdlog(&aprsdecode_ophist0, fn, 1025ul, fromto, + fromto+aprsdecode_lums.firstdim, find0, 13ul, &logstarttime, + &lastread, &logredcnt); + if (logredcnt>0L || fromto>aprsdecode_realtime) break; + } + if (logredcnt<=0L) { + toend(&logredcnt, &lastread, &logstarttime, find0, fn, + &fromto); + } + } + else if (cmd=='\003') { + rdlog(&aprsdecode_ophist0, fn, 1025ul, fromto, + fromto+aprsdecode_lums.firstdim, find0, 13ul, &logstarttime, + &lastread, &logredcnt); + } + if (logredcnt>0L) { + aprsdecode_systime = lastread; + revert(); + aprsdecode_purge(&aprsdecode_ophist0, + aprsdecode_systime-aprsdecode_lums.purgetime, + aprsdecode_systime-aprsdecode_lums.purgetime); + lastread = fromto; + } + aprsdecode_tracenew.winevent = 0UL; + } + aprsstr_DateToStr(lastread+useri_localtime(), h, 1025ul); + h[16U] = 0; + useri_AddConfLine(useri_fLOGDATE, 0U, h, 1025ul); + if (logredcnt>0L) { + aprsstr_IntToStr(logredcnt, 1UL, h, 1025ul); + aprsstr_Append(h, 1025ul, " Lines ", 8ul); + th = (aprsdecode_systime-logstarttime)/60UL; + aprsstr_IntToStr((int32_t)(th/60UL), 1UL, h1, 1025ul); + aprsstr_Append(h, 1025ul, h1, 1025ul); + aprsstr_Append(h, 1025ul, "h", 2ul); + th = th%60UL; + aprsstr_Append(h, 1025ul, + (char *)(tmp = (char)(th/10UL+48UL),&tmp), 1u/1u); + aprsstr_Append(h, 1025ul, + (char *)(tmp = (char)(th%10UL+48UL),&tmp), 1u/1u); + aprsstr_Append(h, 1025ul, "m from\012", 8ul); + aprstext_DateLocToStr(logstarttime, h1, 1025ul); + aprsstr_Append(h, 1025ul, h1, 1025ul); + /* + Append(h, LF+"to "); + DateLocToStr(systime, h1); Append(h, h1); + */ + color = 'b'; + } + else if (logstarttime>0UL) { + strncpy(h,"no data at ",1025u); + aprstext_DateLocToStr(fromto+useri_localtime(), h1, 1025ul); + aprsstr_Append(h, 1025ul, h1, 1025ul); + if (aprsdecode_systime=1UL) { + aprsstr_Append(h, 1025ul, " (log start ", 13ul); + aprstext_DateLocToStr(logstarttime, h1, 1025ul); + aprsstr_Append(h, 1025ul, h1, 1025ul); + aprsstr_Append(h, 1025ul, ")", 2ul); + } + } + else if (fn[0U]) strncpy(h,"no Data found",1025u); + if (cmd=='\006') strncpy(h,"back to Realtime",1025u); + } + useri_say(h, 1025ul, 0UL, color); + useri_refrlog(); +} /* end importlog() */ + + +static void bootreadlog(void) +{ + char fn[1000]; + char s[1000]; + uint32_t lastt; + uint32_t logt; + int32_t logredcnt; + useri_confstr(useri_fLOGWFN, fn, 1000ul); + if (!useri_configon(useri_fLOGWFN) || fn[0U]==0) { + useri_say("No Log File Enabled", 20ul, 5UL, 'b'); + useri_redraw(image); + } + else { + useri_say("Reading Log ...", 16ul, 0UL, 'b'); + useri_redraw(image); + aprsdecode_realtime = osic_time(); + logt = aprsdecode_realtime-aprsdecode_lums.purgetime; + /* start from now - data in ram */ + logredcnt = 0L; + rdlog(&aprsdecode_ophist0, fn, 1000ul, logt, aprsdecode_realtime, "", + 1ul, &logt, &lastt, &logredcnt); + if (logredcnt>0L) { + aprsstr_IntToStr(logredcnt, 1UL, s, 1000ul); + aprsstr_Append(s, 1000ul, " lines \'", 9ul); + aprsstr_Append(s, 1000ul, fn, 1000ul); + aprsstr_Append(s, 1000ul, "\' imported", 11ul); + useri_say(s, 1000ul, 4UL, 'b'); + useri_redraw(image); + } + else { + strncpy(s,"logile \'",1000u); + aprsstr_Append(s, 1000ul, fn, 1000ul); + aprsstr_Append(s, 1000ul, "\' not found", 12ul); + useri_say(s, 1000ul, 6UL, 'r'); + useri_redraw(image); + } + } + revert(); + aprsdecode_purge(&aprsdecode_ophist0, + osic_time()-aprsdecode_lums.purgetime, + osic_time()-aprsdecode_lums.purgetimeobj); + logdone = 1; +} /* end bootreadlog() */ + + +static char IsInbMultisymb(char tab, char pic) +{ + uint32_t t; + t = (uint32_t)(uint8_t)pic; + if (t<32UL) return 0; + t -= 32UL; + if (t>=192UL) return 0; + if (tab!='/') t += 96UL; + return X2C_INL(t,192,aprsdecode_click.onesymbolset); +} /* end IsInbMultisymb() */ + + +static void markvisable(const aprsdecode_MONCALL singlecall) +{ + aprsdecode_pOPHIST singleop; + aprsdecode_pOPHIST op; + struct aprspos_POSITION rightdown; + struct aprsdecode_OPHIST * anonym; + singleop = aprstext_oppo(singlecall); + maptool_xytodeg((float)maptool_xsize, 0.0f, &rightdown); + op = aprsdecode_ophist0; + while (op) { + { /* with */ + struct aprsdecode_OPHIST * anonym = op; + if ((((aprspos_posvalid(anonym->lastpos) + && maptool_vistime(anonym->lasttime)) + && (op==singleop || ((((singleop==0 && anonym->margin0.long0<=rightdown.long0) + && anonym->margin0.lat>=rightdown.lat) + && anonym->margin1.long0>=aprsdecode_mappos.long0) + && anonym->margin1.lat<=aprsdecode_mappos.lat) + && ((aprsdecode_click.onesymbol.tab==0 || aprsdecode_click.onesymbol.tab=='*' + ) || anonym->sym.pic==aprsdecode_click.onesymbol.pic && (anonym->sym.tab==aprsdecode_click.onesymbol.tab || aprsdecode_click.onesymbol.tab=='\\' && anonym->sym.tab!='/') + ))) && (aprsdecode_click.onesymbol.tab!='*' || IsInbMultisymb(anonym->sym.tab, + anonym->sym.pic))) + && ((op==singleop || aprsdecode_lums.obj>0L) + || (0x2U & anonym->drawhints)==0)) anonym->drawhints |= 0x8U; + else anonym->drawhints = anonym->drawhints&~0x18U; + op = anonym->next; + } + } + aprsdecode_tracenew.winpos0 = aprsdecode_mappos; + aprsdecode_tracenew.winpos1 = rightdown; +} /* end markvisable() */ + + +static aprsdecode_pOPHIST findop(const char call[], uint32_t call_len, + char totable) +{ + aprsdecode_pOPHIST opfound; + aprsdecode_pOPHIST op; + aprsdecode_MONCALL Mc; + aprsdecode_MONCALL mc0; + uint32_t i; + char c; + c = 0; + for (i = 0UL; i<=8UL; i++) { + if (i<=call_len-1) { + mc0[i] = call[i]; + if (c!='*') c = X2C_CAP(call[i]); + if (c=='*') Mc[i] = '?'; + else Mc[i] = c; + } + else { + mc0[i] = 0; + Mc[i] = 0; + } + } /* end for */ + if (totable) { + aprsdecode_click.entries = 0UL; + aprsdecode_click.selected = 0UL; + } + op = aprsdecode_ophist0; + while (op) { + opfound = 0; + if (X2C_STRCMP(op->call,9u,mc0,9u)==0) opfound = op; + else { + i = 0UL; + for (;;) { + if (Mc[i]!='?' && Mc[i]!=op->call[i]) break; + ++i; + if (i>8UL) { + opfound = op; + break; + } + } + } + if (opfound && maptool_vistime(opfound->lasttime)) { + if (!totable) return opfound; + if (aprsdecode_click.entries>9UL) { + return aprsdecode_click.table[0UL].opf; + } + aprsdecode_click.table[aprsdecode_click.entries].opf = opfound; + aprsdecode_click.table[aprsdecode_click.entries].pff = 0; + aprsdecode_click.table[aprsdecode_click.entries].pff0 = 0; + aprsdecode_click.table[aprsdecode_click.entries] + .typf = aprsdecode_tSYMBOL; + aprsdecode_click.selected = 0UL; + ++aprsdecode_click.entries; + } + op = op->next; + } + if (aprsdecode_click.entries>0UL) return aprsdecode_click.table[0UL].opf; + else return 0; + return 0; +} /* end findop() */ + + +static void reset(struct aprspos_POSITION * pos1, + struct aprspos_POSITION * pos0) +{ + pos0->lat = (-10.0f); + pos0->long0 = 10.0f; + pos1->lat = 10.0f; + pos1->long0 = (-10.0f); +} /* end reset() */ + + +static void max0(struct aprspos_POSITION * pos1, + struct aprspos_POSITION * pos0, struct aprspos_POSITION p) +{ + if (aprspos_posvalid(p)) { + if (pos0->latlat = p.lat; + if (pos1->lat>p.lat) pos1->lat = p.lat; + if (pos0->long0>p.long0) pos0->long0 = p.long0; + if (pos1->long0long0 = p.long0; + } +} /* end max() */ + + +static void findsize(struct aprspos_POSITION * pos0, + struct aprspos_POSITION * pos1, + const aprsdecode_MONCALL opcall, char typ) +{ + aprsdecode_pFRAMEHIST f; + aprsdecode_pVARDAT v; + aprsdecode_pOPHIST op; + aprsdecode_pOPHIST ig; + uint32_t gl; + uint32_t j; + uint32_t i; + struct aprsdecode_DAT dat; + char nofilt; + char trk; + struct aprsdecode_VARDAT * anonym; + struct aprsdecode_FRAMEHIST * anonym0; + reset(pos1, pos0); + op = aprstext_oppo(opcall); + nofilt = !useri_configon(useri_fTRACKFILT); + trk = aprsdecode_lums.track>1L; + if (op) { + if (typ=='S') { + *pos0 = op->lastpos; + *pos1 = *pos0; + } + else if (typ=='T' || typ=='R') { + if (typ=='R') { + ig = aprsdecode_ophist0; + while (ig) { + ig->drawhints = ig->drawhints&~0x18U; + ig = ig->next; + } + op->drawhints |= 0x8U; + } + f = op->frames; + while (f) { + v = f->vardat; + if ((trk || f->next==0) && aprspos_posvalid(v->pos)) { + { /* with */ + struct aprsdecode_VARDAT * anonym = v; + if (maptool_vistime(f->time0) + && (nofilt || !(f->nodraw&~0x9U))) { + max0(pos1, pos0, anonym->pos); + if (typ=='R' && getgate(v, &ig)) { + ig->drawhints |= 0x8U; + max0(pos1, pos0, ig->lastpos); + } + } + } + } + f = f->next; + } + } + else if (typ=='H') { + /* + WrStr(typ); WrFixed(pos0.lat, 4,10);WrFixed(pos0.lat, 4,10); + WrFixed(pos0.long, 4,10); + WrFixed(pos1.lat, 4,10); WrFixed(pos1.long, 4,10); WrStr(op^.call); + WrLn; + */ + /* mark all heard this op */ + gl = aprsstr_Length(op->call, 9ul); + if (gl>0UL) { + ig = aprsdecode_ophist0; + while (ig) { + ig->drawhints = ig->drawhints&~0x18U; + if ((0x2U & ig->drawhints)==0 && maptool_vistime(ig->lasttime) + ) { + f = ig->frames; + for (;;) { + if (f==0) break; + { /* with */ + struct aprsdecode_FRAMEHIST * anonym0 = f; + if (((((trk || f->next==0) + && maptool_vistime(anonym0->time0)) + && aprspos_posvalid(anonym0->vardat->pos)) + && (nofilt || !(f->nodraw&~0x9U))) && (uint32_t) + anonym0->vardat->igatelen==gl) { + j = (uint32_t)anonym0->vardat->igatepos; + i = 0UL; + while (anonym0->vardat->raw[j]==op->call[i]) { + ++j; + ++i; + if (i>=gl) { + ig->drawhints |= 0x8U; + max0(pos1, pos0, anonym0->vardat->pos); + goto loop_exit; + } + } + } + } + f = f->next; + } + loop_exit:; + if ((0x8U & ig->drawhints)) { + max0(pos1, pos0, ig->lastpos); + /* show symbol in map size */ + } + } + ig = ig->next; + } + op->drawhints |= 0x8U; + max0(pos1, pos0, op->lastpos); + } + } + } + if (typ=='O') { + /* mark all objects of this op */ + ig = aprsdecode_ophist0; + while (ig) { + ig->drawhints = ig->drawhints&~0x18U; + if (((0x2U & ig->drawhints) && aprspos_posvalid(ig->lastpos)) + && maptool_vistime(ig->lasttime)) { + f = ig->frames; + if (f) { + while (f->next) f = f->next; + if ((aprsdecode_Decode(f->vardat->raw, 500ul, + &dat)>=0L && (dat.type==aprsdecode_OBJ || dat.type==aprsdecode_ITEM) + ) && X2C_STRCMP(dat.objectfrom,9u,opcall,9u)==0) { + ig->drawhints |= 0x8U; + max0(pos1, pos0, ig->lastpos); + } + } + } + ig = ig->next; + } + } + if ((((float)fabs(pos0->lat)>1.5707963267949f || (float) + fabs(pos1->lat)>1.5707963267949f) || (float) + fabs(pos0->long0)>3.1415926535898f) || (float) + fabs(pos1->long0)>3.1415926535898f) { + aprsdecode_posinval(pos0); + aprsdecode_posinval(pos1); + } + maptool_limpos(pos0); + maptool_limpos(pos1); +/* +WrFixed(pos0.long*180.0/pi, 5,10); +WrFixed(pos0.lat*180.0/pi, 5,10); +WrFixed(pos1.long*180.0/pi, 5,10); +WrFixed(pos1.lat*180.0/pi, 5,10); +WrLn; +*/ +} /* end findsize() */ + + +static void pantoop(aprsdecode_pOPHIST op) +{ + struct aprspos_POSITION p; + struct aprspos_POSITION rightdown; + float cf; + float m; + if (op && aprspos_posvalid(op->lastpos)) { + maptool_xytodeg((float)maptool_xsize, 0.0f, &rightdown); + p = op->lastpos; + cf = (float)aprsdecode_lums.centering*0.005f; + /* hold obj in percent of image to center */ + m = (rightdown.long0-aprsdecode_mappos.long0)*cf; + if (p.long0-mrightdown.long0) { + aprsdecode_mappos.long0 = (aprsdecode_mappos.long0+p.long0+m) + -rightdown.long0; + } + m = (aprsdecode_mappos.lat-rightdown.lat)*cf; + if (p.lat+m>aprsdecode_mappos.lat) aprsdecode_mappos.lat = p.lat+m; + else if (p.lat-m0C) THEN pantoop(findop(click.mhop, + FALSE)) END; + END; +END toggview; +*/ + +static void push(float newzoom) +{ + uint32_t i; + struct TABS * anonym; + struct VIEW * anonym0; + uint32_t tmp; + { /* with */ + struct TABS * anonym = &tabview; + if (((anonym->stkpo==0UL || anonym->posstk[anonym->stkpo-1UL] + .pos.lat!=aprsdecode_mappos.lat) + || anonym->posstk[anonym->stkpo-1UL] + .pos.long0!=aprsdecode_mappos.long0) || (int32_t) + X2C_TRUNCI(anonym->posstk[anonym->stkpo-1UL].zoom*10.0f, + X2C_min_longint,X2C_max_longint)!=(int32_t)X2C_TRUNCI(newzoom*10.0f, + X2C_min_longint,X2C_max_longint)) { + { /* with */ + struct VIEW * anonym0 = &anonym->posstk[anonym->stkpo]; + anonym0->pos = aprsdecode_mappos; + anonym0->zoom = newzoom; + memcpy(anonym0->mhop,aprsdecode_click.mhop,9u); + anonym0->onesymbol = aprsdecode_click.onesymbol; + memcpy(anonym0->onesymbolset,aprsdecode_click.onesymbolset,24u); + anonym0->rf = aprsdecode_lums.rf; + anonym0->lumtrack = aprsdecode_lums.track; + anonym0->lumwaypoint = aprsdecode_lums.waypoint; + anonym0->lummap = aprsdecode_lums.map; + anonym0->lumsym = aprsdecode_lums.sym; + anonym0->lumobj = aprsdecode_lums.obj; + anonym0->mhtxv = mhtx; + anonym0->wxcol = aprsdecode_lums.wxcol; + anonym0->lumtext = aprsdecode_lums.text; + memcpy(anonym0->mapname,aprsdecode_lums.mapname,41u); + /* altimap:=click.altimap; */ + anonym0->focus = aprsdecode_click.watchmhop; + } + if (anonym->stkpo<19UL) ++anonym->stkpo; + else { + tmp = anonym->stkpo-1UL; + i = 1UL; + if (i<=tmp) for (;; i++) { + anonym->posstk[i] = anonym->posstk[i+1UL]; + if (i==tmp) break; + } /* end for */ + } + if (anonym->stktopstkpo) anonym->stktop = anonym->stkpo; + } + } +} /* end push() */ + + +static void pop(void) +{ + struct TABS * anonym; + struct VIEW * anonym0; + { /* with */ + struct TABS * anonym = &tabview; + if (anonym->stkpo>0UL) { + --anonym->stkpo; + if (((anonym->stkpo>0UL && anonym->posstk[anonym->stkpo] + .pos.lat==aprsdecode_mappos.lat) + && anonym->posstk[anonym->stkpo] + .pos.long0==aprsdecode_mappos.long0) && (int32_t) + X2C_TRUNCI(anonym->posstk[anonym->stkpo].zoom*10.0f, + X2C_min_longint,X2C_max_longint)==(int32_t)X2C_TRUNCI(maptool_realzoom(aprsdecode_initzoom, + aprsdecode_finezoom)*10.0f,X2C_min_longint, + X2C_max_longint)) --anonym->stkpo; + { /* with */ + struct VIEW * anonym0 = &anonym->posstk[anonym->stkpo]; + aprsdecode_mappos = anonym0->pos; + aprsdecode_finezoom = anonym0->zoom; + aprsdecode_initzoom = (int32_t) + aprsdecode_trunc(aprsdecode_finezoom); + aprsdecode_finezoom = (aprsdecode_finezoom-(float) + aprsdecode_initzoom)+1.0f; + memcpy(aprsdecode_click.mhop,anonym0->mhop,9u); + aprsdecode_click.onesymbol = anonym0->onesymbol; + memcpy(aprsdecode_click.onesymbolset,anonym0->onesymbolset,24u); + aprsdecode_lums.rf = anonym0->rf; + mhtx = anonym0->mhtxv; + aprsdecode_lums.wxcol = anonym0->wxcol; + aprsdecode_lums.text = anonym0->lumtext; + if (anonym0->lumtext>0L) { + useri_int2cfg(useri_fLTEXT, anonym0->lumtext/10L); + } + aprsdecode_lums.track = anonym0->lumtrack; + if (anonym0->lumtrack>0L) { + useri_int2cfg(useri_fLTRACK, anonym0->lumtrack/10L); + } + aprsdecode_lums.waypoint = anonym0->lumwaypoint; + if (anonym0->lumwaypoint>0L) { + useri_int2cfg(useri_fLWAY, anonym0->lumwaypoint/10L); + } + aprsdecode_lums.map = anonym0->lummap; + if (anonym0->lummap>0L) { + useri_int2cfg(useri_fLMAP, anonym0->lummap/10L); + } + aprsdecode_lums.sym = anonym0->lumsym; + if (anonym0->lumsym>0L) { + useri_int2cfg(useri_fLSYM, anonym0->lumsym/10L); + } + aprsdecode_lums.obj = anonym0->lumobj; + if (anonym0->lumobj>0L) { + useri_int2cfg(useri_fLOBJ, anonym0->lumobj/10L); + } + memcpy(aprsdecode_lums.mapname,anonym0->mapname,41u); + /* click.altimap:=altimap; */ + aprsdecode_click.watchmhop = anonym0->focus; + } + aprsdecode_lums.moving = 0; + } + maptool_mercator(aprsdecode_mappos.long0, aprsdecode_mappos.lat, + aprsdecode_initzoom, &aprsdecode_inittilex, + &aprsdecode_inittiley, &maptool_shiftx, &maptool_shifty); + } +/* lums.wxcol:=0C; */ +} /* end pop() */ + + +static void toggview(void) +{ + /* switch to alternate view stack */ + struct TABS tmp; + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + tmp = tabview; + if (alttabview.stkpo==0UL) { + /* alternate stack empty so clone actual entry */ + alttabview.posstk[0U] = tabview.posstk[tabview.stkpo-1UL]; + alttabview.stkpo = 1UL; + alttabview.stktop = 1UL; + } + tabview = alttabview; + alttabview = tmp; + aprsdecode_lums.moving = 0; + pop(); + if (aprsdecode_click.watchmhop && aprsdecode_click.mhop[0UL]) { + pantoop(findop(aprsdecode_click.mhop, 9ul, 0)); + } +} /* end toggview() */ + + +static int32_t getant(uint8_t a) +{ + return useri_conf2int(a, 0UL, -1000000L, 100000L, -1000000L); +} /* end getant() */ + + +static void closeradio(void) +{ + if (aprsdecode_click.withradio) maptool_closesrtmfile(); + aprsdecode_click.withradio = 0; + aprsdecode_click.panorama = 0; +} /* end closeradio() */ + + +static void measureline(maptool_pIMAGE img, struct aprspos_POSITION pos0, + struct aprspos_POSITION pos1, int32_t pos0alt) +{ + float el2; + float el1; + float mhz; + float a2; + float a1; + float dist; + float y1; + float x1; + float y00; + float x0; + int32_t ret; + int32_t wave; + int32_t ant2; + int32_t ant1; + char vec; + char altok; + char ant1obj; + char ok0; + char h[100]; + char s[100]; + if ((((aprspos_posvalid(pos0) && aprspos_posvalid(pos1)) + && (pos0.lat!=pos1.lat || pos0.long0!=pos1.long0)) + && maptool_mapxy(pos0, &x0, + &y00)>=-1L) && maptool_mapxy(pos1, &x1, &y1)>=-1L) { + vec = 1; + ok0 = 0; + altok = 0; + if (!aprsdecode_click.withradio || aprsdecode_click.altimap) { + ant1 = getant(useri_fANT1); + ant2 = getant(useri_fANT2); + mhz = useri_conf2real(useri_fFRESNELL, 0UL, 0.0f, X2C_max_real, + 0.0f); + if (mhz>=0.1f) { + wave = (int32_t)aprsdecode_trunc(X2C_DIVR(3.E+5f,mhz)); + } + else wave = 0L; + if ((ant1>-1000000L && ant2>-1000000L) + && useri_configon(useri_fGEOPROFIL)) { + ant1obj = (useri_gpsalt(useri_fANT1) && pos0alt<100000L) + && pos0alt>-10000L; /* take alt from waypoint NN */ + if (ant1obj) ant1 += pos0alt; + ret = maptool_geoprofile(img, pos0, pos1, (float)wave*0.001f, + ant1obj, ant1, ant2, &dist, &a1, &a2, &el1, &el2); + if (ret==0L) { + ok0 = 1; + vec = 0; + altok = 1; + } + else if (ret==-1L) { + strncpy(s,"Radiolink: need altitude data on Marker Positions", + 100u); + } + else strncpy(s,"Radiolink: distance too long",100u); + } + else { + dist = aprspos_distance(pos0, pos1)*1000.0f; + ok0 = 1; + } + if (ok0) { + aprsstr_FixToStr(dist*0.001f, 4UL, s, 100ul); + aprsstr_Append(s, 100ul, "km ", 4ul); + if (altok) { + aprsstr_Append(s, 100ul, "\367", 2ul); + aprsstr_IntToStr((int32_t)X2C_TRUNCI(a1,X2C_min_longint, + X2C_max_longint), 0UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "m/", 3ul); + aprsstr_IntToStr((int32_t)X2C_TRUNCI(a2,X2C_min_longint, + X2C_max_longint), 0UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "m \376", 4ul); + } + aprsstr_Append(s, 100ul, "az:", 4ul); + aprsstr_FixToStr(aprspos_azimuth(pos0, pos1), 2UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "\177/", 3ul); + aprsstr_FixToStr(aprspos_azimuth(pos1, pos0), 2UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "\177 ", 3ul); + if (altok) { + aprsstr_Append(s, 100ul, "\367ele:", 6ul); + aprsstr_FixToStr(el1, 2UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "\177/", 3ul); + aprsstr_FixToStr(el2, 2UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "\177 \376", 4ul); + } + if (mhz>=0.1f) { + aprsstr_FixToStr(32.2f+8.685889638065f*osic_ln(dist*0.001f*mhz) + , 2UL, h, 100ul); + aprsstr_Append(s, 100ul, h, 100ul); + aprsstr_Append(s, 100ul, "dBi", 4ul); + } + useri_textautosize(-3L, 0L, 7UL, 20UL, 'h', s, 100ul); + } + else useri_textautosize(-3L, 0L, 3UL, 2UL, 'r', s, 100ul); + } + if (vec) { + maptool_vector(img, x0, y00, x1, y1, 20L, 220L, 20L, 350UL, 0.0f); + } + } +} /* end measureline() */ + + +static int32_t geobri(void) +{ + return useri_conf2int(useri_fGEOBRIGHTNESS, 0UL, 0L, 100L, 30L); +} /* end geobri() */ + + +static int32_t geocontr(void) +{ + return useri_conf2int(useri_fGEOCONTRAST, 0UL, 0L, 10000L, 0L); +} /* end geocontr() */ + +/* +PROCEDURE panorama(img:pIMAGE; pos:POSITION; col:COLTYP; VAR abo:BOOLEAN); + +CONST ALTINVAL=-10000; + +VAR ant:INTEGER; +BEGIN + IF posvalid(pos) THEN + ant:=getant(fANT1); + IF ant>ALTINVAL THEN + Panorama(img, pos, ant, col, abo); + + ELSE textautosize(0, 0, 3, 2, "r", "Panorama: need Antenna higth") END + END; +END panorama; +*/ +#define aprsmap_ALTINVAL (-10000) + + +static void radioimage(maptool_pIMAGE img, struct aprspos_POSITION pos, + uint32_t colnum, char * abo) +{ + int32_t qual; + int32_t ant3; + int32_t ant2; + int32_t ant1; + if (aprspos_posvalid(pos)) { + ant1 = getant(useri_fANT1); + ant2 = getant(useri_fANT2); + ant3 = getant(useri_fANT3); + if (colnum && ant2>-10000L) ant1 = ant2; + if (ant1>-10000L && ant3>-10000L) { + qual = (int32_t)useri_confflags(useri_fSRTMCACHE, 0UL); + maptool_Radiorange(img, pos, ant1, ant3, (uint32_t)geocontr(), + (uint32_t)(colnum!=0UL), (uint32_t)qual, abo); + } + else { + useri_textautosize(0L, 0L, 3UL, 2UL, 'r', "Radiolink: need Antenna h\ +igths", 31ul); + } + } +} /* end radioimage() */ + + +static void getgeocol(uint8_t c, int32_t bri, uint32_t dr, + uint32_t dg, uint32_t db, + struct aprsdecode_COLTYP * col) +{ + col->r = (uint32_t)((useri_conf2int(c, 0UL, 0L, 100L, + (int32_t)dr)*bri)/100L); + col->g = (uint32_t)((useri_conf2int(c, 1UL, 0L, 100L, + (int32_t)dg)*bri)/100L); + col->b = (uint32_t)((useri_conf2int(c, 2UL, 0L, 100L, + (int32_t)db)*bri)/100L); +} /* end getgeocol() */ + + +static void reliefcolors(maptool_pIMAGE img, char color) +{ + uint32_t bri2; + uint32_t bri; + int32_t def; + uint32_t y; + uint32_t x; + struct maptool_PIX * anonym; + uint32_t tmp; + uint32_t tmp0; + def = geobri(); + getgeocol(useri_fCOLMARK1, def, 100UL, 0UL, 0UL, &radio.c1); + /* marker 1 defaults to red */ + getgeocol(useri_fCOLMARK2, def, 0UL, 100UL, 0UL, &radio.c2); + /* marker 2 defaults to green */ + tmp = img->Len0-1; + y = 0UL; + if (y<=tmp) for (;; y++) { + tmp0 = img->Len1-1; + x = 0UL; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(x)*img->Len0+y]; + if (color) { + bri = (uint32_t)anonym->r; + bri2 = (uint32_t)anonym->g; + anonym->r = (uint16_t)((radio.c1.r*bri+radio.c2.r*bri2) + /100UL); + anonym->g = (uint16_t)((radio.c1.g*bri+radio.c2.g*bri2) + /100UL); + anonym->b = (uint16_t)((radio.c1.b*bri+radio.c2.b*bri2) + /100UL); + } + else { + /* ELSE r:=r*bri DIV 100; g:=r; b:=r END; */ + bri = (uint32_t)(((int32_t)anonym->r*def)/100L); + anonym->r = (uint16_t)bri; + anonym->g = (uint16_t)bri; + anonym->b = (uint16_t)bri; + } + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ +} /* end reliefcolors() */ + + +static void copypastepos(struct aprspos_POSITION pos) +/* in decimal deg */ +{ + char h[101]; + char s[101]; + aprsstr_FixToStr(X2C_DIVR(pos.lat,1.7453292519444E-2f), 6UL, s, 101ul); + aprsstr_Append(s, 101ul, " ", 2ul); + aprsstr_FixToStr(X2C_DIVR(pos.long0,1.7453292519444E-2f), 6UL, h, 101ul); + aprsstr_Append(s, 101ul, h, 101ul); + useri_copypaste(s, 101ul); +/* +PROCEDURE testlist(op:pOPHIST); +VAR pf:pFRAMEHIST; +BEGIN + WrStrLn(op^.call); + pf:=op^.frames; + WHILE pf<>NIL DO + WrCard(CAST(CARDINAL, pf^.vardat), 15); WrInt(pf^.vardat^.igatelen, 10); + WrFixed(pf^.vardat^.pos.long, 4, 10); + WrFixed(pf^.vardat^.pos.lat, 4, 10); WrLn; + pf:=pf^.next; + END; + WrLn; +END testlist; +*/ +} /* end copypastepos() */ + + +static void centerpos(struct aprspos_POSITION centpos, + struct aprspos_POSITION * newpos) +{ + maptool_center(maptool_xsize, maptool_ysize, + maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom), + centpos, newpos); +} /* end centerpos() */ + +#define aprsmap_MARGIN 0.07 + +#define aprsmap_YMARGIN 0.025 + + +static void mapzoom(struct aprspos_POSITION pos0, + struct aprspos_POSITION pos1, uint32_t maxz, + char withmargin) +{ + float wmax; + float wy; + float wx; + float fo; + struct aprspos_POSITION testpos; + struct aprspos_POSITION pos2; + struct aprspos_POSITION mid; + struct aprspos_POSITION mo; + char blown; + char nofit; + char done; + int32_t testty; + int32_t testtx; + float steps; + float testshy; + float testshx; + if (!aprspos_posvalid(pos0) || !aprspos_posvalid(pos1)) return; + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + wx = pos1.long0-pos0.long0; + wy = pos0.lat-pos1.lat; + pos0.lat = pos0.lat+X2C_DIVR(wy*(float)aprsdecode_lums.fontysize, + (float)maptool_ysize); + pos1.lat = pos1.lat-X2C_DIVR(wy*(float)aprsdecode_lums.fontysize*0.25f, + (float)maptool_ysize); + wy = pos0.lat-pos1.lat; + wmax = wx; + if (wmax0L) { + centerpos(mid, &testpos); + maptool_mercator(testpos.long0, testpos.lat, aprsdecode_initzoom, + &testtx, &testty, &testshx, &testshy); + maptool_loadmap(image, testtx, testty, aprsdecode_initzoom, + aprsdecode_finezoom, testshx, testshy, &done, &blown, + useri_configon(useri_fALLOWEXP), 1); + } + else done = 1; + /* test if map is complete */ + if (maptool_mapxy(pos2, &wx, &wy)<0L) nofit = 1; + else { + if (done) break; + nofit = 0; + } + /* IF (mapxy(pos2, wx, wy)>=0) OR (initzoom<=MINZOOM) THEN EXIT END; + */ + --aprsdecode_initzoom; + } + if (aprsdecode_initzoom!=(int32_t)maxz) tooltips('b'); + /* fine zoom */ + aprsdecode_finezoom = 1.0f; + /*IF initzoom1.95f || maptool_mapxy(pos2, &wx, &wy)<0L) { + break; + } + } + aprsdecode_finezoom = fo; + } + mo = aprsdecode_mappos; + centerpos(mid, &aprsdecode_mappos); + if (aprsdecode_mappos.lat=-1L) && maptool_mapxy(aprsdecode_click.squerpos1, &x1, + &y00)>=-1L) { + col.r = 0UL; + col.g = 60UL; + col.b = 0UL; + maptool_area(img, (int32_t)X2C_TRUNCI(x0,X2C_min_longint, + X2C_max_longint), (int32_t)X2C_TRUNCI(y00,X2C_min_longint, + X2C_max_longint), (int32_t)X2C_TRUNCI(x1,X2C_min_longint, + X2C_max_longint), (int32_t)X2C_TRUNCI(y1,X2C_min_longint, + X2C_max_longint), col, 1); + } +} /* end drawsquer() */ + +#define aprsmap_R 300 + +#define aprsmap_G 300 + +#define aprsmap_B 200 + +#define aprsmap_W 350 + + +static void drawzoomsquer(maptool_pIMAGE img) +{ + float y1; + float x1; + float y; + float x; + if (aprsdecode_click.zoomtox>=0L) { + x = (float)aprsdecode_click.x; + y = (float)aprsdecode_click.y; + x1 = (float)aprsdecode_click.zoomtox; + y1 = (float)aprsdecode_click.zoomtoy; + maptool_vector(img, x, y, x1, y, 300L, 300L, 200L, 350UL, 0.0f); + maptool_vector(img, x1, y, x1, y1, 300L, 300L, 200L, 350UL, 0.0f); + maptool_vector(img, x1, y1, x, y1, 300L, 300L, 200L, 350UL, 0.0f); + maptool_vector(img, x, y1, x, y, 300L, 300L, 200L, 350UL, 0.0f); + } +/* col.r:=60; col.g:=60; col.b:=100; */ +/* area(image, click.x, click.y, click.zoomtox, click.zoomtoy, col, TRUE); + */ +} /* end drawzoomsquer() */ + +#define aprsmap_FIELD 7.272205216643E-4 + + +static char qth(char loc[], uint32_t loc_len) +{ + struct aprspos_POSITION pos1; + struct aprspos_POSITION pos; + char qth_ret; + X2C_PCOPY((void **)&loc,loc_len); + maptool_loctopos(&pos, loc, loc_len); + if (!aprspos_posvalid(pos)) { + qth_ret = 0; + goto label; + } + aprstext_setmark1(pos, 1, X2C_max_longint, 0UL); + pos.long0 = (X2C_DIVR((float) + aprsdecode_trunc((pos.long0*5.7295779513082E+1f+180.0f) + *12.0f),12.0f)-1.7995833333333E+2f)*1.7453292519943E-2f; + pos.lat = (X2C_DIVR((float) + aprsdecode_trunc((pos.lat*5.7295779513082E+1f+90.0f)*24.0f), + 24.0f)-8.9979166666667E+1f)*1.7453292519943E-2f; + maptool_limpos(&pos); + aprsdecode_click.squerpos0.lat = pos.lat+3.6361026083215E-4f; + aprsdecode_click.squerpos1.lat = pos.lat-3.6361026083215E-4f; + aprsdecode_click.squerpos0.long0 = pos.long0-7.272205216643E-4f; + aprsdecode_click.squerpos1.long0 = pos.long0+7.272205216643E-4f; + maptool_limpos(&aprsdecode_click.squerpos0); + maptool_limpos(&aprsdecode_click.squerpos1); + pos1.lat = pos.lat-7.272205216643E-4f; + pos.lat = pos.lat+7.272205216643E-4f; + pos1.long0 = pos.long0+1.4544410433286E-3f; + pos.long0 = pos.long0-1.4544410433286E-3f; + maptool_limpos(&pos); + maptool_limpos(&pos1); + mapzoom(pos, pos1, (uint32_t)useri_conf2int(useri_fDEFZOOM, 0UL, 1L, + 18L, 14L), 1); + centerpos(aprsdecode_click.markpos, &aprsdecode_mappos); + qth_ret = 1; + label:; + X2C_PFREE(loc); + return qth_ret; +} /* end qth() */ + + +static void midscreenpos(struct aprspos_POSITION * pos) +{ + maptool_xytodeg((float)maptool_xsize*0.5f, + (float)maptool_ysize*0.5f, pos); +} /* end midscreenpos() */ + + +static void zoominout(char in, char fine, + char allowrev) +{ + float fz; + float z; + struct aprspos_POSITION mid; + int32_t maxz; + z = maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom); + midscreenpos(&mid); + mid.lat = mid.lat+(-6.E-7f); + if (fine) { + fz = useri_conf2real(useri_fZOOMSTEP, 0UL, (-1.0f), 1.0f, 0.1f); + if (!allowrev) fz = (float)fabs(fz); + if (in) aprsdecode_finezoom = aprsdecode_finezoom+fz; + else aprsdecode_finezoom = aprsdecode_finezoom-fz; + if (aprsdecode_finezoom<1.0f && aprsdecode_finezoom>1.0f-fz*0.5f) { + aprsdecode_finezoom = 1.0f; + } + if (aprsdecode_finezoom<1.0f) { + if (aprsdecode_initzoom>0L) { + --aprsdecode_initzoom; + aprsdecode_finezoom = 2.0f-fz; + } + else aprsdecode_finezoom = 1.0f; + } + else if (aprsdecode_finezoom>=2.0f-fz*0.5f) { + ++aprsdecode_initzoom; + aprsdecode_finezoom = 1.0f; + } + } + else { + if (in) { + ++aprsdecode_initzoom; + if (aprsdecode_finezoom>1.75f) ++aprsdecode_initzoom; + } + else if (aprsdecode_finezoom<1.25f) --aprsdecode_initzoom; + aprsdecode_finezoom = 1.0f; + } + if (z==(float)aprsdecode_trunc(z)) push(z); + maxz = useri_conf2int(useri_fMAXZOOM, 0UL, 1L, 18L, 18L); + if (aprsdecode_initzoom<1L) { + aprsdecode_initzoom = 1L; + aprsdecode_finezoom = 1.0f; + } + else if (aprsdecode_initzoom>=maxz) { + aprsdecode_initzoom = maxz; + aprsdecode_finezoom = 1.0f; + } + z = maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom); + maptool_shiftmap(maptool_xsize/2L, maptool_ysize/2L, maptool_ysize, z, + &mid); + aprsdecode_mappos = mid; +} /* end zoominout() */ + + +static void find(void) +{ + char h[201]; + aprsdecode_MONCALL hm; + char err; + aprsdecode_pOPHIST op; + struct aprspos_POSITION pos1; + struct aprspos_POSITION pos; + useri_confstr(useri_fFIND, h, 201ul); + if (!qth(h, 201ul)) { + /* not a locator */ + aprstext_deganytopos(h, 201ul, &pos); + if (!aprspos_posvalid(pos)) maptool_POIfind(&pos, h, 201ul); + if (aprspos_posvalid(pos)) { + /* lat / long */ + aprsdecode_click.mhop[0UL] = 0; + aprsdecode_click.onesymbol.tab = 0; + aprstext_setmark1(pos, 1, X2C_max_longint, 0UL); + /* click.markpos:=pos; click.marktime:=0; + click.markalti:=MAX(INTEGER); */ + centerpos(pos, &aprsdecode_mappos); + pandone = 0; + useri_textautosize(-3L, 0L, 3UL, 4UL, 'b', "marker set", 11ul); + } + else { + /* object name */ + op = findop(h, 201ul, 1); + if (op) { + aprsdecode_click.mhop[0UL] = 0; + aprsdecode_click.onesymbol.tab = 0; + useri_mainpop(); + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + if (aprsdecode_click.entries>0UL && aprsdecode_click.table[0UL] + .opf) { + op = aprstext_oppo(aprsdecode_click.table[0UL].opf->call); + if (op) memcpy(aprsdecode_click.mhop,op->call,9u); + } + mhtx = aprsmap_OPSENT; + pandone = 0; + aprsdecode_lums.rf = 0L; + if (op) { + err = 0; + aprsstr_Assign(h, 201ul, op->call, 9ul); + if (!aprspos_posvalid(op->lastpos)) { + err = 1; + aprsstr_Append(h, 201ul, " No valid Position!", 20ul); + } + if ((uint8_t)op->sym.tab<' ') { + err = 1; + aprsstr_Append(h, 201ul, " No valid Symbol!", 18ul); + if (aprspos_posvalid(op->lastpos)) { + /* set marker instead of missing symbol */ + aprstext_setmark1(op->lastpos, 0, X2C_max_longint, + aprsdecode_realtime); + } + } + /* click.markpos:=op^.lastpos; */ + /* click.marktime:=realtime; */ + /* click.markalti:=MAX(INTEGER); */ + if (err) useri_textautosize(0L, 0L, 3UL, 0UL, 'b', h, 201ul); + } + } + else { + aprsstr_Assign(hm, 9ul, h, 201ul); + findsize(&pos, &pos1, hm, 'O'); + if (aprspos_posvalid(pos)) { + push(maptool_realzoom(aprsdecode_initzoom, + aprsdecode_finezoom)); + memcpy(aprsdecode_click.mhop,hm,9u); + mhtx = aprsmap_OPOBJ; + pandone = 0; + } + else { + useri_textautosize(0L, 0L, 3UL, 10UL, 'e', "\012not found!\012\ +", 13ul); + } + } + } + } +} /* end find() */ + + +static void internstat(void) +{ + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST fr; + uint32_t bytec; + uint32_t varc; + uint32_t frc; + uint32_t opc; + uint32_t newest; + uint32_t oldest; + char s[10001]; + char h[31]; + uint32_t ut; + uint32_t i; + newest = 0UL; + oldest = X2C_max_longcard; + opc = 0UL; + frc = 0UL; + varc = 0UL; + bytec = 0UL; + op = aprsdecode_ophist0; + while (op) { + ++opc; + fr = op->frames; + while (fr) { + ++frc; + if (fr->time0time0; + if (fr->time0>newest) newest = fr->time0; + if (fr->vardat->lastref==fr) { + ++varc; + bytec += aprsstr_Length(fr->vardat->raw, 500ul); + } + fr = fr->next; + } + op = op->next; + } + aprsstr_Assign(s, 10001ul, "System Stat", 12ul); + ut = osic_time(); + if (ut>uptime) { + aprsstr_Append(s, 10001ul, "\012Uptime:", 9ul); + aprsstr_TimeToStr(ut-uptime, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + } + aprsstr_Append(s, 10001ul, "\012Objects:", 10ul); + aprsstr_IntToStr((int32_t)opc, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "\012Frames:", 9ul); + aprsstr_IntToStr((int32_t)frc, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "\012Different Frames:", 19ul); + aprsstr_IntToStr((int32_t)varc, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "\012Rawdata Bytes:", 16ul); + aprsstr_IntToStr((int32_t)bytec, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + if (frc>0UL) { + aprsstr_Append(s, 10001ul, "\012Compressed to:", 16ul); + aprsstr_IntToStr((int32_t)((100UL*varc)/frc), 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "%", 2ul); + } + if (newest>0UL) { + aprsstr_Append(s, 10001ul, "\012Oldest:", 9ul); + aprstext_DateLocToStr(oldest, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "\012Newest:", 9ul); + aprstext_DateLocToStr(newest, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + } + aprsstr_Append(s, 10001ul, "\012Heap Rawdata:", 15ul); + aprsstr_IntToStr((int32_t)useri_debugmem.mon, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "\012Heap Screen: ", 15ul); + aprsstr_IntToStr((int32_t)useri_debugmem.screens, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "\012Heap Menus: ", 15ul); + aprsstr_IntToStr((int32_t)useri_debugmem.menus, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsstr_Append(s, 10001ul, "\012Srtm Cache: ", 15ul); + aprsstr_IntToStr((int32_t)useri_debugmem.srtm, 1UL, h, 31ul); + aprsstr_Append(s, 10001ul, h, 31ul); + aprsdecode_tcpconnstat(s, 10001ul); + for (i = 0UL; i<=3UL; i++) { + aprsdecode_udpconnstat(i, s, 10001ul); + } /* end for */ + useri_say(s, 10001ul, 0UL, 'b'); +} /* end internstat() */ + + +static void setshowall(void) +{ + aprsdecode_click.mhop[0UL] = 0; + aprsdecode_click.onesymbol.tab = 0; + aprsdecode_click.watchmhop = 0; + aprsdecode_lums.wxcol = 0; + useri_say("Show All", 9ul, 2UL, 'g'); +} /* end setshowall() */ + + +static void View(uint32_t n) +{ + float z; + struct aprspos_POSITION mid; + struct aprspos_POSITION pos; + char h[101]; + char s[101]; + if (xosi_Shift) { + z = maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom); + aprsstr_FixToStr(z+0.05f, 2UL, s, 101ul); + midscreenpos(&mid); + aprsstr_Append(s, 101ul, " ", 2ul); + aprstext_postostr(mid, '2', h, 101ul); + aprsstr_Append(s, 101ul, h, 101ul); + useri_setview((int32_t)n, s, 101ul); + useri_killallmenus(); + useri_say("View stored!", 13ul, 4UL, 'r'); + } + else { + z = 0.0f; + aprsdecode_posinval(&pos); + useri_getview(useri_fVIEW, n, &z, &pos); + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + if (z!=0.0f) { + midscreenpos(&mid); + mid.lat = mid.lat+(-6.E-7f); + aprsdecode_initzoom = (int32_t)aprsdecode_trunc(z); + aprsdecode_finezoom = (1.0f+z)-(float)aprsdecode_initzoom; + maptool_shiftmap(maptool_xsize/2L, maptool_ysize/2L, maptool_ysize, + maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom), + &mid); + aprsdecode_mappos = mid; + } + if (aprspos_posvalid(pos)) centerpos(pos, &aprsdecode_mappos); + pandone = 0; + if (aprsdecode_click.mhop[0UL]) setshowall(); + useri_rdonesymb(0, 1); /* show all symbols */ + } +} /* end View() */ + + +static void follow(void) +{ + aprsdecode_pOPHIST op; + aprsdecode_tracenew.winevent = 0UL; + op = findop(aprsdecode_tracenew.call, 9ul, 0); + if (op) { + /* + WrInt(ORD(tracenew.follow), 2); + WrInt(ORD(click.mhop[0]=0C), 2); + WrInt(ORD(click.mhop=op^.call), 2); + WrInt(ORD(tracenew.beep), 2); + WrStrLn(" follow"); + */ + /* IF tracenew.follow & (click.mhop[0]=0C) OR (click.mhop=op^.call) + THEN pantoop(op) END; */ + if (aprsdecode_tracenew.follow && (aprsdecode_click.mhop[0UL] + ==0 || X2C_STRCMP(aprsdecode_click.mhop,9u,op->call,9u)==0)) { + pantoop(op); + } + if (aprsdecode_tracenew.beep && useri_configon(useri_fBEEPWATCH)) { + aprsdecode_beeplim(100L, + (uint32_t)useri_conf2int(useri_fBEEPWATCH, 0UL, 20L, 8000L, + 800L), (uint32_t)useri_conf2int(useri_fBEEPWATCH, 1UL, 0L, + 5000L, 100L)); + } + clickwatchpos = op->lastpos; + useri_popwatchcall(aprsdecode_tracenew.call, 9ul); + if (aprsdecode_tracenew.follow) aprsdecode_click.markpos = op->lastpos; + maptrys = 30UL; + } + aprsdecode_tracenew.call[0UL] = 0; +} /* end follow() */ + + +static void MapPackage(void) +{ + struct aprspos_POSITION rd; + struct aprspos_POSITION lu; + char s1[1000]; + char s[1000]; + maptool_xytodeg(0.0f, (float)maptool_ysize, &lu); + maptool_xytodeg((float)maptool_xsize, 0.0f, &rd); + useri_textautosize(0L, 0L, 16UL, 0UL, 'b', "Calculating Sizes", 18ul); + useri_redraw(image); + maptool_StartMapPackage(lu, rd, useri_conf2int(useri_fDOWNLOADZOOM, 0UL, + 1L, 18L, 6L), 1); + strncpy(s,"Left up : ",1000u); + aprstext_postostr(maptool_mappack.leftup, '2', s1, 1000ul); + aprsstr_Append(s, 1000ul, s1, 1000ul); + aprsstr_Append(s, 1000ul, "\012Right down: ", 14ul); + aprstext_postostr(maptool_mappack.rightdown, '2', s1, 1000ul); + aprsstr_Append(s, 1000ul, s1, 1000ul); + aprsstr_Append(s, 1000ul, "\012From Zoom 1 to ", 17ul); + aprsstr_IntToStr(maptool_mappack.tozoom, 1UL, s1, 1000ul); + aprsstr_Append(s, 1000ul, s1, 1000ul); + if (!aprsdecode_click.chkmaps) { + aprsstr_Append(s, 1000ul, "\012Map Check aborted!", 20ul); + } + else { + aprsstr_Append(s, 1000ul, "\012Total Tiles : ", 20ul); + aprsstr_IntToStr((int32_t)maptool_mappack.mapscnt, 1UL, s1, 1000ul); + aprsstr_Append(s, 1000ul, s1, 1000ul); + aprsstr_Append(s, 1000ul, "\012Download Tiles: ", 18ul); + aprsstr_IntToStr((int32_t)maptool_mappack.needcnt, 1UL, s1, 1000ul); + aprsstr_Append(s, 1000ul, s1, 1000ul); + aprsstr_Append(s, 1000ul, "\012Estimated ", 12ul); + aprsstr_FixToStr((float)maptool_mappack.needcnt*0.018f, 3UL, s1, + 1000ul); + aprsstr_Append(s, 1000ul, s1, 1000ul); + aprsstr_Append(s, 1000ul, "MByte", 6ul); + } + useri_killmenuid(16UL); + if (maptool_mappack.needcnt>0UL) { + useri_textautomenu(-3L, 0L, 16UL, 0UL, 'r', s, 1000ul, " Start D\ +ownload", 23ul, "\242", 2ul); + } + else useri_textautosize(-3L, 0L, 16UL, 0UL, 'b', s, 1000ul); +} /* end MapPackage() */ + + +static void zoomtomarks(struct aprspos_POSITION mpos, + struct aprspos_POSITION clickpos) +{ + float h; + if (aprspos_posvalid(mpos)) { + if (!aprspos_posvalid(clickpos)) clickpos = mpos; + if (mpos.latclickpos.long0) { + h = mpos.long0; + mpos.long0 = clickpos.long0; + clickpos.long0 = h; + } + mapzoom(mpos, clickpos, (uint32_t)useri_conf2int(useri_fMAXZOOM, 0UL, + 1L, 18L, 18L), 1); + } +} /* end zoomtomarks() */ + +#define aprsmap_TOSMALL 5 + + +static void zoomtosquare(void) +{ + struct aprspos_POSITION p2; + struct aprspos_POSITION p1; + if (aprsdecode_click.zoomtox>=0L && (labs(aprsdecode_click.x-aprsdecode_click.zoomtox) + >5L || labs(aprsdecode_click.y-aprsdecode_click.zoomtoy)>5L)) + { + maptool_xytodeg((float)aprsdecode_click.x, + (float)aprsdecode_click.y, &p1); + maptool_xytodeg((float)aprsdecode_click.zoomtox, + (float)aprsdecode_click.zoomtoy, &p2); + zoomtomarks(p1, p2); + } + aprsdecode_click.zoomtox = -1L; /* zoom done */ +} /* end zoomtosquare() */ + +#define aprsmap_TEXTH 9 + + +static void highlight(void) +{ + uint32_t entc; + int32_t texth; + struct aprsdecode_CLICKOBJECT hoverobj; + struct aprsdecode_OPHIST * anonym; + entc = aprsdecode_click.entries; + if (entc>0UL) { + --entc; + if (aprsdecode_click.table[entc].opf) { + texth = (int32_t)(aprsdecode_lums.fontysize-3UL); + { /* with */ + struct aprsdecode_OPHIST * anonym = aprsdecode_click.table[entc] + .opf; + if ((int32_t)abs(anonym->textpos-anonym->valuepos)textposvaluepos) { + anonym->valuepos = (signed char)((int32_t) + anonym->textpos+texth); + } + else { + anonym->valuepos = (signed char)((int32_t) + anonym->textpos-texth); + } + } + } + if ((aprsdecode_click.table[entc] + .typf==aprsdecode_tSYMBOL || aprsdecode_click.table[entc] + .typf==aprsdecode_tTEXT) + || aprsdecode_click.table[entc].typf==aprsdecode_tDEGREE) { + symbols(aprsdecode_click.table[entc].opf, 0, 1, &hoverobj); + text(aprsdecode_click.table[entc].opf, 0, 1, 1, 1); + } + else if ((aprsdecode_click.table[entc] + .typf==aprsdecode_tOBJECT || aprsdecode_click.table[entc] + .typf==aprsdecode_tOBJECTTEXT) + || aprsdecode_click.table[entc].typf==aprsdecode_tDEGREEOBJ) { + symbols(aprsdecode_click.table[entc].opf, 1, 1, &hoverobj); + text(aprsdecode_click.table[entc].opf, 1, 1, 1, 1); + } + else if ((aprsdecode_click.table[entc] + .typf==aprsdecode_tTRACK || aprsdecode_click.table[entc] + .typf==aprsdecode_tRFPATH) + || aprsdecode_click.table[entc].typf==aprsdecode_tKMH) { + tracks(image, aprsdecode_click.table[entc].opf, 1, + X2C_max_longcard); + symbols(aprsdecode_click.table[entc].opf, 0, 1, &hoverobj); + text(aprsdecode_click.table[entc].opf, 0, 1, 1, 1); + } + } + } +/* + click.table[entc].opf^.tracklited:=TRUE; +*/ +} /* end highlight() */ + + +static void screenshot(void) +{ + char hh[1000]; + char h[1000]; + char s[1000]; + char c; + uint32_t n; + uint32_t j; + uint32_t i; + int32_t ok0; + useri_confstr(useri_fFOTOFN, s, 1000ul); + s[999U] = 0; + memcpy(h,s,1000u); + i = 0UL; + while (s[i] && s[i]!='%') ++i; + if (s[i]=='%') { + if (s[i+1UL]=='t') { + /* insert date in filename */ + s[i] = 0; + aprsstr_DateToStr(osic_time()+useri_localtime(), hh, 1000ul); + n = 0UL; + while (hh[n]) { + if ((uint8_t)hh[n]<'0' || (uint8_t)hh[n]>'9') hh[n] = '-'; + ++n; + } + aprsstr_Append(s, 1000ul, hh, 1000ul); + i += 2UL; + while (h[i]) { + aprsstr_Append(s, 1000ul, (char *) &h[i], 1u/1u); + ++i; + } + } + else if (s[i+1UL]=='n') { + /* insert serial number until new file */ + n = 0UL; + do { + s[i] = (char)((n/100UL)%10UL+48UL); + s[i+1UL] = (char)((n/10UL)%10UL+48UL); + s[i+2UL] = (char)(n%10UL+48UL); + s[i+3UL] = 0; + j = i+2UL; + while (h[j]) { + aprsstr_Append(s, 1000ul, (char *) &h[j], 1u/1u); + ++j; + } + ++n; + } while (!(n>999UL || !osi_Exists(s, 1000ul))); + } + } + if (s[0]) { + useri_killallmenus(); /* dump panorama image pointer */ + if (useri_panoimage) { + ok0 = maptool_saveppm(s, 1000ul, useri_panoimage, + (int32_t)((useri_panoimage->Len1-1)+1UL), + (int32_t)((useri_panoimage->Len0-1)+1UL)); + } + else { + ok0 = maptool_saveppm(s, 1000ul, image, maptool_xsize, + maptool_ysize); + } + if (ok0<0L) { + aprsstr_Append(s, 1000ul, " write error", 13ul); + c = 'e'; + } + else { + aprsstr_Append(s, 1000ul, " saved", 7ul); + c = 'b'; + } + useri_textautosize(0L, 0L, 6UL, 0UL, c, s, 1000ul); + } + else { + useri_textautosize(0L, 0L, 6UL, 0UL, 'e', "\012no filename\012", 14ul); + } +} /* end screenshot() */ + +typedef uint32_t sCHGEN[2]; + +static sCHGEN aprsmap_CHGEN[13] = {{0xA318C62EUL,0x00000003UL} + ,{0x884214C4UL,0x00000003UL},{0xC444422EUL,0x00000007UL} + ,{0xA107420EUL,0x00000003UL},{0x11F4A521UL,0x00000002UL} + ,{0xA3083C3FUL,0x00000003UL},{0xA3178444UL,0x00000003UL} + ,{0x8422221FUL,0x00000000UL},{0xA317462EUL,0x00000003UL} + ,{0xA10F462EUL,0x00000003UL},{0x40000000UL,0x00000000UL} + ,{0x02000400UL,0x00000000UL},{0x00000000UL,0x00000000UL}}; + +#define aprsmap_POSX 4 + +#define aprsmap_POSY 18 + +#define aprsmap_dimmlev 51200.0 + +static sCHGEN _cnst3[13] = {{0xA318C62EUL,0x00000003UL} + ,{0x884214C4UL,0x00000003UL},{0xC444422EUL,0x00000007UL} + ,{0xA107420EUL,0x00000003UL},{0x11F4A521UL,0x00000002UL} + ,{0xA3083C3FUL,0x00000003UL},{0xA3178444UL,0x00000003UL} + ,{0x8422221FUL,0x00000000UL},{0xA317462EUL,0x00000003UL} + ,{0xA10F462EUL,0x00000003UL},{0x40000000UL,0x00000000UL} + ,{0x02000400UL,0x00000000UL},{0x00000000UL,0x00000000UL}}; + +static void drawtime(maptool_pIMAGE img, uint32_t t, int32_t fast) +{ + char s[32]; + uint32_t ch; + struct aprsdecode_COLTYP col; + uint32_t l; + uint32_t px; + uint32_t y; + uint32_t x; + uint32_t i; + float lum; + struct maptool_PIX * anonym; + uint32_t tmp; + aprsstr_DateToStr(t+useri_localtime(), s, 32ul); + s[16U] = 0; /* strip off seconds */ + if (fast<0L) fast = 0L; + else if (fast>200L) fast = 200L; + fast = fast*4L; + col.r = 1000UL; + col.g = (uint32_t)(1000L-fast); + col.b = (uint32_t)(200L+fast); + l = 0UL; + i = 0UL; + px = 4UL; + while ((uint8_t)s[i]>0) { + ch = (uint32_t)(uint8_t)s[i]; + if (ch>=48UL && ch<=57UL) ch -= 48UL; + else if (ch==46UL) ch = 10UL; + else if (ch==58UL) ch = 11UL; + else ch = 12UL; + if (ch<=12UL) { + s[l] = (char)ch; + ++l; + } + if (ch<=9UL) px += 12UL; + else px += 5UL; + ++i; + } + for (y = 19UL; y>=3UL; y--) { + tmp = px; + x = 4UL; + if (x<=tmp) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(x)*img->Len0+y]; + lum = (float)((uint32_t)anonym->r*87UL+(uint32_t) + anonym->g*140UL+(uint32_t)anonym->b*28UL); + if (lum>51200.0f) { + lum = X2C_DIVR(51200.0f,lum); + anonym->r = (uint16_t)aprsdecode_trunc((float) + anonym->r*lum); + anonym->g = (uint16_t)aprsdecode_trunc((float) + anonym->g*lum); + anonym->b = (uint16_t)aprsdecode_trunc((float) + anonym->b*lum); + } + } + if (x==tmp) break; + } /* end for */ + } /* end for */ + px = 4UL; + i = 0UL; + while (i0UL) { + pf = aprsdecode_click.table[aprsdecode_click.selected].pff0; + if (pf && aprspos_posvalid(pf->vardat->pos)) { + oldpos = pf->vardat->pos; + maptool_xytodeg((float)aprsdecode_click.x, + (float)aprsdecode_click.y, &clickpos); + d0 = aprspos_distance(clickpos, pf->vardat->pos); + /*WrInt(trunc(d0*1000.0), 10); WrLn; */ + for (;;) { + pf = pf->next; + if (pf==0) break; + if (aprspos_posvalid(pf->vardat->pos) + && (pf->vardat->pos.lat!=oldpos.lat || pf->vardat->pos.long0!=oldpos.long0) + ) { + d1 = aprspos_distance(clickpos, pf->vardat->pos); + /*WrInt(trunc(d1*1000.0), 15);WrInt(trunc(d0*1000.0), 15); + WrLn; */ + if (d1d0) break; + } + } + } + } +} /* end nearwaypoint() */ + + +static void clickdelwaypoint(void) +{ + char s[101]; + struct aprsdecode_CLICKOBJECT * anonym; + nearwaypoint(); + { /* with */ + struct aprsdecode_CLICKOBJECT * anonym = &aprsdecode_click.table[0UL]; + aprsdecode_delwaypoint(anonym->opf, &anonym->pff0); + aprsstr_Assign(s, 101ul, anonym->opf->call, 9ul); + aprsstr_Append(s, 101ul, " waypoint Deleted", 18ul); + useri_say(s, 101ul, 4UL, 'r'); + } +} /* end clickdelwaypoint() */ + +#define aprsmap_LF "\012" + + +static int32_t flo(short c) +{ + if (c<=1023) return (int32_t)(uint32_t)(uint8_t)gammatab[c]; + else return 255L; + return 0; +} /* end flo() */ + + +static void savevideo420(maptool_pIMAGE img, char fn[], + uint32_t fn_len, char format, float * bytecnt) +{ + int32_t y; + int32_t x; + int32_t bb; + int32_t gg; + int32_t rr; + int32_t ww; + uint32_t pb; + uint32_t pr; + uint32_t pw; + char s[256]; + char h[256]; + struct maptool_PIX * anonym; + struct maptool_PIX * anonym0; + struct maptool_PIX * anonym1; + struct maptool_PIX * anonym2; + struct maptool_PIX * anonym3; + int32_t tmp; + X2C_PCOPY((void **)&fn,fn_len); + if (!osic_FdValid(videofd)) { + /* + videofd:=Create(fn); + */ + if (osi_Exists(fn, fn_len)) videofd = osi_OpenWrite(fn, fn_len); + else videofd = osi_OpenWrite(fn, fn_len); + if (!osic_FdValid(videofd)) goto label; + if (format=='M') { + strncpy(h,"YUV4MPEG2 C420jpeg W",256u); + aprsstr_IntToStr(maptool_xsize, 1UL, s, 256ul); + aprsstr_Append(h, 256ul, s, 256ul); + aprsstr_Append(h, 256ul, " H", 3ul); + aprsstr_IntToStr(maptool_ysize, 1UL, s, 256ul); + aprsstr_Append(h, 256ul, s, 256ul); + aprsstr_Append(h, 256ul, " F25000000:1000000 Ip\012", 23ul); + osi_WrBin(videofd, (char *)h, 256u/1u, aprsstr_Length(h, 256ul)); + } + } + if (vidbuf==0) { + osic_alloc((char * *) &vidbuf, + (uint32_t)((maptool_xsize*maptool_ysize*3L)/2L)); + useri_debugmem.req = (uint32_t)((maptool_xsize*maptool_ysize*3L)/2L); + useri_debugmem.screens += useri_debugmem.req; + if (vidbuf==0) Error("video buffer alloc", 19ul); + } + if (format=='M') { + strncpy(h,"FRAME\012",256u); + osi_WrBin(videofd, (char *)h, 256u/1u, 6UL); + } + pw = 0UL; + pb = (uint32_t)(maptool_xsize*maptool_ysize); + pr = pb+pb/4UL; + for (y = maptool_ysize-1L; y>=0L; y--) { + tmp = maptool_xsize-1L; + x = 0L; + if (x<=tmp) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(x)*img->Len0+y]; + if (format=='M') { + vidbuf[pw] = (char)flo((short)(((uint32_t) + anonym->r*76UL+(uint32_t)anonym->g*150UL+(uint32_t) + anonym->b*29UL)/256UL)); + } + else { + vidbuf[pw] = (char)((flo((short)(((uint32_t) + anonym->r*76UL+(uint32_t)anonym->g*150UL+(uint32_t) + anonym->b*29UL)/256UL))*219L)/256L+16L); + } + ++pw; + } + if ((y&1) && (x&1)) { + { /* with */ + struct maptool_PIX * anonym0 = &img->Adr[(x-1L)*img->Len0+y]; + rr = (int32_t)anonym0->r; + gg = (int32_t)anonym0->g; + bb = (int32_t)anonym0->b; + } + { /* with */ + struct maptool_PIX * anonym1 = &img->Adr[(x)*img->Len0+y]; + rr += (int32_t)anonym1->r; + gg += (int32_t)anonym1->g; + bb += (int32_t)anonym1->b; + } + { /* with */ + struct maptool_PIX * anonym2 = &img->Adr[(x-1L) + *img->Len0+(y-1L)]; + rr += (int32_t)anonym2->r; + gg += (int32_t)anonym2->g; + bb += (int32_t)anonym2->b; + } + { /* with */ + struct maptool_PIX * anonym3 = &img->Adr[(x)*img->Len0+(y-1L) + ]; + rr += (int32_t)anonym3->r; + gg += (int32_t)anonym3->g; + bb += (int32_t)anonym3->b; + } + rr = flo((short)(rr/4L)); + gg = flo((short)(gg/4L)); + bb = flo((short)(bb/4L)); + ww = (rr*76L+gg*150L+bb*29L)/256L; + rr = ((rr-ww)*145L)/256L+128L; + if (rr<0L) rr = 0L; + else if (rr>255L) rr = 255L; + bb = ((bb-ww)*182L)/256L+128L; + if (bb<0L) bb = 0L; + else if (bb>255L) bb = 255L; + if (format!='M') { + vidbuf[pr] = (char)bb; + vidbuf[pb] = (char)rr; + } + else { + vidbuf[pr] = (char)rr; + vidbuf[pb] = (char)bb; + } + ++pr; + ++pb; + } + if (x==tmp) break; + } /* end for */ + } /* end for */ + osi_WrBin(videofd, (char *)vidbuf, 10000001u/1u, + (uint32_t)((maptool_xsize*maptool_ysize*3L)/2L)); + *bytecnt = *bytecnt+(float)((maptool_xsize*maptool_ysize*3L)/2L); + label:; + X2C_PFREE(fn); +} /* end savevideo420() */ + +/* +PROCEDURE savevideo444(img:pIMAGE; n:CARDINAL); +VAR x,y,p:INTEGER; + buf:ARRAY[0..65535] OF CHAR; + c, yy, rr, gg, bb:REAL; + + PROCEDURE flo(c:CARD16):REAL; + BEGIN + IF c<=HIGH(gammatab) THEN RETURN FLOAT(ORD(gammatab[c])) + ELSE RETURN 255.0 END; + END flo; + +BEGIN + IF NOT FdValid(videofd) THEN RETURN END; + p:=0; + + FOR y:=ysize-1 TO 0 BY -1 DO + FOR x:=0 TO xsize-1 DO + WITH img^[x+y*xsize] DO rr:=flo(r); gg:=flo(g); bb:=flo(b) END; + yy:=rr*0.299 + gg*0.587 +bb*0.114; + buf[p]:=CHR(TRUNC(yy*(219.0/255.0))+16); + INC(p); IF p>HIGH(buf) THEN WrBin(videofd, buf, p); p:=0 END; + + c:=(bb-yy)*0.565+128.0; + IF c<0.0 THEN c:=0.0 ELSIF c>255.9 THEN c:=255.0 END; + buf[p]:=CHR(TRUNC(c)); + INC(p); IF p>HIGH(buf) THEN WrBin(videofd, buf, p); p:=0 END; + + c:=(rr-yy)*0.713+128.0; + IF c<0.0 THEN c:=0.0 ELSIF c>255.9 THEN c:=255.0 END; + buf[p]:=CHR(TRUNC(c)); + INC(p); IF p>HIGH(buf) THEN WrBin(videofd, buf, p); p:=0 END; + + END; + END; + IF p>0 THEN WrBin(videofd, buf, p) END; +END savevideo444; +*/ + +static void wrvidsize(float b) +{ + char s[101]; + aprsstr_FixToStr(X2C_DIVR(b,1.E+6f), 2UL, s, 101ul); + aprsstr_Append(s, 101ul, " MBytes written", 16ul); + useri_say(s, 101ul, 0UL, 'b'); +} /* end wrvidsize() */ + + +static void copy(struct maptool_PIX dest[], uint32_t dest_len, + uint32_t dest_len0, struct maptool_PIX src[], + uint32_t src_len, uint32_t src_len0) +{ + uint32_t x; + uint32_t tmp; + tmp = dest_len-1; + x = 0UL; + if (x<=tmp) for (;; x++) { + X2C_MOVE((char *)(src+(x)*src_len0), + (char *)(dest+(x)*dest_len0), + dest_len0*sizeof(struct maptool_PIX)); + if (x==tmp) break; + } /* end for */ +} /* end copy() */ + + +static char cmpcol(struct aprsdecode_COLTYP c1, + struct aprsdecode_COLTYP c2) +{ + return (c1.r!=c2.r || c1.g!=c2.g) || c1.b!=c2.b; +} /* end cmpcol() */ + + +static void addradio(void) +{ + /* radiation visability map */ + char abort0; + struct aprsdecode_COLTYP c2; + struct aprsdecode_COLTYP c1; + if (aprspos_posvalid(aprsdecode_click.markpos) + || aprspos_posvalid(aprsdecode_click.measurepos)) { + aprsdecode_lums.rf = 0L; + getgeocol(useri_fCOLMARK1, geobri(), 100UL, 0UL, 0UL, &c1); + getgeocol(useri_fCOLMARK2, geobri(), 0UL, 100UL, 0UL, &c2); + if (((((((((((((((((!radio.wasradio || radio.wasaltimap) + || radio.markpos.lat!=aprsdecode_click.markpos.lat) + || radio.markpos.long0!=aprsdecode_click.markpos.long0) + || radio.measurepos.lat!=aprsdecode_click.measurepos.lat) + || radio.measurepos.long0!=aprsdecode_click.measurepos.long0) + || radio.mappos.lat!=aprsdecode_mappos.lat) + || radio.mappos.long0!=aprsdecode_mappos.long0) + || radio.initzoom!=aprsdecode_initzoom) + || radio.finezoom!=aprsdecode_finezoom) + || radio.ant1!=getant(useri_fANT1)) + || radio.ant2!=getant(useri_fANT2)) + || radio.ant3!=getant(useri_fANT3)) || radio.bri!=geobri()) + || radio.contr!=geocontr()) || cmpcol(radio.c1, + c1)) || cmpcol(radio.c2, + c2)) || radio.qual!=(int32_t) + useri_confflags(useri_fSRTMCACHE, 0UL)) { + abort0 = 0; + maptool_clr(rfimg); + if (aprspos_posvalid(aprsdecode_click.markpos)) { + radioimage(rfimg, aprsdecode_click.markpos, 0UL, &abort0); + } + if (!abort0 && aprspos_posvalid(aprsdecode_click.measurepos)) { + radioimage(rfimg, aprsdecode_click.measurepos, + (uint32_t)aprspos_posvalid(aprsdecode_click.markpos), + &abort0); + } + /* IF (lums.map>0) & posvalid(click.measurepos) + & posvalid(click.markpos) THEN makebw(image) END; */ + radio.wasradio = 1; + radio.wasaltimap = 0; + radio.markpos = aprsdecode_click.markpos; + radio.measurepos = aprsdecode_click.measurepos; + radio.mappos = aprsdecode_mappos; + radio.initzoom = aprsdecode_initzoom; + radio.finezoom = aprsdecode_finezoom; + radio.ant1 = getant(useri_fANT1); + radio.ant2 = getant(useri_fANT2); + radio.ant3 = getant(useri_fANT3); + radio.bri = geobri(); + radio.contr = geocontr(); + radio.c1 = c1; + radio.c2 = c2; + radio.qual = (int32_t)useri_confflags(useri_fSRTMCACHE, 0UL); + reliefcolors(rfimg, aprspos_posvalid(aprsdecode_click.measurepos) && aprspos_posvalid(aprsdecode_click.markpos)); + if (abort0) { + useri_textautosize(0L, 0L, 5UL, 2UL, 'r', "radiorange aborted", + 19ul); + closeradio(); + radio.wasradio = 0; + useri_sayonoff("Radiorange Map", 15ul, + aprsdecode_click.withradio); + } + } + if (radio.wasradio) maptool_addmap(image, rfimg); + } +} /* end addradio() */ + +/* simple relieaf map layer */ + +static void altitudemap(void) +{ + aprsdecode_lums.rf = 0L; + if ((((((!radio.wasradio || !radio.wasaltimap) + || radio.mappos.lat!=aprsdecode_mappos.lat) + || radio.mappos.long0!=aprsdecode_mappos.long0) + || radio.initzoom!=aprsdecode_initzoom) + || radio.finezoom!=aprsdecode_finezoom) + || radio.bri!=geobri()) { + maptool_clr(rfimg); + if (maptool_SimpleRelief(rfimg)) { + radio.wasaltimap = 1; + radio.wasradio = 1; + radio.mappos = aprsdecode_mappos; + radio.initzoom = aprsdecode_initzoom; + radio.finezoom = aprsdecode_finezoom; + radio.bri = geobri(); + } + else { + useri_textautosize(0L, 0L, 3UL, 2UL, 'r', "no altitude data found", + 23ul); + } + } + if (radio.wasradio) maptool_addmap(image, rfimg); +} /* end altitudemap() */ + + +static void xytomark(void) +{ + struct aprspos_POSITION pos; + /* xytodeg(VAL(REAL,click.x), VAL(REAL,click.y), pos); */ + maptool_xytodeg((float)useri_xmouse.x, + (float)((int32_t)useri_mainys()-useri_xmouse.y), &pos); + aprstext_setmark1(pos, 1, X2C_max_longint, 0UL); + useri_postoconfig(pos); + aprsdecode_click.waysum = 0.0f; +} /* end xytomark() */ + + +static void xytomark2(void) +{ + struct aprspos_POSITION pos; + maptool_xytodeg((float)useri_xmouse.x, + (float)((int32_t)useri_mainys()-useri_xmouse.y), &pos); + if (aprspos_posvalid(pos)) aprsdecode_click.measurepos = pos; +} /* end xytomark2() */ + + +static void centermouse(char shortcut) +{ + struct aprspos_POSITION pos; + float y1; + float y00; + float x1; + float x0; + aprsdecode_posinval(&pos); + if (shortcut) { + maptool_xytodeg((float)useri_xmouse.x, + (float)((int32_t)useri_mainys()-useri_xmouse.y), &pos); + if ((((aprspos_posvalid(aprsdecode_click.bubblpos) + && maptool_mapxy(aprsdecode_click.bubblpos, &x0, + &y00)>=-1L) && aprspos_posvalid(pos)) && maptool_mapxy(pos, + &x1, &y1)>=-1L) && sqr(x0-x1)+sqr(y00-y1)<25.0f) { + pos = aprsdecode_click.bubblpos; + /* POI is near mouse so use POI position to center */ + } + } + else if ((aprsdecode_click.entries>0UL && aprsdecode_click.table[aprsdecode_click.selected] + .opf) && aprspos_posvalid(aprsdecode_click.table[aprsdecode_click.selected].opf->lastpos) + ) { + pos = aprsdecode_click.table[aprsdecode_click.selected].opf->lastpos; + } + else if (aprspos_posvalid(aprsdecode_click.clickpos)) { + pos = aprsdecode_click.clickpos; + } + if (aprspos_posvalid(pos)) { + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + centerpos(pos, &aprsdecode_mappos); + } +} /* end centermouse() */ + + +static void clicktomark(void) +{ + if ((aprsdecode_click.entries>0UL && aprsdecode_click.table[aprsdecode_click.selected] + .opf) && aprspos_posvalid(aprsdecode_click.table[aprsdecode_click.selected].opf->lastpos) + ) { + aprstext_setmarkalti(aprsdecode_click.table[aprsdecode_click.selected] + .pff0, aprsdecode_click.table[aprsdecode_click.selected].opf, + 1); + } + else { + aprstext_setmark1(aprsdecode_click.clickpos, 1, X2C_max_longint, 0UL); + } +} /* end clicktomark() */ + +#define aprsmap_ADDDELAY 55 + + +static uint32_t slowupdate(void) +/* add image update time on cpu intensiv options */ +{ + return (uint32_t)((aprsdecode_lums.wxcol=='R' || aprsdecode_lums.wxcol=='W') + || aprsdecode_click.withradio)*55UL; +} /* end slowupdate() */ + + +static void addrftracks(char dryrun, char tx) +{ + char clr; + clr = !dryrun; /* clr old image before draw */ + if (tx) mhtracks(aprsdecode_click.mhop, &clr); + else rftracks(aprsdecode_click.mhop, &clr); + if (!(dryrun || clr)) { + /* not dryrun and something drawn */ + radio.wasradio = 0; /* no radiolink data in rfimg now */ + maptool_shine(rfimg, aprsdecode_lums.rfbri); + maptool_addmap(image, rfimg); + } +} /* end addrftracks() */ + +#define aprsmap_QUICKMOV 10 +/* faster if nothing visable moves */ + +#define aprsmap_FASTDELAY 70 +/* delay switching to fast */ + +#define aprsmap_SLOWER 3 +/* steps befor next move switch to slow */ + +#define aprsmap_TRAILER 10 +/* steps at end of move till video end */ + + +static void animate(const aprsdecode_MONCALL singlecall, uint32_t step, + char tofile[], uint32_t tofile_len) +{ + aprsdecode_pOPHIST singleop; + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST pf1; + aprsdecode_pFRAMEHIST pf; + uint8_t efil; + uint32_t fractime; + uint32_t showt; + uint32_t stime; + uint32_t endtime; + uint32_t vtime; + uint32_t nextmov; + int32_t fastdelay; + int32_t fast; + uint32_t ii; + uint32_t skip; + float nomove; + float y; + float x; + struct aprsdecode_COLTYP col; + signed char textpos; + char stop; + char blown; + char mapok; + char dir; + struct aprspos_POSITION ipos; + float iitime; + float itime; + float bytew; + char s1[41]; + char s[41]; + int32_t minalt; + struct aprsdecode_DAT dat1; + struct aprsdecode_DAT dat; + struct aprsdecode_CLICKOBJECT hoverobj; + struct aprsdecode_OPHIST * anonym; + struct aprsdecode_VARDAT * anonym0; + struct aprspos_POSITION * anonym1; + /* interpolate areasymbol form */ + struct aprspos_POSITION * anonym2; + struct aprspos_POSITION * anonym3; + aprsdecode_MONCALL tmp; + X2C_PCOPY((void **)&tofile,tofile_len); + closeradio(); + singleop = aprstext_oppo(singlecall); + if (!pandone) { + findsize(&newpos0, &newpos1, aprsdecode_click.mhop, 'T'); + mapzoom(newpos0, newpos1, (uint32_t)useri_conf2int(useri_fDEFZOOM, + 0UL, 1L, 18L, 14L), 1); + pandone = 1; + maptool_mercator(aprsdecode_mappos.long0, aprsdecode_mappos.lat, + aprsdecode_initzoom, &aprsdecode_inittilex, + &aprsdecode_inittiley, &maptool_shiftx, &maptool_shifty); + } + showt = 0UL; + bytew = 0.0f; + aprsdecode_click.dryrun = 0; + vtime = aprsdecode_systime; /* last whole data time */ + endtime = vtime-(aprsdecode_lums.firstdim+aprsdecode_lums.maxdim); + /* start time minimum */ + stime = endtime; + nomove = movest(500UL)*5.0f; /* min km/s for a moving object */ + if (step==0UL) { + step = aprsdecode_trunc(osic_sqrt(nomove)*(float) + (25L*useri_conf2int(useri_fANIMSPEED, 0UL, 0L, 10000L, + 400L)))+1UL; + } + fastdelay = -useri_conf2int(useri_fVIDEOFAST, 0UL, 0L, 10000L, 0L); + markvisable(*(aprsdecode_MONCALL *)memcpy(&tmp,"",1u)); + op = aprsdecode_ophist0; + maptool_xytodeg((float)maptool_xsize, 0.0f, &ipos); + if (useri_configon(useri_fTRACKFILT)) efil = 0x1U; + else efil = 0x25U; + minalt = useri_conf2int(useri_fALTMIN, 0UL, -10000L, 65535L, -10000L); + stop = 0; + while (op) { + { /* with */ + struct aprsdecode_OPHIST * anonym = op; + anonym->drawhints &= ~0x10U; + if ((0x8U & anonym->drawhints)) { + if ((aprspos_distance(anonym->margin0, + anonym->margin1)>nomove*400.0f && (singleop==0 || op==singleop) + ) && op->sym.tab!='\001') { + /* they will move */ + pf1 = 0; + pf = op->frames; + while (pf) { + if ((pf->nodraw&~efil) + ==0U && aprspos_posvalid(pf->vardat->pos)) { + if (pf1) { + { /* with */ + struct aprsdecode_VARDAT * anonym0 = pf1->vardat; + if ((((((pf1->time0>=stime && aprspos_posvalid(anonym0->pos) + ) && anonym0->pos.long0<=ipos.long0) + && anonym0->pos.lat>=ipos.lat) + && anonym0->pos.long0>=aprsdecode_mappos.long0) + && anonym0->pos.lat<=aprsdecode_mappos.lat) + && aprspos_distance(anonym0->pos, + pf->vardat->pos)>nomove*10.0f) { + /* & (pf^.next<>NIL) + & posvalid(pf^.next^.vardat^.pos) */ + /* moving */ + if (pf->time0>endtime) { + endtime = pf->time0; + /* show till latest mover */ + } + if (pf1->time0time0; /* from 1st mover */ + } + anonym->drawhints |= 0x10U; + } + } + } + pf1 = pf; + } + pf = pf->next; + } + /* INCL(drawhints, MOVES); */ + anonym->drawhints &= ~0x8U; + } + } + /* IF lasttime>endtime THEN endtime:=lasttime END; + (* show till latest mover *) */ + /* IF (frames<>NIL) & (frames^.timenext; + } + } + aprsdecode_lums.moving = 1; /* make not moving darker */ + if (aprsdecode_lums.map>0L) { + maptool_loadmap(image, aprsdecode_inittilex, aprsdecode_inittiley, + aprsdecode_initzoom, aprsdecode_finezoom, maptool_shiftx, + maptool_shifty, &mapok, &blown, + useri_configon(useri_fALLOWEXP), 0); + } + else maptool_clr(image); + /* + IF lums.obj>0 THEN + symbols(ophist, TRUE, FALSE); + text(ophist, TRUE, FALSE, FALSE); + END; + */ + if (aprsdecode_lums.sym>0L) symbols(aprsdecode_ophist0, 0, 0, &hoverobj); + if (aprsdecode_lums.text>0L) { + text(aprsdecode_ophist0, 0, 0, 0, 1); /* first draw dimmed */ + text(aprsdecode_ophist0, 1, 0, 0, 1); /* overdraw dimmed */ + } + maptool_cc(image, vtime, endtime); + op = aprsdecode_ophist0; + while (op) { + op->drawhints &= ~0x8U; /* now use only mover(s) */ + op = op->next; + } + aprsdecode_lums.moving = 0; + videofd = -1L; + if (vtime>stime) stime = vtime; + /* icnt:=0; */ + fast = fastdelay; + skip = 0UL; + fractime = 0UL; + do { + if (skip==0UL) { + /* + MOVE(image, rfimg, SIZE(PIX)*xsize*ysize); + */ + copy(rfimg->Adr, rfimg->Len1, rfimg->Len0, image->Adr, image->Len1, + image->Len0); + if (aprsdecode_lums.track>1L) { + tracks(rfimg, aprsdecode_ophist0, 0, vtime); + } + } + op = aprsdecode_ophist0; + nextmov = endtime; + while (op) { + if ((0x10U & op->drawhints)) { + pf = 0; + pf1 = op->frames; + while (pf1 && vtime>pf1->time0) { + if ((pf1->nodraw&~efil)==0U) pf = pf1; + pf1 = pf1->next; + } + while (pf1 && (pf1->nodraw&~efil)!=0U) pf1 = pf1->next; + if (pf) { + if ((pf1 && pf1->time0>pf->time0) && vtime>pf->time0) { + /* interpolate waypoints */ + itime = X2C_DIVR((float)(vtime-pf->time0)+(float) + fractime*0.04f,(float)(pf1->time0-pf->time0)); + /* IF itime>1.0 THEN itime:=1.0 ELSIF itime<0.0 THEN itime:=0.0 END; + */ + iitime = 1.0f-itime; + ipos.long0 = pf->vardat->pos.long0*iitime+pf1->vardat->pos.long0*itime; + ipos.lat = pf->vardat->pos.lat*iitime+pf1->vardat->pos.lat*itime; + dir = pf->vardat->pos.long0>pf1->vardat->pos.long0; + /* mirror symbol on long deg */ + } + else { + /* end of track */ + ipos = pf->vardat->pos; + dir = (0x1U & op->drawhints)!=0; + itime = (-1.0f); + } + if (maptool_mapxy(ipos, &x, + &y)>=0L && maptool_vistime(pf->time0)) { + if (skip==0UL) { + if (op->poligon && aprsdecode_Decode(pf->vardat->raw, + 500ul, &dat)>=0L) { + if ((itime>0.0f && aprsdecode_Decode(pf1->vardat->raw, + 500ul, &dat1)>=0L) && dat.multiline.size==dat1.multiline.size) { + /* interpolate poligon form */ + ii = 0UL; + while (iilat = anonym1->lat*iitime+dat1.multiline.vec[ii] + .lat*itime; + anonym1->long0 = anonym1->long0*iitime+dat1.multiline.vec[ii] + .long0*itime; + } + ++ii; + } + } + maptool_drawpoligon(rfimg, ipos, dat.multiline, + dat.symt, dat.sym, (uint32_t)(aprsdecode_lums.sym/4L)); + } + else if (op->areasymb.typ && aprsdecode_Decode(pf->vardat->raw, + 500ul, &dat)>=0L) { + /* decode each frame if form changed */ + if (itime>0.0f && aprsdecode_Decode(pf1->vardat->raw, + 500ul, &dat1)>=0L) { + { /* with */ + struct aprspos_POSITION * anonym2 = &dat.areasymb.dpos; + + anonym2->lat = anonym2->lat*iitime+dat1.areasymb.dpos.lat*itime; + anonym2->long0 = anonym2->long0*iitime+dat1.areasymb.dpos.long0*itime; + } + } + maptool_drawareasym(rfimg, ipos, dat.areasymb, + (uint32_t)(aprsdecode_lums.obj/4L)); + } + else { + maptool_drawsym(rfimg, op->sym.tab, op->sym.pic, dir, + x, y, (uint32_t)(aprsdecode_lums.sym/4L)); + if (op->sym.pic=='@' + && aprsdecode_Decode(pf->vardat->raw, 500ul, &dat)>=0L) { + if (itime>0.0f && aprsdecode_Decode(pf1->vardat->raw, + 500ul, &dat1)>=0L) { + /* interpolate storm areas */ + { /* with */ + struct aprspos_POSITION * anonym3 = &dat.areasymb.dpos; + + anonym3->lat = anonym3->lat*iitime+dat1.areasymb.dpos.lat*itime; + anonym3->long0 = anonym3->long0*iitime+dat1.areasymb.dpos.long0*itime; + } + stormcicle(rfimg, ipos, + dat.wx.radiushurr*iitime+dat1.wx.radiushurr*itime, + dat.wx.radiusstorm*iitime+dat1.wx.radiusstorm*itime, + dat.wx.wholegale*iitime+dat1.wx.wholegale*itime, + (uint32_t)(aprsdecode_lums.sym/4L)); + } + } + } + if (useri_configon(useri_fKMH) + && aprsdecode_Decode(pf->vardat->raw, 500ul, &dat)>=0L) { + s[0] = 0; + if (dat.speed>0UL && dat.speed<2147483647UL) { + useri_confstr(useri_fKMH, s1, 41ul); + if (s1[0U]) { + aprsstr_IntToStr((int32_t) + aprsdecode_trunc((float)dat.speed*1.852f), 1UL, s, 41ul); + aprsstr_Append(s, 41ul, s1, 41ul); + } + } + if (dat.altitude=minalt) + { + if (s[0U]) { + aprsstr_Append(s, 41ul, " ", 2ul); + } + aprsstr_IntToStr(dat.altitude, 1UL, s1, 41ul); + aprsstr_Append(s, 41ul, s1, 41ul); + aprsstr_Append(s, 41ul, "m", 2ul); + } + if (s[0U]) { + maptool_Colset(&col, 'Y'); + textpos = -8; + maptool_drawstr(rfimg, s, 41ul, x+7.0f, + y-(float)(aprsdecode_lums.fontysize+3UL), + (uint32_t)aprsdecode_lums.text, 0UL, col, &textpos, 0UL, 1, + aprsdecode_click.dryrun); + } + } + maptool_Colset(&col, 'W'); + textpos = 0; + maptool_drawstr(rfimg, op->call, 9ul, x+8.0f, + y-(float)(aprsdecode_lums.fontysize/2UL), + (uint32_t)aprsdecode_lums.text, 0UL, col, &textpos, 0UL, 1, + aprsdecode_click.dryrun); + } + if ((pf1 && X2C_DIVR(aprspos_distance(pf->vardat->pos, + pf1->vardat->pos), + (float)(pf1->time0-pf->time0))>nomove) + && pf1->time0time0; + } + } + } + op = op->next; + } + if (vtime+step*3ULFASTDELAY*/ + if (endtime>stime) { + col.r = 100UL; + col.g = 800UL; + col.b = 1000UL; + maptool_area(rfimg, 0L, 1L, + (int32_t)aprsdecode_trunc(X2C_DIVR((float) + maptool_xsize*(float)(vtime-stime), + (float)(endtime-stime))), 3L, col, 0); + } + if (tofile[0UL]) { + savevideo420(rfimg, tofile, tofile_len, 'M', &bytew); + /* INC(icnt); */ + if (showt!=osic_time()) { + showt = osic_time(); + wrvidsize(bytew); + useri_redraw(rfimg); + } + xosi_Eventloop(1UL); + } + else { + useri_refresh = 1; + for (;;) { + /* while stop pressed */ + if (useri_refresh) useri_redraw(rfimg); + aprsdecode_lums.actfps = (int32_t)step; + /* for faster/slower button */ + xosi_Eventloop(1000UL); + step = (uint32_t)aprsdecode_lums.actfps; + if (aprsdecode_click.cmd==' ') { + if (stop) { + stop = 0; + aprsdecode_click.cmd = 'A'; + } + else { + stop = 1; + aprsdecode_click.cmd = 'v'; + } + } + else if (aprsdecode_click.cmd!='v') stop = 0; + if (!stop && aprsdecode_click.cmd!='v') break; + aprsdecode_realtime = osic_time(); + } + } + if (fast>250L) fast = 250L; + if (fast>0L) skip = (uint32_t)(fast/25L); + else skip = 0UL; + } + else --skip; + fractime += step; + vtime += fractime/25UL; + fractime = fractime%25UL; + /* + IF fast>FASTDELAY THEN INC(vtime, step*STEPMUL) ELSE INC(vtime, + step) END; + */ + aprsdecode_realtime = osic_time(); + } while (!((vtime>endtime+(step*10UL)/25UL || (aprsdecode_click.cmd!='A' && aprsdecode_click.cmd!='a') && aprsdecode_click.cmd!='\312') || useri_newxsize>0UL)); + if (osic_FdValid(videofd)) { + osic_Close(videofd); + useri_say("map.y4m Saved", 14ul, 0UL, 'b'); + } + if (vidbuf) { + useri_debugmem.screens -= (uint32_t)((maptool_xsize*maptool_ysize*3L) + /2L); + osic_free((char * *) &vidbuf, + (uint32_t)((maptool_xsize*maptool_ysize*3L)/2L)); + vidbuf = 0; + } + X2C_PFREE(tofile); +} /* end animate() */ + + +static void makeimage(char dryrun) +{ + char mapok; + struct aprspos_POSITION mpos; + struct aprsdecode_CLICKOBJECT hoverobj; + hoverobj.opf = 0; + markvisable(aprsdecode_click.mhop); + if (aprsdecode_click.mhop[0UL] && mhtx==aprsmap_OPHEARD) { + findsize(&newpos0, &newpos1, aprsdecode_click.mhop, 'H'); + } + else if (aprsdecode_click.mhop[0UL] && mhtx==aprsmap_OPOBJ) { + findsize(&newpos0, &newpos1, aprsdecode_click.mhop, 'O'); + } + else if (aprsdecode_lums.rf>1L) { + findsize(&newpos0, &newpos1, aprsdecode_click.mhop, 'R'); + } + else findsize(&newpos0, &newpos1, aprsdecode_click.mhop, 'T'); + if (!pandone) { + mapzoom(newpos0, newpos1, (uint32_t)useri_conf2int(useri_fDEFZOOM, + 0UL, 1L, 18L, 14L), 1); + pandone = 1; + aprsdecode_lums.moving = 0; + } + maptool_mercator(aprsdecode_mappos.long0, aprsdecode_mappos.lat, + aprsdecode_initzoom, &aprsdecode_inittilex, + &aprsdecode_inittiley, &maptool_shiftx, &maptool_shifty); + aprsdecode_click.dryrun = dryrun; + if (dryrun) { + aprsdecode_click.min0 = 8L; + aprsdecode_click.entries = 0UL; + aprsdecode_click.pf0 = 0; + } + else if (aprsdecode_lums.map>0L) { + maptool_loadmap(image, aprsdecode_inittilex, aprsdecode_inittiley, + aprsdecode_initzoom, aprsdecode_finezoom, maptool_shiftx, + maptool_shifty, &mapok, &useri_isblown, + useri_configon(useri_fALLOWEXP), 0); + /* IF maploadpid.runs & NOT mapok THEN */ + if (!mapok && useri_configon(useri_fGETMAPS)) { + tooltips('B'); + maptrys = 30UL; + } + else maptrys = 0UL; + } + else maptool_clr(image); + if (aprsdecode_lums.wxcol=='R' || aprsdecode_lums.wxcol=='W') { + /* "w" is show wx stations only */ + if (!dryrun) { + closeradio(); + if (aprsdecode_lums.map>0L) maptool_makebw(image); + maptool_clr(rfimg); + if (aprsdecode_lums.wxcol=='R') { + metercolor('R'); + maptool_addmap(image, rfimg); + maptool_clr(rfimg); + metercolor('1'); + } + else metercolor('T'); + maptool_addmap(image, rfimg); + } + } + else if ((aprsdecode_lums.rf>1L && aprsdecode_click.mhop[0UL]) + && mhtx==aprsmap_OPSENT) addrftracks(dryrun, 0); + else if (aprsdecode_click.mhop[0UL] && mhtx==aprsmap_OPHEARD) { + addrftracks(dryrun, 1); + } + if (aprsdecode_lums.moving) { + text(aprsdecode_ophist0, 0, 0, 0, 1); + if (aprsdecode_lums.track>1L) { + tracks(image, aprsdecode_ophist0, 0, X2C_max_longcard); + } + symbols(aprsdecode_ophist0, 1, 0, &hoverobj); + if (aprsdecode_lums.sym>0L) { + symbols(aprsdecode_ophist0, 0, 0, &hoverobj); + } + text(aprsdecode_ophist0, 1, 0, 0, 1); + } + else { + if (aprsdecode_lums.track>1L) { + tracks(image, aprsdecode_ophist0, 0, X2C_max_longcard); + } + if (aprsdecode_lums.obj>0L) { + symbols(aprsdecode_ophist0, 1, 0, &hoverobj); + text(aprsdecode_ophist0, 1, 1, 0, 1); + } + if (aprsdecode_lums.sym>0L) { + symbols(aprsdecode_ophist0, 0, 0, &hoverobj); + } + if (aprsdecode_lums.text>0L || aprsdecode_lums.wxcol) { + text(aprsdecode_ophist0, 0, 1, 0, 1); + } + } + if (!dryrun) { + if (aprsdecode_click.marktime==0UL || aprsdecode_click.marktime+10UL>aprsdecode_realtime) + { + maptool_setmark(image, aprsdecode_click.markpos, + aprsdecode_click.marktime==0UL); + } + drawsquer(image); + if (!aprsdecode_click.withradio || aprsdecode_click.altimap) { + mpos = aprsdecode_click.measurepos; + if ((!aprspos_posvalid(mpos) && hoverobj.opf) + && useri_configon(useri_fGEOPROFIL)) { + mpos = hoverobj.opf->lastpos; + } + measureline(image, aprsdecode_click.markpos, mpos, + aprsdecode_click.markalti); + } + maptool_cc(image, osic_time(), 0UL); + if (useri_configon(useri_fRULER)) maptool_ruler(image); + drawzoomsquer(image); + if (aprsdecode_click.withradio) { + if (aprsdecode_click.altimap) altitudemap(); + else addradio(); + } + else radio.wasradio = 0; + } + else { + nearwaypoint(); + aprsdecode_click.dryrun = 0; + if (aprsdecode_click.mhop[0UL]==0) highlight(); + } + if (aprsdecode_lums.wxcol=='w') { + useri_say("Wx Stations (exit with ESC)", 28ul, 10UL, 'g'); + } + else if (aprsdecode_lums.wxcol=='W') { + useri_say("Temperatue Map (exit with ESC)", 31ul, 5UL, 'g'); + } + else if (aprsdecode_lums.wxcol=='R') { + useri_say("Rain Map (exit with ESC)", 25ul, 5UL, 'g'); + } + if (hoverobj.opf) { + useri_hoverinfo(hoverobj); + hoverobj.opf = 0; + } + if (useri_beaconediting && useri_beaconed) maptool_drawpoliobj(image); + useri_refresh = 1; + lastxupdate = aprsdecode_realtime; +} /* end makeimage() */ + + +static void MainEvent(void) +{ + char ch; + char cfgs[21]; + char void0; + char menu; + char raw; + menu = 0; + raw = 0; + aprsdecode_realtime = osic_time(); + if (!aprsdecode_lums.logmode) aprsdecode_systime = aprsdecode_realtime; + if (aprsdecode_realtime1UL && aprsdecode_click.entries<9UL) { + /* rotate find order */ + cycleorder = (cycleorder+1UL)%aprsdecode_click.entries; + aprsdecode_click.table[9UL] = aprsdecode_click.table[0UL]; + aprsdecode_click.table[0UL] = aprsdecode_click.table[cycleorder]; + aprsdecode_click.table[cycleorder] = aprsdecode_click.table[9UL]; + } + mestxt[0U] = 0; + maptool_xytodeg((float)aprsdecode_click.x, + (float)aprsdecode_click.y, &aprsdecode_click.clickpos); + if (aprsdecode_click.entries>=1UL) aprsdecode_lums.errorstep = 0; + aprsdecode_click.cmd = 0; + if (xosi_Shift) aprsdecode_click.cmd = 'X'; + else if (aprsdecode_click.entries==1UL) { + if (aprsdecode_click.table[0UL] + .typf==aprsdecode_tSYMBOL || aprsdecode_click.table[0UL] + .typf==aprsdecode_tOBJECT) { + if (aprsdecode_click.table[0UL].opf->lastinftyp>=100U) { + /* wx symbol */ + useri_confstr(useri_fCLICKWXSYM, cfgs, 21ul); + if (aprsstr_InStr(cfgs, 21ul, ".", 2ul)>=0L) { + aprsdecode_click.cmd = '.'; + } + else if (aprsstr_InStr(cfgs, 21ul, "=", 2ul)>=0L) { + aprsdecode_click.cmd = '='; + } + else if (aprsstr_InStr(cfgs, 21ul, "H", 2ul)>=0L) { + aprsdecode_click.cmd = 'h'; + } + else if (aprsstr_InStr(cfgs, 21ul, "C", 2ul)>=0L) { + aprsdecode_click.cmd = 'c'; + } + } + else { + /* not wx symbol */ + useri_confstr(useri_fCLICKSYM, cfgs, 21ul); + if (aprsstr_InStr(cfgs, 21ul, ".", 2ul)>=0L) { + aprsdecode_click.cmd = '.'; + } + else if (aprsstr_InStr(cfgs, 21ul, "=", 2ul)>=0L) { + aprsdecode_click.cmd = '='; + } + else if (aprsstr_InStr(cfgs, 21ul, "H", 2ul)>=0L) { + aprsdecode_click.cmd = 'h'; + } + else if (aprsstr_InStr(cfgs, 21ul, "C", 2ul)>=0L) { + aprsdecode_click.cmd = 'c'; + } + else if (aprsstr_InStr(cfgs, 21ul, "A", 2ul)>=0L) { + aprsdecode_click.cmd = 'a'; + } + else if (aprsstr_InStr(cfgs, 21ul, "X", 2ul)>=0L) { + aprsdecode_click.cmd = 'x'; + } + else if (aprsstr_InStr(cfgs, 21ul, "Y", 2ul)>=0L) { + aprsdecode_click.cmd = 'y'; + } + } + } + else if (aprsdecode_click.table[0UL].typf==aprsdecode_tTEXT) { + useri_confstr(useri_fCLICKTEXT, cfgs, 21ul); + if (aprsstr_InStr(cfgs, 21ul, ".", 2ul)>=0L) { + aprsdecode_click.cmd = '.'; + } + else if (aprsstr_InStr(cfgs, 21ul, "=", 2ul)>=0L) { + aprsdecode_click.cmd = '='; + } + else if (aprsstr_InStr(cfgs, 21ul, "H", 2ul)>=0L) { + aprsdecode_click.cmd = 'h'; + } + else if (aprsstr_InStr(cfgs, 21ul, "C", 2ul)>=0L) { + aprsdecode_click.cmd = 'c'; + } + else if (aprsstr_InStr(cfgs, 21ul, "A", 2ul)>=0L) { + aprsdecode_click.cmd = 'a'; + } + else if (aprsstr_InStr(cfgs, 21ul, "X", 2ul)>=0L) { + aprsdecode_click.cmd = 'x'; + } + else if (aprsstr_InStr(cfgs, 21ul, "Y", 2ul)>=0L) { + aprsdecode_click.cmd = 'y'; + } + } + else if (aprsdecode_click.table[0UL].typf==aprsdecode_tTRACK) { + useri_confstr(useri_fCLICKTRACK, cfgs, 21ul); + if (aprsdecode_click.mhop[0UL] + && X2C_STRCMP(aprsdecode_click.mhop,9u, + aprsdecode_click.table[0UL].opf->call,9u)==0) { + /* in single user mode and click same track */ + if (aprsstr_InStr(cfgs, 21ul, "q", 2ul)>=0L) { + aprsdecode_click.cmd = 'q'; + } + else if (aprsstr_InStr(cfgs, 21ul, "A", 2ul)>=0L) { + aprsdecode_click.cmd = 'a'; + } + } + else if (aprsstr_InStr(cfgs, 21ul, ".", 2ul)>=0L) { + aprsdecode_click.cmd = '.'; + } + else if (aprsstr_InStr(cfgs, 21ul, "=", 2ul)>=0L) { + aprsdecode_click.cmd = '='; + } + else if (aprsstr_InStr(cfgs, 21ul, "A", 2ul)>=0L) { + aprsdecode_click.cmd = 'a'; + } + else if (aprsstr_InStr(cfgs, 21ul, "q", 2ul)>=0L) { + aprsdecode_click.cmd = 'q'; + } + nearwaypoint(); /* set marker on click to track */ + aprstext_setmarkalti(aprsdecode_click.table[aprsdecode_click.selected] + .pff0, aprsdecode_click.table[0UL].opf, 1); + aprsdecode_click.marktime = aprsdecode_realtime; + } + if (aprsstr_InStr(cfgs, 21ul, "u", 2ul)>=0L) { + raw = 1; + menu = 1; + } + if (aprsdecode_click.cmd==0) menu = 1; + if (aprsdecode_click.marktime==0UL) { + /* hard marker */ + aprstext_measure(aprsdecode_click.markpos, + aprsdecode_click.clickpos, mestxt, 201ul, 0); + } + else { + aprstext_measure(aprsdecode_click.markpos, + aprsdecode_click.measurepos, mestxt, 201ul, 0); + } + } + else { + /* importbeacon(click.table[click.selected].opf); + (* copy to beacon editor *) */ + /* clicked empty map */ + if (aprsdecode_click.marktime==0UL || aprsdecode_click.marktime+10UL>=aprsdecode_realtime) + { + aprstext_measure(aprsdecode_click.markpos, + aprsdecode_click.clickpos, mestxt, 201ul, 1); + } + menu = 1; + } + useri_confstr(useri_fCLICKMAP, (char *) &ch, 1u/1u); + if (!xosi_Shift && ch=='2') { + if (aprspos_posvalid(aprsdecode_click.markpos)) ch = 'Y'; + else ch = 'X'; + } + if (ch=='C') aprsdecode_click.cmd = 'C'; + else if (!xosi_Shift && ch=='X' || xosi_Shift && ch=='Y') { + aprsdecode_click.cmd = 'X'; + } + else if (!xosi_Shift && ch=='Y' || xosi_Shift && ch=='X') { + aprsdecode_click.cmd = 'Y'; + aprstext_measure(aprsdecode_click.markpos, + aprsdecode_click.clickpos, mestxt, 201ul, 0); + } + if ((aprsdecode_click.entries>0UL && aprsdecode_click.table[aprsdecode_click.selected] + .typf==aprsdecode_tTEXT) + && aprsdecode_click.table[aprsdecode_click.selected].opf) { + useri_copypaste(aprsdecode_click.table[aprsdecode_click.selected] + .opf->call, 9ul); + } + if (!xosi_Shift) { + /* not close menus on shift click to map */ + if (useri_beaconediting && useri_beaconed) { + if (maptool_findmultiline(aprsdecode_click.clickpos, + &aprsdecode_click.markpos)) { + aprsdecode_click.marktime = 0UL; + aprsdecode_click.cmd = ' '; + } + } + if (!aprsdecode_lums.headmenuy && ((aprsdecode_click.entries==0UL || menu) + || aprsdecode_click.mhop[0UL]) + || (aprsdecode_lums.headmenuy && aprsdecode_click.entries>0UL) + && (menu || aprsdecode_click.mhop[0UL])) { + ch = aprsdecode_click.cmd; + useri_mainpop(); + aprsdecode_click.cmd = ch; + } + else useri_killallmenus(); + } + /* THEN mainpop; click.cmd:=" "; ELSE killallmenus END; */ + if (mestxt[0U]) { + useri_textautosize(-3L, 0L, 6UL, 10UL, 'b', mestxt, 201ul); + } + } + if (raw || aprsdecode_click.cmd) { + /*WrStrLn(click.cmd); */ + /*WrInt(ORD(click.cmd), 1); WrStrLn(click.cmd); */ + maptool_startmapdelay(); + if (aprsdecode_click.cmd=='\030') { + aprsdecode_mappos.lat = aprsdecode_mappos.lat-movest((uint32_t) + maptool_ysize)*shiftfine(); + maptool_limpos(&aprsdecode_mappos); + } + else if (aprsdecode_click.cmd=='\005') { + aprsdecode_mappos.lat = aprsdecode_mappos.lat+movest((uint32_t) + maptool_ysize)*shiftfine(); + maptool_limpos(&aprsdecode_mappos); + } + else if (aprsdecode_click.cmd=='\023') { + aprsdecode_mappos.long0 = aprsdecode_mappos.long0-movest((uint32_t) + maptool_xsize)*shiftfine(); + maptool_limpos(&aprsdecode_mappos); + } + else if (aprsdecode_click.cmd=='\004') { + aprsdecode_mappos.long0 = aprsdecode_mappos.long0+movest((uint32_t) + maptool_xsize)*shiftfine(); + maptool_limpos(&aprsdecode_mappos); + } + else if (aprsdecode_click.cmd=='T') { + if (aprspos_posvalid(newpos0) && aprspos_posvalid(newpos1)) { + mapzoom(newpos0, newpos1, + (uint32_t)useri_conf2int(useri_fDEFZOOM, 0UL, 1L, 18L, + 14L), 1); + } + } + else if (aprsdecode_click.cmd=='o') { + aprsdecode_click.dryrun = 0; + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + aprsdecode_objsender(aprsdecode_click.table[aprsdecode_click.selected] + .opf, aprsdecode_click.mhop, 9ul); + mhtx = aprsmap_OPOBJ; + aprsdecode_lums.obj = 10L*useri_conf2int(useri_fLOBJ, 0UL, 0L, 100L, + 100L); /* switch on objects */ + pandone = 0; + } + else if (aprsdecode_click.cmd=='h') { + aprsdecode_click.dryrun = 0; + if (aprsdecode_click.entries>0UL) { + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + if (aprsdecode_click.table[aprsdecode_click.selected].opf) { + memcpy(aprsdecode_click.mhop, + aprsdecode_click.table[aprsdecode_click.selected].opf->call, + 9u); + } + mhtx = aprsmap_OPHEARD; + pandone = 0; + } + } + else if (aprsdecode_click.cmd=='.' || aprsdecode_click.cmd=='=') { + /* + tracenew.call:=click.mhop; + (* watch call for incoming data *) + */ + aprsdecode_click.dryrun = 0; + if (aprsdecode_click.entries>0UL) { + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + if (aprsdecode_click.table[aprsdecode_click.selected].opf) { + memcpy(aprsdecode_click.mhop, + aprsdecode_click.table[aprsdecode_click.selected].opf->call, + 9u); + } + /* IF beaconediting() + THEN importbeacon(click.table[click.selected].opf) END; + (* copy to beacon editor *) */ + mhtx = aprsmap_OPSENT; + pandone = 0; + aprsdecode_lums.errorstep = 0; + if (aprsdecode_click.cmd=='=') { + aprsdecode_lums.rf = useri_conf2int(useri_fLRF, 0UL, 0L, 100L, + 30L)*10L; + } + else aprsdecode_lums.rf = 0L; + } + } + else if (aprsdecode_click.cmd=='a') { + if (aprsdecode_click.entries>0UL) { + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + if (aprsdecode_click.table[aprsdecode_click.selected].opf) { + memcpy(aprsdecode_click.mhop, + aprsdecode_click.table[aprsdecode_click.selected].opf->call, + 9u); + } + pandone = 0; + } + animate(aprsdecode_click.mhop, (uint32_t)aprsdecode_lums.fps, "", + 1ul); + } + else if (aprsdecode_click.cmd=='0') setshowall(); + else if (aprsdecode_click.cmd=='1' || aprsdecode_click.cmd=='\001') { + View(0UL); + } + else if (aprsdecode_click.cmd=='2') View(1UL); + else if (aprsdecode_click.cmd=='3') View(2UL); + else if (aprsdecode_click.cmd=='4') { + View(3UL); + } + else if (aprsdecode_click.cmd=='b' || aprsdecode_click.cmd=='\010') { + pop(); + } + else if (aprsdecode_click.cmd=='\014') { + /* mercator(mappos.long, mappos.lat, initzoom, inittilex, + inittiley, shiftx, shifty); */ + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + useri_resetimgparms(); + } + else if (aprsdecode_click.cmd=='+') zoominout(1, xosi_Shift, 0); + else if (aprsdecode_click.cmd=='-') zoominout(0, xosi_Shift, 0); + else if (aprsdecode_click.cmd=='\310') zoominout(1, 1, 1); + else if (aprsdecode_click.cmd=='\311') zoominout(0, 1, 1); + else if (aprsdecode_click.cmd=='\237') MapPackage(); + else if (aprsdecode_click.cmd=='S') screenshot(); + else if (aprsdecode_click.cmd=='s') { + useri_rdonesymb(aprsdecode_click.onesymbol.tab==0, 1); + /* toggle onesymbol */ + } + else if (aprsdecode_click.cmd=='E') { + aprsdecode_lums.errorstep = !aprsdecode_lums.errorstep; + useri_sayonoff("Show errors", 12ul, aprsdecode_lums.errorstep); + } + else if (aprsdecode_click.cmd=='f') { + useri_configbool(useri_fTRACKFILT, + !useri_configon(useri_fTRACKFILT)); + useri_sayonoff("Trackfilter", 12ul, + useri_configon(useri_fTRACKFILT)); + } + else if (aprsdecode_click.cmd=='m') { + aprsdecode_lums.moving = !aprsdecode_lums.moving; + useri_sayonoff("Dimm not Moving", 16ul, aprsdecode_lums.moving); + } + else if (aprsdecode_click.cmd=='R') { + if (aprsdecode_lums.rf==0L) aprsdecode_lums.rf = 300L; + else aprsdecode_lums.rf = 0L; + } + else if (aprsdecode_click.cmd=='\022') { + if (aprsdecode_click.withradio && !aprsdecode_click.altimap) { + closeradio(); + } + else { + aprsdecode_click.withradio = 1; + aprsdecode_click.altimap = 0; + } + aprsdecode_lums.wxcol = 0; + if (aprsdecode_click.withradio && !(aprspos_posvalid(aprsdecode_click.markpos) + || aprspos_posvalid(aprsdecode_click.measurepos))) { + useri_say("Radiorange Map On, Set 1 oder 2 Markers", 40ul, 4UL, + 'b'); + } + else { + useri_sayonoff("Radiorange Map", 15ul, + aprsdecode_click.withradio); + } + } + else if (aprsdecode_click.cmd=='H') { + if (aprsdecode_click.withradio && aprsdecode_click.altimap) { + closeradio(); + } + else { + aprsdecode_click.withradio = 1; + aprsdecode_click.altimap = 1; + } + aprsdecode_lums.wxcol = 0; + useri_sayonoff("Altitude Map", 13ul, aprsdecode_click.withradio); + } + else if (aprsdecode_click.cmd=='O') { + /* + ELSIF click.cmd="P" THEN + IF click.withradio THEN closeradio ELSE click.withradio:=TRUE; + click.panorama:=TRUE END; + lums.wxcol:=0C; + sayonoff("Panorama", click.withradio); + */ + if (aprsdecode_lums.obj==0L) { + aprsdecode_lums.obj = 10L*useri_conf2int(useri_fLOBJ, 0UL, 0L, + 100L, 100L); + if (aprsdecode_lums.obj<30L) { + /* switch on objects but are too dark */ + useri_AddConfLine(useri_fLOBJ, 0U, "90", 3ul); + /* set to default brightness */ + aprsdecode_lums.obj = 10L*useri_conf2int(useri_fLOBJ, 0UL, 0L, + 100L, 100L); + } + } + else aprsdecode_lums.obj = 0L; + useri_sayonoff("Show Items/Objects", 19ul, aprsdecode_lums.obj!=0L); + } + else if (aprsdecode_click.cmd=='L') { + if (aprsdecode_lums.text==0L) { + aprsdecode_lums.text = 10L*useri_conf2int(useri_fLTEXT, 0UL, 0L, + 100L, 100L); + } + else aprsdecode_lums.text = 0L; + useri_sayonoff("Labels", 7ul, aprsdecode_lums.text!=0L); + } + else if (X2C_CAP(aprsdecode_click.cmd)=='W') { + if (xosi_Shift && aprsdecode_click.cmd=='W') { + aprsdecode_click.cmd = 'w'; + } + /* + IF click.cmd="W" THEN + IF lums.wxcol<>"W" THEN lums.wxcol:="W" + ELSE lums.wxcol:=0C END; + ELSIF lums.wxcol<>"R" THEN lums.wxcol:="R" + ELSE lums.wxcol:=0C END; + sayonoff("Wx Colormap", lums.wxcol<>0C); + */ + if (aprsdecode_click.cmd=='W') { + if (aprsdecode_lums.wxcol=='W') aprsdecode_lums.wxcol = 0; + else if (aprsdecode_lums.wxcol=='w') aprsdecode_lums.wxcol = 'W'; + else aprsdecode_lums.wxcol = 'w'; + } + else if (aprsdecode_lums.wxcol!='R') aprsdecode_lums.wxcol = 'R'; + else aprsdecode_lums.wxcol = 0; + aprsdecode_click.mhop[0UL] = 0; + aprsdecode_click.onesymbol.tab = 0; + closeradio(); + } + else if (aprsdecode_click.cmd=='C') centermouse(1); + else if (aprsdecode_click.cmd=='t' + && aprspos_posvalid(aprsdecode_click.markpos)) { + /* click to listwin line */ + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + centerpos(aprsdecode_click.markpos, &aprsdecode_mappos); + aprsdecode_click.marktime = aprsdecode_realtime; + if (aprsdecode_click.mhop[0UL]) setshowall(); + } + else if (aprsdecode_click.cmd=='\322' + && aprspos_posvalid(clickwatchpos)) { + /* click to watchcall popup */ + aprsdecode_click.markpos = clickwatchpos; + push(maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom)); + centerpos(aprsdecode_click.markpos, &aprsdecode_mappos); + aprsdecode_click.marktime = aprsdecode_realtime; + if (aprsdecode_click.mhop[0UL]) setshowall(); + } + else if (aprsdecode_click.cmd=='c') centermouse(0); + else if (aprsdecode_click.cmd=='X') xytomark(); + else if (aprsdecode_click.cmd=='x') { + /* set marker 1 to object lastpos */ + clicktomark(); + useri_mainpop(); + } + else if (aprsdecode_click.cmd=='y') { + /* set marker 2 to object lastpos */ + if ((aprsdecode_click.entries>0UL && aprsdecode_click.table[aprsdecode_click.selected] + .opf) && aprspos_posvalid(aprsdecode_click.table[aprsdecode_click.selected].opf->lastpos) + ) { + aprsdecode_click.measurepos = aprsdecode_click.table[aprsdecode_click.selected] + .opf->lastpos; + } + else aprsdecode_click.measurepos = aprsdecode_click.clickpos; + } + else if (aprsdecode_click.cmd=='q') clickdelwaypoint(); + else if (aprsdecode_click.cmd=='/') { + zoomtomarks(aprsdecode_click.markpos, aprsdecode_click.measurepos); + } + else if (aprsdecode_click.cmd=='\307') zoomtosquare(); + else if (aprsdecode_click.cmd==':') { + aprsdecode_posinval(&aprsdecode_click.markpos); + aprsdecode_posinval(&aprsdecode_click.measurepos); + aprsdecode_click.waysum = 0.0f; + aprsdecode_posinval(&aprsdecode_click.squerpos0); + useri_killallmenus(); + useri_sayonoff("Markers", 8ul, 0); + } + else if (aprsdecode_click.cmd=='@') { + useri_AddConfLine(useri_fCLICKMAP, 0U, "", 1ul); + useri_AddConfLine(useri_fCLICKSYM, 0U, "", 1ul); + useri_AddConfLine(useri_fCLICKTRACK, 0U, "", 1ul); + useri_AddConfLine(useri_fCLICKTEXT, 0U, "", 1ul); + useri_AddConfLine(useri_fCLICKWXSYM, 0U, "", 1ul); + useri_killallmenus(); + useri_say("\'ON Next Click\' Reset to Defaults", 34ul, 10UL, 'b'); + } + else if (aprsdecode_click.cmd=='Y') { + /* click.measurepos:=click.clickpos; */ + /* copypastepos(click.clickpos); */ + xytomark2(); + if (aprspos_posvalid(aprsdecode_click.clickpos)) { + copypastepos(aprsdecode_click.clickpos); + } + } + else if (aprsdecode_click.cmd=='~') { + changecolor(aprsdecode_click.table[aprsdecode_click.selected].opf); + } + else if (aprsdecode_click.cmd=='A') { + animate(aprsdecode_click.mhop, (uint32_t)aprsdecode_lums.fps, "", + 1ul); + } + else if (aprsdecode_click.cmd=='\312') { + useri_say("Saving map.y4m", 15ul, 0UL, 'b'); + animate(aprsdecode_click.mhop, (uint32_t)aprsdecode_lums.actfps, "\ +map.y4m", 8ul); + } + else if (aprsdecode_click.cmd=='I') internstat(); + else if (aprsdecode_click.cmd=='\245') { + aprsdecode_click.dryrun = 0; + find(); + } + else if (aprsdecode_click.cmd=='\\') { + useri_helptext(0UL, 0UL, 0UL, 0UL, "en-shortcuts", 13ul); + } + else if (aprsdecode_click.cmd=='7') useri_Setmap(0UL); + else if (aprsdecode_click.cmd=='8') useri_Setmap(1UL); + else if (aprsdecode_click.cmd=='9') useri_Setmap(2UL); + else if (aprsdecode_click.cmd=='Q') aprsdecode_quit = 1; + else if (aprsdecode_click.cmd=='e') aprsdecode_click.dryrun = 0; + else if (aprsdecode_click.cmd=='\216' && aprsdecode_click.cmdatt) { + importlog(aprsdecode_click.cmdatt); + aprsdecode_click.cmdatt = 0; + } + else if (aprsdecode_click.cmd=='\011') toggview(); + else if (aprsdecode_click.cmd=='(') mapbri(-5L); + else if (aprsdecode_click.cmd==')') mapbri(5L); + else if (aprsdecode_click.cmd=='[') fullbritime(1); + else if (aprsdecode_click.cmd==']') fullbritime(0); + makeimage(0); + aprsdecode_click.cmd = 0; + if ((useri_beaconediting && useri_beaconed) + && aprsdecode_ismultiline(1)) useri_poligonmenu(); + } + else if ((aprsdecode_tracenew.call[0UL] && lastxupdate+2UL+slowupdate() + <=aprsdecode_realtime) + && !(aprsdecode_click.withradio && (aprspos_posvalid(aprsdecode_click.markpos) + || aprspos_posvalid(aprsdecode_click.measurepos)))) { + follow(); + if (maptrys>0UL) { + if (aprsdecode_click.watchlast) useri_refrinfo(); + makeimage(0); + } + } + else if (aprsdecode_tracenew.winevent>1000UL || aprsdecode_tracenew.winevent>0UL && lastxupdate+5UL+slowupdate() + <=aprsdecode_realtime) { + aprsdecode_tracenew.winevent = 0UL; + if (aprsdecode_click.watchlast) useri_refrinfo(); + if (!(aprsdecode_click.withradio || aprspos_posvalid(aprsdecode_click.markpos) + && aprspos_posvalid(aprsdecode_click.measurepos))) { + maptool_closesrtmfile(); + } + makeimage(0); + } + else if (useri_newxsize>0UL) { + /* window resize request */ + if ((useri_newxsize&1)) --useri_newxsize; + if ((useri_newysize&1)) --useri_newysize; + xosi_allocxbuf(useri_newxsize, useri_newysize); + useri_allocimage(&image, (int32_t)useri_newxsize, + (int32_t)useri_newysize, 0); + useri_allocimage(&rfimg, (int32_t)useri_newxsize, + (int32_t)useri_newysize, 0); + maptool_xsize = (int32_t)useri_newxsize; + maptool_ysize = (int32_t)useri_newysize; + if (!useri_maximized) { + useri_saveXYtocfg(useri_fXYSIZE, maptool_xsize, maptool_ysize); + } + useri_newxsize = 0UL; + useri_newysize = 0UL; + radio.wasradio = 0; + aprsdecode_posinval(&radio.mappos); + makeimage(0); + } + else if ((aprsdecode_lasttcprx+60UL>aprsdecode_realtime || aprsdecode_lastanyudprx+60UL>aprsdecode_realtime) + && laststatref+5UL0UL && maptime!=aprsdecode_realtime) { + maptime = aprsdecode_realtime; + --maptrys; + if (maptool_IsMapLoaded()) makeimage(0); + else if (maptrys==20UL) tooltips('m'); + } + if (aprsdecode_click.bubblstr[0UL] && !xosi_pulling) { + useri_textbubble(aprsdecode_click.bubblpos, aprsdecode_click.bubblstr, + 50ul, aprsdecode_click.lastpoi); + aprsdecode_click.bubblstr[0UL] = 0; + } + if (useri_refresh) useri_redraw(image); + if (!logdone) { + bootreadlog(); + ++aprsdecode_tracenew.winevent; + } + if (realday!=aprsdecode_realtime/86400UL) { + realday = aprsdecode_realtime/86400UL; + void0 = deletelogfile(0); + } +} /* end MainEvent() */ + + +static void getinitview(void) +{ + float z; + aprsdecode_initzoom = 8L; + aprsdecode_finezoom = 1.0f; + z = 0.0f; + useri_getview(useri_fVIEW, 0UL, &z, &aprsdecode_mappos); + if (z!=0.0f) { + aprsdecode_initzoom = (int32_t)aprsdecode_trunc(z); + aprsdecode_finezoom = (1.0f+z)-(float)aprsdecode_initzoom; + } + maptool_limpos(&aprsdecode_mappos); + if (aprsdecode_parmzoom>0L) { + aprsdecode_initzoom = aprsdecode_parmzoom; + aprsdecode_finezoom = aprsdecode_parmfinezoom; + } + if (aprsdecode_initzoom<1L) aprsdecode_initzoom = 1L; + else if (aprsdecode_initzoom>18L) aprsdecode_initzoom = 18L; +} /* end getinitview() */ + +static void killsave(int32_t); + + +static void killsave(int32_t signum) +{ + if (!aprsdecode_quit && useri_configon(useri_fAUTOSAVE)) { + useri_saveconfig(); + } + osi_WrStr("exit ", 6ul); + osic_WrINT32((uint32_t)signum, 0UL); + osi_WrStrLn("!", 2ul); + X2C_HALT((uint32_t)signum); +} /* end killsave() */ + +/* +PROCEDURE rdmountains(fn:ARRAY OF CHAR); + (* import csv file with mountain name, pos, altitude *) +VAR p,len,r:INTEGER; + fd:File; + pm:pMOUNTAIN; + pos:POSITION; + alt:REAL; + b:ARRAY[0..4095] OF CHAR; + s:ARRAY[0..1023] OF CHAR; + com, lat, long, name:ARRAY[0..99] OF CHAR; + + + PROCEDURE getch():CHAR; + BEGIN + IF p>=len THEN + len:=RdBin(fd, b, SIZE(b)); + IF len<=0 THEN RETURN 0C END; + + p:=0; + END; + INC(p); + RETURN b[p-1] + END getch; + + PROCEDURE getword(VAR s:ARRAY OF CHAR):INTEGER; + VAR i:CARDINAL; + BEGIN + i:=0; + LOOP + s[i]:=getch(); + IF s[i]=0C THEN RETURN -1 END; + IF s[i]=LF THEN s[i]:=0C; RETURN 0 END; + IF s[i]="," THEN s[i]:=0C; RETURN 1 END; + IF (i=" ") THEN INC(i) END; + END; + END getword; + +BEGIN + b[0]:=0C; + confstr(fOSMDIR, s); + Append(b, s); + Append(b, DIRSEP); + Append(b, fn); + + fd:=OpenRead(b); + IF NOT FdValid(fd) THEN RETURN END; + + p:=0; + len:=0; + LOOP + r:=getword(com); + IF r>0 THEN + r:=getword(name); + IF r>0 THEN + r:=getword(s); + IF r>0 THEN + r:=getword(lat); + IF r>0 THEN + r:=getword(long); + IF r>0 THEN + r:=getword(s); + IF (r<0) OR NOT StrToFix(alt, s) THEN alt:=0.0 END; + WHILE r>0 DO r:=getword(s) END; + END; + END; + END; + END; + END; + IF r<0 THEN EXIT END; + + IF (com[0]<>"#") & (name[0]<>0C) & StrToFix(pos.lat, lat) + & StrToFix(pos.long, long) & posvalid(pos) THEN + ALLOCATE(pm, SIZE(pm^)); + IF pm=NIL THEN EXIT END; + + INC(debugmem.srtm, SIZE(pm^)); + Assign(pm^.name, name); + pm^.pos.lat:= pos.lat * RAD; + pm^.pos.long:=pos.long* RAD; + IF (alt<0.0) OR (alt>9999.0) THEN alt:=0.0 END; + pm^.alt:=trunc(alt); + pm^.next:=mountains; + mountains:=pm; + END; + END; + Close(fd); +END rdmountains; +*/ + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + X2C_BEGIN(&argc,argv,1,4000000l,1000000000l); + aprstext_BEGIN(); + aprsstr_BEGIN(); + aprspos_BEGIN(); + aprsdecode_BEGIN(); + maptool_BEGIN(); + xosi_BEGIN(); + osi_BEGIN(); + useri_BEGIN(); + memset((char *) &useri_debugmem,(char)0,sizeof(struct useri__D0)); + useri_clrconfig(); + aprsdecode_initparms(); + aprsdecode_posinval(&aprsdecode_click.markpos); + aprsdecode_mountains = 0; + useri_loadconfig(0); + maptool_loadfont(); + useri_maximized = 0; + useri_getstartxysize(&maptool_xsize, &maptool_ysize); + if (aprsdecode_initxsize>0L) maptool_xsize = aprsdecode_initxsize; + if (aprsdecode_initysize>0L) maptool_ysize = aprsdecode_initysize; + aprsdecode_mappos.long0 = 2.0943951023333E-1f; + aprsdecode_mappos.lat = 8.5521133345278E-1f; + getinitview(); + maptool_mercator(aprsdecode_mappos.long0, aprsdecode_mappos.lat, + aprsdecode_initzoom, &aprsdecode_inittilex, + &aprsdecode_inittiley, &maptool_shiftx, &maptool_shifty); + centerpos(aprsdecode_mappos, &aprsdecode_mappos); + makegammatab(); + vidbuf = 0; + image = 0; + rfimg = 0; + useri_allocimage(&image, maptool_xsize, maptool_ysize, 0); + useri_allocimage(&rfimg, maptool_xsize, maptool_ysize, 0); + aprsdecode_posinval(&clickwatchpos); + tabview.stkpo = 0UL; + tabview.stktop = 0UL; + alttabview.stkpo = 0UL; + alttabview.stktop = 0UL; + maptrys = 0UL; + memset((char *) &aprsdecode_serialpid,(char)0, + sizeof(struct xosi_PROCESSHANDLE)); + memset((char *) &aprsdecode_serialpid2,(char)0, + sizeof(struct xosi_PROCESSHANDLE)); + aprsdecode_click.mhop[0UL] = 0; + aprsdecode_click.onesymbol.tab = 0; + aprsdecode_click.zoomtox = -1L; + aprsdecode_posinval(&aprsdecode_click.squerpos0); + aprsdecode_posinval(&aprsdecode_click.measurepos); + memset((char *) &aprsdecode_tracenew,(char)0, + sizeof(struct aprsdecode__D2)); + pandone = 1; + useri_newxsize = 0UL; + useri_newysize = 0UL; + cycleorder = 0UL; + realday = 0UL; + onetipp = 0; + logdone = 0; + uptime = osic_time(); + withx = xosi_InitX("Aprsmap", 8ul, "Aprsmap", 8ul, + (uint32_t)maptool_xsize, (uint32_t)maptool_ysize)>=0L; + if (!withx) { + osi_WrStrLn("cannot open xwindow, image generation only", 43ul); + } + xosi_Gammatab(aprsdecode_lums.gamma); + aprsdecode_realtime = osic_time(); + useri_initmenus(); + aprsdecode_quit = 0; + aprsdecode_tracenew.winevent = 1UL; + aprsdecode_posinval(&newpos0); + aprsdecode_posinval(&newpos1); + signal(SIGTERM, killsave); + signal(SIGINT, killsave); + signal(SIGPIPE, killsave); + if (withx) { + aprsdecode_realtime = osic_time(); + aprsdecode_rxidle = 0UL; + useri_refresh = 1; + aprsdecode_lastlooped = aprsdecode_realtime; + while (!aprsdecode_quit) { + MainEvent(); + xosi_Eventloop(250000UL); + } + if (useri_configon(useri_fAUTOSAVE)) useri_saveconfig(); + xosi_StopProg(&aprsdecode_maploadpid); + xosi_StopProg(&aprsdecode_serialpid); + xosi_StopProg(&aprsdecode_serialpid2); + xosi_closewin(); + } +/* +data structure op + +ophist (ophist2 is online ophist in logmode) + +ophist > op1.next > op2.next > NIL +op.frames > frame1.next > frame2.next > NIL +frame1 > vardat1.lastref > frame5 +frame2 > vardat2.lastref > frame4 +frame3 > vardat1.lastref > frame5 +frame4 > vardat2.lastref > frame4 +frame5 > vardat1.lastref > frame5 +*/ + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/aprspos.c b/src/aprspos.c new file mode 100644 index 0000000..d61379d --- /dev/null +++ b/src/aprspos.c @@ -0,0 +1,778 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#define aprspos_C_ +#ifndef osi_H_ +#include "osi.h" +#endif +#include + + + +/* get aprs position by OE5DXL */ +/*CONST arccos=acos; */ +/* arctan=atan; */ +/* power=pow; */ + +extern float aprspos_rad0(float w) +{ + return w*1.7453292519444E-2f; +} /* end rad() */ + + +extern char aprspos_posvalid(struct aprspos_POSITION pos) +{ + return pos.lat!=0.0f || pos.long0!=0.0f; +} /* end posvalid() */ + + +extern float aprspos_distance(struct aprspos_POSITION home, + struct aprspos_POSITION dist) +{ + float y; + float x; + x = (float)fabs(dist.long0-home.long0); + y = (float)fabs(dist.lat-home.lat); + if (x==0.0f && y==0.0f) return 0.0f; + else if (x+y<0.04f) { + /* near */ + x = x*osic_cos((home.lat+dist.lat)*0.5f); + return 6370.0f*osic_sqrt(x*x+y*y); + } + else { + /* far */ + if (x>6.283185307f) x = 6.283185307f-x; + x = osic_sin(dist.lat)*osic_sin(home.lat)+osic_cos(dist.lat) + *osic_cos(home.lat)*osic_cos(x); + if ((float)fabs(x)>=1.0f) return 0.0f; + return 6370.0f*osic_arccos(x); + } + return 0; +} /* end distance() */ + + +extern float aprspos_azimuth(struct aprspos_POSITION home, + struct aprspos_POSITION dist) +{ + float ldiff; + float h; + ldiff = dist.long0-home.long0; + if ((ldiff==0.0f || osic_cos(home.lat)==0.0f) || osic_cos(dist.lat)==0.0f) + { + if (home.lat<=dist.lat) return 0.0f; + else return 180.0f; + } + else { + h = 5.729577951472E+1f*osic_arctan(osic_cos(home.lat) + *(X2C_DIVR(osic_tan(home.lat)*osic_cos(ldiff) + -osic_tan(dist.lat),osic_sin(ldiff)))); + if (ldiff<0.0f) return h+270.0f; + else return h+90.0f; + } + return 0; +} /* end azimuth() */ + + +static char dig(float * s, char c, float mul) +{ + if (c==' ') return 1; + /* ambiguity */ + if ((uint8_t)c<'0' || (uint8_t)c>'9') return 0; + *s = *s+(float)((uint32_t)(uint8_t)c-48UL)*mul; + return 1; +} /* end dig() */ + + +static char r91(float * s, char c, float mul) +{ + if ((uint8_t)c<'!' || (uint8_t)c>'|') return 0; + *s = *s+(float)((uint32_t)(uint8_t)c-33UL)*mul; + return 1; +} /* end r91() */ + + +static char mic(float * s, char c, float mul) +{ + uint32_t n; + if ((uint8_t)c>='0' && (uint8_t)c<='9') { + n = (uint32_t)(uint8_t)c-48UL; + } + else if ((uint8_t)c>='A' && (uint8_t)c<='J') { + n = (uint32_t)(uint8_t)c-65UL; + } + else if ((c=='K' || c=='L') || c=='Z') n = 0UL; + else if ((uint8_t)c>='P' && (uint8_t)c<='Y') { + n = (uint32_t)(uint8_t)c-80UL; + } + else return 0; + *s = *s+(float)n*mul; + return 1; +} /* end mic() */ + + +static char bit5(char c) +{ + return ((uint32_t)(uint8_t)c/32UL&1) || c=='L'; +} /* end bit5() */ +/* L is wildcard */ + + +static void komma(char buf[], uint32_t buf_len, uint32_t * p) +{ + for (;;) { + if (*p+20UL>=buf_len-1 || (uint8_t)buf[*p]<' ') return; + if (buf[*p]==',') break; + ++*p; + } + ++*p; +} /* end komma() */ + + +static char ns(char c) +{ + c = X2C_CAP(c); + return c=='N' || c=='S'; +} /* end ns() */ + + +static char ew(char c) +{ + c = X2C_CAP(c); + return c=='E' || c=='W'; +} /* end ew() */ + + +static char dig3(char buf[], uint32_t buf_len, uint32_t * s, + uint32_t * p) +{ + uint32_t i; + char c; + *s = 0UL; + if ((buf[*p]==' ' && buf[*p+1UL]==' ') + && buf[*p+2UL]==' ' || (buf[*p]=='.' && buf[*p+1UL]=='.') + && buf[*p+2UL]=='.') { + *p += 3UL; + return 1; + } + for (i = 0UL; i<=2UL; i++) { + c = buf[*p]; + ++*p; + if ((uint8_t)c<'0' || (uint8_t)c>'9') return 0; + *s = ( *s*10UL+(uint32_t)(uint8_t)c)-48UL; + } /* end for */ + return 1; +} /* end dig3() */ + + +static char dig6(const char b[], uint32_t b_len, float * s, + uint32_t p) +{ + uint32_t i; + char c; + char sig; + *s = 0.0f; + if (b[p]=='-') { + sig = 1; + i = 1UL; + } + else { + sig = 0; + i = 0UL; + } + do { + c = b[p+i]; + if ((uint8_t)c<'0' || (uint8_t)c>'9') return 0; + *s = *s*10.0f+(float)((uint32_t)(uint8_t)c-48UL); + ++i; + } while (i<6UL); + if (sig) *s = -*s; + return 1; +} /* end dig6() */ + + +static char Mapsym(char c) +{ + if ((uint8_t)c>='a' && (uint8_t)c<='j') { + c = (char)((uint32_t)(uint8_t)c-49UL); + } + return c; +} /* end Mapsym() */ + +typedef uint32_t CHSET[4]; + +#define aprspos_DAO10 2.9088820865741E-7 +/* additional digit in lat/log */ + +#define aprspos_DAO91 3.1997702952315E-8 +/* additional 0..90 * 1.1 digits */ + +#define aprspos_RND 1.454441043287E-6 + +static CHSET _cnst1 = {0x00000000UL,0x00000080UL,0x00000000UL,0x00000001UL}; +static CHSET _cnst0 = {0x00000000UL,0x40000000UL,0x20000000UL,0x00000000UL}; +static CHSET _cnst = {0x20000000UL,0x40000080UL,0x20100000UL,0x00000001UL}; + +extern void aprspos_GetPos(struct aprspos_POSITION * pos, uint32_t * speed, + uint32_t * course, int32_t * altitude, char * symb, + char * symbt, char buf[], uint32_t buf_len, + uint32_t micedest, uint32_t payload, char coment[], + uint32_t coment_len, char * postyp) +{ + uint32_t compos; + uint32_t clen; + uint32_t na; + uint32_t nc; + uint32_t n; + uint32_t len; + uint32_t i; + char manucode; + char gpst; + char c; + char nornd; + char ok0; + float scl; + float sc; + len = payload; + nornd = 0; + while (len'\015') ++len; + coment[0UL] = 0; + manucode = 0; + compos = payload; + c = buf[payload]; + if ((payload+8UL0UL) && (((c=='\034' || c=='\035') + || c=='\'') || c=='`')) { + /* mic-e */ + pos->lat = 0.0f; + i = micedest; + ok0 = 1; + if (!mic(&pos->lat, buf[i], 1.7453292519444E-1f)) ok0 = 0; + ++i; + if (!mic(&pos->lat, buf[i], 1.7453292519444E-2f)) ok0 = 0; + ++i; + if (!mic(&pos->lat, buf[i], 2.9088820865741E-3f)) ok0 = 0; + ++i; + if (!mic(&pos->lat, buf[i], 2.9088820865741E-4f)) ok0 = 0; + ++i; + if (!mic(&pos->lat, buf[i], 2.9088820865741E-5f)) ok0 = 0; + ++i; + if (!mic(&pos->lat, buf[i], 2.9088820865741E-6f)) ok0 = 0; + /* IF ok & (pos.lat<>0.0) THEN pos.lat:=pos.lat+0.005/60.0*RAD END; + (* rounding *) */ + if (bit5(buf[micedest+3UL])) pos->lat = -pos->lat; + n = (uint32_t)(uint8_t)buf[payload+1UL]; /* long degrees */ + if (n>=28UL && n<=127UL) { + n -= 28UL; + if (!bit5(buf[micedest+4UL])) n += 100UL; + if (n>=180UL && n<=189UL) n -= 80UL; + else if (n>=190UL && n<=199UL) n -= 190UL; + } + else ok0 = 0; + pos->long0 = (float)n*1.7453292519444E-2f; + n = (uint32_t)(uint8_t)buf[payload+2UL]; /* long min */ + if (n>=28UL && n<=127UL) { + n -= 28UL; + if (n>=60UL) n -= 60UL; + } + else ok0 = 0; + pos->long0 = pos->long0+(float)n*2.9088820865741E-4f; + n = (uint32_t)(uint8_t)buf[payload+3UL]; /* long min/100 */ + if (n>=28UL && n<=127UL) { + pos->long0 = pos->long0+(float)(n-28UL)*2.9088820865741E-6f; + } + else ok0 = 0; + /* IF ok & (pos.long<>0.0) + THEN pos.long:=pos.long+0.005/60.0*RAD END; + (* rounding *) */ + if (!bit5(buf[micedest+5UL])) pos->long0 = -pos->long0; + *speed = 0UL; + *course = 0UL; + if (ok0) { + n = (uint32_t)(uint8_t)buf[payload+4UL]; + if (n>=28UL && n<=127UL) *speed = (n-28UL)*10UL; + else ok0 = 0; + n = (uint32_t)(uint8_t)buf[payload+5UL]; + if (n>=28UL && n<=127UL) { + n -= 28UL; + *speed += n/10UL; + *course = (n%10UL)*100UL; + } + else ok0 = 0; + n = (uint32_t)(uint8_t)buf[payload+6UL]; + if (n>=28UL && n<=127UL) { + n -= 28UL; + *course += n; + if (*speed>=800UL) *speed -= 800UL; + if (*course>=400UL) *course -= 400UL; + if (*course>=360UL) ok0 = 0; + } + else { + /* INC(course); + (* compatible to 1..360 system *) */ + ok0 = 0; + } + *symb = buf[payload+7UL]; + *symbt = buf[payload+8UL]; + } + compos = payload+9UL; + i = payload+9UL; + manucode = buf[i]; + if (!X2C_INL((int32_t)(uint8_t)manucode,128,_cnst)) { + manucode = 0; /* no manufacturer code */ + } + if (buf[i+3UL]=='}' || manucode && buf[i+4UL]=='}') { + /* altitude in meters +10000 */ + if (buf[i+3UL]!='}' && manucode) ++i; + sc = 0.0f; + if ((r91(&sc, buf[i], 8281.0f) && r91(&sc, buf[i+1UL], + 91.0f)) && r91(&sc, buf[i+2UL], 1.0f)) { + *altitude = (int32_t)(uint32_t)X2C_TRUNCC(sc,0UL, + X2C_max_longcard)-10000L; + compos = i+4UL; + } + else ok0 = 0; + } + *postyp = 'm'; + } + else if (c=='$' && payload+30ULlat = 0.0f; + if (!dig(&pos->lat, buf[i], 1.7453292519444E-1f)) ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 1.7453292519444E-2f)) ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-3f)) ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-4f)) ok0 = 0; + i += 2UL; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-5f)) ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-6f)) ok0 = 0; + sc = 2.9088820865741E-7f; + while (ilat, buf[i+1UL], sc)) { + sc = sc*0.1f; + ++i; + nornd = 1; + } + komma(buf, buf_len, &i); + if (buf[i]=='S') pos->lat = -pos->lat; + komma(buf, buf_len, &i); + pos->long0 = 0.0f; + if (!dig(&pos->long0, buf[i], 1.7453292519444f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 1.7453292519444E-1f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 1.7453292519444E-2f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-3f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-4f)) ok0 = 0; + i += 2UL; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-5f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-6f)) ok0 = 0; + sc = 2.9088820865741E-7f; + while (ilong0, buf[i+1UL], sc)) { + sc = sc*0.1f; + ++i; + nornd = 1; + } + komma(buf, buf_len, &i); + if (buf[i]=='W') pos->long0 = -pos->long0; + if (gpst=='C') { + /* speed and course */ + komma(buf, buf_len, &i); + sc = 0.0f; + for (;;) { + sc = sc*10.0f; + if ((i>=len || sc>1.E+6f) || !dig(&sc, buf[i], 0.1f)) { + break; + } + ++i; + } + *speed = (uint32_t)X2C_TRUNCC(X2C_DIVR(sc,1.852f)+0.5f,0UL, + X2C_max_longcard); + komma(buf, buf_len, &i); + sc = 0.0f; + for (;;) { + sc = sc*10.0f; + if ((i>=len || sc>360.0f) || !dig(&sc, buf[i], 0.1f)) break; + ++i; + } + *course = (uint32_t)X2C_TRUNCC(sc,0UL,X2C_max_longcard); + if (i>len) ok0 = 0; + } + else if (gpst=='A') { + /* altitude */ + komma(buf, buf_len, &i); + komma(buf, buf_len, &i); + komma(buf, buf_len, &i); + komma(buf, buf_len, &i); + sc = 0.0f; + c = buf[i]; + if (c=='-') ++i; + for (;;) { + sc = sc*10.0f; + if ((i>=len || sc>1.E+6f) || !dig(&sc, buf[i], 0.1f)) break; + ++i; + } + komma(buf, buf_len, &i); + if (c=='-') sc = -sc; + if (buf[i]=='M') { + *altitude = (int32_t)X2C_TRUNCI(sc,X2C_min_longint, + X2C_max_longint); + } + } + while (ilat = 0.0f; + pos->long0 = 0.0f; + i = 0UL; + if (buf[payload]=='!' || buf[payload]=='=') i = payload+1UL; + else if ((buf[payload]=='/' || buf[payload]=='@') + && ((buf[payload+7UL]=='z' || buf[payload+7UL]=='h') + || buf[payload+7UL]=='/')) i = payload+8UL; + else if (buf[payload]==';') i = payload+18UL; + else if (buf[payload]==')') { + /* skip item */ + i = payload+4UL; + while ((i0UL) { + if ((uint8_t)buf[i]>='0' && (uint8_t)buf[i]<='9') { + if ((((i+17UL<=len && buf[i+4UL]=='.') && buf[i+14UL]=='.') + && ns(buf[i+7UL])) && ew(buf[i+17UL])) { + /* not compressed */ + ok0 = 1; + if (!dig(&pos->lat, buf[i], 1.7453292519444E-1f)) ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 1.7453292519444E-2f)) ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-3f)) ok0 = 0; + if ((uint8_t)buf[i]>='6') ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-4f)) ok0 = 0; + i += 2UL; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-5f)) ok0 = 0; + ++i; + if (!dig(&pos->lat, buf[i], 2.9088820865741E-6f)) ok0 = 0; + ++i; + if (X2C_CAP(buf[i])=='S') pos->lat = -pos->lat; + else if (X2C_CAP(buf[i])!='N') ok0 = 0; + ++i; + *symbt = buf[i]; + ++i; + if (!dig(&pos->long0, buf[i], 1.7453292519444f)) { + ok0 = 0; + } + ++i; + if (!dig(&pos->long0, buf[i], 1.7453292519444E-1f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 1.7453292519444E-2f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-3f)) ok0 = 0; + if ((uint8_t)buf[i]>='6') ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-4f)) ok0 = 0; + i += 2UL; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-5f)) ok0 = 0; + ++i; + if (!dig(&pos->long0, buf[i], 2.9088820865741E-6f)) ok0 = 0; + ++i; + if (X2C_CAP(buf[i])=='W') pos->long0 = -pos->long0; + else if (X2C_CAP(buf[i])!='E') ok0 = 0; + ++i; + *symb = buf[i]; + ++i; + compos = i; + *postyp = 'g'; + if (i+7UL<=len) { + if (dig3(buf, buf_len, &nc, &i)) *course = nc; + else *course = 0UL; + /* area obj */ + if (*symbt=='\\' && *symb=='l') { + /* area symbol */ + c = buf[i]; + if (c=='/' || c=='1') { + ++i; + if (dig3(buf, buf_len, &n, &i)) { + if (c=='1') { + n += 1000UL; /* Tyy/Cxx or Tyy1Cxx */ + } + if (n<=1599UL) { + /* Tyy15xx max 5 */ + *speed = n; + compos = i; + *postyp = 'A'; + } + } + } + } + else if (buf[i]=='/') { + /* area obj */ + /* ccc/sss */ + ++i; + if (dig3(buf, buf_len, &n, &i)) { + *speed = n; + compos = i; + } + } + } + } + } + else if (i+11UL+2UL*(uint32_t)(buf[i+10UL]!=' ')<=len) { + /* compressed pos*/ + ok0 = 1; + *symbt = Mapsym(buf[i]); + ++i; + if (!r91(&pos->lat, buf[i], 7.53571E+5f)) ok0 = 0; + ++i; + if (!r91(&pos->lat, buf[i], 8281.0f)) ok0 = 0; + ++i; + if (!r91(&pos->lat, buf[i], 91.0f)) ok0 = 0; + ++i; + if (!r91(&pos->lat, buf[i], 1.0f)) ok0 = 0; + pos->lat = 1.57079632675f-pos->lat*4.5818065764596E-8f; + ++i; + if (!r91(&pos->long0, buf[i], 7.53571E+5f)) ok0 = 0; + ++i; + if (!r91(&pos->long0, buf[i], 8281.0f)) ok0 = 0; + ++i; + if (!r91(&pos->long0, buf[i], 91.0f)) ok0 = 0; + ++i; + if (!r91(&pos->long0, buf[i], 1.0f)) ok0 = 0; + pos->long0 = pos->long0*9.1636131529192E-8f-3.1415926535f; + *symb = buf[i+1UL]; + if (ok0) { + if (buf[i+2UL]=='}') { + } + else if (((uint32_t)(uint8_t)buf[i+4UL]/8UL&3UL)==2UL) { + /* radio range */ + /* T byte says GGA so we have altitude */ + na = (uint32_t)(uint8_t)buf[i+2UL]; + /* sc is altitude */ + n = (uint32_t)(uint8_t)buf[i+3UL]; + if (((na>=33UL && na<=127UL) && n>=33UL) && n<=127UL) { + *altitude = (int32_t)(uint32_t) + X2C_TRUNCC(0.3048f*osic_power(1.002f, + (float)(((na-33UL)*91UL+n)-33UL)),0UL,X2C_max_longcard); + /* in feet */ + } + } + else { + n = (uint32_t)(uint8_t)buf[i+2UL]; /* speed course */ + if (n>=33UL && n<=127UL) { + n -= 33UL; + if (n<=89UL) { + *course = n*4UL; + n = (uint32_t)(uint8_t)buf[i+3UL]; + if (n>=33UL && n<=127UL) { + *speed = (uint32_t)X2C_TRUNCC(osic_power(1.08f, + (float)(n-33UL)),0UL,X2C_max_longcard); + } + } + } + } + compos = i+5UL; + nornd = 1; + } + *postyp = 'c'; + } + } + } + i = compos; + clen = 0UL; + while (clen0UL && X2C_INL((int32_t)(uint8_t)manucode,128, + _cnst0)) && coment[clen-1UL]=='=') --clen; + else if (clen>1UL && X2C_INL((int32_t)(uint8_t)manucode,128,_cnst1)) { + clen -= 2UL; /* remove maufacturer code */ + } + coment[clen] = 0; + if (clen>0UL) { + i = 0UL; /* look for altitude in comment /A= */ + for (;;) { + if (i+9UL>clen) break; + if (((coment[i]=='/' && coment[i+1UL]=='A') && coment[i+2UL]=='=') + && dig6(coment, coment_len, &sc, i+3UL)) { + *altitude = (int32_t)X2C_TRUNCI(sc*0.3048f,X2C_min_longint, + X2C_max_longint); + while (i+9UL<=clen) { + coment[i] = coment[i+9UL]; /* delete altitude */ + ++i; + } + clen -= 9UL; + break; + } + ++i; + } + if (clen>=5UL && (pos->long0!=0.0f || pos->lat!=0.0f)) { + i = clen-5UL; /* look for !DAO! precision extension backward */ + n = 0UL; /* count "|" to know if inside mice-telemetry */ + for (;;) { + if (coment[i]=='!' && coment[i+4UL]=='!') { + c = coment[i+1UL]; + sc = 0.0f; + scl = 0.0f; + if ((((uint8_t)c>='A' && (uint8_t)c<='Z') && dig(&sc, + coment[i+2UL], 2.9088820865741E-7f)) && dig(&scl, + coment[i+3UL], 2.9088820865741E-7f) || (((uint8_t)c>='a' && (uint8_t)c<='z') && r91(&sc, + coment[i+2UL], 3.1997702952315E-8f)) && r91(&scl, + coment[i+3UL], 3.1997702952315E-8f)) { + if (pos->lat<0.0f) pos->lat = pos->lat-sc; + else pos->lat = pos->lat+sc; + if (pos->long0<0.0f) pos->long0 = pos->long0-scl; + else pos->long0 = pos->long0+scl; + nornd = 1; + if (!(n&1)) { + /* if not possibly inside mice-telemetrty del DAO */ + while (i+5UL<=clen) { + coment[i] = coment[i+5UL]; /* delete DAO */ + ++i; + } + clen -= 5UL; + } + } + if ((uint8_t)*postyp>0) *postyp = X2C_CAP(*postyp); + break; + } + if (coment[i+4UL]=='|') ++n; + if (i==0UL) break; + --i; + } + } + } + if (ok0 && !nornd) { + /* rounding */ + if (pos->lat<0.0f) pos->lat = pos->lat-1.454441043287E-6f; + else if (pos->lat>0.0f) pos->lat = pos->lat+1.454441043287E-6f; + if (pos->long0<0.0f) pos->long0 = pos->long0-1.454441043287E-6f; + else if (pos->long0>0.0f) pos->long0 = pos->long0+1.454441043287E-6f; + } + ok0 = ((ok0 && (pos->long0!=0.0f || pos->lat!=0.0f)) && (float) + fabs(pos->long0)<3.1415926535f) && (float)fabs(pos->lat) + <1.57079632675f; + if (!ok0) { + pos->long0 = 0.0f; + pos->lat = 0.0f; + } +} /* end GetPos() */ + +#define aprspos_SYMT1 "BBBCBDBEBFBGBHBIBJBKBLBMBNBOBPP0P1P2P3P4P5P6P7P8P9MRMS\ +MTMUMVMWMXPAPBPCPDPEPFPGPHPIPJPKPLPMPNPOPPPQPRPSPTPUPVPWPXPYPZHSHTHUHVHWHXLAL\ +BLCLDLELFLGLHLILJLKLLLMLNLOLPLQLRLSLTLULVLWLXLYLZJ1J2J3J4" + +#define aprspos_SYMT2 "OBOCODOEOFOGOHOIOJOKOLOMONOOOPA0A1A2A3A4A5A6A7A8A9NRNS\ +NTNUNVNWNXAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZDSDTDUDVDWDXSAS\ +BSCSDSESFSGSHSISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSYSZQ1Q2Q3Q4" + +#define aprspos_LEN 94 + + +extern void aprspos_GetSym(char d[], uint32_t d_len, char * symb, + char * symt) +/* symbol out of destination call */ +{ + uint32_t n; + if (((d[0UL]=='G' && d[1UL]=='P') && d[2UL]=='S') + && (d[3UL]=='C' || d[3UL]=='E')) { + if ((((uint8_t)d[4UL]>='0' && (uint8_t)d[4UL]<='9') && (uint8_t) + d[5UL]>='0') && (uint8_t)d[5UL]<='9') { + n = (((uint32_t)(uint8_t)d[4UL]-48UL)*10UL+(uint32_t) + (uint8_t)d[5UL])-48UL; + if (n>=1UL && n<=94UL) { + *symb = (char)(32UL+n); + if (d[3UL]=='C') *symt = '/'; + else *symt = '\\'; + } + } + } + else if (((d[0UL]=='G' && d[1UL]=='P') + && d[2UL]=='S' || (d[0UL]=='S' && d[1UL]=='P') + && d[2UL]=='C') || (d[0UL]=='S' && d[1UL]=='Y') + && d[2UL]=='M') { + if (d[3UL]==0) { + *symb = '/'; + *symt = '/'; + } + else { + n = 0UL; + for (;;) { + if (n>=94UL) break; + if (d[3UL]=="BBBCBDBEBFBGBHBIBJBKBLBMBNBOBPP0P1P2P3P4P5P6P7P8P9MR\ +MSMTMUMVMWMXPAPBPCPDPEPFPGPHPIPJPKPLPMPNPOPPPQPRPSPTPUPVPWPXPYPZHSHTHUHVHWHXL\ +ALBLCLDLELFLGLHLILJLKLLLMLNLOLPLQLRLSLTLULVLWLXLYLZJ1J2J3J4"[n*2UL] && d[4UL] + =="BBBCBDBEBFBGBHBIBJBKBLBMBNBOBPP0P1P2P3P4P5P6P7P8P9MRMSMTMU\ +MVMWMXPAPBPCPDPEPFPGPHPIPJPKPLPMPNPOPPPQPRPSPTPUPVPWPXPYPZHSHTHUHVHWHXLALBLCL\ +DLELFLGLHLILJLKLLLMLNLOLPLQLRLSLTLULVLWLXLYLZJ1J2J3J4"[n*2UL+1UL]) { + *symb = (char)(33UL+n); + *symt = '/'; + break; + } + if (d[3UL]=="OBOCODOEOFOGOHOIOJOKOLOMONOOOPA0A1A2A3A4A5A6A7A8A9NR\ +NSNTNUNVNWNXAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZDSDTDUDVDWDXS\ +ASBSCSDSESFSGSHSISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSYSZQ1Q2Q3Q4"[n*2UL] && d[4UL] + =="OBOCODOEOFOGOHOIOJOKOLOMONOOOPA0A1A2A3A4A5A6A7A8A9NRNSNTNU\ +NVNWNXAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZDSDTDUDVDWDXSASBSCS\ +DSESFSGSHSISJSKSLSMSNSOSPSQSRSSSTSUSVSWSXSYSZQ1Q2Q3Q4"[n*2UL+1UL]) { + *symb = (char)(33UL+n); + *symt = '\\'; + if ((uint8_t)d[5UL]>='0' && (uint8_t) + d[5UL]<='9' || (uint8_t)d[5UL]>='A' && (uint8_t) + d[5UL]<='Z') *symt = d[5UL]; + break; + } + ++n; + } + } + } +} /* end GetSym() */ + + +extern void aprspos_BEGIN(void) +{ + static int aprspos_init = 0; + if (aprspos_init) return; + aprspos_init = 1; + osi_BEGIN(); +} + diff --git a/src/aprspos.h b/src/aprspos.h new file mode 100644 index 0000000..f2490a8 --- /dev/null +++ b/src/aprspos.h @@ -0,0 +1,84 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef aprspos_H_ +#define aprspos_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif + +/* get aprs position by OE5DXL */ +#define aprspos_PI2 6.283185307 + +#define aprspos_RAD 1.7453292519444E-2 + +#define aprspos_FEET 0.3048 + +#define aprspos_KNOTS 1.852 +/* nautic miles */ + +#define aprspos_WKNOTS 1.609 +/* wx knots */ + +#define aprspos_SKNOTS 1.609 +/* stormdata knots */ + +#define aprspos_ENCODEGPS "g" + +#define aprspos_ENCODEMICE "m" + +#define aprspos_ENCODECOMP "c" + +#define aprspos_ENCODEGPSDAO "G" + +#define aprspos_ENCODEMICEDAO "M" + +#define aprspos_ENCODEAREA "A" + +#define aprspos_ENCODEMULTILINE "L" + +#define aprspos_EARTH 6370.0 + +#define aprspos_AREASYMT "\\" +/* area object symbol table */ + +#define aprspos_AREASYM "l" +/* area object symbol */ + +struct aprspos_POSITION; + + +struct aprspos_POSITION { + float long0; + float lat; +}; + +extern float aprspos_rad0(float); + +extern char aprspos_posvalid(struct aprspos_POSITION); + +extern float aprspos_distance(struct aprspos_POSITION, + struct aprspos_POSITION); + +extern float aprspos_azimuth(struct aprspos_POSITION, + struct aprspos_POSITION); + +extern void aprspos_GetPos(struct aprspos_POSITION *, uint32_t *, + uint32_t *, int32_t *, char *, char *, + char [], uint32_t, uint32_t, uint32_t, char [], + uint32_t, char *); + +extern void aprspos_GetSym(char [], uint32_t, char *, char *); +/* symbol out of destination call */ + + +extern void aprspos_BEGIN(void); + + +#endif /* aprspos_H_ */ diff --git a/src/aprsstr.c b/src/aprsstr.c new file mode 100644 index 0000000..634d6d4 --- /dev/null +++ b/src/aprsstr.c @@ -0,0 +1,1171 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#define aprsstr_C_ +#ifndef osi_H_ +#include "osi.h" +#endif + +/* string lib by oe5dxl */ +/* needed by hpm-libs */ +/*FROM osi IMPORT WrInt, WrStrLn; */ +static uint8_t CRCL[256]; + +static uint8_t CRCH[256]; + + +extern void aprsstr_Assign(char a[], uint32_t a_len, char b[], + uint32_t b_len) +{ + uint32_t i; + i = 0UL; + for (;;) { + a[i] = b[i]; + if (a[i]==0 || i>=a_len-1) return; + ++i; + if (i>b_len-1) { + if (i<=a_len-1) a[i] = 0; + return; + } + } +} /* end Assign() */ + + +extern void aprsstr_Append(char a[], uint32_t a_len, char b[], + uint32_t b_len) +{ + uint32_t j; + uint32_t i; + j = aprsstr_Length(a, a_len); + i = 0UL; + for (;;) { + if (j>a_len-1) return; + a[j] = b[i]; + if (a[j]==0) return; + ++i; + ++j; + if (i>b_len-1) { + if (j<=a_len-1) a[j] = 0; + return; + } + } +} /* end Append() */ + + +extern void aprsstr_Delstr(char a[], uint32_t a_len, uint32_t from, + uint32_t len) +{ + uint32_t l; + l = aprsstr_Length(a, a_len); + while (from+len0UL) { + --i; + s[i] = '-'; + } + if (ff) { + --i; + s[i] = ' '; + } + if (i>0UL) { + j = 0UL; + while (i<=s_len-1) { + s[j] = s[i]; + ++j; + ++i; + } + } +} /* end IntToStr() */ + + +extern void aprsstr_CardToStr(uint32_t x, uint32_t f, char s[], + uint32_t s_len) +{ + uint32_t j; + uint32_t i; + s[s_len-1] = 0; + i = s_len-1; + do { + --i; + s[i] = (char)(x%10UL+48UL); + x = x/10UL; + } while (!(x==0UL || i==0UL)); + if (ff) { + --i; + s[i] = ' '; + } + if (i>0UL) { + j = 0UL; + while (i<=s_len-1) { + s[j] = s[i]; + ++j; + ++i; + } + } +} /* end CardToStr() */ + + +extern void aprsstr_FixToStr(float x, uint32_t f, char s[], + uint32_t s_len) +{ + uint32_t i; + int32_t n; + char neg; + neg = x<0.0f; + if (neg) x = -x; + n = (int32_t)(uint32_t)X2C_TRUNCC(x,0UL,X2C_max_longcard); + x = x-(float)n; + aprsstr_IntToStr(n, 1UL, s, s_len); + i = aprsstr_Length(s, s_len); + if (neg) { + n = (int32_t)i; + while (n>0L) { + s[n] = s[n-1L]; + --n; + } + s[0UL] = '-'; + ++i; + } + if (f>0UL) { + s[i] = '.'; + ++i; + while (f>1UL) { + /*& (x>0.0)*/ + x = x*10.0f; + n = (int32_t)(uint32_t)X2C_TRUNCC(x,0UL,X2C_max_longcard); + x = x-(float)n; + s[i] = (char)(n+48L); + ++i; + --f; + } + s[i] = 0; + } +} /* end FixToStr() */ + + +extern char aprsstr_StrToCard(char s[], uint32_t s_len, + uint32_t * x) +{ + uint32_t i; + char ok0; + uint32_t tmp; + *x = 0UL; + ok0 = 0; + tmp = s_len-1; + i = 0UL; + if (i<=tmp) for (;; i++) { + if ((uint8_t)s[i]>='0' && (uint8_t)s[i]<='9') { + *x = *x*10UL+((uint32_t)(uint8_t)s[i]-48UL); + ok0 = 1; + } + else return ok0 && s[i]==0; + if (i==tmp) break; + } /* end for */ + return ok0; +} /* end StrToCard() */ + + +extern char aprsstr_StrToInt(char s[], uint32_t s_len, + int32_t * x) +{ + uint32_t i; + char ok0; + *x = 0L; + ok0 = 0; + i = 0UL; + if (s[0UL]=='-') i = 1UL; + while ((i<=s_len-1 && (uint8_t)s[i]>='0') && (uint8_t)s[i]<='9') { + *x = *x*10L+(int32_t)((uint32_t)(uint8_t)s[i]-48UL); + ok0 = 1; + ++i; + } + if (i>s_len-1 || s[i]) ok0 = 0; + if (s[0UL]=='-') *x = -*x; + return ok0; +} /* end StrToInt() */ + +#define aprsstr_M (X2C_DIVR(X2C_max_real,100.0f)) + + +extern char aprsstr_StrToFix(float * x, char s[], + uint32_t s_len) +{ + uint32_t i; + float p; + char ok0; + char neg; + i = 0UL; + neg = 0; + ok0 = 0; + while (i<=s_len-1 && s[i]==' ') ++i; + if (s[i]=='-') { + neg = 1; + ++i; + } + *x = 0.0f; + while ((i<=s_len-1 && (uint8_t)s[i]>='0') && (uint8_t)s[i]<='9') { + if (*x='0') && (uint8_t)s[i]<='9') { + *x = *x+p*(float)((uint32_t)(uint8_t)s[i]-48UL); + p = p*0.1f; + ++i; + ok0 = 1; + } + } + if (neg) *x = -*x; + return ok0 && (i>s_len-1 || s[i]==0); +} /* end StrToFix() */ + + +extern char aprsstr_StrCmp(char a[], uint32_t a_len, + char b[], uint32_t b_len) +{ + uint32_t i; + i = 0UL; + for (;;) { + if (a[i]!=b[i]) return 0; + if ((a[i]==0 || i>=a_len-1) || i>=b_len-1) return 1; + ++i; + } + return 0; +} /* end StrCmp() */ + + +extern int32_t aprsstr_InStr(char a[], uint32_t a_len, char b[], + uint32_t b_len) +/* position b in a else -1*/ +{ + uint32_t j; + uint32_t i; + if (b[0UL]) { + i = 0UL; + j = 0UL; + while (i+j<=a_len-1 && a[i+j]) { + if (a[i+j]!=b[j]) { + j = 0UL; + ++i; + } + else { + ++j; + if (j>b_len-1 || b[j]==0) return (int32_t)i; + } + } + } + return -1L; +} /* end InStr() */ + + +extern void aprsstr_rightbound(char s[], uint32_t s_len, uint32_t p) +{ + uint32_t i; + if (s_len-10UL) { + --p; + if (i>0UL) { + --i; + s[p] = s[i]; + } + else s[p] = ' '; + } +} /* end rightbound() */ + + +extern void aprsstr_TimeToStr(uint32_t t, char s[], uint32_t s_len) +{ + char h[21]; + uint32_t d; + d = t/86400UL; + s[0UL] = 0; + if (d>0UL) { + aprsstr_IntToStr((int32_t)d, 1UL, s, s_len); + aprsstr_Append(s, s_len, "d", 2ul); + } + aprsstr_IntToStr((int32_t)((t/3600UL)%24UL), 2UL, h, 21ul); + if (h[0U]==' ') h[0U] = '0'; + aprsstr_Append(s, s_len, h, 21ul); + aprsstr_Append(s, s_len, ":", 2ul); + aprsstr_IntToStr((int32_t)((t/60UL)%60UL), 2UL, h, 21ul); + if (h[0U]==' ') h[0U] = '0'; + aprsstr_Append(s, s_len, h, 21ul); + aprsstr_Append(s, s_len, ":", 2ul); + aprsstr_IntToStr((int32_t)(t%60UL), 2UL, h, 21ul); + if (h[0U]==' ') h[0U] = '0'; + aprsstr_Append(s, s_len, h, 21ul); +} /* end TimeToStr() */ + + +static void tostr(char tstr[], uint32_t tstr_len, uint32_t n, + const char s[], uint32_t s_len) +{ + char h[2]; + h[1U] = 0; + h[0U] = (char)(48UL+n/10UL); + aprsstr_Append(tstr, tstr_len, h, 2ul); + h[0U] = (char)(48UL+n%10UL); + aprsstr_Append(tstr, tstr_len, h, 2ul); + aprsstr_Append(tstr, tstr_len, s, s_len); +} /* end tostr() */ + + +extern void aprsstr_DateToStr(uint32_t time0, char tstr[], + uint32_t tstr_len) +{ + uint32_t monthlen; + uint32_t day; + uint32_t year; + uint32_t mon; + char k[13]; + tstr[0UL] = 0; + day = 25568UL+time0/86400UL; + /*IF day>=36584 THEN INC(day) END;*/ + year = (day*4UL)/1461UL; + day = 1UL+((day*4UL)%1461UL)/4UL; + mon = 0UL; + k[0U] = 0; + aprsstr_Append(k, 13ul, "3303232332323", 14ul); + if ((year&3UL)==0UL) k[2U] = '1'; + for (;;) { + ++mon; + monthlen = (uint32_t)(uint8_t)k[mon]-20UL; + if (day<=monthlen) break; + day -= monthlen; + } + tostr(tstr, tstr_len, 19UL+year/100UL, "", 1ul); + tostr(tstr, tstr_len, year%100UL, ".", 2ul); + tostr(tstr, tstr_len, mon, ".", 2ul); + tostr(tstr, tstr_len, day, " ", 2ul); + tostr(tstr, tstr_len, (time0/3600UL)%24UL, ":", 2ul); + tostr(tstr, tstr_len, (time0/60UL)%60UL, ":", 2ul); + tostr(tstr, tstr_len, time0%60UL, "", 1ul); +} /* end DateToStr() */ + + +static uint32_t dig(char * err, char c) +{ + if ((uint8_t)c<'0' || (uint8_t)c>'9') { + *err = 1; + return 0UL; + } + else return (uint32_t)(uint8_t)c-48UL; + return 0; +} /* end dig() */ + + +extern char aprsstr_StrToTime(char s[], uint32_t s_len, + uint32_t * time0) +/* to s since 1970*/ +{ + uint32_t mi; + uint32_t h; + uint32_t k; + uint32_t d; + uint32_t m; + uint32_t y; + char err; + char aprsstr_StrToTime_ret; + X2C_PCOPY((void **)&s,s_len); + err = 0; + y = dig(&err, s[0UL])*1000UL+dig(&err, s[1UL])*100UL+dig(&err, + s[2UL])*10UL+dig(&err, s[3UL]); + if (y<1970UL || y>2100UL) { + aprsstr_StrToTime_ret = 0; + goto label; + } + *time0 = (y-1970UL)*365UL+(y-1969UL)/4UL; + m = dig(&err, s[5UL])*10UL+dig(&err, s[6UL]); + d = dig(&err, s[8UL])*10UL+dig(&err, s[9UL]); + if (d<1UL || d>31UL) { + aprsstr_StrToTime_ret = 0; + goto label; + } + k = (uint32_t)((y&3UL)==0UL); + *time0 += d-1UL; + if (m>2UL) *time0 += k; + switch (m) { + case 1UL: + break; + case 2UL: + if (d>28UL+k) err = 1; + *time0 += 31UL; + break; + case 3UL: + *time0 += 59UL; + break; + case 4UL: + if (d>30UL) err = 1; + *time0 += 90UL; + break; + case 5UL: + *time0 += 120UL; + break; + case 6UL: + if (d>30UL) err = 1; + *time0 += 151UL; + break; + case 7UL: + *time0 += 181UL; + break; + case 8UL: + *time0 += 212UL; + break; + case 9UL: + if (d>30UL) err = 1; + *time0 += 243UL; + break; + case 10UL: + *time0 += 273UL; + break; + case 11UL: + if (d>30UL) err = 1; + *time0 += 304UL; + break; + case 12UL: + *time0 += 334UL; + break; + default:; + err = 1; + break; + } /* end switch */ + if (err) { + aprsstr_StrToTime_ret = 0; + goto label; + } + h = dig(&err, s[11UL])*10UL+dig(&err, s[12UL]); + if (h>24UL) { + aprsstr_StrToTime_ret = 0; + goto label; + } + mi = dig(&err, s[14UL])*10UL+dig(&err, s[15UL]); + if (mi>=60UL) { + aprsstr_StrToTime_ret = 0; + goto label; + } + *time0 = ( *time0*24UL+h)*3600UL+mi*60UL; + aprsstr_StrToTime_ret = 1; + label:; + X2C_PFREE(s); + return aprsstr_StrToTime_ret; +} /* end StrToTime() */ + + +static char Hex(uint32_t d) +{ + d = d&15UL; + if (d>9UL) d += 7UL; + return (char)(d+48UL); +} /* end Hex() */ + + +extern void aprsstr_CtrlHex(char s[], uint32_t s_len) +/* replace ctrl char by */ +{ + uint32_t len; + uint32_t j; + uint32_t i; + uint32_t tmp; + len = aprsstr_Length(s, s_len); + i = 0UL; + while (i=tmp) for (;; j--) { + s[j] = s[j-3UL]; + if (j==tmp) break; + } /* end for */ + j = (uint32_t)(uint8_t)s[i]; + s[i] = '<'; + ++i; + s[i] = Hex(j/16UL); + ++i; + s[i] = Hex(j); + ++i; + s[i] = '>'; + } + ++i; + } + s[i] = 0; +} /* end CtrlHex() */ + +#define aprsstr_PORTSEP ":" + +#define aprsstr_CHECKSEP "/" + +#define aprsstr_DEFAULTIP 0x7F000001 + + +extern int32_t aprsstr_GetIp2(char h[], uint32_t h_len, + uint32_t * ip, uint32_t * dp, uint32_t * lp, + char * check) +{ + uint32_t n; + uint32_t p; + uint32_t i; + char ok0; + int32_t aprsstr_GetIp2_ret; + X2C_PCOPY((void **)&h,h_len); + p = 0UL; + h[h_len-1] = 0; + *ip = 0UL; + for (i = 0UL; i<=5UL; i++) { + if (i>=3UL || h[0UL]!=':') { + n = 0UL; + ok0 = 0; + while ((uint8_t)h[p]>='0' && (uint8_t)h[p]<='9') { + ok0 = 1; + n = (n*10UL+(uint32_t)(uint8_t)h[p])-48UL; + ++p; + } + if (!ok0) { + aprsstr_GetIp2_ret = -1L; + goto label; + } + } + if (i<3UL) { + if (h[0UL]!=':') { + if (h[p]!='.' || n>255UL) { + aprsstr_GetIp2_ret = -1L; + goto label; + } + *ip = *ip*256UL+n; + } + } + else if (i==3UL) { + if (h[0UL]!=':') { + *ip = *ip*256UL+n; + if (h[p]!=':' || n>255UL) { + aprsstr_GetIp2_ret = -1L; + goto label; + } + } + else { + p = 0UL; + *ip = 2130706433UL; + } + } + else if (i==4UL) { + *check = h[p]=='/'; + if (h[p]!=':' && h[p]!='/' || n>65535UL) { + aprsstr_GetIp2_ret = -1L; + goto label; + } + *dp = n; + } + else if (n>65535UL) { + aprsstr_GetIp2_ret = -1L; + goto label; + } + *lp = n; + ++p; + } /* end for */ + aprsstr_GetIp2_ret = 0L; + label:; + X2C_PFREE(h); + return aprsstr_GetIp2_ret; +} /* end GetIp2() */ + + +extern void aprsstr_ipv4tostr(uint32_t ip, char s[], uint32_t s_len) +{ + char h[21]; + aprsstr_IntToStr((int32_t)(ip/16777216UL), 0UL, s, s_len); + aprsstr_Append(s, s_len, ".", 2ul); + aprsstr_IntToStr((int32_t)(ip/65536UL&255UL), 0UL, h, 21ul); + aprsstr_Append(s, s_len, h, 21ul); + aprsstr_Append(s, s_len, ".", 2ul); + aprsstr_IntToStr((int32_t)(ip/256UL&255UL), 0UL, h, 21ul); + aprsstr_Append(s, s_len, h, 21ul); + aprsstr_Append(s, s_len, ".", 2ul); + aprsstr_IntToStr((int32_t)(ip&255UL), 0UL, h, 21ul); + aprsstr_Append(s, s_len, h, 21ul); +} /* end ipv4tostr() */ + + +extern void aprsstr_HashCh(char c, uint8_t * hashl, uint8_t * hashh) +{ + uint8_t b; + if (c!=' ') { + b = (uint8_t)((uint8_t)(uint8_t)c^*hashl); + *hashl = CRCL[b]^*hashh; + *hashh = CRCH[b]; + } +} /* end HashCh() */ + + +extern void aprsstr_AppCRC(char frame[], uint32_t frame_len, + int32_t size) +{ + uint8_t h; + uint8_t l; + uint8_t b; + int32_t i; + int32_t tmp; + l = 0U; + h = 0U; + tmp = size-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + b = (uint8_t)((uint8_t)(uint8_t)frame[i]^l); + l = CRCL[b]^h; + h = CRCH[b]; + if (i==tmp) break; + } /* end for */ + frame[size] = (char)l; + frame[size+1L] = (char)h; +} /* end AppCRC() */ + + +extern uint32_t aprsstr_Hash(char frame[], uint32_t frame_len, + int32_t start, int32_t end) +{ + uint8_t h; + uint8_t l; + uint8_t b; + int32_t i; + char c; + int32_t tmp; + l = 0U; + h = 0U; + tmp = end-1L; + i = start; + if (i<=tmp) for (;; i++) { + c = frame[i]; + if (c!=' ') { + b = (uint8_t)((uint8_t)(uint8_t)c^l); + l = CRCL[b]^h; + h = CRCH[b]; + } + if (i==tmp) break; + } /* end for */ + return (uint32_t)(uint8_t)(char)l+(uint32_t)(uint8_t) + (char)h*256UL; +} /* end Hash() */ + +static char aprsstr_CTRL = '\003'; + +static char aprsstr_PID = '\360'; + +#define aprsstr_cTO ">" + +#define aprsstr_cVIA "," + +#define aprsstr_cLASTCALL ":" + +#define aprsstr_cSSID "-" + +#define aprsstr_cREPEATED "*" + +#define aprsstr_MAXVIAS 8 + +#define aprsstr_MAXSSID 15 + +#define aprsstr_SSIDBASE 48 + +#define aprsstr_CALLFILL " " + +#define aprsstr_MAXINFOLEN 256 + + +static char call(int32_t * p, char raw[], uint32_t raw_len, + uint32_t * i, char mon[], uint32_t mon_len, + char sep1, char sep2, char sep3, + uint32_t sbase) +{ + uint32_t s; + uint32_t l; + l = 0UL; + while ((((mon[*i] && mon[*i]!=sep1) && mon[*i]!=sep2) && mon[*i]!=sep3) + && mon[*i]!='-') { + s = (uint32_t)(uint8_t)mon[*i]*2UL&255UL; + if (s<=64UL) return 0; + raw[*p] = (char)s; + ++*p; + ++*i; + ++l; + if (l>=7UL) return 0; + } + while (l<6UL) { + raw[*p] = '@'; + ++*p; + ++l; + } + s = 0UL; + if (mon[*i]=='-') { + ++*i; + while ((uint8_t)mon[*i]>='0' && (uint8_t)mon[*i]<='9') { + s = (s*10UL+(uint32_t)(uint8_t)mon[*i])-48UL; + ++*i; + } + if (s>15UL) return 0; + } + raw[*p] = (char)((s+sbase)*2UL); + ++*p; + return 1; +} /* end call() */ + + +extern void aprsstr_mon2raw(char mon[], uint32_t mon_len, + char raw[], uint32_t raw_len, int32_t * p) +{ + uint32_t r; + uint32_t n; + uint32_t i; + uint32_t tmp; + *p = 7L; + i = 0UL; + if (!call(p, raw, raw_len, &i, mon, mon_len, '>', 0, 0, 48UL)) { + *p = 0L; /* from call */ + return; + } + *p = 0L; + if (mon[i]!='>') return; + /* ">" */ + ++i; + if (!call(p, raw, raw_len, &i, mon, mon_len, ':', ',', 0, 112UL)) { + *p = 0L; /* dest call bit 7 for UI v2 command */ + return; + } + /* IF NOT call(cLASTCALL, cVIA, 0C, SSIDBASE) THEN p:=0; RETURN END; + (* dest call bit 7 for UI v2 command *) */ + *p = 14L; + n = 0UL; + while (mon[i]==',') { + ++i; + if (!call(p, raw, raw_len, &i, mon, mon_len, ':', ',', '*', 48UL)) { + *p = 0L; + return; + } + ++n; + if (n>8UL) { + *p = 0L; + return; + } + if (mon[i]=='*') { + /* "*" has repeatet sign */ + ++i; + r = (uint32_t)*p; + if (r>=21UL) for (tmp = (uint32_t)(r-21UL)/7UL;;) { + raw[r-1UL] = (char)((uint32_t)(uint8_t)raw[r-1UL]+128UL); + /* set "has repeated" flags */ + if (!tmp) break; + --tmp; + r -= 7UL; + } /* end for */ + } + } + if (*p==0L || mon[i]!=':') { + *p = 0L; /* ":" start of info sign */ + return; + } + raw[*p-1L] = (char)((uint32_t)(uint8_t)raw[*p-1L]+1UL); + /* end address field mark */ + raw[*p] = '\003'; + ++*p; + raw[*p] = '\360'; + ++*p; + ++i; + n = 256UL; + while (mon[i] && i<=mon_len-1) { + /* copy info part */ + if (*p>=(int32_t)(raw_len-1)-2L || n==0UL) { + *p = 0L; /* spare 2 bytes for crc */ + return; + } + raw[*p] = mon[i]; + ++*p; + ++i; + --n; + } + aprsstr_AppCRC(raw, raw_len, *p); + *p += 2L; +} /* end mon2raw() */ + + +extern char aprsstr_Call2Str(char r[], uint32_t r_len, + char t[], uint32_t t_len, uint32_t pos, + uint32_t * len) +{ + uint32_t ssid; + uint32_t e; + uint32_t i; + char c; + uint32_t tmp; + e = pos; + tmp = pos+5UL; + i = pos; + if (i<=tmp) for (;; i++) { + if (r[i]!='@') e = i; + if (i==tmp) break; + } /* end for */ + tmp = e; + i = pos; + if (i<=tmp) for (;; i++) { + c = (char)((uint32_t)(uint8_t)r[i]>>1); + if ((uint8_t)c<=' ') { + t[*len] = 0; + *len = 0UL; + return 0; + } + t[*len] = c; + ++*len; + if (i==tmp) break; + } /* end for */ + ssid = (uint32_t)(uint8_t)r[pos+6UL]>>1&15UL; + if (ssid>0UL) { + t[*len] = '-'; + ++*len; + if (ssid>9UL) { + t[*len] = '1'; + ++*len; + } + t[*len] = (char)(ssid%10UL+48UL); + ++*len; + } + return 1; +} /* end Call2Str() */ + + +static void brandghost(char b[], uint32_t b_len, uint32_t brand) +{ + uint32_t l; + uint32_t j; + uint32_t i; + char s1[21]; + char s[21]; + uint32_t tmp; + i = 0UL; + for (;;) { + if (i>=b_len-1 || b[i]==0) return; + if (b[i]==',' || b[i]==':') break; + ++i; + } + /* + IF NOT v1 & (b[i]=",") THEN + IF ((b[i+1]<>"W") OR (b[i+2]<>"I") OR (b[i+3]<>"D") OR (b[i+4]<>"E") + OR (b[i+5]<>"1") OR (b[i+6]<>"-") OR (b[i+7]<>"1") + OR (b[i+8]<>",") + OR (b[i+9]<>"W") OR (b[i+10]<>"I") OR (b[i+11]<>"D") OR (b[i+12]<>"E") + OR (b[i+13]<>"2") + OR (b[i+14]<>"-") OR (b[i+15]<>"1") & (b[i+15]<>"2") OR (b[i+16]<>":") + ) + & ((b[i+1]<>"R") OR (b[i+2]<>"E") OR (b[i+3]<>"L") OR (b[i+4]<>"A") + OR (b[i+5]<>"Y") + OR (b[i+6]<>":")) THEN v1:=TRUE END; + END; + */ + if (b[i]==',') { + j = i+1UL; + for (;;) { + /* goto end of first via */ + if (j>=b_len-1 || b[j]==0) return; + if (b[j]==':' || b[j]==',') break; + ++j; + } + if (brand<256UL && ((((j<=3UL || (uint8_t)b[j-1UL]<'0') + || (uint8_t)b[j-1UL]>'9') || b[j-2UL]!='-') + || b[j-1UL]!=b[j-3UL])) return; + /* frame has n<>N so known as not direct */ + j = i+1UL; + for (;;) { + /* look for h-bit */ + if (j>=b_len-1 || b[j]==0) return; + if (b[j]==':') break; + if (b[j]=='*') return; + /* frame has h bit so known as not direct */ + ++j; + } + } + strncpy(s,",GHOST",21u); + aprsstr_IntToStr((int32_t)brand, 0UL, s1, 21ul); + aprsstr_Append(s, 21ul, s1, 21ul); + aprsstr_Append(s, 21ul, "*", 2ul); + l = aprsstr_Length(s, 21ul); + i = 0UL; + while ((i<=b_len-1 && b[i]) && b[i]!=':') ++i; + if (b[i]==':') { + j = i; + while (j<=b_len-1 && b[j]) ++j; + if (b[j]==0 && j+l=i) { + b[j+l] = b[j]; + --j; + } + tmp = l-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + ++j; + b[j] = s[i]; + if (i==tmp) break; + } /* end for */ + } + } +} /* end brandghost() */ + + +extern void aprsstr_raw2mon(char raw[], uint32_t raw_len, + char mon[], uint32_t mon_len, uint32_t len, + uint32_t * p, aprsstr_GHOSTSET ghostset) +{ + uint32_t brand; + uint32_t i; + char hcheck; + if ((((((len>21UL && !((uint32_t)(uint8_t)raw[13UL]&1)) + && raw[14UL]=='\202') && raw[15UL]=='\240') + && raw[16UL]=='\244') && raw[17UL]=='\246') + && raw[18UL]=='@') brand = 256UL; + else { + brand = (uint32_t)(uint8_t)raw[6UL]/32UL+((uint32_t)(uint8_t) + raw[13UL]/32UL)*8UL; + } + *p = 0UL; + mon[0UL] = 0; + i = 0UL; + while (!((uint32_t)(uint8_t)raw[i]&1)) { + ++i; + if (i>len) { + mon[0UL] = 0; /* no address end mark found */ + return; + } + } + if (i%7UL!=6UL) { + mon[0UL] = 0; /* address end not modulo 7 error */ + return; + } + if (!aprsstr_Call2Str(raw, raw_len, mon, mon_len, 7UL, p)) { + mon[0UL] = 0; + return; + } + mon[*p] = '>'; + ++*p; + if (!aprsstr_Call2Str(raw, raw_len, mon, mon_len, 0UL, p)) { + mon[0UL] = 0; + return; + } + i = 14UL; + hcheck = 1; + while (i+6UL=128UL) { + if (!hcheck) { + mon[0UL] = 0; /* wrong H bit */ + return; + } + if (((uint32_t)(uint8_t)raw[i+6UL]&1) || (uint32_t)(uint8_t) + raw[i+13UL]<128UL) { + mon[*p] = '*'; + ++*p; + } + } + else hcheck = 0; + i += 7UL; + } + if (raw[i]!='\003' && raw[i]!='\023') { + mon[0UL] = 0; /* not UI frame */ + return; + } + if (raw[i]=='\023') brand += 64UL; + if (raw[i+1UL]!='\360') brand += 128UL; + i += 2UL; /* ctrl, pid */ + mon[*p] = ':'; + ++*p; + while (i255UL || X2C_INL(brand, + 257,ghostset)) brandghost(mon, mon_len, brand); +/*WrInt(ORD(raw[6]) DIV 32,1); WrInt(ORD(raw[13]) DIV 32,1);WrStrLn(mon); */ +} /* end raw2mon() */ + + +extern void aprsstr_extrudp2(char ib[], uint32_t ib_len, char ud[], + uint32_t ud_len, int32_t * len) +/* extract axudp2 header */ +{ + int32_t j; + int32_t i; + i = 0L; + j = 0L; + do { + ud[i] = ib[i]; + ++i; + } while (!((i>=(int32_t)(ud_len-1) || i>=*len) || ib[i]==0)); + ud[i] = 0; + ++i; + if (i>=*len) *len = 0L; + else { + *len -= i; + while (j<*len) { + ib[j] = ib[i]; + ++j; + ++i; + } + } +} /* end extrudp2() */ + + +extern void aprsstr_cleanfilename(char s[], uint32_t s_len) +{ + uint32_t j; + uint32_t i; + i = 0UL; + j = 0UL; + while (i<=s_len-1 && s[i]) { + /* remove leftside junk */ + if (j>0UL || (uint8_t)s[i]>' ') { + s[j] = s[i]; + ++j; + } + ++i; + } + while (j>0UL && (uint8_t)s[j-1UL]<=' ') --j; + if (j<=s_len-1) s[j] = 0; +} /* end cleanfilename() */ + +#define aprsstr_POLINOM 0x8408 + + +static void Gencrctab(void) +{ + uint32_t c; + uint32_t crc; + uint32_t i; + for (c = 0UL; c<=255UL; c++) { + crc = 255UL-c; + for (i = 0UL; i<=7UL; i++) { + if ((crc&1)) crc = (uint32_t)((uint32_t)(crc>>1)^0x8408UL); + else crc = crc>>1; + } /* end for */ + CRCL[c] = (uint8_t)crc; + CRCH[c] = (uint8_t)(255UL-(crc>>8)); + } /* end for */ +} /* end Gencrctab() */ + + +extern void aprsstr_BEGIN(void) +{ + static int aprsstr_init = 0; + if (aprsstr_init) return; + aprsstr_init = 1; + if (sizeof(uint8_t)!=1) X2C_ASSERT(0); + if (sizeof(aprsstr_GHOSTSET)!=36) X2C_ASSERT(0); + osi_BEGIN(); + Gencrctab(); +} + diff --git a/src/aprsstr.h b/src/aprsstr.h new file mode 100644 index 0000000..9ad8b9c --- /dev/null +++ b/src/aprsstr.h @@ -0,0 +1,103 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef aprsstr_H_ +#define aprsstr_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif + +/* string lib by oe5dxl */ +typedef uint32_t aprsstr_TIME; + +typedef uint32_t aprsstr_IPNUM; + +typedef uint32_t aprsstr_UDPPORT; + +typedef uint8_t aprsstr_SET8; + +typedef uint32_t aprsstr_GHOSTSET[9]; + +#define aprsstr_CALLLEN 7 + +#define aprsstr_HBIT 128 + +extern void aprsstr_Assign(char [], uint32_t, char [], uint32_t); + +extern void aprsstr_Append(char [], uint32_t, char [], uint32_t); + +extern void aprsstr_Delstr(char [], uint32_t, uint32_t, uint32_t); + +extern void aprsstr_Extractword(char [], uint32_t, char [], + uint32_t); + +extern uint32_t aprsstr_Length(char [], uint32_t); + +extern void aprsstr_IntToStr(int32_t, uint32_t, char [], uint32_t); + +extern void aprsstr_CardToStr(uint32_t, uint32_t, char [], + uint32_t); + +extern void aprsstr_FixToStr(float, uint32_t, char [], uint32_t); + +extern char aprsstr_StrToCard(char [], uint32_t, uint32_t *); + +extern char aprsstr_StrToInt(char [], uint32_t, int32_t *); + +extern char aprsstr_StrToFix(float *, char [], uint32_t); + +extern char aprsstr_StrCmp(char [], uint32_t, char [], + uint32_t); + +extern int32_t aprsstr_InStr(char [], uint32_t, char [], + uint32_t); + +extern void aprsstr_TimeToStr(uint32_t, char [], uint32_t); + +extern void aprsstr_DateToStr(uint32_t, char [], uint32_t); + +extern char aprsstr_StrToTime(char [], uint32_t, uint32_t *); + +extern void aprsstr_CtrlHex(char [], uint32_t); + +extern int32_t aprsstr_GetIp2(char [], uint32_t, uint32_t *, + uint32_t *, uint32_t *, char *); + +extern void aprsstr_ipv4tostr(uint32_t, char [], uint32_t); + +extern char aprsstr_Call2Str(char [], uint32_t, char [], + uint32_t, uint32_t, uint32_t *); + +extern void aprsstr_mon2raw(char [], uint32_t, char [], uint32_t, + int32_t *); + +extern void aprsstr_raw2mon(char [], uint32_t, char [], uint32_t, + uint32_t, uint32_t *, aprsstr_GHOSTSET); + +extern void aprsstr_extrudp2(char [], uint32_t, char [], + uint32_t, int32_t *); + +extern void aprsstr_AppCRC(char [], uint32_t, int32_t); + +extern void aprsstr_HashCh(char, uint8_t *, uint8_t *); + +extern uint32_t aprsstr_Hash(char [], uint32_t, int32_t, + int32_t); + +extern void aprsstr_cleanfilename(char [], uint32_t); + +extern void aprsstr_Caps(char [], uint32_t); + +extern void aprsstr_rightbound(char [], uint32_t, uint32_t); + + +extern void aprsstr_BEGIN(void); + + +#endif /* aprsstr_H_ */ diff --git a/src/aprstat.c b/src/aprstat.c new file mode 100644 index 0000000..d8afd8c --- /dev/null +++ b/src/aprstat.c @@ -0,0 +1,1513 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef aprstat_H_ +#include "aprstat.h" +#endif +#define aprstat_C_ +#ifndef maptool_H_ +#include "maptool.h" +#endif +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef useri_H_ +#include "useri.h" +#endif +#ifndef aprstext_H_ +#include "aprstext.h" +#endif + + + +/* aprs statistc graphs by oe5dxl */ +#define aprstat_KMHTIME 600 + + +static void setpix(maptool_pIMAGE img, int32_t x, int32_t y, + int32_t rr, int32_t gg, int32_t bb) +{ + struct maptool_PIX * anonym; + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(x)*img->Len0+y]; + anonym->r = (uint16_t)rr; + anonym->g = (uint16_t)gg; + anonym->b = (uint16_t)bb; + } +} /* end setpix() */ + + +static void str(maptool_pIMAGE img, uint32_t x, uint32_t y, char s[], + uint32_t s_len) +{ + uint32_t i; + uint32_t l; + int32_t inc; + struct aprsdecode_COLTYP col; + X2C_PCOPY((void **)&s,s_len); + l = aprsstr_Length(s, s_len); + i = 0UL; + maptool_Colset(&col, 'W'); + while (iAdr[(xx)*img->Len0+yy]; + anonym->r += (uint16_t)((rr*l)/512UL); + anonym->g += (uint16_t)((gg*l)/512UL); + anonym->b += (uint16_t)((bb*l)/512UL); + } + l = pixl(fx, 1.0f-fy); + { /* with */ + struct maptool_PIX * anonym0 = &img->Adr[(xx+1UL)*img->Len0+yy]; + anonym0->r += (uint16_t)((rr*l)/512UL); + anonym0->g += (uint16_t)((gg*l)/512UL); + anonym0->b += (uint16_t)((bb*l)/512UL); + } + l = pixl(1.0f-fx, fy); + { /* with */ + struct maptool_PIX * anonym1 = &img->Adr[(xx)*img->Len0+(yy+1UL)]; + anonym1->r += (uint16_t)((rr*l)/512UL); + anonym1->g += (uint16_t)((gg*l)/512UL); + anonym1->b += (uint16_t)((bb*l)/512UL); + } + l = pixl(fx, fy); + { /* with */ + struct maptool_PIX * anonym2 = &img->Adr[(xx+1UL)*img->Len0+(yy+1UL)]; + anonym2->r += (uint16_t)((rr*l)/512UL); + anonym2->g += (uint16_t)((gg*l)/512UL); + anonym2->b += (uint16_t)((bb*l)/512UL); + } +} /* end addpix() */ + +#define aprstat_KL0 512 + + +static void fillpix(maptool_pIMAGE img, uint32_t x, uint32_t yfrom, + float yto, uint32_t rr, uint32_t gg, uint32_t bb) +{ + float fy; + uint32_t yy; + struct maptool_PIX * anonym; + yy = aprsdecode_trunc(yto); + fy = yto-(float)yy; + while (yfrom<=yy) { + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(x)*img->Len0+yfrom]; + anonym->r += (uint16_t)rr; + anonym->g += (uint16_t)gg; + anonym->b += (uint16_t)bb; + } + ++yfrom; + } +} /* end fillpix() */ + + +static uint32_t sfact(float y) +{ + uint32_t m; + uint32_t s; + s = 1UL; + m = 2UL; + while (X2C_DIVR(y,(float)s)>X2C_DIVR(200.0f, + (float)(aprsdecode_lums.fontysize+2UL))) { + s = s*m; + if (m==2UL) m = 5UL; + else m = 2UL; + } + return s; +} /* end sfact() */ + + +static uint32_t dynmaxx(uint32_t margin, uint32_t min0, + uint32_t max0) +{ + if (max0+margin*2UL>(uint32_t)maptool_xsize) { + if ((uint32_t)maptool_xsize>min0) { + max0 = (uint32_t)maptool_xsize-margin*2UL; + } + else max0 = min0-margin*2UL; + } + return max0; +} /* end dynmaxx() */ + +#define aprstat_MAXT 7200 + +#define aprstat_X 620 + +#define aprstat_Y 150 + +#define aprstat_MARGIN1 16 + +#define aprstat_XI 636 + +#define aprstat_YI 166 + + +extern void aprstat_btimehist(maptool_pIMAGE * img, aprsdecode_pOPHIST op) +{ + uint32_t t[7200]; + aprsdecode_pFRAMEHIST pf; + uint32_t textd; + uint32_t textx; + uint32_t max0; + uint32_t expand; + uint32_t scale0; + uint32_t xm; + uint32_t sum; + uint32_t y; + uint32_t i; + uint32_t dt; + char s[256]; + uint32_t tmp; + size_t tmp0[2]; + if (op==0) return; + for (i = 0UL; i<=7199UL; i++) { + t[i] = 0UL; + } /* end for */ + pf = op->frames; + sum = 0UL; + if (pf) { + while (pf->next) { + if (maptool_vistime(pf->time0) && pf->next->time0>=pf->time0) { + dt = pf->next->time0-pf->time0; + if (dt<=7199UL) { + ++t[dt]; + ++sum; + } + } + pf = pf->next; + } + } + sum -= sum/20UL; + xm = 0UL; + y = 0UL; + do { + y += t[xm]; + ++xm; + } while (!(xm>=7199UL || y>=sum)); + ++xm; + if (xm<120UL) xm = 120UL; + for (i = xm+1UL; i<=7199UL; i++) { + t[xm] += t[i]; /* add not shown rest to last shown element */ + } /* end for */ + scale0 = ((xm+620UL)-1UL)/620UL; + textd = 50UL; + if (scale0>30UL) { + scale0 = 60UL; + textx = 50UL; + } + else if (scale0>12UL) { + scale0 = 30UL; + textx = 20UL; + } + else if (scale0>6UL) { + scale0 = 12UL; + textx = 10UL; + } + else if (scale0>3UL) { + scale0 = 6UL; + textx = 5UL; + } + else if (scale0>2UL) { + scale0 = 3UL; + textx = 3UL; + textd = 60UL; + } + else if (scale0>1UL) { + scale0 = 2UL; + textx = 2UL; + textd = 60UL; + } + else { + scale0 = 1UL; + textx = 1UL; + textd = 60UL; + } + if (scale0>1UL) { + for (i = 1UL; i<=7199UL; i++) { + if (i%scale0==0UL) t[i/scale0] = 0UL; + t[i/scale0] += t[i]; + } /* end for */ + } + xm = ((xm+scale0)-1UL)/scale0; + expand = 1UL; + if (xm<310UL) expand = 2UL; + else if (xm>620UL) xm = 620UL; + else if (xm==0UL) return; + xm = xm*expand; + max0 = 0UL; + tmp = xm-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if (t[i]>max0) max0 = t[i]; + if (i==tmp) break; + } /* end for */ + if (max0==0UL) return; + tmp = xm-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + t[i] = (t[i]*150UL)/max0; + if (i==tmp) break; + } /* end for */ + X2C_DYNALLOCATE((char **)img,sizeof(struct maptool_PIX), + (tmp0[0] = xm+16UL,tmp0[1] = 166U,tmp0),2u); + useri_debugmem.screens += (*img)->Len1*(*img)->Size1; + if (*img==0) { + osi_WrStrLn("error image alloc", 18ul); + return; + } + maptool_clr(*img); + tmp = xm-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + setpix(*img, (int32_t)(i+8UL), 7L, 0L, 500L, 800L); + if ((i/expand)%10UL==0UL) { + setpix(*img, (int32_t)(i+8UL), 6L, 0L, 500L, 800L); + } + if ((i/expand)%textd==0UL) { + setpix(*img, (int32_t)(i+8UL), 5L, 0L, 500L, 800L); + setpix(*img, (int32_t)(i+8UL), 4L, 0L, 500L, 800L); + } + for (y = 0UL; y<=149UL; y++) { + setpix(*img, (int32_t)(i+8UL), (int32_t)(y+8UL), 50L, + (int32_t)(20UL*(uint32_t)(char)((i/expand)/10UL&1) + +30UL), 30L); + } /* end for */ + y = 0UL; + while (ycall, 9ul); + num(*img, 10L, (int32_t)((166UL-aprsdecode_lums.fontysize)-1UL), + (int32_t)max0, s, 256ul); + num(*img, (int32_t)((expand*textd+8UL)-12UL), 8L, (int32_t)textx, "m", + 2ul); +/* + DISPOSE(img); +*/ +} /* end btimehist() */ + +#define aprstat_MAXX 1584 + +#define aprstat_MINX 584 + +#define aprstat_MAXY 120 + +#define aprstat_MARGIN 8 + +#define aprstat_XSTEPS 8 +/* in 1 pixel */ + +#define aprstat_FILTERLEN 6 +/* median filter span in pixels */ + +#define aprstat_NOINFOTIME 300 +/* seconds timeout to no info */ + +#define aprstat_MINSPAN 3600 + +#define aprstat_MAXSPAN 28800 + + +extern void aprstat_kmhist(maptool_pIMAGE * img, aprsdecode_pOPHIST op, + char * test) +{ + aprsdecode_pFRAMEHIST fold; + aprsdecode_pFRAMEHIST fto; + aprsdecode_pFRAMEHIST ffrom; + aprsdecode_pFRAMEHIST fr; + uint32_t ot; + uint32_t t1; + uint32_t t0; + uint32_t markkm; + uint32_t markx; + uint32_t maxx; + uint32_t maxkm10; + uint32_t maxkm; + uint32_t tf; + uint32_t sp; + uint32_t i; + uint32_t xi; + uint32_t xt; + float ys; + float dy; + float maxy; + char h[256]; + char s[256]; + struct aprspos_POSITION po; + float vt[12720]; + char marks[1584]; + uint32_t tops[5]; + struct aprsdecode_DAT dat; + uint32_t tmp; + size_t tmp0[2]; + if (op==0 || op->frames==0) { + *test = 0; + return; + } + fto = 0; + ffrom = 0; + fr = op->frames; + po = fr->vardat->pos; + fold = 0; + do { + /* find first to last move */ + if (((maptool_vistime(fr->time0) && !(fr->nodraw&~0x1U)) + && aprspos_posvalid(fr->vardat->pos)) && aprspos_distance(po, + fr->vardat->pos)>0.05f) { + /* find last move */ + fto = fr; + po = fr->vardat->pos; + if (ffrom==0) ffrom = fold; + fold = fr; + } + fr = fr->next; + } while (fr); + if (fto==0 || ffrom==0) { + *test = 0; /* no move */ + return; + } + if (*test) return; + *img = 0; + for (xi = 0UL; xi<=1583UL; xi++) { + marks[xi] = 0; + } /* end for */ + /* + IF ffrom=NIL THEN ffrom:=op^.frames END; + */ + t1 = fto->time0; + while (ffrom->next && (!(~ffrom->nodraw&0x1U) || ffrom->time0+28800ULnext; + t0 = ffrom->time0; + if (t1nodraw&~0x1U) && aprsdecode_Decode(fr->vardat->raw, 500ul, + &dat)>=0L) && dat.speed=tops[i]) { + tops[i] = dat.speed; + break; + } + ++i; + if (i>4UL) break; + } + } + if (fr==fto) break; + fr = fr->next; + if (fr==0) break; + } + /*FOR i:=0 TO HIGH(tops) DO WrInt(tops[i], 10) END; */ + while ((float)tops[0U]>(float)tops[1U]*1.5f) { + for (i = 0UL; i<=3UL; i++) { + tops[i] = tops[i+1UL]; + } /* end for */ + } + markx = 0UL; + markkm = 0UL; + maxx = (1584UL*((t1-t0)+3600UL))/28800UL; /* guess picture width */ + if (maxx<584UL) maxx = 584UL; + else if (maxx>1584UL) maxx = 1584UL; + ot = t0; + fr = ffrom; + xi = 0UL; + maxy = 0.0f; + dy = 0.0f; + tf = 0UL; + for (;;) { + if ((!(fr->nodraw&~0x1U) && aprsdecode_Decode(fr->vardat->raw, 500ul, + &dat)>=0L) && (!useri_configon(useri_fTRACKFILT) + || dat.speed1000.0f) dy = 1000.0f; + if (fr->time0>ot+300UL) tf = 48UL; + xt = aprsdecode_trunc((X2C_DIVR((float)(fr->time0-t0), + (float)(t1-t0)))*(float)(maxx*8UL-1UL)); + /* x position in picture */ + if (xt>=maxx*8UL-1UL) xt = maxx*8UL; + if (xi/8UL>3UL) marks[xi/8UL-3UL] = 1; + if (dy>maxy) maxy = dy; + while (xi0UL) { + --tf; + if (tf==0UL) dy = 0.0f; + } + } + ot = fr->time0; + if ((dat.pos.lat==aprsdecode_click.markpos.lat && dat.pos.long0==aprsdecode_click.markpos.long0) + && aprsdecode_click.markpost==ot) { + markx = xi/8UL; + markkm = (uint32_t)aprsdecode_knottokmh((int32_t)dat.speed); + } + } + if (fr==fto) break; + fr = fr->next; + if (fr==0) break; + } + tf = 48UL; + while (xi<=12719UL) { + vt[xi] = dy; + ++xi; + if (tf>0UL) --tf; + else dy = 0.0f; + } + tmp = maxx*8UL-1UL; + xi = 0UL; + if (xi<=tmp) for (;; xi++) { + dy = 0.0f; + for (xt = 0UL; xt<=47UL; xt++) { + dy = dy+vt[xi+xt]*(1.0f-sq((float)xt*4.1666666666667E-2f-1.0f)); + /* FIR lowpass */ + } /* end for */ + vt[xi] = dy; + if (xi==tmp) break; + } /* end for */ + maxkm = aprsdecode_trunc(maxy); + maxkm10 = ((maxkm+9UL)/10UL)*10UL; + if (maxy>=2.0f) { + maxy = X2C_DIVR(3.75f,(float)maxkm10); /* FIR gain integral 1-x^2 */ + for (xi = 0UL; xi<=12719UL; xi++) { + vt[xi] = vt[xi]*maxy; /* fit y in picture */ + } /* end for */ + X2C_DYNALLOCATE((char **)img,sizeof(struct maptool_PIX), + (tmp0[0] = maxx+16UL,tmp0[1] = 136U,tmp0),2u); + useri_debugmem.screens += (*img)->Len1*(*img)->Size1; + if (*img==0) { + osi_WrStrLn("error image alloc", 18ul); + return; + } + maptool_clr(*img); + /* + FOR xt:=MARGIN TO MAXY+MARGIN-1 DO + FOR xi:=MARGIN TO MAXX+MARGIN-1 DO + WITH img^[xi+xt*(MAXX+2*MARGIN)] DO + r:=30; g:=60+50*ORD(ODD(xt DIV 10)); + b:=80+200*ORD(marks[xi-MARGIN]); + END; + END; + END; + */ + dy = (X2C_DIVR(120.0f,(float)maxkm10))*10.0f; + ys = 0.0f; + xt = 0UL; + sp = 0UL; + do { + /* draw y scale and paper and waypoints*/ + for (i = 6UL-2UL*(uint32_t)(sp%5UL==0UL); i<=8UL; i++) { + setpix(*img, (int32_t)i, + (int32_t)(aprsdecode_trunc(ys+0.5f)+8UL), 200L, 1000L, + 200L); + } /* end for */ + ys = ys+dy; + while (xt20.0f && ys<=(float)maxx) { + if (ys-dy*0.5f>0.0f) { + /* draw 1/2 h mark */ + for (i = 6UL; i<=7UL; i++) { + setpix(*img, (int32_t)(aprsdecode_trunc(ys-dy*0.5f)+8UL), + (int32_t)i, 200L, 1000L, 200L); + } /* end for */ + } + sp = sp+24UL+useri_localtime()/3600UL; + do { + /* draw h and rest of 1/2h marks */ + for (i = 4UL; i<=7UL; i++) { + setpix(*img, (int32_t)(aprsdecode_trunc(ys)+8UL), + (int32_t)i, 200L, 1000L, 200L); + } /* end for */ + if (ys+dy*0.5f<=(float)maxx) { + for (i = 6UL; i<=7UL; i++) { + setpix(*img, (int32_t)(aprsdecode_trunc(ys+dy*0.5f)+8UL), + (int32_t)i, 200L, 1000L, 200L); + } /* end for */ + } + num(*img, (int32_t)((aprsdecode_trunc(ys)+8UL)-6UL), 8L, + (int32_t)(sp%24UL), "h", 2ul); + ++sp; + ys = ys+dy; + } while (ys<=(float)maxx); + } + if (markx>3UL) { + markx -= 3UL; + for (xi = 8UL; xi<=128UL; xi++) { + setpix(*img, (int32_t)(markx+8UL), (int32_t)xi, 500L, 200L, + 50L); + } /* end for */ + } + tmp = maxx*8UL-1UL; + xi = 8UL; + if (xi<=tmp) for (;; xi++) { + /* draw graph */ + dy = vt[xi]; + if (dy>=0.1f) { + if (dy>120.0f) dy = 120.0f; + addpix(*img, (float)xi*0.125f+8.0f, dy+8.0f, 125UL, 125UL, + 12UL); + } + if (xi==tmp) break; + } /* end for */ + strncpy(s," ",256u); + aprsstr_Append(s, 256ul, op->call, 9ul); + aprsstr_Append(s, 256ul, " max=", 6ul); + aprsstr_IntToStr((int32_t)maxkm, 1UL, h, 256ul); + aprsstr_Append(s, 256ul, h, 256ul); + if (markx>0UL) { + aprsstr_Append(s, 256ul, " cursor=", 9ul); + aprsstr_IntToStr((int32_t)markkm, 1UL, h, 256ul); + aprsstr_Append(s, 256ul, h, 256ul); + } + aprsstr_Append(s, 256ul, "km/h", 5ul); + num(*img, 10L, (int32_t)((136UL-aprsdecode_lums.fontysize)-1UL), + (int32_t)maxkm10, s, 256ul); + } +/* + IF img<>NIL THEN DISPOSE(img) END; +*/ +} /* end kmhist() */ + + +static void paper(maptool_pIMAGE * img, float yax0, float yax1, + uint32_t step, uint32_t margin, uint32_t maxx, + uint32_t maxy, char name[], uint32_t name_len) +{ + uint32_t y; + uint32_t x; + int32_t so; + int32_t s; + float v; + struct maptool_PIX * anonym; + uint32_t tmp; + uint32_t tmp0; + X2C_PCOPY((void **)&name,name_len); + so = osi_realint(aprsdecode_floor(X2C_DIVR(yax0,(float)step))); + tmp = maxy-1UL; + y = 0UL; + if (y<=tmp) for (;; y++) { + setpix(*img, (int32_t)margin, (int32_t)(y+margin), 200L, 1000L, + 200L); + v = yax0+(yax1-yax0)*(float)y*(X2C_DIVR(1.0f,(float)maxy)); + s = osi_realint(aprsdecode_floor(X2C_DIVR(v,(float)step))); + tmp0 = (maxx-1UL)+margin; + x = margin+1UL; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &(*img)->Adr[(x)*(*img) + ->Len0+(y+margin)]; + anonym->r += 60U; + anonym->g += (uint16_t)(50UL+40UL*(uint32_t)(char) + (s&1)); + anonym->b += 60U; + } + if (x==tmp0) break; + } /* end for */ + if (s!=so) { + tmp0 = margin-1UL; + x = margin-3UL; + if (x<=tmp0) for (;; x++) { + setpix(*img, (int32_t)x, (int32_t)(y+margin), 200L, 1000L, + 200L); + if (x==tmp0) break; + } /* end for */ + num(*img, (int32_t)(margin+1UL), (int32_t)((y+margin)-6UL), + s*(int32_t)step, "", 1ul); + so = s; + } + if (y==tmp) break; + } /* end for */ + str(*img, margin+50UL, ((maxy+margin*2UL)-aprsdecode_lums.fontysize)-1UL, + name, name_len); + X2C_PFREE(name); +} /* end paper() */ + +#define aprstat_MAXXX 720 + +#define aprstat_MAXY0 120 + +#define aprstat_MARGIN0 8 + +#define aprstat_XSTEPS0 8 +/* in 1 pixel */ + +#define aprstat_EMPTY (-10000) + +#define aprstat_MAXALT 50000 + +static float aprstat_E = (-1.E+4f); + + +static void decodealt(uint32_t * beacons, float * resol, float wdiv, + uint32_t * rejs, uint32_t * acks, uint32_t * msgs, + struct aprsdecode_DAT * dat, float ground[5760], + float alt[5760], char * end, float * waysum, + aprsdecode_pOPHIST op, int32_t * markalt, + uint32_t * markx1, uint32_t * markx, char do0) +{ + aprsdecode_pFRAMEHIST fr; + struct aprspos_POSITION opos; + float ognd; + float a3; + float a2; + float a1; + float a; + uint32_t xc; + uint32_t x; + *markx = 0UL; + *markx1 = 0UL; + *markalt = X2C_min_longint; + fr = op->frames; + aprsdecode_posinval(&opos); + *waysum = 0.0f; + xc = 1UL; + a = (-1.E+4f); + a2 = (-1.E+4f); + a3 = (-1.E+4f); + ognd = (-1.E+4f); + *end = 0; + for (x = 0UL; x<=5759UL; x++) { + alt[x] = (-1.E+4f); + } /* end for */ + for (x = 0UL; x<=5759UL; x++) { + ground[x] = (-1.E+4f); + } /* end for */ + for (;;) { + /* sum up km driven */ + if (maptool_vistime(fr->time0) && aprsdecode_Decode(fr->vardat->raw, + 500ul, dat)>=0L) { + if (dat->type==aprsdecode_MSG) { + /* count msg stuff */ + if (dat->ackrej==aprsdecode_MSGMSG) ++*msgs; + else if (dat->ackrej==aprsdecode_MSGACK) ++*acks; + else ++*rejs; + } + if (!useri_configon(useri_fTRACKFILT) || !(fr->nodraw&~0x1U)) { + if (!aprspos_posvalid(dat->pos)) dat->pos = fr->vardat->pos; + if (aprspos_posvalid(dat->pos)) { + x = aprsdecode_trunc( *waysum*wdiv); + if (aprspos_posvalid(opos)) { + *waysum = *waysum+aprspos_distance(opos, dat->pos); + } + if (dat->altitude>-10000L && dat->altitude<=50000L) { + a1 = (float)dat->altitude; + if (do0) { + if (x>5759UL) x = 5759UL; + if (a2>(-1.E+4f)) { + if (!useri_configon(useri_fTRACKFILT) || (float) + fabs(((a-a1)+a)-a2)*0.25f<(float)fabs(a2-a1)) { + /* median error filter */ + if (alt[x]<=(-1.E+4f)) { + alt[x] = a; + xc = 1UL; + } + else { + ++xc; + alt[x] = alt[x]*(1.0f-X2C_DIVR(1.0f, + (float)xc))+X2C_DIVR(a,(float)xc); + } + } + } + if (*markalt>X2C_min_longint && *markx==0UL) { + *markx = x/8UL; + } + if ((dat->pos.lat==aprsdecode_click.markpos.lat && dat->pos.long0==aprsdecode_click.markpos.long0) + && aprsdecode_click.markpost==fr->time0) { + *markalt = dat->altitude; + } + ground[x] = ognd; /* delay same as gps filter */ + ognd = maptool_getsrtm(dat->pos, 0UL, resol); + if (ognd>=20000.0f) ognd = (-1.E+4f); + } + if (!*end) a3 = a2; + a2 = a; + a = a1; + } + opos = dat->pos; + } + if (!*end) ++*beacons; + } + } + if (*end) break; + if (fr->next) fr = fr->next; + else *end = 1; + } + if (a3<=(-1.E+4f)) *waysum = 0.0f; +} /* end decodealt() */ + +static float aprstat_E0 = (-1.E+4f); + + +static void interpol(float a[], uint32_t a_len) +{ + uint32_t j; + uint32_t i; + float k; + float y; + i = 0UL; + j = 0UL; + y = (-1.E+4f); + while (i<=a_len-1) { + if (a[i]>(-1.E+4f)) { + if (y<=(-1.E+4f)) y = a[i]; + if (i>j) { + k = X2C_DIVR(1.0f,(float)(i-j)); + while (jE THEN WrFixed(alt[i], 10, 20); WrStrLn("=alt") END; */ + if (alt[i]>(-1.E+4f) && alt[i]<*minaltd) *minaltd = alt[i]; + if (alt[i]>*maxaltd) *maxaltd = alt[i]; + if (ground[i]>(-1.E+4f) && ground[i]<*minalt) *minalt = ground[i]; + if (ground[i]>*maxalt) *maxalt = ground[i]; + } /* end for */ + if (*minaltd-((*maxaltd-*minaltd)+100.0f)>*minalt || (*maxaltd-*minaltd) + *0.05f>*maxalt-*minalt) { + /* ground graph is too far below */ + /* ground graph is a flat line */ + *minalt = *minaltd; /* make no ground graph */ + *maxalt = *maxaltd; + } + else { + if (*minaltd<*minalt) *minalt = *minaltd; + if (*maxaltd>*maxalt) *maxalt = *maxaltd; + *gndok = 1; + } + if (*maxalt-*minalt>8.3333333333333E-3f) { + *hdiv = X2C_DIVR(120.0f,*maxalt-*minalt); /* normalize */ + } + else *hdiv = 1.0f; + for (i = 0UL; i<=5759UL; i++) { + alt[i] = (alt[i]-*minalt)* *hdiv; + ground[i] = (ground[i]-*minalt)* *hdiv; + } /* end for */ +} /* end norm() */ + + +extern void aprstat_althist(maptool_pIMAGE * img, aprsdecode_pOPHIST op, + char * test, float * way, uint32_t * beacons, + uint32_t * msgs, uint32_t * acks, uint32_t * rejs) +{ + char h[256]; + char s[256]; + float maxaltd; + float minaltd; + float maxalt; + float minalt; + float ground[5760]; + float alt[5760]; + float hdiv; + float wdiv; + uint32_t markx1; + uint32_t markx; + uint32_t xc; + uint32_t sc; + uint32_t x; + uint32_t Maxx; + struct aprsdecode_DAT dat; + float resol; + float waysum; + int32_t markalt; + char end; + char gndok; + size_t tmp[2]; + uint32_t tmp0; + *way = 0.0f; + *beacons = 0UL; + *msgs = 0UL; + *acks = 0UL; + *rejs = 0UL; + gndok = 0; + minaltd = 0.0f; + maxaltd = 0.0f; + if (op==0 || op->frames==0) { + *test = 0; + return; + } + Maxx = dynmaxx(8UL, 400UL, 720UL); + decodealt(beacons, &resol, wdiv, rejs, acks, msgs, &dat, ground, alt, + &end, &waysum, op, &markalt, &markx1, &markx, 0); + *way = waysum; + if (waysum<0.05f) { + *test = 0; /* no altitudes or km */ + return; + } + if (*test) return; + X2C_DYNALLOCATE((char **)img,sizeof(struct maptool_PIX), + (tmp[0] = Maxx+16UL,tmp[1] = 136U,tmp),2u); + useri_debugmem.screens += (*img)->Len1*(*img)->Size1; + if (*img==0) { + osi_WrStrLn("error image alloc", 18ul); + return; + } + maptool_clr(*img); + wdiv = X2C_DIVR((float)(Maxx*8UL-1UL),waysum); + decodealt(beacons, &resol, wdiv, rejs, acks, msgs, &dat, ground, alt, + &end, &waysum, op, &markalt, &markx1, &markx, 1); + interpol(alt, 5760ul); + interpol(ground, 5760ul); + norm(&hdiv, &gndok, ground, alt, &maxaltd, &minaltd, &maxalt, &minalt); + /* + FOR x:=0 TO HIGH(alt) DO + IF alt[x]>=0.0 THEN WrFixed(alt[x], 3,11) ELSE WrStr(".") END; + END; + WrStrLn(""); + */ + /*sc:=VAL(CARDINAL, maxalt-minalt) DIV sfact(FLOAT(maxalt-minalt)); */ + sc = sfact(maxalt-minalt); + strncpy(s," ",256u); + aprsstr_Append(s, 256ul, op->call, 9ul); + aprsstr_Append(s, 256ul, " dist=", 7ul); + aprsstr_FixToStr(waysum, 2UL, h, 256ul); + aprsstr_Append(s, 256ul, h, 256ul); + aprsstr_Append(s, 256ul, "km min=", 8ul); + aprsstr_IntToStr(osi_realint(minaltd), 1UL, h, 256ul); + aprsstr_Append(s, 256ul, h, 256ul); + aprsstr_Append(s, 256ul, "m max=", 7ul); + aprsstr_IntToStr(osi_realint(maxaltd), 1UL, h, 256ul); + aprsstr_Append(s, 256ul, h, 256ul); + if (markalt>X2C_min_longint) { + aprsstr_Append(s, 256ul, "m curs=", 8ul); + aprsstr_IntToStr(markalt, 1UL, h, 256ul); + aprsstr_Append(s, 256ul, h, 256ul); + } + aprsstr_Append(s, 256ul, "m (NN)", 7ul); + paper(img, minalt, maxalt, sc, 8UL, Maxx, 120UL, s, 256ul); + tmp0 = Maxx+8UL; + x = 5UL; + if (x<=tmp0) for (;; x++) { + setpix(*img, (int32_t)x, 8L, 200L, 1000L, 200L); + if (x==tmp0) break; + } /* end for */ + strncpy(h,"km",256u); + if (waysum<5.0f) { + waysum = waysum*1000.0f; + strncpy(h,"m",256u); + } + sc = sfact(waysum); + hdiv = X2C_DIVR((float)sc*(float)Maxx,waysum); + wdiv = 0.0f; + xc = 0UL; + do { + for (x = 5UL; x<=7UL; x++) { + setpix(*img, (int32_t)(aprsdecode_trunc(wdiv)+8UL), (int32_t)x, + 200L, 1000L, 200L); + } /* end for */ + if (xc>0UL && aprsdecode_trunc(wdiv)0UL) { + for (x = 8UL; x<=128UL; x++) { + setpix(*img, (int32_t)(markx+8UL), (int32_t)x, 50L, 400L, 500L); + } /* end for */ + } + tmp0 = Maxx*8UL-1UL; + x = 0UL; + if (x<=tmp0) for (;; x++) { + /* draw graph */ + addpix(*img, (float)x*0.125f+8.0f, alt[x]+8.0f, 62UL, 75UL, 87UL); + if (gndok) { + addpix(*img, (float)x*0.125f+8.0f, ground[x]+8.0f, 31UL, 18UL, + 0UL); + } + if (x==tmp0) break; + } /* end for */ + if (gndok) { + tmp0 = Maxx-1UL; + x = 0UL; + if (x<=tmp0) for (;; x++) { + fillpix(*img, x+8UL, 8UL, ground[x*8UL]+7.0f, 63UL, 38UL, 0UL); + if (x==tmp0) break; + } /* end for */ + } +} /* end althist() */ + +#define aprstat_TIMESPAN 86400 + +#define aprstat_MAXXX0 720 + +#define aprstat_MINXSIZE 320 + +#define aprstat_MAXY1 120 + +#define aprstat_MARGIN2 8 + +#define aprstat_ARRSIZE 1440 +/* XSTEP=FLOAT(MAXXX)/FLOAT(ARRSIZE); */ + +#define aprstat_INCHMM 0.254 +/* inch/100 to mm */ + +#define aprstat_INVAL (-1.E+4) + +#define aprstat_MAXJOIN 65 +/* maximum interpolated span min */ + +struct WX; + + +struct WX { + float temp; + float hyg; + float baro; + float wind; + float rain; + float lumi; + float siev; +}; + +#define aprstat_F 0.9 + + +static void scale(float v[], uint32_t v_len, float min0, + float max0, float ysize, float maxamp, + float * smin, float * smax, uint32_t * step) +{ + uint32_t i; + float d; + float a; + float k; + uint32_t tmp; + if (min0==(-1.E+4f)) { + min0 = 0.0f; + d = max0; + if (d<=maxamp) d = maxamp; + a = X2C_DIVR(ysize,d); + k = 0.0f; + } + else { + d = max0-min0; + if (d<=maxamp) d = maxamp; + a = X2C_DIVR(ysize*0.9f,d); + k = ysize*0.05f; + } + *step = sfact(d); + *smin = min0-X2C_DIVR(k,a); + *smax = min0+X2C_DIVR(k,a)+d; + tmp = v_len-1; + i = 0UL; + if (i<=tmp) for (;; i++) { + if (v[i]!=(-1.E+4f)) v[i] = (v[i]-min0)*a+k; + if (i==tmp) break; + } /* end for */ +} /* end scale() */ + + +static char newimg(uint32_t Maxx, maptool_pIMAGE * img) +{ + size_t tmp[2]; + if (*img==0) { + X2C_DYNALLOCATE((char **)img,sizeof(struct maptool_PIX), + (tmp[0] = Maxx+16UL,tmp[1] = 136U,tmp),2u); + useri_debugmem.screens += (*img)->Len1*(*img)->Size1; + } + if (*img==0) return 0; + maptool_clr(*img); + return 1; +} /* end newimg() */ + + +static void timeline(uint32_t stime, maptool_pIMAGE * img, + uint32_t Maxx) +{ + uint32_t y; + uint32_t x; + uint32_t to; + uint32_t t; + uint32_t tmp; + to = 0UL; + tmp = Maxx-1UL; + x = 0UL; + if (x<=tmp) for (;; x++) { + setpix(*img, (int32_t)(x+8UL), 8L, 200L, 1000L, 200L); + t = ((stime+useri_localtime())-(((Maxx-1UL)-x)*86400UL)/Maxx)/3600UL; + if (to==0UL) to = t; + if (to!=t) { + to = t; + for (y = 5UL; y<=7UL; y++) { + setpix(*img, (int32_t)(x+8UL), (int32_t)y, 200L, 1000L, + 200L); + } /* end for */ + if (x>28UL && t%3UL==0UL) { + num(*img, (int32_t)((x+8UL)-6UL), 8L, (int32_t)(t%24UL), "h", + 2ul); + } + } + if (x==tmp) break; + } /* end for */ +} /* end timeline() */ + + +static void dots(float XStep, maptool_pIMAGE * img, float v[], + uint32_t v_len, char join, uint32_t r, + uint32_t g, uint32_t b) +{ + uint32_t i; + float dx; + float io; + float k; + float yo; + X2C_PCOPY((void **)&v,v_len*sizeof(float)); + yo = (-1.E+4f); + io = 0.0f; + i = 0UL; + do { + if (v[i]!=(-1.E+4f)) { + maptool_waypoint(*img, (float)i*XStep+8.0f+0.5f, v[i]+8.0f, 2.0f, + (int32_t)r, (int32_t)g, (int32_t)b); + if (((join && yo!=(-1.E+4f)) && i>aprsdecode_trunc(io)) + && aprsdecode_trunc(io)+65UL>=i) { + k = X2C_DIVR(v[i]-yo,((float)i-io)+1.0f); + if ((float)fabs(k)>2.0f) { + dx = X2C_DIVR(2.0f,(float)fabs(k)); + k = k*dx; + } + else dx = 1.0f; + while (aprsdecode_trunc(io)<=i) { + yo = yo+k; + maptool_waypoint(*img, io*XStep+8.0f, yo+8.0f, 1.2f, + (int32_t)(r/2UL), (int32_t)(g/2UL), (int32_t)(b/2UL)); + io = io+dx; + } + } + yo = v[i]; + io = (float)(i+1UL); + } + ++i; + } while (i<=v_len-1); + X2C_PFREE(v); +} /* end dots() */ + + +extern void aprstat_wxgraph(maptool_pIMAGE * img, aprsdecode_pOPHIST op, + uint32_t stime, uint16_t * what, + struct aprstat_LASTVAL * lastval) +{ + aprsdecode_pFRAMEHIST fr; + uint32_t Maxx; + uint32_t step; + uint32_t xt; + uint32_t xi; + float XStep; + float yax1; + float yax0; + float vh; + struct WX min0; + struct WX max0; + char hh[256]; + char h[256]; + char s[256]; + struct aprsdecode_DAT dat; + float temp[1440]; + float hyg[1440]; + float baro[1440]; + float winds[1440]; + float windd[1440]; + float gust[1440]; + float rain1[1440]; + float rain24[1440]; + float rain0[1440]; + float lumi[1440]; + uint16_t have; + char dirvalid; + struct WX * anonym; + if (op==0 || op->frames==0) { + /*OR (op^.lastinftyp<100)*/ + return; + } + Maxx = dynmaxx(8UL, 320UL, 720UL); + XStep = X2C_DIVR((float)Maxx,1440.0f); + *img = 0; + for (xi = 0UL; xi<=1439UL; xi++) { + temp[xi] = (-1.E+4f); + hyg[xi] = (-1.E+4f); + baro[xi] = (-1.E+4f); + winds[xi] = (-1.E+4f); + windd[xi] = (-1.E+4f); + gust[xi] = (-1.E+4f); + rain1[xi] = (-1.E+4f); + rain24[xi] = (-1.E+4f); + rain0[xi] = (-1.E+4f); + lumi[xi] = (-1.E+4f); + } /* end for */ + { /* with */ + struct WX * anonym = &max0; + anonym->temp = (-1.E+4f); + anonym->hyg = (-1.E+4f); + anonym->baro = (-1.E+4f); + anonym->wind = (-1.E+4f); + anonym->rain = (-1.E+4f); + anonym->lumi = (-1.E+4f); + anonym->siev = (-1.E+4f); + } + dirvalid = 0; + min0.temp = X2C_max_real; + min0.baro = X2C_max_real; + memset((char *)lastval,(char)0,sizeof(struct aprstat_LASTVAL)); + fr = op->frames; + do { + if (((fr->time0>stime-86400UL && fr->time0<=stime) + && aprsdecode_Decode(fr->vardat->raw, 500ul, + &dat)>=0L) && dat.sym=='_') { + xt = aprsdecode_trunc((float)(fr->time0-(stime-86400UL)) + *1.6666666666667E-2f); + if (xt>=1440UL) xt = 1439UL; + vh = X2C_DIVR(dat.wx.temp-32.0f,1.8f); + if (vh>=(-99.0f) && vh<=99.0f) { + temp[xt] = vh; + if (vh>max0.temp) max0.temp = vh; + if (vhtemp = vh; + } + if (dat.wx.hygro>=0.0f && dat.wx.hygro<=100.0f) { + hyg[xt] = dat.wx.hygro; + if (dat.wx.hygro>max0.hyg) max0.hyg = dat.wx.hygro; + lastval->hyg = dat.wx.hygro; + } + vh = dat.wx.baro*0.1f; + if (vh>=900.0f && vh<=1100.0f) { + baro[xt] = vh; + if (vh>max0.baro) max0.baro = vh; + if (vhbaro = vh; + } + vh = dat.wx.rain24*0.254f; + if (vh>=0.0f && vh<300.0f) { + rain24[xt] = vh; + if (vh>max0.rain) max0.rain = vh; + lastval->rain24 = vh; + } + vh = dat.wx.raintoday*0.254f; + if (vh>=0.0f && vh<300.0f) { + rain0[xt] = vh; + if (vh>max0.rain) max0.rain = vh; + } + vh = dat.wx.rain1*0.254f; + if (vh>=0.0f && vh<300.0f) { + rain1[xt] = vh; + if (vh>max0.rain) max0.rain = vh; + lastval->rain = vh; + } + if (dat.wx.lum>=0.0f && dat.wx.lum<=2000.0f) { + lumi[xt] = dat.wx.lum; + if (dat.wx.lum>max0.lumi) max0.lumi = dat.wx.lum; + lastval->lumi = dat.wx.lum; + } + if (dat.wx.sievert>=0.0f && dat.wx.sievert<1000.0f) { + /* siev[xt]:=dat.wx.sievert; */ + if (dat.wx.sievert>max0.siev) max0.siev = dat.wx.sievert; + lastval->siev = dat.wx.sievert; + } + if (dat.course>0UL && dat.course<=360UL) { + lastval->winddir = (float)(dat.course%360UL); + windd[xt] = lastval->winddir; + dirvalid = 1; + } + vh = (float)dat.speed*1.609f; + if (vh>=0.0f && vh<=1000.0f) { + winds[xt] = vh; + lastval->winds = vh; + if (vh>max0.wind) max0.wind = vh; + } + vh = dat.wx.gust*1.609f; + if (vh>=0.0f && vh<=1000.0f) { + gust[xt] = vh; + lastval->gust = vh; + if (vh>max0.wind) max0.wind = vh; + } + } + fr = fr->next; + } while (fr); + aprstext_DateLocToStr(stime, h, 256ul); + aprsstr_Append(h, 256ul, " ", 2ul); + aprsstr_Append(h, 256ul, op->call, 9ul); + have = 0U; + if (max0.temp!=(-1.E+4f)) { + have |= 0x1U; + if ((0x1U & *what)) { + if (!newimg(Maxx, img)) return; + scale(temp, 1440ul, min0.temp, max0.temp, 120.0f, 10.0f, &yax0, + &yax1, &step); + aprsstr_FixToStr(lastval->temp, 2UL, s, 256ul); + aprsstr_Append(s, 256ul, "\177C ", 4ul); + aprsstr_Append(s, 256ul, h, 256ul); + paper(img, yax0, yax1, step, 8UL, Maxx, 120UL, s, 256ul); + timeline(stime, img, Maxx); + dots(XStep, img, temp, 1440ul, 1, 200UL, 700UL, 40UL); + } + } + if (max0.baro!=(-1.E+4f)) { + have |= 0x2U; + if ((0x2U & *what)) { + if (!newimg(Maxx, img)) return; + scale(baro, 1440ul, min0.baro, max0.baro, 120.0f, 2.0f, &yax0, + &yax1, &step); + aprsstr_FixToStr(lastval->baro, 2UL, s, 256ul); + aprsstr_Append(s, 256ul, "hPa ", 5ul); + aprsstr_Append(s, 256ul, h, 256ul); + paper(img, yax0, yax1, step, 8UL, Maxx, 120UL, s, 256ul); + timeline(stime, img, Maxx); + dots(XStep, img, baro, 1440ul, 1, 500UL, 400UL, 500UL); + } + } + if (max0.wind!=(-1.E+4f) && max0.wind>0.0f) { + have |= 0x8U; + if ((0x8U & *what)) { + if (!newimg(Maxx, img)) return; + scale(winds, 1440ul, (-1.E+4f), max0.wind, 120.0f, 20.0f, &yax0, + &yax1, &step); + scale(gust, 1440ul, (-1.E+4f), max0.wind, 120.0f, 20.0f, &yax0, + &yax1, &step); + s[0U] = 0; + if (lastval->winds!=0.0f || lastval->gust==0.0f) { + aprsstr_FixToStr(lastval->winds, 2UL, hh, 256ul); + aprsstr_Append(hh, 256ul, "km/h Wind ", 12ul); + aprsstr_Append(s, 256ul, hh, 256ul); + } + if (lastval->gust!=0.0f) { + aprsstr_FixToStr(lastval->gust, 2UL, hh, 256ul); + aprsstr_Append(hh, 256ul, "km/h Gust ", 12ul); + aprsstr_Append(s, 256ul, hh, 256ul); + } + aprsstr_Append(s, 256ul, h, 256ul); + paper(img, yax0, yax1, step, 8UL, Maxx, 120UL, s, 256ul); + timeline(stime, img, Maxx); + dots(XStep, img, winds, 1440ul, 1, 100UL, 500UL, 700UL); + dots(XStep, img, gust, 1440ul, 1, 600UL, 100UL, 0UL); + } + if (dirvalid) { + have |= 0x10U; + if ((0x10U & *what)) { + if (!newimg(Maxx, img)) return; + scale(windd, 1440ul, (-1.E+4f), 360.0f, 120.0f, 365.0f, &yax0, + &yax1, &step); + aprsstr_FixToStr(lastval->winddir, 0UL, s, 256ul); + aprsstr_Append(s, 256ul, "deg Wind Direction ", 20ul); + aprsstr_Append(s, 256ul, h, 256ul); + paper(img, yax0, yax1, 90UL, 8UL, Maxx, 120UL, s, 256ul); + timeline(stime, img, Maxx); + dots(XStep, img, windd, 1440ul, 0, 200UL, 700UL, 700UL); + } + } + } + if (max0.hyg!=(-1.E+4f)) { + have |= 0x4U; + if ((0x4U & *what)) { + if (!newimg(Maxx, img)) return; + scale(hyg, 1440ul, (-1.E+4f), 100.0f, 120.0f, 101.0f, &yax0, &yax1, + &step); + aprsstr_FixToStr(lastval->hyg, 0UL, s, 256ul); + aprsstr_Append(s, 256ul, "% Humidty ", 11ul); + aprsstr_Append(s, 256ul, h, 256ul); + paper(img, yax0, yax1, step, 8UL, Maxx, 120UL, s, 256ul); + timeline(stime, img, Maxx); + dots(XStep, img, hyg, 1440ul, 1, 0UL, 500UL, 700UL); + } + } + if (max0.lumi!=(-1.E+4f)) { + have |= 0x40U; + if ((0x40U & *what)) { + if (!newimg(Maxx, img)) return; + scale(lumi, 1440ul, (-1.E+4f), max0.lumi, 120.0f, 50.0f, &yax0, + &yax1, &step); + aprsstr_FixToStr(lastval->lumi, 0UL, s, 256ul); + aprsstr_Append(s, 256ul, "W/m^2 Luminosity ", 18ul); + aprsstr_Append(s, 256ul, h, 256ul); + paper(img, yax0, yax1, step, 8UL, Maxx, 120UL, s, 256ul); + timeline(stime, img, Maxx); + dots(XStep, img, lumi, 1440ul, 1, 600UL, 600UL, 0UL); + } + } + if (max0.rain!=(-1.E+4f)) { + have |= 0x20U; + if ((0x20U & *what)) { + if (!newimg(Maxx, img)) return; + scale(rain1, 1440ul, (-1.E+4f), max0.rain, 120.0f, 5.0f, &yax0, + &yax1, &step); + scale(rain24, 1440ul, (-1.E+4f), max0.rain, 120.0f, 5.0f, &yax0, + &yax1, &step); + scale(rain0, 1440ul, (-1.E+4f), max0.rain, 120.0f, 5.0f, &yax0, + &yax1, &step); + aprsstr_FixToStr(lastval->rain, 2UL, s, 256ul); + aprsstr_Append(s, 256ul, "mm Rain ", 9ul); + aprsstr_Append(s, 256ul, h, 256ul); + paper(img, yax0, yax1, step, 8UL, Maxx, 120UL, s, 256ul); + timeline(stime, img, Maxx); + dots(XStep, img, rain1, 1440ul, 1, 500UL, 100UL, 0UL); + dots(XStep, img, rain24, 1440ul, 1, 50UL, 600UL, 50UL); + dots(XStep, img, rain0, 1440ul, 1, 100UL, 100UL, 700UL); + } + } + if (max0.siev>0.0f) have |= 0x400U; + *what = have; +/* + IF img<>NIL THEN DISPOSE(img) END; +*/ +} /* end wxgraph() */ + + +extern void aprstat_BEGIN(void) +{ + static int aprstat_init = 0; + if (aprstat_init) return; + aprstat_init = 1; + aprstext_BEGIN(); + useri_BEGIN(); + aprspos_BEGIN(); + osi_BEGIN(); + aprsdecode_BEGIN(); + aprsstr_BEGIN(); + maptool_BEGIN(); +} + diff --git a/src/aprstat.h b/src/aprstat.h new file mode 100644 index 0000000..76b3e2f --- /dev/null +++ b/src/aprstat.h @@ -0,0 +1,54 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef aprstat_H_ +#define aprstat_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif +#ifndef maptool_H_ +#include "maptool.h" +#endif + +struct aprstat_LASTVAL; + + +struct aprstat_LASTVAL { + float temp; + float hyg; + float baro; + float winds; + float winddir; + float gust; + float rain; + float rain24; + float lumi; + float siev; +}; + +extern void aprstat_kmhist(maptool_pIMAGE *, aprsdecode_pOPHIST, + char *); + +extern void aprstat_althist(maptool_pIMAGE *, aprsdecode_pOPHIST, + char *, float *, uint32_t *, uint32_t *, + uint32_t *, uint32_t *); + +extern void aprstat_btimehist(maptool_pIMAGE *, aprsdecode_pOPHIST); + +extern void aprstat_wxgraph(maptool_pIMAGE *, aprsdecode_pOPHIST, uint32_t, + uint16_t *, struct aprstat_LASTVAL *); + + +extern void aprstat_BEGIN(void); + + +#endif /* aprstat_H_ */ diff --git a/src/aprstext.c b/src/aprstext.c new file mode 100644 index 0000000..1d63fd8 --- /dev/null +++ b/src/aprstext.c @@ -0,0 +1,1855 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef aprstext_H_ +#include "aprstext.h" +#endif +#define aprstext_C_ +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef maptool_H_ +#include "maptool.h" +#endif +#ifndef useri_H_ +#include "useri.h" +#endif + +/* aprs tracks on osm map by oe5dxl */ +/*FROM osi IMPORT WrInt, WrStrLn; */ +#define aprstext_PI 3.1415926535898 + + +extern void aprstext_strcp(char from[], uint32_t from_len, + uint32_t p, uint32_t l, char to[], + uint32_t to_len) +{ + uint32_t i; + i = 0UL; + while (l>0UL && i<=to_len-1) { + to[i] = from[p]; + ++i; + ++p; + --l; + } + if (i<=to_len-1) to[i] = 0; +} /* end strcp() */ + +#define aprstext_DAY 86400 + + +extern void aprstext_DateLocToStr(uint32_t time0, char s[], + uint32_t s_len) +/* append (+localtime) to time */ +{ + uint32_t lo; + char h[10]; + lo = useri_localtime(); + if (time0+86400UL=0L && p+2L==(int32_t)aprsstr_Length(fn, fn_len)) { + aprsstr_DateToStr(time0, s, 16ul); + fn[p] = s[0U]; + ++p; + fn[p] = s[1U]; + ++p; + fn[p] = s[2U]; + ++p; + fn[p] = s[3U]; + ++p; + fn[p] = s[5U]; + ++p; + fn[p] = s[6U]; + ++p; + fn[p] = s[8U]; + ++p; + fn[p] = s[9U]; + ++p; + fn[p] = 0; + } +} /* end logfndate() */ + + +extern float aprstext_FtoC(float tempf) +{ + return X2C_DIVR(tempf-32.0f,1.8f); +} /* end FtoC() */ + + +extern float aprstext_CtoF(float tempc) +{ + return tempc*1.8f+32.0f; +} /* end CtoF() */ + + +extern char aprstext_isacall(char s[], uint32_t s_len) +{ + uint32_t p; + uint32_t lit; + uint32_t num0; + char c1; + p = 0UL; + num0 = 0UL; + lit = 0UL; + for (;;) { + c1 = s[p]; + if ((uint8_t)c1>='0' && (uint8_t)c1<='9') ++num0; + else if ((uint8_t)c1>='A' && (uint8_t)c1<='Z') ++lit; + else break; + ++p; + if (p>5UL) break; + } + if ((lit<2UL || num0==0UL) || num0>2UL) return 0; + if (s[p]=='-') { + ++p; + if (s[p]=='1') { + ++p; + if ((uint8_t)s[p]>='0' && (uint8_t)s[p]<='5') ++p; + } + else { + if ((uint8_t)s[p]<'1' || (uint8_t)s[p]>'9') return 0; + ++p; + } + } + return p>s_len-1 || s[p]==0; +} /* end isacall() */ + + +extern void aprstext_sievert2str(float v, char s[], uint32_t s_len) +{ + if (v<1.E-6f) { + aprsstr_FixToStr(v*1.E+9f+0.5f, 0UL, s, s_len); + aprsstr_Append(s, s_len, "n", 2ul); + } + else if (v<0.001f) { + aprsstr_FixToStr(v*1.E+6f+0.005f, 2UL, s, s_len); + aprsstr_Append(s, s_len, "u", 2ul); + } + else { + aprsstr_FixToStr(v*1000.0f+0.005f, 2UL, s, s_len); + aprsstr_Append(s, s_len, "m", 2ul); + } + aprsstr_Append(s, s_len, "Sv/h", 5ul); +} /* end sievert2str() */ + + +static void Errtxt(char s[], uint32_t s_len, aprsdecode_pFRAMEHIST pf, + aprsdecode_pFRAMEHIST frame) +{ + char hh[100]; + char h[100]; + uint32_t l; + uint8_t e; + if (frame) { + e = frame->nodraw; + if ((frame->vardat && frame->vardat->lastref) + && !aprspos_posvalid(frame->vardat->pos)) e |= 0x40U; + h[0U] = 0; + if ((0x1U & e)) aprsstr_Append(h, 100ul, "DIST,", 6ul); + if ((0x2U & e)) aprsstr_Append(h, 100ul, "SPIKE,", 7ul); + if ((0x4U & e)) aprsstr_Append(h, 100ul, "SYMBOL,", 8ul); + if ((0x10U & e)) aprsstr_Append(h, 100ul, "SPEED,", 7ul); + if ((0x40U & e)) aprsstr_Append(h, 100ul, "NOPOS,", 7ul); + if ((0x8U & e)) { + aprsstr_Append(h, 100ul, "DUPE,", 6ul); + if (pf) { + aprsstr_IntToStr((int32_t)aprsdecode_finddup(pf, frame), 0UL, + hh, 100ul); + aprsstr_Append(h, 100ul, hh, 100ul); + aprsstr_Append(h, 100ul, "s,", 3ul); + } + } + if ((0x20U & e)) aprsstr_Append(h, 100ul, "SEG,", 5ul); + l = aprsstr_Length(h, 100ul); + if (l>0UL) { + h[l-1UL] = 0; + aprsstr_Append(h, 100ul, "]\376", 3ul); + aprsstr_Append(s, s_len, "\370[", 3ul); + aprsstr_Append(s, s_len, h, 100ul); + } + } +} /* end Errtxt() */ + + +static char Hex(uint32_t d) +{ + d = d&15UL; + if (d>9UL) d += 7UL; + return (char)(d+48UL); +} /* end Hex() */ + + +extern void aprstext_Apphex(char s[], uint32_t s_len, char h[], + uint32_t h_len) +{ + uint32_t j; + uint32_t i; + i = 0UL; + j = aprsstr_Length(s, s_len); + while ((i<=h_len-1 && h[i]) && j+10UL='\177') { + s[j] = '\371'; + ++j; + s[j] = '<'; + ++j; + s[j] = Hex((uint32_t)(uint8_t)h[i]/16UL); + ++j; + s[j] = Hex((uint32_t)(uint8_t)h[i]); + ++j; + s[j] = '>'; + ++j; + s[j] = '\376'; + } + else s[j] = h[i]; + ++j; + } + ++i; + } + s[j] = 0; +} /* end Apphex() */ + +#define aprstext_TAB "\012 " + + +static void rfdist(aprsdecode_pVARDAT v, char h[], uint32_t h_len) +{ + aprsdecode_MONCALL digi; + aprsdecode_pOPHIST ig; + char s[32]; + struct aprsdecode_VARDAT * anonym; + { /* with */ + struct aprsdecode_VARDAT * anonym = v; + if (anonym->igatelen==0U || !aprspos_posvalid(anonym->pos)) return; + aprstext_strcp(anonym->raw, 500ul, (uint32_t)anonym->igatepos, + (uint32_t)anonym->igatelen, digi, 9ul); + ig = aprsdecode_ophist0; + while (ig && X2C_STRCMP(ig->call,9u,digi,9u)) ig = ig->next; + if (ig==0 || !aprspos_posvalid(ig->lastpos)) return; + aprsstr_Append(h, h_len, " Igate:", 8ul); + aprsstr_Append(h, h_len, digi, 9ul); + aprsstr_Append(h, h_len, "(", 2ul); + aprsstr_FixToStr(aprspos_distance(ig->lastpos, anonym->pos), 4UL, s, + 32ul); + aprsstr_Append(h, h_len, s, 32ul); + aprsstr_Append(h, h_len, "km)", 4ul); + } +} /* end rfdist() */ + + +static void objitem(char s[], uint32_t s_len, + struct aprsdecode_DAT * dat) +{ + if (dat->type==aprsdecode_OBJ || dat->type==aprsdecode_ITEM) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + if (dat->objkill=='1') aprsstr_Append(s, s_len, "Killed ", 8ul); + if (dat->type==aprsdecode_OBJ && (uint8_t)dat->areasymb.typ>='0') { + if ((uint8_t)dat->areasymb.typ>='5') { + aprsstr_Append(s, s_len, "filled ", 8ul); + } + switch (((uint32_t)(uint8_t)dat->areasymb.typ-48UL)%5UL) { + case 0UL: + aprsstr_Append(s, s_len, "Circle", 7ul); + break; + case 1UL: + aprsstr_Append(s, s_len, "Line", 5ul); + break; + case 2UL: + aprsstr_Append(s, s_len, "Ellipse", 8ul); + break; + case 3UL: + aprsstr_Append(s, s_len, "Triangle", 9ul); + break; + case 4UL: + aprsstr_Append(s, s_len, "Box", 4ul); + break; + } /* end switch */ + aprsstr_Append(s, s_len, " Area ", 7ul); + } + if (dat->multiline.size>0UL) { + aprsstr_Append(s, s_len, "Multiline ", 11ul); + } + if (dat->type==aprsdecode_OBJ) { + aprsstr_Append(s, s_len, "Object from:", 13ul); + } + else aprsstr_Append(s, s_len, "Item from:", 11ul); + aprstext_Apphex(s, s_len, dat->objectfrom, 9ul); + } +} /* end objitem() */ + + +extern void aprstext_decode(char s[], uint32_t s_len, + aprsdecode_pFRAMEHIST pf0, aprsdecode_pFRAMEHIST pf, + aprsdecode_pVARDAT oldvar, uint32_t odate, + char decoded, struct aprsdecode_DAT * dat) +{ + char h[512]; + char colalt; + char nl; + int32_t ret; + int32_t og; + uint32_t tn; + float resol; + char tmp; + if (pf->time0>0UL) { + s[0UL] = '\367'; + s[1UL] = 0; + aprstext_DateLocToStr(pf->time0, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, ":\376", 3ul); + } + else s[0UL] = 0; + ret = aprsdecode_Decode(pf->vardat->raw, 500ul, dat); + if (decoded) { + aprstext_Apphex(s, s_len, dat->symcall, 9ul); + og = X2C_max_longint; + if (!aprspos_posvalid(dat->pos)) dat->pos = pf->vardat->pos; + if (aprspos_posvalid(dat->pos)) { + aprstext_postostr(dat->pos, '3', h, 512ul); + aprsstr_Append(s, s_len, " \367", 3ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "\376 (", 4ul); + maptool_postoloc(h, 512ul, dat->pos); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, ") ", 3ul); + og = (int32_t)X2C_TRUNCI(maptool_getsrtm(dat->pos, 0UL, &resol), + X2C_min_longint,X2C_max_longint); + } + nl = 1; + if ((uint8_t)dat->symt>' ' && (uint8_t)dat->sym>' ') { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + aprsstr_Append(s, s_len, "\375", 2ul); + /* Append(s, "Sym:"); */ + aprstext_Apphex(s, s_len, (char *) &dat->symt, 1u/1u); + aprstext_Apphex(s, s_len, (char *) &dat->sym, 1u/1u); + } + if (dat->speedsym=='_') { + aprsstr_FixToStr((float)dat->speed*1.609f, 2UL, h, 512ul); + } + else aprsstr_FixToStr((float)dat->speed*1.852f, 0UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km/h\376", 6ul); + if (dat->course>0UL) { + aprsstr_Append(s, s_len, " dir:", 6ul); + aprsstr_IntToStr((int32_t)(dat->course%360UL), 1UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "deg", 4ul); + } + } + if (dat->altitudealtitude; + if (colalt) aprsstr_Append(s, s_len, "\367", 2ul); + aprsstr_Append(s, s_len, "NN:", 4ul); + aprsstr_IntToStr(dat->altitude, 1UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "m", 2ul); + if (colalt) aprsstr_Append(s, s_len, "\376", 2ul); + if (og<30000L) { + aprsstr_Append(s, s_len, " OG:", 5ul); + aprsstr_IntToStr(dat->altitude-og, 1UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "m", 2ul); + } + } + rfdist(pf->vardat, s, s_len); + if ((oldvar && aprspos_posvalid(oldvar->pos)) + && aprspos_posvalid(dat->pos)) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + else aprsstr_Append(s, s_len, " ", 2ul); + aprsstr_Append(s, s_len, "moved:", 7ul); + aprsstr_FixToStr(aprspos_distance(oldvar->pos, dat->pos), 4UL, h, + 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km", 3ul); + } + if (odate>0UL && pf->time0>=odate) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + else aprsstr_Append(s, s_len, " ", 2ul); + aprsstr_Append(s, s_len, "since ", 7ul); + aprsstr_IntToStr((int32_t)(pf->time0-odate), 1UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "s", 2ul); + } + if (dat->type!=aprsdecode_MSG) Errtxt(s, s_len, pf0, pf); + nl = 1; + if (dat->wx.storm==aprsdecode_WXNORMAL) { + if (dat->type==aprsdecode_OBJ || dat->type==aprsdecode_ITEM) { + objitem(s, s_len, dat); + } + if (dat->wx.gust!=1.E+6f) { + nl = 0; + aprsstr_Append(s, s_len, "\012 Gust:", 8ul); + aprsstr_FixToStr(dat->wx.gust*1.609f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km/h", 5ul); + } + if (dat->wx.temp!=1.E+6f) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + aprsstr_Append(s, s_len, " Temp:", 7ul); + aprsstr_FixToStr(aprstext_FtoC(dat->wx.temp), 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "C", 2ul); + } + if (dat->wx.hygro!=1.E+6f) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + aprsstr_Append(s, s_len, " Hum:", 6ul); + aprsstr_IntToStr((int32_t)X2C_TRUNCI(dat->wx.hygro+0.5f, + X2C_min_longint,X2C_max_longint), 1UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "%", 2ul); + } + if (dat->wx.baro!=1.E+6f) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + aprsstr_Append(s, s_len, " Baro:", 7ul); + aprsstr_FixToStr(dat->wx.baro*0.1f+0.05f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "hPa", 4ul); + } + if (dat->wx.rain1!=1.E+6f) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + aprsstr_Append(s, s_len, " Rain1h:", 9ul); + aprsstr_FixToStr(dat->wx.rain1*0.254f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "mm", 3ul); + } + if (dat->wx.rain24!=1.E+6f) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + aprsstr_Append(s, s_len, " Rain24h:", 10ul); + aprsstr_FixToStr(dat->wx.rain24*0.254f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "mm", 3ul); + } + if (dat->wx.raintoday!=1.E+6f) { + if (nl) { + aprsstr_Append(s, s_len, "\012 ", 3ul); + nl = 0; + } + aprsstr_Append(s, s_len, " Rain00:", 9ul); + aprsstr_FixToStr(dat->wx.raintoday*0.254f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "mm", 3ul); + } + if (dat->wx.lum!=1.E+6f) { + if (nl) aprsstr_Append(s, s_len, "\012 ", 3ul); + aprsstr_Append(s, s_len, " Luminosity:", 13ul); + aprsstr_FixToStr(dat->wx.lum+0.5f, 0UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "W", 2ul); + } + if (dat->wx.sievert!=1.E+6f) { + if (nl) aprsstr_Append(s, s_len, "\012 ", 3ul); + aprsstr_Append(s, s_len, " Radiation:", 12ul); + aprstext_sievert2str(dat->wx.sievert, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + } + } + else if (dat->wx.storm>aprsdecode_WXNORMAL) { + if (dat->type==aprsdecode_OBJ || dat->type==aprsdecode_ITEM) { + objitem(s, s_len, dat); + } + nl = 0; + aprsstr_Append(s, s_len, "\012 ", 3ul); + if (dat->wx.storm==aprsdecode_WXTS) { + aprsstr_Append(s, s_len, "Tropical Storm", 15ul); + } + else if (dat->wx.storm==aprsdecode_WXHC) { + aprsstr_Append(s, s_len, "Hurricane", 10ul); + } + else if (dat->wx.storm==aprsdecode_WXTD) { + aprsstr_Append(s, s_len, "Tropical Depression", 20ul); + } + nl = 0; + if (dat->wx.gust!=1.E+6f) { + aprsstr_Append(s, s_len, " Gust:", 7ul); + aprsstr_FixToStr(dat->wx.gust*1.609f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km/h", 5ul); + } + if (dat->wx.sustaind!=0.0f) { + aprsstr_Append(s, s_len, " Sustaind Speed:", 17ul); + aprsstr_FixToStr(dat->wx.sustaind*1.609f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km/h", 5ul); + } + if (dat->wx.baro!=1.E+6f) { + aprsstr_Append(s, s_len, " Baro:", 7ul); + aprsstr_FixToStr(dat->wx.baro, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "hPa", 4ul); + } + if (dat->wx.radiushurr!=0.0f) { + aprsstr_Append(s, s_len, " Radius Hurricane Winds:", 25ul); + aprsstr_FixToStr(dat->wx.radiushurr*1.609f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km", 3ul); + } + if (dat->wx.radiusstorm!=0.0f) { + aprsstr_Append(s, s_len, " Storm Winds:", 14ul); + aprsstr_FixToStr(dat->wx.radiusstorm*1.609f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km", 3ul); + } + if (dat->wx.wholegale!=0.0f) { + aprsstr_Append(s, s_len, " Whole gale:", 13ul); + aprsstr_FixToStr(dat->wx.wholegale*1.609f, 2UL, h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + aprsstr_Append(s, s_len, "km", 3ul); + } + } + else if (dat->type==aprsdecode_MSG) { + aprsstr_Append(s, s_len, "\012 Msg To:", 11ul); + aprstext_Apphex(s, s_len, dat->msgto, 9ul); + if (dat->msgtext[0UL]) { + aprsstr_Append(s, s_len, " Text:[", 8ul); + aprstext_Apphex(s, s_len, dat->msgtext, 67ul); + aprsstr_Append(s, s_len, "]", 2ul); + } + if (dat->acktext[0UL]) { + aprsstr_Append(s, s_len, " Ack:[", 7ul); + aprstext_Apphex(s, s_len, dat->acktext, 5ul); + aprsstr_Append(s, s_len, "]", 2ul); + } + if (dat->ackrej==aprsdecode_MSGREJ) { + aprsstr_Append(s, s_len, " Reject", 8ul); + } + } + else if (dat->type==aprsdecode_OBJ || dat->type==aprsdecode_ITEM) { + objitem(s, s_len, dat); + } + if (dat->type!=aprsdecode_MSG && dat->comment0[0UL]) { + if (dat->type==aprsdecode_TELE) { + aprsstr_Append(s, s_len, "\012 Telemetry: [", 15ul); + } + else aprsstr_Append(s, s_len, "\012 Comment: [", 13ul); + aprstext_Apphex(s, s_len, dat->comment0, 256ul); + aprsstr_Append(s, s_len, "]", 2ul); + } + if (dat->tlmvalues[0UL]) { + aprsstr_Append(s, s_len, "\012 Mic-e Telemetry Seq:", 24ul); + ret = 0L; + for (;;) { + if (dat->tlmvalues[ret]) { + if (ret!=6L) { + aprsstr_IntToStr((int32_t)(dat->tlmvalues[ret]-1U), 1UL, + h, 512ul); + aprsstr_Append(s, s_len, h, 512ul); + } + else { + tn = (uint32_t)(dat->tlmvalues[ret]-1U); + if (tn>=256UL) tn = (tn&8191UL)+8192UL; + else tn = (tn&255UL)+256UL; + while (tn>1UL) { + aprsstr_Append(s, s_len, + (char *)(tmp = (char)((uint32_t)(char)(tn&1) + +48UL),&tmp), 1u/1u); + tn = tn/2UL; + } + } + } + ++ret; + if (ret>6L) break; + aprsstr_Append(s, s_len, ",", 2ul); + } + } + aprsstr_Append(s, s_len, "\012 ", 3ul); + } + aprsstr_Append(s, s_len, "[", 2ul); + aprstext_Apphex(s, s_len, pf->vardat->raw, 500ul); + aprsstr_Append(s, s_len, "]", 2ul); + if (!decoded) Errtxt(s, s_len, pf0, pf); +} /* end decode() */ + + +extern void aprstext_decodelistline(char s[], uint32_t s_len, + char text[], uint32_t text_len, uint32_t time0) +{ + uint32_t i; + struct aprsdecode_DAT dat; + struct aprsdecode_FRAMEHIST f; + struct aprsdecode_VARDAT vardat; + X2C_PCOPY((void **)&text,text_len); + i = 0UL; + while ((i<=text_len-1 && text[i]) && text[i]!='[') ++i; + if (i>text_len-1 || text[i]==0) i = 0UL; + aprsstr_Delstr(text, text_len, 0UL, i+1UL); /* remove port/time[ */ + i = aprsstr_Length(text, text_len); + if (i>1UL) { + text[i-1UL] = 0; /* remove ] */ + memset((char *) &vardat,(char)0, + sizeof(struct aprsdecode_VARDAT)); + aprsstr_Assign(vardat.raw, 500ul, text, text_len); + memset((char *) &f,(char)0, + sizeof(struct aprsdecode_FRAMEHIST)); + f.vardat = &vardat; + f.time0 = time0; + aprstext_decode(s, s_len, 0, &f, 0, 0UL, 1, &dat); + } + X2C_PFREE(text); +} /* end decodelistline() */ + + +extern void aprstext_setmark1(struct aprspos_POSITION pos, + char overwrite, int32_t alt, uint32_t timestamp) +{ + if ((overwrite || !aprspos_posvalid(aprsdecode_click.markpos)) + || aprsdecode_click.marktime) { + aprsdecode_click.markpos = pos; + if (overwrite) aprsdecode_click.marktime = 0UL; + else aprsdecode_click.marktime = aprsdecode_realtime; + aprsdecode_click.markalti = alt; + aprsdecode_click.markpost = timestamp; + } +} /* end setmark1() */ + + +extern void aprstext_setmarkalti(aprsdecode_pFRAMEHIST pf, + aprsdecode_pOPHIST op, char overwrite) +{ + struct aprsdecode_DAT dat; + int32_t alt; + struct aprspos_POSITION pos; + uint32_t t; + aprsdecode_posinval(&pos); + alt = X2C_max_longint; + t = aprsdecode_realtime; + if (pf && aprsdecode_Decode(pf->vardat->raw, 500ul, &dat)==0L) { + if (dat.altitude>-10000L) alt = dat.altitude; + pos = dat.pos; + t = pf->time0; + } + else if (op && op->lastinftyp<100U) { + alt = (int32_t)op->lasttempalt+22768L; + } + if (!aprspos_posvalid(pos) && op) pos = op->lastpos; + aprstext_setmark1(pos, overwrite, alt, t); +} /* end setmarkalti() */ + + +extern void aprstext_optext(uint32_t typ, + struct aprsdecode_CLICKOBJECT * obj, char * last, + char s[], uint32_t s_len) +{ + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST pfe; + aprsdecode_pFRAMEHIST pf1; + aprsdecode_pFRAMEHIST pf; + uint32_t cn; + uint32_t cx; + char ss[1000]; + struct aprsdecode_DAT dat; + /* islast:BOOLEAN; */ + op = obj->opf; + pf = obj->pff0; + if (pf==0 && op) pf = op->frames; + s[0UL] = 0; + /* islast:=last; */ + *last = 0; + if (op && pf) { + if (typ==2UL) { + /* find last raw frame */ + pf = op->frames; + if (pf) { + while (pf->next) pf = pf->next; + obj->pff0 = pf; + } + } + else if (typ==1UL) { + /* next frame */ + pf1 = pf; + do { + if (pf->next==0) pf = op->frames; + else pf = pf->next; + } while (!((!aprsdecode_lums.errorstep || pf1==pf) || (pf->nodraw&~0x40U)!=0U)); + /* IF pf^.next<>NIL THEN pf:=pf^.next ELSE pf:=op^.frames END; + */ + if (pf) { + obj->pff0 = pf; + obj->pff = pf; + obj->typf = aprsdecode_tTRACK; /* set "track found" */ + } + } + else if (typ==0UL) { + /* back to last frame */ + pf1 = pf; + pfe = pf; + do { + if (!aprsdecode_lums.errorstep || (pfe->nodraw&~0x40U)!=0U) { + pf = pfe; + } + if (pfe->next==0) pfe = op->frames; + else pfe = pfe->next; + } while (pfe!=pf1); + obj->pff0 = pf; + obj->pff = pf; + obj->typf = aprsdecode_tTRACK; /* set "track found" */ + } + /* IF ((typ=1) OR (typ=0)) & lums.errorstep & (pf=pf1) + THEN Assign(s, "no more errors found"); */ + if ((aprsdecode_lums.errorstep && pf) && (pf->nodraw&~0x40U)==0U) { + aprsstr_Assign(s, s_len, "Show errors mode: no (more) errors found", + 41ul); + } + else if (pf) { + cn = 0UL; + cx = 0UL; + pfe = 0; + pf1 = op->frames; + while (pf1) { + ++cn; + if (pf1==pf) cx = cn; + if (pf1->next==pf) pfe = pf1; + pf1 = pf1->next; + } + aprsstr_IntToStr((int32_t)cx, 0UL, s, s_len); + aprsstr_Append(s, s_len, "/", 2ul); + aprsstr_IntToStr((int32_t)cn, 0UL, ss, 1000ul); + aprsstr_Append(s, s_len, ss, 1000ul); + aprsstr_Append(s, s_len, " ", 2ul); + if (pfe==0) { + aprstext_decode(ss, 1000ul, op->frames, pf, 0, 0UL, 1, &dat); + } + else { + aprstext_decode(ss, 1000ul, op->frames, pf, pfe->vardat, + pfe->time0, 1, &dat); + } + aprsstr_Append(s, s_len, ss, 1000ul); + *last = pf->next==0; + } + } +} /* end optext() */ + + +extern aprsdecode_pOPHIST aprstext_oppo(aprsdecode_MONCALL opcall) +/* find pointer to call */ +{ + aprsdecode_pOPHIST op; + if (opcall[0UL]==0) return 0; + op = aprsdecode_ophist0; + while (op && X2C_STRCMP(op->call,9u,opcall,9u)) op = op->next; + return op; +} /* end oppo() */ + + +extern void aprstext_listop(char decoded) +{ + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST pf; + aprsdecode_pVARDAT oldv; + uint32_t oldt; + char s[1000]; + struct aprsdecode_DAT dat; + op = aprsdecode_click.table[aprsdecode_click.selected].opf; + if (op) { + pf = op->frames; + oldv = 0; + oldt = 0UL; + while (pf) { + aprstext_decode(s, 1000ul, op->frames, pf, oldv, oldt, decoded, + &dat); + if (aprspos_posvalid(pf->vardat->pos)) oldv = pf->vardat; + oldt = pf->time0; + aprsstr_Append(s, 1000ul, "\012", 2ul); + if (decoded) aprsstr_Append(s, 1000ul, "\012", 2ul); + useri_wrstrlist(s, 1000ul, dat.symcall, pf->vardat->pos, pf->time0); + pf = pf->next; + } + } +} /* end listop() */ + + +extern void aprstext_listin(char r[], uint32_t r_len, char port, + char dir, char decoded, int32_t quali, + int32_t txd, int32_t level) +{ + char s2[1000]; + char s1[1000]; + char s[1000]; + struct aprsdecode_VARDAT vard; + struct aprsdecode_FRAMEHIST pf; + uint32_t j; + uint32_t i; + struct aprsdecode_DAT dat; + memset((char *) &vard,(char)0,sizeof(struct aprsdecode_VARDAT)); + i = 0UL; + j = 0UL; + while ((i<499UL && i<=r_len-1) && r[i]) { + if (r[i]!='\015' && r[i]!='\012') j = i; + vard.raw[i] = r[i]; + ++i; + } + vard.raw[j+1UL] = 0; + memset((char *) &pf,(char)0,sizeof(struct aprsdecode_FRAMEHIST)); + pf.vardat = &vard; + aprstext_decode(s, 1000ul, 0, &pf, 0, 0UL, decoded, &dat); + if (decoded) { + s1[0U] = '\012'; + s1[1U] = port; + s1[2U] = 0; + } + else { + s1[0U] = port; + s1[1U] = 0; + } + if (dir=='<') aprsstr_Append(s1, 1000ul, "\370<\376", 4ul); + else aprsstr_Append(s1, 1000ul, (char *) &dir, 1u/1u); + if (txd>0L || quali>0L) { + aprsstr_Append(s1, 1000ul, "(", 2ul); + if (txd>0L) aprsstr_IntToStr(txd, 3UL, s2, 1000ul); + else strncpy(s2," ",1000u); + aprsstr_Append(s1, 1000ul, s2, 1000ul); + aprsstr_Append(s1, 1000ul, "/", 2ul); + if (level) aprsstr_IntToStr(level, 3UL, s2, 1000ul); + else strncpy(s2," ",1000u); + aprsstr_Append(s1, 1000ul, s2, 1000ul); + aprsstr_Append(s1, 1000ul, "/", 2ul); + if (quali>0L) aprsstr_IntToStr(quali, 2UL, s2, 1000ul); + else strncpy(s2," ",1000u); + aprsstr_Append(s1, 1000ul, s2, 1000ul); + aprsstr_Append(s1, 1000ul, ")", 2ul); + } + aprsstr_Append(s1, 1000ul, s, 1000ul); + useri_wrstrmon(s1, 1000ul, dat.pos); +} /* end listin() */ + +#define aprstext_TRIVIAL 3.1397174254317E-6 +/* 20m */ + + +extern void aprstext_listtyps(char typ, char decod, + char oneop[], uint32_t oneop_len) +{ + aprsdecode_pOPHIST op; + aprsdecode_pFRAMEHIST pf; + char s[1000]; + char lasttext[101]; + char lastto[101]; + struct aprsdecode_DAT dat; + X2C_PCOPY((void **)&oneop,oneop_len); + op = aprsdecode_ophist0; + while (op) { + pf = op->frames; + if (typ=='N') { + /* no pos */ + if (pf && !aprspos_posvalid(op->lastpos)) { + while (pf->next) pf = pf->next; + aprstext_decode(s, 1000ul, 0, pf, 0, 0UL, decod, &dat); + if (decod) aprsstr_Append(s, 1000ul, "\012\012", 3ul); + else aprsstr_Append(s, 1000ul, "\012", 2ul); + useri_wrstrlist(s, 1000ul, dat.symcall, pf->vardat->pos, + pf->time0); + } + } + else if (typ=='D') { + /* moveing stations */ + if (pf && (op->margin0.lat>op->margin1.lat+3.1397174254317E-6f || op->margin0.long0+3.1397174254317E-6fmargin1.long0) + ) { + while (pf->next) pf = pf->next; + aprstext_decode(s, 1000ul, 0, pf, 0, 0UL, decod, &dat); + if (decod) aprsstr_Append(s, 1000ul, "\012\012", 3ul); + else aprsstr_Append(s, 1000ul, "\012", 2ul); + useri_wrstrlist(s, 1000ul, dat.symcall, pf->vardat->pos, + pf->time0); + } + } + else if (typ=='W') { + if (pf) { + while (pf->next) pf = pf->next; + aprstext_decode(s, 1000ul, 0, pf, 0, 0UL, decod, &dat); + /* IF (dat.symt="/") & (dat.sym="_") */ + /* OR (op^.temptime+SHOWTEMPWIND>systime) + & (op^.lastinftyp>=100) */ + /* & (op^.lasttempalt>=-99) & (op^.lasttempalt<=99) + THEN */ + if (dat.symt=='/' && dat.sym=='_') { + if (decod) aprsstr_Append(s, 1000ul, "\012\012", 3ul); + else aprsstr_Append(s, 1000ul, "\012", 2ul); + useri_wrstrlist(s, 1000ul, dat.symcall, pf->vardat->pos, + pf->time0); + } + } + } + else if (typ=='M' || typ=='B' && (oneop[0UL]==0 || X2C_STRCMP(oneop, + oneop_len,op->call,9u)==0)) { + /* bulletins messages */ + lastto[0U] = 0; + lasttext[0U] = 0; + while (pf) { + if (((((((pf->vardat->lastref==pf && aprsdecode_Decode(pf->vardat->raw, + 500ul, &dat)>=0L) && (typ=='M' || typ=='B')) && dat.type==aprsdecode_MSG) && X2C_STRCMP(dat.symcall, + 9u,dat.msgto,9u)) && dat.msgtext[0UL]) && (typ=='B')==IsBulletin(dat)) && ((oneop[0UL]==0 || X2C_STRCMP(oneop, + oneop_len,op->call,9u)==0) || X2C_STRCMP(oneop,oneop_len, + dat.msgto,9u)==0)) { + if (!(aprsstr_StrCmp(lastto, 101ul, dat.msgto, + 9ul) && aprsstr_StrCmp(lasttext, 101ul, dat.msgtext, 67ul))) { + aprstext_DateLocToStr(pf->time0, s, 1000ul); + aprsstr_Append(s, 1000ul, " ", 2ul); + aprsstr_Append(s, 1000ul, dat.symcall, 9ul); + aprsstr_Append(s, 1000ul, ">", 2ul); + aprsstr_Append(s, 1000ul, dat.msgto, 9ul); + aprsstr_Append(s, 1000ul, ":[", 3ul); + aprstext_Apphex(s, 1000ul, dat.msgtext, 67ul); + aprsstr_Append(s, 1000ul, "]", 2ul); + if (dat.acktext[0UL]) { + aprstext_Apphex(s, 1000ul, " Ack[", 6ul); + aprsstr_Append(s, 1000ul, dat.acktext, 5ul); + aprsstr_Append(s, 1000ul, "]", 2ul); + } + aprsstr_Append(s, 1000ul, "\012", 2ul); + useri_wrstrlist(s, 1000ul, dat.symcall, pf->vardat->pos, + pf->time0); + aprsstr_Assign(lastto, 101ul, dat.msgto, 9ul); + aprsstr_Assign(lasttext, 101ul, dat.msgtext, 67ul); + } + } + pf = pf->next; + } + } + else if (typ=='O') { + /* + ELSIF ((typ="M") OR (typ="B")) & ((oneop[0]=0C) + OR (oneop=op^.call)) THEN (* bulletins messages *) + lastto[0]:=0C; + lasttext[0]:=0C; + + WHILE pf<>NIL DO + IF (pf^.vardat^.lastref=pf) & (Decode(pf^.vardat^.raw, + dat)>=0) THEN + IF (typ="M") OR (typ="B") THEN + IF (dat.type=MSG) & (dat.symcall<>dat.msgto) + & (dat.msgtext[0]<>0C) THEN + IF (typ="B")=IsBulletin(dat) THEN + IF NOT (StrCmp(lastto, dat.msgto) & StrCmp(lasttext, + dat.msgtext)) THEN + DateLocToStr(pf^.time, s); Append(s, " "); + Append(s, dat.symcall); Append(s, ">"); + Append(s, dat.msgto); Append(s, ":["); + Apphex(s, dat.msgtext); Append(s, "]"); + IF dat.acktext[0]<>0C THEN + Apphex(s, " Ack[");Append(s, dat.acktext); + Append(s, "]"); + END; + Append(s, LF); + wrstrlist(s, dat.symcall, pf^.vardat^.pos, + pf^.time); + + <* IF WITHSTDOUT THEN *> + WrStr(s); + <* END *> + Assign(lastto, dat.msgto); + Assign(lasttext, dat.msgtext); + END; + END; + END; + END; + END; + pf:=pf^.next; + END; + */ + if (pf) { + while (pf->next) pf = pf->next; + aprstext_decode(s, 1000ul, 0, pf, 0, 0UL, decod, &dat); + if ((dat.type==aprsdecode_OBJ || dat.type==aprsdecode_ITEM) + && (oneop[0UL]==0 || X2C_STRCMP(oneop,oneop_len, + dat.objectfrom,9u)==0)) { + if (decod) { + aprsstr_Append(s, 1000ul, "\012\012", 3ul); + useri_wrstrlist(s, 1000ul, dat.symcall, pf->vardat->pos, + pf->time0); + } + else { + aprsstr_Append(s, 1000ul, "\012", 2ul); + useri_wrstrlist(s, 1000ul, dat.objectfrom, pf->vardat->pos, + pf->time0); + } + } + } + } + op = op->next; + } + X2C_PFREE(oneop); +} /* end listtyps() */ + +#define aprstext_Z 48 + + +static void degtostr(float d, char lat, char form, + char s[], uint32_t s_len) +{ + uint32_t i; + uint32_t n; + if (s_len-1<11UL) { + s[0UL] = 0; + return; + } + if (form=='2') i = 7UL; + else if (form=='3') i = 8UL; + else i = 9UL; + if (d<0.0f) { + d = -d; + if (lat) s[i] = 'S'; + else s[i+1UL] = 'W'; + } + else if (lat) s[i] = 'N'; + else s[i+1UL] = 'E'; + i = (uint32_t)!lat; + if (form=='2') { + /* DDMM.MMNDDMM.MME */ + /* n:=trunc(d*(6000*180/PI)+0.5); */ + n = aprsdecode_trunc(d*3.4377467707849E+5f); + s[0UL] = (char)((n/600000UL)%10UL+48UL); + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/6000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else if (form=='3') { + /* DDMM.MMMNDDMM.MMME */ + n = aprsdecode_trunc(d*3.4377467707849E+6f+0.5f); + s[0UL] = (char)((n/6000000UL)%10UL+48UL); + s[i] = (char)((n/600000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else { + /* DDMMSS */ + n = aprsdecode_trunc(d*2.062648062471E+5f+0.5f); + s[0UL] = (char)((n/360000UL)%10UL+48UL); + s[i] = (char)((n/36000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/3600UL)%10UL+48UL); + ++i; + s[i] = '\177'; + ++i; + s[i] = (char)((n/600UL)%6UL+48UL); + ++i; + s[i] = (char)((n/60UL)%10UL+48UL); + ++i; + s[i] = '\''; + ++i; + s[i] = (char)((n/10UL)%6UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + s[i] = '\"'; + ++i; + } + ++i; + s[i] = 0; +} /* end degtostr() */ + + +extern void aprstext_postostr(struct aprspos_POSITION pos, char form, + char s[], uint32_t s_len) +{ + char h[32]; + degtostr(pos.lat, 1, form, s, s_len); + aprsstr_Append(s, s_len, "/", 2ul); + degtostr(pos.long0, 0, form, h, 32ul); + aprsstr_Append(s, s_len, h, 32ul); +} /* end postostr() */ + + +static int32_t myround(float x) +{ + if (x>=0.0f) x = x+0.5f; + else x = x-0.5f; + return (int32_t)X2C_TRUNCI(x,X2C_min_longint,X2C_max_longint); +} /* end myround() */ + + +extern void aprstext_measure(struct aprspos_POSITION pos0, + struct aprspos_POSITION pos1, char s[], uint32_t s_len, + char sum) +{ + char h[32]; + if (aprspos_posvalid(pos0) && aprspos_posvalid(pos1)) { + aprstext_postostr(pos1, '3', s, s_len); + aprsstr_Append(s, s_len, " [", 3ul); + maptool_postoloc(h, 32ul, pos1); + aprsstr_Append(s, s_len, h, 32ul); + aprsstr_Append(s, s_len, "] ", 3ul); + aprsstr_FixToStr(aprspos_distance(pos0, pos1), 4UL, h, 32ul); + aprsstr_Append(s, s_len, h, 32ul); + aprsstr_Append(s, s_len, "km,", 4ul); + aprsstr_IntToStr(myround(aprspos_azimuth(pos0, pos1)), 1UL, h, 32ul); + aprsstr_Append(s, s_len, h, 32ul); + aprsstr_Append(s, s_len, "deg to Marker", 14ul); + if (sum) { + if (aprsdecode_click.waysum==0.0f) aprsdecode_click.sumpos = pos0; + aprsdecode_click.waysum = aprsdecode_click.waysum+aprspos_distance(aprsdecode_click.sumpos, + pos1); + aprsdecode_click.sumpos = pos1; + aprsstr_Append(s, s_len, " sum:", 6ul); + aprsstr_FixToStr(aprsdecode_click.waysum, 4UL, h, 32ul); + aprsstr_Append(s, s_len, h, 32ul); + aprsstr_Append(s, s_len, "km", 3ul); + } + } + else s[0UL] = 0; +} /* end measure() */ + + +static uint32_t c(char * err, char ch) +{ + uint32_t n; + if ((uint8_t)ch>='0') n = (uint32_t)(uint8_t)ch-48UL; + else { + n = 0UL; + *err = 1; + } + if (n>9UL) *err = 1; + return n; +} /* end c() */ + + +extern void aprstext_degtopos(char s[], uint32_t s_len, + struct aprspos_POSITION * pos) +/* DDMM.MMNDDDMM.MME */ +{ + char err; + uint32_t d; + X2C_PCOPY((void **)&s,s_len); + err = 0; + d = c(&err, s[0UL])*60000UL+c(&err, s[1UL])*6000UL+c(&err, + s[2UL])*1000UL+c(&err, s[3UL])*100UL+c(&err, + s[5UL])*10UL+c(&err, s[6UL]); + pos->lat = (float)d*2.9088820866572E-6f; + if (pos->lat>=1.5707963267949f) err = 1; + if (X2C_CAP(s[7UL])=='S') pos->lat = -pos->lat; + else if (X2C_CAP(s[7UL])!='N') err = 1; + d = c(&err, s[9UL])*600000UL+c(&err, s[10UL])*60000UL+c(&err, + s[11UL])*6000UL+c(&err, s[12UL])*1000UL+c(&err, + s[13UL])*100UL+c(&err, s[15UL])*10UL+c(&err, s[16UL]); + pos->long0 = (float)d*2.9088820866572E-6f; + if (pos->long0>=3.1415926535898f) err = 1; + if (X2C_CAP(s[17UL])=='W') pos->long0 = -pos->long0; + else if (X2C_CAP(s[17UL])!='E') err = 1; + if (((uint8_t)s[2UL]>='6' || (uint8_t)s[12UL]>='6') || err) { + aprsdecode_posinval(pos); + } + X2C_PFREE(s); +} /* end degtopos() */ + + +static char c0(uint32_t * d, uint32_t * i, char s[], + uint32_t s_len, uint32_t mul) +{ + uint32_t n; + char ch; + ch = s[*i]; + if (mul>0UL) { + if ((uint8_t)ch>='0') n = (uint32_t)(uint8_t)ch-48UL; + else return 0; + if (n>9UL) return 0; + *d += n*mul; + } + else if (ch!='.') return 0; + ++*i; + return 1; +} /* end c() */ + + +extern void aprstext_deghtopos(char s[], uint32_t s_len, + struct aprspos_POSITION * pos) +/* DDMM.MMMNDDDMM.MMME */ +{ + char e; + char err; + uint32_t i; + uint32_t d; + X2C_PCOPY((void **)&s,s_len); + err = 0; + d = 0UL; + i = 0UL; + e = ((((((c0(&d, &i, s, s_len, 600000UL) && c0(&d, &i, s, s_len, + 60000UL)) && c0(&d, &i, s, s_len, 10000UL)) && c0(&d, &i, s, + s_len, 1000UL)) && c0(&d, &i, s, s_len, 0UL)) && c0(&d, &i, + s, s_len, 100UL)) && c0(&d, &i, s, s_len, 10UL)) && c0(&d, + &i, s, s_len, 1UL); + pos->lat = (float)d*2.9088820866572E-7f; + if (pos->lat>=1.5707963267949f) err = 1; + if (s[i]=='S') pos->lat = -pos->lat; + else if (s[i]!='N') err = 1; + i += 2UL; + d = 0UL; + e = (((((((c0(&d, &i, s, s_len, 6000000UL) && c0(&d, &i, s, s_len, + 600000UL)) && c0(&d, &i, s, s_len, 60000UL)) && c0(&d, &i, s, + s_len, 10000UL)) && c0(&d, &i, s, s_len, 1000UL)) && c0(&d, + &i, s, s_len, 0UL)) && c0(&d, &i, s, s_len, 100UL)) && c0(&d, + &i, s, s_len, 10UL)) && c0(&d, &i, s, s_len, 1UL); + pos->long0 = (float)d*2.9088820866572E-7f; + if (pos->long0>=3.1415926535898f) err = 1; + if (s[i]=='W') pos->long0 = -pos->long0; + else if (s[i]!='E') err = 1; + if (((uint8_t)s[2UL]>='6' || (uint8_t)s[13UL]>='6') || err) { + aprsdecode_posinval(pos); + } + X2C_PFREE(s); +} /* end deghtopos() */ + + +static void cleanposstr(char s[], uint32_t s_len) +{ + uint32_t i; + i = 0UL; + while (i<=s_len-1 && s[i]) { + if ((s[i]==',' || s[i]=='/') || s[i]=='\\') s[i] = ' '; + ++i; + } +} /* end cleanposstr() */ + + +extern void aprstext_degdeztopos(char s[], uint32_t s_len, + struct aprspos_POSITION * pos) +/* lat long in float deg */ +{ + float d; + char h[31]; + X2C_PCOPY((void **)&s,s_len); + cleanposstr(s, s_len); + aprsstr_Extractword(s, s_len, h, 31ul); + if (aprsstr_StrToFix(&d, h, 31ul)) { + pos->lat = d*1.7453292519943E-2f; + aprsstr_Extractword(s, s_len, h, 31ul); + if (aprsstr_StrToFix(&d, h, 31ul)) { + pos->long0 = d*1.7453292519943E-2f; + if ((float)fabs(pos->long0)<3.1415926535898f && (float) + fabs(pos->lat)<=1.484f) goto label; + } + } + aprsdecode_posinval(pos); + label:; + X2C_PFREE(s); +} /* end degdeztopos() */ + + +extern void aprstext_deganytopos(char s[], uint32_t s_len, + struct aprspos_POSITION * pos) +/* lat long any format in float deg */ +{ + X2C_PCOPY((void **)&s,s_len); + aprstext_degtopos(s, s_len, pos); /* DDMM.MMNDDDMM.MME */ + if (!aprspos_posvalid(*pos)) aprstext_deghtopos(s, s_len, pos); + if (!aprspos_posvalid(*pos)) aprstext_degdeztopos(s, s_len, pos); + X2C_PFREE(s); +} /* end deganytopos() */ + + +extern char aprstext_getmypos(struct aprspos_POSITION * pos) +{ + char s[51]; + useri_confstr(useri_fMYPOS, s, 51ul); + aprstext_deganytopos(s, 51ul, pos); + return aprspos_posvalid(*pos); +} /* end getmypos() */ + + +static char num(int32_t n) +{ + return (char)(labs(n)%10L+48L); +} /* end num() */ + + +static uint32_t dao91(uint32_t x) +/* 33 + radix91(xx/1.1) of dddmm.mmxx */ +{ + return 33UL+(x*20UL+11UL)/22UL; +} /* end dao91() */ + + +static void daostr(int32_t latd, int32_t longd, char s[], + uint32_t s_len) +{ + s[0UL] = '!'; + s[1UL] = 'w'; + s[2UL] = (char)dao91((uint32_t)latd); + s[3UL] = (char)dao91((uint32_t)longd); + s[4UL] = '!'; + s[5UL] = 0; +} /* end daostr() */ + + +static void micedest(int32_t lat, int32_t long0, char s[], + uint32_t s_len) +{ + uint32_t nl; + uint32_t nb; + nl = (uint32_t)(labs(long0)/6000L); + nb = (uint32_t)(labs(lat)/6000L); + s[0UL] = (char)(80UL+nb/10UL); + s[1UL] = (char)(80UL+nb%10UL); + nb = (uint32_t)labs(lat)-nb*6000UL; + s[2UL] = (char)(80UL+nb/1000UL); + s[3UL] = (char)(48UL+32UL*(uint32_t)(lat>=0L)+(nb/100UL)%10UL); + s[4UL] = (char)(48UL+32UL*(uint32_t)(nl<10UL || nl>=100UL)+(nb/10UL) + %10UL); + s[5UL] = (char)(48UL+32UL*(uint32_t)(long0<0L)+nb%10UL); + s[6UL] = 0; +} /* end micedest() */ + + +static void micedata(int32_t lat, int32_t long0, uint32_t knots, + uint32_t dir, int32_t alt, char sym[], + uint32_t sym_len, char s[], uint32_t s_len) +{ + uint32_t n; + uint32_t nl; + X2C_PCOPY((void **)&sym,sym_len); + dir = dir%360UL; + /*IF dir>0 THEN DEC(dir) END; */ + /*IF dir>359 THEN dir:=359 END; */ + if (knots>799UL) knots = 0UL; + nl = (uint32_t)(labs(long0)/6000L); + if (nl<10UL) s[0UL] = (char)(nl+118UL); + else if (nl>=100UL) { + if (nl<110UL) s[0UL] = (char)(nl+8UL); + else s[0UL] = (char)(nl-72UL); + } + else s[0UL] = (char)(nl+28UL); + nl = (uint32_t)labs(long0)-nl*6000UL; /* long min*100 */ + n = nl/100UL; + if (n<10UL) n += 60UL; + s[1UL] = (char)(n+28UL); + s[2UL] = (char)(nl%100UL+28UL); + s[3UL] = (char)(knots/10UL+28UL); + s[4UL] = (char)(32UL+(knots%10UL)*10UL+dir/100UL); + s[5UL] = (char)(28UL+dir%100UL); + s[6UL] = sym[1UL]; + s[7UL] = sym[0UL]; + if (alt>-10000L) { + n = (uint32_t)(alt+10000L); + s[8UL] = (char)(33UL+(n/8281UL)%91UL); + s[9UL] = (char)(33UL+(n/91UL)%91UL); + s[10UL] = (char)(33UL+n%91UL); + s[11UL] = '}'; + s[12UL] = 0; + } + else s[8UL] = 0; + X2C_PFREE(sym); +} /* end micedata() */ + + +static void alt2str(int32_t feet, char s[], uint32_t s_len) +{ + if (feet>-100000L) { + s[0UL] = '/'; + s[1UL] = 'A'; + s[2UL] = '='; + if (feet<0L) { + feet = -feet; + s[3UL] = '-'; + } + else s[3UL] = num(feet/100000L); + s[4UL] = num(feet/10000L); + s[5UL] = num(feet/1000L); + s[6UL] = num(feet/100L); + s[7UL] = num(feet/10L); + s[8UL] = num(feet); + s[9UL] = 0; + } + else s[0UL] = 0; +} /* end alt2str() */ + + +static void speeddir2str(int32_t knots, int32_t dir, char areaobj, + char s[], uint32_t s_len) +{ + if (areaobj || dir>0L && dir<=360L) { + /* IF dir=0 THEN dir:=360 END; */ + s[0UL] = num(dir/100L); + s[1UL] = num(dir/10L); + s[2UL] = num(dir); + } + else { + s[0UL] = '.'; + s[1UL] = '.'; + s[2UL] = '.'; + } + if (areaobj && knots>=1000L) s[3UL] = num(knots/1000L); + else s[3UL] = '/'; + s[4UL] = num(knots/100L); + s[5UL] = num(knots/10L); + s[6UL] = num(knots); + s[7UL] = 0; +} /* end speeddir2str() */ + + +extern void aprstext_compressdata(struct aprspos_POSITION pos, + uint32_t knots, uint32_t dir, int32_t feet, + char sym[], uint32_t sym_len, char s[], + uint32_t s_len) +{ + int32_t n; + char h[201]; + X2C_PCOPY((void **)&sym,sym_len); + pos.lat = pos.lat*5.7295779513082E+1f; + pos.long0 = pos.long0*5.7295779513082E+1f; + s[0UL] = sym[0UL]; + if (pos.lat<90.0f) { + n = (int32_t)aprsdecode_trunc((90.0f-pos.lat)*3.80926E+5f); + } + else n = 0L; + s[1UL] = (char)(33L+n/753571L); + s[2UL] = (char)(33L+(n/8281L)%91L); + s[3UL] = (char)(33L+(n/91L)%91L); + s[4UL] = (char)(33L+n%91L); + if (pos.long0>(-180.0f)) { + n = (int32_t)aprsdecode_trunc((180.0f+pos.long0)*1.90463E+5f); + } + else n = 0L; + s[5UL] = (char)(33L+n/753571L); + s[6UL] = (char)(33L+(n/8281L)%91L); + s[7UL] = (char)(33L+(n/91L)%91L); + s[8UL] = (char)(33L+n%91L); + s[9UL] = sym[1UL]; + if (knots>0UL) { + if (dir>=360UL) dir = 0UL; + s[10UL] = (char)(33UL+dir/4UL); + s[11UL] = (char)(33UL+aprsdecode_trunc(osic_ln((float) + (knots+1UL))*1.29935872129E+1f)); + s[12UL] = '_'; + } + else if (feet>0L) { + n = (int32_t)aprsdecode_trunc(osic_ln((float)feet)*500.5f+0.5f); + if (n>=8281L) n = 8280L; + s[10UL] = (char)(33L+n/91L); + s[11UL] = (char)(33L+n%91L); + s[12UL] = 'W'; + } + else { + s[10UL] = ' '; + s[11UL] = ' '; + s[12UL] = '_'; + } + s[13UL] = 0; + if (knots>0UL && feet>0L) { + alt2str(feet, h, 201ul); + aprsstr_Append(s, s_len, h, 201ul); + } + X2C_PFREE(sym); +} /* end compressdata() */ + +#define aprstext_Z0 48 + + +static void deg2str(int32_t lat, int32_t long0, char s[], + uint32_t s_len) +/* DDMM.MMNDDDMM.MME */ +{ + if (lat<0L) { + lat = -lat; + s[7UL] = 'S'; + } + else s[7UL] = 'N'; + if (long0<0L) { + long0 = -long0; + s[17UL] = 'W'; + } + else s[17UL] = 'E'; + s[0UL] = (char)(lat/60000L+48L); + s[1UL] = (char)((lat/6000L)%10L+48L); + s[2UL] = (char)((lat/1000L)%6L+48L); + s[3UL] = (char)((lat/100L)%10L+48L); + s[4UL] = '.'; + s[5UL] = (char)((lat/10L)%10L+48L); + s[6UL] = (char)(lat%10L+48L); + s[9UL] = (char)(long0/600000L+48L); + s[10UL] = (char)((long0/60000L)%10L+48L); + s[11UL] = (char)((long0/6000L)%10L+48L); + s[12UL] = (char)((long0/1000L)%6L+48L); + s[13UL] = (char)((long0/100L)%10L+48L); + s[14UL] = '.'; + s[15UL] = (char)((long0/10L)%10L+48L); + s[16UL] = (char)(long0%10L+48L); + s[18UL] = 0; +} /* end deg2str() */ + + +static void getbeaconpos(struct aprspos_POSITION * pos, char * err) +{ + int32_t fd; + int32_t len; + char s[1001]; + useri_confstr(useri_fRBPOS, s, 1001ul); + if (s[0U]==':') { + /* get beacon position from file */ + aprsstr_Delstr(s, 1001ul, 0UL, 1UL); + fd = osi_OpenRead(s, 1001ul); + s[0U] = 0; + if (osic_FdValid(fd)) { + len = osi_RdBin(fd, (char *)s, 1001u/1u, 1000UL); + if (len<1L) { + len = 0L; + useri_say("\012beacon position file not readable\012", 36ul, + 20UL, 'e'); + } + else if (len>1000L) len = 1000L; + s[len] = 0; + osic_Close(fd); + } + else { + useri_say("\012beacon position file not found\012", 33ul, 20UL, + 'e'); + } + } + if (s[0U]) { + aprstext_deganytopos(s, 1001ul, pos); + if (!aprspos_posvalid(*pos)) { + useri_say("\012beacon: object/item position wrong\012", 37ul, 4UL, + 'e'); + *err = 1; + } + } + else { + useri_say("\012beacon: no object/item position\012", 34ul, 4UL, 'e'); + *err = 1; + aprsdecode_posinval(pos); + } +} /* end getbeaconpos() */ + + +extern char aprstext_callwrong(char s[], uint32_t s_len) +{ + uint32_t i; + i = 0UL; + while (i<=s_len-1 && s[i]) { + if ((uint8_t)s[i]<=' ' || (uint8_t)s[i]>='\177') return 1; + ++i; + } + return i<3UL || i>9UL; +} /* end callwrong() */ + +#define aprstext_RAD 3.4377467707849E+7 + + +extern void aprstext_encbeacon(char s[], uint32_t s_len, + uint32_t * len) +/* assemble beacon string */ +{ + char h[201]; + char symb[2]; + char postyp; + char typ; + char mull; + char areaobj; + char err; + char dao; + char bkn; + struct aprspos_POSITION pos; + int32_t i; + int32_t longd; + int32_t latd; + int32_t long0; + int32_t lat; + int32_t alt; + int32_t feet; + int32_t knots; + int32_t dir; + uint32_t datastart; + err = 0; + *len = 16UL; /* ax.25 address + UI + PID */ + useri_confstr(useri_fRBTYP, s, s_len); + typ = X2C_CAP(s[0UL]); + bkn = (((typ!='O' && typ!='H') && typ!='P') && typ!='I') && typ!='J'; + useri_confstr(useri_fRBPOSTYP, (char *) &postyp, 1u/1u); + useri_confstr(useri_fRBSYMB, symb, 2ul); + areaobj = (typ=='O' && symb[0U]=='\\') && symb[1U]=='l'; + if (aprsstr_Length(symb, 2ul)!=2UL) { + useri_say("\012no symbol\012", 12ul, 4UL, 'e'); + err = 1; + } + dao = postyp=='G' || postyp=='M'; + knots = useri_conf2int(useri_fRBSPEED, 0UL, 0L, 32767L, 0L); + if (!areaobj) { + knots = (int32_t)aprsdecode_trunc((float) + knots*5.3995680345572E-1f+0.5f); + } + dir = useri_conf2int(useri_fRBDIR, 0UL, 0L, 1000L, 1000L); + /*WrInt(dir, 9); WrStrLn("defdir"); */ + if (dir<1000L) { + if (!areaobj) { + if (dir>359L) { + useri_say("\012beacon: Direction <360\012", 25ul, 20UL, 'e'); + err = 1; + } + else if (knots==0L) { + useri_say("\012direction needs speed>0\012", 26ul, 20UL, 'e'); + } + if (dir==0L) dir = 360L; + } + } + else dir = 0L; + alt = useri_conf2int(useri_fRBALT, 0UL, -10000L, 1000000L, -32768L); + feet = (int32_t)aprsdecode_trunc((float)fabs(X2C_DIVR((float)alt, + 0.3048f)+0.5f)); + if (alt<0L) feet = -feet; + useri_confstr(useri_fRBPORT, s, s_len); /* port */ + aprsstr_Append(s, s_len, ":", 2ul); + aprsstr_IntToStr(useri_conf2int(useri_fRBTIME, 0UL, 0L, 32767L, 3600L), + 1UL, h, 201ul); + aprsstr_Append(s, s_len, h, 201ul); /* repeat time */ + aprsstr_Append(s, s_len, ":", 2ul); + if (bkn) { + useri_confstr(useri_fRBNAME, h, 201ul); + if ((uint8_t)h[0U]<=' ') { + useri_say("\012no beacon call?\012", 18ul, 4UL, 'e'); + } + if (useri_configon(useri_fMUSTBECALL) && !aprstext_isacall(h, 201ul)) { + useri_say("\012not valid callsign as beacon sender?\012", 39ul, + 20UL, 'e'); + } + aprsstr_Append(s, s_len, h, 201ul); + if (aprstext_getmypos(&pos)) { + if (!aprspos_posvalid(pos)) { + useri_say("\012Net beacon position wrong\012", 28ul, 4UL, 'e'); + err = 1; + } + } + else getbeaconpos(&pos, &err); + } + else { + useri_confstr(useri_fMYCALL, h, 201ul); + if ((uint8_t)h[0U]<=' ') { + useri_say("\012object/item needs a Config/Online/My Call\012", 44ul, + 4UL, 'e'); + } + aprsstr_Append(s, s_len, h, 201ul); + getbeaconpos(&pos, &err); + } + lat = (int32_t)aprsdecode_trunc((float)fabs(pos.lat) + *3.4377467707849E+7f); + long0 = (int32_t)aprsdecode_trunc((float)fabs(pos.long0) + *3.4377467707849E+7f); + latd = (int32_t)((uint32_t)lat%100UL); + longd = (int32_t)((uint32_t)long0%100UL); + if (dao) { + lat -= latd; + long0 -= longd; + } + lat = lat/100L; + long0 = long0/100L; + if (pos.lat<0.0f) lat = -lat; + if (pos.long0<0.0f) { + long0 = -long0; + } + aprsstr_Append(s, s_len, ">", 2ul); + if (X2C_CAP(postyp)=='M') micedest(lat, long0, h, 201ul); + else { + useri_confstr(useri_fRBDEST, h, 201ul); + if (h[0U]==0) strncpy(h,"APLM01",201u); + i = aprsstr_InStr(h, 201ul, "-", 2ul); + if (i>0L) aprsstr_Delstr(h, 201ul, (uint32_t)i, 201UL); + } + aprsstr_Append(s, s_len, h, 201ul); + useri_confstr(useri_fRBPATH, h, 201ul); + if ((uint8_t)h[0U]>' ') { + if (h[0U]!='-') aprsstr_Append(s, s_len, ",", 2ul); + aprsstr_Append(s, s_len, h, 201ul); /* dest ssid + via path */ + i = 0L; + while (s[i]) { + if (s[i]==',') *len += 7UL; + ++i; + } + } + aprsstr_Append(s, s_len, ":", 2ul); /* end of address */ + datastart = aprsstr_Length(s, s_len); /* rest of line for byte count */ + if (!bkn) { + useri_confstr(useri_fRBNAME, h, 201ul); + if ((uint8_t)h[0U]<=' ') { + useri_say("\012no object/item name?\012", 23ul, 20UL, 'e'); + err = 1; + } + aprsstr_Append(h, 201ul, " ", 10ul); /* fix size */ + h[9U] = 0; + if ((typ=='O' || typ=='H') || typ=='P') { + aprsstr_Append(s, s_len, ";", 2ul); /* object */ + aprsstr_Append(s, s_len, h, 201ul); + if (typ=='P') aprsstr_Append(s, s_len, "_", 2ul); + else aprsstr_Append(s, s_len, "*", 2ul); + if (typ=='O') aprsstr_Append(s, s_len, "\\\\Zz", 5ul); + else aprsstr_Append(s, s_len, "\\\\Hh", 5ul); + } + else { + aprsstr_Append(s, s_len, ")", 2ul); /* item */ + i = 3L; + while ((uint8_t)h[i]>' ') ++i; + h[i] = 0; /* item size 3..9 */ + aprsstr_Append(s, s_len, h, 201ul); + if (typ=='J') aprsstr_Append(s, s_len, "_", 2ul); + else aprsstr_Append(s, s_len, "!", 2ul); + } + } + else { + if (X2C_CAP(postyp)=='M') strncpy(h,"`",201u); + else strncpy(h,"=",201u); + aprsstr_Append(s, s_len, h, 201ul); /* beacon protocol */ + } + switch ((unsigned)X2C_CAP(postyp)) { + case 'M': + micedata(lat, long0, (uint32_t)knots, (uint32_t)dir, alt, symb, + 2ul, h, 201ul); + aprsstr_Append(s, s_len, h, 201ul); + break; + case 'C': + if (feet<0L && feet>-10000L) { + useri_say("\012no negative altitude in compressed mode\012", 42ul, + 20UL, 'e'); + err = 1; + } + if ((uint8_t)symb[0U]>='a' && (uint8_t)symb[0U]<='j') { + useri_say("\012overlay character a..j not in compressed mode\012", + 48ul, 20UL, 'e'); + err = 1; + } + if ((uint8_t)symb[0U]>='0' && (uint8_t)symb[0U]<='9') { + symb[0U] = (char)((uint32_t)(uint8_t)symb[0U]+49UL); + } + aprstext_compressdata(pos, (uint32_t)knots, (uint32_t)dir, feet, + symb, 2ul, h, 201ul); + aprsstr_Append(s, s_len, h, 201ul); + break; + default:; + deg2str(lat, long0, h, 201ul); + h[8U] = symb[0U]; /* symbol */ + h[18U] = symb[1U]; + h[19U] = 0; + aprsstr_Append(s, s_len, h, 201ul); + if (knots>0L) { + /* dir, speed */ + speeddir2str(knots, dir, areaobj, h, 201ul); + aprsstr_Append(s, s_len, h, 201ul); + } + if (alt>-10000L) { + alt2str(feet, h, 201ul); + aprsstr_Append(s, s_len, h, 201ul); + } + break; + } /* end switch */ + mull = aprsdecode_ismultiline(0); + /* IF mull THEN confappend(fRBCOMMENT, s) END; + (* multiline: append dao at end *) */ + useri_confappend(useri_fRBCOMMENT, s, s_len); + if (X2C_CAP(postyp)!='C' && (dao || mull)) { + /* DAO */ + daostr(latd, longd, h, 201ul); + aprsstr_Append(s, s_len, h, 201ul); + } + /* IF NOT mull THEN confappend(fRBCOMMENT, s) END; */ + *len += aprsstr_Length(s, s_len)-datastart; + if (err) s[0UL] = 0; +} /* end encbeacon() */ + + +extern void aprstext_BEGIN(void) +{ + static int aprstext_init = 0; + if (aprstext_init) return; + aprstext_init = 1; + useri_BEGIN(); + osi_BEGIN(); + maptool_BEGIN(); + aprsdecode_BEGIN(); + aprsstr_BEGIN(); + aprspos_BEGIN(); +} + diff --git a/src/aprstext.h b/src/aprstext.h new file mode 100644 index 0000000..38d21e9 --- /dev/null +++ b/src/aprstext.h @@ -0,0 +1,118 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef aprstext_H_ +#define aprstext_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif + +/* aprs tracks on osm map by oe5dxl */ +#define aprstext_TEXTCOLEND "\376" + +#define aprstext_TEXTCOLLGR "\367" + +#define aprstext_TEXTCOLRED "\370" + +#define aprstext_TEXTCOLBLU "\371" + +#define aprstext_TEXTCOLYEL "\372" + +#define aprstext_TEXTCOLORA "\373" + +#define aprstext_TEXTCOLVIO "\374" + +#define aprstext_TEXTINSERTSYMBOL "\375" + +extern void aprstext_decode(char [], uint32_t, aprsdecode_pFRAMEHIST, + aprsdecode_pFRAMEHIST, aprsdecode_pVARDAT, uint32_t, + char, struct aprsdecode_DAT *); + +extern void aprstext_strcp(char [], uint32_t, uint32_t, uint32_t, + char [], uint32_t); + +extern void aprstext_optext(uint32_t, struct aprsdecode_CLICKOBJECT *, + char *, char [], uint32_t); + +extern void aprstext_measure(struct aprspos_POSITION, + struct aprspos_POSITION, char [], uint32_t, + char); + +extern void aprstext_postostr(struct aprspos_POSITION, char, char [], + uint32_t); + +extern void aprstext_degtopos(char [], uint32_t, + struct aprspos_POSITION *); + +extern void aprstext_deghtopos(char [], uint32_t, + struct aprspos_POSITION *); + +extern void aprstext_degdeztopos(char [], uint32_t, + struct aprspos_POSITION *); + +extern void aprstext_deganytopos(char [], uint32_t, + struct aprspos_POSITION *); + +extern char aprstext_getmypos(struct aprspos_POSITION *); + +extern void aprstext_listop(char); + +extern void aprstext_listtyps(char, char, char [], + uint32_t); + +extern void aprstext_listin(char [], uint32_t, char, char, + char, int32_t, int32_t, int32_t); + +extern void aprstext_DateLocToStr(uint32_t, char [], uint32_t); +/* append (+localtime) to time */ + +extern void aprstext_encbeacon(char [], uint32_t, uint32_t *); + +extern float aprstext_FtoC(float); +/* fahrenheit to celsius */ + +extern float aprstext_CtoF(float); + +extern aprsdecode_pOPHIST aprstext_oppo(aprsdecode_MONCALL); + +extern void aprstext_setmarkalti(aprsdecode_pFRAMEHIST, aprsdecode_pOPHIST, + char); + +extern void aprstext_setmark1(struct aprspos_POSITION, char, + int32_t, uint32_t); + +extern void aprstext_Apphex(char [], uint32_t, char [], + uint32_t); + +extern char aprstext_isacall(char [], uint32_t); + +extern void aprstext_logfndate(uint32_t, char [], uint32_t); + +extern void aprstext_sievert2str(float, char [], uint32_t); + +extern void aprstext_compressdata(struct aprspos_POSITION, uint32_t, + uint32_t, int32_t, char [], uint32_t, char [], + uint32_t); + +extern void aprstext_decodelistline(char [], uint32_t, char [], + uint32_t, uint32_t); + +extern char aprstext_callwrong(char [], uint32_t); + + +extern void aprstext_BEGIN(void); + + +#endif /* aprstext_H_ */ diff --git a/src/basictypes.h b/src/basictypes.h new file mode 100644 index 0000000..479b30b --- /dev/null +++ b/src/basictypes.h @@ -0,0 +1,59 @@ +/** +\file basictypes.h +\brief GNSS core 'c' function library: basic types. +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2006-11-10 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_BASICTYPES_H_ +#define _C_BASICTYPES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/// The 'c' boolean type is a define for (int). TRUE(0), FALSE(1). +typedef int BOOL; + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifdef __cplusplus +} +#endif + +#endif // _C_BASICTYPES_H_ diff --git a/src/beep.c b/src/beep.c new file mode 100644 index 0000000..fdd1e7e --- /dev/null +++ b/src/beep.c @@ -0,0 +1,39 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include +#ifndef MACOS +#include +#endif +#include +#include + +int cbell(int hz, int ms) +{ +int fd; +int ret; + + ret=-2; + fd=open("/dev/tty0", O_WRONLY); + if (fd<0) fd=open("/dev/vc/0", O_WRONLY); + if (fd<0) fd=open("/dev/console", O_WRONLY); + if (fd<0) return -1; + +#ifndef MACOS + /* Not supported on MacOS */ + if (ioctl(fd, KIOCSOUND, 1193180/hz)>=0) + { + usleep(ms*1000); + ioctl(fd, KIOCSOUND, 0); + ret=0; + } +#endif + close(fd); + return ret; +} + + diff --git a/src/beep.h b/src/beep.h new file mode 100644 index 0000000..5e62325 --- /dev/null +++ b/src/beep.h @@ -0,0 +1,15 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef beep_H_ +#define beep_H_ +#include "X2C.h" + +extern long cbell(long, long); + + +#endif /* beep_H_ */ diff --git a/src/cleanup.c b/src/cleanup.c new file mode 100644 index 0000000..db8d24b --- /dev/null +++ b/src/cleanup.c @@ -0,0 +1,92 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int logout1(int pid, char *line) +{ + int fd; + struct utmp ut; + + if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0) return 0; + + while (read(fd, &ut, sizeof(struct utmp)) == sizeof(struct utmp)) { + if(ut.ut_pid!=pid) continue; + strncpy(line, ut.ut_line, UT_LINESIZE); + bzero(ut.ut_name, UT_NAMESIZE); + bzero(ut.ut_host, UT_HOSTSIZE); + time(&ut.ut_time); + lseek(fd, -(off_t)sizeof(struct utmp), L_INCR); + write(fd, &ut, sizeof(struct utmp)); + close(fd); + return 1; + } + close(fd); + return 0; +} + + +void logwtmp(const char *line, const char *name, const char *host) +{ + struct utmp ut; + struct stat buf; + int fd; + + if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0) return; + if (fstat(fd, &buf) == 0) { + ut.ut_pid = getpid(); + ut.ut_type = (name[0] != '\0')? USER_PROCESS : DEAD_PROCESS; + strncpy(ut.ut_id, "", 2); + strncpy(ut.ut_line, line, sizeof(ut.ut_line)); + strncpy(ut.ut_name, name, sizeof(ut.ut_name)); + strncpy(ut.ut_host, host, sizeof(ut.ut_host)); + time(&ut.ut_time); + if (write(fd, &ut, sizeof(struct utmp)) != sizeof(struct utmp)) + ftruncate(fd, buf.st_size); + } + close(fd); +} + + + +#define DEVPATH "/dev/" +void cleanup(int sig) { + int status, pid; + char line[UT_LINESIZE+sizeof(DEVPATH)]; + + if(sig!=SIGCHLD) return; + while( (pid=waitpid(-1, &status, WNOHANG /* |WUNTRACED */ )) > 0 ) { +/* + if(WIFSTOPPED(status)) { + fprintf(stderr,"process %d stopped by signal %d!\n", + pid, WSTOPSIG(status)); + continue; + } +*/ + sprintf(line,DEVPATH); + if( logout1(pid, line+sizeof(DEVPATH)-1) ) { + logwtmp(line+sizeof(DEVPATH)-1, "", ""); + chmod(line, 0666); + chown(line, 0, 0); + line[sizeof(DEVPATH)-1]='p'; /* ttyXX -> ptyXX */ + chmod(line, 0666); + chown(line, 0, 0); + } + } +} diff --git a/src/cleanup.h b/src/cleanup.h new file mode 100644 index 0000000..5e2c241 --- /dev/null +++ b/src/cleanup.h @@ -0,0 +1,17 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef cleanup_H_ +#define cleanup_H_ +#include "X2C.h" + +typedef long SigNum; + +extern void cleanup(long); + + +#endif /* cleanup_H_ */ diff --git a/src/constants.h b/src/constants.h new file mode 100644 index 0000000..8fcfeb9 --- /dev/null +++ b/src/constants.h @@ -0,0 +1,115 @@ +/** +\file constants.h +\brief GNSS core 'c' function library: Contains constants. +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-07-30 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_CONSTANTS_H_ +#define _C_CONSTANTS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//#define PI (3.1415926535898) // value from GPS-ICD pp. 101 used in orbit curve fit calculations by the control segment + +#ifndef PI +#define PI (3.1415926535897932384626433832795) //!< better value +#endif + +#ifndef TWOPI +#define TWOPI (6.283185307179586476925286766559) //!< 2.0*PI +#endif + +#ifndef HALFPI +#define HALFPI (1.5707963267948966192313216916398) //!< PI/2.0 +#endif + +#ifdef QUARTERPI +#define QUARTERPI (0.78539816339744830961566084581988) //!< PI/4.0 +#endif + +#ifndef DEG2RAD +#define DEG2RAD (0.017453292519943295769236907684886) //!< PI/180.0 +#endif + +#ifndef RAD2DEG +#define RAD2DEG (57.295779513082320876798154814105) //!< 180.0/PI +#endif + +#ifndef SECONDS_IN_WEEK +#define SECONDS_IN_WEEK (604800.0) //!< [s] +#endif + +#ifndef LIGHTSPEED +#define LIGHTSPEED (299792458.0) //!< light speed constant defined in ICD-GPS-200C p. 89 [m/s] +#endif + +#ifndef ONE_MS_IN_M +#define ONE_MS_IN_M (299792.4580) //!< 1 millisecond * light speed constant defined in ICD-GPS-200C p. 89 [m/s] +#endif + + +#ifndef GPS_FREQUENCYL1 +#define GPS_FREQUENCYL1 (1575.42e06) //!< [Hz] +#endif + +#ifndef GPS_FREQUENCYL2 +#define GPS_FREQUENCYL2 (1227.60e06) //!< [Hz] +#endif + + +#ifndef GPS_WAVELENGTHL1 +#define GPS_WAVELENGTHL1 (0.19029367279836488047631742646405) //!< [m] +#endif + + +#ifndef GPS_WAVELENGTHL2 +#define GPS_WAVELENGTHL2 (0.24421021342456825) //!< [m] +#endif + + +// not a constant but a very common type +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifdef __cplusplus +} +#endif + +#endif // _C_CONSTANTS_H_ diff --git a/src/deflate.c b/src/deflate.c new file mode 100644 index 0000000..416ef97 --- /dev/null +++ b/src/deflate.c @@ -0,0 +1,1571 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef deflate_H_ +#include "deflate.h" +#endif +#define deflate_C_ +#ifndef osi_H_ +#include "osi.h" +#endif + + + + + +/* data compressor simplified deflate-lz77 with low overhead for stream and blocks */ + +static uint32_t Hash(char a, char b, char c) +{ + return (uint32_t)(uint8_t)a+131UL*(uint32_t)(uint8_t) + b+851UL*(uint32_t)(uint8_t)c&4095UL; +} /* end Hash() */ +/* 131 831 */ + + +extern void deflate_Initexpand(struct deflate_XCONTEXT * c) +{ + uint32_t i; + for (i = 0UL; i<=32767UL; i++) { + c->ring[i] = 0; + } /* end for */ + c->wp = 0UL; + c->rxbits = 0UL; + c->rxbitbuf = 0UL; + c->rawlen = 0L; + c->compdata = 0; +} /* end Initexpand() */ + + +extern void deflate_Initdeflate(struct deflate_CONTEXT * c) +{ + uint32_t i; + for (i = 0UL; i<=32767UL; i++) { + c->ring[i] = 0; + c->hashchain[i] = (uint16_t)i; + } /* end for */ + for (i = 0UL; i<=4095UL; i++) { + c->hash[i] = 32768U; + } /* end for */ + /* c.hash[0]:=HIGH(c.ring); */ + c->wp = 0UL; + c->mlen = 0UL; + c->flen = 0UL; + c->savep = 32768UL; + c->rawr = 0UL; + c->comr = 0UL; + c->sizedif = -32L; + c->raww = 0UL; + c->comw = 0UL; + c->rawwo = 0UL; + c->txbitc = 0UL; + c->txbitbuf = 0UL; + c->wascomp = 0; +} /* end Initdeflate() */ + +/* +PROCEDURE Hashring(c-:CONTEXT; p:CARDINAL):INTEGER; +BEGIN RETURN Hash(c.ring[p], c.ring[(p+1) MOD BSIZE], + c.ring[(p+2) MOD BSIZE]) END Hashring; +*/ + +static void findmatch(struct deflate_CONTEXT * c, uint32_t * dist, + uint32_t * len) +{ + uint32_t do0; + uint32_t d; + uint32_t i; + uint32_t rp; + uint32_t hp; + *len = 0UL; + do0 = 0UL; + if (c->lastidx>=32768UL) { + for (d = 2UL; d>=1UL; d--) { + /* search in 1 and 2 byte with no hash */ + hp = (c->wp+32768UL)-d&32767UL; + i = 0UL; + rp = hp; + while (imlen && c->ring[rp]==c->matchbuf[i]) { + ++i; + rp = rp+1UL&32767UL; + if (rp==c->wp) rp = hp; + } + if (i>=3UL) { + *len = i; + *dist = d; + } + if (i>=c->mlen) return; + } /* end for */ + hp = (uint32_t)c->hash[Hash(c->matchbuf[0UL], c->matchbuf[1UL], + c->matchbuf[2UL])]; /* start hash chain */ + } + else hp = c->lastidx; + if (hp>=32768UL) return; + /* no hash so no fitting 3 bytes */ + for (;;) { + d = (c->wp+32768UL)-hp&32767UL; /* distance to ring write pointer */ + if (d<=do0) break; + do0 = d; + if (c->ring[hp+*len&32767UL]==c->matchbuf[*len]) { + /* quick test to save cpu */ + i = 0UL; + rp = hp; + while (imlen && c->ring[rp]==c->matchbuf[i]) { + /* compare strings */ + ++i; + rp = rp+1UL&32767UL; + if (rp==c->wp) rp = hp; + } + if (i>*len) { + /*& (d>=3)*/ + /* new longest match */ + *len = i; + *dist = d; + if (i>=c->mlen) { + c->lastidx = hp; /* continue at next search from here */ + break; + } + } + } + hp = (uint32_t)c->hashchain[hp]; /* go on in hash chain */ + } +} /* end findmatch() */ + + +static void stohash(struct deflate_CONTEXT * c) +{ + short hi; + uint32_t p; + p = c->wp+32765UL&32767UL; + hi = (short)Hash(c->ring[p], c->ring[p+1UL&32767UL], + c->ring[p+2UL&32767UL]); + if (c->hash[hi]<32768U) c->hashchain[p] = c->hash[hi]; + c->hash[hi] = (uint16_t)p; +} /* end stohash() */ + + +static void codelen(uint32_t len, uint32_t dist, uint32_t * clen, + uint32_t * nlen, uint32_t * dlen, uint32_t * nd) +{ + switch (len) { + case 3UL: + case 4UL: + case 5UL: + case 6UL: + case 7UL: + case 8UL: + case 9UL: + case 10UL: + *clen = 7UL; + *nlen = len-2UL; + break; + case 11UL: + case 12UL: + case 13UL: + case 14UL: + case 15UL: + case 16UL: + case 17UL: + case 18UL: + *clen = 8UL; + *nlen = (9UL+(len-11UL)/2UL)*2UL+(len-11UL&1UL); + break; + case 19UL: + case 20UL: + case 21UL: + case 22UL: + case 23UL: + case 24UL: + case 25UL: + case 26UL: + case 27UL: + case 28UL: + case 29UL: + case 30UL: + case 31UL: + case 32UL: + case 33UL: + case 34UL: + *clen = 9UL; + *nlen = (13UL+(len-19UL)/4UL)*4UL+(len-19UL&3UL); + break; + case 35UL: + case 36UL: + case 37UL: + case 38UL: + case 39UL: + case 40UL: + case 41UL: + case 42UL: + case 43UL: + case 44UL: + case 45UL: + case 46UL: + case 47UL: + case 48UL: + case 49UL: + case 50UL: + case 51UL: + case 52UL: + case 53UL: + case 54UL: + case 55UL: + case 56UL: + case 57UL: + case 58UL: + case 59UL: + case 60UL: + case 61UL: + case 62UL: + case 63UL: + case 64UL: + case 65UL: + case 66UL: + *clen = 10UL; + *nlen = (17UL+(len-35UL)/8UL)*8UL+(len-35UL&7UL); + break; + case 67UL: + case 68UL: + case 69UL: + case 70UL: + case 71UL: + case 72UL: + case 73UL: + case 74UL: + case 75UL: + case 76UL: + case 77UL: + case 78UL: + case 79UL: + case 80UL: + case 81UL: + case 82UL: + case 83UL: + case 84UL: + case 85UL: + case 86UL: + case 87UL: + case 88UL: + case 89UL: + case 90UL: + case 91UL: + case 92UL: + case 93UL: + case 94UL: + case 95UL: + case 96UL: + case 97UL: + case 98UL: + case 99UL: + case 100UL: + case 101UL: + case 102UL: + case 103UL: + case 104UL: + case 105UL: + case 106UL: + case 107UL: + case 108UL: + case 109UL: + case 110UL: + case 111UL: + case 112UL: + case 113UL: + case 114UL: + *clen = 11UL; + *nlen = (21UL+(len-67UL)/16UL)*16UL+(len-67UL&15UL); + break; + case 115UL: + case 116UL: + case 117UL: + case 118UL: + case 119UL: + case 120UL: + case 121UL: + case 122UL: + case 123UL: + case 124UL: + case 125UL: + case 126UL: + case 127UL: + case 128UL: + case 129UL: + case 130UL: + *clen = 12UL; + *nlen = 3072UL+(len-115UL&15UL); + break; + case 131UL: + case 132UL: + case 133UL: + case 134UL: + case 135UL: + case 136UL: + case 137UL: + case 138UL: + case 139UL: + case 140UL: + case 141UL: + case 142UL: + case 143UL: + case 144UL: + case 145UL: + case 146UL: + case 147UL: + case 148UL: + case 149UL: + case 150UL: + case 151UL: + case 152UL: + case 153UL: + case 154UL: + case 155UL: + case 156UL: + case 157UL: + case 158UL: + case 159UL: + case 160UL: + case 161UL: + case 162UL: + case 163UL: + case 164UL: + case 165UL: + case 166UL: + case 167UL: + case 168UL: + case 169UL: + case 170UL: + case 171UL: + case 172UL: + case 173UL: + case 174UL: + case 175UL: + case 176UL: + case 177UL: + case 178UL: + case 179UL: + case 180UL: + case 181UL: + case 182UL: + case 183UL: + case 184UL: + case 185UL: + case 186UL: + case 187UL: + case 188UL: + case 189UL: + case 190UL: + case 191UL: + case 192UL: + case 193UL: + case 194UL: + case 195UL: + case 196UL: + case 197UL: + case 198UL: + case 199UL: + case 200UL: + case 201UL: + case 202UL: + case 203UL: + case 204UL: + case 205UL: + case 206UL: + case 207UL: + case 208UL: + case 209UL: + case 210UL: + case 211UL: + case 212UL: + case 213UL: + case 214UL: + case 215UL: + case 216UL: + case 217UL: + case 218UL: + case 219UL: + case 220UL: + case 221UL: + case 222UL: + case 223UL: + case 224UL: + case 225UL: + case 226UL: + case 227UL: + case 228UL: + case 229UL: + case 230UL: + case 231UL: + case 232UL: + case 233UL: + case 234UL: + case 235UL: + case 236UL: + case 237UL: + case 238UL: + case 239UL: + case 240UL: + case 241UL: + case 242UL: + case 243UL: + case 244UL: + case 245UL: + case 246UL: + case 247UL: + case 248UL: + case 249UL: + case 250UL: + case 251UL: + case 252UL: + case 253UL: + case 254UL: + case 255UL: + case 256UL: + case 257UL: + *clen = 13UL; + *nlen = (193UL+(len-131UL)/32UL)*32UL+(len-131UL&31UL); + break; + default:; + *clen = 8UL; + *nlen = 285UL; + break; + } /* end switch */ + /* + CASE dist OF + 1..4: dlen:=5; nd:=dist-1; + | 5..6: dlen:=6; nd:=4*2+(dist-5) MOD 2; + | 7..8: dlen:=6; nd:=5*2+(dist-7) MOD 2; + | 9..12: dlen:=7; nd:=6*4+(dist-9) MOD 4; + |13..16: dlen:=7; nd:=7*4+(dist-13) MOD 4; + |17..24: dlen:=8; nd:=8*8+(dist-17) MOD 8; + |25..32: dlen:=8; nd:=9*8+(dist-25) MOD 8; + |33..48: dlen:=9; nd:=10*16+(dist-33) MOD 16; + |49..64: dlen:=9; nd:=11*16+(dist-49) MOD 16; + |65..96: dlen:=10; nd:=12*32+(dist-65) MOD 32; + |97..128: dlen:=10; nd:=13*32+(dist-97) MOD 32; + |129..192: dlen:=11; nd:=14*64+(dist-129) MOD 64; + |193..256: dlen:=11; nd:=15*64+(dist-193) MOD 64; + |257..384: dlen:=12; nd:=16*128+(dist-257) MOD 128; + |385..512: dlen:=12; nd:=17*128+(dist-385) MOD 128; + |513..768: dlen:=13; nd:=18*256+(dist-513) MOD 256; + |769..1024: dlen:=13; nd:=19*256+(dist-769) MOD 256; + |1025..1536:dlen:=14; nd:=20*512+(dist-1025) MOD 512; + |1537..2048:dlen:=14; nd:=21*512+(dist-1537) MOD 512; + |2049..3072:dlen:=15; nd:=22*1024+(dist-2049) MOD 1024; + |3073..4096:dlen:=15; nd:=23*1024+(dist-3073) MOD 1024; + |4097..6144:dlen:=16; nd:=24*2048+(dist-4097) MOD 2048; + |6145..8192:dlen:=16; nd:=25*2048+(dist-6145) MOD 2048; + |8193..12288:dlen:=17; nd:=26*4096+(dist-8193) MOD 4096; + |12289..16384:dlen:=17; nd:=27*4096+(dist-12289) MOD 4096; + |16385..24576:dlen:=18; nd:=28*8192+(dist-16385) MOD 8192; + |24577..32768:dlen:=18; nd:=29*8192+(dist-24577) MOD 8192; + END; + */ + switch (dist) { + case 1UL: + case 2UL: + case 3UL: + case 4UL: + *dlen = 5UL; + *nd = dist-1UL; + break; + case 5UL: + case 6UL: + *dlen = 6UL; + *nd = 8UL+(dist-5UL&1UL); + break; + case 7UL: + case 8UL: + *dlen = 6UL; + *nd = 10UL+(dist-7UL&1UL); + break; + case 9UL: + case 10UL: + case 11UL: + case 12UL: + *dlen = 7UL; + *nd = 24UL+(dist-9UL&3UL); + break; + case 13UL: + case 14UL: + case 15UL: + case 16UL: + *dlen = 7UL; + *nd = 28UL+(dist-13UL&3UL); + break; + case 17UL: + case 18UL: + case 19UL: + case 20UL: + case 21UL: + case 22UL: + case 23UL: + case 24UL: + *dlen = 8UL; + *nd = 64UL+(dist-17UL&7UL); + break; + case 25UL: + case 26UL: + case 27UL: + case 28UL: + case 29UL: + case 30UL: + case 31UL: + case 32UL: + *dlen = 8UL; + *nd = 72UL+(dist-25UL&7UL); + break; + case 33UL: + case 34UL: + case 35UL: + case 36UL: + case 37UL: + case 38UL: + case 39UL: + case 40UL: + case 41UL: + case 42UL: + case 43UL: + case 44UL: + case 45UL: + case 46UL: + case 47UL: + case 48UL: + *dlen = 9UL; + *nd = 160UL+(dist-33UL&15UL); + break; + case 49UL: + case 50UL: + case 51UL: + case 52UL: + case 53UL: + case 54UL: + case 55UL: + case 56UL: + case 57UL: + case 58UL: + case 59UL: + case 60UL: + case 61UL: + case 62UL: + case 63UL: + case 64UL: + *dlen = 9UL; + *nd = 176UL+(dist-49UL&15UL); + break; + case 65UL: + case 66UL: + case 67UL: + case 68UL: + case 69UL: + case 70UL: + case 71UL: + case 72UL: + case 73UL: + case 74UL: + case 75UL: + case 76UL: + case 77UL: + case 78UL: + case 79UL: + case 80UL: + case 81UL: + case 82UL: + case 83UL: + case 84UL: + case 85UL: + case 86UL: + case 87UL: + case 88UL: + case 89UL: + case 90UL: + case 91UL: + case 92UL: + case 93UL: + case 94UL: + case 95UL: + case 96UL: + *dlen = 10UL; + *nd = 384UL+(dist-65UL&31UL); + break; + case 97UL: + case 98UL: + case 99UL: + case 100UL: + case 101UL: + case 102UL: + case 103UL: + case 104UL: + case 105UL: + case 106UL: + case 107UL: + case 108UL: + case 109UL: + case 110UL: + case 111UL: + case 112UL: + case 113UL: + case 114UL: + case 115UL: + case 116UL: + case 117UL: + case 118UL: + case 119UL: + case 120UL: + case 121UL: + case 122UL: + case 123UL: + case 124UL: + case 125UL: + case 126UL: + case 127UL: + case 128UL: + *dlen = 10UL; + *nd = 416UL+(dist-97UL&31UL); + break; + case 129UL: + case 130UL: + case 131UL: + case 132UL: + case 133UL: + case 134UL: + case 135UL: + case 136UL: + case 137UL: + case 138UL: + case 139UL: + case 140UL: + case 141UL: + case 142UL: + case 143UL: + case 144UL: + case 145UL: + case 146UL: + case 147UL: + case 148UL: + case 149UL: + case 150UL: + case 151UL: + case 152UL: + case 153UL: + case 154UL: + case 155UL: + case 156UL: + case 157UL: + case 158UL: + case 159UL: + case 160UL: + case 161UL: + case 162UL: + case 163UL: + case 164UL: + case 165UL: + case 166UL: + case 167UL: + case 168UL: + case 169UL: + case 170UL: + case 171UL: + case 172UL: + case 173UL: + case 174UL: + case 175UL: + case 176UL: + case 177UL: + case 178UL: + case 179UL: + case 180UL: + case 181UL: + case 182UL: + case 183UL: + case 184UL: + case 185UL: + case 186UL: + case 187UL: + case 188UL: + case 189UL: + case 190UL: + case 191UL: + case 192UL: + *dlen = 11UL; + *nd = 896UL+(dist-129UL&63UL); + break; + case 193UL: + case 194UL: + case 195UL: + case 196UL: + case 197UL: + case 198UL: + case 199UL: + case 200UL: + case 201UL: + case 202UL: + case 203UL: + case 204UL: + case 205UL: + case 206UL: + case 207UL: + case 208UL: + case 209UL: + case 210UL: + case 211UL: + case 212UL: + case 213UL: + case 214UL: + case 215UL: + case 216UL: + case 217UL: + case 218UL: + case 219UL: + case 220UL: + case 221UL: + case 222UL: + case 223UL: + case 224UL: + case 225UL: + case 226UL: + case 227UL: + case 228UL: + case 229UL: + case 230UL: + case 231UL: + case 232UL: + case 233UL: + case 234UL: + case 235UL: + case 236UL: + case 237UL: + case 238UL: + case 239UL: + case 240UL: + case 241UL: + case 242UL: + case 243UL: + case 244UL: + case 245UL: + case 246UL: + case 247UL: + case 248UL: + case 249UL: + case 250UL: + case 251UL: + case 252UL: + case 253UL: + case 254UL: + case 255UL: + case 256UL: + *dlen = 11UL; + *nd = 960UL+(dist-193UL&63UL); + break; + default:; + if (dist<=384UL) { + *dlen = 12UL; + *nd = 2048UL+(dist-257UL&127UL); + } + else if (dist<=512UL) { + *dlen = 12UL; + *nd = 2176UL+(dist-385UL&127UL); + } + else if (dist<=768UL) { + *dlen = 13UL; + *nd = 4608UL+(dist-513UL&255UL); + } + else if (dist<=1024UL) { + *dlen = 13UL; + *nd = 4864UL+(dist-769UL&255UL); + } + else if (dist<=1536UL) { + *dlen = 14UL; + *nd = 10240UL+(dist-1025UL&511UL); + } + else if (dist<=2048UL) { + *dlen = 14UL; + *nd = 10752UL+(dist-1537UL&511UL); + } + else if (dist<=3072UL) { + *dlen = 15UL; + *nd = 22528UL+(dist-2049UL&1023UL); + } + else if (dist<=4096UL) { + *dlen = 15UL; + *nd = 23552UL+(dist-3073UL&1023UL); + } + else if (dist<=6144UL) { + *dlen = 16UL; + *nd = 49152UL+(dist-4097UL&2047UL); + } + else if (dist<=8192UL) { + *dlen = 16UL; + *nd = 51200UL+(dist-6145UL&2047UL); + } + else if (dist<=12288UL) { + *dlen = 17UL; + *nd = 106496UL+(dist-8193UL&4095UL); + } + else if (dist<=16384UL) { + *dlen = 17UL; + *nd = 110592UL+(dist-12289UL&4095UL); + } + else if (dist<=24576UL) { + *dlen = 18UL; + *nd = 229376UL+(dist-16385UL&8191UL); + } + else { + *dlen = 18UL; + *nd = 237568UL+(dist-24577UL&8191UL); + } + break; + } /* end switch */ +} /* end codelen() */ + + +static void txbits(struct deflate_CONTEXT * c, uint32_t b, uint32_t len, + char dbuf[], uint32_t dbuf_len, int32_t * outlen) +{ + /* c.txbitbuf:=c.txbitbuf<txbitbuf = (uint32_t)X2C_LSH((uint32_t)c->txbitbuf,32, + (int32_t)len)+b; + c->txbitc += len; + if (len==0UL) { + /* flush */ + while (c->txbitc&7UL) { + /* fill zero to full byte */ + ++c->txbitc; + c->txbitbuf = c->txbitbuf*2UL; + } + } + /* c.txbitc:=0; */ + /*WrStrLn("txbit-flush"); */ + if (*outlen>=0L) { + while (c->txbitc>=8UL) { + dbuf[*outlen] = (char)(uint32_t)X2C_LSH((uint32_t) + c->txbitbuf,32,8L-(int32_t)c->txbitc); + ++*outlen; + if (*outlen>(int32_t)(dbuf_len-1)) *outlen = -2L; + c->txbitc -= 8UL; + } + } +} /* end txbits() */ + + +static void wrrawblock(struct deflate_CONTEXT * c, char dbuf[], + uint32_t dbuf_len, int32_t * outlen) +{ + uint32_t b; + uint32_t n; + uint32_t i; + uint32_t tmp; + txbits(c, 1UL, 1UL, dbuf, dbuf_len, outlen); /* switch to raw */ + if (c->txbitc==0UL) b = 8UL; + else b = 16UL-c->txbitc; + n = (c->rawwo+32768UL)-c->rawr&32767UL; + i = 1UL; + /* i:=i<ring[c->rawr], 8UL, dbuf, dbuf_len, + outlen); + c->rawr = c->rawr+1UL&32767UL; + if (i==tmp) break; + } /* end for */ +} /* end wrrawblock() */ + + +static void wrcomp(struct deflate_CONTEXT * c, char dbuf[], + uint32_t dbuf_len, int32_t * outlen) +{ + uint32_t dl; + uint32_t ll; + uint32_t d; + uint32_t l; + uint32_t dist; + uint32_t len; + while (c->comr!=c->comw) { + /* send all compressed data */ + len = c->combuf[c->comr]&65535UL; + dist = c->combuf[c->comr]/65536UL; + if (dist>0UL) codelen(len, dist, &ll, &l, &dl, &d); + else if (len<144UL) { + ll = 8UL; + l = len+48UL; + } + else if (len<256UL) { + /*WrStr("(");WrStr(CHR(len));WrStr(")"); */ + ll = 9UL; + l = len+256UL; + } + else if (len==256UL) { + ll = 7UL; + l = 0UL; + } + else { + ll = 8UL; + l = len+192UL; + } + /*IF dist>0 THEN WrStr("L(");WrInt(len,1);ELSE WrStr("C("); + WrHex(len,1); END; WrStr(")"); */ + txbits(c, l, ll, dbuf, dbuf_len, outlen); + if (dist>0UL) { + /*WrStr("D(");WrInt(dist,1);WrStr(")"); */ + txbits(c, d, dl, dbuf, dbuf_len, outlen); + } + c->comr = c->comr+1UL&2047UL; + } +} /* end wrcomp() */ + + +static void endcomp(struct deflate_CONTEXT * c, char finish, + char dbuf[], uint32_t dbuf_len, int32_t * outlen) +{ + txbits(c, 0UL, 7UL, dbuf, dbuf_len, outlen); + if (finish) txbits(c, 0UL, 1UL, dbuf, dbuf_len, outlen); +/* c.savep:=BSIZE; */ +/* c.mlen:=0; */ +/* txbits(c, 1, 1); */ +} /* end endcomp() */ + + +static void checkbufs(struct deflate_CONTEXT * c, char flush, + char dbuf[], uint32_t dbuf_len, int32_t * outlen) +{ + /*WrStr("(");WrInt(c.sizedif, 1);WrStr(")"); */ + if (c->sizedif>=0L) { + /* compressed state or compare */ + if (!c->wascomp) { + while (c->rawr!=c->rawwo) wrrawblock(c, dbuf, dbuf_len, outlen); + txbits(c, 0UL, 1UL, dbuf, dbuf_len, outlen); + /* switch to compressed */ + /*WrStrLn("");WrStrLn(" TOCOMP "); */ + c->wascomp = 1; + c->sizedif = 32L; + } + if (c->sizedif>=32L || ((c->comw+2048UL)-c->comr&2047UL)>=1791UL) { + wrcomp(c, dbuf, dbuf_len, outlen); /* send all compressed data */ + c->rawr = c->raww; /* delete all raw data */ + c->rawwo = c->raww; + c->sizedif = 32L; + } + if (flush) { + wrcomp(c, dbuf, dbuf_len, outlen); /* send all comprssed data */ + endcomp(c, flush=='\002', dbuf, dbuf_len, outlen); + } + } + else { + /*WrStrLn("-endcomp-"); WrInt(sum DIV 8, 12); WrInt(sum1, 12); + WrStrLn(""); */ + /* uncompressed state or compare */ + if (c->wascomp) { + endcomp(c, 0, dbuf, dbuf_len, outlen); + /*WrStrLn("");WrStrLn(" TORAW "); */ + c->wascomp = 0; + c->sizedif = -32L; + } + if (c->sizedif<=-32L || ((c->raww+32768UL)-c->rawr&32767UL)>=16384UL) { + /* uncompressed */ + c->rawwo = c->raww; /* undeletable to raw buffer */ + while (((c->rawwo+32768UL)-c->rawr&32767UL)>=16384UL) { + wrrawblock(c, dbuf, dbuf_len, outlen); + } + c->comr = c->comw; /* delete all compressd data */ + c->sizedif = -32L; + } + if (flush) { + c->comr = c->comw; /* delete all compressd data */ + c->rawwo = c->raww; + while (c->rawr!=c->rawwo) wrrawblock(c, dbuf, dbuf_len, outlen); + if (flush=='\002') { + /* with EOF */ + txbits(c, 0UL, 1UL, dbuf, dbuf_len, outlen); + /* switch to compressed */ + endcomp(c, 0, dbuf, dbuf_len, outlen); + /* zero data compressed is EOF*/ + } + } + } +/* c.comr:=c.comw; */ +} /* end checkbufs() */ + + +static void sendchar(struct deflate_CONTEXT * c, char dbuf[], + uint32_t dbuf_len, int32_t * outlen) +{ + uint32_t code; + code = (uint32_t)(uint8_t)c->ring[c->savep]; + c->combuf[c->comw] = code; + c->comw = c->comw+1UL&2047UL; + c->raww = c->savep+1UL&32767UL; + if (code>143UL) --c->sizedif; + checkbufs(c, 0, dbuf, dbuf_len, outlen); +} /* end sendchar() */ + + +static void send(struct deflate_CONTEXT * c, uint32_t len, uint32_t dist, + char dbuf[], uint32_t dbuf_len, int32_t * outlen) +{ + uint32_t nl; + uint32_t nd; + uint32_t dlen; + uint32_t clen; + uint32_t p1; + uint32_t p0; + uint32_t p; + checkbufs(c, 0, dbuf, dbuf_len, outlen); + c->combuf[c->comw] = len+65536UL*dist; + c->comw = c->comw+1UL&2047UL; + codelen(len, dist, &clen, &nl, &dlen, &nd); + p0 = c->wp+(32768UL-dist)&32767UL; + p = p0; + p1 = c->wp; + while (len>0UL) { + c->ring[c->wp] = c->ring[p]; + c->wp = c->wp+1UL&32767UL; + stohash(c); + c->sizedif += 8L; + /*WrBin(1, c.ring[p], 1); */ + c->raww = c->wp; + p = p+1UL&32767UL; + if (p==p1) p = p0; + --len; + } + c->sizedif -= (int32_t)(clen+dlen); +} /* end send() */ + + +extern void deflate_Deflatbyte(struct deflate_CONTEXT * c, char ch, + char flush, char dbuf[], uint32_t dbuf_len, + int32_t * outlen) +/* 1C send no blockend, 2C send it */ +{ + uint32_t len; + uint32_t dist; + uint32_t i; + uint32_t tmp; + if (flush==0) { + c->matchbuf[c->mlen] = ch; + ++c->mlen; + } + /*WrStr("{");WrInt(c.mlen, 1);WrStr("}"); */ + for (;;) { + if (c->mlen<3UL) { + c->lastidx = 32768UL; + break; + } + findmatch(c, &dist, &len); + if (len==c->mlen) { + /* match found */ + if (c->savep<32768UL) { + stohash(c); + sendchar(c, dbuf, dbuf_len, outlen); + c->savep = 32768UL; + c->flen = len; + c->fdist = dist; + } + else { + c->flen = len; + c->fdist = dist; + } + if (c->mlen>=257UL || flush) { + /* no longer match allowed so send it now */ + send(c, c->flen, c->fdist, dbuf, dbuf_len, outlen); + c->mlen = 0UL; + c->flen = 0UL; + } + break; + } + /* no match found */ + c->lastidx = 32768UL; + if (c->savep<32768UL) { + /* send old variante */ + if (c->flen>0UL) { + c->wp = c->wp+32767UL&32767UL; + /* restore ring to 1 char before */ + send(c, c->flen, c->fdist, dbuf, dbuf_len, outlen); + c->matchbuf[0UL] = c->matchbuf[c->mlen-1UL]; + /* not found last char */ + c->mlen = 1UL; + c->flen = 0UL; + c->savep = 32768UL; + } + else { + stohash(c); + sendchar(c, dbuf, dbuf_len, outlen); + c->savep = 32768UL; + } + } + else { + c->ring[c->wp] = c->matchbuf[0UL]; + c->savep = c->wp; /* remove first char */ + c->wp = c->wp+1UL&32767UL; + tmp = c->mlen-1UL; + i = 1UL; + if (i<=tmp) for (;; i++) { + c->matchbuf[i-1UL] = c->matchbuf[i]; + if (i==tmp) break; + } /* end for */ + --c->mlen; + } + } + if (flush) { + if (c->savep<32768UL) { + /* send first char of string */ + stohash(c); + sendchar(c, dbuf, dbuf_len, outlen); + c->savep = 32768UL; + } + tmp = c->mlen; + i = 1UL; + if (i<=tmp) for (;; i++) { + /* send rest of string */ + c->ring[c->wp] = c->matchbuf[i-1UL]; + c->savep = c->wp; + c->wp = c->wp+1UL&32767UL; + stohash(c); + sendchar(c, dbuf, dbuf_len, outlen); + if (i==tmp) break; + } /* end for */ + /* wrcomp(c, dbuf, outlen); + (* send all comprssed data *) */ + c->mlen = 0UL; + checkbufs(c, flush, dbuf, dbuf_len, outlen); + txbits(c, 0UL, 0UL, dbuf, dbuf_len, outlen); /* send remaining bits */ + c->wascomp = 0; + c->flen = 0UL; + /* c.comr:=c.comw; */ + c->savep = 32768UL; + } +/* c.sizedif:=0; */ +/*WrStrLn(""); */ +/*FOR i:=0 TO HIGH(c.ring) DO WrStr(c.ring[i]) END; WrStrLn(""); */ +} /* end Deflatbyte() */ + + +static void xsend(struct deflate_XCONTEXT * c, char ch, char dbuf[], + uint32_t dbuf_len, int32_t * outlen) +{ + if (*outlen<0L || *outlen>(int32_t)(dbuf_len-1)) *outlen = -1L; + else { + c->ring[c->wp] = ch; + c->wp = c->wp+1UL&32767UL; + dbuf[*outlen] = ch; + ++*outlen; + } +} /* end xsend() */ + +/* +PROCEDURE Expandbyte(VAR c:XCONTEXT; ch:CHAR; flush:BOOLEAN; + VAR dbuf:ARRAY OF CHAR; VAR outlen:INTEGER; + VAR done:BOOLEAN); + +CONST DISTAB=ARRAY OF CARDINAL {1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, + 257,385,513, + 769,1025,1537,2049,3073,4097,6145,8193,12289, + 16385,24577,0,0}; + LENTAB=ARRAY OF CARDINAL {0,3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31, + 35,43,51, + 59,67,83,99,115,131,163,195,227,285,0,0}; +VAR i, n, dist:CARDINAL; +BEGIN +--WrStr("!"); wh(ch);WrStr("!"); +<* IF DEB THEN *> +WrHex(sum3, 5);WrStr("H"); +INC(sum3); +<* END *> + + c.rxbitbuf:=c.rxbitbuf*256 + ORD(ch); + INC(c.rxbits, 8); + done:=FALSE; + WHILE (c.rxbits>=20) OR flush DO +-- i:=1; +-- c.rxbitbuf:=c.rxbitbuf MOD (i< +WrStr(" ["); WrInt(c.rxbits, 1);WrStr(",");WrHex(c.rxbitbuf,1);WrStr("]"); +<* END *> + IF flush & (c.rxbits<20) THEN (* append zeros as end of data *) + c.rxbitbuf:=c.rxbitbuf*256; + INC(c.rxbits, 8); + END; + + IF c.rawlen>0 THEN (* in uncompressed mode *) +--WrStr("[");WrInt(c.rawlen, 1);WrStr("]"); +-- ch:=CHR(c.rxbitbuf>>(c.rxbits-8)); + ch:=CHR(CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), 8-VAL(INTEGER, + c.rxbits)))); + + DEC(c.rxbits, 8); + xsend(c, ch, dbuf, outlen); + DEC(c.rawlen); + + ELSIF c.compmod=1C THEN (* get lengh word *) +-- IF c.rxbitbuf>>(c.rxbits-7)<24 THEN + IF CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), 7-VAL(INTEGER, + c.rxbits)))<24 THEN + c.lencode:=CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), 7-VAL(INTEGER, + c.rxbits))); +-- c.lencode:=c.rxbitbuf>>(c.rxbits-7); + DEC(c.rxbits, 7); +<* IF DEB THEN *> +WrInt(c.lencode,3);WrStr("=LENC "); +<* END *> + IF c.lencode=ENDCOMP-256 THEN (* end of compressed data *) +<* IF DEB THEN *> +WrStrLn("ENDCOMP"); +<* END *> + IF c.justcomp THEN +<* IF DEB THEN *> +WrStrLn("QUICKENDCOMP"); +<* END *> + done:=TRUE; +WrStrLn(" LIBDONE2 "); + c.compmod:=0C; + c.justcomp:=FALSE; + flush:=FALSE; + ELSE c.compmod:=3C END; + ELSE (* get distance word *) + c.compmod:=2C; + c.justcomp:=FALSE; + END; +-- ELSIF c.rxbitbuf>>(c.rxbits-8)<192 THEN (* literal <144 *) + ELSIF CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), 8-VAL(INTEGER, + c.rxbits)))<192 THEN (* literal <144 *) +--WrHex(c.rxbitbuf>>(c.rxbits-8)-48,4);WrStr(",");WrInt(c.rxbits,1); + WrStr(",");WrInt(ORD(flush),1);WrStr("=LITC "); +--WrStr("<(");WrHex(c.rxbitbuf>>(c.rxbits-8)-48,1); WrStr(")>"); + + xsend(c, CHR(CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), + 8-VAL(INTEGER, c.rxbits)))-48), dbuf, outlen); + DEC(c.rxbits, 8); + c.justcomp:=FALSE; + + ELSIF CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), 8-VAL(INTEGER, + c.rxbits)))<200 THEN (* len *) + c.lencode:=CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), 8-VAL(INTEGER, + c.rxbits))) - (192-24); + DEC(c.rxbits, 8); + c.compmod:=2C; (* get distance word *) + c.justcomp:=FALSE; +--WrInt(c.lencode,3);WrStr("=LENCC "); + + ELSE (* literal >=144 *) + c.justcomp:=FALSE; +--WrStr("<[");WrHex(c.rxbitbuf>>(c.rxbits-9)-(400-144),1); WrStr("]>"); + xsend(c, CHR(CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), + 9-VAL(INTEGER, c.rxbits)))-(400-144)), dbuf, outlen); + DEC(c.rxbits, 9); + c.compmod:=1C; + END; + IF c.compmod=2C THEN + IF c.lencode>=9 THEN (* get extra length bits *) +-- i:=1; +-- c.rxbitbuf:=c.rxbitbuf MOD (i<>(VAL(CARDINAL, + c.rxbits)-n); + c.lencode:=LENTAB[c.lencode] + CAST(CARD32, SHIFT(CAST(SET32, + c.rxbitbuf), VAL(INTEGER, n)-VAL(INTEGER, c.rxbits))); + DEC(c.rxbits, n); + ELSE c.lencode:=LENTAB[c.lencode] END; + END; + +--WrInt(c.lencode,4);WrStr("=LEN "); + + ELSIF c.compmod=2C THEN (* get lengh word *) +-- dist:=c.rxbitbuf>>(c.rxbits-5); (* fixed 5 bit of distance *) + dist:=CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), 5-VAL(INTEGER, + c.rxbits))); +--WrInt(dist,3);WrStr("=DIST5 "); + DEC(c.rxbits, 5); + IF dist>=4 THEN +-- i:=1; +-- c.rxbitbuf:=c.rxbitbuf MOD (i<>(VAL(CARDINAL,c.rxbits)-n); + dist:=DISTAB[dist] + CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), + VAL(INTEGER, n)-VAL(INTEGER, c.rxbits))); + + DEC(c.rxbits, n); + ELSE INC(dist) END; +<* IF DEB THEN *> +WrInt(dist,3);WrStr("=DIST ");WrStrLn(""); +<* END *> + + IF c.lencode<3 THEN outlen:=-2 END; (* decode error *) + n:=c.wp; + i:=(n+BSIZE-dist) MOD BSIZE; (* start in ring *) + WHILE c.lencode>0 DO +--WrStr("<<");WrHex(ORD(c.ring[i]),1);WrStr(">>"); + xsend(c, c.ring[i], dbuf, outlen); (* copy string *) + i:=(i+1) MOD BSIZE; + IF i=n THEN i:=(n+BSIZE-dist) MOD BSIZE END; (* looping string *) + DEC(c.lencode); +--WrInt(c.lencode, 15); + END; +--WrStr("=LOOPEND= "); WrStrLn(""); + c.compmod:=1C; + ELSIF NOT c.justcomp & ODD(CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), + 1-VAL(INTEGER, c.rxbits)))) THEN (* switch to raw *) +<* IF DEB THEN *> +WrStrLn("");WrStrLn("TORAW"); +<* END *> + DEC(c.rxbits); + +-- i:=1; +-- c.rxbitbuf:=c.rxbitbuf MOD (i<>(VAL(CARDINAL,c.rxbits)-n)+1; + c.rawlen:=CAST(CARD32, SHIFT(CAST(SET32, c.rxbitbuf), VAL(INTEGER, + n)-VAL(INTEGER, c.rxbits)))+1; +<* IF DEB THEN *> +WrHex(c.rawlen,9);WrStr("=RLEH "); +<* END *> + DEC(c.rxbits, n); + c.compmod:=0C; + + ELSE (* switch to compressed *) + IF NOT c.justcomp OR (c.compmod<>3C) THEN +<* IF DEB THEN *> +WrStrLn("");WrStrLn("DEC1"); +<* END *> + DEC(c.rxbits); + END; + c.justcomp:=TRUE; +<* IF DEB THEN *> +WrStrLn("");WrStrLn("TOCOMP"); +<* END *> + IF c.compmod=3C THEN (* end of compressed and got to compressed is EOF *) +<* IF DEB THEN *> +WrStrLn("");WrStrLn("DATAEND"); +<* END *> + flush:=FALSE; +<* IF DEB THEN *> +th(c, 0C); +<* END *> + c.rxbits:=((c.rxbits+1) DIV 8)*8; +<* IF DEB THEN *> +th(c, 0C); +<* END *> + done:=TRUE; +WrStrLn(" LIBDONE1 "); + c.compmod:=0C; + ELSE c.compmod:=1C END; + + END; + END; +END Expandbyte; +*/ +static uint32_t deflate_DISTAB[32] = {1UL,2UL,3UL,4UL,5UL,7UL,9UL,13UL, + 17UL,25UL,33UL,49UL,65UL,97UL,129UL,193UL,257UL,385UL,513UL, + 769UL,1025UL,1537UL,2049UL,3073UL,4097UL,6145UL,8193UL, + 12289UL,16385UL,24577UL,0UL,0UL}; + +static uint32_t deflate_LENTAB[32] = {0UL,3UL,4UL,5UL,6UL,7UL,8UL,9UL,10UL, + 11UL,13UL,15UL,17UL,19UL,23UL,27UL,31UL,35UL,43UL,51UL,59UL, + 67UL,83UL,99UL,115UL,131UL,163UL,195UL,227UL,285UL,0UL,0UL}; + + +static void copystr(char dbuf[], uint32_t dbuf_len, int32_t * outlen, + struct deflate_XCONTEXT * c) +{ + uint32_t n; + uint32_t i; + if (c->lencode<3UL) *outlen = -2L; + n = c->wp; + i = (n+32768UL)-c->distcode&32767UL; /* start in ring */ + while (c->lencode>0UL) { + xsend(c, c->ring[i], dbuf, dbuf_len, outlen); /* copy string */ + i = i+1UL&32767UL; + if (i==n) i = (n+32768UL)-c->distcode&32767UL; + --c->lencode; + } +} /* end copystr() */ + +static uint32_t _cnst0[32] = {1UL,2UL,3UL,4UL,5UL,7UL,9UL,13UL,17UL,25UL, + 33UL,49UL,65UL,97UL,129UL,193UL,257UL,385UL,513UL,769UL, + 1025UL,1537UL,2049UL,3073UL,4097UL,6145UL,8193UL,12289UL, + 16385UL,24577UL,0UL,0UL}; +static uint32_t _cnst[32] = {0UL,3UL,4UL,5UL,6UL,7UL,8UL,9UL,10UL,11UL, + 13UL,15UL,17UL,19UL,23UL,27UL,31UL,35UL,43UL,51UL,59UL,67UL, + 83UL,99UL,115UL,131UL,163UL,195UL,227UL,285UL,0UL,0UL}; + +extern void deflate_Expandbyte(struct deflate_XCONTEXT * c, char ch, + char dbuf[], uint32_t dbuf_len, int32_t * outlen, + char * done) +{ + uint32_t w; + uint32_t n; + c->rxbitbuf = c->rxbitbuf*256UL+(uint32_t)(uint8_t)ch; + /* append new bits */ + c->rxbits += 8UL; + *done = 0; + for (;;) { + c->rxbitbuf = (uint32_t)((uint32_t) + c->rxbitbuf&X2C_LSH(0xFFFFFFFFUL,32, + (int32_t)c->rxbits-32L)); /* strip old bits */ + if (c->rawlen==0L) n = 1UL; + else if (c->rawlen==-1L) { + /* get raw len */ + n = 8UL+(c->rxbits&7UL); + } + else if (c->rawlen==-2L) n = 7UL; + else if (c->rawlen==-3L) n = 8UL; + else if (c->rawlen==-4L) n = 9UL; + else if (c->rawlen==-5L) { + /* get extra len bits */ + n = (c->lencode-5UL)/4UL; /* bit count */ + } + else if (c->rawlen==-6L) n = 5UL; + else if (c->rawlen==-7L) { + /* get extra dist code */ + n = c->distcode/2UL-1UL; /* bit count extra bits */ + } + else n = 8UL; + if (c->rxbitsrxbitbuf,32, + (int32_t)n-(int32_t)c->rxbits); + if (c->rawlen>0L) { + /* in uncompressed mode */ + xsend(c, (char)w, dbuf, dbuf_len, outlen); + --c->rawlen; + c->rxbits -= 8UL; + } + else if (c->rawlen==0L) { + /* comp or raw mode bit */ + --c->rxbits; + if (w==1UL) c->rawlen = -1L; + else { + if (c->compdata) { + /* was in compressed go to compressed is EOF */ + *done = 1; + c->compdata = 0; + c->rawlen = 0L; + c->rxbits = 0UL; + break; + } + c->rawlen = -2L; /* start compressed */ + c->compdata = 1; + } + } + else if (c->rawlen==-1L) { + /* get raw len */ + c->rawlen = (int32_t)(w+1UL); + c->rxbits -= n; + c->compdata = 0; + } + else if (c->rawlen==-2L) { + /* get 7 bit len code */ + if (w<24UL) { + c->rxbits -= 7UL; + c->lencode = w; + if (w==0UL) { + /* end comp */ + c->rawlen = 0L; + if (c->compdata) { + /* to comp followed bei endcomp is EOF */ + c->compdata = 0; + *done = 1; + c->rxbits = 0UL; + break; + } + c->compdata = 1; + } + else if (w>=9UL && w<29UL) c->rawlen = -5L; + else { + /* next extra len */ + c->lencode = _cnst[c->lencode]; + c->rawlen = -6L; /* next get 5 bit dist code */ + } + } + else c->rawlen = -3L; + } + else if (c->rawlen==-3L) { + /* get 8 bit len code */ + c->compdata = 0; + if (w<192UL) { + /* literal < 144 */ + xsend(c, (char)(w-48UL), dbuf, dbuf_len, outlen); + c->rxbits -= 8UL; + c->rawlen = -2L; /* continue comp mode */ + } + else if (w<200UL) { + /* len codes 24..29 */ + c->lencode = w-168UL; + c->rxbits -= 8UL; + c->rawlen = -5L; /* next get extra len */ + } + else c->rawlen = -4L; + } + else if (c->rawlen==-4L) { + /* get 9 bit len code */ + c->compdata = 0; + xsend(c, (char)(w-256UL), dbuf, dbuf_len, outlen); + c->rxbits -= 9UL; + c->rawlen = -2L; /* continue comp mode */ + } + else if (c->rawlen==-5L) { + /* get extra len bits */ + c->lencode = _cnst[c->lencode]+w; + c->rxbits -= n; + c->rawlen = -6L; /* next dist code */ + } + else if (c->rawlen==-6L) { + /* get 5 bit dist code */ + c->compdata = 0; + c->rxbits -= 5UL; + if (w>=4UL) { + c->distcode = w; + c->rawlen = -7L; /* next extra dist code */ + } + else { + c->distcode = _cnst0[w]; + c->rawlen = -2L; /* continue comp mode */ + copystr(dbuf, dbuf_len, outlen, c); + } + } + else if (c->rawlen==-7L) { + /* get extra dist code */ + c->rxbits -= c->distcode/2UL-1UL; + c->distcode = _cnst0[c->distcode]+w; + c->rawlen = -2L; /* continue comp mode */ + copystr(dbuf, dbuf_len, outlen, c); + } + } +} /* end Expandbyte() */ + + +extern void deflate_BEGIN(void) +{ + static int deflate_init = 0; + if (deflate_init) return; + deflate_init = 1; + if (sizeof(uint8_t)!=1) X2C_ASSERT(0); + if (sizeof(uint32_t)!=4) X2C_ASSERT(0); + osi_BEGIN(); +} + diff --git a/src/deflate.h b/src/deflate.h new file mode 100644 index 0000000..7f5d58e --- /dev/null +++ b/src/deflate.h @@ -0,0 +1,98 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef deflate_H_ +#define deflate_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif + +#define deflate_BSIZE 32768 + +#define deflate_HASHSIZE 4096 + +#define deflate_CMPSIZE 257 + +#define deflate_CSIZE 2048 + +#define deflate_SWITCHTOCOMP (-32) + +#define deflate_SWITCHTORAW 32 + +#define deflate_MAXRAWBLOCK 16384 + +#define deflate_ENDCOMP 256 + +#define deflate_FLUSHEOF "\002" + +#define deflate_FLUSHQUICK "\001" + +typedef uint8_t deflate_SET8; + +typedef uint32_t deflate_SET32; + +struct deflate_CONTEXT; + + +struct deflate_CONTEXT { + char ring[32768]; + uint32_t fill; + uint16_t hashchain[32768]; + uint32_t fill1; + uint16_t hash[4096]; + uint32_t fill2; + char matchbuf[257]; + uint32_t combuf[2048]; + uint32_t txbitbuf; + uint32_t txbitc; + uint32_t lastidx; + uint32_t wp; + uint32_t savep; + uint32_t flen; + uint32_t fdist; + uint32_t mlen; + uint32_t rawr; + uint32_t comr; + uint32_t raww; + uint32_t rawwo; + uint32_t comw; + int32_t of; + int32_t sizedif; + char wascomp; +}; + +struct deflate_XCONTEXT; + + +struct deflate_XCONTEXT { + char ring[32768]; + uint32_t wp; + uint32_t rxbitbuf; + uint32_t lencode; + uint32_t distcode; + uint32_t rxbits; + int32_t rawlen; + char compdata; +}; + +extern void deflate_Initexpand(struct deflate_XCONTEXT *); + +extern void deflate_Initdeflate(struct deflate_CONTEXT *); + +extern void deflate_Deflatbyte(struct deflate_CONTEXT *, char, char, + char [], uint32_t, int32_t *); + +extern void deflate_Expandbyte(struct deflate_XCONTEXT *, char, + char [], uint32_t, int32_t *, char *); + + +extern void deflate_BEGIN(void); + + +#endif /* deflate_H_ */ diff --git a/src/frameio.c b/src/frameio.c new file mode 100644 index 0000000..ed87fa6 --- /dev/null +++ b/src/frameio.c @@ -0,0 +1,408 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +/* "@(#)frameio.c May 10 23:20:08 2017" */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef frameio_H_ +#include "frameio.h" +#endif +#define frameio_C_ +#ifndef l2_H_ +#include "l2.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif + + + +char frameio_crcok; +struct frameio_UDPSOCK frameio_udpsocks0[15]; +#define frameio_DCDRETRIES 500 + +static uint32_t size; + +static uint32_t from; + +static uint32_t udppos; + +static char axv2; + +static char udpbuf[1601]; + + +struct _0 { + uint32_t lastBaud; /*insert flags if baud change*/ + uint32_t oldi; /*last received frame index from hardware*/ + uint32_t nextfrom; /*read next frame from hardware*/ + uint32_t txakku; /*send next frame to hardware*/ + char twoflags; +}; + +/* +VAR CRCL, CRCH:ARRAY[0..255] OF SET8; + +PROCEDURE CRC(VAR frame:ARRAY OF CHAR; VAR crc:CARD16; size:CARDINAL); +VAR l,h:SET8; + b:CARD8; + i:INTEGER; +BEGIN + l:=CAST(SET8, crc); + h:=CAST(SET8, crc >> 8); + FOR i:=0 TO VAL(INTEGER, size)-1 DO + b:=CAST(CARD8, CAST(SET8, frame[i]) / l); + l:=CRCL[b] / h; + h:=CRCH[b]; + END; + crc:=CAST(CARD16, l) + (CAST(CARD16, h) << 8); +END CRC; + + + +PROCEDURE UDPCRC(frame-:ARRAY OF CHAR; size:INTEGER):CARDINAL; +VAR l,h:SET8; + b:CARD8; + i:INTEGER; +BEGIN + l:=SET8{}; + h:=SET8{}; + FOR i:=0 TO size-1 DO + b:=CAST(CARD8, CAST(SET8, frame[i]) / l); + l:=CRCL[b] / h; + h:=CRCH[b]; + END; + RETURN ORD(CAST(CHAR, l))+256*ORD(CAST(CHAR, h)) +END UDPCRC; +*/ +/* +PROCEDURE opensock(num:CARDINAL; fromport, toport:UDPPORT):BOOLEAN; +BEGIN + WITH udpsocks[num] DO + fd:=openudp(); + IF (CAST(INTEGER,fd)<0) OR (bindudp(fd, + fromport)<0) THEN RETURN FALSE END; + dport:=toport; + END; + RETURN TRUE +END opensock; +*/ + +static void rmnc(void) +{ + uint32_t k; + uint32_t j; + char cmd; + l2_adress[14U] = l2_adress[7U]; + l2_asize = 15U; + k = (uint32_t)(uint8_t)l2_adress[0U]*128UL+(uint32_t)(uint8_t) + l2_adress[1U]/2UL; + cmd = (char)(k&1); + k = k/2UL; + j = 12UL; + do { + l2_adress[j] = (char)((k%10UL+48UL)*2UL); + --j; + k = k/10UL; + } while (j!=6UL); + if (cmd) l2_adress[13U] = '`'; + else l2_adress[13U] = '\340'; + j = (uint32_t)(uint8_t)l2_adress[2U]; + l2_adress[0U] = (char)((j/4UL)*2UL+64UL); + k = (uint32_t)(uint8_t)l2_adress[3U]; + l2_adress[1U] = (char)(((j&3UL)*16UL+k/16UL+32UL)*2UL); + j = (uint32_t)(uint8_t)l2_adress[4U]; + l2_adress[2U] = (char)(((k&15UL)*4UL+j/64UL+32UL)*2UL); + l2_adress[3U] = (char)(((j&63UL)+32UL)*2UL); + j = (uint32_t)(uint8_t)l2_adress[5U]; + l2_adress[4U] = (char)((j/4UL)*2UL+64UL); + k = (uint32_t)(uint8_t)l2_adress[6U]; + l2_adress[5U] = (char)(((j&3UL)*16UL+k/16UL+32UL)*2UL); + l2_adress[6U] = (char)(((k&15UL)+48UL)*2UL+(uint32_t)cmd*128UL); +} /* end rmnc() */ + + +static char GetAField(uint32_t port) +{ + uint32_t a; + uint32_t j; + uint32_t i; + char c; + uint32_t tmp; + if (size>=10UL) { + if (size>=70UL) a = 70UL; + else a = size; + udppos = 0UL; + tmp = a-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + c = udpbuf[udppos]; + ++udppos; + l2_adress[i] = c; + if (((uint32_t)(uint8_t)c&1)) { + /*address end mark*/ + if (i==1UL) { + for (j = 2UL; j<=6UL; j++) { + l2_adress[j] = udpbuf[udppos]; + ++udppos; + } /* end for */ + l2_asize = 7U; + } + else l2_asize = (uint16_t)(i+1UL); + /*WrInt(asize, 4); WrStrLn("=as"); */ + if ((l2_asize>=7U && l2_asize%7U==0U) && (uint32_t) + l2_asize<=size) { + l2_adress[l2_asize] = udpbuf[udppos]; /*command*/ + ++udppos; + ++l2_asize; + size -= (uint32_t)l2_asize; + /*WrInt(size, 4); WrStrLn("=saf"); */ + /*FOR j:=0 TO asize-1 DO WrInt(ORD(adress[j]), 4); END; + WrStrLn("=af"); */ + return 1; + } + return 0; + } + if (i==tmp) break; + } /* end for */ + } + return 0; +} /* end GetAField() */ + + +static char GetDField(void) +{ + int32_t i; + struct l2_DFIELD * anonym; + int32_t tmp; + if (size<=257UL) { + { /* with */ + struct l2_DFIELD * anonym = l2_dbuf; + anonym->len = (uint16_t)size; + /*WrInt(len, 4); WrStrLn("=ilen"); */ + tmp = (int32_t)size-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + anonym->info[i] = udpbuf[udppos]; + ++udppos; + if (i==tmp) break; + } /* end for */ + /* + crc:=0; + CRC(adress,crc,asize); + IF len<>0 THEN CRC(info,crc,len) END; + crcok:=ORD(udpbuf[udppos]) + (ORD(udpbuf[udppos+1]) << 8) + = crc; + */ + frameio_crcok = 1; + if (l2_asize==8U) rmnc(); + return 1; + } + } + return 0; +} /* end GetDField() */ + + +static void getudp(uint32_t usock, char buf[], uint32_t buf_len, + int32_t * len) +{ + uint32_t fromport; + uint32_t ipn; + char crc2; + char crc1; + *len = -1L; + if ((int32_t)frameio_udpsocks0[usock].fd<0L) return; + *len = udpreceive(frameio_udpsocks0[usock].fd, buf, (int32_t)(buf_len), + &fromport, &ipn); + if ((*len>2L && *len<(int32_t)(buf_len)) + && (!frameio_udpsocks0[usock] + .checkip || frameio_udpsocks0[usock].ipnum==ipn)) { + /*WrInt(udpsend(usock^.fd, buf, len, usock^.dport, usock^.ip), 1); + WrStrLn(" us"); */ + *len -= 2L; + crc1 = buf[*len]; + crc2 = buf[*len+1L]; + aprsstr_AppCRC(buf, buf_len, *len); + if (crc1!=buf[*len] || crc2!=buf[*len+1L]) { + osi_WrStrLn(" axudp crc error", 17ul); + *len = -1L; + return; + } + if (buf[0UL]=='\001') { + aprsstr_extrudp2(buf, buf_len, l2_udp2buf, 100ul, len); + if (l2_udp2buf[1U]!='?') { + frameio_udpsocks0[usock].dcd = ((uint8_t)(uint8_t) + l2_udp2buf[1U]&0x2U)!=0U; + frameio_udpsocks0[usock].hastxdata = ((uint8_t)(uint8_t) + l2_udp2buf[1U]&0x4U)!=0U; + } + if (*len==0L) *len = -1L; + axv2 = 1; + } + else { + /*WrStr("<");WrStr(udp2buf); WrStrLn(">"); */ + l2_udp2buf[0U] = 0; + frameio_udpsocks0[usock].dcd = 0; + frameio_udpsocks0[usock].hastxdata = 0; + axv2 = 0; + } + } + else *len = -1L; +} /* end getudp() */ + + +extern char frameio_GetFrame(uint32_t port) +{ + int32_t i; + if (port==0UL) return 0; + getudp(port-1UL, udpbuf, 1601ul, &i); + if (i<0L) return 0; + /*WrInt(i, 5); WrStrLn("=udpin"); */ + size = (uint32_t)i; + from = 0UL; + if (GetAField(port) && GetDField()) return 1; + return 0; +} /* end GetFrame() */ + + +extern void frameio_Modempoll(uint32_t tport) +{ + char b[100]; + int32_t ret; + /*WrStrLn("send ?"); */ + struct frameio_UDPSOCK * anonym; + if (tport==0UL || tport>15UL) return; + b[0U] = '\001'; + b[1U] = '?'; + b[2U] = 0; + aprsstr_AppCRC(b, 100ul, 3L); + { /* with */ + struct frameio_UDPSOCK * anonym = &frameio_udpsocks0[tport-1UL]; + ret = udpsend(anonym->fd, b, 5L, anonym->toport, anonym->ipnum); + } +} /* end Modempoll() */ + + +extern char frameio_DCD(uint32_t port) +{ + struct frameio_UDPSOCK * anonym; + if (port==0UL || port-1UL>14UL) return 0; + { /* with */ + struct frameio_UDPSOCK * anonym = &frameio_udpsocks0[port-1UL]; + if (anonym->dcd) { + if (anonym->dcdretry>500UL) { + frameio_Modempoll(port); + anonym->dcdretry = 0UL; + } + else ++anonym->dcdretry; + } + else anonym->dcdretry = 0UL; + /*IF dcd THEN WrStrLn("dcd") END; */ + return anonym->dcd; + } +} /* end DCD() */ + + +extern char frameio_Sending(uint32_t port) +{ + struct frameio_UDPSOCK * anonym; + if (port==0UL || port-1UL>14UL) return 0; + { /* with */ + struct frameio_UDPSOCK * anonym = &frameio_udpsocks0[port-1UL]; + if (anonym->hastxdata) { + if (anonym->txbufretry>500UL) { + frameio_Modempoll(port); + anonym->txbufretry = 0UL; + } + else ++anonym->txbufretry; + } + else { + /*WrStr("txbufretry:");WrInt(txbufretry, 1);WrStrLn(""); */ + anonym->txbufretry = 0UL; + } + /*IF hastxdata THEN WrStrLn("txing") END; */ + return anonym->hastxdata; + } +} /* end Sending() */ + + +extern void frameio_SendFrame(uint32_t tport, uint32_t Baud, + char Adress[], uint32_t Adress_len, uint32_t AdrLen, + l2_pDATA dp) +{ + uint32_t j; + uint32_t i; + char b[351]; + int32_t ret; + struct frameio_UDPSOCK * anonym; + uint32_t tmp; + if ((tport==0UL || tport>15UL) || AdrLen>=350UL) return; + --tport; + j = 0UL; + tmp = AdrLen-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + b[j] = Adress[i]; + ++j; + if (i==tmp) break; + } /* end for */ + if (dp) { + tmp = (uint32_t)(dp->len-1U); + i = 0UL; + if (i<=tmp) for (;; i++) { + b[j] = dp->info[i]; + ++j; + if (i==tmp) break; + } /* end for */ + } + aprsstr_AppCRC(b, 351ul, (int32_t)j); + { /* with */ + struct frameio_UDPSOCK * anonym = &frameio_udpsocks0[tport]; + ret = udpsend(anonym->fd, b, (int32_t)(j+2UL), anonym->toport, + anonym->ipnum); + anonym->hastxdata = axv2; + } +} /* end SendFrame() */ + + +extern void frameio_Init(void) +{ + axv2 = 0; +/* FILL(ADR(udpsocks), 0C, SIZE(udpsocks)); */ +/* udpsocks[0].ip:=7F000001H; */ +/* IF NOT opensock(0, 5603, 5602) THEN WrStrLn("socket open error"); + HALT END; */ +/* udpsocks[0].ip:=44<<24 + 143<<16 + 40<<8 + 90; */ +/* IF NOT opensock(0, 10094, 10094) THEN WrStrLn("socket open error"); + HALT END; */ +/* udpsocks[0].ip:=192<<24 + 168<<16 + 1<<8 + 30; */ +/* IF NOT opensock(0, 11000, 11001) THEN WrStrLn("socket open error"); + HALT END; */ +/* udpsocks[0].ip:=127<<24 + 0<<16 + 0<<8 + 1; */ +/* IF NOT opensock(0, 2603, 2602) THEN WrStrLn("socket open error"); + HALT END; */ +} /* end Init() */ + + +extern void frameio_BEGIN(void) +{ + static int frameio_init = 0; + if (frameio_init) return; + frameio_init = 1; + l2_BEGIN(); + aprsstr_BEGIN(); + osi_BEGIN(); +} + diff --git a/src/frameio.h b/src/frameio.h new file mode 100644 index 0000000..2daf0d0 --- /dev/null +++ b/src/frameio.h @@ -0,0 +1,57 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef frameio_H_ +#define frameio_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif +#ifndef l2_H_ +#include "l2.h" +#endif + +#define frameio_UDPSOCKS 15 + +struct frameio_UDPSOCK; + + +struct frameio_UDPSOCK { + int32_t fd; + uint32_t ipnum; + uint32_t fromport; + uint32_t toport; + uint32_t dcdretry; + uint32_t txbufretry; + char checkip; + char dcd; + char hastxdata; +}; + +extern char frameio_crcok; + +extern struct frameio_UDPSOCK frameio_udpsocks0[15]; + +extern char frameio_GetFrame(uint32_t); + +extern void frameio_SendFrame(uint32_t, uint32_t, char [], + uint32_t, uint32_t, l2_pDATA); + +extern char frameio_Sending(uint32_t); + +extern char frameio_DCD(uint32_t); + +extern void frameio_Modempoll(uint32_t); + +extern void frameio_Init(void); + + +extern void frameio_BEGIN(void); + + +#endif /* frameio_H_ */ diff --git a/src/geodesy.c b/src/geodesy.c new file mode 100644 index 0000000..9ea39fc --- /dev/null +++ b/src/geodesy.c @@ -0,0 +1,848 @@ +/** +\file geodesy.c +\brief GNSS core 'c' function library: geodesy related functions. +\author Glenn D. MacGougan (GDM) +\date 2007-11-28 +\since 2005-08-14 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#include +#include "gnss_error.h" +#include "geodesy.h" +#include "constants.h" + + +/*************************************************************************************************/ +// static function definitions (for functions used in this file only) +// static functions are functions that are only visable to other functions in the same file. + +// Many functions contained herein only need a, and e2. +static BOOL GEODESY_GetReferenceEllipseParameters_A_E2( + const GEODESY_enumReferenceEllipse ellipse, + double* a, // semi-major axis of the reference ellipse [m] + double* e2 // eccentricity of the reference ellipse (e2 = (a*a-b*b)/(a*a)) [] + ); + +// Many functions contained herein only need a, b and e2. +static BOOL GEODESY_GetReferenceEllipseParameters_A_B_E2( + const GEODESY_enumReferenceEllipse ellipse, + double* a, // semi-major axis of the reference ellipse [m] + double* b, // semi-minor axis of the reference ellipse [m] + double* e2 // eccentricity of the reference ellipse (e2 = (a*a-b*b)/(a*a)) [] + ); + +// return TRUE(1) if valid, FALSE(0) otherwise. +static BOOL GEODESY_IsLatitudeValid( + const double latitude //!< expecting a value -pi/2 to pi/2 [rad] + ); +/*************************************************************************************************/ + + + + +BOOL GEODESY_GetReferenceEllipseParameters( + const GEODESY_enumReferenceEllipse ellipse, //!< reference ellipse enumerated [] + double* a, //!< semi-major axis of the reference ellipse [m] + double* b, //!< semi-minor axis of the reference ellipse (b = a - a*f_inv) [m] + double* f_inv, //!< inverse of the flattening of the reference ellipse [] + double* e2 //!< eccentricity of the reference ellipse (e2 = (a*a-b*b)/(a*a)) [] + ) +{ + switch( ellipse ) + { + case GEODESY_REFERENCE_ELLIPSE_AIRY_1830: + *a = GEODESY_REFERENCE_ELLIPSE_AIRY_1830_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_AIRY_1830_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_AIRY_1830_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_AIRY_1830_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY: + *a = GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL: + *a = GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_BESSEL_1841: + *a = GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_CLARKE_1866: + *a = GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_CLARKE_1880: + *a = GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830: + *a = GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA: + *a = GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE: + *a = GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_GRS_1980: + *a = GEODESY_REFERENCE_ELLIPSE_GRS_1980_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_GRS_1980_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_GRS_1980_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_GRS_1980_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_HELMERT_1906: + *a = GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_HOUGH_1960: + *a = GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924: + *a = GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969: + *a = GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_WGS72: + *a = GEODESY_REFERENCE_ELLIPSE_WGS72_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_WGS72_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_WGS72_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_WGS72_E2; + break; + + case GEODESY_REFERENCE_ELLIPSE_WGS84: + *a = GEODESY_REFERENCE_ELLIPSE_WGS84_A; + *f_inv = GEODESY_REFERENCE_ELLIPSE_WGS84_F_INV; + *b = GEODESY_REFERENCE_ELLIPSE_WGS84_B; + *e2 = GEODESY_REFERENCE_ELLIPSE_WGS84_E2; + break; + + default: + GNSS_ERROR_MSG( "Unexpected default case." ); + return FALSE; + break; + } + return TRUE; +} + + +// static +BOOL GEODESY_GetReferenceEllipseParameters_A_E2( + const GEODESY_enumReferenceEllipse ellipse, + double* a, // semi-major axis of the reference ellipse [m] + double* e2 // eccentricity of the reference ellipse (e2 = (a*a-b*b)/(a*a)) [] + ) +{ + double b; + double f_inv; + BOOL result; + + result = GEODESY_GetReferenceEllipseParameters( + ellipse, + a, + &b, + &f_inv, + e2 ); + + return result; +} + + +// static +BOOL GEODESY_GetReferenceEllipseParameters_A_B_E2( + const GEODESY_enumReferenceEllipse ellipse, + double* a, // semi-major axis of the reference ellipse [m] + double* b, // semi-minor axis of the reference ellipse [m] + double* e2 // eccentricity of the reference ellipse (e2 = (a*a-b*b)/(a*a)) [] + ) +{ + double f_inv; + BOOL result; + + result = GEODESY_GetReferenceEllipseParameters( + ellipse, + a, + b, + &f_inv, + e2 ); + + return result; +} + +// static +BOOL GEODESY_IsLatitudeValid( + const double latitude //!< expecting a value -pi/2 to pi/2 [rad] + ) +{ + // check for valid latitude out of range + if( latitude > HALFPI || latitude < -HALFPI ) + { + GNSS_ERROR_MSG( "if( latitude > HALFPI || latitude < -HALFPI )" ); + return FALSE; + } + else + { + return TRUE; + } +} + + + + + + + +BOOL GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double latitude, //!< geodetic latitude [rad] + const double longitude, //!< geodetic longitude [rad] + const double height, //!< geodetic height [m] + double *x, //!< earth fixed cartesian coordinate [m] + double *y, //!< earth fixed cartesian coordinate [m] + double *z //!< earth fixed cartesian coordinate [m] + ) +{ + double a; // semi-major axis of reference ellipse [m] + double e2; // first eccentricity of reference ellipse [] + double N; // prime vertical radius of curvature [m] + double sinlat; // sin of the latitude + double dtmp; // temp + BOOL result; + + // get necessary reference ellipse parameters + result = GEODESY_GetReferenceEllipseParameters_A_E2( referenceEllipse, &a, &e2 ); + if( result == FALSE ) + { + *x = 0.0; + *y = 0.0; + *z = 0.0; + GNSS_ERROR_MSG( "Reference ellipse invalid." ); + return FALSE; + } + + // check for valid latitude out of range + result = GEODESY_IsLatitudeValid( latitude ); + if( result == FALSE ) + { + *x = 0.0; + *y = 0.0; + *z = 0.0; + GNSS_ERROR_MSG( "Input latitude is invalid." ); + return FALSE; + } + + sinlat = sin( latitude ); + N = a / sqrt( 1.0 - e2 * sinlat*sinlat ); + dtmp = (N + height) * cos(latitude); + + *x = dtmp * cos(longitude); + *y = dtmp * sin(longitude); + *z = ( (1.0 - e2)*N + height ) * sinlat; + + return TRUE; +} + + + + +BOOL GEODESY_ConvertEarthFixedCartesianToGeodeticCurvilinearCoordinates( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double x, // earth fixed cartesian coordinate [m] + const double y, // earth fixed cartesian coordinate [m] + const double z, // earth fixed cartesian coordinate [m] + double *latitude, // geodetic latitude [rad] + double *longitude, // geodetic longitude [rad] + double *height // geodetic height [m] + ) +{ + double a; // semi-major axis of reference ellipse [m] + double b; // semi-minor axis of reference ellipse [m] + double e2; // first eccentricity of reference ellipse [] + double N; // prime vertical radius of curvature [m] + double p; // sqrt( x^2 + y^2 ) [m] + double dtmp; // temp + double sinlat; // sin(lat) + double lat; // temp geodetic latitude [rad] + double lon; // temp geodetic longitude [rad] + double hgt; // temp geodetic height [m] + BOOL result; + + // get necessary reference ellipse parameters + result = GEODESY_GetReferenceEllipseParameters_A_B_E2( referenceEllipse, &a, &b, &e2 ); + if( result == FALSE ) + { + *latitude = 0; + *longitude = 0; + *height = 0; + GNSS_ERROR_MSG( "Reference ellipse invalid." ); + return FALSE; + } + + if( x == 0.0 && y == 0.0 ) + { + // at a pole + // most likely to happen while using a simulator + + // longitude is really unknown + lon = 0.0; + + if( z < 0 ) + { + hgt = -z - b; + lat = -HALFPI; + } + else + { + hgt = z - b; + lat = HALFPI; + } + } + else + { + p = sqrt( x*x + y*y ); + + // unique solution for longitude + // best formula for any longitude and applies well near the poles + // pp. 178 reference [2] + lon = 2.0 * atan2( y , ( x + p ) ); + + // set approximate initial latitude assuming a height of 0.0 + lat = atan( z / (p * (1.0 - e2)) ); + hgt = 0.0; + do + { + dtmp = hgt; + sinlat = sin(lat); + N = a / sqrt( 1.0 - e2*sinlat*sinlat ); + hgt = p / cos(lat) - N; + lat = atan( z / (p * ( 1.0 - e2*N/(N + hgt) )) ); + + } while( fabs( hgt - dtmp ) > 0.0001 ); // 0.1 mm convergence for height + } + + *latitude = lat; + *longitude = lon; + *height = hgt; + return TRUE; +} + + +BOOL GEODESY_ComputeNorthingEastingVertical( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< datum geodetic latitude [rad] + const double referenceLongitude, //!< datum geodetic longitude [rad] + const double referenceHeight, //!< datum geodetic height [m] + const double latitude, //!< geodetic latitude [rad] + const double longitude, //!< geodetic longitude [rad] + const double height, //!< geodetic height [m] + double *northing, //!< local geodetic northing [m] + double *easting, //!< local geodetic easting [m] + double *vertical //!< local geodetic vertical [m] + ) +{ + double x_ref; + double y_ref; + double z_ref; + double x; + double y; + double z; + double dx; + double dy; + double dz; + double A; // rotation angle [rad] + double B; // rotation angle [rad] + double cosA; + double sinA; + double cosB; + double sinB; + BOOL result; + + *northing = 0; + *easting = 0; + *vertical = 0; + + result = GEODESY_IsLatitudeValid( referenceLatitude ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "Input reference latitude is invalid" ); + return FALSE; + } + result = GEODESY_IsLatitudeValid( latitude ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "Input latitude is invalid." ); + return FALSE; + } + + result = GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates( + referenceEllipse, + referenceLatitude, + referenceLongitude, + referenceHeight, + &x_ref, + &y_ref, + &z_ref ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates return FALSE." ); + return FALSE; + } + + result = GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates( + referenceEllipse, + latitude, + longitude, + height, + &x, + &y, + &z ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates return FALSE." ); + return FALSE; + } + + // A and B are rotation angles + A = referenceLatitude - HALFPI; + B = referenceLongitude - PI; + + cosA = cos(A); + sinA = sin(A); + cosB = cos(B); + sinB = sin(B); + + // the cartesian vector between the two points in the geodetic + // frame is rotated to the local geodetic frame + dx = x - x_ref; + dy = y - y_ref; + dz = z - z_ref; + + *northing = cosA*cosB * dx + cosA*sinB * dy - sinA*dz; + *easting = sinB * dx - cosB * dy; + *vertical = sinA*cosB * dx + sinA*sinB * dy + cosA*dz; + return TRUE; +} + + +BOOL GEODESY_ComputePositionDifference( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< reference point geodetic latitude [rad] + const double referenceLongitude, //!< reference point geodetic longitude [rad] + const double referenceHeight, //!< reference point geodetic height [m] + const double latitude, //!< geodetic latitude [rad] + const double longitude, //!< geodetic longitude [rad] + const double height, //!< geodetic height [m] + double *difference_northing, //!< difference in northing [m] (+2 m, means 2 m North of the reference) + double *difference_easting, //!< difference in easting [m] (+2 m, means 2 m East of the reference) + double *difference_vertical //!< difference in vertical [m] (+2 m, means 2 m above of the reference) + ) +{ + BOOL result; + result = GEODESY_ComputeNorthingEastingVertical( + referenceEllipse, + referenceLatitude, + referenceLongitude, + referenceHeight, + latitude, + longitude, + height, + difference_northing, + difference_easting, + difference_vertical ); + return result; +} + + + + +BOOL GEODESY_ComputeMeridianRadiusOfCurvature( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double latitude, //!< geodetic latitude [rad] + double* M //!< computed meridian radius of curvature [m] + ) +{ + double a; // semi-major axis of reference ellipse [m] + double e2; // first eccentricity of reference ellipse [] + double dtmp; + BOOL result; + + // get necessary reference ellipse parameters + result = GEODESY_GetReferenceEllipseParameters_A_E2( referenceEllipse, &a, &e2 ); + if( result == FALSE ) + { + *M = 0; + GNSS_ERROR_MSG( "Reference ellipse invalid." ); + return result; + } + + dtmp = sin(latitude); + dtmp = sqrt( 1.0 - e2 * dtmp * dtmp ); // W + dtmp = dtmp*dtmp*dtmp; // W^3 + + *M = a * ( 1.0 - e2 ) / dtmp; + return TRUE; +} + + + + + +BOOL GEODESY_ComputePrimeVerticalRadiusOfCurvature( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double latitude, //!< geodetic latitude [rad] + double* N //!< computed prime vertical radius of curvature [m] + ) +{ + double a; // semi-major axis of reference ellipse [m] + double e2; // first eccentricity of reference ellipse [] + double W; + BOOL result; + + // get necessary reference ellipse parameters + result = GEODESY_GetReferenceEllipseParameters_A_E2( referenceEllipse, &a, &e2 ); + if( result == FALSE ) + { + *N = 0; + GNSS_ERROR_MSG( "Reference ellipse invalid." ); + return result; + } + + W = sin(latitude); + W = sqrt( 1.0 - e2 * W * W ); + + *N = a / W; + return TRUE; +} + + +BOOL GEODESY_ComputeMeridianArcBetweenTwoLatitudes( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< datum geodetic latitude [rad] + const double latitude, //!< geodetic latitude [rad] + double* arc //!< computed meridian arc, North +ve, South -ve [m] + ) +{ + double a; // semi-major axis of reference ellipse [m] + double e2; // first eccentricity of reference ellipse [] + double e4; + double e6; + double e8; + double dtmp; + double A; + double B; + double C; + double D; + double E; + double arc_ref; // arc from equator for the reference lat [m] + double arc_p; // arc from eqautor for point 'P' [m] + BOOL result; + + *arc = 0; + + result = GEODESY_IsLatitudeValid( referenceLatitude ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "Reference latitude is invalid." ); + return result; + } + + // get necessary reference ellipse parameters + result = GEODESY_GetReferenceEllipseParameters_A_E2( referenceEllipse, &a, &e2 ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "Reference ellipse invalid." ); + return result; + } + + e4 = e2*e2; + e6 = e4*e2; + e8 = e6*e2; + dtmp = a*(1.0-e2); + + A = dtmp * ( 1.0 + 0.75 * e2 + 0.703125 * e4 + 0.68359375 * e6 + 0.67291259765625 * e8 ); // dtmp * (1.0 + 3.0/4.0*e2 + 45.0/64.0*e4 + 175.0/256.0*e6 + 11025.0/16384.0*e8 ); + B = -dtmp * ( 0.375 * e2 + 0.46875 * e4 + 0.5126953125 * e6 + 0.538330078125 * e8 ); // -dtmp * ( 3.0/8.0*e2 + 15.0/32.0*e4 + 525.0/1024.0*e6 + 2205.0/4096.0*e8 ); + C = dtmp * ( 0.05859375 * e4 + 0.1025390625 * e6 + 0.13458251953125 * e8 ); // -dtmp * ( 15.0/256.0*e4 + 105.0/1024.0*e6 + 2205.0/16384.0*e8 ); + D = -dtmp * ( 0.011393229167 * e6 + 0.025634765625 * e8 ); // -dtmp * ( 35.0/3072.0*e6 + 105.0/4096.0*e8 ); + E = dtmp * ( 2.4032593e-03 * e8 ); + + arc_ref = A*referenceLatitude + B*sin(2.0*referenceLatitude) + C*sin(4.0*referenceLatitude) + D*sin(6.0*referenceLatitude) + E*sin(8.0*referenceLatitude); + arc_p = A*latitude + B*sin(2.0*latitude) + C*sin(4.0*latitude) + D*sin(6.0*latitude) + E*sin(8.0*latitude); + + *arc = arc_p - arc_ref; + return TRUE; +} + + + + +BOOL GEODESY_ComputeParallelArcBetweenTwoLongitudes( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< reference geodetic latitude [rad] + const double referenceLongitude, //!< reference geodetic longitude [rad] + const double longitude, //!< geodetic longitude [rad] + double* arc //!< computed parallel arc, East +ve, West -ve [m] + ) +{ + double a; // semi-major axis of reference ellipse [m] + double e2; // first eccentricity of reference ellipse [] + double N; // computed prime vertical radius of curvature [m] + BOOL result; + + *arc = 0; + + // get necessary reference ellipse parameters + result = GEODESY_GetReferenceEllipseParameters_A_E2( referenceEllipse, &a, &e2 ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "Reference ellipse invalid." ); + return result; + } + + result = GEODESY_IsLatitudeValid( referenceLatitude ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "Reference latitude is invalid." ); + return result; + } + + N = sin(referenceLatitude); + N = a / sqrt( 1.0 - e2 * N * N ); + + *arc = N * cos(referenceLatitude) * (longitude - referenceLongitude); + return TRUE; +} + + + + +BOOL GEODESY_RotateVectorFromLocalGeodeticFrameToEarthFixedFrame( + const double referenceLatitude, //!< reference geodetic latitude [rad] + const double referenceLongitude, //!< reference geodetic longitude [rad] + const double dN, //!< local geodetic northing vector component [m] + const double dE, //!< local geodetic easting vector component [m] + const double dUp, //!< local geodetic vertical vector component [m] + double* dX, //!< earth centered earth fixed vector component [m] + double* dY, //!< earth centered earth fixed vector component [m] + double* dZ //!< earth centered earth fixed vector component [m] + ) +{ + double sinlat; + double coslat; + double sinlon; + double coslon; + BOOL result; + + result = GEODESY_IsLatitudeValid( referenceLatitude ); + if( result == FALSE ) + { + *dX = 0; + *dY = 0; + *dZ = 0; + GNSS_ERROR_MSG( "Reference latitude is invalid." ); + return result; + } + + sinlat = sin(referenceLatitude); + coslat = cos(referenceLatitude); + sinlon = sin(referenceLongitude); + coslon = cos(referenceLongitude); + + *dX = -sinlat*coslon * dN - sinlon * dE + coslat*coslon * dUp; + *dY = -sinlat*sinlon * dN + coslon * dE + coslat*sinlon * dUp; + *dZ = coslat * dN + sinlat * dUp; + return TRUE; +} + + + + +BOOL GEODESY_RotateVectorFromEarthFixedFrameToLocalGeodeticFrame( + const double referenceLatitude, //!< reference geodetic latitude [rad] + const double referenceLongitude, //!< reference geodetic longitude [rad] + const double dX, //!< earth centered earth fixed vector component [m] + const double dY, //!< earth centered earth fixed vector component [m] + const double dZ, //!< earth centered earth fixed vector component [m] + double* dN, //!< local geodetic northing vector component [m] + double* dE, //!< local geodetic easting vector component [m] + double* dUp //!< local geodetic vertical vector component [m] + ) +{ + double sinlat; + double coslat; + double sinlon; + double coslon; + BOOL result; + + result = GEODESY_IsLatitudeValid( referenceLatitude ); + if( result == FALSE ) + { + *dN = 0; + *dE = 0; + *dUp = 0; + GNSS_ERROR_MSG( "Reference latitude is invalid." ); + return result; + } + + sinlat = sin(referenceLatitude); + coslat = cos(referenceLatitude); + sinlon = sin(referenceLongitude); + coslon = cos(referenceLongitude); + + *dN = -sinlat*coslon * dX - sinlat*sinlon * dY + coslat * dZ; + *dE = -sinlon * dX + coslon * dY; + *dUp = coslat*coslon * dX + coslat*sinlon * dY + sinlat * dZ; + + return TRUE; +} + + + +BOOL GEODESY_ComputeAzimuthAndElevationAnglesBetweenToPointsInTheEarthFixedFrame( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double fromX, //!< earth centered earth fixed vector from point X component [m] + const double fromY, //!< earth centered earth fixed vector from point Y component [m] + const double fromZ, //!< earth centered earth fixed vector from point Z component [m] + const double toX, //!< earth centered earth fixed vector to point X component [m] + const double toY, //!< earth centered earth fixed vector to point Y component [m] + const double toZ, //!< earth centered earth fixed vector to point Z component [m] + double* elevation, //!< elevation angle [rad] + double* azimuth //!< azimuth angle [rad] + ) +{ + double lat; // reference geodetic latitude ('from' point) [rad] + double lon; // reference geodetic longitude ('from' point) [rad] + double dX; // ECEF X vector component between 'from' and 'to' point (m) + double dY; // ECEF Y vector component between 'from' and 'to' point (m) + double dZ; // ECEF Z vector component between 'from' and 'to' point (m) + double dN; // LG northing vector component between 'from' and 'to' point (m) + double dE; // LG easting vector component between 'from' and 'to' point (m) + double dUp; // LG vertical vector component between 'from' and 'to' point (m) + double tmp; // temp value + BOOL result; + + *elevation = 0; + *azimuth = 0; + + // get the reference geodetic curvilinear coordinates from the 'from' point + result = GEODESY_ConvertEarthFixedCartesianToGeodeticCurvilinearCoordinates( + referenceEllipse, + fromX, + fromY, + fromZ, + &lat, + &lon, + &tmp ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "GEODESY_ConvertEarthFixedCartesianToGeodeticCurvilinearCoordinates returned FALSE." ); + return result; + } + + // vector between the two points in the earth fixed frame + dX = toX - fromX; + dY = toY - fromY; + dZ = toZ - fromZ; + + // rotate the vector to the local geodetic frame + result = GEODESY_RotateVectorFromEarthFixedFrameToLocalGeodeticFrame( + lat, + lon, + dX, + dY, + dZ, + &dN, + &dE, + &dUp ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "GEODESY_RotateVectorFromEarthFixedFrameToLocalGeodeticFrame returned FALSE." ); + return result; + } + + // compute the elevation + tmp = sqrt( dN*dN + dE*dE ); + *elevation = atan( dUp / tmp ); + + // compute the azimuth + *azimuth = atan2(dE, dN); + + // by convention, azimuth will be between 0 to 2 PI + if( *azimuth < 0.0 ) + *azimuth += TWOPI; + + return TRUE; +} + diff --git a/src/geodesy.h b/src/geodesy.h new file mode 100644 index 0000000..ba87a16 --- /dev/null +++ b/src/geodesy.h @@ -0,0 +1,566 @@ +/** +\file geodesy.h +\brief GNSS core 'c' function library: geodesy related functions. +\author Glenn D. MacGougan (GDM) +\date 2007-11-28 +\since 2005-07-30 + +\b REFERENCES \n +- NovAtel OEM3 reference manual (www.novatel.com). \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n +- Hsu, David Y. (1992). Closed Form Solution for Geodetic Coordinate + Transformation. ION NTM 1992. pp. 397-400. \n +- Misra, Pratap & Per Enge (2004). Global Positioning System Signals + Measurements and Performance. Ganga-Jamuna Press. + ISBN 0-9709544-0-9. PP. 115-116. \n + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_GEODESY_H_ +#define _C_GEODESY_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "basictypes.h" + + +/*************************************************************************************************/ +// preprocessor constant definitions, any related enumerations and descriptors + +/** +\enum GEODESY_enumReferenceEllipse +\brief Enumerated for various reference ellipsoids + +Comma delimited data (copy data below to a text file and rename the extension to .csv for easy +viewing in an excel spreadsheet for example. \n +GEODESY_REFERENCE_ELLIPSE_AIRY, 6377563.396, 299.3249647, 6356256.9092444032, 0.00667053999776051,\n +GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY, 6377340.189, 299.3249647, 6356034.4479456525, 0.00667053999776060,\n +GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL, 6378160.0, 298.25, 6356774.7191953063, 0.00669454185458760,\n +GEODESY_REFERENCE_ELLIPSE_BESSEL_1841, 6377397.155, 299.1528128, 6356078.9628181886, 0.00667437223180205,\n +GEODESY_REFERENCE_ELLIPSE_CLARKE_1866, 6378206.4, 294.9786982, 6356583.7999989809, 0.00676865799760959,\n +GEODESY_REFERENCE_ELLIPSE_CLARKE_1880, 6378249.145, 293.465, 6356514.8695497755, 0.00680351128284912,\n +GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830, 6377276.345, 300.8017, 6356075.4131402392, 0.00663784663019987,\n +GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA, 6377298.556, 300.8017, 6356097.5503008962, 0.00663784663019965,\n +GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE, 6377304.063, 300.8017, 6356103.0389931547, 0.00663784663019970,\n +GEODESY_REFERENCE_ELLIPSE_GRS_1980, 6378137.0, 298.257222101, 6356752.3141403561, 0.00669438002290069,\n +GEODESY_REFERENCE_ELLIPSE_HELMERT_1906, 6378200.0, 298.30, 6356818.1696278909, 0.00669342162296610,\n +GEODESY_REFERENCE_ELLIPSE_HOUGH_1960, 6378270.0, 297.00, 6356794.3434343431, 0.00672267002233347,\n +GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924, 6378388.0, 297.00, 6356911.9461279465, 0.00672267002233323,\n +GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969, 6378160.0, 298.25, 6356774.7191953063, 0.00669454185458760,\n +GEODESY_REFERENCE_ELLIPSE_WGS72, 6378135.0, 298.26, 6356750.5200160937, 0.00669431777826668,\n +GEODESY_REFERENCE_ELLIPSE_WGS84, 6378137.0, 298.257223563, 6356752.3142451793, 0.00669437999014132,\n +*/ +typedef enum +{ + GEODESY_REFERENCE_ELLIPSE_WGS84 = 0, //!< WGS84 + GEODESY_REFERENCE_ELLIPSE_AIRY_1830=1, //!< Airy 1830 + GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY=2, //!< Modified Airy + GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL=3, //!< Australian National + GEODESY_REFERENCE_ELLIPSE_BESSEL_1841=4, //!< Bessel 1841 + GEODESY_REFERENCE_ELLIPSE_CLARKE_1866=5, //!< Clarke 1866 + GEODESY_REFERENCE_ELLIPSE_CLARKE_1880=6, //!< Clarke 1880 + GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830=7, //!< Everest(India 1830) + GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA=8, //!< Everest(Brunei & E.Malaysia) + GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE=9, //!< Everest(W.Malaysia & Singapore) + GEODESY_REFERENCE_ELLIPSE_GRS_1980=10, //!< Geodetic Reference System 1980 + GEODESY_REFERENCE_ELLIPSE_HELMERT_1906=11, //!< Helmert 1906 + GEODESY_REFERENCE_ELLIPSE_HOUGH_1960=12, //!< Hough 1960 + GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924=13, //!< International 1924 + GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969=14, //!< South American 1969 + GEODESY_REFERENCE_ELLIPSE_WGS72=15 //!< World Geodetic System 1972 + +} GEODESY_enumReferenceEllipse; + +/** +\var GEODESY_REFERENCE_ELLIPSE_STRING_DESCRIPTION +\brief string array with text description corresponding to GEODESY_enumReferenceEllipse +\see GEODESY_enumReferenceEllipse +*/ +static char *GEODESY_REFERENCE_ELLIPSE_STRING_DESCRIPTION[64] = +{ + "World Geodetic System 1984", + "Airy 1830", + "Modified Airy", + "Australian National", + "Bessel 1841", + "Clarke 1866", + "Clarke 1880", + "Everest(India 1830)", + "Everest(Brunei & E.Malaysia)", + "Everest(W.Malaysia & Singapore)", + "Geodetic Reference System 1980", + "Helmert 1906", + "Hough 1960", + "International 1924", + "South American 1969", + "World Geodetic System 1972", +}; + + +#define GEODESY_REFERENCE_ELLIPSE_WGS84_A (6378137.0) +#define GEODESY_REFERENCE_ELLIPSE_WGS84_F_INV (298.257223563) +#define GEODESY_REFERENCE_ELLIPSE_WGS84_B (6356752.31424518) +#define GEODESY_REFERENCE_ELLIPSE_WGS84_E2 (0.00669437999014132) + +#define GEODESY_REFERENCE_ELLIPSE_AIRY_1830_A (6377563.396) +#define GEODESY_REFERENCE_ELLIPSE_AIRY_1830_F_INV (299.3249647) +#define GEODESY_REFERENCE_ELLIPSE_AIRY_1830_B (6356256.9092444) +#define GEODESY_REFERENCE_ELLIPSE_AIRY_1830_E2 (0.00667053999776051) + +#define GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_A (6377340.189) +#define GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_F_INV (299.3249647) +#define GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_B (356034.44794565) +#define GEODESY_REFERENCE_ELLIPSE_MODIFED_AIRY_E2 (0.0066705399977606) + +#define GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_A (6378160.0) +#define GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_F_INV (298.25) +#define GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_B (6356774.7191953063) +#define GEODESY_REFERENCE_ELLIPSE_AUSTRALIAN_NATIONAL_E2 (0.0066945418545876) + +#define GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_A (6377397.155) +#define GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_F_INV (299.1528128) +#define GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_B (6356078.9628181886) +#define GEODESY_REFERENCE_ELLIPSE_BESSEL_1841_E2 (0.00667437223180205) + +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_A (6378206.4) +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_F_INV (294.9786982) +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_B (6356583.7999989809) +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1866_E2 (0.00676865799760959) + +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_A (6378249.145) +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_F_INV (293.465) +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_B (6356514.8695497755) +#define GEODESY_REFERENCE_ELLIPSE_CLARKE_1880_E2 (0.00680351128284912) + +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_A (6377276.345) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_F_INV (300.8017) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_B (6356075.4131402392) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_INDIA_1830_E2 (0.00663784663019987) + +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_A (6377298.556) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_F_INV (300.8017) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_B (6356097.5503008962) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_BRUNEI_E_MALAYSIA_E2 (0.00663784663019965) + +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_A (6377304.063) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_F_INV (300.8017) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_B (6356103.0389931547) +#define GEODESY_REFERENCE_ELLIPSE_EVEREST_W_MALAYSIA_SINGAPORE_E2 (0.00663784663019970) + +#define GEODESY_REFERENCE_ELLIPSE_GRS_1980_A (6378137.0) +#define GEODESY_REFERENCE_ELLIPSE_GRS_1980_F_INV (298.257222101) +#define GEODESY_REFERENCE_ELLIPSE_GRS_1980_B (6356752.3141403561) +#define GEODESY_REFERENCE_ELLIPSE_GRS_1980_E2 (0.00669438002290069) + +#define GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_A (6378200.0) +#define GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_F_INV (298.30) +#define GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_B (6356818.1696278909) +#define GEODESY_REFERENCE_ELLIPSE_HELMERT_1906_E2 (0.00669342162296610) + +#define GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_A (6378270.0) +#define GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_F_INV (297.00) +#define GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_B (6356794.3434343431) +#define GEODESY_REFERENCE_ELLIPSE_HOUGH_1960_E2 (0.00672267002233347) + +#define GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_A (6378388.0) +#define GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_F_INV (297.00) +#define GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_B (6356911.9461279465) +#define GEODESY_REFERENCE_ELLIPSE_INTERNATIONAL_1924_E2 (0.00672267002233323) + +#define GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_A (6378160.0) +#define GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_F_INV (298.25) +#define GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_B (6356774.7191953063) +#define GEODESY_REFERENCE_ELLIPSE_SOUTH_AMERICAN_1969_E2 (0.00669454185458760) + +#define GEODESY_REFERENCE_ELLIPSE_WGS72_A (6378135.0) +#define GEODESY_REFERENCE_ELLIPSE_WGS72_F_INV (298.26) +#define GEODESY_REFERENCE_ELLIPSE_WGS72_B (6356750.5200160937) +#define GEODESY_REFERENCE_ELLIPSE_WGS72_E2 (0.00669431777826668) + +/*************************************************************************************************/ + + + +/** +\brief This is a look up table function to get reference ellipse parameters. +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b Example \n +\code + double a; //!< semi-major axis of the reference ellipse [m] + double b; //!< semi-minor axis of the reference ellipse (b = a - a*f_inv) [m] + double f_inv; //!< inverse of the flattening of the reference ellipse [] + double e2; //!< eccentricity of the reference ellipse (e2 = (a*a-b*b)/(a*a)) [] + BOOL result; + result = GEODESY_GetReferenceEllipseParameters( GEODESY_REFERENCE_ELLIPSE_WGS84_A, &a, &b, &f_inv, &e2 ); + if( result == TRUE ) + { + printf( "ellipse = %s\n", GEODESY_REFERENCE_ELLIPSE_STRING_DESCRIPTION[GEODESY_REFERENCE_ELLIPSE_WGS84_A] ); + printf( "a = %20.3f\n", a ); + printf( "b = %20.9f\n", b ); + printf( "f_inv = %20.11f\n", f_inv ); + printf( "e2 = %.15f\n\n", e2 ); + } +\endcode + +\b REFERENCES \n +- NovAtel OEM3 reference manual (www.novatel.com). +*/ +BOOL GEODESY_GetReferenceEllipseParameters( + const GEODESY_enumReferenceEllipse ellipse, //!< reference ellipse enumerated [] + double* a, //!< semi-major axis of the reference ellipse [m] + double* b, //!< semi-minor axis of the reference ellipse (b = a - a*f_inv) [m] + double* f_inv, //!< inverse of the flattening of the reference ellipse [] + double* e2 //!< eccentricity of the reference ellipse (e2 = (a*a-b*b)/(a*a)) [] + ); + + + +/** +\brief This function converts curvilinear geodetic coordinates from latitude, longitude, +and ellipsoidal height to cartesian geodetic coordinates x, y, and z for the +reference ellipse specified. +(e.g. GEODESY_REFERENCE_ELLIPSE_WGS84). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b Example \n +\code + double latitude=0; //!< geodetic latitude [rad] + double longitude=0; //!< geodetic longitude [rad] + double height=0; //!< geodetic height [m] + double x; //!< earth fixed cartesian coordinate [m] + double y; //!< earth fixed cartesian coordinate [m] + double z; //!< earth fixed cartesian coordinate [m] + + result = GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates( + GEODESY_REFERENCE_ELLIPSE_WGS84_A, + latitude, + longitude, + height, + &x, + &y, + &z + ); + printf( "ellipse = %s\n", GEODESY_REFERENCE_ELLIPSE_STRING_DESCRIPTION[GEODESY_REFERENCE_ELLIPSE_WGS84_A] ); + printf( "latitude = %.12lf\n", latitude ); + printf( "longitude = %.12lf\n", longitude ); + printf( "height = %.4lf\n", height ); + printf( "x = %.4lf\n", x ); + printf( "y = %.4lf\n", y ); + printf( "z = %.4lf\n\n", z ); +\endcode + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary.\n +*/ +BOOL GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double latitude, //!< geodetic latitude [rad] + const double longitude, //!< geodetic longitude [rad] + const double height, //!< geodetic height [m] + double *x, //!< earth fixed cartesian coordinate [m] + double *y, //!< earth fixed cartesian coordinate [m] + double *z //!< earth fixed cartesian coordinate [m] + ); + +/** +\brief This function converts cartesian geodetic coordinates from x, y, and z to +curvilinear geodetic coordinates latitude, longitude, and ellipsoidal +height for the reference ellipse specified. An iterative approach is used. +(e.g. GEODESY_REFERENCE_ELLIPSE_WGS84). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\remarks +(1) Hsu (1992) shows that the iterative form is slightly faster than the closed form for 3 iterations. \n +(2) Testing by GDM for WGS84, all points lat = -90:1:90 and lon = -180:1:180 were tested + lat, lon, hgt first converted to x, y, z then converted back to lat ,lon, hgt and the number of + iterations noted. No errors observed. 2-5 iterations are needed with a mean of 4.32 iterations. \n + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n + Iterative Method - Chapter 3, pp. 33-66. + Closed Form - Appendix B, pp. 178-183. \n +- Hsu, David Y. (1992). Closed Form Solution for Geodetic Coordinate + Transformation. ION NTM 1992. pp. 397-400. \n +- Misra, Pratap & Per Enge (2004). Global Positioning System Signals + Measurements and Performance. Ganga-Jamuna Press. + ISBN 0-9709544-0-9. PP. 115-116. \n +*/ +BOOL GEODESY_ConvertEarthFixedCartesianToGeodeticCurvilinearCoordinates( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double x, // earth fixed cartesian coordinate [m] + const double y, // earth fixed cartesian coordinate [m] + const double z, // earth fixed cartesian coordinate [m] + double *latitude, // geodetic latitude [rad] + double *longitude, // geodetic longitude [rad] + double *height // geodetic height [m] + ); + + +/** +\brief Given a reference point (datum) for a local geodetic coordinate system +compute northing easting and vertical of another point given its latitude, +longitude, and height for the reference ellipse specified. +(e.g. GEODESY_REFERENCE_ELLIPSE_WGS84). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +[1] Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 4, pp 79. \n +*/ +BOOL GEODESY_ComputeNorthingEastingVertical( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< datum geodetic latitude [rad] + const double referenceLongitude, //!< datum geodetic longitude [rad] + const double referenceHeight, //!< datum geodetic height [m] + const double latitude, //!< geodetic latitude [rad] + const double longitude, //!< geodetic longitude [rad] + const double height, //!< geodetic height [m] + double *northing, //!< local geodetic northing [m] + double *easting, //!< local geodetic easting [m] + double *vertical //!< local geodetic vertical [m] + ); + + + +/** +\brief Compute the difference between two points in a local geodetic frame +using one point as the reference. Can be used to compute position error +with respect to a known reference but keep in mind a local geodetic +frame is used. + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +\see GEODESY_ComputeNorthingEastingVertical +*/ +BOOL GEODESY_ComputePositionDifference( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< reference point geodetic latitude [rad] + const double referenceLongitude, //!< reference point geodetic longitude [rad] + const double referenceHeight, //!< reference point geodetic height [m] + const double latitude, //!< geodetic latitude [rad] + const double longitude, //!< geodetic longitude [rad] + const double height, //!< geodetic height [m] + double *difference_northing, //!< difference in northing [m] (+2 m, means 2 m North of the reference) + double *difference_easting, //!< difference in easting [m] (+2 m, means 2 m East of the reference) + double *difference_vertical //!< difference in vertical [m] (+2 m, means 2 m above of the reference) + ); + + + + +/** +\brief Computes meridian radius of curvature for the reference ellipse specified. +(e.g. GEODESY_REFERENCE_ELLIPSE_WGS84). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n +*/ +BOOL GEODESY_ComputeMeridianRadiusOfCurvature( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double latitude, //!< geodetic latitude [rad] + double* M //!< computed meridian radius of curvature [m] + ); + +/** +\brief Computes the prime vertical radius of curvature for the reference ellipse specified. +(e.g. GEODESY_REFERENCE_ELLIPSE_WGS84). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n +*/ +BOOL GEODESY_ComputePrimeVerticalRadiusOfCurvature( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double latitude, //!< geodetic latitude [rad] + double* N //!< computed prime vertical radius of curvature [m] + ); + + +/** +\brief Compute the meridian arc between two latitudes for the reference ellipse specified. +(e.g. GEODESY_REFERENCE_ELLIPSE_WGS84). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n +*/ +BOOL GEODESY_ComputeMeridianArcBetweenTwoLatitudes( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< datum geodetic latitude [rad] + const double latitude, //!< geodetic latitude [rad] + double* arc //!< computed meridian arc, North +ve, South -ve [m] + ); + + +/** +\brief Compute the parallel arc between two longitudes for the reference ellipse specified. +(e.g. GEODESY_REFERENCE_ELLIPSE_WGS84). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n +*/ +BOOL GEODESY_ComputeParallelArcBetweenTwoLongitudes( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double referenceLatitude, //!< reference geodetic latitude [rad] + const double referenceLongitude, //!< reference geodetic longitude [rad] + const double longitude, //!< geodetic longitude [rad] + double* arc //!< computed parallel arc, East +ve, West -ve [m] + ); + +/** +\brief Rotates a vector from a Local Geodetic Frame (LG) to and Earth Centered Earth Fixed Frame (ECEF). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n +*/ +BOOL GEODESY_RotateVectorFromLocalGeodeticFrameToEarthFixedFrame( + const double referenceLatitude, //!< reference geodetic latitude [rad] + const double referenceLongitude, //!< reference geodetic longitude [rad] + const double dN, //!< local geodetic northing vector component [m] + const double dE, //!< local geodetic easting vector component [m] + const double dUp, //!< local geodetic vertical vector component [m] + double* dX, //!< earth centered earth fixed vector component [m] + double* dY, //!< earth centered earth fixed vector component [m] + double* dZ //!< earth centered earth fixed vector component [m] + ); + +/** +\brief Rotates a vector from a Earth Centered Earth Fixed Frame (ECEF) to a Local Geodetic Frame (LG). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Schwartz, K. P. (1997). ENGO 421 Lecture Notes - Fundamentals of Geodesy. + Chapter 3, pp. 33-66 & Appendix B, pp. 178-183. Geomatics Engineering, + University of Calgary. \n +*/ +BOOL GEODESY_RotateVectorFromEarthFixedFrameToLocalGeodeticFrame( + const double referenceLatitude, //!< reference geodetic latitude [rad] + const double referenceLongitude, //!< reference geodetic longitude [rad] + const double dX, //!< earth centered earth fixed vector component [m] + const double dY, //!< earth centered earth fixed vector component [m] + const double dZ, //!< earth centered earth fixed vector component [m] + double* dN, //!< local geodetic northing vector component [m] + double* dE, //!< local geodetic easting vector component [m] + double* dUp //!< local geodetic vertical vector component [m] + ); + +/** +\brief Computes the azimuth and elevation angles in the local geodetic (LG) frame between the 'from' +point to the 'to' point given these point in the earth fixed frame. +e.g. between a user gps location (from) and a satellite (to). + +\author Glenn D. MacGougan (GDM) +\date 2005-07-30 +\since 2005-07-30 +\return TRUE(1) if successful, FALSE(0) otherwise. + */ +BOOL GEODESY_ComputeAzimuthAndElevationAnglesBetweenToPointsInTheEarthFixedFrame( + const GEODESY_enumReferenceEllipse referenceEllipse, //!< reference ellipse enumerated [] + const double fromX, //!< earth centered earth fixed vector from point X component [m] + const double fromY, //!< earth centered earth fixed vector from point Y component [m] + const double fromZ, //!< earth centered earth fixed vector from point Z component [m] + const double toX, //!< earth centered earth fixed vector to point X component [m] + const double toY, //!< earth centered earth fixed vector to point Y component [m] + const double toZ, //!< earth centered earth fixed vector to point Z component [m] + double* elevation, //!< elevation angle [rad] + double* azimuth //!< azimuth angle [rad] + ); + +#ifdef __cplusplus +} +#endif + + +#endif // _C_GEODESY_H_ diff --git a/src/gnss_error.h b/src/gnss_error.h new file mode 100644 index 0000000..86ceb58 --- /dev/null +++ b/src/gnss_error.h @@ -0,0 +1,72 @@ +/** +\file gnss_error.h +\brief GNSS core 'c' function library: error and warning macros. +\author Glenn D. MacGougan (GDM) +\date 2008-03-19 +\since 2008-03-19 + +\remarks + +\b "LICENSE INFORMATION" \n +Copyright (c) 2008, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_ERROR_H_ +#define _C_ERROR_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** +\brief Output an error message with the following format:\n + file, function, line number, msg\n + +\code +char msg[128]; +char fname[24]; +sprintf( fname, "test.txt" ); +sprintf( msg, "Unable to open %s", fname ); +ERROR_MSG( msg ); +\endcode + +\author Glenn D. MacGougan (GDM) +\date 2008-03-19 +\since 2008-03-19 + +*/ +#define GNSS_ERROR_MSG( msg ) { const char *themsg = msg; if( themsg != NULL ){ printf( "\n%s,\n%s, %d,\n%s\n", __FILE__, __FUNCTION__, __LINE__, themsg ); }else{ printf( "\n%s,\n%s, %d,\nUnknown Error\n", __FILE__, __FUNCTION__, __LINE__ ); } } + +#ifdef __cplusplus +} +#endif + + +#endif // _C_ERROR_H_ diff --git a/src/gnss_types.h b/src/gnss_types.h new file mode 100644 index 0000000..4d9da51 --- /dev/null +++ b/src/gnss_types.h @@ -0,0 +1,434 @@ +/** +\file gnss_types.h +\brief Basic gnss types. + +\author Glenn D. MacGougan (GDM) +\date 2007-12-05 +\since 2006-11-13 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _GNSS_TYPES_H_ +#define _GNSS_TYPES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + + +/// \brief These are the supported receiver data types. +typedef enum GNSS_enumRxDataType +{ + GNSS_RXDATA_NOVATELOEM4 = 0, //!< NovAtel OEM4 data. + GNSS_RXDATA_RINEX21 = 1, //!< RINEX version 2.1 + GNSS_RXDATA_RINEX211 = 2, //!< RINEX version 2.11 + GNSS_RXDATA_UNKNOWN +}; + + +/// A 32 bit bit-field for GNSS measurement associated flags (all are boolean indicators). +typedef struct +{ + unsigned isActive:1; //!< This flag indicates that the channel is active for use. If this is not set, no other flags are valid for use. + unsigned isCodeLocked:1; //!< Indicates if the code tracking is locked. + unsigned isPhaseLocked:1; //!< Indicates if the phase tracking is locked. + unsigned isParityValid:1; //!< Indicates if the phase parity if valid. + unsigned isPsrValid:1; //!< Indicates if the pseudorange valid for use. + unsigned isAdrValid:1; //!< Indicates if the ADR is valid for use. + unsigned isDopplerValid:1; //!< Indicates if the Doppler if valid for use. + unsigned isGrouped:1; //!< Indicates if this channel has another associated channel. eg. L1 and L2 measurements. + unsigned isAutoAssigned:1; //!< Indicates if the channel was receiver assigned (otherwise, the user forced this channel assignment). + unsigned isCarrierSmoothed:1; //!< Indicates if the pseudorange has carrier smoothing enabled. + unsigned isEphemerisValid:1; //!< Indicates if this channel has valid associated ephemeris information. + unsigned isAlmanacValid:1; //!< Indicates if this channel has valid associated almanac information. + unsigned isAboveElevationMask:1; //!< Indicates if the satellite tracked is above the elevation mask. + unsigned isAboveCNoMask:1; //!< Indciates if the channel's C/No is above a threshold value. + unsigned isAboveLockTimeMask:1; //!< Indicates if the channel's locktime is above a treshold value. + unsigned isNotUserRejected:1; //!< Indicates if the user has not forced the rejection of this channel or PRN. + unsigned isNotPsrRejected:1; //!< Indicates if the pseudorange was not rejetced (ie Fault Detection and Exclusion). + unsigned isNotAdrRejected:1; //!< Indicates if the ADR was not rejetced (ie Fault Detection and Exclusion). + unsigned isNotDopplerRejected:1; //!< Indicates if the Doppler was not rejected (ie Fault Detection and Exclusion). + unsigned isNoCycleSlipDetected:1; //!< Indicates that no cycle slip has occurred at this epoch. + unsigned isPsrUsedInSolution:1; //!< Indicates if some part (pseudorange) of this channel's measurement was used in the position solution. + unsigned isDopplerUsedInSolution:1; //!< Indicates if some part (Doppler) of this channel's measurement was used in the velocity solution. + unsigned isAdrUsedInSolution:1; //!< Indicates if the the ADR is used in the solution. + + unsigned isDifferentialPsrAvailable:1; //!< Indicates if a matching pseudrange observation is available from another receiver. + unsigned isDifferentialDopplerAvailable:1; //!< Indicates if a matching Doppler observation is available from another receiver. + unsigned isDifferentialAdrAvailable:1; //!< Indicates if a matching ADR observation is available from another receiver. + + unsigned useTropoCorrection:1; //!< Indicates that the tropospheric correction should be applied. + unsigned useBroadcastIonoCorrection:1; //!< Indicates that the broadcast ionospheric correction should be applied. + + unsigned isBaseSatellite:1; //!< Indicates if this channel corresponds to a base satellite used in double differencing. + + unsigned isNotPsrDeweighted:1; + unsigned isNotDopplerDeweighted:1; + unsigned isNotAdrDeweighted:1; + +} GNSS_structFlagsBitField; + +/// \brief An enumerated for a GNSS code modulation type. +/// +/// This enumerated uses the NovAtel OEM4 convention. +typedef enum +{ + GNSS_CACode = 0, + GNSS_PCode = 1, + GNSS_PCodeless = 2, + GNSS_UWBCodeType = 1614, + GNSS_ReservedCodeType +} GNSS_enumCodeType; + +/// \brief An enumeration for a GNSS frequency type. +/// +/// This enumerated uses the NovAtel OEM4 convention. +typedef enum +{ + GNSS_GPSL1 = 0, + GNSS_GPSL2 = 1, + GNSS_UWBFrequency = 1615, + GNSS_ReservedFrequency +} GNSS_enumFrequency; + +/// \brief An enumeration for a GNSS system type. +/// +/// This enumerated uses the NovAtel OEM4 convention. +typedef enum +{ + GNSS_GPS = 0, + GNSS_GLONASS = 1, + GNSS_WAAS = 2, + GNSS_Pseudolite = 3, + GNSS_UWBSystem = 1616, + GNSS_ReservedSystem +} GNSS_enumSystem; + + +/// \brief An enumeration for a GNSS measurement type. +typedef enum +{ + GNSS_INVALID_MEASUREMENT = 0, + GNSS_PSR_MEASUREMENT = 1, + GNSS_DOPPLER_MEASUREMENT = 2, + GNSS_ADR_MEASUREMENT = 3, + GNSS_LAT_CONSTRAINT = 4, + GNSS_LON_CONSTRAINT = 5, + GNSS_HGT_CONSTRAINT = 6, + GNSS_VN_CONSTRAINT = 7, + GNSS_VE_CONSTRAINT = 8, + GNSS_VUP_CONSTRAINT = 9, + GNSS_RESERVED_MEASUREMENT_TYPE +} GNSS_enumMeasurementType; + + + +/// \brief Correction data associated with a single receiver measurement channel. +/// PRC is PseudRange Correction, RRC is RangeRate Correction. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + float prcTropoDry; //!< Tropospheric dry delay correction (+ve is a delay) [m]. + float prcTropoWet; //!< Tropospheric wet delay correction (+ve is a delay) [m]. + float prcIono; //!< Ionospheric correction (+ve is a delay) [m]. + float prcSatClk; //!< The satellite clock correction (+ve is a delay) [m]. + float prcReserved1; //!< A reserved range correction for the pseudorange [m]. + float prcReserved2; //!< A reserved range correction for the pseudorange [m]. + float rrcSatClkDrift; //!< The satellite clock drift rate correction (+ve is a rate delay) [m/s]. + float rrcReserved1; //!< A reserved range rate correction [m/s]. + float rrcReserved2; //!< A reserved range rate correction [m/s]. + float dX; //!< This channel's associated satellite orbital correction X (ECEF) [m]. + float dY; //!< This channel's associated satellite orbital correction X (ECEF) [m]. + float dZ; //!< This channel's associated satellite orbital correction X (ECEF) [m]. +} GNSS_structCorrections; + +/// \brief Residuals data associated with a single receiver measurement channel. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + float psrResidual; //!< The pseudorange residual [m]. + float adrResidual; //!< The accumulated Doppler range residual [cycles]. + float dopplerResidual; //!< The Doppler residual [Hz]. + float reserved; //!< Reserved value. +} GNSS_structResiduals; + +/// \brief A struct for satelite data. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + int isValid; //!< This indicates if the pvt information is valid [1=valid, 0=invalid]. + int ageOfEph; //!< The difference between the current measurement time and the time of ephemeris. + double x; //!< The satellite position ECEF, x [m]. + double y; //!< The satellite position ECEF, y [m]. + double z; //!< The satellite position ECEF, z [m]. + double vx; //!< The satellite velocity ECEF, vx [m]. + double vy; //!< The satellite velocity ECEF, vy [m]. + double vz; //!< The satellite velocity ECEF, vz [m]. + double clk; //!< The satellite clock correction [m]. + double clkdrift; //!< The satellite clock drift correction [m/s]. + double elevation; //!< The elevation angle between the user and the satellite [rad]. + double azimuth; //!< The azimuth angle between the user and the satellite, measured clockwise positive from the true North [rad]. + double doppler; //!< The satellite doppler with respect to the user position [m/s], Note: User must convert to Hz. +} GNSS_structSatellitePVT; + + +/// \brief A container for klobuchar sytle ionospheric parameters. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + unsigned short isValid; //!< Is this structure valid for use 1=YES, 0=NO. + unsigned short week; //!< The GPS week corresponding to the correction parameters [weeks]. + unsigned tow; //!< The GPS time of week corresponding to the correction parameters [s]. + double alpha0; //!< coefficients of a cubic equation representing the amplitude of the vertical delay [s] + double alpha1; //!< coefficients of a cubic equation representing the amplitude of the vertical delay [s/semi-circle] + double alpha2; //!< coefficients of a cubic equation representing the amplitude of the vertical delay [s/semi-circle^2] + double alpha3; //!< coefficients of a cubic equation representing the amplitude of the vertical delay [s/semi-circle^3] + double beta0; //!< coefficients of a cubic equation representing the period of the model [s] + double beta1; //!< coefficients of a cubic equation representing the period of the model [s/semi-circle] + double beta2; //!< coefficients of a cubic equation representing the period of the model [s/semi-circle^2] + double beta3; //!< coefficients of a cubic equation representing the period of the model [s/semi-circle^3] +} GNSS_structKlobuchar; + +/// \brief Measurement data associated with a single receiver measurement channel. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + unsigned short channel; //!< The channel number associated with this measurement. + unsigned short id; //!< The unique id for this channel (eg PRN for GPS). + GNSS_enumSystem system; //!< The satellite system associated with this channel. + GNSS_enumCodeType codeType; //!< The code type for this channel. + GNSS_enumFrequency freqType; //!< The frequency type for this channel. + GNSS_structFlagsBitField flags; //!< The flags associated with this channel. ie Validity flags, etc. + short reserved1; + unsigned short week; //!< The measurement gps week (at 'transmit' time) [weeks]. + double tow; //!< The measurement gps time of week (at 'transmit' time) [s]. + + // The actual measurements. + double psr; //!< The pseudorange measurement [m]. + double adr; //!< The carrier phase or accumulated Doppler range measurement [cycles]. + float doppler; //!< The Doppler measurement for this channel [Hz]. + float cno; //!< The carrier to noise density ratio for this channel [dB-Hz] + float locktime; //!< The number of seconds of continous phase tracking (no known cycle slips) [s]. + + // The variance information associated with the actual measurements. + float stdev_psr; //!< The estimated pseudorange measurement standard deviation [m]. + float stdev_adr; //!< The estimated accumulated Doppler range measurement standard deviation [cycles]. + float stdev_doppler; //!< The estimated Doppler measurement standard deviation [Hz]. + + // Derived information. + double psr_misclosure; //!< The measured psr minus the computed psr estimate [m]. + double doppler_misclosure; //!< The measured Doppler minus the computed Doppler estimate [m/s]. + double range; //!< The best estimate of the geometric range between the antenna and the satellite [m]. + double rangerate; //!< The best estimate of the geometric range rate between the antenna and the satellite [m/s]. + double psr_smoothed; //!< The carrier smoothed pseudorange if available [m]. + double psr_predicted; //!< The predicted pseudorange based on the satellite position, user position, and current clock offset [m]. + double sd_ambiguity; //!< The estimated single difference float ambiguity [m]. + double dd_ambiguity; //!< The estimated double difference float ambiguity [m]. + double dd_ambiguity_fixed; //!< The estimated double difference fixed ambiguity [m]. + float doppler_predicted; //!< The predicted Doppler based on user position, velocity, satellite position, velocity and clock rate [Hz]. + + double psr_misclosure_lsq; //!< The measured psr minus the computed psr estimate using least squares [m]. + double doppler_misclosure_lsq; //!< The measured Doppler minus the computed Doppler estimate using least squares [m/s]. + + short index_differential; //!< The channel index of a matching differential observation. -1 means there is no matching channel. + short index_time_differential; //!< The channel index of a matching time differential observation. -1 means there is no matching channel. + + short index_between_satellite_differential; //!< The channel index for between satellite difference of the satellite that is substracted from this one. -1 means there is no matching channel. + short index_ambiguity_state; //!< The index into the state vector for the float ambiguity state. -1 not estimated. + short index_ambiguity_state_dd; //!< The index into the state vector for the double difference ambiguity state. -1 not estimated. + short index_psr_B; //!< A very convenient index into the B matrix used in double differencing. -1 if not valid. + short index_Doppler_B; //!< A very convenient index into the B matrix used in double differencing. -1 if not valid. + short index_adr_B; //!< A very convenient index into the B matrix used in double differencing. -1 if not valid. + + double adr_misclosure; //!< The measured ADR minus the computed ADR estimate [m]. This is the between receiver differential adr misclosure. + + double adr_residual_sd; //!< The measured single difference ADR minus the computed single difference ADR estimate after full sequential update. + double adr_residual_dd; //!< The measured double difference ADR minus the computed double difference ADR estimate after full sequential update (float solution). + double adr_residual_dd_fixed; //!< The measured double difference ADR minus the computed double difference ADR estimate after full sequential update and ambiguity fixing. + double adr_misclosure_temp; //!< A temporary variable used to compute adr_misclosure_dd above/ + + double sd_doppler_covar; //!< Single difference doppler covariance. + double sd_doppler_innovation; //!< Single difference doppler innovation. + double sd_doppler_innovation_standardized; //!< A standardized single difference doppler innovation. + + double sd_psr_covar; //!< Single difference psr covariance. + double sd_psr_innovation; //!< Single difference psr innovation. + double sd_psr_innovation_standardized; //!< A standardized single difference psr innovation. + + double sd_adr_covar; //!< Single difference adr covariance. + double sd_adr_innovation; //!< Single difference adr innovation. + double sd_adr_innovation_standardized; //!< A standardized single difference adr innovation. + + double uwb_bias; + double uwb_scale_factor; + + double H_p[3]; //!< The design matrix row relating the pseudorange measurements to the position solution. dP/d(lat), dP/d(lon), dP/d(hgt). + double H_a[3]; //!< The design matrix row relating the adr measurements to the position solution. dP/d(lat), dP/d(lon), dP/d(hgt). + double H_v[3]; //!< The design matrix row relating the Doppler measurements to the velocity solution. dD/d(lat), dD/d(lon), dD/d(hgt). + + GNSS_structCorrections corrections; //!< The corrections associated with this channel. + GNSS_structResiduals residuals; //!< The post-adjustment (filtering) measurement residual associated with this channel. + + GNSS_structSatellitePVT satellite; //!< Each channel has an associated satellite pvt struct evaluated at the transmit time. +} GNSS_structMeasurement; + + + + +/// \brief A struct for holding dilution of precision information. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + float gdop; //!< geometric dilution of precision []. + float pdop; //!< position dilution of precision []. + float ndop; //!< northing dilution of precision []. + float edop; //!< easting dilution of precision []. + float hdop; //!< horizontal dilution of precision []. + float vdop; //!< vertical dilution of precision []. + float tdop; //!< time dilution of precision []. + float reserved; //!< reserved dilution of precision []. +} GNSS_structDOP; + +/// \brief A container for time information. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + unsigned short day_of_year; //!< The number of days into the year (1-366) [days]. + unsigned short utc_year; //!< Universal Time Coordinated [year] + unsigned char utc_month; //!< Universal Time Coordinated [1-12 months] + unsigned char utc_day; //!< Universal Time Coordinated [1-31 days] + unsigned char utc_hour; //!< Universal Time Coordinated [hours] + unsigned char utc_minute; //!< Universal Time Coordinated [minutes] + float utc_seconds; //!< Universal Time Coordinated [s] + unsigned int gps_week; //!< The current GPS week associated with the observations [weeks]. + double gps_tow; //!< The GPS time of week (0-604800.0) (receiver time of observation) [s]. +} GNSS_structReceiverTime; + + + +/// \brief A struct for degrees, minutes, seconds, and a string. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + short degrees; //!< The degrees component [deg]. + short minutes; //!< The minutes component [min]. + float seconds; //!< The seconds component [s] + char dms_str[24]; //!< A DMS string e.g. dms_str = "-180'59'59.9999\"" +} GNSS_structDMS; + + +/// \brief A struct for holding position, velocity and time. +/// +/// This struct is 4 and 8 byte struct member packing compatible. +typedef struct +{ + GNSS_structReceiverTime time; // The receiver time information. + + double pos_apvf; //!< The a-posteriori variance factor for the position solution. + + double latitude; //!< The user latitude [rad]. + double longitude; //!< The user longitude [rad]. + double height; //!< The user orthometric height [m]. + double undulation; //!< The undulation [m]. + + double latitudeDegs; //!< The user latitude [degrees]. + double longitudeDegs; //!< The user longitude [degrees]. + GNSS_structDMS lat_dms; //!< The user latitude [dms]. + GNSS_structDMS lon_dms; //!< The user longitude [dms]. + + double x; //!< The user's ECEF position, X [m]. + double y; //!< The user's ECEF position, Y [m]. + double z; //!< The user's ECEF position, Z [m]. + + double vel_apvf; //!< The a-posteriori variance factor for the velocity solution. + + double vn; //!< The user's local geodetic velocity, velocity North [m/s]. + double ve; //!< The user's local geodetic velocity, velocity East [m/s]. + double vup; //!< The user's local geodetic velocity, velocity Up [m/s]. + + double vx; //!< The user's ECEF velocity, vx [m/s]. + double vy; //!< The user's ECEF velocity, vy [m/s]. + double vz; //!< The user's ECEF velocity, vz [m/s]. + + double clockOffset; //!< The receiver clock offset [m]. + double clockDrift; //!< the receiver clock drift [m/s]. + + GNSS_structDOP dop; //!< All the associated DOP information for this solution. + + double std_lat; //!< The standard deviation uncertainty in the latitude [m]. + double std_lon; //!< The standard deviation uncertainty in the longitude [m]. + double std_hgt; //!< The standard deviation uncertainty in the height [m]. + double std_vn; //!< The standard deviation uncertainty in the northing velocity [m/s]. + double std_ve; //!< The standard deviation uncertainty in the easting velocity [m/s]. + double std_vup; //!< The standard deviation uncertainty in the up velocity [m/s]. + double std_clk; //!< The standard deviation uncertainty in the clock offset [m]. + double std_clkdrift; //!< The standard deviation uncertainty in the clock drift [m/s]. + + unsigned char didGlobalTestPassForPosition; //!< Does the position solution pass the Chi^2 goodness of fit test [TRUE(1),FALSE(0)]. + unsigned char didGlobalTestPassForVelocity; //!< Does the velocity solution pass the Chi^2 goodness of fit test [TRUE(1),FALSE(0)]. + + unsigned char isPositionFixed; //!< Is this a position solution fully constrained to a fixed point [TRUE(1),FALSE(0)]. + unsigned char isHeightConstrained; //!< Is this a height constrained solution [TRUE(1),FALSE(0)]. + unsigned char isClockConstrained; //!< Is this a clock constrained solution [TRUE(1),FALSE(0)]. + unsigned char isSolutionBasedOnEphemeris; //!< Is the solution based on valid ephemeris information [TRUE(1),FALSE(0)]. + + unsigned char nrPsrObsAvailable; //!< This indicates the number of valid pseudorange observations valid before adjustment. + unsigned char nrPsrObsUsed; //!< This indicates the number of valid pseudorange observations valid after adjustment. + unsigned char nrPsrObsRejected; //!< This indicates the number of valid pseudorange observations rejected during adjustment. + + unsigned char nrAdrObsAvailable; //!< This indicates the number of valid ADR observations valid before adjustment. + unsigned char nrAdrObsUsed; //!< This indicates the number of valid ADR observations valid after adjustment. + unsigned char nrAdrObsRejected; //!< This indicates the number of valid ADR observations rejected during adjustment. + + unsigned char nrDopplerObsAvailable; //!< This indicates the number of valid Doppler observations valid before adjustment. + unsigned char nrDopplerObsUsed; //!< This indicates the number of valid Doppler observations valid after adjustment. + unsigned char nrDopplerObsRejected; //!< This indicates the number of valid Doppler observations rejected during adjustment. + + unsigned char reserved[1]; //!< Space for reserved flags. + +} GNSS_structPVT; + +#ifdef __cplusplus +} +#endif + + +#endif // _GNSS_TYPES_H_ + + diff --git a/src/gps.c b/src/gps.c new file mode 100644 index 0000000..b413694 --- /dev/null +++ b/src/gps.c @@ -0,0 +1,1138 @@ +/** +\file gps.c +\brief GNSS core 'c' function library: GPS specific functions. +\author Glenn D. MacGougan (GDM) +\date 2005-08-14 +\since 2005-07-31 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + + +#include +#include "gnss_error.h" +#include "gps.h" +#include "constants.h" +#include "geodesy.h" + + +/*************************************************************************************************/ +// local preprocessor constant definitions, any related enumerations and descriptors + +#ifndef GPS_CLOCK_CORRECTION_RELATIVISTIC_CONSTANT_F +#define GPS_CLOCK_CORRECTION_RELATIVISTIC_CONSTANT_F (-4.442807633e-10) //!< combined constant defined in ICD-GPS-200C p. 88 [s]/[sqrt(m)] +#endif +#ifndef GPS_UNIVERSAL_GRAVITY_CONSTANT +#define GPS_UNIVERSAL_GRAVITY_CONSTANT (3.986005e14) //!< gravity constant defined on ICD-GPS-200C p. 98 [m^3/s^2] +#endif +#ifndef GPS_RATIO_OF_SQUARED_FREQUENCIES_L1_OVER_L2 +#define GPS_RATIO_OF_SQUARED_FREQUENCIES_L1_OVER_L2 (1.6469444444444444444444444444444) //!< (f_L1/f_L2)^2 = (1575.42/1227.6)^2 = (77/60)^2 +#endif +#ifndef GPS_WGS84_EARTH_ROTATION_RATE +#define GPS_WGS84_EARTH_ROTATION_RATE (7.2921151467e-05) //!< constant defined on ICD-GPS-200C p. 98 [rad/s] +#endif + +#define TWO_TO_THE_POWER_OF_55 (36028797018963968.0) +#define TWO_TO_THE_POWER_OF_43 (8796093022208.0) +#define TWO_TO_THE_POWER_OF_33 (8589934592.0) +#define TWO_TO_THE_POWER_OF_31 (2147483648.0) +#define TWO_TO_THE_POWER_OF_29 (536870912.0) +#define TWO_TO_THE_POWER_OF_19 (524288.0) + +// +/*************************************************************************************************/ + + + +void GPS_ComputeSatelliteClockCorrectionAndDrift( + const unsigned short transmission_gpsweek, //!< GPS week when signal was transmit (0-1024+) [weeks] + const double transmission_gpstow, //!< GPS time of week when signal was transmit [s] + const unsigned short ephem_week, //!< ephemeris: GPS week (0-1024+) [weeks] + const unsigned toe, //!< ephemeris: time of week [s] + const unsigned toc, //!< ephemeris: clock reference time of week [s] + const double af0, //!< ephemeris: polynomial clock correction coefficient [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + const double af1, //!< ephemeris: polynomial clock correction coefficient [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + const double af2, //!< ephemeris: polynomial clock correction coefficient [s/s^2] + const double ecc, //!< ephemeris: eccentricity of satellite orbit [] + const double sqrta, //!< ephemeris: square root of the semi-major axis of orbit [m^(1/2)] + const double delta_n, //!< ephemeris: mean motion difference from computed value [rad] + const double m0, //!< ephemeris: mean anomaly at reference time [rad] + const double tgd, //!< ephemeris: group delay differential between L1 and L2 [s] + const unsigned char mode, //!< 0=L1 only, 1=L2 only (see p. 90, ICD-GPS-200C) + double* clock_correction, //!< satellite clock correction [m] + double* clock_drift //!< satellite clock drift correction [m/s] + ) +{ + unsigned char i; // counter + + double tot; // time of transmission (including gps week) [s] + double tk; // time from ephemeris reference epoch [s] + double tc; // time from clock reference epoch [s] + double d_tr; // relativistic correction term [s] + double d_tsv; // SV PRN code phase time offset [s] + double a; // semi-major axis of orbit [m] + double n; // corrected mean motion [rad/s] + double M; // mean anomaly, [rad] (Kepler's equation for eccentric anomaly, solved by iteration) + double E; // eccentric anomaly [rad] + + // compute the times from the reference epochs + // By including the week in the calculation, week rollover and old ephmeris bugs are mitigated + // The result should be between -302400 and 302400 if the ephemeris is within one week of transmission + tot = transmission_gpsweek*SECONDS_IN_WEEK + transmission_gpstow; + tk = tot - (ephem_week*SECONDS_IN_WEEK + toe); + tc = tot - (ephem_week*SECONDS_IN_WEEK + toc); + + // compute the corrected mean motion term + a = sqrta*sqrta; + n = sqrt( GPS_UNIVERSAL_GRAVITY_CONSTANT / (a*a*a) ); // computed mean motion + n += delta_n; // corrected mean motion + + // Kepler's equation for eccentric anomaly + M = m0 + n*tk; // mean anomaly + E = M; + for( i = 0; i < 7; i++ ) + { + E = M + ecc * sin(E); + } + + // relativistic correction + d_tr = GPS_CLOCK_CORRECTION_RELATIVISTIC_CONSTANT_F * ecc * sqrta * sin(E); // [s] + d_tr *= LIGHTSPEED; + + // clock correcton + d_tsv = af0 + af1*tc + af2*tc*tc; // [s] + + if( mode == 0 ) + { + // L1 only + d_tsv -= tgd; // [s] + } + else if( mode == 1 ) + { + // L2 only + d_tsv -= tgd*GPS_RATIO_OF_SQUARED_FREQUENCIES_L1_OVER_L2; // [s] + } + + // clock correction + *clock_correction = d_tsv*LIGHTSPEED + d_tr; // [m] + + // clock drift + *clock_drift = (af1 + 2.0*af2*tc) * LIGHTSPEED; // [m/s] +} + + + + +void GPS_ComputeSatellitePositionAndVelocity( + const unsigned short transmission_gpsweek, //!< GPS week when signal was transmit (0-1024+) [weeks] + const double transmission_gpstow, //!< GPS time of week when signal was transmit [s] + const unsigned short ephem_week, //!< ephemeris: GPS week (0-1024+) [weeks] + const unsigned toe, //!< ephemeris: time of week [s] + const double m0, //!< ephemeris: mean anomaly at reference time [rad] + const double delta_n, //!< ephemeris: mean motion difference from computed value [rad] + const double ecc, //!< ephemeris: eccentricity [] + const double sqrta, //!< ephemeris: square root of the semi-major axis [m^(1/2)] + const double omega0, //!< ephemeris: longitude of ascending node of orbit plane at weekly epoch [rad] + const double i0, //!< ephemeris: inclination angle at reference time [rad] + const double w, //!< ephemeris: argument of perigee [rad] + const double omegadot, //!< ephemeris: rate of right ascension [rad/s] + const double idot, //!< ephemeris: rate of inclination angle [rad/s] + const double cuc, //!< ephemeris: amplitude of the cosine harmonic correction term to the argument of latitude [rad] + const double cus, //!< ephemeris: amplitude of the sine harmonic correction term to the argument of latitude [rad] + const double crc, //!< ephemeris: amplitude of the cosine harmonic correction term to the orbit radius [m] + const double crs, //!< ephemeris: amplitude of the sine harmonic correction term to the orbit radius [m] + const double cic, //!< ephemeris: amplitude of the cosine harmonic correction term to the angle of inclination [rad] + const double cis, //!< ephemeris: amplitude of the sine harmonic correction term to the angle of inclination [rad] + const double estimateOfTrueRange, //!< best estimate of the signal propagation time (in m) for Sagnac effect compensation [m] + const double estimteOfRangeRate, //!< best estimate of the true signal Doppler (in m/s) for Sagnac effect compensation [m/s] + double* x, //!< satellite x [m] + double* y, //!< satellite y [m] + double* z, //!< satellite z [m] + double* vx, //!< satellite velocity x [m/s] + double* vy, //!< satellite velocity y [m/s] + double* vz //!< satellite velocity z [m/s] + ) +{ + unsigned char j; // counter + + double tot; // time of transmission (including gps week) [s] + double tk; // time from ephemeris reference epoch [s] + double a; // semi-major axis of orbit [m] + double n; // corrected mean motion [rad/s] + double M; // mean anomaly, [rad] (Kepler's equation for eccentric anomaly, solved by iteration) + double E; // eccentric anomaly [rad] + double v; // true anomaly [rad] + double u; // argument of latitude, corrected [rad] + double r; // radius in the orbital plane [m] + double i; // orbital inclination [rad] + double cos2u; // cos(2*u) [] + double sin2u; // sin(2*u) [] + double d_u; // argument of latitude correction [rad] + double d_r; // radius correction [m] + double d_i; // inclination correction [rad] + double x_op; // x position in the orbital plane [m] + double y_op; // y position in the orbital plane [m] + double omegak; // corrected longitude of the ascending node [rad] + double cos_omegak; // cos(omegak) + double sin_omegak; // sin(omegak) + double cosu; // cos(u) + double sinu; // sin(u) + double cosi; // cos(i) + double sini; // sin(i) + double cosE; // cos(E) + double sinE; // sin(E) + double omegadotk; // corrected rate of right ascension [rad/s] + double edot; // edot = n/(1.0 - ecc*cos(E)), [rad/s] + double vdot; // d/dt of true anomaly [rad/s] + double udot; // d/dt of argument of latitude [rad/s] + double idotdot; // d/dt of the rate of the inclination angle [rad/s^2] + double rdot; // d/dt of the radius in the orbital plane [m/s] + double tmpa; // temp + double tmpb; // temp + double vx_op; // x velocity in the orbital plane [m/s] + double vy_op; // y velocity in the orbital plane [m/s] + + + // compute the times from the reference epochs + // By including the week in the calculation, week rollover and older ephemeris bugs are mitigated + // The result should be between -302400 and 302400 if the ephemeris is within one week of transmission + tot = transmission_gpsweek*SECONDS_IN_WEEK + transmission_gpstow; + tk = tot - (ephem_week*SECONDS_IN_WEEK + toe); + + // compute the corrected mean motion term + a = sqrta*sqrta; + n = sqrt( GPS_UNIVERSAL_GRAVITY_CONSTANT / (a*a*a) ); // computed mean motion + n += delta_n; // corrected mean motion + + // Kepler's equation for eccentric anomaly + M = m0 + n*tk; // mean anomaly + E = M; + for( j = 0; j < 7; j++ ) + { + E = M + ecc * sin(E); + } + + cosE = cos(E); + sinE = sin(E); + + // true anomaly + v = atan2( (sqrt(1.0 - ecc*ecc)*sinE), (cosE - ecc) ); + + // argument of latitude + u = v + w; + // radius in orbital plane + r = a * (1.0 - ecc * cos(E)); + // orbital inclination + i = i0; + + // second harmonic perturbations + // + cos2u = cos(2.0*u); + sin2u = sin(2.0*u); + // argument of latitude correction + d_u = cuc * cos2u + cus * sin2u; + // radius correction + d_r = crc * cos2u + crs * sin2u; + // correction to inclination + d_i = cic * cos2u + cis * sin2u; + + // corrected argument of latitude + u += d_u; + // corrected radius + r += d_r; + // corrected inclination + i += d_i + idot * tk; + + // positions in orbital plane + cosu = cos(u); + sinu = sin(u); + x_op = r * cosu; + y_op = r * sinu; + + + // compute the corrected longitude of the ascending node + // This equation deviates from that in Table 20-IV p. 100 GPSICD200C with the inclusion of the + // signal propagation time (estimateOfTrueRange/LIGHTSPEED) term. This compensates for the Sagnac effect. + // The omegak term is thus sensitive to the estimateOfTrueRange term which is usually unknown without + // prior information. The average signal propagation time/range (70ms * c) can be used on first use + // and this function must be called again to iterate this term. The sensitivity of the omegak term + // typically requires N iterations - GDM_DEBUG{find out how many iterations are needed, how sensitive to the position?} + omegak = omega0 + (omegadot - GPS_WGS84_EARTH_ROTATION_RATE)*tk - GPS_WGS84_EARTH_ROTATION_RATE*(toe + estimateOfTrueRange/LIGHTSPEED ); + + // compute the WGS84 ECEF coordinates, + // vector r with components x & y is now rotated using, R3(-omegak)*R1(-i) + cos_omegak = cos(omegak); + sin_omegak = sin(omegak); + cosi = cos(i); + sini = sin(i); + *x = x_op * cos_omegak - y_op * sin_omegak * cosi; + *y = x_op * sin_omegak + y_op * cos_omegak * cosi; + *z = y_op * sini; + + + // Satellite Velocity Computations are below + // see Reference + // Remodi, B. M (2004). GPS Tool Box: Computing satellite velocities using the broadcast ephemeris. + // GPS Solutions. Volume 8(3), 2004. pp. 181-183 + // + // example source code was available at [http://www.ngs.noaa.gov/gps-toolbox/bc_velo/bc_velo.c] + + // recomputed the cos and sin of the corrected argument of latitude + cos2u = cos(2.0*u); + sin2u = sin(2.0*u); + + edot = n / (1.0 - ecc*cosE); + vdot = sinE*edot*(1.0 + ecc*cos(v)) / ( sin(v)*(1.0-ecc*cosE) ); + udot = vdot + 2.0*(cus*cos2u - cuc*sin2u)*vdot; + rdot = a*ecc*sinE*n/(1.0-ecc*cosE) + 2.0*(crs*cos2u - crc*sin2u)*vdot; + idotdot = idot + (cis*cos2u - cic*sin2u)*2.0*vdot; + + vx_op = rdot*cosu - y_op*udot; + vy_op = rdot*sinu + x_op*udot; + + // corrected rate of right ascension including similarily as above, for omegak, + // compensation for the Sagnac effect + omegadotk = omegadot - GPS_WGS84_EARTH_ROTATION_RATE*( 1.0 + estimteOfRangeRate/LIGHTSPEED ); + + tmpa = vx_op - y_op*cosi*omegadotk; + tmpb = x_op*omegadotk + vy_op*cosi - y_op*sini*idotdot; + + *vx = tmpa * cos_omegak - tmpb * sin_omegak; + *vy = tmpa * sin_omegak + tmpb * cos_omegak; + *vz = vy_op*sini + y_op*cosi*idotdot; +} + + +void GPS_ComputeUserToSatelliteRange( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const double satX, //!< satellite X position WGS84 ECEF [m] + const double satY, //!< satellite Y positoin WGS84 ECEF [m] + const double satZ, //!< satellite Z position WGS84 ECEF [m] + double* range //!< user to satellite range [m] + ) +{ + double dx; + double dy; + double dz; + + dx = satX - userX; + dy = satY - userY; + dz = satZ - userZ; + + // compute the range + *range = sqrt( dx*dx + dy*dy + dz*dz ); +} + + +void GPS_ComputeUserToSatelliteRangeAndRangeRate( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const double userVx, //!< user X velocity WGS84 ECEF [m/s] + const double userVy, //!< user Y velocity WGS84 ECEF [m/s] + const double userVz, //!< user Z velocity WGS84 ECEF [m/s] + const double satX, //!< satellite X position WGS84 ECEF [m] + const double satY, //!< satellite Y positoin WGS84 ECEF [m] + const double satZ, //!< satellite Z position WGS84 ECEF [m] + const double satVx, //!< satellite X velocity WGS84 ECEF [m/s] + const double satVy, //!< satellite Y velocity WGS84 ECEF [m/s] + const double satVz, //!< satellite Z velocity WGS84 ECEF [m/s] + double* range, //!< user to satellite range [m] + double* range_rate //!< user to satellite range rate [m/s] + ) +{ + double dx; + double dy; + double dz; + + dx = satX - userX; + dy = satY - userY; + dz = satZ - userZ; + + // compute the range + *range = sqrt( dx*dx + dy*dy + dz*dz ); + + // compute the range rate + // this method uses the NovAtel style sign convention! + *range_rate = (userVx - satVx)*dx + (userVy - satVy)*dy + (userVz - satVz)*dz; + *range_rate /= *range; +} + + + +void GPS_ComputeSatellitePositionVelocityAzimuthElevationDoppler_BasedOnAlmanacData( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const unsigned short gpsweek, //!< user gps week (0-1024+) [week] + const double gpstow, //!< user time of week [s] + const double toa, //!< time of applicability [s] + const unsigned short almanac_week, //!< gps week of almanac (0-1024+) [week] + const unsigned short prn, //!< GPS prn number [] + const double ecc, //!< eccentricity [] + const double i0, //!< orbital inclination at reference time [rad] + const double omegadot, //!< rate of right ascension [rad/s] + const double sqrta, //!< square root of the semi-major axis [m^(1/2)] + const double omega0, //!< longitude of ascending node of orbit plane at weekly epoch [rad] + const double w, //!< argument of perigee [rad] + const double m0, //!< mean anomaly at reference time [rad] + const double af0, //!< polynomial clock correction coefficient (clock bias) [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + const double af1, //!< polynomial clock correction coefficient (clock drift) [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + double* clock_correction, //!< clock correction for this satellite for this epoch [m] + double* clock_drift, //!< clock drift correction for this satellite for this epoch [m/s] + double* satX, //!< satellite X position WGS84 ECEF [m] + double* satY, //!< satellite Y position WGS84 ECEF [m] + double* satZ, //!< satellite Z position WGS84 ECEF [m] + double* satVx, //!< satellite X velocity WGS84 ECEF [m/s] + double* satVy, //!< satellite Y velocity WGS84 ECEF [m/s] + double* satVz, //!< satellite Z velocity WGS84 ECEF [m/s] + double* azimuth, //!< satelilte azimuth [rad] + double* elevation, //!< satelilte elevation [rad] + double* doppler //!< satellite doppler with respect to the user position [m/s], Note: User must convert to Hz + ) +{ + double tow; // user time of week adjusted with the clock corrections [s] + double range; // range estimate between user and satellite [m] + double range_rate; // range_rate esimate between user and satellite [m/s] + double x; // sat X position [m] + double y; // sat Y position [m] + double z; // sat Z position [m] + double vx; // sat X velocity [m/s] + double vy; // sat Y velocity [m/s] + double vz; // sat Z velocity [m/s] + + unsigned short week; // user week adjusted with the clock correction if needed [week] + + unsigned char i; // counter + + i = (unsigned char)prn; // get rid of a debug msg :) + + // initialize to zero + x = y = z = vx = vy = vz = 0.0; + + GPS_ComputeSatelliteClockCorrectionAndDrift( + gpsweek, + gpstow, + almanac_week, + (unsigned)toa, + (unsigned)toa, + af0, + af1, + 0.0, + ecc, + sqrta, + 0.0, + m0, + 0.0, + 0, + clock_correction, + clock_drift ); + + // adjust for week rollover + week = gpsweek; + tow = gpstow + (*clock_correction)/LIGHTSPEED; + if( tow < 0.0 ) + { + tow += SECONDS_IN_WEEK; + week--; + } + if( tow > 604800.0 ) + { + tow -= SECONDS_IN_WEEK; + week++; + } + + // iterate to include the Sagnac correction + // since the range is unknown, an approximate of 70 ms is good enough + // to start the iterations so that 2 iterations are enough + range = 0.070*LIGHTSPEED; + range_rate = 0.0; + for( i = 0; i < 2; i++ ) + { + GPS_ComputeSatellitePositionAndVelocity( + week, + tow, + almanac_week, + (unsigned)toa, + m0, + 0.0, + ecc, + sqrta, + omega0, + i0, + w, + omegadot, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + range, + range_rate, + &x, + &y, + &z, + &vx, + &vy, + &vz ); + + GPS_ComputeUserToSatelliteRangeAndRangeRate( + userX, + userY, + userZ, + 0.0, + 0.0, + 0.0, + x, + y, + z, + vx, + vy, + vz, + &range, + &range_rate ); + } + + GEODESY_ComputeAzimuthAndElevationAnglesBetweenToPointsInTheEarthFixedFrame( + GEODESY_REFERENCE_ELLIPSE_WGS84, + userX, + userY, + userZ, + x, + y, + z, + elevation, // sets the elevation + azimuth ); // sets the azimuth + + *satX = x; + *satY = y; + *satZ = z; + *satVx = vx; + *satVy = vy; + *satVz = vz; + + *doppler = range_rate; + +} + + + +void GPS_ComputeSatellitePositionVelocityAzimuthElevationDoppler_BasedOnEphmerisData( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const unsigned short gpsweek, //!< gps week of signal transmission (0-1024+) [week] + const double gpstow, //!< time of week of signal transmission (gpstow-psr/c) [s] + const unsigned short ephem_week, //!< ephemeris: GPS week (0-1024+) [weeks] + const unsigned toe, //!< ephemeris: time of week [s] + const unsigned toc, //!< ephemeris: clock reference time of week [s] + const double af0, //!< ephemeris: polynomial clock correction coefficient [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + const double af1, //!< ephemeris: polynomial clock correction coefficient [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + const double af2, //!< ephemeris: polynomial clock correction coefficient [s/s^2] + const double tgd, //!< ephemeris: group delay differential between L1 and L2 [s] + const double m0, //!< ephemeris: mean anomaly at reference time [rad] + const double delta_n, //!< ephemeris: mean motion difference from computed value [rad/s] + const double ecc, //!< ephemeris: eccentricity [] + const double sqrta, //!< ephemeris: square root of the semi-major axis [m^(1/2)] + const double omega0, //!< ephemeris: longitude of ascending node of orbit plane at weekly epoch [rad] + const double i0, //!< ephemeris: inclination angle at reference time [rad] + const double w, //!< ephemeris: argument of perigee [rad] + const double omegadot, //!< ephemeris: rate of right ascension [rad/s] + const double idot, //!< ephemeris: rate of inclination angle [rad/s] + const double cuc, //!< ephemeris: amplitude of the cosine harmonic correction term to the argument of latitude [rad] + const double cus, //!< ephemeris: amplitude of the sine harmonic correction term to the argument of latitude [rad] + const double crc, //!< ephemeris: amplitude of the cosine harmonic correction term to the orbit radius [m] + const double crs, //!< ephemeris: amplitude of the sine harmonic correction term to the orbit radius [m] + const double cic, //!< ephemeris: amplitude of the cosine harmonic correction term to the angle of inclination [rad] + const double cis, //!< ephemeris: amplitude of the sine harmonic correction term to the angle of inclination [rad] + double* clock_correction, //!< clock correction for this satellite for this epoch [m] + double* clock_drift, //!< clock drift correction for this satellite for this epoch [m/s] + double* satX, //!< satellite X position WGS84 ECEF [m] + double* satY, //!< satellite Y position WGS84 ECEF [m] + double* satZ, //!< satellite Z position WGS84 ECEF [m] + double* satVx, //!< satellite X velocity WGS84 ECEF [m/s] + double* satVy, //!< satellite Y velocity WGS84 ECEF [m/s] + double* satVz, //!< satellite Z velocity WGS84 ECEF [m/s] + double* azimuth, //!< satelilte azimuth [rad] + double* elevation, //!< satelilte elevation [rad] + double* doppler //!< satellite doppler with respect to the user position [m/s], Note: User must convert to Hz + ) +{ + double tow; // user time of week adjusted with the clock corrections [s] + double range; // range estimate between user and satellite [m] + double range_rate; // range_rate esimate between user and satellite [m/s] + double x; // sat X position [m] + double y; // sat Y position [m] + double z; // sat Z position [m] + double vx; // sat X velocity [m/s] + double vy; // sat Y velocity [m/s] + double vz; // sat Z velocity [m/s] + + unsigned short week; // user week adjusted with the clock correction if needed [week] + + unsigned char i; // counter + + // initialize to zero + x = y = z = vx = vy = vz = 0.0; + + GPS_ComputeSatelliteClockCorrectionAndDrift( + gpsweek, + gpstow, + ephem_week, + toe, + toc, + af0, + af1, + af2, + ecc, + sqrta, + delta_n, + m0, + tgd, + 0, + clock_correction, + clock_drift ); + + // adjust for week rollover + week = gpsweek; + tow = gpstow + (*clock_correction)/LIGHTSPEED; + if( tow < 0.0 ) + { + tow += SECONDS_IN_WEEK; + week--; + } + if( tow > 604800.0 ) + { + tow -= SECONDS_IN_WEEK; + week++; + } + + // iterate to include the Sagnac correction + // since the range is unknown, an approximate of 70 ms is good enough to start + // the iterations so that 2 iterations are enough for sub mm accuracy + range = 0.070*LIGHTSPEED; + range_rate = 0.0; + for( i = 0; i < 2; i++ ) + { + GPS_ComputeSatellitePositionAndVelocity( + week, + tow, + ephem_week, + toe, + m0, + delta_n, + ecc, + sqrta, + omega0, + i0, + w, + omegadot, + idot, + cuc, + cus, + crc, + crs, + cic, + cis, + range, + range_rate, + &x, + &y, + &z, + &vx, + &vy, + &vz ); + + GPS_ComputeUserToSatelliteRangeAndRangeRate( + userX, + userY, + userZ, + 0.0, + 0.0, + 0.0, + x, + y, + z, + vx, + vy, + vz, + &range, + &range_rate ); + } + + GEODESY_ComputeAzimuthAndElevationAnglesBetweenToPointsInTheEarthFixedFrame( + GEODESY_REFERENCE_ELLIPSE_WGS84, + userX, + userY, + userZ, + x, + y, + z, + elevation, // sets the elevation + azimuth ); // sets the azimuth + + *satX = x; + *satY = y; + *satZ = z; + *satVx = vx; + *satVy = vy; + *satVz = vz; + + *doppler = range_rate; +} + + +BOOL GPS_DecodeRawGPSEphemeris( + const unsigned char subframe1[30], //!< subframe 1 data, 30 bytes * 8bits/byte = 240 bits, thus parity bits have been removed + const unsigned char subframe2[30], //!< subframe 2 data, 30 bytes * 8bits/byte = 240 bits, thus parity bits have been removed + const unsigned char subframe3[30], //!< subframe 3 data, 30 bytes * 8bits/byte = 240 bits, thus parity bits have been removed + unsigned short prn, //!< GPS PRN number (helps with debugging) + unsigned* tow, //!< time of week in subframe1, the time of the leading bit edge of subframe 2 [s] + unsigned short* iodc, //!< 10 bit issue of data (clock), 8 LSB bits will match the iode [] + unsigned char* iode, //!< 8 bit issue of data (ephemeris) [] + unsigned* toe, //!< reference time ephemeris (0-604800) [s] + unsigned* toc, //!< reference time (clock) (0-604800) [s] + unsigned short* week, //!< 10 bit gps week 0-1023 (user must account for week rollover ) [week] + unsigned char* health, //!< 6 bit health parameter, 0 if healthy, unhealth othersize [0=healthy] + unsigned char* alert_flag, //!< 1 = URA may be worse than indicated [0,1] + unsigned char* anti_spoof, //!< anti-spoof flag from 0=off, 1=on [0,1] + unsigned char* code_on_L2, //!< 0=reserved, 1=P code on L2, 2=C/A on L2 [0,1,2] + unsigned char* ura, //!< User Range Accuracy lookup code, 0 is excellent, 15 is use at own risk [0-15], see p. 83 GPSICD200C + unsigned char* L2_P_data_flag, //!< flag indicating if P is on L2 1=true [0,1] + unsigned char* fit_interval_flag, //!< fit interval flag (four hour interval or longer) 0=4 fours, 1=greater [0,1] + unsigned short* age_of_data_offset, //!< age of data offset [s] + double* tgd, //!< group delay [s] + double* af2, //!< polynomial clock correction coefficient (rate of clock drift) [s/s^2] + double* af1, //!< polynomial clock correction coefficient (clock drift) [s/s] + double* af0, //!< polynomial clock correction coefficient (clock bias) [s] + double* m0, //!< mean anomaly at reference time [rad] + double* delta_n, //!< mean motion difference from computed value [rad/s] + double* ecc, //!< eccentricity [] + double* sqrta, //!< square root of the semi-major axis [m^(1/2)] + double* omega0, //!< longitude of ascending node of orbit plane at weekly epoch [rad] + double* i0, //!< inclination angle at reference time [rad] + double* w, //!< argument of perigee [rad] + double* omegadot, //!< rate of right ascension [rad/s] + double* idot, //!< rate of inclination angle [rad/s] + double* cuc, //!< amplitude of the cosine harmonic correction term to the argument of latitude [rad] + double* cus, //!< amplitude of the sine harmonic correction term to the argument of latitude [rad] + double* crc, //!< amplitude of the cosine harmonic correction term to the orbit radius [m] + double* crs, //!< amplitude of the sine harmonic correction term to the orbit radius [m] + double* cic, //!< amplitude of the cosine harmonic correction term to the angle of inclination [rad] + double* cis //!< amplitude of the sine harmonic correction term to the angle of inclination [rad] + ) +{ +/* +------------------------------------------------------------------ + SUBFRAME1 +------------------------------------------------------------------ +TERM, NR BITS, BITS NO PARITY, BITS WITH PARITY +preamble, 8, 1-8, 1-8, +TLM, 14, 9-22, 9-22 +reserved, 2, 23-24, 23-24 +--PARITY-- 6, ----- 25-30 +TOW, 17, 25-41, 31-47 +alert_flag, 1, 42, 48 +anti_spoof_flag, 1, 43, 49 +subframeID, 3, 44-46, 50-52 +parity_related, 2, 47-48, 53-54 +--PARITY-- 6, ----- 25-30 +week, 10, 49-58, 61-70 +code_on_L2, 2, 59,60, 71-72 +ura, 4, 61-64, 73-76 +health, 6, 65-70, 77-82 +iodc_MSB, 2, 71-72, 83-84 +--PARITY-- 6, ----- 85-90 +L2_P_data_flag, 1, 73, 91 +reserved, 23, 74-96, 92-114 +--PARITY-- 6, ----- 115-120 +reserved, 24, 97-120, 121-144 +--PARITY-- 6, ----- 25-30 +reserved, 24, 121-144, 151-174 +--PARITY-- 6, ----- 25-30 +reserved, 16, 145-160, 181-196 +tgd, 8, 161-168, 197-204 +--PARITY-- 6, ----- 205-210 +iodc_LSB, 8, 169-176, 211-218 +toc, 16, 177-192, 219-234 +--PARITY-- 6, ----- 235-240 +af2, 8, 193-200, 241-248 +af1, 16, 201-216, 249-264 +--PARITY-- 6, ----- 265-270 +af0, 22, 217-238, 271-292 +parity_related, 2, 239-240, 293-294 +--PARITY-- 6, ----- 295-300 +------------------------------------------------------------------ + SUBFRAME2 +------------------------------------------------------------------ +TERM, NR BITS, BITS NO PARITY, BITS WITH PARITY +preamble, 8, 1-8, 1-8, +TLM, 14, 9-22, 9-22 +reserved, 2, 23-24, 23-24 +--PARITY-- 6, ----- 25-30 +TOW, 17, 25-41, 31-47 +alert_flag, 1, 42, 48 +anti_spoof_flag, 1, 43, 49 +subframeID, 3, 44-46, 50-52 +parity_related, 2, 47-48, 53-54 +--PARITY-- 6, ----- 25-30 +iode, 8, 49-56, 61-68 +crs, 16, 57-72, 69-84 +--PARITY-- 6, ----- 95-90 +delta_n, 16, 73-88, 91-106 +m0_MSB, 8, 89-96, 107-114 +--PARITY-- 6, ----- 115-120 +m0_LSB, 24, 97-120, 121-144 +--PARITY-- 6, ----- 145-150 +cuc, 16, 121-136, 151-166 +ecc_MSB, 8, 137-144, 167-174 +--PARITY-- 6, ----- 175-180 +ecc_LSB, 24, 145-168, 181-204 +--PARITY-- 6, ----- 205-210 +cus, 16, 169-184, 211-226 +sqrta_MSB, 8, 185-192, 227-234 +--PARITY-- 6, ----- 235-240 +sqrta_LSB, 24, 193-216, 241-264 +--PARITY-- 6, ----- 265-270 +toe, 16, 217-232, 271-286 +fit_interval_flag, 1, 233, 287 +age_of_data_offset, 5, 234-238, 288-292 +parity_related, 2, 239-240, 293-294 +--PARITY-- 6, ----- 295-300 +------------------------------------------------------------------ + SUBFRAME3 +------------------------------------------------------------------ +TERM, NR BITS, BITS NO PARITY, BITS WITH PARITY +preamble, 8, 1-8, 1-8, +TLM, 14, 9-22, 9-22 +reserved, 2, 23-24, 23-24 +--PARITY-- 6, ----- 25-30 +TOW, 17, 25-41, 31-47 +alert_flag, 1, 42, 48 +anti_spoof_flag, 1, 43, 49 +subframeID, 3, 44-46, 50-52 +parity_related, 2, 47-48, 53-54 +--PARITY-- 6, ----- 25-30 +cic, 16, 49-64, 61-76 +omega0_MSB, 8, 65-72, 77-84 +--PARITY-- 6, ----- 85-90 +omega0_LSB, 24, 73-96, 91-114 +--PARITY-- 6, ----- 115-120 +cis, 16, 97-112, 121-136 +i0_MSB, 8, 113-120, 137-144 +--PARITY-- 6, ----- 145-150 +i0_LSB, 24, 121-144, 151-174 +--PARITY-- 6, ----- 175-180 +crc, 16, 145-160, 181-196 +w_MSB, 8, 161-168, 197-204 +--PARITY-- 6, ----- 205-210 +w_LSB, 24, 169-192, 211-234 +--PARITY-- 6, ----- 235-240 +omegadot, 24, 193-216, 241-264 +--PARITY-- 6, ----- 265-270 +iode, 8, 217-224, 271-278 +idot, 14, 225-238, 279-292 +parity_related, 2, 239-240, 293-294 +------------------------------------------------------------------ +*/ + unsigned char subframe_id; // subrame id + unsigned char iode_subframe1; // 8 LSB bits of the iodc in subframe 1 + unsigned char iode_subframe2; // subframe2 iode + unsigned char iode_subframe3; // subframe3 iode + + // temporary variables of different size + char s8; + short s16; + int s32; + unsigned short u16a, u16b; + unsigned u32a, u32b, u32c, u32d; + + u16a = prn; // gets rid of a debug msg :) + + //------------------------------------------------------------------ + // SUBFRAME1 + //------------------------------------------------------------------ + + // time of week, actually a 19 bit value, 17 MSBs are available, 2 LSB bits are always zero + u32a = subframe1[3] << 11; + u32b = subframe1[4] << 3; + u32c = (subframe1[5] & 0x80) >> 5; + *tow = (u32a | u32b | u32c); // [z-count 1.5s intervals] + *tow = (*tow * 3) / 2; // converted to [s] + + // alert_flag + *alert_flag = (unsigned char)( (subframe1[5] & 0x40) >> 6 ); + + // anti-spoof + *anti_spoof = (unsigned char)( (subframe1[5] & 0x20) >> 5 ); + + // confirm that this is subframe 1 + subframe_id = (unsigned char)( (subframe1[5] & 0x1C) >> 2 ); + if( subframe_id != 1 ) + { + GNSS_ERROR_MSG( "if( subframe_id != 1 )" ); + return FALSE; + } + + // GPS Week + u16a = (unsigned short)( subframe1[6] << 2 ); + u16b = (unsigned short)( subframe1[7] >> 6 ); + *week = (unsigned short)( u16a | u16b ); + + /// code_on_L2 + *code_on_L2 = (unsigned char)( (subframe1[7] & 0x30) >> 4 ); + + // ura + *ura = (unsigned char)( (subframe1[7] & 0x0F) ); + + // health + *health = (unsigned char)( subframe1[8] >> 2 ); + + // issue of data clock + u16a = (unsigned short)( (subframe1[8] & 0x03) << 8 ); + u16b = (unsigned short)( subframe1[21] ); + *iodc = (unsigned short)( u16a | u16b ); // [] + + // iode subframe1 for consistency checking + iode_subframe1 = subframe1[21]; + + // L2_P_data_flag + *L2_P_data_flag = (unsigned char)( (subframe1[9] & 0x80) >> 7 ); + + // tgd + s8 = subframe1[20]; // signed + *tgd = s8 / TWO_TO_THE_POWER_OF_31; + + // toc + u16a = (unsigned short)( subframe1[22] << 8 ); + u16b = (unsigned short)( subframe1[23] ); + *toc = (unsigned)( (u16a | u16b) ) * 16; + + // af2 + s8 = subframe1[24]; // signed + *af2 = s8; + *af2 /= TWO_TO_THE_POWER_OF_55; + + // af1 + u16a = (unsigned short)( subframe1[25] << 8 ); + u16b = subframe1[26]; + s16 = (unsigned short)( u16a | u16b ); // signed value + *af1 = s16; + *af1 /= TWO_TO_THE_POWER_OF_43; + + // af0 + u32a = subframe1[27] << 24; + u32b = subframe1[28] << 16; + u32c = subframe1[29] & 0xFC; + u32c <<= 8; // align to the sign bit (two's complement integer) + u32d = (u32a | u32b | u32c); + s32 = (int)(u32d); + s32 >>= 10; // 22 bit value + *af0 = s32; + *af0 /= TWO_TO_THE_POWER_OF_31; + + //------------------------------------------------------------------ + // SUBFRAME2 + //------------------------------------------------------------------ + + // confirm that this is subframe 2 + subframe_id = (unsigned char)( (subframe2[5] & 0x1C) >> 2 ); + if( subframe_id != 2 ) + { + GNSS_ERROR_MSG( "if( subframe_id != 2 )" ); + return FALSE; + } + + // iode subframe2 + iode_subframe2 = subframe2[6]; + + // crs + u16a = (unsigned short)( subframe2[7] << 8 ); + u16b = subframe2[8]; + s16 = (unsigned short)( u16a | u16b ); // signed value + *crs = s16; + *crs /= 32.0; // [m] + + // delta_n + u16a = (unsigned short)( subframe2[9] << 8 ); + u16b = subframe2[10]; + s16 = (short)( u16a | u16b ); // signed value + *delta_n = s16; + *delta_n *= PI / TWO_TO_THE_POWER_OF_43; // [rad/s] + + // m0 + u32a = subframe2[11] << 24; + u32b = subframe2[12] << 16; + u32c = subframe2[13] << 8; + u32d = subframe2[14]; + s32 = (u32a | u32b | u32c | u32d); // signed value + *m0 = s32; + *m0 *= PI / TWO_TO_THE_POWER_OF_31; // [rad] + + // cuc + u16a = (unsigned short)( subframe2[15] << 8 ); + u16b = subframe2[16]; + s16 = (short)( u16a | u16b ); // signed value + *cuc = s16; + *cuc /= TWO_TO_THE_POWER_OF_29; // [rad] + + // ecc + u32a = subframe2[17] << 24; + u32b = subframe2[18] << 16; + u32c = subframe2[19] << 8; + u32d = subframe2[20]; + *ecc = u32a | u32b | u32c | u32d; + *ecc /= TWO_TO_THE_POWER_OF_33; // [] + + // cus + u16a = (unsigned short)( subframe2[21] << 8 ); + u16b = subframe2[22]; + s16 = (short)( u16a | u16b ); + *cus = s16; + *cus /= TWO_TO_THE_POWER_OF_29; // [rad] + + // sqrta + u32a = subframe2[23] << 24; + u32b = subframe2[24] << 16; + u32c = subframe2[25] << 8; + u32d = subframe2[26]; + *sqrta = u32a | u32b | u32c | u32d; + *sqrta /= TWO_TO_THE_POWER_OF_19; // [sqrt(m)] + + // toe + u16a = (unsigned short)( subframe2[27] << 8 ); + u16b = subframe2[28]; + *toe = (unsigned)( (u16a | u16b) ) * 16; // [s] + + // fit_interval_flag + *fit_interval_flag = (unsigned char)( subframe2[29] >> 7 ); + + // age_of_data_offset + *age_of_data_offset = (unsigned short)( (subframe2[29] & 0x74) >> 2 ); + *age_of_data_offset *= 900; // [s] + + //------------------------------------------------------------------ + // SUBFRAME3 + //------------------------------------------------------------------ + + // confirm that this is subframe 3 + subframe_id = (unsigned char)( (subframe3[5] & 0x1C) >> 2 ); + if( subframe_id != 3 ) + { + GNSS_ERROR_MSG( "if( subframe_id != 3 )" ); + return FALSE; + } + + // cic + u16a = (unsigned short)( subframe3[6] << 8 ); + u16b = subframe3[7]; + s16 = (short)( u16a | u16b ); // signed value + *cic = s16; + *cic /= TWO_TO_THE_POWER_OF_29; // [rad] + + // omego0 + u32a = subframe3[8] << 24; + u32b = subframe3[9] << 16; + u32c = subframe3[10] << 8; + u32d = subframe3[11]; + s32 = u32a | u32b | u32c | u32d; // signed value + *omega0 = s32; + *omega0 *= PI / TWO_TO_THE_POWER_OF_31; // [rad] + + // cis + u16a = (unsigned short)( subframe3[12] << 8 ); + u16b = subframe3[13]; + s16 = (short)( u16a | u16b ); // signed value + *cis = s16; + *cis /= TWO_TO_THE_POWER_OF_29; // [rad] + + // i0 + u32a = subframe3[14] << 24; + u32b = subframe3[15] << 16; + u32c = subframe3[16] << 8; + u32d = subframe3[17]; + s32 = u32a | u32b | u32c | u32d; + *i0 = s32; + *i0 *= PI / TWO_TO_THE_POWER_OF_31; // [rad] + + // crc + u16a = (unsigned short)( subframe3[18] << 8 ); + u16b = subframe3[19]; + s16 = (short)( u16a | u16b ); // signed value + *crc = s16; + *crc /= 32.0; // [m] + + // w + u32a = subframe3[20] << 24; + u32b = subframe3[21] << 16; + u32c = subframe3[22] << 8; + u32d = subframe3[23]; + s32 = u32a | u32b | u32c | u32d; // signed value + *w = s32; + *w *= PI / TWO_TO_THE_POWER_OF_31; // [rad] + + // omegadot + u32a = subframe3[24] << 24; + u32b = subframe3[25] << 16; + u32c = subframe3[26] << 8; + s32 = u32a | u32b | u32c; // signed value + s32 = s32 >> 8; + *omegadot = s32; + *omegadot *= PI / TWO_TO_THE_POWER_OF_43; // [rad/s] + + // iode subframe3 + iode_subframe3 = subframe3[27]; + + // idot + u16a = (unsigned short)( subframe3[28] << 8 ); + u16b = (unsigned short)( subframe3[29] & 0xFC ); + s16 = (short)( u16a | u16b ); // signed value + s16 = (short)( s16 >> 2 ); + *idot = s16; + *idot *= PI / TWO_TO_THE_POWER_OF_43; // [rad/s] + + // check that the IODE values match for all three subframes + if( (iode_subframe1 == iode_subframe2) && (iode_subframe1 == iode_subframe3) ) + { + *iode = iode_subframe1; + return TRUE; + } + else + { + *iode = 0; + GNSS_ERROR_MSG( "inconsistent subframe dataset" ); + return FALSE; // inconsistent subframe dataset + } +} + + diff --git a/src/gps.h b/src/gps.h new file mode 100644 index 0000000..b11b9c8 --- /dev/null +++ b/src/gps.h @@ -0,0 +1,444 @@ +/** +\file gps.h +\brief GNSS core 'c' function library: GPS specific functions. +\author Glenn D. MacGougan (GDM) +\date 2005-08-14 +\since 2005-07-31 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_GPS_H_ +#define _C_GPS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "basictypes.h" + + +/// \brief A set of satellite orbit parameters that is used +/// to calculate GPS satellite positions and velocities. In the ephemeris +/// structure below, the parameters for computing satellite clock corrections +/// are also included. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-14 +/// \since 2005-08-14 +/// +/// \remarks +/// (1) struct packaging: compatible with 4 and 8 byte packing \n +/// +/// \b REFERENCES \n +/// [1] ICD-GPS-200C, p. 93-102 +/// +typedef struct +{ + unsigned toe; //!< reference time ephemeris (0-604800) [s] + unsigned toc; //!< reference time (clock) (0-604800) [s] + + unsigned short prn; //!< GPS PRN number + unsigned short week; //!< 10 bit gps week 0-1023 (user must account for week rollover ) [week] + unsigned short iodc; //!< 10 bit issue of data (clock) [] + unsigned short reserved1; //!< reserved bytes + + unsigned char iode; //!< 8 bit issue of data (ephemeris) [] + unsigned char health; //!< 6 bit health parameter, 0 if healthy, unhealth othersize [0=healthy] + unsigned char alert_flag; //!< 1 = URA may be worse than indicated [0,1] + unsigned char anti_spoof; //!< anti-spoof flag from 0=off, 1=on [0,1] + unsigned char code_on_L2; //!< 0=reserved, 1=P code on L2, 2=C/A on L2 [0,1,2] + unsigned char L2_P_data_flag; //!< flag indicating if P is on L2 1=true [0,1] + unsigned char fit_interval_flag; //!< fit interval flag (four hour interval or longer) 0=4 fours, 1=greater [0,1] + unsigned char ura; //!< User Range Accuracy lookup code, 0 is excellent, 15 is use at own risk [0-15], see p. 83 GPSICD200C + unsigned short age_of_data_offset; //!< age of data offset [s] + unsigned short tow_week; //!< The week corresponding to tow (0-1024+). Can be one week larger than week. [week] + unsigned tow; //!< The time of week derived formt the Z-count in the Hand Over Word (HOW) [s] + + // clock parameters + double tgd; //!< group delay [s] + double af2; //!< polynomial clock correction coefficient (rate of clock drift) [s/s^2] + double af1; //!< polynomial clock correction coefficient (clock drift) [s/s] Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + double af0; //!< polynomial clock correction coefficient (clock bias) [s] Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + + // ephemeris parameters + double m0; //!< mean anomaly at reference time [rad] + double delta_n; //!< mean motion difference from computed value [rad/s] + double ecc; //!< eccentricity [] + double sqrta; //!< square root of the semi-major axis [m^(1/2)] + double omega0; //!< longitude of ascending node of orbit plane at weekly epoch [rad] + double i0; //!< inclination angle at reference time [rad] + double w; //!< argument of perigee [rad] + double omegadot; //!< rate of right ascension [rad/s] + double idot; //!< rate of inclination angle [rad/s] + double cuc; //!< amplitude of the cosine harmonic correction term to the argument of latitude [rad] + double cus; //!< amplitude of the sine harmonic correction term to the argument of latitude [rad] + double crc; //!< amplitude of the cosine harmonic correction term to the orbit radius [m] + double crs; //!< amplitude of the sine harmonic correction term to the orbit radius [m] + double cic; //!< amplitude of the cosine harmonic correction term to the angle of inclination [rad] + double cis; //!< amplitude of the sine harmonic correction term to the angle of inclination [rad] + +} GPS_structEphemeris; + + +/// \brief A limited set of satellite orbit parameters that is used to +/// calculate rough GPS satellite positions and velocities. The parameters +/// for computing rough satellite clock corrections are also included. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-18 +/// \since 2005-08-18 +/// +/// \remarks +/// (1) struct packaging: compatible with 4 and 8 byte packing +/// +/// \b REFERENCES \n +/// [1] ICD-GPS-200C, p. 108 +/// +typedef struct +{ + unsigned toa; //!< almanac time of applicability [s] + unsigned reserved; //!< reserved [] + double ecc; //!< eccentricity [] + double i0; //!< inclination angle at reference time [rad] + double omegadot; //!< rate of right ascension [rad/s] + double sqrta; //!< square root of the semi-major axis [m^(1/2)] + double omega0; //!< longitude of ascending node of orbit plane at weekly epoch [rad] + double w; //!< argument of perigee [rad] + double m0; //!< mean anomaly at reference time [rad] + double af0; //!< polynomial clock correction coefficient (clock bias) [s] Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + double af1; //!< polynomial clock correction coefficient (clock drift) [s/s] Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) +} GPS_structAlmanac; + + + + +/// Computes the satellite clock and clock dirft corrections given the clock model and ephemeris +/// information. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-12 +/// \since 2005-08-12 +/// +/// \remarks +/// (1) The clock correction parameter is sensitive to the polynomial coefficient source which is +/// either ephemeris related from subframe 1 or from the gps almanac (subframes 4,5). The +/// ephemeris parameters have higher precision 22 & 16 vs 11 & 11 bits. \n +/// (2) User must compensate for the GPS week rollover \n +/// +/// \b REFERENCES \n +/// [1] ICD-GPS-200C, p. 88-101 \n +/// [2] Teunissen, P. J. G. & A. Kleusberg (editors) (1998). GPS for Geodesy, 2nd Edition. pp. 43-107 +/// [3] Hofmann-Wellenhof, B. & J. Collins (1994). GPS Theory and Practice, 3rd Edition. \n +/// Springer-Verlag Wien New York, pp. 43-74 \n +/// [4] Wong, R.V.C & K.P. Schwarz (1985). Dynamic Positioning with an Integrated GPS-INS. Formulae and +/// Baseline Tests. University of Calgary. UCSE Report #30003. pp. 22 \n +/// +void GPS_ComputeSatelliteClockCorrectionAndDrift( + const unsigned short transmission_gpsweek, //!< GPS week when signal was transmit (0-1024+) [weeks] + const double transmission_gpstow, //!< GPS time of week when signal was transmit [s] + const unsigned short ephem_week, //!< ephemeris: GPS week (0-1024+) [weeks] + const unsigned toe, //!< ephemeris: time of week [s] + const unsigned toc, //!< ephemeris: clock reference time of week [s] + const double af0, //!< ephemeris: polynomial clock correction coefficient [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + const double af1, //!< ephemeris: polynomial clock correction coefficient [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + const double af2, //!< ephemeris: polynomial clock correction coefficient [s/s^2] + const double ecc, //!< ephemeris: eccentricity of satellite orbit [] + const double sqrta, //!< ephemeris: square root of the semi-major axis of orbit [m^(1/2)] + const double delta_n, //!< ephemeris: mean motion difference from computed value [rad] + const double m0, //!< ephemeris: mean anomaly at reference time [rad] + const double tgd, //!< ephemeris: group delay differential between L1 and L2 [s] + const unsigned char mode, //!< 0=L1 only, 1=L2 only (see p. 90, ICD-GPS-200C) + double* clock_correction, //!< satellite clock correction [m] + double* clock_drift //!< satellite clock drift correction [m/s] + ); + + +/// Computes the satellite position and velocity in WGS84 based on the supplied ephemeris/almanac +/// parameters. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-07-31 +/// \since 2005-07-31 +/// +/// \b REFERENCES \n +/// [1] ICD-GPS-200C, p. 94-101 \n +/// [2] Teunissen, P. J. G. & A. Kleusberg (editors) (1998). GPS for Geodesy, 2nd Edition. pp. 43-107 \n +/// [3] Hofmann-Wellenhof, B. & J. Collins (1994). GPS Theory and Practice, 3rd Edition. +/// Springer-Verlag Wien New York, pp. 43-74 \n +/// [4] Wong, R.V.C & K.P. Schwarz (1985). Dynamic Positioning with an Integrated GPS-INS. Formulae and +/// Baseline Tests. University of Calgary. UCSE Report #30003. pp. 22 \n +/// +void GPS_ComputeSatellitePositionAndVelocity( + const unsigned short transmission_gpsweek, //!< GPS week when signal was transmit (0-1024+) [weeks] + const double transmission_gpstow, //!< GPS time of week when signal was transmit [s] + const unsigned short ephem_week, //!< ephemeris: GPS week (0-1024+) [weeks] + const unsigned toe, //!< ephemeris: time of week [s] + const double m0, //!< ephemeris: mean anomaly at reference time [rad] + const double delta_n, //!< ephemeris: mean motion difference from computed value [rad] + const double ecc, //!< ephemeris: eccentricity [] + const double sqrta, //!< ephemeris: square root of the semi-major axis [m^(1/2)] + const double omega0, //!< ephemeris: longitude of ascending node of orbit plane at weekly epoch [rad] + const double i0, //!< ephemeris: inclination angle at reference time [rad] + const double w, //!< ephemeris: argument of perigee [rad] + const double omegadot, //!< ephemeris: rate of right ascension [rad/s] + const double idot, //!< ephemeris: rate of inclination angle [rad/s] + const double cuc, //!< ephemeris: amplitude of the cosine harmonic correction term to the argument of latitude [rad] + const double cus, //!< ephemeris: amplitude of the sine harmonic correction term to the argument of latitude [rad] + const double crc, //!< ephemeris: amplitude of the cosine harmonic correction term to the orbit radius [m] + const double crs, //!< ephemeris: amplitude of the sine harmonic correction term to the orbit radius [m] + const double cic, //!< ephemeris: amplitude of the cosine harmonic correction term to the angle of inclination [rad] + const double cis, //!< ephemeris: amplitude of the sine harmonic correction term to the angle of inclination [rad] + const double estimateOfTrueRange, //!< best estimate of the signal propagation time (in m) for Sagnac effect compensation [m] + const double estimteOfRangeRate, //!< best estimate of the true signal Doppler (in m/s) for Sagnac effect compensation [m/s] + double* x, //!< satellite x [m] + double* y, //!< satellite y [m] + double* z, //!< satellite z [m] + double* vx, //!< satellite velocity x [m/s] + double* vy, //!< satellite velocity y [m/s] + double* vz //!< satellite velocity z [m/s] + ); + + +/// Computes the user to satellite range given the user and +/// satellite position. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2006-11-23 +/// \since 2006-11-23 +/// +void GPS_ComputeUserToSatelliteRange( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const double satX, //!< satellite X position WGS84 ECEF [m] + const double satY, //!< satellite Y positoin WGS84 ECEF [m] + const double satZ, //!< satellite Z position WGS84 ECEF [m] + double* range //!< user to satellite range [m] + ); + + +/// Computes the user to satellite range and range rate given the user and satellite +/// position and velocities. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-15 +/// \since 2005-08-15 +/// +void GPS_ComputeUserToSatelliteRangeAndRangeRate( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const double userVx, //!< user X velocity WGS84 ECEF [m/s] + const double userVy, //!< user Y velocity WGS84 ECEF [m/s] + const double userVz, //!< user Z velocity WGS84 ECEF [m/s] + const double satX, //!< satellite X position WGS84 ECEF [m] + const double satY, //!< satellite Y positoin WGS84 ECEF [m] + const double satZ, //!< satellite Z position WGS84 ECEF [m] + const double satVx, //!< satellite X velocity WGS84 ECEF [m/s] + const double satVy, //!< satellite Y velocity WGS84 ECEF [m/s] + const double satVz, //!< satellite Z velocity WGS84 ECEF [m/s] + double* range, //!< user to satellite range [m] + double* range_rate //!< user to satellite range rate [m/s] + ); + + +/// Computes the satellite position and velocity in WGS84 based on almanac data. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-15 +/// \since 2005-08-15 +/// +/// \remarks +/// (1) Assumes L1 for the clock correction mode \n +/// (2) This calculation solves for the satellite position at the true GPS time of week specified. +/// It includes compensation for the satellite clock correction and the Saganc effect, which +/// is a function of the user position. \n +/// +/// \b REFERENCES \n +/// [1] ICD-GPS-200C +/// +void GPS_ComputeSatellitePositionVelocityAzimuthElevationDoppler_BasedOnAlmanacData( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const unsigned short gpsweek, //!< user gps week (0-1024+) [week] + const double gpstow, //!< user time of week [s] + const double toa, //!< time of applicability [s] + const unsigned short almanac_week, //!< gps week of almanac (0-1024+) [week] + const unsigned short prn, //!< GPS prn number [] + const double ecc, //!< eccentricity [] + const double i0, //!< orbital inclination at reference time [rad] + const double omegadot, //!< rate of right ascension [rad/s] + const double sqrta, //!< square root of the semi-major axis [m^(1/2)] + const double omega0, //!< longitude of ascending node of orbit plane at weekly epoch [rad] + const double w, //!< argument of perigee [rad] + const double m0, //!< mean anomaly at reference time [rad] + const double af0, //!< polynomial clock correction coefficient (clock bias) [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + const double af1, //!< polynomial clock correction coefficient (clock drift) [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + double* clock_correction, //!< clock correction for this satellite for this epoch [m] + double* clock_drift, //!< clock drift correction for this satellite for this epoch [m/s] + double* satX, //!< satellite X position WGS84 ECEF [m] + double* satY, //!< satellite Y position WGS84 ECEF [m] + double* satZ, //!< satellite Z position WGS84 ECEF [m] + double* satVx, //!< satellite X velocity WGS84 ECEF [m/s] + double* satVy, //!< satellite Y velocity WGS84 ECEF [m/s] + double* satVz, //!< satellite Z velocity WGS84 ECEF [m/s] + double* azimuth, //!< satelilte azimuth [rad] + double* elevation, //!< satelilte elevation [rad] + double* doppler //!< satellite doppler with respect to the user position [m/s], Note: User must convert to Hz + ); + + +/// Computes the satellite position and velocity in WGS84 based on ephemeris data. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-15 +/// \since 2005-08-15 +/// +/// \remarks +/// (1) Assumes L1 for the clock correction mode \n +/// (2) This calculation solves for the satellite position at the true GPS time of week specified. +/// It includes compensation for the satellite clock correction and the Saganc effect, which +/// is a function of the user position. \n +/// (3) This function can be called with almanac data by inputting the almanac information and +/// zero for the terms not available. toe and toc are the toa in that case. \n +/// +/// \b REFERENCES \n +/// [1] ICD-GPS-200C +/// +void GPS_ComputeSatellitePositionVelocityAzimuthElevationDoppler_BasedOnEphmerisData( + const double userX, //!< user X position WGS84 ECEF [m] + const double userY, //!< user Y position WGS84 ECEF [m] + const double userZ, //!< user Z position WGS84 ECEF [m] + const unsigned short gpsweek, //!< gps week of signal transmission (0-1024+) [week] + const double gpstow, //!< time of week of signal transmission (gpstow-psr/c) [s] + const unsigned short ephem_week, //!< ephemeris: GPS week (0-1024+) [weeks] + const unsigned toe, //!< ephemeris: time of week [s] + const unsigned toc, //!< ephemeris: clock reference time of week [s] + const double af0, //!< ephemeris: polynomial clock correction coefficient [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + const double af1, //!< ephemeris: polynomial clock correction coefficient [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + const double af2, //!< ephemeris: polynomial clock correction coefficient [s/s^2] + const double tgd, //!< ephemeris: group delay differential between L1 and L2 [s] + const double m0, //!< ephemeris: mean anomaly at reference time [rad] + const double delta_n, //!< ephemeris: mean motion difference from computed value [rad/s] + const double ecc, //!< ephemeris: eccentricity [] + const double sqrta, //!< ephemeris: square root of the semi-major axis [m^(1/2)] + const double omega0, //!< ephemeris: longitude of ascending node of orbit plane at weekly epoch [rad] + const double i0, //!< ephemeris: inclination angle at reference time [rad] + const double w, //!< ephemeris: argument of perigee [rad] + const double omegadot, //!< ephemeris: rate of right ascension [rad/s] + const double idot, //!< ephemeris: rate of inclination angle [rad/s] + const double cuc, //!< ephemeris: amplitude of the cosine harmonic correction term to the argument of latitude [rad] + const double cus, //!< ephemeris: amplitude of the sine harmonic correction term to the argument of latitude [rad] + const double crc, //!< ephemeris: amplitude of the cosine harmonic correction term to the orbit radius [m] + const double crs, //!< ephemeris: amplitude of the sine harmonic correction term to the orbit radius [m] + const double cic, //!< ephemeris: amplitude of the cosine harmonic correction term to the angle of inclination [rad] + const double cis, //!< ephemeris: amplitude of the sine harmonic correction term to the angle of inclination [rad] + double* clock_correction, //!< clock correction for this satellite for this epoch [m] + double* clock_drift, //!< clock drift correction for this satellite for this epoch [m/s] + double* satX, //!< satellite X position WGS84 ECEF [m] + double* satY, //!< satellite Y position WGS84 ECEF [m] + double* satZ, //!< satellite Z position WGS84 ECEF [m] + double* satVx, //!< satellite X velocity WGS84 ECEF [m/s] + double* satVy, //!< satellite Y velocity WGS84 ECEF [m/s] + double* satVz, //!< satellite Z velocity WGS84 ECEF [m/s] + double* azimuth, //!< satelilte azimuth [rad] + double* elevation, //!< satelilte elevation [rad] + double* doppler //!< satellite doppler with respect to the user position [m/s], Note: User must convert to Hz + ); + + + +/// Decodes the raw gps ephemeris (note, with the parity bits removed). +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-15 +/// \since 2005-08-15 +/// +/// \returns TRUE(1) if successful, FALSE(0) otherwise +/// +/// \remarks +/// (1) Parity bits must be removed from the input subframe data \n +/// (2) Returns TRUE(1) if data is successfully decoded \n +/// (3) Returns FALSE(0) if the subframe id's are incorrect, i.e. must be subframe1, subframe2, subframe3 in that order \n +/// (4) Returns FALSE(0) if the iode's are not consistent for all subframes, note 8 LSB bits of the iodc should equal +/// subframe2 and subframe3 iode \n +/// (5) Uses IBM PC format byte alignment \n +/// +/// \b REFERENCES \n +/// [1] ICD-GPS-200C +/// +BOOL GPS_DecodeRawGPSEphemeris( + const unsigned char subframe1[30], //!< subframe 1 data, 30 bytes * 8bits/byte = 240 bits, thus parity bits have been removed + const unsigned char subframe2[30], //!< subframe 2 data, 30 bytes * 8bits/byte = 240 bits, thus parity bits have been removed + const unsigned char subframe3[30], //!< subframe 3 data, 30 bytes * 8bits/byte = 240 bits, thus parity bits have been removed + unsigned short prn, //!< GPS PRN number (helps with debugging) + unsigned* tow, //!< time of week in subframe1, the time of the leading bit edge of subframe 2 [s] + unsigned short* iodc, //!< 10 bit issue of data (clock), 8 LSB bits will match the iode [] + unsigned char* iode, //!< 8 bit issue of data (ephemeris) [] + unsigned* toe, //!< reference time ephemeris (0-604800) [s] + unsigned* toc, //!< reference time (clock) (0-604800) [s] + unsigned short* week, //!< 10 bit gps week 0-1023 (user must account for week rollover ) [week] + unsigned char* health, //!< 6 bit health parameter, 0 if healthy, unhealth othersize [0=healthy] + unsigned char* alert_flag, //!< 1 = URA may be worse than indicated [0,1] + unsigned char* anti_spoof, //!< anti-spoof flag from 0=off, 1=on [0,1] + unsigned char* code_on_L2, //!< 0=reserved, 1=P code on L2, 2=C/A on L2 [0,1,2] + unsigned char* ura, //!< User Range Accuracy lookup code, 0 is excellent, 15 is use at own risk [0-15], see p. 83 GPSICD200C + unsigned char* L2_P_data_flag, //!< flag indicating if P is on L2 1=true [0,1] + unsigned char* fit_interval_flag, //!< fit interval flag (four hour interval or longer) 0=4 fours, 1=greater [0,1] + unsigned short* age_of_data_offset, //!< age of data offset [s] + double* tgd, //!< group delay [s] + double* af2, //!< polynomial clock correction coefficient (rate of clock drift) [s/s^2] + double* af1, //!< polynomial clock correction coefficient (clock drift) [s/s] + double* af0, //!< polynomial clock correction coefficient (clock bias) [s] + double* m0, //!< mean anomaly at reference time [rad] + double* delta_n, //!< mean motion difference from computed value [rad/s] + double* ecc, //!< eccentricity [] + double* sqrta, //!< square root of the semi-major axis [m^(1/2)] + double* omega0, //!< longitude of ascending node of orbit plane at weekly epoch [rad] + double* i0, //!< inclination angle at reference time [rad] + double* w, //!< argument of perigee [rad] + double* omegadot, //!< rate of right ascension [rad/s] + double* idot, //!< rate of inclination angle [rad/s] + double* cuc, //!< amplitude of the cosine harmonic correction term to the argument of latitude [rad] + double* cus, //!< amplitude of the sine harmonic correction term to the argument of latitude [rad] + double* crc, //!< amplitude of the cosine harmonic correction term to the orbit radius [m] + double* crs, //!< amplitude of the sine harmonic correction term to the orbit radius [m] + double* cic, //!< amplitude of the cosine harmonic correction term to the angle of inclination [rad] + double* cis //!< amplitude of the sine harmonic correction term to the angle of inclination [rad] + ); + + +#ifdef __cplusplus +} +#endif + + +#endif // _C_GPS_H_ diff --git a/src/gps2aprs.c b/src/gps2aprs.c new file mode 100644 index 0000000..b708ff7 --- /dev/null +++ b/src/gps2aprs.c @@ -0,0 +1,1294 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define gps2aprs_C_ +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef Select_H_ +#include "Select.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif + +/* read serial gps and make axudp aprs frames */ +#define gps2aprs_DEFTTY "/dev/ttyS0" + +#define gps2aprs_CR "\015" + +#define gps2aprs_LF "\012" + +#define gps2aprs_KNOTS 1.851984 + +#define gps2aprs_FEET 3.2808398950131 + +#define gps2aprs_DEFAULTPORT 9002 + +#define gps2aprs_DEFAULTIP 0x7F000001 +/* 127.0.0.1 */ + +#define gps2aprs_BTIMENAVI 2 +/* fast beacon to aprsmap as navi -N */ + +/*CRCL, CRCH: ARRAY[0..255] OF SET8;*/ +static char tbuf[1024]; + +static char ttynamee[1024]; + +static char mycall[100]; + +static char via[100]; + +static char comment0[100]; + +static char symt; + +static char symb; + +static uint32_t toport; + +static uint32_t toport2; + +static uint32_t baud; + +static uint32_t ipnum; + +static uint32_t ipnum2; + +static int32_t udpsock; + +static char verb; + +static char anyip; + +static char usbrobust; + +static char junk; + +static char sumoff; + +static char withalti; + +static char withspeed; + +static char withdao; + +static char useaxudp; + +static uint32_t comptyp; + +static uint32_t micessid; + +static uint32_t btime0; + +static uint32_t btimedrive; + +static uint32_t drivekm; + +static uint32_t comintval; + +static uint32_t comcnt; + +static uint32_t btime; + +static uint32_t msgtyp; + +static uint32_t btimeN; + +static double lat; + +static double long0; + +static double speed; + +static double course; + +static double alt; + +static char posok; + +static char altok; + +static int32_t tty; + +static struct termios saved; + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr("aprstracker: ", 14ul); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + + +static uint32_t truncc(double r) +{ + if (r<=0.0) return 0UL; + else if (r>=2.147483647E+9) return 2147483647UL; + else return (uint32_t)X2C_TRUNCC(r,0UL,X2C_max_longcard); + return 0; +} /* end truncc() */ + +#define gps2aprs_DEFAULTIP0 0x7F000001 + +#define gps2aprs_PORTSEP ":" + + +static int32_t GetIp(char h[], uint32_t h_len, uint32_t * p, + uint32_t * ip, uint32_t * port) +{ + uint32_t n; + uint32_t i; + char ok0; + int32_t GetIp_ret; + X2C_PCOPY((void **)&h,h_len); + *p = 0UL; + h[h_len-1] = 0; + *ip = 0UL; + for (i = 0UL; i<=4UL; i++) { + if (i>=3UL || h[0UL]!=':') { + n = 0UL; + ok0 = 0; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + ok0 = 1; + n = (n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + if (!ok0) { + GetIp_ret = -1L; + goto label; + } + } + if (i<3UL) { + if (h[0UL]!=':') { + if (h[*p]!='.' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + *ip = *ip*256UL+n; + } + } + else if (i==3UL) { + if (h[0UL]!=':') { + *ip = *ip*256UL+n; + if (h[*p]!=':' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + } + else { + *p = 0UL; + *ip = 2130706433UL; + } + } + else if (n>65535UL) { + GetIp_ret = -1L; + goto label; + } + *port = n; + ++*p; + } /* end for */ + GetIp_ret = 0L; + label:; + X2C_PFREE(h); + return GetIp_ret; +} /* end GetIp() */ + + +static void SetComMode(int32_t fd, uint32_t baud0) +{ + struct termios term; + int32_t res; + int32_t bd; + struct termios * anonym; + if (baud0==1200UL) bd = 9L; + else if (baud0==2400UL) bd = 11L; + else if (baud0==4800UL) bd = 12L; + else if (baud0==9600UL) bd = 13L; + else if (baud0==19200UL) bd = 14L; + else if (baud0==38400UL) bd = 15L; + else if (baud0==57600UL) bd = 4097L; + else if (baud0==115200UL) bd = 4098L; + else if (baud0==230400UL) bd = 4099L; + else if (baud0==460800UL) bd = 4100L; + else Error("unknown baudrate", 17ul); + res = tcgetattr(fd, &saved); + res = tcgetattr(fd, &term); + { /* with */ + struct termios * anonym = &term; + anonym->c_lflag = 0UL; + anonym->c_oflag = 0UL; + anonym->c_iflag = 0UL; + /* cfmakeraw(&termios);*/ + anonym->c_cflag = (uint32_t)(2224L+bd); /*+CRTSCTS*/ /*0800018B2H*/ + } + res = tcsetattr(fd, 2L, &term); +} /* end SetComMode() */ + + +static void opentty(void) +{ + for (;;) { + tty = osi_OpenRW(ttynamee, 1024ul); + if (tty>=0L) { + SetComMode(tty, baud); + break; + } + if (!usbrobust) Error("tty open", 9ul); + if (verb) osi_WrStrLn("tty open error", 15ul); + usleep(1000000UL); + } +} /* end opentty() */ + + +static void testtty(int32_t len0, char * err) +{ + if (len0<=0L) { + osic_Close(tty); + usleep(1000000UL); + opentty(); + *err = 1; + } +} /* end testtty() */ + + +static char GetNum(const char h[], uint32_t h_len, char eot, + uint32_t * p, uint32_t * n) +{ + *n = 0UL; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + return h[*p]==eot; +} /* end GetNum() */ + + +static void Parms(void) +{ + char err; + char h[1024]; + uint32_t i; + err = 0; + for (;;) { + osi_NextArg(h, 1024ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + if (h[1U]=='m' || h[1U]=='r') { + useaxudp = h[1U]=='r'; + osi_NextArg(h, 1024ul); + i = 0UL; + if (GetIp(h, 1024ul, &i, &ipnum, &toport)<0L) { + Error("-m or -r ip:port number", 24ul); + } + } + else if (h[1U]=='N') { + useaxudp = 1; + osi_NextArg(h, 1024ul); + i = 0UL; + if (GetIp(h, 1024ul, &i, &ipnum2, &toport2)<0L) { + Error("-N ip:port", 11ul); + } + } + else if (h[1U]=='a') withalti = 0; + else if (h[1U]=='u') usbrobust = 0; + else if (h[1U]=='k') withspeed = 0; + else if (h[1U]=='s') sumoff = 1; + else if (h[1U]=='D') withdao = 1; + else if (h[1U]=='I') { + osi_NextArg(mycall, 100ul); + if ((uint8_t)mycall[0U]<'0') Error("-I ", 12ul); + } + else if (h[1U]=='w') { + osi_NextArg(via, 100ul); + if ((uint8_t)via[0U]<=' ') { + Error("-m vias like RELAY,WIDE1-1", 27ul); + } + } + else if (h[1U]=='c') { + osi_NextArg(comment0, 100ul); + if (aprsstr_Length(comment0, 100ul)>40UL) { + Error("-c (max 40 byte)", 28ul); + } + } + else if (h[1U]=='i') { + osi_NextArg(h, 1024ul); + if ((uint8_t)h[0U]>' ' && (uint8_t)h[1U]>' ') { + symt = h[0U]; + symb = h[1U]; + } + else Error("-i (house /-)", 21ul); + } + else if (h[1U]=='t') { + osi_NextArg(h, 1024ul); + i = 0UL; + while ((h[i] && h[i]!=':') && i<1023UL) { + ttynamee[i] = h[i]; + ++i; + } + ttynamee[i] = 0; + if (h[i]) { + ++i; + if (!GetNum(h, 1024ul, 0, &i, &baud)) { + Error("need ttydevice:baud", 20ul); + } + } + } + else if (h[1U]=='b') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &btimedrive)) Error("-b ", 7ul); + } + else if (h[1U]=='0') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &btime0)) Error("-0 ", 7ul); + } + else if (h[1U]=='g') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &drivekm)) { + Error("-g ", 10ul); + } + } + else if (h[1U]=='l') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &comintval)) Error("-l ", 7ul); + } + else if (h[1U]=='f') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &comptyp) || comptyp>2UL) { + Error("-f 0=uncomp, 1=comp, 2=mic-e", 38ul); + } + } + else if (h[1U]=='d') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &micessid) || micessid>7UL) { + Error("-d 0..7", 15ul); + } + } + else if (h[1U]=='v') verb = 1; + else { + if (h[1U]=='h') { + osic_WrLn(); + osi_WrStrLn("Read serial GPS and make normal/compressed/mic-e \ +Beacon as AXUDP or monitor", 76ul); + osi_WrStrLn(" -0 standing Beaco\ +n Time in Seconds (180)", 73ul); + osi_WrStrLn(" -a altitude OFF", + 48ul); + osi_WrStrLn(" -b driving Beacon\ + Time in Seconds (15)", 71ul); + osi_WrStrLn(" -c APRS Comment (\ +max 40 char)", 62ul); + osi_WrStrLn(" insert time \ +hhmmss: \\\\h", 61ul); + osi_WrStrLn(" insert time \ +ddhhmm: \\\\z", 61ul); + osi_WrStrLn(" insert file \ + : \\\\:filename:", 70ul); + osi_WrStrLn(" insert \\\\ \ + : \\\\\\", 61ul); + osi_WrStrLn(" -d Destination Ca\ +ll SSID 0..7", 62ul); + osi_WrStrLn(" -D DAO Extension \ +on for 20cm Resolution", 72ul); + osi_WrStrLn(" -f format 0=norma\ +l 1=compressed 2=mic-e (0)", 76ul); + osi_WrStrLn(" -g min. Speed for\ + driving Beacon Time (4)", 74ul); + osi_WrStrLn(" -h this", 40ul); + osi_WrStrLn(" -I Mycall with SS\ +ID like NOCALL-15", 67ul); + osi_WrStrLn(" -i 2 Icon chars \\ +"/-\" (House), \"/>\" (Car)...(//)", 80ul); + osi_WrStrLn(" -k Speed/Course O\ +FF (not in mic-e)", 67ul); + osi_WrStrLn(" -l every n Beacon\ +s send one with Comment", 73ul); + osi_WrStrLn(" -m use Monitor UD\ +P format :port for localhost", 78ul); + osi_WrStrLn(" -N send Position \ +AXUDP every 2s eg. to aprsmap", 79ul); + osi_WrStrLn(" -r use AXUDP (to \ +Soundmodem)", 61ul); + osi_WrStrLn(" -s GPS Checksum c\ +heck OFF", 58ul); + osi_WrStrLn(" -t : (/dev/ttyS0:48\ +00)", 53ul); + osi_WrStrLn(" -u not retry unti\ +l open removable USB tty", 74ul); + osi_WrStrLn(" -v verbous", + 43ul); + osi_WrStrLn(" -w via Path like \ +RELAY,WIDE1-1", 63ul); + osic_WrLn(); + X2C_ABORT(); + } + err = 1; + } + } + else { + /* + h[0]:=0C; + */ + err = 1; + } + if (err) break; + } + if (comptyp==1UL && withdao) { + Error("DAO Option not with compressed Format", 38ul); + } + if (err) { + osi_WrStr(">", 2ul); + osi_WrStr(h, 1024ul); + osi_WrStrLn("< use -h", 9ul); + X2C_ABORT(); + } +} /* end Parms() */ + +/* +PROCEDURE Gencrctab; +CONST POLINOM=08408H; +VAR i,crc,c:CARDINAL; +BEGIN + FOR c:=0 TO 255 DO + crc:=255-c; + FOR i:=0 TO 7 DO + IF ODD(crc) THEN crc:=CAST(CARDINAL, CAST(BITSET, ASH(crc, + -1))/CAST(BITSET,POLINOM)) + ELSE crc:=ASH(crc, -1) END; + END; + CRCL[c]:=CAST(SET8, crc); + CRCH[c]:=CAST(SET8, 255 - ASH(crc, -8)); + END; +END Gencrctab; + + +PROCEDURE UDPCRC(frame-:ARRAY OF CHAR; size:INTEGER):CARDINAL; +VAR l,h:SET8; + b:CARD8; + i:INTEGER; +BEGIN + l:=SET8{}; + h:=SET8{}; + FOR i:=0 TO size-1 DO + b:=CAST(CARD8, CAST(SET8, frame[i]) / l); + l:=CRCL[b] / h; + h:=CRCH[b]; + END; + RETURN ORD(CAST(CHAR, l))+256*ORD(CAST(CHAR, h)) +END UDPCRC; +*/ + +static void sendudp(char buf[], uint32_t buf_len, int32_t len0, + uint32_t ip, uint32_t port) +{ + int32_t i; + /* crc:CARDINAL; */ + X2C_PCOPY((void **)&buf,buf_len); + i = udpsend(udpsock, buf, len0, port, ip); + X2C_PFREE(buf); +/*FOR i:=0 TO upos-2 DO IO.WrHex(ORD(buf[i]), 3) END; IO.WrLn; */ +} /* end sendudp() */ + + +static void skip(const char b[], uint32_t b_len, uint32_t * p, + uint32_t len0) +{ + while (*p='0') && (uint8_t)b[*p]<='9') { + *n = (uint32_t)(uint8_t)b[*p]-48UL; + ++*p; + return 1; + } + *n = 0UL; + return 0; +} /* end getnum() */ + +#define gps2aprs_MSYM "\\" + +#define gps2aprs_FILESYM ":" + + +static void beaconmacros(char s[], uint32_t s_len) +{ + uint32_t i; + int32_t j; + int32_t len0; + char ns[256]; + char ds[256]; + char fn[1024]; + int32_t f; + i = 0UL; + ns[0U] = 0; + while (i9UL) d += 7UL; + return (char)(d+48UL); +} /* end Hex() */ + + +static char checksum(const char b[], uint32_t b_len, + uint32_t len0) +{ + uint32_t i; + uint8_t cs; + char ok0; + ok0 = 1; + i = 1UL; + cs = 0U; + while (i=len0) ok0 = 0; + if (ok0) { + if (b[i+1UL]!=Hex((uint32_t)cs/16UL) || b[i+2UL]!=Hex((uint32_t) + cs&15UL)) ok0 = 0; + } + if (verb && !ok0) osi_WrStrLn("GPS Checksum Error", 19ul); + return ok0; +} /* end checksum() */ + + +static void showline(const char b[], uint32_t b_len, uint32_t len0) +{ + uint32_t i; + i = 0UL; + while (iAPERXQ,RELAY,WIDE2-2:!4805.44N/01333.64E>325/016/A=001824 */ + b[0] = 0; + aprsstr_Append(b, 201ul, mycall, 100ul); + micdest = aprsstr_Length(b, 201ul)+1UL; + if (local) aprsstr_Append(b, 201ul, ">NOGATE", 8ul); + else { + aprsstr_Append(b, 201ul, ">APLT01", 8ul); + if (micessid>0UL) { + aprsstr_Append(b, 201ul, "-", 2ul); + aprsstr_Append(b, 201ul, + (char *)(tmp = (char)(micessid+48UL),&tmp), 1u/1u); + } + if (via[0U]) { + aprsstr_Append(b, 201ul, ",", 2ul); + aprsstr_Append(b, 201ul, via, 100ul); + } + } + if (comp0==0UL) { + /* uncompressed */ + aprsstr_Append(b, 201ul, ":!", 3ul); + i = aprsstr_Length(b, 201ul); + a = fabs(lat0); + n = truncc(a); + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + n = truncc((a-(double)(float)n)*6000.0); + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = '.'; + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + if (lat0>=0.0) b[i] = 'N'; + else b[i] = 'S'; + ++i; + b[i] = symt; + ++i; + a = fabs(long1); + n = truncc(a); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + n = truncc((a-(double)(float)n)*6000.0); + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = '.'; + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + if (lat0>=0.0) b[i] = 'E'; + else b[i] = 'W'; + ++i; + b[i] = symb; + ++i; + if (withspd) { + n = truncc(course0+1.5); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + b[i] = '/'; + ++i; + n = truncc(speed0*5.3996146834962E-1+0.5); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + if (withalt) { + b[i] = '/'; + ++i; + b[i] = 'A'; + ++i; + b[i] = '='; + ++i; + n = truncc(fabs(alt0*3.2808398950131+0.5)); + if (alt0>=0.0) b[i] = num(n/100000UL); + else b[i] = '-'; + ++i; + b[i] = num(n/10000UL); + ++i; + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + } + else if (comp0==1UL) { + /* compressed */ + aprsstr_Append(b, 201ul, ":!", 3ul); + i = aprsstr_Length(b, 201ul); + b[i] = symt; + ++i; + if (lat0<90.0) n = truncc((90.0-lat0)*3.80926E+5); + else n = 0UL; + b[i] = (char)(33UL+n/753571UL); + ++i; + b[i] = (char)(33UL+(n/8281UL)%91UL); + ++i; + b[i] = (char)(33UL+(n/91UL)%91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + if (long1>(-180.0)) { + n = truncc((180.0+long1)*1.90463E+5); + } + else n = 0UL; + b[i] = (char)(33UL+n/753571UL); + ++i; + b[i] = (char)(33UL+(n/8281UL)%91UL); + ++i; + b[i] = (char)(33UL+(n/91UL)%91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + b[i] = symb; + ++i; + if (withspd) { + b[i] = (char)(33UL+truncc(course0)/4UL); + ++i; + b[i] = (char)(33UL+truncc((double)(osic_ln((float) + (speed0*5.3996146834962E-1+1.0))*1.29935872129E+1f))); + ++i; + b[i] = '_'; + ++i; + } + else if (withalt) { + if (alt0*3.2808398950131>1.0) { + n = truncc((double)(osic_ln((float) + (alt0*3.2808398950131))*500.5f)); + } + else n = 0UL; + if (n>=8281UL) n = 8280UL; + b[i] = (char)(33UL+n/91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + b[i] = 'W'; + ++i; + } + else { + b[i] = ' '; + ++i; + b[i] = ' '; + ++i; + b[i] = '_'; + ++i; + } + if (withspeed && withalt) { + b[i] = '/'; + ++i; + b[i] = 'A'; + ++i; + b[i] = '='; + ++i; + n = truncc(alt0*3.2808398950131+0.5); + if (alt0>=0.0) b[i] = num(n/10000UL); + else b[i] = '-'; + ++i; + b[i] = num(n/10000UL); + ++i; + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + } + else if (comp0==2UL) { + /* mic-e */ + aprsstr_Append(b, 201ul, ":`", 3ul); + i = micdest; + nl = truncc(fabs(long1)); + n = truncc(fabs(lat0)); + b[i] = (char)(80UL+n/10UL); + ++i; + b[i] = (char)(80UL+n%10UL); + ++i; + n = truncc((fabs(lat0)-(double)(float)n)*6000.0); + b[i] = (char)(80UL+n/1000UL); + ++i; + b[i] = (char)(48UL+32UL*(uint32_t)(lat0>=0.0)+(n/100UL)%10UL); + ++i; + b[i] = (char)(48UL+32UL*(uint32_t)(nl<10UL || nl>=100UL)+(n/10UL) + %10UL); + ++i; + b[i] = (char)(48UL+32UL*(uint32_t)(long1<0.0)+n%10UL); + i = aprsstr_Length(b, 201ul); + if (nl<10UL) b[i] = (char)(nl+118UL); + else if (nl>=100UL) { + if (nl<110UL) b[i] = (char)(nl+8UL); + else b[i] = (char)(nl-72UL); + } + else b[i] = (char)(nl+28UL); + ++i; + nl = truncc((fabs(long1)-(double)(float)nl)*6000.0); + /* long min*100 */ + n = nl/100UL; + if (n<10UL) n += 60UL; + b[i] = (char)(n+28UL); + ++i; + b[i] = (char)(nl%100UL+28UL); + ++i; + n = truncc(speed0*5.3996146834962E-1+0.5); + b[i] = (char)(n/10UL+28UL); + ++i; + nl = truncc(course0); + b[i] = (char)(32UL+(n%10UL)*10UL+nl/100UL); + ++i; + b[i] = (char)(28UL+nl%100UL); + ++i; + b[i] = symb; + ++i; + b[i] = symt; + ++i; + if (withalt) { + if (alt0>(-1.E+4)) { + n = truncc(alt0+10000.5); + } + else n = 0UL; + b[i] = (char)(33UL+(n/8281UL)%91UL); + ++i; + b[i] = (char)(33UL+(n/91UL)%91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + b[i] = '}'; + ++i; + } + } + if (dao) { + b[i] = '!'; + ++i; + b[i] = 'w'; + ++i; + b[i] = (char)(33UL+dao91(lat0)); + ++i; + b[i] = (char)(33UL+dao91(long1)); + ++i; + b[i] = '!'; + ++i; + } + b[i] = 0; + if (com) { + beaconmacros(comm, comm_len); + aprsstr_Append(b, 201ul, comm, comm_len); + } + /* Append(b, CR+LF); */ + if (aprsstr_Length(mycall, 100ul)>=3UL) { + if (useaxudp) { + aprsstr_mon2raw(b, 201ul, raw, 361ul, &rp0); + if (rp0>0L) sendudp(raw, 361ul, rp0, ip, port); + } + else { + sendudp(b, 201ul, (int32_t)(aprsstr_Length(b, 201ul)+1UL), ip, + port); + } + } + if (verb) { + osic_WrFixed((float)lat0, 6L, 10UL); + osic_WrFixed((float)long1, 6L, 10UL); + osic_WrFixed((float)speed0, 1L, 10UL); + osi_WrStr("km/h", 5ul); + osic_WrFixed((float)course0, 1L, 7UL); + osi_WrStr("deg", 4ul); + osic_WrFixed((float)alt0, 1L, 10UL); + osi_WrStrLn("m", 2ul); + osi_WrStrLn(b, 201ul); + } + X2C_PFREE(comm); +} /* end sendaprs() */ + +static char c; + +static int32_t len; + +static int32_t rp; + +static uint32_t gpsp; + +static char gpsb[100]; + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + int32_t tmp; + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + aprsstr_BEGIN(); + osi_BEGIN(); + sumoff = 0; + anyip = 1; + junk = 1; + posok = 0; + altok = 0; + verb = 0; + usbrobust = 1; + baud = 4800UL; + strncpy(ttynamee,"/dev/ttyS0",1024u); + udpsock = -1L; + gpsp = 0UL; + mycall[0U] = 0; + via[0U] = 0; + comment0[0U] = 0; + symt = '/'; + symb = '/'; + comptyp = 0UL; + withalti = 1; + withspeed = 1; + withdao = 0; + micessid = 0UL; + btime0 = 180UL; + btimedrive = 15UL; + drivekm = 4UL; + btimeN = 0UL; + comintval = 5UL; + comcnt = 0UL; + btime = 0UL; + msgtyp = 6UL; + toport = 9002UL; + ipnum = 2130706433UL; + toport2 = 0UL; + ipnum2 = 0UL; + useaxudp = 1; + Parms(); + if (aprsstr_Length(mycall, 100ul)<3UL) { + osi_WrStrLn("no tx witout ", 22ul); + } + /*Gencrctab; */ + opentty(); + udpsock = openudp(); + if (udpsock<0L) Error("cannot open udp socket", 23ul); + for (;;) { + fdclr(); + fdsetr((uint32_t)tty); + /* fdsetr(udpsock); */ + if (selectr(0UL, 0UL)>=0L) { + if (issetr((uint32_t)tty)) { + len = osi_RdBin(tty, (char *)tbuf, 1024u/1u, 1024UL); + testtty(len, &junk); + if (!junk) { + tmp = len-1L; + rp = 0L; + if (rp<=tmp) for (;; rp++) { + c = tbuf[rp]; + if (c=='\015' || c=='\012') { + if (gpsp>0UL) { + if (sumoff || checksum(gpsb, 100ul, gpsp)) { + decodeline(gpsb, 100ul, gpsp); + } + else { + altok = 0; + posok = 0; + } + if (verb) showline(gpsb, 100ul, gpsp); + if (posok) { + ++btime; + if (truncc(speed)>drivekm) { + if (btime>=btimedrive) { + btime = 0UL; + } + } + else if (btime>btime0) btime = 0UL; + if (btime==0UL) { + sendaprs(lat, long0, alt, course, speed, + comptyp, withspeed, withalti && altok, withdao, comcnt==0UL, + comment0, 100ul, 0, ipnum, toport); + ++comcnt; + if (comcnt>=comintval) { + comcnt = 0UL; + } + } + if (toport2>0UL) { + /* second (fast) beacon to map */ + ++btimeN; + if (btimeN>=2UL) { + sendaprs(lat, long0, alt, course, speed, + 0UL, 1, altok, 1, 0, "", 1ul, 1, ipnum2, toport2); + btimeN = 0UL; + } + } + altok = 0; + posok = 0; + } + } + gpsp = 0UL; + } + else if ((uint8_t)c>' ' && gpsp<99UL) { + gpsb[gpsp] = c; + ++gpsp; + } + if (rp==tmp) break; + } /* end for */ + } + junk = 0; + } + } + } +/* ELSIF issetr(udpsock) THEN */ +/* len:=getudp(udpsock, ubuf, ipnum, anyip); */ + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/gps2digipos.c b/src/gps2digipos.c new file mode 100644 index 0000000..470a266 --- /dev/null +++ b/src/gps2digipos.c @@ -0,0 +1,856 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define gps2digipos_C_ +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif + +/* read serial gps and make "3704.04N/00805.14W" string to file */ +#define gps2digipos_CR "\015" + +#define gps2digipos_LF "\012" + +#define gps2digipos_FEET 3.2808398950131 + +#define gps2digipos_KNOTS 1.851984 + +#define gps2digipos_PI 3.1415926535898 + +static char tbuf[1024]; + +static char ttynamee[1024]; + +static char basefilename[1024]; +/* symt, symb:CHAR; */ + +static uint32_t baud; + +static int32_t tty; + +static char verb; + +static char usbrobust; + +static char junk; + +static char sumoff; + +static char withalti; + +static uint32_t comptyp; + +static uint32_t comintval; + +static uint32_t comcnt; + +static uint32_t mediantime; + +static uint32_t medians; + +static struct termios saved; + +static double speed; + +static double course; + +static double lat; + +static double long0; + +static double alt; + +static char altok; + +static char posok; + +struct _0; + + +struct _0 { + double mlat; + double mlong; + double malt; + char ok0; +}; + +static struct _0 median[500]; + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr("agps2digipos: ", 15ul); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + + +static uint32_t truncc(double r) +{ + if (r<=0.0) return 0UL; + else if (r>=2.147483647E+9) return 2147483647UL; + else return (uint32_t)X2C_TRUNCC(r,0UL,X2C_max_longcard); + return 0; +} /* end truncc() */ + + +static char SetStatLine(int32_t fd, char rts, + char dtr) +{ + uint32_t arg[256]; + int32_t r; + arg[0U] = 4UL; + if (rts) r = ioctl(fd, 21526L, (char *)arg); + else r = ioctl(fd, 21527L, (char *)arg); + if (r>=0L) { + arg[0U] = 2UL; + if (dtr) r = ioctl(fd, 21526L, (char *)arg); + else r = ioctl(fd, 21527L, (char *)arg); + } + return r>=0L; +} /* end SetStatLine() */ + + +static void SetComMode(int32_t fd, uint32_t baud0) +{ + struct termios term; + int32_t res; + uint32_t bd; + struct termios * anonym; + if (baud0==1200UL) bd = 9UL; + else if (baud0==2400UL) bd = 11UL; + else if (baud0==4800UL) bd = 12UL; + else if (baud0==9600UL) bd = 13UL; + else if (baud0==19200UL) bd = 14UL; + else if (baud0==38400UL) bd = 15UL; + else if (baud0==57600UL) bd = 4097UL; + else if (baud0==115200UL) bd = 4098UL; + else if (baud0==230400UL) bd = 4099UL; + else if (baud0==460800UL) bd = 4100UL; + else Error("unknown baudrate", 17ul); + res = tcgetattr(fd, &saved); + res = tcgetattr(fd, &term); + { /* with */ + struct termios * anonym = &term; + anonym->c_lflag = 0UL; + anonym->c_oflag = 0UL; + anonym->c_iflag = 0UL; + /* cfmakeraw(&termios);*/ + anonym->c_cflag = 2224UL+bd; /*+CRTSCTS*/ /*0800018B2H*/ + } + res = tcsetattr(fd, 2L, &term); +} /* end SetComMode() */ + + +static void opentty(void) +{ + for (;;) { + tty = osi_OpenRW(ttynamee, 1024ul); + if (tty>=0L) { + SetComMode(tty, baud); + break; + } + if (!usbrobust) Error("tty open", 9ul); + usleep(1000000UL); + } + SetStatLine(tty, 0, 0); +} /* end opentty() */ + + +static char GetNum(const char h[], uint32_t h_len, char eot, + uint32_t * p, uint32_t * n) +{ + *n = 0UL; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + return h[*p]==eot; +} /* end GetNum() */ + + +static void Parms(void) +{ + char err; + char h[1024]; + uint32_t i; + err = 0; + for (;;) { + osi_NextArg(h, 1024ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + if (h[1U]=='u') usbrobust = 0; + else if (h[1U]=='s') sumoff = 1; + else if (h[1U]=='a') withalti = 1; + else if (h[1U]=='f') { + /* + ELSIF h[1]="i" THEN + NextArg(h); + IF h[0]>" " THEN + symt:=h[0]; + IF h[1]>" " THEN symb:=h[1] ELSE symb:=0C END; + ELSE Error("-i (house /-)") END; + */ + osi_NextArg(basefilename, 1024ul); + if (basefilename[0U]==0) Error("-f filename", 12ul); + } + else if (h[1U]=='t') { + osi_NextArg(h, 1024ul); + i = 0UL; + while ((h[i] && h[i]!=':') && i<1023UL) { + ttynamee[i] = h[i]; + ++i; + } + ttynamee[i] = 0; + if (h[i]) { + ++i; + if (!GetNum(h, 1024ul, 0, &i, &baud)) { + Error("need ttydevice:baud", 20ul); + } + } + } + else if (h[1U]=='m') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &mediantime)) { + Error("-m ", 13ul); + } + if (mediantime>499UL) { + aprsstr_IntToStr(499L, 1UL, h, 1024ul); + aprsstr_Append(h, 1024ul, " maximum -m", 12ul); + Error(h, 1024ul); + } + } + else if (h[1U]=='f') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &comptyp) || comptyp>2UL) { + Error("-f 0=uncomp, 1=comp, 2=mic-e", 38ul); + } + } + else if (h[1U]=='v') verb = 1; + else { + if (h[1U]=='h') { + osic_WrLn(); + osi_WrStrLn("Read serial GPS and make position string to inser\ +t into APRS-beacon", 68ul); + osi_WrStrLn(" -a altitude on", + 47ul); + osi_WrStrLn(" -f writes and ", 80ul); + osi_WrStrLn(" -h this", 40ul); + /* WrStrLn(' + -i 2 Icon chars "/-" (House), + "/>" (Car)...'); */ + osi_WrStrLn(" -m time to read g\ +ps to make median position", 76ul); + osi_WrStrLn(" -s GPS Checksum c\ +heck OFF", 58ul); + osi_WrStrLn(" -t : default /dev/t\ +tyS0:9600", 59ul); + osi_WrStrLn(" -u not retry unti\ +l open removable USB tty", 74ul); + osi_WrStrLn(" -v verbous", + 43ul); + osi_WrStrLn(" example: -t /dev/ttyS0:9600 -u -f test -i \"/-\\ +" -a -m 30 -v", 61ul); + osic_WrLn(); + X2C_ABORT(); + } + err = 1; + } + } + else { + /* + h[0]:=0C; + */ + err = 1; + } + if (err) break; + } + if (err) { + osi_WrStr(">", 2ul); + osi_WrStr(h, 1024ul); + osi_WrStrLn("< use -h", 9ul); + X2C_ABORT(); + } +} /* end Parms() */ + + +static void skip(const char b[], uint32_t b_len, uint32_t * p, + uint32_t len0) +{ + while (*p='0') && (uint8_t)b[*p]<='9') { + *n = (uint32_t)(uint8_t)b[*p]-48UL; + ++*p; + return 1; + } + *n = 0UL; + return 0; +} /* end getnum() */ + + +static void decodeline(const char b[], uint32_t b_len, + uint32_t len0) +{ + uint32_t n; + uint32_t i; + double div0; + char sign; + if ((b[0UL]=='$' && b[1UL]=='G') && b[2UL]=='P') { + if ((b[3UL]=='R' && b[4UL]=='M') && b[5UL]=='C') { + /* $GPRMC,141333.593,A,8915.1000,N,01300.2000,E,0.00,00.00,140410,0, + ,A*7C */ + /* $GPRMC,112430.00,A,8912.41130,N,01300.61995,E,0.039,,200513,,, + A*77 */ + i = 7UL; + skip(b, b_len, &i, len0); + if (b[i]!='A') return; + skip(b, b_len, &i, len0); + if (getnum(b, b_len, &i, len0, &n)) { + lat = (double)(float)(n*10UL); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + lat = lat+(double)(float)n; + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + lat = lat+(double)(X2C_DIVR((float)n,6.0f)); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + lat = lat+(double)(X2C_DIVR((float)n,60.0f)); + } + else return; + if (b[i]=='.') ++i; + else return; + if (getnum(b, b_len, &i, len0, &n)) { + lat = lat+(double)(X2C_DIVR((float)n,600.0f)); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + lat = lat+(double)(X2C_DIVR((float)n,6000.0f)); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + lat = lat+(double)(X2C_DIVR((float)n,60000.0f)); + } + if (getnum(b, b_len, &i, len0, &n)) { + lat = lat+(double)(X2C_DIVR((float)n,6.E+5f)); + } + skip(b, b_len, &i, len0); + if (b[i]=='S') lat = -lat; + else if (b[i]!='N') return; + skip(b, b_len, &i, len0); + if (getnum(b, b_len, &i, len0, &n)) { + long0 = (double)(float)(n*100UL); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(float)(n*10UL); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(float)n; + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(X2C_DIVR((float)n,6.0f)); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(X2C_DIVR((float)n,60.0f)); + } + else return; + if (b[i]=='.') ++i; + else return; + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(X2C_DIVR((float)n,600.0f)); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(X2C_DIVR((float)n,6000.0f)); + } + else return; + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(X2C_DIVR((float)n,60000.0f)); + } + if (getnum(b, b_len, &i, len0, &n)) { + long0 = long0+(double)(X2C_DIVR((float)n,6.E+5f)); + } + skip(b, b_len, &i, len0); + if (b[i]=='W') long0 = -long0; + else if (b[i]!='E') return; + skip(b, b_len, &i, len0); + speed = 0.0; + while (getnum(b, b_len, &i, len0, &n)) { + speed = speed*10.0+(double)(float)n; + } + if (b[i]=='.') { + ++i; + div0 = 0.1; + while (getnum(b, b_len, &i, len0, &n)) { + speed = speed+(double)(float)n*div0; + div0 = div0*0.1; + } + } + speed = speed*1.851984; /* knots to km/h */ + skip(b, b_len, &i, len0); + course = 0.0; + while (getnum(b, b_len, &i, len0, &n)) { + course = course*10.0+(double)(float)n; + } + if (b[i]=='.') { + ++i; + div0 = 0.1; + while (getnum(b, b_len, &i, len0, &n)) { + course = course+(double)(float)n*div0; + div0 = div0*0.1; + } + } + posok = 1; + } + else if ((b[3UL]=='G' && b[4UL]=='G') && b[5UL]=='A') { + /* $GPGGA,152554,3938.5665,N,10346.2039,W,1,08,1.7,12382.7,M,-22.3, + M,,*7B */ + /* $GPGGA,112435.00,4812.41112,N,01305.61998,E,1,08,1.04,398.3,M, + 44.9,M,,*59 */ + i = 7UL; + skip(b, b_len, &i, len0); + skip(b, b_len, &i, len0); + skip(b, b_len, &i, len0); + skip(b, b_len, &i, len0); + skip(b, b_len, &i, len0); + skip(b, b_len, &i, len0); + skip(b, b_len, &i, len0); + skip(b, b_len, &i, len0); + alt = 0.0; + if (b[i]=='-') { + sign = 1; + ++i; + } + else sign = 0; + while (getnum(b, b_len, &i, len0, &n)) { + altok = 1; + alt = alt*10.0+(double)(float)n; + } + if (b[i]=='.') { + ++i; + div0 = 0.1; + while (getnum(b, b_len, &i, len0, &n)) { + alt = alt+(double)(float)n*div0; + div0 = div0*0.1; + } + } + if (sign) alt = -alt; + } + } +} /* end decodeline() */ + + +static char Hex(uint32_t d) +{ + d = d&15UL; + if (d>9UL) d += 7UL; + return (char)(d+48UL); +} /* end Hex() */ + + +static char checksum(const char b[], uint32_t b_len, + uint32_t len0) +{ + uint32_t i; + uint8_t cs; + char ok0; + ok0 = 1; + i = 1UL; + cs = 0U; + while (i=len0) ok0 = 0; + if (ok0) { + if (b[i+1UL]!=Hex((uint32_t)cs/16UL) || b[i+2UL]!=Hex((uint32_t) + cs&15UL)) ok0 = 0; + } + if (verb && !ok0) osi_WrStrLn("GPS Checksum Error", 19ul); + return ok0; +} /* end checksum() */ + + +static void showline(const char b[], uint32_t b_len, uint32_t len0) +{ + uint32_t i; + i = 0UL; + while (i=0L) { + if (len0>0UL) osi_WrBin(f, (char *)b, (b_len)/1u, len0); + osic_Close(f); + } + X2C_PFREE(b); + X2C_PFREE(ext); +} /* end wrfile() */ + + +static char num(uint32_t n) +{ + return (char)(n%10UL+48UL); +} /* end num() */ + + +static void wrpos(double lat0, double long1, double alt0, + char withalt) +{ + char b[201]; + uint32_t n; + uint32_t i; + double a; + /* "4805.44N" "01333.64E" "/A=000000"*/ + i = 0UL; + a = fabs(lat0); + n = truncc(a); + b[0U] = num(n/10UL); + ++i; + b[1U] = num(n); + ++i; + n = truncc((a-(double)(float)n)*6000.0); + b[2U] = num(n/1000UL); + ++i; + b[3U] = num(n/100UL); + ++i; + b[4U] = '.'; + ++i; + b[5U] = num(n/10UL); + ++i; + b[6U] = num(n); + ++i; + if (lat0>=0.0) b[7U] = 'N'; + else b[7U] = 'S'; + ++i; + /* b[i]:=symt; INC(i); */ + wrfile(b, 201ul, 8UL, ".lat", 5ul); + i = 0UL; + a = fabs(long1); + n = truncc(a); + b[0U] = num(n/100UL); + ++i; + b[1U] = num(n/10UL); + ++i; + b[2U] = num(n); + ++i; + n = truncc((a-(double)(float)n)*6000.0); + b[3U] = num(n/1000UL); + ++i; + b[4U] = num(n/100UL); + ++i; + b[5U] = '.'; + ++i; + b[6U] = num(n/10UL); + ++i; + b[7U] = num(n); + ++i; + if (lat0>=0.0) b[8U] = 'E'; + else b[8U] = 'W'; + ++i; + /* IF symb>" " THEN b[i]:=symb; INC(i) END; */ + wrfile(b, 201ul, 9UL, ".long", 6ul); + if (withalt) { + i = 0UL; + if (alt0>0.0) { + b[0U] = '/'; + ++i; + b[1U] = 'A'; + ++i; + b[2U] = '='; + ++i; + n = truncc(fabs(alt0*3.2808398950131+0.5)); + if (alt0>=0.0) b[3U] = num(n/100000UL); + else b[3U] = '-'; + ++i; + b[4U] = num(n/10000UL); + ++i; + b[5U] = num(n/1000UL); + ++i; + b[6U] = num(n/100UL); + ++i; + b[7U] = num(n/10UL); + ++i; + b[8U] = num(n); + ++i; + } + wrfile(b, 201ul, i, ".alt", 5ul); + } +} /* end wrpos() */ + + +static void medianpos(double lat0, double long1, + double alt0) +{ + struct _0 * anonym; + if (medians<=499UL) { + { /* with */ + struct _0 * anonym = &median[medians]; + anonym->mlat = lat0; + anonym->mlong = long1; + anonym->malt = alt0; + } + ++medians; + } +} /* end medianpos() */ + + +static void getmedian(double * lat0, double * long1, + double * alt0) +{ + uint32_t by; + uint32_t ay; + uint32_t bx; + uint32_t ax; + uint32_t j; + uint32_t i; + double maxy; + double miny; + double maxx; + double minx; + struct _0 * anonym; + struct _0 * anonym0; + struct _0 * anonym1; + uint32_t tmp; + if (medians==0UL) Error("no positions got", 17ul); + j = medians/10UL; + tmp = medians-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + median[i].ok0 = 1; + if (i==tmp) break; + } /* end for */ + for (;;) { + /* kill extrem values */ + minx = (double)X2C_max_real; + maxx = (double)X2C_min_real; + ax = 0UL; + bx = 0UL; + miny = (double)X2C_max_real; + maxy = (double)X2C_min_real; + ay = 0UL; + by = 0UL; + j = 0UL; + tmp = medians-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if (median[i].ok0) { + { /* with */ + struct _0 * anonym = &median[i]; + if (anonym->mlatmlat; + ax = i; + } + if (anonym->mlat>maxx) { + maxx = anonym->mlat; + bx = i; + } + if (anonym->mlongmlong; + ay = i; + } + if (anonym->mlong>maxy) { + maxy = anonym->mlong; + by = i; + } + } + ++j; + } + if (i==tmp) break; + } /* end for */ + if (j<=medians/2UL+5UL) break; + median[ax].ok0 = 0; + median[bx].ok0 = 0; + median[ay].ok0 = 0; + median[by].ok0 = 0; + } + j = 0UL; + *lat0 = 0.0; + *long1 = 0.0; + *alt0 = 0.0; + if (verb) { + osi_WrStrLn(" lat long alt ok", 45ul); + } + tmp = medians-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + /* make mean valus */ + if (median[i].ok0) { + { /* with */ + struct _0 * anonym0 = &median[i]; + *lat0 = *lat0+anonym0->mlat; + *long1 = *long1+anonym0->mlong; + *alt0 = *alt0+anonym0->malt; + ++j; + } + } + if (verb) { + { /* with */ + struct _0 * anonym1 = &median[i]; + osic_WrFixed((float)anonym1->mlat, 8L, 14UL); + osic_WrFixed((float)anonym1->mlong, 8L, 14UL); + osic_WrFixed((float)anonym1->malt, 1L, 14UL); + osic_WrINT32((uint32_t)anonym1->ok0, 2UL); + osi_WrStrLn("", 1ul); + } + } + if (i==tmp) break; + } /* end for */ + if (j==0UL) Error("no positions got", 17ul); + *lat0 = X2C_DIVL(*lat0,(double)j); + *long1 = X2C_DIVL(*long1,(double)j); + *alt0 = X2C_DIVL(*alt0,(double)j); +} /* end getmedian() */ + +static char c; + +static int32_t len; + +static int32_t rp; + +static uint32_t gpsp; + +static char gpsb[100]; + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + int32_t tmp; + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + aprsstr_BEGIN(); + osi_BEGIN(); + sumoff = 0; + junk = 1; + posok = 0; + altok = 0; + verb = 0; + usbrobust = 1; + medians = 0UL; + mediantime = 30UL; + baud = 9600UL; + strncpy(ttynamee,"/dev/ttyS0",1024u); + strncpy(basefilename,"gpspos",1024u); + gpsp = 0UL; + /* symt:="/"; */ + /* symb:="U"; */ + comptyp = 0UL; + withalti = 0; + comintval = 5UL; + comcnt = 0UL; + Parms(); + opentty(); + for (;;) { + len = osi_RdBin(tty, (char *)tbuf, 1024u/1u, 1024UL); + if (len<=0L) { + osic_Close(tty); + usleep(1000000UL); + opentty(); + junk = 1; + } + if (!junk) { + tmp = len-1L; + rp = 0L; + if (rp<=tmp) for (;; rp++) { + c = tbuf[rp]; + if (c=='\015' || c=='\012') { + if (gpsp>0UL) { + if (sumoff || checksum(gpsb, 100ul, gpsp)) { + decodeline(gpsb, 100ul, gpsp); + } + else { + altok = 0; + posok = 0; + } + if (verb) showline(gpsb, 100ul, gpsp); + if (posok && (altok || !withalti)) { + medianpos(lat, long0, alt); + if (mediantime>0UL) { + --mediantime; + if (verb) { + osic_WrINT32(mediantime, 4UL); + osi_WrStrLn(" mediantime", 12ul); + } + } + else { + getmedian(&lat, &long0, &alt); + wrpos(lat, long0, alt, withalti && altok); + goto loop_exit; + } + altok = 0; + posok = 0; + } + } + gpsp = 0UL; + } + else if ((uint8_t)c>' ' && gpsp<99UL) { + gpsb[gpsp] = c; + ++gpsp; + } + if (rp==tmp) break; + } /* end for */ + } + junk = 0; + } + loop_exit:; + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/gpspos.c b/src/gpspos.c new file mode 100644 index 0000000..3b1db17 --- /dev/null +++ b/src/gpspos.c @@ -0,0 +1,1520 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef gpspos_H_ +#include "gpspos.h" +#endif +#define gpspos_C_ +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#include +#include "sem.h" +#include "yuma.h" +#include "rinex.h" +#include "gps.h" +#include "navigation.h" +#include "geodesy.h" +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif + + + +/* decode weather sonde gps data to position by oe5dxl */ +/*SEM_structAlmanac,*/ +/*YUMA_structAlmanac,*/ +/*GPS_structEphemeris,*/ +/*FROM TimeConv IMPORT time; */ +#define gpspos_LIGHT 2.99792458E+8 + +#define gpspos_FREQ 1.57542E+9 + +#define gpspos_PI 3.1415926535898 + +#define gpspos_RAD 1.7453292519943E-2 + +#define gpspos_PRM 2.8618384385692E-1 + +#define gpspos_TESTDIL 50.0 +/* shift sat to test influence to position */ + +#define gpspos_WAVLEN 1.9029367279836E-1 + +#define gpspos_MAXSPEED 500 + +#define gpspos_SECONDSINWEEK 604800 + +struct SATPOS; + + +struct SATPOS { + char ok0; + double x; + double y; + double z; + double clk; + double azimuth0; + double elevation; + double ionocorr; + double range; + double doppler; + double hdil; + double vdil; +}; + +typedef struct SATPOS SATPOSES[32]; + +struct RESULTS; + + +struct RESULTS { + double lat; + double long0; + double heig; + double hd[4]; /* h and v dilatation per sat */ + double vd[4]; + double dlat[4]; + double dlong[4]; + double dheig[4]; + double qsumv; + double qsumh; + uint16_t satset; + uint16_t res; +}; + +struct COMMONALMANACH; + + +struct COMMONALMANACH { + uint32_t treal; + uint32_t toa; /* almanac time of applicability (reference time [s]*/ + uint16_t week; /* 10 bit gps week 0-1023 (user must account for week rollover) [week]*/ + uint16_t prn; /* GPS prn number */ + uint16_t reserved; /* reserved */ + uint16_t svn; /* Satellite vehicle number */ + uint8_t ura; /* User Range Accuracy lookup code, [0-15], see p. 83 GPSICD200C, 0 is*/ + uint8_t health; /* 0=healthy, unhealthy otherwise [], subframe 4 and 5, page 25 six-b*/ + uint8_t config_code; /* configuration code [], if >=9 Anti-Spoofing is on */ + /* this inicator is not part of the SEM standard but is added by the user if known */ + char is_af0_af1_high_precision; + /* indicates precision of af0 and af1 [1=high precision, + 0=lo*/ + double ecc; /* eccentricity */ + double i0; /* orbital inclination at reference time [rad] */ + double omegadot; /* rate of right ascension [rad/s] */ + double sqrta; /* square root of the semi-major axis [m^(1/2)]*/ + double omega0; /* longitude of ascending node of orbit plane at weekly epoch [rad] */ + double w; /* argument of perigee [rad] */ + double m0; /* mean anomaly at reference time [rad] */ + double af0; /* polynomial clock correction coefficient (clock bias) [s], Note: pa*/ + double af1; + double af2; /* polynomial clock correction coefficient (clock drift) [s/s], Note: pa*/ + uint32_t toe; /* reference time ephemeris (0-604800) */ + uint32_t toc; /* reference time (clock) (0-604800) */ + uint16_t iodc; /* 10 bit issue of data (clock) */ + char iode; /* 8 bit issue of data (ephemeris) */ + char alert_flag; /* 1 = URA may be worse than indicated */ + char anti_spoof; /* anti-spoof flag from 0=off, 1=on */ + char code_on_L2; /* 0=reserved, 1=P code on L2, 2=C/A on L2 */ + char L2_P_data_flag; /* flag indicating if P is on L2 1=true */ + char fit_interval_flag; /* fit interval flag (four hour interval or longer) 0=4 fours */ + uint16_t age_of_data_offset; /* age of data offset */ + uint16_t tow_week; /* The week corresponding to tow (0-1024+). Can be one week l */ + uint32_t tow; /* The time of week derived formt the Z-count in the Hand Ove */ + /* clock parameters */ + double tgd; /* group delay */ + /* ephemeris parameters */ + double delta_n; /* mean motion difference from computed value */ + double idot; /* rate of inclination angle */ + double cuc; /* amplitude of the cosine harmonic correction term to the argument o */ + double cus; /* amplitude of the sine harmonic correction term to the argument of */ + double crc; /* amplitude of the cosine harmonic correction term to the orbit radi */ + double crs; /* amplitude of the sine harmonic correction term to the orbit radius */ + double cic; /* amplitude of the cosine harmonic correction term to the angle of i */ + double cis; /* amplitude of the sine harmonic correction term to the angle of inc */ +}; + +struct structEphemeris; + + +struct structEphemeris { + uint32_t toe; /* reference time ephemeris (0-604800) */ + uint32_t toc; /* reference time (clock) (0-604800) */ + uint16_t prn; /* GPS PRN number */ + uint16_t week; /* 10 bit gps week 0-1023 (user must account for week rollove */ + uint16_t iodc; /* 10 bit issue of data (clock) */ + uint16_t reserved1; /* reserved bytes */ + char iode; /* 8 bit issue of data (ephemeris) */ + char health; /* 6 bit health parameter, 0 if healthy, unhealth othersize */ + char alert_flag; /* 1 = URA may be worse than indicated */ + char anti_spoof; /* anti-spoof flag from 0=off, 1=on */ + char code_on_L2; /* 0=reserved, 1=P code on L2, 2=C/A on L2 */ + char L2_P_data_flag; /* flag indicating if P is on L2 1=true */ + char fit_interval_flag; /* fit interval flag (four hour interval or longer) 0=4 fours */ + char ura; /* User Range Accuracy lookup code, 0 is excellent, 15 is use */ + uint16_t age_of_data_offset; /* age of data offset */ + uint16_t tow_week; /* The week corresponding to tow (0-1024+). Can be one week l */ + uint32_t tow; /* The time of week derived formt the Z-count in the Hand Ove */ + /* clock parameters */ + double tgd; /* group delay */ + double af2; /* polynomial clock correction coefficient (rate of clock drift) */ + double af1; /* polynomial clock correction coefficient (clock drift) */ + double af0; /* polynomial clock correction coefficient (clock bias) */ + /* ephemeris parameters */ + double m0; /* mean anomaly at reference time */ + double delta_n; /* mean motion difference from computed value */ + double ecc; /* eccentricity */ + double sqrta; /* square root of the semi-major axis */ + double omega0; /* longitude of ascending node of orbit plane at weekly epoch */ + double i0; /* inclination angle at reference time */ + double w; /* argument of perigee */ + double omegadot; /* rate of right ascension */ + double idot; /* rate of inclination angle */ + double cuc; /* amplitude of the cosine harmonic correction term to the argument o */ + double cus; /* amplitude of the sine harmonic correction term to the argument of */ + double crc; /* amplitude of the cosine harmonic correction term to the orbit radi */ + double crs; /* amplitude of the sine harmonic correction term to the orbit radius */ + double cic; /* amplitude of the cosine harmonic correction term to the angle of i */ + double cis; /* amplitude of the sine harmonic correction term to the angle of inc */ +}; + +struct structKlobuchar; + + +struct structKlobuchar { + uint16_t isValid; /* Is this structure valid for use 1=YES, 0=NO.*/ + uint16_t week; /* The GPS week corresponding to the correction parameters [weeks]. */ + uint32_t tow; /* The GPS time of week corresponding to the correction parameters [s]. */ + double alpha0; /* coefficients of a cubic equation representing the amplitude of the ve */ + double alpha1; /* coefficients of a cubic equation representing the amplitude of the ve */ + double alpha2; /* coefficients of a cubic equation representing the amplitude of the ve */ + double alpha3; /* coefficients of a cubic equation representing the amplitude of the ve */ + double beta0; /* coefficients of a cubic equation representing the period of the model */ + double beta1; /* coefficients of a cubic equation representing the period of the model */ + double beta2; /* coefficients of a cubic equation representing the period of the model */ + double beta3; /* coefficients of a cubic equation representing the period of the model */ +}; + +static struct structKlobuchar rinexklobuchar; + +static char semok; + +static char yumaok; + +static char rinexok; + +static struct RESULTS stats[500]; + +static struct COMMONALMANACH calm[32]; + + +static double sqr(double x) +{ + return x*x; +} /* end sqr() */ + +#define gpspos_Z 48 + + +static void degtostr(float d, char lat, char form, + char s[], uint32_t s_len) +{ + uint32_t i; + uint32_t n; + if (s_len-1<11UL) { + s[0UL] = 0; + return; + } + if (form=='2') i = 7UL; + else if (form=='3') i = 8UL; + else i = 9UL; + if (d<0.0f) { + d = -d; + if (lat) s[i] = 'S'; + else s[i+1UL] = 'W'; + } + else if (lat) s[i] = 'N'; + else s[i+1UL] = 'E'; + if (form=='2') { + /* DDMM.MMNDDMM.MME */ + n = (uint32_t)X2C_TRUNCC(d*3.4377467707849E+5f+0.5f,0UL, + X2C_max_longcard); + s[0UL] = (char)((n/600000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/6000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else if (form=='3') { + /* DDMM.MMMNDDMM.MMME */ + n = (uint32_t)X2C_TRUNCC(d*3.4377467707849E+6f+0.5f,0UL, + X2C_max_longcard); + s[0UL] = (char)((n/6000000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/600000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else { + /* DDMMSS */ + n = (uint32_t)X2C_TRUNCC(d*2.062648062471E+5f+0.5f,0UL, + X2C_max_longcard); + s[0UL] = (char)((n/360000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/36000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/3600UL)%10UL+48UL); + ++i; + s[i] = 'd'; + ++i; + s[i] = (char)((n/600UL)%6UL+48UL); + ++i; + s[i] = (char)((n/60UL)%10UL+48UL); + ++i; + s[i] = '\''; + ++i; + s[i] = (char)((n/10UL)%6UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + s[i] = '\"'; + ++i; + } + ++i; + s[i] = 0; +} /* end degtostr() */ + +/* A=6378217; */ +#define gpspos_A 6378137 +/* B=6356752; */ + +/* F=(A-B)/A; */ +/* E=2*F-F*F; */ +#define gpspos_E 8.1819190842522E-2 + + +static void wgs84(double lat, double long0, double heig, + double * x, double * y, double * z) +/* wgs84 ecef */ +{ + double h; + double sl; + double n; + sl = sin(lat); + n = X2C_DIVL(6.378137E+6,sqrt(1.0-6.694379990125E-3*sl*sl)); + h = heig+n; + *z = (n*9.9330562000988E-1+heig)*sl; + *y = h*sin(long0)*cos(lat); + *x = h*cos(long0)*cos(lat); +} /* end wgs84() */ + +#define gpspos_K 0.0 + + +static int32_t get4sats(const SATPOSES sats, const uint32_t satnum[], + uint32_t satnum_len, uint32_t dil, double dilm, + double * lat, double * long0, + double * heig) +{ + uint32_t i; + double rx_clock_bias; /*, clock_drift, satVx,satVy,satVz,azimuth,elevation,doppler*/ + int32_t prn; + int32_t ret; + uint32_t chkmask; + double dils[4]; + chkmask = 0UL; + for (i = 0UL; i<=3UL; i++) { + dils[i] = 0.0; + prn = (int32_t)(satnum[i]-1UL); + if ((prn<0L || prn>31L) || X2C_IN(prn,32,chkmask)) return -1L; + /* two times same sat */ + chkmask |= (1UL<0UL) dils[dil-1UL] = dilm; + ret = NAVIGATION_PerformClosedFormPositionSolution_FromPseuodrangeMeasurements(sats[satnum[0UL] + ].range+dils[0U], sats[satnum[1UL]].range+dils[1U], + sats[satnum[2UL]].range+dils[2U], + sats[satnum[3UL]].range+dils[3U], sats[satnum[0UL]].clk, + sats[satnum[1UL]].clk, sats[satnum[2UL]].clk, + sats[satnum[3UL]].clk, sats[satnum[0UL]].x, + sats[satnum[1UL]].x, sats[satnum[2UL]].x, + sats[satnum[3UL]].x, sats[satnum[0UL]].y, + sats[satnum[1UL]].y, sats[satnum[2UL]].y, + sats[satnum[3UL]].y, sats[satnum[0UL]].z, + sats[satnum[1UL]].z, sats[satnum[2UL]].z, + sats[satnum[3UL]].z, lat, long0, heig, &rx_clock_bias); + /*+K*sats[satnum[0]].drydelay*/ + /*+K*sats[satnum[1]].drydelay*/ + /*+K*sats[satnum[2]].drydelay*/ + /*+K*sats[satnum[3]].drydelay*/ + /*WrFixed(rx_clock_bias, 2,12); WrStrLn("=bias"); */ + if (ret>500L) ret = 500L; + if (*heig<(-1.E+4)) ret = 0L; + return ret; +} /* end get4sats() */ + + +static double qdist(double dlat, double dlong) +/* horizontal distance square rad*/ +{ + double c; + c = cos(dlat)*dlong; + return dlat*dlat+c*c; +} /* end qdist() */ + + +static void satposit(struct SATPOS * sat, uint32_t satnum, + double myx, double myy, double myz, + uint32_t userweek, uint32_t weekms) +{ + double satVz; + double satVy; + double satVx; + double clock_drift; + struct COMMONALMANACH * anonym; + sat->ok0 = 0; + if (calm[satnum].prn>0U) { + { /* with */ + struct COMMONALMANACH * anonym = &calm[satnum]; + if (rinexok) { + GPS_ComputeSatellitePositionVelocityAzimuthElevationDoppler_BasedOnEphmerisData(myx, + myy, myz, (uint16_t)userweek, (double)weekms*0.001, + anonym->tow_week&1023U, anonym->toe, anonym->toc, + anonym->af0, anonym->af1, anonym->af2, anonym->tgd, + anonym->m0, anonym->delta_n, anonym->ecc, anonym->sqrta, + anonym->omega0, anonym->i0, anonym->w, anonym->omegadot, + anonym->idot, anonym->cuc, anonym->cus, anonym->crc, + anonym->crs, anonym->cic, anonym->cis, &sat->clk, + &clock_drift, &sat->x, &sat->y, &sat->z, &satVx, &satVy, + &satVz, &sat->azimuth0, &sat->elevation, &sat->doppler); + } + else { + /*WrInt(ORD(fit_interval_flag), 4); WrInt(tow, 10); + WrInt(weekms DIV 1000, 10); WrStrLn("=fit tow tsat"); */ + GPS_ComputeSatellitePositionVelocityAzimuthElevationDoppler_BasedOnAlmanacData(myx, + myy, myz, (uint16_t)userweek, (double)weekms*0.001, + (double)(float)anonym->toa, anonym->week, + anonym->prn, anonym->ecc, anonym->i0, anonym->omegadot, + anonym->sqrta, anonym->omega0, anonym->w, anonym->m0, + anonym->af0, anonym->af1, &sat->clk, &clock_drift, &sat->x, + &sat->y, &sat->z, &satVx, &satVy, &satVz, &sat->azimuth0, + &sat->elevation, &sat->doppler); + } + } + /*WrInt(toe, 9); WrInt((time()-7200+3600*24*3) MOD 604800, 9); + WrInt(weekms DIV 1000, 9); WrStrLn("=toe"); */ + /* + WrInt(prn, 2); + WrFixed(ecc, 5, 9); + WrFixed(m0, 5, 9); + WrFixed(sqrta, 5, 9); + WrFixed(omega0, 5, 9); + WrFixed(i0, 5, 9); + WrFixed(w, 5, 9); + WrFixed(omegadot, 5, 9); + + --WrInt(toe, 5); + --WrInt(toc, 5); + WrInt(tow_week, 5); + WrFixed(sat.azimuth/RAD, 1, 7); + WrFixed(sat.elevation/RAD, 1, 6); + WrStrLn("=p a e"); + */ + sat->ok0 = 1; + } +/*WrInt(alm[satnum].prn, 3); WrFixed(clock_drift, 7, 10); + WrStrLn("=clock_drift"); */ +} /* end satposit() */ + + +static double lowele(double e) +{ + if (e<0.01) e = 0.01; + return X2C_DIVL(1.0,sin(e)); +} /* end lowele() */ + + +static char stat4sats(SATPOSES sats, const uint32_t satnums[], + uint32_t satnums_len, uint32_t try0) +{ + uint32_t i; + double azi; + double ele; + double dil; + double bz; + double by; + double bx; + struct RESULTS * anonym; + { /* with */ + struct RESULTS * anonym = &stats[try0]; + if (get4sats(sats, satnums, satnums_len, 0UL, 0.0, &anonym->lat, + &anonym->long0, &anonym->heig)>0L) { + wgs84(anonym->lat, anonym->long0, anonym->heig, &bx, &by, &bz); + /* for elevation */ + for (i = 0UL; i<=3UL; i++) { + dil = 50.0; + if (GEODESY_ComputeAzimuthAndElevationAnglesBetweenToPointsInTheEarthFixedFrame(GEODESY_REFERENCE_ELLIPSE_WGS84, + bx, by, bz, sats[satnums[i]].x, sats[satnums[i]].y, + sats[satnums[i]].z, &ele, &azi)) { + dil = 50.0+lowele(ele)*5.0; + /* make bad hdop on low elevation */ + } + if (get4sats(sats, satnums, satnums_len, i+1UL, dil, + &anonym->dlat[i], &anonym->dlong[i], &anonym->dheig[i])>0L) { + anonym->hd[i] = sqrt(qdist(anonym->lat-anonym->dlat[i], + anonym->long0-anonym->dlong[i]))*6.3661977236758E+6; + anonym->vd[i] = fabs(anonym->heig-anonym->dheig[i]); + sats[satnums[i]].hdil = sats[satnums[i]].hdil+anonym->hd[i]; + sats[satnums[i]].vdil = sats[satnums[i]].vdil+anonym->vd[i]; + } + else return 0; + } /* end for */ + return 1; + } + } + return 0; +} /* end stat4sats() */ + + +static void satposits(SATPOSES satsp, double myx, double myy, + double myz, uint32_t userweek, uint32_t weekms) +{ + uint32_t i; + memset((char *)satsp,(char)0,sizeof(SATPOSES)); + for (i = 0UL; i<=31UL; i++) { + satposit(&satsp[i], i, myx, myy, myz, userweek, weekms); + } /* end for */ +} /* end satposits() */ + +/* +PROCEDURE tropomodel(VAR satpos:SATPOS; userlat, userhigh:LONGREAL; + time:CARDINAL); +VAR zenith_dry_delay, zenith_wet_delay :LONGREAL; + dayofyear:CARDINAL; +BEGIN + WITH satpos DO + IF elevation>0.0 THEN + dayofyear:=time DIV (3600*24 DIV 4) MOD (365*4+1) DIV 4; + TROPOSPHERE_DetermineZenithDelayValues_WAAS_Model(userlat, userhigh, + dayofyear, + zenith_dry_delay, zenith_wet_delay); + + TROPOSPHERE_GetDryAndWetDelay_UsingThe_UNBabc_MappingFunction( + zenith_dry_delay, zenith_wet_delay, elevation, userlat, userhigh, + drydelay, wetdelay); + +--WrFixed(elevation/RAD, 1,6); WrFixed(wetdelay, 5,12); + WrFixed(drydelay, 5,12); +--WrFixed(zenith_dry_delay, 5,12); WrFixed(zenith_wet_delay, 5,12); + WrStrLn(""); + END; + END; + +END tropomodel; +*/ +#define gpspos_MAXHMUL 2.0 + +#define gpspos_MAXVMUL 4.0 + + +static void killexo(struct RESULTS stats0[], uint32_t stats_len, + uint32_t probs, float * devhsum, float * devvsum) +{ + uint32_t i; + uint32_t im; + uint32_t c; + double dy; + double dx; + float cosy; + float max0; + float dev; + char ok0; + uint32_t tmp; + do { + ok0 = 1; + c = 0UL; + dx = 0.0; + dy = 0.0; + tmp = probs-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + /* median */ + if ((stats0[i].res&0x9U)==0U) { + dx = dx+stats0[i].long0; + dy = dy+stats0[i].lat; + ++c; + } + if (i==tmp) break; + } /* end for */ + *devhsum = 0.0f; + if (c>1UL) { + /* filter min 3 measurements only */ + dx = X2C_DIVL(dx,(double)c); + dy = X2C_DIVL(dy,(double)c); + cosy = (float)cos((double)(float)dy); + max0 = (-1.0f); + tmp = probs-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + /* deviation and find badest */ + if ((stats0[i].res&0x9U)==0U) { + dev = (float)(sqr((double)((float) + (stats0[i].long0-dx)*cosy))+sqr((double)(float) + (stats0[i].lat-dy))); /* error distance ^2 */ + /*WrFixed(sqrt(dev)/RAD/360.0*40000000.0, 1,6); + WrStrLn("=dev"); */ + *devhsum = *devhsum+dev; + if (dev>max0) { + max0 = dev; + im = i; + } + } + if (i==tmp) break; + } /* end for */ + if (max0>=0.0f && c>2UL) stats0[im].res |= 0x1U; + *devhsum = X2C_DIVR(*devhsum,(float)c); + /* median deviation rad^2*/ + if (max0> *devhsum*2.0f) ok0 = 0; + } + } while (!ok0); + if (*devhsum>0.0f) { + *devhsum = (float)(sqrt((double)*devhsum)*6.3661977236758E+6); + /* meter */ + } + do { + ok0 = 1; + c = 0UL; + dx = 0.0; + tmp = probs-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if ((stats0[i].res&0x14U)==0U) { + dx = dx+stats0[i].heig; + ++c; + } + if (i==tmp) break; + } /* end for */ + *devvsum = 0.0f; + if (c>1UL) { + dx = X2C_DIVL(dx,(double)c); + max0 = (-1.0f); + tmp = probs-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if ((stats0[i].res&0x14U)==0U) { + dev = (float)sqr((double)(float) + (stats0[i].heig-dx)); + *devvsum = *devvsum+dev; + if (dev>max0) { + max0 = dev; + im = i; + } + } + if (i==tmp) break; + } /* end for */ + if (max0>=0.0f && c>2UL) stats0[im].res |= 0x4U; + *devvsum = X2C_DIVR(*devvsum,(float)c); + /* median alt deviation m^2 */ + if (max0> *devvsum*4.0f) ok0 = 0; + } + } while (!ok0); + if (*devvsum>0.0f) *devvsum = (float)sqrt((double)*devvsum); +} /* end killexo() */ + + +static void killdop(struct RESULTS stats0[], uint32_t stats_len, + uint32_t probs) +{ + uint32_t i; + uint32_t tmp; + tmp = probs-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if (stats0[i].qsumh>1.E+5) stats0[i].res |= 0x8U; + if (stats0[i].qsumv>1.E+5) stats0[i].res |= 0x10U; + if (i==tmp) break; + } /* end for */ +} /* end killdop() */ + + +static void median(const struct RESULTS stats0[], uint32_t stats_len, + uint32_t tries, double * lat, double * long0, + double * heig, uint32_t * cnt) +{ + uint32_t cz; + uint32_t i; + uint32_t tmp; + *lat = 0.0; + *long0 = 0.0; + *heig = 0.0; + *cnt = 0UL; + cz = 0UL; + tmp = tries-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if ((stats0[i].res&0x9U)==0U) { + *long0 = *long0+stats0[i].long0; + *lat = *lat+stats0[i].lat; + ++*cnt; + } + if ((stats0[i].res&0x14U)==0U) { + *heig = *heig+stats0[i].heig; + ++cz; + } + if (i==tmp) break; + } /* end for */ + if (*cnt>0UL) { + *lat = X2C_DIVL(*lat,(double)*cnt); + *long0 = X2C_DIVL(*long0,(double)*cnt); + } + else { + *lat = 0.0; + *long0 = 0.0; + } + if (cz>0UL) *heig = X2C_DIVL(*heig,(double)cz); + else *heig = 0.0; +} /* end median() */ + + +static void showstats(const struct RESULTS stats0[], uint32_t stats_len, + uint32_t probs, float errh, float errv, + uint32_t restcnt, char full) +{ + uint32_t p; + uint32_t i; + char h[31]; + uint32_t tmp; + if (full) { + osi_WrStr(" probs:", 8ul); + osic_WrINT32(probs, 1UL); + osi_WrStrLn("", 1ul); + tmp = probs-1UL; + p = 0UL; + if (p<=tmp) for (;; p++) { + for (i = 0UL; i<=11UL; i++) { + osic_WrINT32((uint32_t)X2C_IN(i,16,stats0[p].satset), 1UL); + } /* end for */ + osi_WrStr(" ", 2ul); + degtostr((float)stats0[p].lat, 1, '2', h, 31ul); + osi_WrStr(h, 31ul); + osi_WrStr(" ", 2ul); + degtostr((float)stats0[p].long0, 0, '2', h, 31ul); + osi_WrStr(h, 31ul); + osic_WrINT32((uint32_t)(int32_t)X2C_TRUNCI(stats0[p].heig, + X2C_min_longint,X2C_max_longint), 7UL); + for (i = 0UL; i<=3UL; i++) { + osic_WrFixed((float)stats0[p].hd[i], 0L, 5UL); + osic_WrFixed((float)stats0[p].vd[i], 0L, 5UL); + } /* end for */ + osic_WrFixed((float)stats0[p].qsumh, 0L, 8UL); + osic_WrFixed((float)stats0[p].qsumv, 0L, 8UL); + osi_WrStr(" ", 2ul); + /* WrFixed(stats[p].minele/RAD, 0, 3); WrStr(" "); */ + for (i = 0UL; i<=4UL; i++) { + osic_WrINT32((uint32_t)X2C_IN(i,16,stats0[p].res), 1UL); + } /* end for */ + osi_WrStrLn("", 1ul); + if (p==tmp) break; + } /* end for */ + } + /* + la:=0.0; + lo:=0.0; + i:=0; + FOR p:=0 TO probs-1 DO la:=la+stats[p].lat; lo:=lo+stats[p].long; + INC(i) END; + la:=la/LFLOAT(i); + lo:=lo/LFLOAT(i); + las:=0.0; + los:=0.0; + FOR p:=0 TO probs-1 DO las:=las+ABS(stats[p].lat-la); + los:=los+ABS(stats[p].long-lo) END; + WrStr("s=");WrFixed(las/LFLOAT(i)*100000.0, 2, 8); WrStr(" "); + WrFixed(los/LFLOAT(i)*100000.0, 2, 8); WrStrLn(""); + */ + osi_WrStr("n=", 3ul); + osic_WrINT32(restcnt, 3UL); + osi_WrStr(" s=", 4ul); + osic_WrFixed(errh, 1L, 0UL); + osic_WrFixed(errv, 1L, 6UL); + osi_WrStrLn("", 1ul); +} /* end showstats() */ + + +static double median0(gpspos_SATS sats, uint32_t satcnt, + uint32_t bad) +/* median except from bad and badspeeds */ +{ + uint32_t n; + uint32_t i; + double m; + uint32_t tmp; + m = 0.0; + n = 0UL; + tmp = satcnt-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if (i!=bad && !sats[i].badspeed) { + m = m+sats[i].userspeed; + ++n; + } + if (i==tmp) break; + } /* end for */ + if (n>0UL) m = X2C_DIVL(m,(double)n); + return m; +} /* end median() */ + + +static uint32_t peak(gpspos_SATS sats, uint32_t satcnt, double med, + uint32_t bad) +/* max deviation except from bad and badspeeds */ +{ + uint32_t b; + uint32_t i; + double a; + double m; + uint32_t tmp; + m = 0.0; + b = X2C_max_longcard; + tmp = satcnt-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + if (i!=bad && !sats[i].badspeed) { + a = fabs(sats[i].userspeed-med); + if (a>=m) { + m = a; + b = i; + } + } + if (i==tmp) break; + } /* end for */ + return b; +} /* end peak() */ + +#define gpspos_MINSATS 4 + +#define gpspos_MAXSPEED0 200 + + +static void speedrange(gpspos_SATS sats, uint32_t satcnt, + SATPOSES satspos) +/* shift ranges with speed */ +{ + uint32_t goodsats; + uint32_t bad1; + uint32_t bad; + uint32_t i; + double med1; + double med; + struct gpspos_SAT * anonym; + uint32_t tmp; + if (satcnt>=4UL) { + tmp = satcnt-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + { /* with */ + struct gpspos_SAT * anonym = &sats[i]; + anonym->userspeed = (double) + anonym->rang1*7.4333465936861E-4-satspos[anonym->almidx] + .doppler; /* doppler speed sat - user */ + anonym->badspeed = 0; + } + if (i==tmp) break; + } /* end for */ + goodsats = satcnt; + for (;;) { + /*WrStr("speeds"); */ + med = median0(sats, satcnt, X2C_max_longcard); + /* find sat oszillator deviation */ + bad = peak(sats, satcnt, med, X2C_max_longcard); + /* find bad synchronized doppler for a sat */ + if (bad>=satcnt) break; + /*WrInt(bad, 3); */ + med1 = median0(sats, satcnt, bad); /* median without bad sat */ + if (fabs(sats[bad].userspeed-med1)<=200.0) { + bad1 = peak(sats, satcnt, med1, bad); /* second badest sat */ + /*WrInt(bad1, 3); */ + if (bad1>=satcnt || fabs(sats[bad].userspeed-med1) + *0.25180.0) { + *dirsum = *dirsum+360.0; + } + d = X2C_DIVL(*dirsum,(double)(cnt+1UL)); + if (d>=360.0) { + d = d-360.0; + *dirsum = d*(double)(cnt+1UL); + } + } +/*WrFixed(dirsum/(LFLOAT(cnt+1)+0.0001), 0,0); WrStrLn("=dir"); */ +} /* end dirmed() */ + +/* +PROCEDURE ionomodel(VAR sat:SATPOS; klobuchar:GNSS_structKlobuchar; + mylat, mylong, myhigh:LONGREAL; tow:CARDINAL); +BEGIN + WITH klobuchar DO + IF NOT IONOSPHERE_GetL1KlobucharCorrection + (alpha0, alpha1, alpha2, alpha3, beta0, beta1, beta2, beta3, + mylat, mylong, sat.elevation, sat.azimuth, LFLOAT(tow), sat.ionocorr) + THEN sat.ionocorr:=0.0 END; +--WrFixed(sat.ionocorr, 1, 6); WrFixed(mylat/RAD, 3, 7); + WrFixed(mylong/RAD, 3, 7); +--WrFixed(sat.azimuth/RAD, 1, 6);WrFixed(sat.elevation/RAD, 1, 6); + WrStrLn("=iono"); + + + END; +END ionomodel; +*/ + +static double PMUL(int32_t n) +{ + return (double)(X2C_max_longint-n)*2.8618384385692E-1; +} /* end PMUL() */ + + +static void wrdate(uint32_t t) +{ + char s[31]; + aprsstr_DateToStr(t, s, 31ul); + osi_WrStr(s, 31ul); +} /* end wrdate() */ + +#define gpspos_ZEROTIME 315964800 + +#define gpspos_WEEK 604800 + +#define gpspos_HALFWEEK 302400 + + +extern int32_t gpspos_getposit(uint32_t weekms, uint32_t * systime, + gpspos_SATS sats, double mylat, double mylong, + double myhigh, double * lat, + double * long0, double * heig, + double * speed, double * dir, + double * climb, float * hrms, float * vrms, + uint32_t * goodsats) +{ + double aa; + double vheig; + double vlong; + double vlat; + double min0; + double malt; + double mlong; + double mlat; + double bz; + double by; + double bx; + double myz; + double myy; + double myx; + uint32_t satnums[4]; + int32_t ret; + uint32_t restcnt; + uint32_t speeds; + uint32_t tries; + uint32_t satcnt; + uint32_t bit; + uint32_t j; + uint32_t i; + uint32_t cnt; + uint32_t weeks; + uint32_t userweek; + uint32_t gpstime; + uint16_t comb; + SATPOSES satspos; + gpspos_SATS tmp; + uint32_t tmp0; + uint32_t tmp1; + sats = (struct gpspos_SAT *)memcpy(tmp,sats,sizeof(gpspos_SATS)); + weeks = (weekms/1000UL)%604800UL; /* second in week from gps */ + gpstime = *systime-315964800UL; /* absolute gps time from system clock */ + i = ((weeks+604800UL)-gpstime%604800UL)%604800UL; /* gps is later */ + if (i<302400UL) i += 604800UL; + gpstime = (gpstime+i)-604800UL; /* system time corrected to gps time */ + *systime = gpstime+315964800UL; /* return corrected systime */ + userweek = gpstime/604800UL&1023UL; + /*WrInt(calm[0].week MOD 1024, 6); WrInt(userweek, 6); WrInt(weeks, 16); + WrInt(gpstime MOD WEEK, 16);WrInt(i-WEEK, 16); + WrStrLn("=weeks"); */ + wgs84(mylat, mylong, myhigh, &myx, &myy, &myz); + memset((char *)stats,(char)0,sizeof(struct RESULTS [500])); + memset((char *)satspos,(char)0,sizeof(SATPOSES)); + satposits(satspos, myx, myy, myz, userweek, weekms); + /*corrrang(sats); */ + satcnt = 0UL; + for (i = 0UL; i<=11UL; i++) { + if (sats[i].prn && sats[i].rang31UL) break; + } + } + } /* end for */ + tries = 0UL; + *hrms = 0.0f; + ret = -1L; + mlat = 0.0; + mlong = 0.0; + malt = 0.0; + if (satcnt>=4UL) { + comb = 0U; + do { + cnt = 0UL; + tmp0 = satcnt-1UL; + bit = 0UL; + if (bit<=tmp0) for (;; bit++) { + if (X2C_IN(bit,16,(uint16_t)comb)) ++cnt; + if (bit==tmp0) break; + } /* end for */ + if (cnt==4UL) { + cnt = 0UL; + tmp0 = satcnt-1UL; + bit = 0UL; + if (bit<=tmp0) for (;; bit++) { + if (X2C_IN(bit,16,(uint16_t)comb)) { + satspos[sats[bit].almidx].range = PMUL(sats[bit].rang); + /* satspos[sats[bit].almidx].range:=VAL(REAL, + VAL(CARDINAL,MAX(INTEGER)-sats[bit].rang))*PRM; */ + /* (LFLOAT(ORD(ODD(weeks))*2)-1.0) + *satspos[sats[bit].almidx].ionocorr; */ + satnums[cnt] = sats[bit].almidx; + ++cnt; + } + if (bit==tmp0) break; + } /* end for */ + if (stat4sats(satspos, satnums, 4ul, tries)) { + stats[tries].qsumh = 0.0; + stats[tries].qsumv = 0.0; + for (i = 0UL; i<=3UL; i++) { + stats[tries].qsumh = stats[tries].qsumh+sqr(stats[tries] + .hd[i]); + stats[tries].qsumv = stats[tries].qsumv+sqr(stats[tries] + .vd[i]); + if (stats[tries].hd[i]==0.0 || stats[tries].vd[i]==0.0) { + stats[tries].qsumh = 0.0; + stats[tries].qsumv = 0.0; + } + } /* end for */ + stats[tries].satset = (uint16_t)comb; + ++tries; + } + } + ++comb; + } while (!X2C_IN(satcnt,16,(uint16_t)comb)); + } + osi_WrStr(" ", 2ul); + wrdate(*systime); + osic_WrINT32(satcnt, 3UL); + osi_WrStr("=sats", 6ul); + osic_WrINT32(tries, 5UL); + osi_WrStr("=tries ", 8ul); + if (tries>0UL) { + killdop(stats, 500ul, tries); + killexo(stats, 500ul, tries, hrms, vrms); + median(stats, 500ul, tries, lat, long0, heig, &restcnt); + /* final position */ + showstats(stats, 500ul, tries, *hrms, *vrms, restcnt, 0); + ret = 0L; + } + *goodsats = 0UL; + if (ret>=0L) { + /*---speed */ + if (*lat==0.0 && *long0==0.0) { + wgs84(mylat, mylong, myhigh, &bx, &by, &bz); /* show sat table */ + } + else wgs84(*lat, *long0, *heig, &bx, &by, &bz); + satposits(satspos, bx, by, bz, userweek, weekms); + /* dgps(sats, satcnt, satspos, bx, by, bz, mylat, mylong, myhigh, + rangcor); */ + speedrange(sats, satcnt, satspos); + *speed = 0.0; + *dir = 0.0; + *climb = 0.0; + speeds = 0UL; + tmp0 = tries-1UL; + i = 0UL; + if (i<=tmp0) for (;; i++) { + if ((stats[i].res&0x18U)==0U) { + cnt = 0UL; + tmp1 = satcnt-1UL; + bit = 0UL; + if (bit<=tmp1) for (;; bit++) { + if (X2C_IN(bit,16,stats[i].satset) && !sats[bit].badspeed) { + satspos[sats[bit].almidx].range = (double) + (uint32_t)(X2C_max_longint-sats[bit].rang) + *2.8618384385692E-1+sats[bit].userspeed; + satnums[cnt] = sats[bit].almidx; + ++cnt; + } + if (bit==tmp1) break; + } /* end for */ + if (cnt==4UL && get4sats(satspos, satnums, 4ul, 0UL, 0.0, &vlat, + &vlong, &vheig)>0L) { + *speed = *speed+neardist(stats[i].lat, stats[i].long0, vlat, + vlong); + dirmed(dir, azimuth(vlat, vlong, stats[i].lat, + stats[i].long0), speeds); + *climb = (*climb+stats[i].heig)-vheig; + ++speeds; + } + } + if (i==tmp0) break; + } /* end for */ + /*WrInt(i,2); WrFixed((stats[i].lat-vlat)/RAD*111111.0, 1,6); */ + /*WrFixed((stats[i].long-vlong)/RAD*111111.0, 1,6); */ + /*WrFixed(stats[i].heig-vheig, 1,9); WrStrLn(""); */ + if (speeds>0UL) { + *speed = X2C_DIVL(*speed,(double)speeds); + *dir = X2C_DIVL(*dir,(double)speeds); + *climb = X2C_DIVL(*climb,(double)speeds); + } + /* + WrFixed(speed, 1,6); + WrFixed(dir, 1,6); + WrStrLn("=speed/dir"); + */ + /*---speed */ + min0 = 0.0; + osi_WrStrLn("prn az ele clc dopp freq0", 42ul); + tmp0 = satcnt; + i = 1UL; + if (i<=tmp0) for (;; i++) { + j = sats[i-1UL].almidx; + if (j<=31UL) { + if (!sats[i-1UL].badspeed) ++*goodsats; + osic_WrINT32(sats[i-1UL].prn, 2UL); + osic_WrFixed((float)(X2C_DIVL(satspos[j].azimuth0, + 1.7453292519943E-2)), 1L, 7UL); + osic_WrFixed((float)(X2C_DIVL(satspos[j].elevation, + 1.7453292519943E-2)), 1L, 6UL); + osic_WrFixed((float)satspos[j].clk, 0L, 10UL); + osic_WrFixed((float)satspos[j].doppler, 1L, 10UL); + osic_WrINT32((uint32_t)sats[i-1UL].rang1, 8UL); + /* WrFixed(LFLOAT(sats[i-1].freq0)*(WAVLEN/256.0), 3, 10); + */ + aa = (double)sats[i-1UL].rang1*7.4333465936861E-4-satspos[j].doppler; + osic_WrFixed((float)aa, 3L, 10UL); + /* WrFixed(ABS(aa-min), 3, 10); */ + min0 = aa; + if (sats[i-1UL].badspeed) osi_WrStr(" v", 3ul); + osi_WrStrLn("", 1ul); + } + if (i==tmp0) break; + } /* end for */ + } + return ret; +} /* end getposit() */ + +#define gpspos_MAXTRUST 21600 +/* seconds from oldest to newest entry */ + +#define gpspos_MINDATE 1261440000 + +struct SEM_structAlmanac; + + +struct SEM_structAlmanac { + uint32_t toa; /* almanac time of applicability (reference time [s]*/ + uint16_t week; /* 10 bit gps week 0-1023 (user must account for week rollover) [week] */ + uint16_t prn; /* GPS prn number */ + uint16_t reserved; /* reserved */ + uint16_t svn; /* Satellite vehicle number */ + uint8_t ura; /* User Range Accuracy lookup code, [0-15], see p. 83 GPSICD200C, 0 is excellent, 15 is use at own risk */ + uint8_t health; /* 0=healthy, unhealthy otherwise [], subframe 4 and 5, page 25 six-bit health code */ + uint8_t config_code; /* configuration code [], if >=9 Anti-Spoofing is on */ + /* this inicator is not part of the SEM standard but is added by the user if known */ + char is_af0_af1_high_precision; + /* indicates precision of af0 and af1 [1=high precision, + 0=low precision] (22&16 bits, + ephemeris source) vs (11&11 bits, almanac source), + 0 is typical for most SEM sources */ + double ecc; /* eccentricity */ + double i0; /* orbital inclination at reference time [rad] */ + double omegadot; /* rate of right ascension [rad/s] */ + double sqrta; /* square root of the semi-major axis [m^(1/2)]*/ + double omega0; /* longitude of ascending node of orbit plane at weekly epoch [rad] */ + double w; /* argument of perigee [rad] */ + double m0; /* mean anomaly at reference time [rad] */ + double af0; /* polynomial clock correction coefficient (clock bias) [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) */ + double af1; /* polynomial clock correction coefficient (clock drift) [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) */ +}; + +struct YUMA_structAlmanac; + + +struct YUMA_structAlmanac { + uint16_t reserved1; + uint16_t week; /* 10 bit gps week 0-1023 (user must account for week rollover) [week] */ + uint16_t prn; /* GPS prn number */ + uint8_t health; /* 0=healthy, unhealthy otherwise [], subframe 4 and 5, page 25 six-bit health code */ + double ecc; /* eccentricity */ + double toa; /* time of applicability */ + double i0; /* orbital inclination at reference time [rad] */ + double omegadot; /* rate of right ascension [rad/s] */ + double sqrta; /* square root of the semi-major axis [m^(1/2)]*/ + double omega0; /* longitude of ascending node of orbit plane at weekly epoch [rad] */ + double w; /* argument of perigee [rad] */ + double m0; /* mean anomaly at reference time [rad] */ + double af0; /* polynomial clock correction coefficient (clock bias) [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) */ + double af1; /* polynomial clock correction coefficient (clock drift) [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) */ +}; + + +extern char gpspos_readalmanach(char fnsem[], + uint32_t fnsem_len, char fnyuma[], + uint32_t fnyuma_len, char fnrinex[], + uint32_t fnrinex_len, uint32_t secondinweek, + uint32_t * tilltime, char verb) +{ + uint8_t cnt; + uint32_t nearmed; + uint32_t ti; + uint32_t ri; + uint32_t j; + uint32_t i; + struct SEM_structAlmanac alm[32]; + struct YUMA_structAlmanac yumaalm[32]; + struct structEphemeris rinexalm[3072]; + uint32_t min0[32]; + uint32_t tmp; + char gpspos_readalmanach_ret; + X2C_PCOPY((void **)&fnsem,fnsem_len); + X2C_PCOPY((void **)&fnyuma,fnyuma_len); + X2C_PCOPY((void **)&fnrinex,fnrinex_len); + memset((char *)alm,(char)0,sizeof(struct SEM_structAlmanac [32])); + memset((char *)calm,(char)0,sizeof(struct COMMONALMANACH [32])); + memset((char *)yumaalm,(char)0, + sizeof(struct YUMA_structAlmanac [32])); + memset((char *)rinexalm,(char)0, + sizeof(struct structEphemeris [3072])); + semok = fnsem[0UL] && SEM_ReadAlmanacDataFromFile(fnsem, (char *)alm, + 32U, &cnt); + if (semok) { + for (i = 0UL; i<=31UL; i++) { + alm[i].i0 = alm[i].i0+9.4247779607694E-1; + } /* end for */ + } + yumaok = fnyuma[0UL] && YUMA_ReadAlmanacDataFromFile(fnyuma, + (char *)yumaalm, 32U, &cnt); + rinexok = fnrinex[0UL] && RINEX_DecodeGPSNavigationFile(fnrinex, + (char *) &rinexklobuchar, (char *)rinexalm, 3071UL, + &ri); + if (rinexok && ri>0UL) { + if (verb) { + osic_WrINT32(ri, 1UL); + osi_WrStrLn("=rec", 5ul); + } + for (i = 0UL; i<=31UL; i++) { + min0[i] = 0UL; + } /* end for */ + ti = ((osic_time()-7200UL)+345600UL)%604800UL; + if (verb) { + osic_WrINT32(ti, 12UL); + osic_WrINT32(secondinweek, 12UL); + osi_WrStrLn("=ti secondinweek", 17ul); + } + tmp = ri-1UL; + j = 0UL; + if (j<=tmp) for (;; j++) { + i = (uint32_t)rinexalm[j].prn; + ti = ((rinexalm[j].tow+604800UL)-secondinweek)%604800UL; + if (((i>0UL && i<=32UL) && ti>302400UL) && min0[i-1UL]MINDATE) & (timinti) & (titilltime) THEN tilltime:=ti END; + (* newest trusted entry as hint for alm timeout *) + IF verb THEN + wrdate(ti); + IF i MOD 4=3 THEN WrStrLn("") ELSE WrStr(" ") END; + END; + END; + */ + for (i = 0UL; i<=31UL; i++) { + calm[i].toa = alm[i].toa; + calm[i].week = alm[i].week; + calm[i].prn = alm[i].prn; + calm[i].health = alm[i].health; + calm[i].ecc = alm[i].ecc; + calm[i].i0 = alm[i].i0; + calm[i].omegadot = alm[i].omegadot; + calm[i].sqrta = alm[i].sqrta; + calm[i].omega0 = alm[i].omega0; + calm[i].w = alm[i].w; + calm[i].m0 = alm[i].m0; + calm[i].af0 = alm[i].af0; + calm[i].af1 = alm[i].af1; + } /* end for */ + } + else if (yumaok) { + /* IF verb THEN */ + /* + FOR i:=0 TO HIGH(calm) DO + j:=0; + WHILE (j<=HIGH(yumaalm)) & (alm[i].prn<>yumaalm[j].prn) + DO INC(j) END; + IF j<=HIGH(yumaalm) THEN + WrInt(alm[i].prn, 3); WrStrLn(""); + WrInt(alm[i].toa, 25); WrInt(TRUNC(yumaalm[j].toa), 25); + WrStrLn(""); + WrInt(alm[i].week, 25); WrInt(yumaalm[j].week, 25); + WrStrLn(""); + WrInt(alm[i].health, 25); WrInt(yumaalm[j].health, 25); + WrStrLn(""); + WrFixed(alm[i].ecc, 12, 25); WrFixed(yumaalm[j].ecc, 12, 25); + WrStrLn(""); + WrFixed(alm[i].i0, 12, 25); WrFixed(yumaalm[j].i0, 12, 25); + WrStrLn(""); + WrFixed(alm[i].omegadot, 12, 25); + WrFixed(yumaalm[j].omegadot, 12, 25); WrStrLn(""); + WrFixed(alm[i].sqrta, 12, 25); + WrFixed(yumaalm[j].sqrta, 12, 25); WrStrLn(""); + WrFixed(alm[i].omega0, 12, 25); + WrFixed(yumaalm[j].omega0, 12, 25); WrStrLn(""); + WrFixed(alm[i].w, 12, 25); WrFixed(yumaalm[j].w, 12, 25); + WrStrLn(""); + WrFixed(alm[i].m0, 12, 25); WrFixed(yumaalm[j].m0, 12, 25); + WrStrLn(""); + WrFixed(alm[i].af0, 12, 25); WrFixed(yumaalm[j].af0, 12, 25); + WrStrLn(""); + WrFixed(alm[i].af1, 12, 25); WrFixed(yumaalm[j].af1, 12, 25); + WrStrLn(""); + END; + */ + /* END; */ + for (i = 0UL; i<=31UL; i++) { + calm[i].toa = (uint32_t)X2C_TRUNCC(yumaalm[i].toa,0UL, + X2C_max_longcard); + calm[i].week = yumaalm[i].week; + calm[i].prn = yumaalm[i].prn; + calm[i].health = yumaalm[i].health; + calm[i].ecc = yumaalm[i].ecc; + calm[i].i0 = yumaalm[i].i0; + calm[i].omegadot = yumaalm[i].omegadot; + calm[i].sqrta = yumaalm[i].sqrta; + calm[i].omega0 = yumaalm[i].omega0; + calm[i].w = yumaalm[i].w; + calm[i].m0 = yumaalm[i].m0; + calm[i].af0 = yumaalm[i].af0; + calm[i].af1 = yumaalm[i].af1; + } /* end for */ + } + gpspos_readalmanach_ret = (semok || yumaok) || rinexok; + X2C_PFREE(fnsem); + X2C_PFREE(fnyuma); + X2C_PFREE(fnrinex); + return gpspos_readalmanach_ret; +} /* end readalmanach() */ + + +extern void gpspos_BEGIN(void) +{ + static int gpspos_init = 0; + if (gpspos_init) return; + gpspos_init = 1; + aprsstr_BEGIN(); + osi_BEGIN(); +} + diff --git a/src/gpspos.h b/src/gpspos.h new file mode 100644 index 0000000..4e72e1b --- /dev/null +++ b/src/gpspos.h @@ -0,0 +1,49 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef gpspos_H_ +#define gpspos_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif + +struct gpspos_SAT; + + +struct gpspos_SAT { + uint32_t prn; + uint32_t almidx; + int32_t rang; + int32_t rang1; + int32_t rang3; + int32_t rangabs; + int32_t lastd; + int32_t lastd1; + int32_t freq0; + double userspeed; + char badspeed; +}; + +typedef struct gpspos_SAT gpspos_SATS[12]; + +extern int32_t gpspos_getposit(uint32_t, uint32_t *, gpspos_SATS, + double, double, double, double *, + double *, double *, double *, + double *, double *, float *, float *, + uint32_t *); + +extern char gpspos_readalmanach(char [], uint32_t, char [], + uint32_t, char [], uint32_t, uint32_t, + uint32_t *, char); + + +extern void gpspos_BEGIN(void); + + +#endif /* gpspos_H_ */ diff --git a/src/help.txt b/src/help.txt new file mode 100644 index 0000000..fadc1bd --- /dev/null +++ b/src/help.txt @@ -0,0 +1,1039 @@ +Aufbau: kapitel anfang und ende mit "Strich"name neue zeile + link mit "Strich"name:sichtbarer text: +tipp: frisch editierter text mit klick aufs help-fenster aktualisierbar + + +|index +|lang-de:Deutsch: +|lang-en:English: + + + +|lang-de +|de-shortcuts:Tastenkuerzel: +|de-quick:Schnellstart: Minimal Konfiguration +|de-online:Online Konfiguration: Internet oder Hamnet +|de-rf:Funkport Konfiguration: TNC, Soundmodem +|de-map:Landkarten Konfiguration: +|de-move:Karten und Objekte:, Zoom, Verschieben, Sounds +|de-kontent:Was soll aufs Bild: +|de-messages:Messages: Wem was schreiben +Der Text kann im File "help.txt" erweitert werden. + + + +|lang-en +|en-shortcuts:Shortcuts: +|en-online:Online Config: +|en-rf:Radio Ports Config: +|en-map:Map Config: +The Help Text may be edited in File "help.txt" + + + +|de-quick +Um Daten auf die Landkarte zu kriegen muss eine Datenquelle +ausgewaehlt werden zB. das "rawlog" File von einem der +schon laengere Zeit Daten sammelt oder via |de-rf:Funk: mittels +|de-tnc:TNC: oder |de-modem:Soundmodem: oder via Internet/Hamnet. Ist letzteres +vorhanden, |de-online:Online Config: +|de-map:Landkarten Holen: +|de-view:Start Kartenausschnitt: + + + +|de-online +Config / Online +Es genuegt meist, eine |de-server:Server Adresse: oder |de-server:IP-Nummer: +einzutragen und |de-connect:Connect Server: anzuklicken. Funktioniert +die Verbindung, wechselt der Knopf "X" der Statusknoepfe auf +"N" und wenn (und solang) neue Daten kommen von rot auf gruen. +Um die Datenmenge zu begrenzen und bei Servern, die Daten der +ganzen Welt anbieten sogar ein Muss, ist die Angabe eines +|de-serverfilter:Filters:. Filter mit "m/.." erfordern auch die Eingabe der +|de-mypos:Eigenen Position: und zum Senden einer korrekten |de-netbeacon:Netzbake: +eines |de-symbol:Symbols: und wenn man will eines kurzen |de-netcomment:Kommentars:. Man +sollte aber auch das eigene |de-mycall:Call: eintragen und wenn man Daten +ins Netz schicken will auch den dazu gehoerenden |de-passcode:Passcode: + + + +|de-kontent +Was soll wie aufs Bild. +"Config / Brightness" sollte selbsterklaerend sein + +"Time full Bright" ist keine Helligkeit, dafuer die Zeit, +in der Objekte und deren Tracks sichtbar bleiben sollen. +Damit, vor allem Tracks, nicht schlagartig enden, gibts + +"Time Fade Out" die nach Full Bright noch ein Ausblenden +des Tracks oder Objekts ermoeglicht. +Diese Timer koennen auch praeziser Numerisch in +|de-timer:"Config / Timer": eingestellt werden. +Die maximal darstellbare Zeitspanne enstpricht der Zeit +in der Daten im RAM gehalten werden und die ist in +|de-timer:Data in RAM: einstellbar +|de-objectsram:Objects in RAM: mit extra Timer +Will man nur Wegpunkte ohne Linien, stellt man +Brightness Tracks auf 1%. +|de-gamma:Gamma: +|de-symboltext:Symbol Beschriftung: +"Config / Map Parameter / Brightness notmover" ist die +Helligkeit in der gedimmte unbewegte Objekte noch +erkennbar sein sollten und die bewegten so verdeutlichen. +|de-rfpath:Brightness RfPath: +"Config / Map Parameter / Menu transparency" stellt bis +gegen 1 die Durchsichtigkeit der Meues ein. Mit 0 kommt +ein aufgehellter Hintergrund. +|de-trackcolor:Track Farben: + +|de-trackcolor +Die Farbe eines neuen Tracks wird so generiert, dass +sie zu den in der naehe schon vorhandenen maximalen +Farbkontrast hat. Wenn nun festgelegt, sollte sich die +Farbe von selbst nimmer aendern auch wenn sich das +Objekt da hin bewegt, wo scho die gleiche Farbe in +verwendung ist. Dann hilft manuell Farbe aendern durch +anklicken des Objekts und evtl wieder mit 0-Taste oder +"Show All" alles zeigen und dann mit ~-Taste (Tilde) +oder "Infos / Change Trackcolour" die Farbe mit dem +besten Kontrast aussuchen. + + +|de-objectsram +Objects in RAM: gilt fuer Items/Objects die als "echtzeit" +Ereignisse zwar von der Ferne geloescht werden koennten, +was aber kaum gemacht wird. +Stellt man diesen Timer laenger, koannen die nun fehlenden +Daten aus dem |de-writelog:Logile: nachgeladen werden. + + +|de-gamma +"Gamma" ist eine Helligkeitsfunktion des Auges und +teilweise des Bildschirmes mit Normalwert 2.2. Zum +Feinjustieren kann man auf einer Animation Schrift sehr +lanxam ueber die Pixel wandern lassen und wenn dabei von +weiter weg betrachtet die Helligkeit konstant bleibt ist +Gamma ok. + + + +|de-symboltext +"Config / Map Parameter / Show Course Arrow" zeigt/zeigt +nicht einen Fahrtrichtungspfeil am Symbol + +"Config / Map Parameter / Wind Vane" zeigt/zeigt nicht +eine Windfahne an Symbolen mit Wind Info + +"Config / Map Parameter / Show Temp" zeigt/zeigt nicht +Tempertur bei Symbolen mit Tempertur Info + +"Config / Map Parameter / km/h text" ist der Text nach +dem km/h-Wert der hier auch ein/ausgeschaltet werden kann. + +"Config / Map Parameter / Show Altitute min m" sind +Hoehenmeter ab der die Hoehe zum Symbol geschrieben +werden soll. -100 ab -100m also "fast" immer. + + + + +|de-timer +Config / Timers +"Netbeacon" ist die Zeit in Sekunden zwischen 2 Baken ins +AprsIs-Netz sofern man online ist und Daten senden auf ein. + +"Data in RAM" nach dieser Zeit in Minuten werden Daten +aus dem Arbeitspeicher entfernt und sind dann nur mehr +im |de-rawlog:Logfile:. + +"Objects in RAM" nach dieser Zeit in Minuten werden Daten +von Items und Objects aus dem RAM entfernt und sind dann +nur mehr im |de-rawlog:Logfile:. + +"Show km/h" sind Sekunden, die die km/h Angabe nach einer +Fahrt noch sichtbar bleiben soll bei den Symbolen. + +"Duplicate lookback" sind Minuten die zurueck von jetzt +nach verzoegerten Baken gesucht wird zum ausblenden von +|de-trackfilter:Zacken im Track:. +Beim Laden eines Logfiles steigt die Rechenzeit +da alle Baken mit allen verglichen werden muessen. + +"Animation Speed" ist default-Zeitraffer bei |de-animate:Animation: +und |de-video:Video: in Echtzeit zu Spielzeit bei 25Hz Framerate. +Bei laufender Animation kann die Geschwindigkeit durch +aufs Bild klicken justiert werden und gilt dann auch fuer +Video erzeugen. + +"Nomove skip delay" ist die Zeit in der die |de-animate:Animation:/ +|de-video:Video: noch mit konstanter Geschwindigkeit weiter laeuft +auch wenn sich nichts mehr bewegt bevor auf hoehere +Geschwindigkeit gestellt wird bis zur naechsten Bewegung. + +"Local Time" ermoeglicht ein Verschieben der Zeitangaben +um +/- 24h gegen der Systemzeit. Im |de-rawlog:Logfile: bleibt +immer Systemzeit. + + + + +|de-tnc +Ein TNC mit KISS, SMACK oder FLEXKISS Modus oder ein Transceiver +mit eingebauten TNC kann per USB oder serieller Schnittstelle +mittels des Programms |de-udpflex:udpflex: als Protokollwandler auf |de-AXUDP:AXUDP: +angeschlossen werden. Dabei wird auch ein TNC3 mit mehreren +Funkports unterstuetzt. + + + +|de-udpflex +Programm udpflex gibts auf linux und win und ist ein bidirectionales +Interface KISS,SMACK,FLEXKISS und AXUDP von seriellen und +USBseriellen Port, letztere hotplugfaehig. Es versteht sich mit +Flexnet, TNC2, TNC3-multiport, TMD-710, TH7E. Die UDP-Seite +geht ueber localhost oder auf andere rechner zu aprsmap. + + + +|de-AXUDP +Protokoll AXUDP +Enthaelt das Rohformat von AX.25 mit einer CRC Pruefsumme. + + + +|de-modem +Ein Soundmodem muss AXUDP oder KISS auf einer virtuellen Schnittstelle +koennen. Derzeit ist nur auf Linux "afskmodem" bekannt das viele +PR-Modulationen kann. + + + +|de-server +Config / Online / Server url +Eine Server Adresse ist ein normaler URL wie "nuremberg.aprs2.net" +oder eine IP-Nummer wie 44.143.40.31:14580 letztere mit Angabe der +Port Nummer falls ein anderer als der Standardport verwendet werden +soll. +Es koennen auch mehrere Serveradressen eingetragen werden und bei +bedarf auf aktiv oder inaktiv geschaltet werden. Damit sucht das +System so lange bis ein gehender Server gefunden wird. Die Suchfolge +ist gemaess den Wuenschen der Server-Betreiber auf einer alle 30s +begrenzt. + + + +|de-serverfilter +Config / Online / Serverfilter +Server Filter dienen zur Auswahl der gewunschten Daten aus dem Netz. +Ein einfaches Filter (das aber das absenden der eigenen Position +voraus setzt) is das m/radius Filter fuer km um den eigenen Standort. +Das gleiche geht auch mit r/laenge/breite/radius also zB r/13/48.5/250 +oder rechteckig mit a/laenge/breite/laenge/breite/ in Grad mit Komma +zB. a/11.5/49/13.5/47.1 +Bei manchen Servern gibt es ein Vielzahl von Filtern fuer Calls +Protokolle, Symbole mehrere davon kombinier- und invertierbar. + + + +|de-mycall +Config / Online / MY Call +Ein Call besteht aus 3 bis 6 Grossbuchstaben und Ziffern und evtl. +einem "SSID" von -1 bis -15. Am Netz sind zwar andere Varianten +auch uebertragbar, machen aber keinen Sinn wenn man ein gueltiges +Call besitzt und werden auch oft weggefiltert. + + + +|de-mypos +Config / Online / My Position +Die eigene Position kann man per Tastatur eingeben in der +Schreibweise DDMM.MMN/DDDMM.MME also Grad und Minuten mit +Komma (keine Sekunden!) oder viel einfacher indem man zuerst +auf der |de-map:Landkarte: die eigene Position durch |de-move:Verschieben: +und |de-zoom:Zoomen: einstellt auf |de-zoomlevel:Zoomlevel: 15 oder mehr und dann bei +geoffneter "MY Position"-Eingabezeile mit gehaltener Shift- +Taste auf die eigene Position auf der Landkarte klickt und +wenn korrekt mit "Ok" speichert. + + + +|de-symbol +Config / Online / My Symbol +Einfach ein Symbol auswaehlen auf dem Bild und drauf klicken +Fuer spezielle Overlay Symbole, sofern man weiss was man tut, +kann der Buchstabe oder die Ziffer im Textfeld durch draufklicken +auf "My Symbol" im Zeileneditor eingetragen und mit "Ok" +gespeichert werden. + + + +|de-netcomment +Config / Online / Netbeacontext +Als Kommentar geht zB. Name und eine Frequenz auf der man QRV ist. + + + +|de-passcode +Config / Online / Passcode +Der Passcode dient der Sicherheit beim Senden von Daten ins +weltweite Netz. Es ist ein Zahlencode der mit eigenen Call +(SSID egal) verbunden ist und von Digi/Server-Sysops, denen +man bekannt ist, errechnet werden kann. + + + +|de-connect +Config / Online / Connect Server +Die Verbindung zum Netz kann hier, und noch direkter durch klicken +auf den "X" bzw. "N" Knopf ein- und ausgeschaltet werden. Beruehren +des Knopfes zeigt den Verbindungs Zustand. Hat man Daten wie |de-mycall:Call:, +|de-serverfilter:Server Filter: oder |de-server:Server-Urls: veraendert, kann kurzes Trennen +und wieder Verbinden die aktualisierten Daten uebertragen. + + + +|de-netbeacon +Eine Netzbake ist eine Zeile Text ins AprsIs Netz die +normalerweise eine |de-mypos:Position:, ein |de-symbol:Symbol: und einen +kurzen |de-netcomment:Kommentar: enthaelt aber immer ein |de-mycall:Rufzeichen:. +Die Zeile wird vom System zusammengesetzt aus den +Angaben in Config / Online und mit dem |de-netbeacontime:Netbecon Timer: +und immer beim einloggen in einen Server gesendet. + + + +|de-netbeacontime +Config / Timers / Net Beacon time ist die Zeit in Sekunden +zwischen 2 Netzbaken. Ueblich: 600s also 10 Minuten + + + +|de-rf +Funkports arbeiten via AXUDP mit |de-modem:Soundmodem: oder +|de-udpflex:KISS-Interface:. +Die Kommunikation findet via UDP und je einem Port +pro Richtung statt. +"Config / Rf-Ports / Rf-Port1" ist der erste Funkport +und enthaelt eine IP-Nummer und 2 beliebige freie +Portnummern wie 127.0.0.1:9001:9002 wobei auf 9001 +gesendet und 9002 empfangen wird. Der Link kann +jederzeit ein und ausgeschaltet werden mit dem +Schalter am Textfeld oder beim Knopf "1" in der +Statusknopfleiste. Beruehrt man den Knopf mit der +Maus, gibt es eine kurze Info ueber die Taetigkeit +des Ports und die Farbe des Knopfs zeigt mit gruen +dass Daten ankommen bis rot wenn sich eine Minute +nichts tut. +An sich spricht nichts dagegen die Ports auch ohne +Funkausruestung dran eingeschaltet zu lassen, nur +senden von Messages mit automatischer Portwahl zeigt +dann "Message gesendet" aber halt ins Nirvana. +AXUDP ermoeglicht auch Rx auf anderen Standorten +und, soweit erlaubt, auch Senden. Es koennen mehrere +Rx auf den selben UDP-Empfangsport Senden zB mit +Soundmodems mit verschiedenen Parameter aus einem +Rx oder mehrere Rx mit Antennen-Diversity +|de-igate:Igate: + + + +|de-igate +Igate-Funktion is auf Systemen mit TCPIP-Flusskontrolle +einschaltbar, aber nur als Behelf, da es mit |de-udpgate:udpgate: +eine Loesung dafuer gibt womit dann auch mehrere aprsmap +via einem Link nach aussen online gehen koennen. + + + +|de-udpgate +udpgate4 ist ein Linux IGate mit WWW-Seite und AprsIs-Server. +Auf Win gibt es die Software nicht, da das TCPIP-System +beim senden vom Daten ans AprsIs-Netz kein Feedback hat +ob Daten verzoegert abgeliefert werden. EIN verzoegernder +Igate von vielen der die gleichen Frames hoert, erzeugt +Verzerrte Tracks auf tausenden Bildschirmen. + + + +|de-map +Um Karten von OSM-Servern zu bekommen muss man +(nebst Internet Verbindung) +Config / Map Parameter / Load Map Program eingetragen, +aktiviert, und das hier aufgerufene externe Programm +konfiguriert haben. +Laeuft das Ladeprogramm, erscheint statt dem "E" im Knopf +der Status Zeile ein "D". Es ist normal, dass sich das +Ladeprogramm nach getaner Arbeit beendet denn es wird +bei Bedarf automatisch neu gestartet. + +Klickt man (je nach |de-nextclick:On Next Click: Einstellung) ein Objekt an, +so wird versucht es in das Fenster einzupassen. Sind die +Karten dafuer aber (noch) nicht komplett vorhanden gibt es +2 Moeglichkeiten mittels |de-havemaps:Zoom as have Maps: nur so weit zu +zoomen als es Karten gibt oder bis sie nachgeladen sind, +schwarze Kacheln zu akzeptieren. + +Mit "Config / Map Moving / Expand Map" eingeschaltet, +was auch direkt mit Klick auf den "E"-Knopf geht, +werden automatisch fehlende Karten-Teile aus der naechst +kleineren Zoom-Stufe gedehnt, durch rotes Leuchten des +"E/D" Knopfes signalisiert, und (wenn enabled) der +Kartenlader gestartet. +|de-view:Start Ansicht: einstellen und speichern +Um sich von Gebieten komplette |de-mapdownload:Kartensammlungen: auf die +Platte zu laden gibt es Tools / Choose Maps / |de-mapdownload:Download:. +Um Karten(Teile) die beschaedigt sind oder wenn man sie +einfach erneuern will hilft Tools / Choose Maps / |de-reload:Reload:. + +|de-havemaps +Sind noch wenig Karten-Teile vorhanden auf der Rechner- +Platte, ist der Schalter +"Config / Map Moving / Zoom as have Maps" besser auf "Aus". +Damit erscheinen zwar, bis Karten geladen sind, schwarze +Teile, aber das Laden startet. Hat man schon viele Karten +oder ist Offline oder will einfach gerade keine neuen +Karten laden, so kann man "Zoom as have Maps" einschalten +womit beim Anklicken von Objekten die Karte nur mehr so +weit gezoomt wird, wie sie noch fuer das ganze Bild +vorhanden ist. +Wegen schneller Berechnung wird hier nur auf +Vorhandensein der Karten-Files untersucht, falls diese +dann nicht ok sind, kann trotzdem Laden starten oder +eine gedehnte oder schwarze Kachel erscheinen. + + + +|de-reload +Tools / Choose Maps / Reload +Wenn man zB. dabei ist, OSM-Karten zu erstellen oder zu +verbessern, kann man die Kartenteile (256x256 Pixel), die +schon auf der Platte sind, fuer den sichtbaren Bildausschnitt +neu Downloaden. Geht der Download schief, erscheinen die +alten Karten wieder. + + + +|de-mapdownload +Man stellt durch |de-zoom:Zoomen: und |de-move:Verschieben: und/oder durch Aendern +der Fenstergroesse den gewuenschten Kartenausschnitt ein, gibt +versuchsweise einen |de-zoomlevel:Zoomlevel: von 1 bis 18 ein, wobei jede +hoehere Zahl doppelte Aufloesung ergibt und damit etwa +vierfaches Datenvolumen, und wenn man damit zufrieden ist, +startet man den Download, der im Hintergrund ablaeuft. +Hinweis: da es sich um ausgeklappte Menues handelt, die sich +beim Beruhren mit der Maus schliessen, sollte man zum +"Start"-Knopf aussen herum fahren. +Die Berechnung kann bei hohen Werten eine Weile dauern, da +alle schon vorhandenen Kartenteile auf korrektes +Bildformat untersucht werden und im Fehlerfall ebenfalls neu +angefordert werden. +Die angezeigten Byte sind als sehr grober Schaetzwert zu sehen +da ein komprimiertes Bildformat je nach Inhalt 400 bis 200000 +Byte haben kann. +Der Download kann je nach Server, Downloadprogramm, +Internetanschluss und Volumen sekunden bis zu mehreren Tagen +dauern. Um nach einem Abbruch fortzusetzen, kann man sich den +gewaehlten Kartenausschnitt und |de-zoomlevel:Zoomlevel: mittels Shift- +Linksklick auf einen der 4 |de-view:"View":-Tasten im Zoom-Menue speichern +und evtl. mit Config / |de-saveconfig:Save Config: speichern falls ein +leerer Akku droht. + + +|de-saveconfig +Config / Save Config +Speichere die momentane Konfiguration jetzt in +aprsmap.cfg was ansonsten nur beim Beenden des +Programms und eingeschaltetem |de-autosave:"save on quit": +der Fall ist. + + + +|de-autosave +Mit dem Schalter Config / Save Config kann ein- oder +ausgeschaltet werden ob die Configuration beim Beenden +des Programms mit File / Quit oder "q"-Taste oder +zuklicken des Fensters gespeichert werden soll. +Falls nicht, und man auch nicht manuell gespeichert hat, +ist sie am Zustand vom Programm Start. + + + +|de-view +Ein "View" ist eine konfigurierte Kartenansicht bestehend aus +|de-zoomlevel:Zoomlevel: und sichbarem Kartenausschnitt. Es koennen mit Shift- +Linksklick auf einen View-Knopf im Zoom-Menue 4 Ansichten +gespeichert, mit draufklicken (ohne Shift) wieder abgerufen, +und mit den Tasten 1 bis 4 direkt aktiviert werden. + +Besonders empfohlen sei, die Ansicht, die man bei Programm +Start haben will, auf den ersten Knopf (ganz links) zu legen. +|de-zoomframe:Schnell Zoomen: fuer geuebte. + + +|de-move +Verschieben der Landkarte geht mittels der 4 Cursor-Tasten, +im Zoom-Menue, klicken knapp innerhalb des Fenster-Rahmens +oder Ziehen mit gehaltener Linker oder mittlerer Maus-Taste. +Die Schrittgroesse ist in "Config / Map Moving / Map Move Step" +einstellbar und im laufenden Betrieb mit gehaltener Shift- +Taste auf 1/10 verfeinerbar. +Beim Verfolgen von beweglichen Objekten kann man die Karte +automatisch |de-watch:mitschieben: lassen. +die C-Taste oder Menue " Zoom / Center " stellt die Kartenmitte +auf die zuletzt angeklickte Stelle. Dies ist nuetzlich wenn +man danach |de-zoom:hineinzoomt: um den gewuenschten Ort im Bild zu +behalten. Das geht auch mit auf |de-zoomframe:Bild Ausschnitt zoomen:. +Mittels "Tools / |de-nextclick:On Next Click: / To Map" kann man Zentrieren +auf jeden Linksklick einschalten. +Die Schieberichtung der Richtungstasten kann bei Bedarf in +"Config / Map Moving / Swap map move dir" umgekehrt werden. +|de-mauspos:Maus-Koortinaten: und |de-measure:Wegstrecken Messen: +|de-history:Zurueck wo man war: + +|de-zoomframe +Mit gehaltener Shift- und linker Maustaste und Maus ziehen +spannt man ein Rechteck auf, dessen Inhalt beim auslassen +der Maustaste auf Fenstergroesse gezoomt wird. Retour wie +sonst auch mit |de-history:Zurueck wo man war: + +|de-mauspos +Unter "Config / Map Parameter / Show Loc of Mouse" einschalten +damit werden Laenge/Breite/QTH-Lokator des Mauszeigers sichtbar. +|de-measure:Wegstrecken Messen: +Tipp: bei Akku Betrieb nur verwenden wenn gerade notwendig +da wegen Bildschirm-Update mehr CPU/Strom verbrauch. + + + +|de-measure +Mit Shift-Linksklick auf die Landkarte kann ein Anfangspunkt +markiert werden und bei jedem weiteren Klick auf die leere +Karte wird in einem Popup Fenster die Entfernung zum letzten +Punk gezeigt und die Gesamtstrecke aufsummiert. +Neustart wieder mit Shift-Linksklick. + + + +|de-watch +Calls koennen in die Beobachtungsliste eingetragen +werden unter "Config / Watch Calls" oder von einem +ausgewaehlten Objekt direkt unter "Infos" uebernommen +werden. Eintraege der Liste koennen aktiviert oder +deaktiviert werden, letzteres ist wie nicht vorhanden. +Kommt eine Positionsbake von einem aktivierten Objekt +und befindet man sich nicht im |de-1:Nur 1 Objekt:-Modus, +so verschiebt sich die Landkarte bei gleichbleibendem +|de-zoomlevel:Zoomlevel:, sodass das Objekt sichtbar wird. Wie +nahe das Objekt dabei im |de-center:Zentrum: gehalten werden +soll laesst sich einstellen. Weiters kann ein in +|de-beep:Tonhoehe: und |de-beep:Dauer: einstellbarer |de-watchbeep:Pieps: eingschaltet +werden. Alle Objekte koennen auch auf |de-prox:Annaeherung: +an den eigenen Standort ab einem bestimmten |de-radius:Radius: +einen |de-prox:Annaeherungs Warnton: erzeugen. + + + +|de-1 +Zeige nur 1 Objekt und (wenn vorhanden) dessen Track. +Der Modus wird durch leuchten des "."-Knopfes der Status +Knopfleiste angezeigt und kann durch Anklicken jenes +oder "Zoom / Show All" oder die 0-Taste oder zuerueckgehen +in der |de-history:"History": beendet werden und man sieht +wieder alles. +|de-debug:Debug Infos: +|de-history:Zurueck wo man war: + + +|de-history +Die meisten Karten |de-zoom:Zooms: und |de-move:Verschiebungen: koennen mit der +"b" oder BACKSPACE-Taste, durch Klick auf " Zoom / << " +oder der rechten Maustaste rueckgaengig gemacht werden. +Es werden bis zu 20 Schritte zurueck gespeichert, die +erste Einstellung bleibt immer erhalten wie auch einfach +durch die "1" Taste mit gespeicherter |de-view:Karten Positionen:. + + + + +|de-zoom +Zoomlevel manuell einstellen geht mit + und - Taste oder am +Zoom-Menue, mit dem Maus-Rad oder rechten Rand des Mauspads +sofern aktiviert. Zwichenstufen gehen beim Zoomen mit +gehaltener Shift-Taste wobei die Feinheit der Stufung unter +"Config / Map Moving / Fine Zoom Step" veraendert werden kann. +Die Zwischenstufen werden durch Interpolieren der naechst +groeberen Karte gemacht und es ergibt sich dabei ein unscharfes +Bild. Verkleinern einer hoeheren Aufloesung waere hier zwar +besser, dabei wuerde aber der Text der Karte unleserlich. +Mit |de-zoomframe:Schnellzoom: kann man etliche Zoom-Stufen auf einmal machen. +|de-zoomlevel:Zoomlevel: +|de-autozoom:Automatischer Zoom: +|de-history:Zurueck wo man war: + + + + +|de-zoomlevel +Zoomlevel ist eine Besonderheit der OSM-Karten um Landkarten +mit verschiedenem Massstab als Bild zu Speichern. +Zoomlevel 1 ist die ganze Welt, jeweils die naechste Stufe +doppelte Genauigkeit. Level 13 bis 14 reicht fuer Landstrassen +15 bis 16 im Ortsgebiet und ueber 18 kommt meistens keine +Information mehr hinzu. +|de-zoom:Manuell Zoomen: +|de-autozoom:Automatischer Zoom: +"Config / Map Moving / Max Zoom" dient nur zum Limitieren +des Zoomlevels bei schnellem manuellen hineinzoomen. + + + + + +|de-autozoom +Beim Anklicken von |de-1:Objekten: auf der Karte kann unter +"Tools / |de-nextclick:On Next Click:" konfiguriert werden, dass das +Objekt mit evtl. einem Track in das Bildschirmfenster +eingepasst wird. Damit kleine oder punktfoermige Objekte +(also ohne Track) nicht immer einen Karten Download +starten, kann man unter "Config / Map Moving / Default Zoom" +einen default Zoomlevel (zB. 14) einstellen und bei Bedarf +manuell weiter Zoomen. +|de-zoomlevel:Zoomlevel: +|de-history:Zurueck wo man war: +|de-nextclick +Tools / On Next Click +Hier kann man sich das Verhalten auf einen Links-Klick +auf Karte, Symbol, Text, Track und Wettersymbol einstellen. +Waehlt man nichts mittels "Menu" poppt ein Menue mit den +Auswahlmoeglichkeiten zum angeklickten Objekt auf. + +"Raw+Decoded" liefert die Rohdaten und deren Infos in +lesbarer Darstellung mit Zeitstempel und |de-debug:Debug Infos: + +"Show Rf" zeigt bei sendenden Objekten welcher Igate sie +gehoert hat mittels |de-rfpath:weissen Linien:. + +"Del Waypoint" sei mit Bedacht verwendet und dient zum +reparieren von vielen Ausreissern auf Tracks. Das +Loeschen erfolgt nur im RAM nicht im |de-rawlog:Logfile:. +Einzelne falsche |de-waypoint:Wegpunkte: loescht man +besser mit der DEL-Taste oder im Info-Menue + +Die diversen Statistik-Diagramme sind selbsterklaerend. +Der vertikale Strich ist eine Marke zum zuordnen der +Stelle zum angeklickten |de-waypoint:Wegpunkt:. + +Mittels eingeschaltetem |de-trackfilter:Trackfilter: kann man grobe +Ausreisser aus den Statistiken fern halten. +|de-1:"Zoom to": +"Heard" bei einem Igate zeigt mit |de-rfpath:weissen Linien: +was er gehoert hat. +|de-marker:Marker setzen: + + + + +|de-debug +Debug Infos finden sich in den Raw+Decoded Daten rot markiert. +DUPE mit der Zeitangabe vor wieviel Sekunden die (bis +auf den Funkweg) gleiche Bake schon mal eingetroffen ist +mit dazwischen anderen Positionen. Das kann auch kein Fehler +sein wenn ein bewegtes Objekt den selben Punkt 2 mal angefahren +hat und bis zur letzen Kommastelle gleiche Hoehe/Geschwindigkeit/ +Fahrtrichtung und Position hat was sehr unwahrscheinlich ist. +Folglich ist ein "DUPE" fast immer ein in einem Digi oder IGate +verzoegerter Frame. Tritt dies mehrfach auf, kann man wenn immer +der gleiche Digi im Pfad ist mit gwisser wahrscheinlichkeit jenen +als Delay-Maschine identifizieren und per |de-callfilter:Callfilter: ausblenden +falls der Sysop nichts verbessert. + +SPIKE ist ein Ausreisser aus einem Track der auch mal echt sein +kann wenn sich das Objekt mit wenig Baken in kurvenreichem +Gebiet bewegt. Es kann auch ein GPS-Fehler sein oder ein Igate +der bei Mic-e Encodierung die Steuerzeichen verwurstelt hat. +Tipp:|de-callfilter:Callfilter: Via Igate + +DIST ist ein als zu lang empfundenes Wegstueck ohne Wegpunkte +gegenueber dem was davor kam. Das ist bei unrealistischem +Reiseweg meist ein Uebertragungsfehler und sonst einfach +zu lang keine Baken empfangen. Der "Fehler" wird nur markiert +damit er mittels eingeschaltetem |de-trackfilter:Trackfilter: die Striche +quer uebers Bild entfernt. + +SEG ist aehnlich wie DIST einfach ein schwer dazustellender Track +der aus 2 entfernten Teilen besteht. 2 Tracks haetten 2 Fahrzeuge +des gleichen Objekts vorn dran daher wird bei eingeschaltetem +|de-trackfilter:Trackfilter: der aeltere Teil nicht dargestellt. + +SPEED ist eine unrealistische Strecke pro Zeit und entsteht +manchmal durch 2 Sender mit selbem Call und SSID an verschiedenen +Standorten. + + + +|de-callfilter +Config / Callfilters +damit kann man unerwuenschte Objekte vom der Karte fernhalten. +das betrifft nur die Daten im RAM nicht im |de-rawlog:Logfile:. +Es kann auf + +"Objekt Name" gefiltert werden dazu gibt man den Namen ein der +beim Symbol steht (keine Wildcards) + +"Via Igate" entfernt alles was dieser Igate liefert + +"Sender of Object" filtert alles was von diesem Call als Object +oder Item verbreitet wird. Wer welche Objects und Items sendet +findet mal durch anklicken eines Symbols im "Infos"-Menue unter +"Objects of ..." + +"Destination Call" ist das AX.25 Zielcall, damit wird oft die +sendende Software erkennbar und kann damit, wenn nachhaltig +Unsinn verbreitend, ausgefiltert werden. + +"Word in Comment" kann ein Teil im Kommentar-Feld sein zB "RNG0" +wenn man sich damit von Karten vermuellende Vielfachsymbol- +schleudern befreien kann. + +Es koennen beliebig viele Filter eingegeben, aktiv/inaktiv +geschalten und geloescht werden. + + + + +|de-rfpath +Funkwege berechnen. +Hierbei kann manchmal nur ein "kleiner Rest" der +Wirklichkeit gezeigt werden da viele Hf-Digis ihr +Call nicht dazu schreiben und das AprsIs-Netz nur +den Igate zeigt, der es am schnellsten zum Server +geliefert hat. Es fehlen also Igate die serielle +TNC oder langsames Internet haben wenn die gleiche +Bake auch von Soundmodem+Glasfaser-Igates empfangen +wurde. Je breiter die weisse Linie desto mehr Baken +nahmen diesen Weg. + +"Config / Map Parameter / Brightness RfPath" ist die +Helligkeit der weissen Linien in Funkausbreitungs- +Darstellungen. + + + + + +|de-marker +Marker 1, das grosse gelbe "+" zeigt eine markierte +Stelle auf der Karte oder einen |de-waypoint:Wegpunkt:. +Alle weiteren Klicks zeigen dann Entfernung und +Winkel zum Marker. +Ein Marker auf der Karte kann durch klicken mit +gehaltener Shift-Taste oder einfaches klicken +und dann x-Taste gesetzt werden. +der zweite Marker mit y-Taste erzeugt eine gruene +Linie auf der Karte zB zum verfolgen von Funkstrecken. +Weiters kann mit /-Taste oder "Zoom / Zoom to Marker" +auf den Karten-Ausschnitt gezoomt werden den die +beiden Marker aufspannen. "klick-x-klick-y/" +Nervige Marker werden mit "Clear Markers" in +diversen Menues oder der :-Taste entfernt +|de-qth:QTH-Lokator finden: + + +|de-qth +Tools / |de-find:Find: +und als Suchbegriff ein QTH-Lokator zeigt dessen +Flaeche und Mittelpunkt auf der Karte +zB. JN68PC + +|de-find +Tools / Find +Suchen von Objekten entweder in genauer schreibweise +gross/klein ist wichtig oder mittels ? oder hinten +dran * als Wildcard |de-1:zoomt: zum gefundenen +Objekt oder liefert ein Auswahlmenue wenns mehrere +gibt die zum Suchbegriff passen. Davon kann dann +eins ausgewaehlt werden. + + +|de-waypoint +Ein Wegpunkt entspricht einer empfangenen Positionsbake +eines beweglichen Objekts. die weissen Punkte koennen +in "Config / Brightness / Waypoint" in der Helligkeit +eingestellt oder sind bei 0% ganz weg. +ist ein Wegpunkt mit dem |de-marker:Marker 1: ausgewaehlt, +gibt es umfangreiche Darstellungs- und debug-Moeglichkeiten. +|de-rfpath:RfPath: +|de-sendmsg:Message senden: +|de-animate:Animieren: +|de-debug:Debug Infos: + +|de-sendmsg +Hier kann eine Nachricht an ein Call gesendet werden + +|de-animate +Animation am Bilschirm +Pause mit Blank-Taste oder draufklicken +Geschwindigkeit einstellen mit draufklicken und dann +im Menue gewuenschtes Verhaeltnis Echtzeit zu +Darstellung einstellen. Die Zeit gilt bei 25Hz +Bildfrequenz und wird bei evtl. nachfolgendem +|de-video:Video erzeugen: weiter verwendet. + +|de-video +Aus der sichtbaren Darstellung kann ein Video-File +erzeugt werden sofern sich Objekte im Bild befinden +die sich bewegt haben. Der Zeitabschnitt wird in +"Config / Brightness / Time |de-fullbright:full Bright:" ausgewaehlt +und die Zeitraffer bei der vorherigen |de-animate:Animation: +einjustiert. +Es wird die Studio-Version des unkomprimierten +y4m-Videoformates in ein File "map.y4m" im +Startverzeichnis geschrieben das sehr lang +werden kann. Auf Linux erzeugt man am besten +mit "mknod map.y4m p" eine named pipe und startet +"x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m" +und erhaelt platzsparend ein H264 Video. +Mit --crf kann die Qualitaet/Filegroesse +optimiert werden. Das y4m-Format wird aber auch +direkt von "vlc" und "mplayer" verstanden. + + +|de-trackfilter +Trackfilter kann mit f-Taste oder dem F-Knopf in der +Statusleiste ein- und ausgeschaltet werden. Die Wirkung +zeigt sich im Bild sofern fehlerhafte oder nicht +sinnvoll darstellbare Track-Teile an und weg gehen. +Es werden dabei keine Daten veraendert, nur die als +falsch markierten Wegpunkte nicht verwendet als +seinen sie nicht empfangen worden. +Wer "sauberen Bildschirm" haben will, kann eingeschaltet +lassen, Sysops sei aber nahegelegt, sich mit den Ursachen +der Pannen zu befassen und dazu gibt es |de-errors:Show Errors: +als debug Tool bei einem angeklickten Objekt im +"Info"-Menue. + +|de-errors +Mit der e-Taste oder "Errors/Waypoints" im "Info"-Menue +werden beim durchsteppen des Tracks mit den < > -Tasten +oder entsprechendem Knopf alle oder nur die Wegpunkte +die als fehlerhaft markiert sind angesprungen. +im Raw+Decoded-Popup-Fenster sieht man den gesamten +Baken Rohtext mit Funkweg Igate und alles dekodiert +und die |de-debug:Error-Flags:. Mit "Delete Waypoint" +oder der DEL-Taste kann der aktuelle Wegpunkt geloescht +werden und wenn man im "Show Errors"-Modust ist, spring +der Marker dann zum naechstgelegenen Fehlerpunkt. +Bleiben offenichtlich unterkannte falsche Punkte ueber +kann man diese anklicken und dann loeschen oder wenns +viele sind mit |de-nextclick:Tools / On Next Click: / To Track +"Delete Waypoint" einschalten und jedem Klick auf den +Wegpunkt entfernt diesen. +Hat man zuviel entfernt hilft |de-writelog:Logfile neu einlesen: +Will man als Kletterer/Segler... ein sauberes Hoehenprofil, +kann man zusaetzlich in |de-nextclick:Tools / On Next Click: / To Track +"Altitude" einschalten und mit dem dort sichtbaren Cursor +auf die (meist vom GPS erfundenen) Ausreisser mittels Track +anklicken manoevrieren und dann die Wegpunkte loeschen. +Ein so gesaeuberter Track kann dann per Bildschirmfoto +(mit den Diagrammen) oder per eingebautem |de-screenshot:Screenshot: +oder als Rohdaten im "Info"-Menue mit "Save Info to File" +oder als |de-video:Video: archiviert werden. + + + +|de-writelog +mit "File / Import Log / Reload Writelog" kann +(falls vorhanden) wieder alles ins RAM gelesen +werden was man versehentlich geloescht hat. + + + +|de-screenshot +File / Screenshot oder s-Taste +Speichert das sichtbare Bild ohne Menues in ein Bildfile +(auf Linux ".ppm" oder ".png", auf Win ".bmp") +%t im Filenamen setzt Datum und Uhrzeit ein +%n eine laufende Nummer +sodass ein weiterer klick oder "s" ein neues Bild erzeugt. + + +|de-rawlog +Logfile + + + +|de-center +Call im Zentrum halten + + + +|de-watchbeep +Unter Config / Map Moving / Bell/Sound kann ein +Pieps ein- und ausgeschaltet und in |de-beep:Tonhoehe: und +|de-beep:Dauer: parametriert werdn. Beim Anklicken des +Knopfes wird zum Test dieser Pieps ausgeloest. +Tipp: +hier nur kurzen Ton einstellen wenn er oft auftritt. + + + +|de-prox +Unter Config / Map Moving / Proxy Warn km kann ein +Warnton ein- und ausgeschaltet und in |de-beep:Tonhoehe: und +|de-beep:Dauer: Parametriert werden. Das erste Zahlenpaar +bestimmt den Ton bei Eintritt in den |de-radius:Warnradius:, +das zweite bei 0km. Dazwischen wird ein weicher +Uebergang erzeugt. + + + +|de-radius +Unter Config / Map Moving / Proxy Warn km kann ein Radius in km +um den eigenen Standort eingegeben werden ab dem ein +Popup-Fenster ein sich naeherndes Objekt anzeigt. +Ein im Abstand zum Zentrum variirender |de-prox:Ton: kann ebenfalls +Zugeschalten werden. + + + +|de-beep +Config / Map Moving / Bell/Sound +Tonhoehe (in Hz) und Dauer (in millisekunden) +Zum Testen im eingeschalteten Zustand auf den Knopf klicken + + + +|de-messages +Eine Kurznachricht (Message) einen User oder Query +(Steuer/Anfrage Befehl an eine Maschine) kann durch +anklicken eines Objekts und dann "Message" oder durch +klicken auf den "M"-Knopf in der Statusleiste erzeugt +werden. +Empfangene Messages werden in einem Popup-Fenster +gezeigt, koennen dabei einen |de-beep:Pieps: erzeugen +und mit "Reply" beantwortet werden. +Querys koennen konfigurierbare Aktionen und +|de-queries:automatische Antworten: erzeugen. + +Kommt eine Message an das eigene Call aber mit anderem +SSID, wirds zwar angezeigt aber nicht bestaetigt. + + +|de-queries +Config / Rf-Ports / Query Keywords +Auf ankommender Querys (Message mit "?" am Anfang und +normal ohne Bestaetigung) koennen verschiedene Funktionen +konfiguriert werden. +"Stichwort:"und der Rest der Zeile wird entweder gesendet +oder mit "\\" ein Befehl ausgefuehrt. + +\\v Programm Version +\\p Funk/Internet Pfad auf dem die Message kam +\\l eigene Laenge/Breite +\\h sendet Systemzeit +\\>test.txt< schreibt die Message ins File "test.txt" + und falls ein Programm das File vorliest, kann man + sprechende Messages basteln. +\\ fuegt den Inhalt den Files "wetter.txt" ein +Achtung: Gesamtlaenge maximal 67 Zeichen. + +?VER:VERSION \\v \\v sendet Programm Version +?APRST:PATH= \\p \\p sendet Pfad der Msg +?APRSP:\\l \\l sendet eigene Position +TALK:\\>filename Time \\h sendet ein File and Time +?HELP:?VER,?APRST,?APRSP,TALK,?WX sendet Hilfetext + + + + +|de-shortcuts +: Marker loeschen +@ reset auf Menu Mode +a Animate +B Baken Editor oeffnen +b oder zurueck in Position History +c Zentiere den zuletzt angeklicken Punkt +e Nur Errors/Alle Wegpunkte zeigen bei <> +F Finde Call (mit Wildcards * ?), Lokator, Breite/Laenge +f Track Filter ein/aus +h Zeigen gehoerte Stationen von einem angeklicken Igate +i Status Liste +l Labels (Calls) ein/aus +M Message Schreiben +m seit min. 10min stillstehende Stationen dunkel ein/aus +o Zeige Objects/Items ein/aus +q Quit +r Zeig weisse Funkstrecken Linien von angeklickter Station +s Screenshot ppm/bpm +u Tx/Rx-Monitor Fenster ein/aus +w Wx Temperatur (W Regen) +x setze Marker 1 wo gerade hingeklickt +y setze Marker 2 und Line zu Marker 1 +< > Liste gespeicherte Baken/Wegpunkte der angeklickten Station +/ Zoom auf das von Marker 1-2 aufgespannte Rechteck +\ Shortcut Liste +~ Aendere Track Farbe ++ hineinzoomen +- herauszoomen +. zoomen auf angelickte Station += wie . aber mit Funkstrecken +0 Zeige alle Stationen +1,2,3,4 Zoom/Pan auf vorgespeicherte Views +7,8,9 Benutze Kartentyp 1 2 3 aus der Kartenliste +ESC schliesse Menues +Cursor up/down/left/right Karte bewegen +SHIFT mit up/down/left/right/[zoom+]/[zoom-] kleine Schritte +DEL loesche angeklickte Station oder Wegpunkt +ctrl-V Paste + +|en-shortcuts +: delete markers +@ reset to menu mode +a Animate +B Open Beacon editor +b or go back in position history +c Center (to last clicked Pixel) +e toggle Errors only/All for stepping along a track with <> +F Find Call (with wildcards * ?), Locator, Latitude/Longitude +f Junk Filter toggle on/off +h Heard (click symbol or text of igate before) +i Internal Status Listing +l toggle Labels on/off +M Compose Message +m toggle dimm not moving since 10min +o toggle Objects/Items on/off +q Quit Program +r toggle Radio tracks on/off +s Screenshot ppm/bpm +u toggle tx/rx-Monitor window on/off +w toggle Wx Temperature (W Rain) Map (use topo or dark map) +x set Marker 1 to clicked position +y set Marker 2 and Line to Marker 1 +< > Step along Beacons/Waypoints of a selected User +/ zoom to Marker 1-2 Square +\ shortcut list +~ change track colour ++ Zoom in +- Zoom out +. zoom to track and show only this (clicked before) += same as . but with radio tracks +0 show all (and radio tracks off) +1,2,3,4 Zoom/Pan to stored Views +7,8,9 use map type as configured +ESC close menus +Cursor up/down/left/right move map, same as click near margin +SHIFT with up/down/left/right/[zoom+]/[zoom-] in smaller steps +DEL delete selected +ctrl-V Paste + +|en-map +Helptext Map + +|en-rf +Helptext Rfports + +|en-online +Heltext AprsIs Config + diff --git a/src/hints.txt b/src/hints.txt new file mode 100644 index 0000000..0638d2c --- /dev/null +++ b/src/hints.txt @@ -0,0 +1,989 @@ +|101 If a Click hits more than 1 User, you may +select the desired with this button or +simply click again on the same Position +and the Calls will rotate to the +preselected top position + +|102 If a Click hits more than 1 User, you may +select the desired with this button or +simply click again on the same Position +and the Calls will rotate to the +preselected top position + +|104 Show additional Infos of the selected User + +|106 Zoom the Map to fit this User with Track +into the Window + +|107 Zoom the Map to fit this User with Track +and the Igates which heared it direct +to the Window. If info avaliable, white +Lines show the Radio Paths of each Beacon + +|108 If Call is Igate, Zoom Map to fit the +Stations and Tracks heared direct to +the Window. The thicker the white +Lines, the more Beacons took this way + +|109 Compose a Message to this User +or a Query to a Machine + +|110 Go to normal Mode and Show all Users + +|111 Remove Marker 1 and 2, the Measure +Line and QTH Locator Area + +|113 Config what to do when Click +on Symbols/Text/Tracks + + +|114 Shift-Leftclick to Store View, Leftclick +or "1" Key to jump to this View +View 1 is used at Start + +|115 Shift-Leftclick to Store View, Leftclick +or "2" Key to jump to this View + +|116 Shift-Leftclick to Store View, Leftclick +or "3" Key to jump to this View + +|117 Shift-Leftclick to Store View, Leftclick +or "4" Key to jump to this View + +|130 Zoom Out, with SHIFT in +configurable Stepwidth + +|131 Move Map, with SHIFT in 1/10 Steps +|133 Move Map, with SHIFT in 1/10 Steps +|135 Move Map, with SHIFT in 1/10 Steps +|137 Move Map, with SHIFT in 1/10 Steps + +|132 Zoom In, with SHIFT in +configurable Stepwidth + +|134 Center before Leftclicked Position on Map + +|136 Step back in Zoom/Pan History, same +as "b" BACKSPACE or Rightlick + +|138 close this menu + + +|200 Log, Screenshot, Video, Quit + +|201 Config Map, Timers, Internet, Rf... + +|202 Move/Zoom Map, You can invert moving directions +and store map positions/zooms to "views" +view 1 is used at start + +|203 Change/Get Maps, Behaviour of Clicks, Send Messages ... + +|204 List Shortcuts + +|300 Quit Program + +|301 Generate a Video file/stream in YUV4MPEG2 format +in File/Pipe map.y4m. Adjust all parameters before +with the "Animate" function. The File/Stream may +be viewed with VLC, Mplayer or packt by x264 +eg. x264 -o film.mp4 --muxer mp4 --crf 22 map.y4m + +|302 Save screen Image (without menues) to File +%t insert date-time in filename +%n insert counter + +|303 For viewing historical/downloaded data + +|304 Load/Edit/Save Program Parameters + + +|400 List Objects/Items +for highlighting keywords +enter word in Tools / Find +|401 List Objects/Items decoded +entries may be sortet by Call or Time +click on a Line shows position on map + +|405 List Weather Stations +for highlighting keyword +enter word in Tools / Find +|406 List Weather Stations decoded +entries may be sortet by Call or Time +click on a Line shows position on map + +|410 List Moveing Beacons +for highlighting keyword +enter word in Tools / Find +|411 List Moveing Beacons decoded +entries may be sortet by Call or Time +click on a Line shows position on map + +|415 List Stations sending no Position +for highlighting keyword +enter word in Tools / Find +|416 List Stations sending no Position decoded +entries may be sortet by Call or Time + +|420 Toggle Net Data off/raw/decoded +|421 Toggle Rf Port1 Data off/raw/decoded +|422 Toggle Rf Port2 Data off/raw/decoded +|423 Toggle Rf Port3 Data off/raw/decoded +|424 Toggle Rf Port4 Data off/raw/decoded +|425 Open Monitor Window for watching in/out +going Frames. +If line contains a position a click on the +line shows position on map. +For highlighting keyword enter word in +Tools / Find or "F". +Srolling stops if text is not on top or +bottom. +"u" key for quick toggle window on/off. +Clr clears content. +Use cursor keys and copy/paste(out) + +|430 List Messages +|435 List Bulletins +|440 Show program internal infos + + +|500 Find Object/Call and Zoom to or Enter +QTH-Locator to see its Area on Map or +Enter Lat/Long to set a Marker on Map +(Shortcut F) + +|505 Animation start Time is when first Object begins +to move, Stop when last stops, change Speed by +Menu with Leftclick to Map, "no move phases" +are automatic shortened by larger timesteps. +Modify Start time with "Time full Bright" Knob +(Shortcut a) + +|515 Remove Marker 1 and 2, the Measure +Line and QTH Locator Area + + +|520 Blue for Rain 24h and red for Rain last hour +(Shortcut W) + +|525 Make a Color Image out of Temperatures +of WX Stations (on/off), Map is converted +to B/W, Topo-Maps are nice here (Shortcut w) + +|530 To see moving stations (Shortcut m) + +|535 Manage Send Messages (Shortcut M) + +|536 Enter Root directory path of Map-Cache +where the Map Downoad Task writes Map +Files into or where You have a set of +downloaded Maps + +|538 Manage Map Types. +The Lines are typnames like "tiles_topo -128" +the optional value is a brightness correction +(range -255 to 255), darker with - values. +The names use subdirectories in "map directory" +and are passed to the map downloader where URLs +to the names are associatet. First entry is used +at program start. Sort entries by "Edit" and "Add". +Use first 3 lines by shortcut "7" "8" "9" else +"Tools > Choose Map" + +|540 Choose Maptype, Reload Map You see +or Prepare offline Map Collections + +|545 Listings + +|550 Config what to do when Click +on Symbols/Text/Tracks + +|555 Switch off Static Toolbar and +Open as Popup on Click to Map + +|560 List Shortcuts + +|565 Preferences + +|570 Files Stuff and Quit + +|575 Switch on Static Toolbar + +|700 Define Area and Resolution for Downloading +a Complete OSM Map Collection for Offline usage. +Higher Zoom gives more Details but Storage/Network +consumption is 4x every next Level. +Level 13 for outside Town Streets +15 inside Town, 16 Houses, Oneways.... + +|701 Reload the Map-part You see. +Do if newer maps may be avaliable +or something is wrong. +If download failes, the +old Maps will come back + +|710 Shortcut "7" "8" "9" are last 3 Lines +Last Line will be used at Program Start +Resort Lines in "Add Maps" with "Edit" +and "Add" + +|900 What to do on a Click to Map +"Center" if You prefere Map movement + by Centering clicked Point +"Clear Menus" to get rid of this junk + ESC key Clears too + +|901 What to do on a Click to Text +"Heard" for Igates +"Set Marker 2" if Marker 1 +set by Symbol Click for +fast distance measurements + +|902 What to do on a Click to (not WX) Symbol +"Raw+Decoded" for Text Info +"Set Marker 1" for measurements + +|903 You may enable as many WX graphics +as fit into Your Window + +|904 What to do on a Click to Track +"Zoom to" does good job +"Raw+Decoded" for debug + + +|1310 Show driving speed over time as data +avaliable, out of sense values are not shown + +|1311 Show Altitude over km + +|1312 Pop up a Menu for actions with this Object + +|1450 Count Sent Messages, Acks, Rejects in Fullbright Time + +|1445 Cycle through avaliable Track Colours incl Invisable + +|1440 Delete the first Waypoint nearest to Click +continued Hits to this Button deletes +Waypoints with error markers. If clicked +to Symbol or Text the whole User will be +deleted (only in RAM not in Logfile) + +|1438 Show Objects of this Sender on Map + +|1435 Append this User to Watchlist +so get a Popup Window with a Message +if the User is active and (if not in +Single User Mode) the Map is shifted +to fit last position into sight. +In Config, Map Moveing, Center Watchcall +you define how near to Center of Window. +Next Hit to this Button will switch off +watching this Call. + +|1430 Switch off watching this Call. +May be enabled again in Configs Watchlist +or another hit to this Button + +|1425 Write (or Append if exists) Track and +all Info to this Call to a file with +name of the Call and so may be viewed +later by Importing the logfile. + +|1420 Count Beacons and view it in a Histogramm + +|1415 Sum driven Distance and if info avaliable, +show an Altitude over Distance Diagramm. +Trackfilter on/off may repair wrong values +or manual delete wrong waypoints before. +The Cursor line shows a marked waypoint. + +|1410 If info avaliable show a Speed over Time Diagramm +Trackfilter on/off may repair wrong values +or manual delete wrong waypoints before. +The Cursor line shows a marked waypoint. + +|1405 List raw Data of this User +on the Monitor text Window + +|1406 List raw and decoded Data of this User +on the Monitor text Window +|1400 Show info to Waypoint or Beacon and go back in time +|1402 Show info to Waypoint or Beacon and go forward in time +|1401 Toggle show All or Waypoints with Error Flags + +|1501 Brightness of Objects/Items. This are things +not transmitting at this position but set there +from another Station. Dimm to 0 to switch off. + +|1503 Dimm to 1% to show waypoints only + +|1504 Fit image output to Your Monitor, +normal value is 2.2, this does not +affect Screenshot or Video function + +|1506 Text at Symbols on map not in menues +Item/Object Text may be dimmed additional +Toggle on/off with "L" shortcut + +|1507 This are the white dots in tracks with +transmitted position joined by track lines + +|1508 Remove timed out Things from Image, +data will stay in RAM until +"Keep Data im Memory" in Config + +|1509 Give Objects/Tracks time to dissapear +after "Full Bright Time" + +|1700 AprsIs Connect Status +Start/Stop Connection +Shift-Leftclick to Config +if no data received, change to red +Configure in Config, Online + +|1701 UDP Port 1 Status +Switch AXUDP Interface to TNC or Soundmodem on/off +Shift-Leftclick to Config +if no data received, change to red +Configure in Config, Rf-Ports + +|1702 UDP Port 2 Status +Switch AXUDP Interface to TNC or Soundmodem on/off +Shift-Leftclick to Config +if no data received, change to red +Configure in Config, Rf-Ports + +|1703 UDP Port 3 Status +Switch AXUDP Interface to TNC or Soundmodem on/off +Shift-Leftclick to Config +if no data received, change to red +Configure in Config, Rf-Ports + +|1704 UDP Port 4 Status +Switch AXUDP Interface to TNC or Soundmodem on/off +Shift-Leftclick to Config +if no data received, change to red +Configure in Config, Rf-Ports + +|1705 (End) Viewing data from logfile + +|1706 (View) Messages stored +Shift-Leftclick to Compose Message + +|1707 Red: Expanded parts of Map on Screen +Green: allow Expand else Expand off +"D" Download Task Runs +Shift-Leftclick to Config + +|1708 Trackfilter on + +|1709 (End) Single User shown + +|1800 path and filename, %t inserts time, %n is 000..999 +.bmp at end writes filetype BMP else PPM + + +|1900 Animation Speed, 1 is Realtime if played with 25Hz +This Value is used for Generating a Video File too +|1905 Stop Animation +|1910 Go On Animation with new Speed + + + +|1990 Enter Call (with ? Wildcard and * for rest +"oe?xbl*") or Locator "jn68pc". If no wildcards, +it is case sensitive and needs full word length. +or lat/long ddmm.mm dddmm.mm"4806.09N 01318.67E" + + + +|2300 Stop map download, download may be continued +later + +|2301 Enter Zoomlevel 1..18 and calculate quantity +of map parts to be downloaded for a complete map with +all zoomlevels for the visable area. Start with lower +levels until testing of having map parts takes a while. +If value fits, press download button by moveing mouse +not over other menus. To stop download press this button +again, download may be continued any time later. + + + +|6700 Importing log until this date/time.Start time +is at "Time Fullbright" + "Time Fade Out" earlier. +Received actual Data is stored to memory and +writelog and is displayed again on "Exit Logview" + +|6705 Find Call in Logfile, exact match, +and import it. + +|6710 Read data from this path/filename. +The format is Timestamp in Seconds since 1.1.1970 +followed by AprsIs Line. The data is sorted at +import by Time, indexed and all waypoints compared +to each other for removing dupes for fast rendering +images and stored in compressed form in RAM + +|6715 +|6716 Reload Data from Writelog +|6720 Go to Realtime Mode +|6721 Reload Data from Writelog + +|6730 Go to Start of Logfile +|6731 Go "Time Fullbright" back in Logfile +|6732 Go "Time Fullbright" forward in Logfile +|6733 Go to End of Logfile + + +|6800 Send Message with Acknowledge, If +Message arrived Destination, "AckTime" +will get filled. On TCP, the Msg is sent +once and, if not acked, resent as the next +Beacon of the Destination arrives. +Modern Igates, gating msg to Rf, will +take care of efficient resening to mobile +destinations. + +|6801 Send Message with no Acknowledge +Used for Querys like "?APRSH" "?HELP" +sent to Igates. The Msg is sent one time +and may be resent manual with "Kick" Button + +|6802 Reopen with Shift-Click to "M" button +or "M"-Shortcut or Tools / Send Message + +|6804 A Message Line if Dimmed it is Done +if --:--:-- in Acktime it is not Acked +if Red Acktime, a later Message to same +User will not be sent until this Line +is acked deleted or switched to "Hold" +"Ret" is the retry Counter +"AckTxt" an automatic generated unique +Code sent back for ack + + +|6810 Message Text up to 67 Char + +|6815 Destination Call with SSID + +|6820 Send Message on all Open Ports +|6821 Send Message to Net +|6822 Send Message to Radio Port +|6823 Send Message to Radio Port +|6824 Send Message to Radio Port +|6825 Send Message to Radio Port + +|6905 Delete this Message + +|6904 Send this Message once now + +|6903 Reset Send Timer an Counter + +|6902 Do not go on (re)sending Message +until Kick or Restart + +|6901 Redirect the Message to the +Port set in die Ports Line + +|6900 Edit the Message and requeue + +|7000 Toggle automatic Save of Config at +Program Quit + +|7001 Save Config now + +|7005 Loosing all Entries not Saved before + +|7010 Enter Calls You want to be told they +are active. If in "Show All" Mode, the Map +will follow the user. Wildcards ? or * +at End + +|7015 Filter out unwanted things +by name, object owner, igate or comment +(no wildcards yet and exact case match) + +|7020 How to Move/Zoom Maps and what to +do if they are not downloaded yet + +|7025 For Things Drawn on the Map + +|7030 except Rf Beacon Times they +are at each Beacon entry + +|7035 Configure Radio Ports + +|7040 Things we need to get Online + +|7045 Quick Config Timers/Brightness/Map + +|7300 Filter out Destination Call often +used as sender software identifier + +|7305 Filter out data with keyword in Comment +from polluteing the Map. Data is stored +in logfile for reimport with filter off + +|7310 Filter out Objects from source + +|7315 Filter out all received from Igate + +|7320 Filter out Object/Call seen on Map + +|7400 Enter Your Callsign, it is not necessary +to receive data from servers but would +be nice to show the makers of servers +who is online. If You run more active +Aprs tools, each should have a different +SSID at Your Call like -1 -2 ... + + +|7405 If You want overay Symbols Choose the +Symbol and then click to edit and change +the \ to the desired overlay character + +|7406 choose a Symbol on the +Table and click to enter + +|7410 Click to open Editor, Move and Zoom Map +(zoomlevel 15 or more) to Your Position +and Shift-Leftclick to the Map. You get +a Position that may be Edited before Add. +Do not move delete or add characters. + +|7415 Net Beacon needs only the Comment like +Name, QRV on 145.500Mhz +\\h \\z \\v \\ for inserting time, +program version or a file eg. with Wx-Data + +|7420 Enter a valid Passcode and enable if You +want to send Data to AprsIs Network +(beacons/objects/messages/acks) + +|7425 enter AprsIs-Server-URLs like +"nuremberg.aprs2.net:14580" or +IP-number and if not default +port 14580 append ":port". +IF more Servers are entered and +enabled they will be tried until +one is working. + + +|7430 Enter a filter for receive data from AprsIs Network +m/200 or center/radius or a lot of call filters a possible + +|7435 Enable or Disable Connection + +|7440 Sending Net Beacons or Send and Ack Messages +makes sense with a valid passcode + +|7445 Enable Igate +Function disabled in Win-Version due to TCP-System +is not able to report DELAY time on transmission +and can not stop a delaying link without trying to +send the timed out Data, known as "sending data into +a hole in wall problem". This would draw disrupted- +and ghost-tracks on Maps. + + +|7450 Enable/Disable Appending Data to Logfile + +|7451 Click and enter a Filename for received +and sent Data. On next Programm start Data +will be read to RAM and have same state as +at programm termination. The logfile may be +deleted, renamed, changed any time even it +is write enabled. + +|7500 Enable/Disable Rf Port 1 + +|7501 Enter an UDP-IP-number with Port +Pair to Send and Receive Data from +a (kiss/smack) TNC (with udpflex as +interface) or a Soundmodem. +127.0.0.1:9000:9001 with IP:tx:rx +a 0 port will disable this direction. +If not want to Listen to other IP-numbers +as send to, write tx/rx instead of tx:rx + +|7505 Same as Port 1 +|7506 Same as Port 1 +|7510 Same as Port 1 +|7511 Same as Port 1 +|7515 Same as Port 1 +|7516 Same as Port 1 + +|7520 Start/Stop Serial Interface/Soundmodem Task +|7521 Enter Name and Parameters of a Program for interface +UDP ports to Serial Ports or Soundmodem. +example (unix/win): (or use a ".BAT" file for more ports) + +tnc2/tf/smack: + udpflex -c -U 127.0.0.1:9002:9001 -k -s -t com1:9600 -V + +tmd710/th-d72/kiss/USB: + udpflex -c -U 127.0.0.1:9002:9001 -i kiss.txt -u -t com3:9600 -V + +example (unix): + afskmodem -t /dev/ttyS0 -M 0 -U 127.0.0.1:9002:9001 -m 0 + +|7525 Same as Serial 1 +|7526 Same as Serial 1 + +|7530 If enabled, all frames with not a valid +"callsign" as sender will be discarded +|7531 If enabled, all frames with not a valid +"callsign" as sender will be discarded + +|7535 Switch On/Off showing a Ticker Headline +of received and sent Callsigns +|7536 Number of shown Callsigns in Headline + +|7540 Beacon/Object editor + +|7545 If two Beacons (especially with same Text) are +sent in the Time, the Igate delete dupes, You +will never see the Beacon in AprsIs Network +even if sent on different Frequecys. +To avoid this, the Shift Time is used +to spread Transmissions over the Time. + +|7550 What to do if a Message arrives + +|8200 Enter Keywords : and what to reply if a Query arrives +?VER:VERSION \\v \\v inserts Version +?APRST:PATH= \\p \\p inserts Path of Sender +?APRSP:\\l \\l inserts Lat/Long +TALK:\\>filename Time \\h sends a File and Time +?HELP:?VER,?APRST,?APRSP,TALK,?WX +do not edit this lines, disable and make new entries + +|8205 if stay on Rf use "RFONLY" or "NOGATE" else the +software-ID "APLM01" or some other valid string. +On Net always software-ID is used. + +|8210 Empty string for direkt +number for SSID-Routing "2" makes -2 to destination call +or some old chunk like "RELAY" "WIDE"... + +|8215 Toggle On/Off a popup window if a msg arrives +|8220 Show (not ack) Messages to My Call but other SSID too +|8225 Show Messages from/to same Call and +same SSID (Telemetry Headlines) + +|7695 Enable/Disable the Line. Disabled lines do +nothing but wait for being reenable later + +|7696 Delete Line, the text is copied to +edit line for changes and Add + +|7706 Enter beacon time in seconds (600 is widely used) +or 0 to send Netbeacon only at start of connection. +Sending 1 Netbeacon makes sense even with no +Passcode to tell the Server Your position +for usage of m/... filters + +|7701 Minutes to Hold Objects and Items in RAM then Purge +except with WX-Data to have fulltime WX-Graphs + +|7700 Minutes hold any Data in RAM then Purge +This is the maximum "Show Fullbright" Time too + +|7705 Minutes Show Symbols an Tracks on Screen + +|7704 Minutes Fading out Symbols and Tracks +after Full Bright Time on Screen + +|7703 Seconds Show km/h after last move + +|7702 Minutes back from now try to detect +double received waypoints and filter +out if Trackfilter is enabled + +|7707 Initial animation speed in multiples +of realtime if played with 25hz +change by click to map + +|7708 delay in animation/video bevore +speedup if no one moves + +|7709 Shift System Time by up to +-24h in +shown times. Log times are not affected. + +|7745 After moving and zooming the Map, wait this +Time befor starting missing Map Download if +not want to Load fine zoomed strips along a +Map moving way. + +|7860 If enabled show Lat/Long and QTH-Locator of Mouse Position + +|7855 Enable Trackfilter to remove possibly wrong waypoints +of tracks. This does not affect stored data. + +|7850 If enabled, missing map-parts are tried to be +downloaded by writing "gettiles" file. A task +that reads this file may get the parts of map +from internet in background. What arrives +within 30s will be updated on screen otherwise +updates by next activity in map + +|7851 Program Name and Parameters to be started +if Map Download is requested. The Program +reads "gettiles" file, loads maps and if +done, deletes "gettiles" file. + +|7845 Show a Scaler on the map. A small +Zoomlevel would distort distances +so Scaler will not be shown. + +|7840 If enabled, and data avaliable, +show a driving direction arrow. + +|7835 If enabled, and data avaliable, +show a windvane at WX-Symbols + +|7830 If enabled, and data avaliable, +show Temperature + +|7825 If enabled, and data avaliable, +show driving speed + +|7826 edit text for driving speed "km/h" +or shorter "km" to save place on map + +|7820 if data avaliable and above this +value, show higth in m + +|7815 Brightness of notmovers if dimm notmovers is on + +|7810 Brightness of white Lines showing Rf-Paths +in "Heard" and "+Rf" Mode + +|7807 Enter Fontsize, Range 8..18 Pixel + +|7805 0 Disables Transparency, 20 looks nice, +else try for best readability + +|7945 Zoom steps for Shift-Click to +- or mouse-wheel + +|7940 Map move step width + +|7935 Limit Zoom Level to avoid download +of maps with no more infos on + +|7930 Limit zoomlevel for autozoom to +small objects to avoid download +of maps not really needed + +|7925 % of screen to center hold watched objects in +0: the object moves to margin bevore map is shifted +100: the object is alway centered + +|7920 window size used on next program start +updated as window size is changed + +|7917 Design and switch on/off event sounds + +|7915 "move Map" or "move Window over Map" +according to Cursor Key Arrows + +|7910 If a part of Map is not in the Map-Cache, allow to +double size of yet avaliable lower resolution part until +the part is loaded from a Map server. You will see a +red Button during this Mode + +|7905 If a selected object gets to be zoomed to +fit in screen, zooming is done as far as +Maps in full resolution are in Cash else +You get a black map and download starts + +|7900 Enable to get a message if an object +approaches and is in the configured +radius. A file "proxwarn" contains call +an distance for an external program + +|7901 Enter Radius for Approxymation Message +If a Station moves toward You, a File +"proxwarn" will be generated with Call +and Distance for a Speech Program + +|8010 Toggle Approximation Sound On/Off +|8011 Approximation Sound (in Hz and milliseconds) +first value pair at entering configured Warn Radius, +changing to second pair until zero distance to You + +|8015 Toggle Watchcall Sound On/Off +|8016 Watchcall Sound (in Hz and milliseconds) + +|8020 Toggle Message Sound On/Off +|8021 Message Sound (in Hz and milliseconds) +first value pair for receiving new Message +second pair for acknowledged a sent Message + +|8100 Append edited Beacon to the Schedule Table. +Objects/Items with same Name will be deleted. +|8101 Draw on local Map for testing. Hold Shift +and click to Map to change Position. Delete +on Map with click to symbol and DEL-Key. +|8102 Send edited Beacon immediately to Rf or +Net Port as configured. Use for sending +"Delete Objects" one time on Net +|8103 Cancel edit window to see more Lines +of Schedule Table. +|8104 Exit Beacon editor + +|8110 Make default (mostly empty) edit Lines +With click to a Symbol on map the Data +will be cloned and may be edited to make +your own beacon out of. +|8111 Close Beacon editor + +|8115 For "Beacons" this should be one of your +Calls + ssid. The Position is fixed as +configured in Config > Online > My Position +For Items an Objects this is the Name +seen by the Symbol on Map. This need not +be a Callsign. + +|8120 Position for Items and Objects in DDMM.MMM +or simply hold SHIFT Key and click on the Map. +To quick reposit Objects: "B" to open Beacon +Edit, Click to Symbol on Map, "DEL" to remove, +SHIFT-Click to new position, "Draw" or "Send" +|8122 Text with Macros + +|8124 Time between 2 beacons in Seconds. +Additional each Beacon in scheduler is shiftet +from each other by +Config > Rf-Ports > Beacon Shift Time +because same beacons will be deleted by Igates +if seen before at less than 27s to 1 minute. +If sending beacons to Net and same time to rf, +you will never see who received it. + +|8126 Radio Path, like WIDE2-2 or, if the Digis +in Your area are configured correct, simpley +use -1 or -2 which will be appended to the +Destination Call to do same es WIDE but with +zero bytes overhead. + +|8128 Enter Altitude in m over NN or negative +for below. Only positive values in +Commpressed Mode. This will take some +Bytes more except in Compressed Mode +with no speed/direction. + +|8130 Speed in km/h + +|8132 Course in 0..359 degrees + +|8134 Choose Symbol and if You know what +You do enter overlay Symbols here. + +|8136 Destination "Call" is generated automatic +in Mic-e Mode else is used as hint to which +hard/software is used. + +|8138 Click at a Symbol in the Thumbnail Picture + +|8140 Set Type "Beacon", to send Symbol and Info +with your Position and Call with SSID. The +Symbol has the Call as Label and possibly +Altitute and Speed or Wx Data. +|8141 Set Type "Object" with HHMMSS Timestamp. +Send Object to set Symbol and object Name +to other as your Position. The Symbol shows +the Object Name (need not be a Callsign) as +label. +|8142 Set Type "Object" with DDHHMM Timestamp. +|8143 Set Type "Item". This is like "Object" +but witout Timestamp and needs less bytes +with short Name and compressed position. +On Rf prefer this if no Time info needed. +|8144 Set Type "Delete Item". This wipes out +Items with This Name on all Maps. +Important: Tx only once on Net or manual +a view times on Rf Ports. +|8145 Set Type "Delete Object". Depending on +Viewer should delete Items too. + +|8150 Send normal DDMM.MM format, long, only +18m resolution but man-readable. May +be extendet with DAO to 20cm resolution +with "Lat/Long+" and 5 bytes more. +|8151 Send Mic-e format, this is compressed to +minimal size with 18m resolution and no +extra bytes for speed and course. May +contain not-printable characters so be +carefull by copy/edit raw data. May be +extendet with DAO to 20cm resolution +with "Mic-e+" and 5 Bytes more. +|8152 Send "Compressed" format, this is fixed size +and may contain speed/course OR (positive) +altitude but not both. If needs both, the +long /A=...... extention will be appended. +Resolution is 30cm +|8153 Same as "Lat/Long" but with DAO extention +if you need finer resolution than 18m. +|8154 Same as "Mic-e" but with DAO extention +if you need finer resolution than 18m. + +|8160 Sent Beacon to AprsIs on TCPIP Net. +"Via Path" is not needed here. +|8161 Send Beacon to Radio Port 1 as configured +and enabled in "Config > Rf-Ports" +|8162 Send Beacon to Radio Port 2 as configured +and enabled in "Config > Rf-Ports" +|8163 Send Beacon to Radio Port 3 as configured +and enabled in "Config > Rf-Ports" +|8164 Send Beacon to Radio Port 4 as configured +and enabled in "Config > Rf-Ports" + + + +|8170 Port:Time:rawtext +Yellow Field is a "delete object" so if sent +i will wipe out the object/item on all maps. +Red Field contains any error and should not +be transmitted. +Dimmed Text is if line is opened in editor. +Green Dot makes beacon active, toggle with +On/off + +|8180 Move this Beacon to Editor +|8182 Send this Beacon once immediately +|8184 Send this Beacon to local View on Map +Delete on Map with click to symbol and +DEL-Key. +|8186 Raw Line Edit (not implemented now) +|8188 Delete Beacon +|8190 Copy this Beacon to Editor +|8192 Toggle On/Off Switch of this Beacon +Important: Check repeat Time to avoid +too much Tx, 3600s for static Beacons +1200s to 1800s for Wx on Rf Ports. + + + + +|10005 Tipp: Move and Zoom Map to Your Home Area +then open "Zoom" and SHIFT+Leftclick to "P1" +to Store View for next Programm Start + +|10006 Tipp: To get Data from Internet Configure "Config>Online>" + +|10007 Tipp: Usage of "m/" Filters needs configured +MyPosition and "Allow Tx to Net" + +|10010 Tipp: If problem with map download +check network and map download program + +|10016 Tipp: Don't like black or expanded Maps? +switch on "Config>Map Moving>Zoom as have Maps" +set "Config>Map Moving>Expand Map" as wantet + +|10015 Tipp: Zoom to Objects even if Maps are not downloaded +yet, switch off "Config>Mapmoving>Zoom as have Maps" + diff --git a/src/jpgdec.c b/src/jpgdec.c new file mode 100644 index 0000000..75bda9e --- /dev/null +++ b/src/jpgdec.c @@ -0,0 +1,84 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include "X2C.h" +#include +#include "jpeglib.h" +#include +#include + +struct my_error_mgr { + struct jpeg_error_mgr pub; /* "public" fields */ + + jmp_buf setjmp_buffer; /* for return to caller */ +}; + +typedef struct my_error_mgr * my_error_ptr; + +METHODDEF(void) my_error_exit (j_common_ptr cinfo) +{ + /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ + my_error_ptr myerr = (my_error_ptr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + (*cinfo->err->output_message) (cinfo); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); +} + +int32_t readjpg(char *fn, JSAMPARRAY *row_pointers, int32_t *maxx, int32_t *maxy, int32_t *maxxbyte) +{ + struct jpeg_decompress_struct cinfo; + struct my_error_mgr jerr; + FILE * infile; /* source file */ + int ret; + int linec; + JSAMPARRAY buffer; /* Output row buffer */ + int row_stride; /* physical row width in output buffer */ + + if ((infile = fopen(fn, "rb")) == NULL) { +/* + fprintf(stderr, "can't open %s\n", fn); +*/ + return -1; + } + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = my_error_exit; + if (setjmp(jerr.setjmp_buffer)) { + jpeg_destroy_decompress(&cinfo); + fclose(infile); + return -2; + } + ret=0; + jpeg_create_decompress(&cinfo); + + jpeg_stdio_src(&cinfo, infile); + (void) jpeg_read_header(&cinfo, TRUE); + (void) jpeg_start_decompress(&cinfo); + + if (cinfo.output_height > *maxy || cinfo.output_width > *maxx || cinfo.output_components != 3) + ret=-3; + + row_stride = cinfo.output_width * cinfo.output_components; + buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + + linec=0; + while (cinfo.output_scanline < cinfo.output_height) + { + (void) jpeg_read_scanlines(&cinfo, (JSAMPARRAY) buffer, 1); + if (linec < *maxy) + memcpy(row_pointers[linec++], buffer[0], *maxxbyte); + } + + (void) jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + fclose(infile); + return ret; +} diff --git a/src/jpgdec.h b/src/jpgdec.h new file mode 100644 index 0000000..0f52ec8 --- /dev/null +++ b/src/jpgdec.h @@ -0,0 +1,15 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef jpgdec_H_ +#define jpgdec_H_ +#include "X2C.h" + +extern int32_t readjpg(char [], char * [], int32_t *, int32_t *, int32_t *); + + +#endif /* jpgdec_H_ */ diff --git a/src/l2.c b/src/l2.c new file mode 100644 index 0000000..ed34cda --- /dev/null +++ b/src/l2.c @@ -0,0 +1,2816 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +/* "@(#)l2.c May 11 0:15:23 2017" */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef l2_H_ +#include "l2.h" +#endif +#define l2_C_ +#ifndef frameio_H_ +#include "frameio.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include + +uint16_t l2_UA = 0x63U; +uint16_t l2_DM = 0xFU; +uint16_t l2_SABM = 0x2FU; +uint16_t l2_DISC = 0x43U; +uint16_t l2_FRMR = 0x87U; +uint16_t l2_UI = 0x3U; +uint16_t l2_RR = 0x1U; +uint16_t l2_REJ = 0x9U; +uint16_t l2_RNR = 0x5U; + + +char l2_L2Lock; +uint16_t l2_LostINT; +l2_pDATA l2_dbuf; +l2_AFIELD l2_adress; +uint16_t l2_asize; +char l2_udp2buf[100]; + + +struct l2__D0 l2_PortSt[16]; + + + + +struct l2__D2 l2_Parms[15]; + + + + + + + + + + + + +/* +Interface Layer2 <-> Host: + +Call L2Init; +Call (about) every 10ms Layer2 + +Call any Time +* not during Layer2 running and its Callback + + Connect * (start a connect) + + Disconnect * (stop a connect or close a handle with data) + + Circuit (join 2 connections back to back) + if reconn on, the host must not forget this host handle + and continue interaction after reconnect + + GetAdress (get address) + + Getudp2info (get axudp extention info from modem) + + GetChar (get 1 received char of a connection, delete it or keep it) + + GetStr (get more received chars of a connection) + + SendStr (send data to a connection) + + SendRaw (send UI or raw frame) + + GetStat (get status of a connection) + + PortStat (portwise statistics) + + Parm (get or set port parameters) + + GetMon (get monitor data) + + +Callback: + contains A handle from layer2, is pointer to a (hidden) link structure. + The host has to use this pointer in any call according to this link. + + An event number + + A handle given from host to layer2, a pointer, layer2 looks only + if NULL for "the host does not want this event and its link any longer" + . + + Events: + eCONNECTED: a connection (in or out) is esteblished + if (from out) and the host is able to accept set the host-handle + to not NULL. The handle will always be included in further + callbacks for this link and the host MUST call Disconnect with + dealloc TRUE to free this handle. + + eDISCONNECTED: a link ends, if there is a host-handle the host must + call Disconnect with dealloc TRUE to free this handle. + + eBUSY: outgoing connection got busy (DM) + if there is a host-handle the host must call disconnect to free this handle. + + eTXFREE: a connection is able to accept new data + + eRXDATA: a connection received new data + + eMONITOR: monitor frames are in buffer + + eCONNREQ: a SABM (via digicall first in mycall table) arrived, + this is only + a message with no action of layer2, no host-handle and + so no disconnect for freeing. + the host has to find route, + make a connect and if connect is esteblished + make a "back connection" + with Connect connect.typ cFLEXback or cCONNAK. + If the destination connection is in same layer2, + join the 2 connections + with call to Circuit with both reconn off. + if destination is away, + host has to get data with GetStr and transport it + any way and reverse send with SendStr + + eFLEXDATA: a Frame via digicall (first in mycall table) + arrived. this is only + a message with no action of layer2, no host-handle and + so no disconnect for freeing. + retrive data immediately during callback vom adress/asize/dbuf + route and resent with SendUI. + + eLISTEN: not used by Layer2 + + eIDLE: not used by Layer2 + +*/ +/* (C)OE5DXL 1993-2015, GPL3 */ +static uint16_t l2_SSIDMASK = 0x5EU; + +static uint16_t l2_DAMARR = 0x20U; + +#define l2_RESP 0 + +#define l2_FINAL 1 + +#define l2_COMMAND 2 + +#define l2_POLL 3 + +static uint16_t l2_NULL = 0x8000U; + +static uint16_t l2_DAMAIDLE = 0x4000U; + +#define l2_SENDQUES 3 + +#define l2_HASHSIZE 16 +/*greater than number of ports*/ + +#define l2_MEMRR 20 + +#define l2_MEMTX 20 + +#define l2_MEMRX 10 + +#define l2_MEMSAMM 20 + +#define l2_MEMFRMR 1 + +#define l2_MEMLINK 5 + +#define l2_TILT 4 + +#define l2_IGNORE 8 + +#define l2_SHORTINFO 80 + +#define l2_IPRETRIES 10 + +#define l2_MAGIC 2091827346 + +#define l2_LOOPSPERS 100 + +#define l2_SECMOD 20000 +/* timer base cycle range, max timer1 is half */ + +#define l2_TIMERBASE 10 +/* timer base / layer2 looptime */ + +#define l2_T3OFF 65535 + +enum TXSTATE {l2_TWAIT, l2_TXDEL, l2_TXTAIL, l2_DCDWAIT, l2_ECHO}; + + +typedef char * AFIELDPO; + +struct LINK; + + +struct LINK { + uint32_t Magic; /*magic number*/ + uint16_t State; /*0 = host is owner of the record*/ + uint16_t mycall; /*0=via, MAX(CARD16)=downlink*/ + uint16_t Baud; /*downlink baud*/ + uint16_t Uplinkport; + uint8_t cCONNtyp; /*normal or link is for UI transfer only*/ + uint16_t IsInQue; /*link is in this send-que*/ + l2_pLINK SendQuenext; /*sendque-chain*/ + l2_pLINK SendQueprev; + uint16_t Hash; + l2_pLINK Hashnext; /*address-hash-chain*/ + l2_pLINK Hashprev; + uint16_t Qtime; /*time since forced disc*/ + uint16_t T3out; /*Second for next T3 end or T3OFF for T1 running */ + uint16_t damasecond; /*last slice in absolut time*/ + uint16_t T1out; /*second when T1 will run out*/ + l2_pLINK Timernext; /*timer-chain*/ + l2_pLINK Timerprev; + char highspeed; /*for prefered queing*/ + char damastop; /*no frames until dama-slot*/ + char twoway; /*the other is in INFO state too*/ + char discing; /*disc after send-info-buffer is empty*/ + char rejgot; /*got a REJ*/ + char rejsent; /*sent a REJ*/ + char infostop; /*send-info-buffer was empty*/ + char busyend; /*tell the other that i am not longer busy*/ + char flexback; /* flex backlink say no DM if SABM */ + char haschains; /* link has chains else simple dealloc */ + char rembusy; /*the other is busy*/ + uint16_t busy; /*0=not busy*/ + uint16_t retry; /*increments after timeout-polls*/ + uint16_t ns; /*send-sequence-number*/ + uint16_t lowsent; /*till here info is acknowled*/ + uint16_t highsent; /*till here -1 info is sent*/ + uint16_t sentnr; /*last physically sent nr*/ + uint16_t nr; /*receive sequence number*/ + char pid; /*PID for this link*/ + l2_pDATA sammler[8]; + uint16_t summs[8]; + l2_AFIELD Adress; /*adress field + command byte*/ + uint16_t AdrLen; /*length of adress + command byte*/ + uint16_t cp; /*send response, final, command or poll*/ + uint16_t sendcmd; + l2_pDATA sendinfo; /*parallel to ns running info-pointer*/ + l2_pDATA txInfoIn; /*entry pointer to transmit buffer*/ + l2_pDATA txInfoOut; /*end of transmit data*/ + uint16_t txbuffers; /*used send-buffers*/ + char txfull; /*tx buffer full, for message or clearbusy*/ + char modifylast; /*last buffer not sent, so modifyable*/ + l2_pLINK nudel; /*the downlink, else NIL*/ + uint16_t exitch; /*switch linked links back to host*/ + char * host; /*to there the messages are sent*/ + char saiddisc; /*send only 1 disc message to host*/ + l2_pDATA rxInfoIn; /*entry pointer to receive buffer*/ + l2_pDATA rxInfoOut; /*end of receive data*/ + uint16_t rxbuffers; /*used buffers*/ + uint16_t readp; /*getchar readpointer*/ + l2_pDATA SABMinfo; /*extention, SABM with info*/ + /*statistics*/ + uint32_t SentBytes; + uint32_t AckBytes; + uint32_t RcvdBytes; + uint32_t Started; /*for statistics: starttime of link*/ + char udp2info[31]; /* axudp2 frame infos from modem */ +}; + +struct _0; + +struct _1; + + +struct _1 { + /*que 0 has highest priority*/ + l2_pLINK SendQueIn; /*chain of links that will send*/ + l2_pLINK SendQueOut; +}; + + +struct _0 { + uint8_t sendstate; + char damat1; + char dama; /*dama slave*/ + char dcd; /*all diversity ports set it*/ + uint16_t dcdguard; /*ignore dcd if it lasts too long*/ + uint16_t txwait; /*set while sending, reset when receiving*/ + uint16_t Ticker; /* change synchron to main clock */ + uint16_t QTicker; /* change only while not send or dcd */ + char lookinque; /*to decide quick if sendques are empty*/ + l2_pLINK damaloop; + l2_pLINK T1In; /*timer-chain, each link has always a timer*/ + l2_pLINK T1Out; + struct _1 SendQues[3]; +}; + +static struct _0 PortL2[15]; + +static l2_pLINK AdrHash[16]; /*hashtable for calls*/ + +static l2_CALLTYP MyCalls[17]; /*mycall[0] is digipeat*/ + +static uint16_t maxrxbuffers; + +static uint16_t maxtxbuffers; + +static uint16_t DMTIME; /*save downlinks for sending DM*/ + +static uint16_t QTIME; + +/*time for discing links with unackn. data*/ +static uint16_t memory; /*used memory*/ + +static uint16_t DAMAMAXTIME; /*longest time till next slot*/ + +static uint16_t DAMAFASTPOLLS; + +/*slots which have fast intervall*/ +static uint32_t Time; /* seconds counting */ + +static uint32_t AbsTime; + +static uint16_t Second; + +static uint16_t monbufs; + +static uint16_t maxmonbufs; + +static uint16_t Minute5; + +static uint16_t ticker5; + +static char * * Freechain; + +static l2_CALLTYP DNot[9]; + +static l2_CALLTYP mfrom; + +static l2_pLINK monBufOut; + +static l2_pLINK monBufIn; + +static uint16_t hosts; + +static uint32_t tick10; + +static l2_CALLBACKPROC Event; + + +static uint16_t Min(uint16_t a, uint16_t b) +{ + if (a>=b) return b; + else return a; + return 0; +} /* end Min() */ + + +static char Alloc(char * * p, uint16_t reserv) +{ + if (memory<=reserv || Freechain==0) return 0; + *p = (char *)Freechain; + Freechain = (char * *)(*Freechain); + --memory; + return 1; +} /* end Alloc() */ + + +static void Dealloc(char * * p) +{ + char * * unnedig; + /*WrInt(memory, 6); WrStrLn(" before dealloc "); */ + if (*p==0) return; + unnedig = (char * *)*p; + *unnedig = (char *)Freechain; + Freechain = (char * *)*p; + ++memory; + *p = 0; +} /* end Dealloc() */ + + +static void Unlock(void) +{ + if (l2_LostINT>0U) { + l2_L2Lock = 1; + l2_Layer2(); + } + l2_L2Lock = 0; +} /* end Unlock() */ + + +static uint16_t Minut5(void) +{ + return (uint16_t)((Time/300UL)%13UL); +} /* end Minut5() */ + + +static void CheckParms(uint16_t port) +{ + struct l2__D2 * anonym; + { /* with */ + struct l2__D2 * anonym = &l2_Parms[port-1U]; + if (anonym->_._0.MaxFrames>7U) anonym->_._0.MaxFrames = 7U; + if (anonym->_._0.SendPort>15U) anonym->_._0.SendPort = port; + if (anonym->_._0.Diversity>15U) anonym->_._0.Diversity = 0U; + if (anonym->_._0.BaudSwBytes>100U) anonym->_._0.BaudSwBytes = 100U; + if (anonym->_._0.T1==0U) anonym->_._0.T1 = 1U; + else if (anonym->_._0.T1>=10000U) anonym->_._0.T1 = 10000U; + } +} /* end CheckParms() */ + + +static void call(l2_pPARMS p, l2_CALLTYP list[], uint32_t list_len) +{ + uint16_t k; + uint16_t j; + uint16_t i; + uint16_t tmp; + k = 0U; + tmp = (uint16_t)((list_len-1)-1UL); + i = 0U; + if (i<=tmp) for (;; i++) { + for (j = 0U; j<=6U; j++) { + if (p->test) { + p->str[k] = (char)((uint32_t)(uint8_t)list[i][j]/2UL); + } + else list[i][j] = (char)((uint32_t)(uint8_t)p->str[k]*2UL); + ++k; + } /* end for */ + if (i==tmp) break; + } /* end for */ + if (p->test) p->str[k] = 0; +} /* end call() */ + + +static void value(l2_pPARMS p, uint16_t * x) +{ + if (p->test) p->val = (uint32_t)*x; + else *x = (uint16_t)p->val; +} /* end value() */ + + +static void bool(l2_pPARMS p, char * b) +{ + if (p->test) p->val = (uint32_t)*b; + else *b = p->val!=0UL; +} /* end bool() */ + + +extern void l2_Parm(l2_pPARMS p) +{ + uint16_t i; + struct l2_PARMS0 * anonym; + struct l2__D2 * anonym0; + { /* with */ + struct l2_PARMS0 * anonym = p; + if (anonym->parm<=6U) anonym->port = 1U; + else if (anonym->port==0U || anonym->port>15U) return; + { /* with */ + struct l2__D2 * anonym0 = &l2_Parms[anonym->port-1U]; + switch (anonym->parm) { + case 0U: /* set all mycalls, first is digi */ + call(p, MyCalls, 17ul); + break; + case 1U: + call(p, DNot, 9ul); + break; + case 2U: + X2C_MOVE((char *)anonym->str,(char *)mfrom,7UL); + break; + case 3U: + value(p, &DMTIME); + break; + case 4U: + value(p, &QTIME); + break; + case 5U: + value(p, &maxrxbuffers); + break; + case 6U: + value(p, &maxtxbuffers); + break; + case 7U: + bool(p, &anonym0->Digipeat); + break; + case 8U: + bool(p, &anonym0->HalfDuplex); + break; + case 9U: + bool(p, &anonym0->DamaMaster); + break; + case 10U: + bool(p, &anonym0->monitor); + break; + case 11U: + bool(p, &anonym0->passall); + break; + case 12U: + bool(p, &anonym0->Echo); + break; + case 13U: + if (anonym->test) { + X2C_MOVE((char *)anonym0->SendBauds, + (char *)anonym->str,17UL); + } + else { + for (i = 0U; i<=16U; i++) { + if ((uint8_t)anonym->str[i]>='0' && (uint8_t) + anonym->str[i]<='7') anonym0->SendBauds[i] = anonym->str[i]; + } /* end for */ + } + break; + default:; + anonym->parm -= 14U; + if (anonym->parm<=16U) { + value(p, &anonym0->_.card[anonym->parm]); + CheckParms(anonym->port); + } + break; + } /* end switch */ + } + } +} /* end Parm() */ + + +extern void l2_Getudp2info(l2_pLINK l, char s[], uint32_t s_len) +{ + uint16_t j; + uint16_t i; + s[0UL] = 0; + if (((struct LINK *)l && ((struct LINK *)l)->udp2info[0U]) + && ((struct LINK *)l)->udp2info[1U]) { + j = 0U; + i = 2U; + while ((uint32_t)judp2info[i]) { + s[j] = ((struct LINK *)l)->udp2info[i]; + ++j; + ++i; + } + s[j] = 0; + } +} /* end Getudp2info() */ + + +extern void l2_GetAdress0(l2_pLINK l, l2_pGETADRESS p) +{ + uint16_t len; + uint16_t i; + struct l2_GETADRESS * anonym; + struct LINK * anonym0; + uint16_t tmp; + { /* with */ + struct l2_GETADRESS * anonym = p; + { /* with */ + struct LINK * anonym0 = (struct LINK *)l; + anonym->port = anonym0->Uplinkport; + anonym->my = anonym0->mycall; + len = Min(71U, anonym0->AdrLen-1U); + tmp = len; + i = 0U; + if (i<=tmp) for (;; i++) { + anonym->adress[i] = (char)((uint32_t)(uint8_t) + anonym0->Adress[i]/2UL); + if (i==tmp) break; + } /* end for */ + anonym->adress[len] = 0; + if (anonym0->rxInfoOut && anonym0->rxInfoOut->len) { + anonym->cpid = (uint16_t)(uint8_t) + anonym0->rxInfoOut->info[0U]; + } + else anonym->cpid = 65535U; + } + } +} /* end GetAdress() */ + + +extern void l2_GetStat0(l2_pGETSTAT p) +{ + uint16_t v; + uint16_t i; + struct l2_GETSTAT * anonym; + struct LINK * anonym0; + uint16_t tmp; + l2_L2Lock = 1; + { /* with */ + struct l2_GETSTAT * anonym = p; + if ((struct LINK *)anonym->l==0) { + for (;;) { + v = anonym->n/16U; + anonym->l = AdrHash[anonym->n&15U]; + i = 0U; + while ((struct LINK *)anonym->l && il = ((struct LINK *)anonym->l)->Hashnext; + } + if ((struct LINK *)anonym->l==0) { + anonym->n = anonym->n&15U; + if (anonym->n==15U) { + anonym->n = 0U; + break; + } + ++anonym->n; + } + else { + anonym->n += 16U; + break; + } + } + } + if ((struct LINK *)anonym->l) { + { /* with */ + struct LINK * anonym0 = (struct LINK *)anonym->l; + anonym->st = anonym0->State; + anonym->port = anonym0->Uplinkport; + anonym->txbu = anonym0->txbuffers; + anonym->my = anonym0->mycall; + anonym->ret = anonym0->retry; + anonym->bsy = anonym0->busy!=0U; + anonym->remb = anonym0->rembusy; + anonym->nudl = anonym0->nudel; + tmp = Min(71U, anonym0->AdrLen); + i = 0U; + if (i<=tmp) for (;; i++) { + anonym->adress[i] = (char)((uint32_t)(uint8_t) + anonym0->Adress[i]/2UL); + if (i==tmp) break; + } /* end for */ + if (anonym0->AdrLen<=71U) anonym->adress[anonym0->AdrLen] = 0; + anonym->sent = anonym0->SentBytes; + anonym->ack = anonym0->AckBytes; + anonym->rcvd = anonym0->RcvdBytes; + anonym->since = Time-anonym0->Started; + } + } + Unlock(); + } +} /* end GetStat() */ + + +extern char l2_PortStat0(l2_pPORTSTAT p) +{ + uint16_t j; + uint16_t i; + struct l2_PORTSTAT * anonym; + struct l2__D0 * anonym0; + /*prev intervall*/ + struct l2__D1 * anonym1; + uint16_t tmp; + { /* with */ + struct l2_PORTSTAT * anonym = p; + memset((char *)anonym->sums,(char)0,28UL); + anonym->mem = memory; + anonym->time0 = Time; + if ((anonym->port>0U && anonym->port<=15U) + && l2_Parms[anonym->port-1U]._._0.Diversity) { + { /* with */ + struct l2__D0 * anonym0 = &l2_PortSt[anonym->port]; + j = Minut5(); /*aktual intervall*/ + tmp = anonym->minits5; + i = 1U; + if (i<=tmp) for (;; i++) { + if (j==0U) j = 12U; + else --j; + { /* with */ + struct l2__D1 * anonym1 = &anonym0->Flows[j]; + anonym->sums[0U] += (uint32_t)anonym1->Igot; + anonym->sums[1U] += (uint32_t)anonym1->Isent; + anonym->sums[2U] += (uint32_t)anonym1->Iack; + anonym->sums[3U] += anonym1->Bytegot; + anonym->sums[4U] += anonym1->Bytesent; + } + if (i==tmp) break; + } /* end for */ + anonym->sums[5U] = (uint32_t)anonym0->Links; + anonym->sums[6U] = (uint32_t)anonym0->MaxLinks; + } + } + else return 0; + return 1; + } +} /* end PortStat() */ + + +static void ToSendQue(l2_pLINK l, uint16_t why, uint16_t c) +{ + /*for safety*/ + struct LINK * anonym; + struct _1 * anonym0; + if ((struct LINK *)l) { + { /* with */ + struct LINK * anonym = (struct LINK *)l; + anonym->sendcmd = why; + anonym->cp = c; + PortL2[anonym->Uplinkport-1U].lookinque = 1; + /*only to find out quick if what in a que*/ + if (anonym->IsInQue>=3U && !anonym->damastop) { + anonym->IsInQue = 0U; + if (anonym->mycall==0U) anonym->IsInQue = 2U; + else if ((!anonym->highspeed && why==0x8000U) + && (anonym->sendinfo && anonym->sendinfo->len>80U || anonym->txInfoOut && anonym->txInfoOut->len>80U) + ) anonym->IsInQue = 1U; + { /* with */ + struct _1 * anonym0 = &PortL2[anonym->Uplinkport-1U] + .SendQues[anonym->IsInQue]; + if ((struct LINK *)anonym0->SendQueOut==0) { + anonym0->SendQueOut = l; + } + else { + ((struct LINK *)l)->SendQueprev = anonym0->SendQueIn; + ((struct LINK *)anonym0->SendQueIn)->SendQuenext = l; + } + anonym0->SendQueIn = l; + } + } + } + } +} /* end ToSendQue() */ + + +static l2_pDATA GetSendInfo(l2_pLINK l) +{ + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if ((anonym->infostop || anonym->rembusy) || (((anonym->ns+9U) + -anonym->lowsent&7U) + >=l2_Parms[anonym->Uplinkport-1U] + ._._0.MaxFrames || anonym->rejgot) && anonym->sendinfo) { + return 0; + } + if (anonym->sendinfo==0) return anonym->txInfoOut; + return anonym->sendinfo->next; + } +} /* end GetSendInfo() */ + + +static void Appendtx(l2_pLINK link, l2_pDATA data) +{ + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)link; + if ((((data->info[0U]=='\360' && anonym->txInfoOut) && data->len>1U) + && anonym->modifylast) + && anonym->txInfoIn->len+data->len<=258U) { + /*F0 PID*/ + /*append to previous buffer*/ + X2C_MOVE((char *) &data->info[1U], + (char *) &anonym->txInfoIn->info[anonym->txInfoIn->len], + (uint32_t)(data->len-1U)); + anonym->txInfoIn->len += data->len-1U; + Dealloc((char * *) &data); + return; + } + data->next = 0; + if (anonym->txInfoOut==0) anonym->txInfoOut = data; + else anonym->txInfoIn->next = data; + anonym->txInfoIn = data; + ++anonym->txbuffers; + anonym->modifylast = 1; /*this buffer was not sent till now*/ + if (anonym->IsInQue>=3U && GetSendInfo(link)) { + PortL2[anonym->Uplinkport-1U] + .damaloop = PortL2[anonym->Uplinkport-1U].T1Out; + /*start a quick roundtrip*/ + ToSendQue(link, 0x8000U, 2U); /*schedule link to send info*/ + } + } +} /* end Appendtx() */ + + +static void CopyI(l2_pLINK from, l2_pLINK to, char reconn) +{ + l2_pDATA ip; + struct LINK * anonym; /*copy rest of rx-info to sender*/ + struct l2_DFIELD * anonym0; + { /* with */ + struct LINK * anonym = (struct LINK *)from; + if (anonym->rxInfoOut) { + { /* with */ + struct l2_DFIELD * anonym0 = anonym->rxInfoOut; + if (anonym->readp && anonym0->len>anonym->readp) { + /*shift info to begin of buffer*/ + X2C_MOVE((char *) &anonym0->info[anonym->readp+1U], + (char *) &anonym0->info[1U], + (uint32_t)((anonym0->len-anonym->readp)-1U)); + anonym0->len -= anonym->readp; + anonym->readp = 0U; + } + } + do { + ip = anonym->rxInfoOut->next; + Appendtx(to, anonym->rxInfoOut); + --anonym->rxbuffers; + anonym->rxInfoOut = ip; + } while (anonym->rxInfoOut); + } + anonym->nudel = to; + if (!reconn) { + --hosts; + anonym->Magic = 0UL; + anonym->host = 0; + } + } +} /* end CopyI() */ + + +extern void l2_Circuit(l2_pLINK * l1, l2_pLINK * l20, char reconn1, + char reconn2, uint16_t exitchar) +{ + l2_L2Lock = 1; + if (((((struct LINK *)*l1)->Magic==2091827346UL && ((struct LINK *)*l20) + ->Magic==2091827346UL) && ((struct LINK *)*l1)->State) + && ((struct LINK *)*l20)->State) { + CopyI(*l1, *l20, reconn1); + CopyI(*l20, *l1, reconn2); + ((struct LINK *)*l1)->exitch = exitchar; + } + if (!reconn1) *l1 = 0; + if (!reconn2) *l20 = 0; + Unlock(); +} /* end Circuit() */ + + +extern char l2_SendStr(l2_pLINK l, uint16_t size, l2_pSTRING buf) +{ + l2_pDATA b; + struct LINK * anonym; + l2_L2Lock = 1; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if ((anonym->Magic==2091827346UL && anonym->State>=2U) && size<=256U) { + if (size==0U) return !anonym->txfull; + /* check if txbuffer full */ + if (((anonym->txInfoOut && anonym->modifylast) + && anonym->txInfoIn->len+size<=256U) + && anonym->cCONNtyp==l2_cNORMAL) { + /* IF (txInfoOut<>NIL) + & modifylast & (txInfoIn^.len+size<=257) & (cCONNtyp=cNORMAL) + THEN */ + X2C_MOVE((char *)buf, + (char *) &anonym->txInfoIn->info[anonym->txInfoIn->len], + (uint32_t)size); /*append to previous buffer*/ + anonym->txInfoIn->len += size; + } + else if (anonym->txbuffers<=maxtxbuffers && Alloc((char * *) + &b, 20U)) { + b->info[0U] = anonym->pid; + X2C_MOVE((char *)buf,(char *) &b->info[1U], + (uint32_t)size); + b->len = size+1U; + Appendtx(l, b); + } + else { + anonym->txfull = 1; + Unlock(); + return 0; + } + } + } + Unlock(); + return 1; +} /* end SendStr() */ + + +static void RemoveTimer(l2_pLINK l) +{ + struct _0 * anonym; + { /* with */ + struct _0 * anonym = &PortL2[((struct LINK *)l)->Uplinkport-1U]; + if ((struct LINK *)anonym->T1Out==(struct LINK *)anonym->T1In) { + anonym->T1Out = 0; + } + else if ((struct LINK *)l==(struct LINK *)anonym->T1Out) { + anonym->T1Out = ((struct LINK *)l)->Timernext; + } + else if ((struct LINK *)l==(struct LINK *)anonym->T1In) { + anonym->T1In = ((struct LINK *)l)->Timerprev; + } + else { + ((struct LINK *)((struct LINK *)l)->Timerprev) + ->Timernext = ((struct LINK *)l)->Timernext; + ((struct LINK *)((struct LINK *)l)->Timernext) + ->Timerprev = ((struct LINK *)l)->Timerprev; + } + } +} /* end RemoveTimer() */ + + +static void StartTimer(l2_pLINK l) +{ + /*WrStrLn(""); */ + struct LINK * anonym; + struct _0 * anonym0; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + { /* with */ + struct _0 * anonym0 = &PortL2[anonym->Uplinkport-1U]; + anonym->T1out = ((anonym0->QTicker+l2_Parms[anonym->Uplinkport-1U] + ._._0.T1)-1U)%20000U; /*next timeout*/ + /*WrInt(T1out, 5); WrStr(":tout1 "); */ + if ((struct LINK *)anonym0->T1Out==0) anonym0->T1Out = l; + else { + if ((anonym->T1out-((struct LINK *)anonym0->T1In)->T1out) + %20000U>10000U) { + anonym->T1out = ((struct LINK *)anonym0->T1In)->T1out; + } + /*WrInt(T1out, 5); WrStr(":tout2 "); */ + anonym->Timerprev = anonym0->T1In; + ((struct LINK *)anonym0->T1In)->Timernext = l; + } + /*append to que*/ + anonym0->T1In = l; + } + } +} /* end StartTimer() */ + + +static void MakePoll(l2_pLINK linkp) +{ + uint16_t cmd; + uint16_t r; + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)linkp; + if (anonym->State>=2U && anonym->cCONNtyp==l2_cNORMAL) { + r = l2_Parms[anonym->Uplinkport-1U]._._0.Retries; + if (anonym->State!=5U || !anonym->twoway) r = r/4U+1U; + ++anonym->retry; + if (anonym->retry>r) { + /*WrStrLn("state1"); */ + anonym->State = 1U; + } + /*retried out*/ + cmd = 0x43U; + if (anonym->State==5U) cmd = 0x1U; + else if (anonym->State==2U) cmd = 0x2FU; + ToSendQue(linkp, cmd, 3U); + } + else if (anonym->State==2U && (anonym->cCONNtyp==l2_cFLEXback || anonym->cCONNtyp==l2_cCONNAK) + ) { + anonym->State = 5U; + cmd = 0x63U; + anonym->cCONNtyp = l2_cNORMAL; + ToSendQue(linkp, 0x63U, 1U); + } + else if (anonym->State==2U && anonym->cCONNtyp==l2_cFLEXbusy) { + /*WrStrLn("pollflexbusy"); */ + anonym->State = 1U; + cmd = 0xFU; + ToSendQue(linkp, 0xFU, 1U); + } + } +} /* end MakePoll() */ + + +static void ClearBusy(l2_pLINK l) +{ + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if (anonym->busy && anonym->State==5U) { + anonym->busy = 0U; + anonym->busyend = 1; /*until the other knows*/ + ToSendQue(l, 0x1U, 0U); + RemoveTimer(l); + anonym->T3out = (Second+1U)%20000U; /*start minimal T3*/ + StartTimer(l); + } + } +} /* end ClearBusy() */ + + +static void Disc(l2_pLINK l) +{ + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if (anonym->cCONNtyp) anonym->State = 1U; + else if (anonym->discing || anonym->State!=5U) { + /*do it quick*/ + if (anonym->State>=2U) ToSendQue(l, 0x43U, 3U); + anonym->State = 1U; + } + else if (anonym->txInfoOut==0) { + anonym->State = 4U; /*disc state*/ + anonym->retry = 0U; + RemoveTimer(l); + anonym->T3out = 65535U; /*start T1*/ + StartTimer(l); + MakePoll(l); /*DISC ...*/ + } + else { + anonym->discing = 1; /*first send all infos*/ + anonym->Qtime = 0U; + } + } +} /* end Disc() */ + + +extern void l2_Disconnect(l2_pLINK * l, char dealloc) +{ + l2_pDATA ip; + struct LINK * anonym; + /*WrInt(memory, 6); WrInt(hosts, 6); WrInt(l^.State, 6); + WrInt(ORD(dealloc),1); WrStrLn(" flexdisc "); */ + l2_L2Lock = 1; + if (((struct LINK *)*l)->Magic==2091827346UL) { + if (((struct LINK *)*l)->State>=2U) Disc(*l); + if (dealloc) { + /*host gives link back to l2*/ + --hosts; + { /* with */ + struct LINK * anonym = (struct LINK *)*l; + while (anonym->rxInfoOut) { + /*deallocate rx-info*/ + ip = anonym->rxInfoOut->next; + Dealloc((char * *) &anonym->rxInfoOut); + anonym->rxInfoOut = ip; + } + anonym->Magic = 0UL; + /*WrStr("L2: state:"); WrInt(State, 5); WrStrLn(""); */ + if (anonym->State==0U) Dealloc((char * *)l); + else { + /*WrStrLn("l2:dealloc"); */ + anonym->host = 0; + } + } + *l = 0; + } + } + Unlock(); +} /* end Disconnect() */ + + +static void Cut(l2_pLINK l) +{ + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if ((struct LINK *)anonym->nudel) { + ((struct LINK *)anonym->nudel)->nudel = 0; /*remove pointer to me*/ + if (((struct LINK *)anonym->nudel)->host==0) Disc(anonym->nudel); + else ClearBusy(anonym->nudel); + anonym->nudel = 0; + } + } +} /* end Cut() */ + + +static void DisposeLink(l2_pLINK l, char immediate) +{ + l2_pDATA ip; + uint16_t i; + /*throw away bufferd data*/ + struct LINK * anonym; + /*remove link from sendque*/ + struct LINK * anonym0; + struct _1 * anonym1; + /*WrStrLn("L2: disposelink"); */ + if ((struct LINK *)l) { + /*for safety*/ + { /* with */ + struct LINK * anonym = (struct LINK *)l; + for (i = 0U; i<=7U; i++) { + Dealloc((char * *) &anonym->sammler[i]); + } /* end for */ + while (anonym->txInfoOut) { + ip = anonym->txInfoOut->next; + Dealloc((char * *) &anonym->txInfoOut); + anonym->txInfoOut = ip; + } + Dealloc((char * *) &anonym->SABMinfo); + /*send the (sad or lucky) message to host*/ + if (anonym->host && !anonym->saiddisc) { + /*do it only once*/ + /*WrStrLn(" say disc/busy"); */ + if (anonym->State==2U) { + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym->host, l, + l2_eBUSY); + } + else { + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym->host, l, + l2_eDISCONNECTED); + } + anonym->saiddisc = 1; + } + Cut(l); /*disconnect nudelport*/ + } + /*WrStr("dispo:");WrInt(ORD(immediate),2); WrInt(l^.mycall,2); + WrStrLn(""); */ + /* IF immediate OR (l^.mycall<>MAX(CARD16)) + THEN (*not a downlink*) */ + if (immediate || !((struct LINK *)l)->flexback) { + /*not a downlink*/ + { /* with */ + struct LINK * anonym0 = (struct LINK *)l; + if (anonym0->IsInQue<3U) { + { /* with */ + struct _1 * anonym1 = &PortL2[anonym0->Uplinkport-1U] + .SendQues[anonym0->IsInQue]; + if ((struct LINK *)anonym1->SendQueOut==(struct LINK *) + anonym1->SendQueIn) anonym1->SendQueOut = 0; + else if ((struct LINK *)l==(struct LINK *) + anonym1->SendQueOut) { + anonym1->SendQueOut = anonym0->SendQuenext; + } + else if ((struct LINK *)l==(struct LINK *) + anonym1->SendQueIn) { + anonym1->SendQueIn = anonym0->SendQueprev; + } + else { + ((struct LINK *)anonym0->SendQueprev) + ->SendQuenext = anonym0->SendQuenext; + ((struct LINK *)anonym0->SendQuenext) + ->SendQueprev = anonym0->SendQueprev; + } + } + } + /*remove link from hashchain*/ + if ((struct LINK *)l==(struct LINK *)AdrHash[anonym0->Hash]) { + AdrHash[anonym0->Hash] = anonym0->Hashnext; + } + else { + ((struct LINK *)anonym0->Hashprev) + ->Hashnext = ((struct LINK *)l)->Hashnext; + if ((struct LINK *)anonym0->Hashnext) { + ((struct LINK *)anonym0->Hashnext) + ->Hashprev = anonym0->Hashprev; + } + } + } + RemoveTimer(l); + --l2_PortSt[((struct LINK *)l)->Uplinkport].Links; + /*now the link has no relation with L2, + so give it to host or deallocate*/ + if (((struct LINK *)l)->host) { + /*WrStrLn("state12"); */ + ((struct LINK *)l)->State = 0U; + } + else { + /*WrStrLn("disposedealloc"); */ + ((struct LINK *)l)->Magic = 0UL; + Dealloc((char * *) &l); + } + } + } +/*WrStr("disposelink mem=");WrInt(memory,1); */ +/*WrStr(" hosts=");WrInt(hosts,1); */ +/*WrStrLn(""); (*for tests*) */ +} /* end DisposeLink() */ + + +static void TestMem(l2_pLINK l) +{ + struct LINK * anonym; + if (memory>=20U) { + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if ((struct LINK *)anonym->nudel) { + if (anonym->txbuffers+4Unudel); + anonym->txfull = 0; + } + } + else if (anonym->host && anonym->txbuffers<=maxtxbuffers) { + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym->host, l, l2_eTXFREE); + anonym->txfull = 0; + } + } + } +} /* end TestMem() */ + + +static void StartT3(l2_pLINK l) +{ + ((struct LINK *)l)->T3out = (Second+l2_Parms[((struct LINK *)l) + ->Uplinkport-1U]._._0.T3)%20000U; +} /* end StartT3() */ + + +static uint16_t T3resttime(l2_pLINK l) +{ + short th; + if (((struct LINK *)l)->T3out==65535U) return 0U; + th = (short)((struct LINK *)l)->T3out-(short)Second; + if (th<0) th += 20000; + if (th>10000) return 0U; + /* T3 ran out */ + return (uint16_t)th; +} /* end T3resttime() */ + + +static void Timeout(l2_pLINK l) +{ + struct LINK * anonym; + /*WrInt(Qtime, 6);WrInt(State, 6);WrInt(memory, 6); + WrStr(":qtime/state/mem "); */ + struct _0 * anonym0; /*remove timer from end of que*/ + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if (anonym->State<=1U && anonym->Qtime>DMTIME) { + DisposeLink(l, 1); + return; + } + { /* with */ + struct _0 * anonym0 = &PortL2[anonym->Uplinkport-1U]; + if ((struct LINK *)anonym0->T1Out==(struct LINK *)anonym0->T1In) { + anonym0->T1Out = 0; + } + else anonym0->T1Out = ((struct LINK *)anonym0->T1Out)->Timernext; + } + StartTimer(l); + if (anonym->State>=2U) { + if (anonym->T3out!=65535U) { + if (anonym->discing && anonym->State==5U) { + if (anonym->QtimeQtime; + else anonym->State = 4U; + } + if (T3resttime(l)==0U) anonym->T3out = 65535U; + } + } + else { + /*lifetimer for state 1 downlink*/ + ++anonym->Qtime; + StartT3(l); + } + /*WrStrLn(" incq "); */ + if (l2_Parms[anonym->Uplinkport-1U].DamaMaster) { + anonym->damastop = 0; /*link now is in its slot*/ + if (anonym->sendcmd!=0x4000U) { + /*there is a frame to be sent*/ + ToSendQue(l, anonym->sendcmd, anonym->cp); + /*damastop is over, so its qued*/ + anonym->damasecond = Second; /*last slot in absolute time*/ + return; + } + if ((anonym->State==5U && anonym->T3out!=65535U) && ((T3resttime(l) + <=DAMAFASTPOLLS || (PortL2[anonym->Uplinkport-1U].QTicker+1U) + %20000U==Second) || ((Second+20000U)-anonym->damasecond) + %20000U>=DAMAMAXTIME)) { + /*& damabit*/ + /*its a dama slot*/ + /*activ link*/ + /*port has still idle times*/ + ToSendQue(l, 0x1U, 2U); /*enable the other to send now*/ + anonym->damasecond = Second; /*store last absolute slot time*/ + } + } + if (anonym->txfull) TestMem(l); + if (anonym->T3out==65535U || anonym->State<=4U) MakePoll(l); + } +} /* end Timeout() */ + + +extern char l2_GetChar(l2_pLINK l, char delete0, + char * char0) +{ + l2_pDATA ip; + char ok0; + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + while (anonym->rxInfoOut) { + ok0 = anonym->rxInfoOut->len>1U; + *char0 = anonym->rxInfoOut->info[anonym->readp+1U]; + if (!delete0 && ok0) return 1; + if (anonym->Magic!=2091827346UL) return 0; + ++anonym->readp; + if (anonym->readp+1UrxInfoOut->len) return 1; + anonym->readp = 0U; + l2_L2Lock = 1; + ip = anonym->rxInfoOut->next; + Dealloc((char * *) &anonym->rxInfoOut); + anonym->rxInfoOut = ip; + --anonym->rxbuffers; + if (anonym->rxbuffers<=maxrxbuffers && memory>=20U) ClearBusy(l); + Unlock(); + if (ok0) return 1; + } + } + return 0; +} /* end GetChar() */ + + +extern uint16_t l2_GetStr(l2_pLINK l, uint16_t size, l2_pSTRING buf) +{ + l2_pDATA ip; + uint16_t n; + uint16_t retsize; + struct LINK * anonym; + retsize = 0U; + { /* with */ + struct LINK * anonym = (struct LINK *)l; + if (anonym->Magic==2091827346UL) { + while (retsizerxInfoOut) { + n = anonym->rxInfoOut->len-anonym->readp; + if (n>1U) { + --n; /*pid*/ + if (n+retsize>size) n = size-retsize; + X2C_MOVE((char *) + &anonym->rxInfoOut->info[anonym->readp+1U], + (char *) &buf[retsize],(uint32_t)n); + retsize += n; + anonym->readp += n; + } + if (anonym->readp+1U>=anonym->rxInfoOut->len) { + anonym->readp = 0U; + l2_L2Lock = 1; + ip = anonym->rxInfoOut->next; + Dealloc((char * *) &anonym->rxInfoOut); + anonym->rxInfoOut = ip; + --anonym->rxbuffers; + if (anonym->rxbuffers<=maxrxbuffers && memory>=20U) { + ClearBusy(l); + } + Unlock(); + } + } + } + } + return retsize; +} /* end GetStr() */ + + +static uint16_t CP(void) +{ + return (uint16_t)(2UL*(uint32_t)((uint8_t)l2_adress[6U]>=(uint8_t) + '\200')+(uint32_t)((0x10U & (uint16_t)(uint32_t) + (uint8_t)l2_adress[l2_asize-1U])!=0)); +} /* end CP() */ +/*p/f bit*/ +/*command bit*/ + +#define l2_SUMLEN 5 + + +static void Appendrx(l2_pLINK linkp, l2_pDATA b) +{ + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)linkp; + ++l2_PortSt[anonym->Uplinkport].Flows[Minute5].Igot; + anonym->RcvdBytes = anonym->RcvdBytes+(uint32_t)b->len; + if ((uint32_t)(uint8_t)b->info[1U]==(uint32_t) + anonym->exitch && anonym->host) Cut(linkp); + if ((struct LINK *)anonym->nudel) { + Appendtx(anonym->nudel, b); + if (((struct LINK *)anonym->nudel)->txbuffers+4U>memory/4U) { + ++anonym->busy; + ((struct LINK *)anonym->nudel)->txfull = 1; + } + } + else if (anonym->host) { + b->next = 0; + if (anonym->rxInfoOut==0) anonym->rxInfoOut = b; + else anonym->rxInfoIn->next = b; + anonym->rxInfoIn = b; + ++anonym->rxbuffers; + if (anonym->rxbuffers>=maxrxbuffers) ++anonym->busy; + if (anonym->rxbuffers==1U) { + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym->host, linkp, + l2_eRXDATA); + } + } + else Dealloc((char * *) &b); + } +} /* end Appendrx() */ + + +static char Ack(l2_pLINK linkp, uint16_t n, char resend) +{ + l2_pDATA dp; + /*ackowlege my sent info*/ + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)linkp; + if (((anonym->highsent+8U)-anonym->lowsent&7U)<((n+8U) + -anonym->lowsent&7U)) { + ToSendQue(linkp, 0x87U, 0U); /*acknowledges never sended info*/ + return 0; + } + anonym->twoway = 1; + while (anonym->lowsent!=n) { + /*delete acknowledged from sendbuffer*/ + if (anonym->txInfoOut) { + /*only for safety*/ + if (anonym->ns==anonym->lowsent) resend = 1; + dp = anonym->txInfoOut->next; + anonym->AckBytes = anonym->AckBytes+(uint32_t) + anonym->txInfoOut->len; + ++l2_PortSt[anonym->Uplinkport].Flows[Minute5].Iack; + Dealloc((char * *) &anonym->txInfoOut); + anonym->txInfoOut = dp; + --anonym->txbuffers; + } + else return 0; + /*dramatic internal error*/ + anonym->lowsent = anonym->lowsent+1U&7U; + } + if (resend) { + /*all sent acknolled or resend info*/ + anonym->ns = n; + anonym->sendinfo = 0; + anonym->retry = 0U; + } + if (resend || anonym->rembusy) { + anonym->infostop = 0; + StartT3(linkp); /*restart T3*/ + } + if (anonym->IsInQue>=3U && GetSendInfo(linkp)) { + ToSendQue(linkp, 0x8000U, 2U); /*schedule for sending next info*/ + PortL2[anonym->Uplinkport-1U] + .damaloop = PortL2[anonym->Uplinkport-1U].T1Out; + /*start quick roundtrip*/ + } + if (anonym->txfull) TestMem(linkp); + if (anonym->discing && anonym->txInfoOut==0) { + anonym->State = 4U; + MakePoll(linkp); /*DISC ...*/ + } + } + return 1; +} /* end Ack() */ + + +static void Uselink(l2_pLINK linkp) +{ + uint16_t compoll; + uint16_t i; + uint16_t sum; + uint16_t n; + l2_pDATA ip; + int32_t j; + uint16_t cmd; + char wasbusy; + char slave; + struct LINK * anonym; + int32_t tmp; + /*analyse (addressed to me) frames and reply*/ + /*WrStrLn("uselink"); */ + { /* with */ + struct LINK * anonym = (struct LINK *)linkp; + slave = !l2_Parms[anonym->Uplinkport-1U].DamaMaster && ((uint16_t) + (uint32_t)(uint8_t)l2_adress[13U]&0x20U)==0U; + cmd = 0xEFU&(uint16_t)(uint32_t)(uint8_t)l2_adress[l2_asize-1U]; + /*command field without p/f-bit*/ + compoll = CP(); /*response, final, command or poll*/ + if (anonym->cCONNtyp==l2_cNORMAL) { + if (anonym->T3out!=65535U) StartT3(linkp); + if ((cmd&0x1U)==0U) { + /*I-frame */ + if (anonym->State==5U) { + /*info transfer */ + n = (uint16_t)cmd/2U&7U; + /*send sequence number */ + if (Ack(linkp, (uint16_t)cmd/32U&7U, slave)) { + /*acknols my frames*/ + if (anonym->State==5U) { + /*maybe disc after all acknolled */ + i = l2_dbuf->len; + if (i>5U) i = 5U; + sum = 0U; + tmp = (int32_t)i-1L; + j = 0L; + if (j<=tmp) for (;; j++) { + sum += (uint16_t)(uint8_t)l2_dbuf->info[j]; + if (j==tmp) break; + } /* end for */ + if (n==anonym->nr && anonym->busy<8U) { + /*I-frame has expected number*/ + if ((n+9U&7U)!=anonym->sentnr) { + /*check windowsize */ + anonym->summs[n] = sum; /*mark it as old */ + ip = anonym->sammler[n]; + if (ip || Alloc((char * *) &ip, 10U)) { + /*do not say rnr with an*/ + Appendrx(linkp, l2_dbuf); + /*empty downlink buffer,*/ + l2_dbuf = ip; /*noone would clear this*/ + anonym->sammler[n] = 0; + for (;;) { + anonym->nr = anonym->nr+1U&7U; + if (anonym->sammler[anonym->nr]==0) { + /*no fitting frames in sammler*/ + anonym->rejsent = anonym->sammler[anonym->nr+1U&7U] + !=0; /*a hole in sammler?*/ + break; + /*so request only 1 I-frame by REJ if 1 is missing*/ + } + Appendrx(linkp, + anonym->sammler[anonym->nr]); + /*frame from sammler is in sequence*/ + anonym->sammler[anonym->nr] = 0; + } + } + } + else { + anonym->State = 1U; /*got 8 frames!*/ + ToSendQue(linkp, 0x87U, 0U); + } + } + else { + if (anonym->summs[n]!=sum) { + /*frame is from aktual window*/ + anonym->summs[n] = sum; + /*so put it into sammler */ + ip = anonym->sammler[n]; + if (ip || Alloc((char * *) &ip, 20U)) { + anonym->sammler[n] = l2_dbuf; + l2_dbuf = ip; + } + } + anonym->rejsent = compoll!=3U; + /*say not rej on i-poll */ + } + ToSendQue(linkp, 0x1U, (uint16_t)(compoll==3U)); + /*make final on poll */ + } + } + } + else if (compoll==3U && anonym->State!=2U) { + /*WrStrLn("state13"); */ + anonym->State = 1U; + ToSendQue(linkp, 0xFU, 1U); + } + } + else if ((cmd&0x3U)==0x1U) { + /*R?R-Frame, REJ with RNR is allowed*/ + wasbusy = anonym->rembusy; + anonym->rembusy = (0x4U & cmd)!=0; /*remote busy */ + anonym->rejgot = (0x8U & cmd)!=0; /*REJ */ + if (compoll==3U) anonym->busyend = 0; + /* IF wasbusy & NOT rembusy THEN T3out:=T3OFF END; + restart T1 */ + if (anonym->State!=5U || Ack(linkp, (uint16_t)cmd/32U&7U, + ((slave || compoll==1U) || anonym->rejgot) + || wasbusy && !anonym->rembusy)) { + if (compoll==3U) { + /*R?R.Poll */ + if (anonym->State==5U) ToSendQue(linkp, 0x1U, 1U); + else if (anonym->State!=2U) { + /*WrStrLn("state14"); */ + anonym->State = 1U; /*the other is polling*/ + ToSendQue(linkp, 0xFU, 1U); + } + } + } + } + else if (cmd==0x2FU && compoll==3U) { + /*only SABM.Poll accepted*/ + Dealloc((char * *) &anonym->SABMinfo); + if ((anonym->State!=2U && anonym->mycall==65535U) + && anonym->twoway) { + /*mycall=MAX is a downlink*/ + /*WrStrLn("state15"); */ + anonym->State = 1U; + if (anonym->flexback) DisposeLink(linkp, 1); + else ToSendQue(linkp, 0xFU, 1U); + } + else if (anonym->State==2U || anonym->State==1U && Alloc((char * *) + &ip, 0U)) { + if (anonym->host) --hosts; + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym->host, linkp, + l2_eCONNECTED); + if (anonym->host) ++hosts; + if (anonym->State==1U) { + /*connect comes from outside*/ + if (anonym->host && l2_dbuf->len) { + Appendrx(linkp, l2_dbuf); + l2_dbuf = ip; + } + else Dealloc((char * *) &ip); + } + if (anonym->host) { + /*host accepts that connect*/ + anonym->State = 5U; + anonym->Magic = 2091827346UL; + ToSendQue(linkp, 0x63U, 1U); + } + else { + /*WrStrLn("state16"); */ + anonym->State = 1U; + ToSendQue(linkp, 0xFU, 1U); + /*got no host, say busy or nothing if host needs time */ + } + } + else if (anonym->State<=4U || anonym->twoway) { + anonym->State = 1U; + /*linkreset, wait for new link. this SABM is lost*/ + /*WrStrLn("dispose3"); */ + DisposeLink(linkp, 0); /*a downlink will say DM*/ + } + else { + ToSendQue(linkp, 0x63U, 1U); + RemoveTimer(linkp); + anonym->T3out = 65535U; /*restart T1*/ + StartTimer(linkp); /*test if the other has a receiver*/ + anonym->infostop = 1; /*before resending the first I-frames*/ + } + } + else if (cmd==0x63U && compoll==1U) { + /*only UA.Final because i send SABM.P*/ + Dealloc((char * *) &anonym->SABMinfo); + if (anonym->State==2U) { + if (anonym->host) --hosts; + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym->host, linkp, + l2_eCONNECTED); + if (anonym->host) { + /*host is still alive*/ + ++hosts; + anonym->State = 5U; + anonym->twoway = 1; /*both are in state 5 now*/ + anonym->Magic = 2091827346UL; /*...a magic feeling*/ + anonym->retry = 0U; + if (anonym->txInfoOut==0) { + StartT3(linkp); /*stop T1 if no info to send*/ + } + else anonym->T3out = 65535U; + } + else { + /*WrStrLn("state17"); */ + anonym->State = 1U; + } + } + else if (anonym->State!=5U) { + /*host died after it started Conn*/ + anonym->State = 1U; + /*WrStrLn("dispose4"); */ + DisposeLink(linkp, anonym->twoway); + /*UA in twoway must be a reply of DISC*/ + } + } + else if (cmd==0x43U || cmd==0x87U) { + if (anonym->State!=2U) { + /*ignor discs while connecting*/ + /*WrStrLn("state18"); */ + anonym->State = 1U; + ToSendQue(linkp, 0xFU, 1U); + } + } + else if (cmd==0xFU) { + /*else ignore DISCs and go ahead with SABM*/ + if (compoll==1U) { + /*WrStrLn("dispose5"); */ + DisposeLink(linkp, 1); + } + } + else if (cmd==0x3U) { + /*ignore not final*/ + if (compoll==3U && anonym->State==1U) { + ToSendQue(linkp, 0xFU, 1U); + } + } + else ToSendQue(linkp, 0x87U, 0U); + } + else if ((anonym->cCONNtyp==l2_cFLEXback || anonym->cCONNtyp==l2_cCONNAK) + || anonym->cCONNtyp==l2_cFLEXbusy) { + /* + ELSIF cmd=UI THEN + IF (State=5) & (dbuf^.len#0) & ((cCONNtyp=cUI) + OR (cCONNtyp=cUIpoll)) THEN + IF Alloc(ip,MEMRR) THEN + Appendrx(dbuf); + dbuf:=ip; + END; + END; + */ + /*WrStrLn("uselink back"); */ + if (cmd==0x2FU && compoll==3U) { + /*only SABM.Poll accepted*/ + Dealloc((char * *) &anonym->SABMinfo); + /*WrStrLn("dispose15"); */ + DisposeLink(linkp, 1); + } + else { + /*WrStrLn("state1fb"); */ + anonym->State = 1U; + ToSendQue(linkp, 0xFU, 1U); + } + } + if (slave) { + PortL2[anonym->Uplinkport-1U].dama = 1; + if ((cmd&0x1U)!=0U || compoll==3U) { + /*poll or not info*/ + PortL2[anonym->Uplinkport-1U].dcd = 0; + PortL2[anonym->Uplinkport-1U].damat1 = 1; + } + } + } +} /* end Uselink() */ + +#define l2_WILD "T" + + +static void Mon(uint16_t port, l2_AFIELD adr, uint16_t alen, + l2_pDATA info) +{ + uint16_t i; + l2_pLINK lp; + struct LINK * anonym; + if (mfrom[0U]) { + i = 0U; + while (i<=5U && (mfrom[i]=='T' || mfrom[i]==adr[i])) ++i; + if (i<6U) { + for (i = 0U; i<=5U; i++) { + if (mfrom[i]!='T' && mfrom[i]!=adr[i+7U]) return; + } /* end for */ + } + } + if (monbufsrxInfoOut = 0; + anonym->Magic = 2091827346UL; + memcpy(anonym->Adress,adr,71u); + anonym->AdrLen = alen; + anonym->mycall = (uint16_t)(uint8_t)adr[alen-1U]; + anonym->Uplinkport = port; + i = 0U; /* axuudp2 info to monitor */ + do { + anonym->udp2info[i] = l2_udp2buf[i]; + ++i; + } while (!((i>=30U || i>=99U) || l2_udp2buf[i]==0)); + anonym->udp2info[i] = 0; + if (info && Alloc((char * *) &anonym->rxInfoOut, 0U)) { + *anonym->rxInfoOut = *info; + anonym->rxInfoOut->next = 0; + anonym->rxbuffers = 1U; + } + anonym->Hashnext = 0; + if ((struct LINK *)monBufOut==0) monBufOut = lp; + else ((struct LINK *)monBufIn)->Hashnext = lp; + monBufIn = lp; + ++monbufs; + } + } +} /* end Mon() */ + + +extern l2_pLINK l2_GetMon(void) +{ + l2_pLINK l; + l2_L2Lock = 1; + l = monBufOut; + if ((struct LINK *)monBufOut) { + monBufOut = ((struct LINK *)monBufOut)->Hashnext; + --monbufs; + ++hosts; + } + Unlock(); + return l; +} /* end GetMon() */ + + +static void SendBufferd(uint16_t port, uint16_t baud, uint16_t cmd) +/*send a frame with no link*/ +{ + l2_pLINK linkp; + struct LINK * anonym; + /*succeeds only if there is enough memory*/ + if (Alloc((char * *) &linkp, 6U)) { + memset((char *)linkp,(char)0,sizeof(struct LINK)); + { /* with */ + struct LINK * anonym = (struct LINK *)linkp; + anonym->IsInQue = 3U; + anonym->mycall = 0U; /*dispose link after sending*/ + anonym->Uplinkport = port; + anonym->State = 1U; + anonym->Baud = baud; + anonym->damastop = 0; + memcpy(anonym->Adress,l2_adress,71u); + /*useing static address field*/ + anonym->AdrLen = l2_asize; + if (l2_dbuf->len) { + anonym->sendinfo = l2_dbuf; + if (!Alloc((char * *) &l2_dbuf, 5U)) { + Dealloc((char * *) &linkp); /*so forget it all*/ + } + } + else anonym->sendinfo = 0; + if ((struct LINK *)linkp) ToSendQue(linkp, cmd, 3U); + } + } +} /* end SendBufferd() */ + + +extern void l2_SendRaw(l2_pSENDUI p) +{ + struct l2_SENDUI * anonym; + struct l2_DFIELD * anonym0; + l2_L2Lock = 1; + { /* with */ + struct l2_SENDUI * anonym = p; + if ((anonym->port>0U && anonym->port<=15U) + && l2_Parms[anonym->port-1U]._._0.Diversity>0U) { + l2_asize = 0U; + while (l2_asize<70U && anonym->path[l2_asize]) { + l2_adress[l2_asize] = (char)((uint32_t)(uint8_t) + anonym->path[l2_asize]*2UL+(uint32_t) + (anonym->path[l2_asize+1U]==0)); + ++l2_asize; + } + l2_adress[l2_asize] = anonym->cmd; + ++l2_asize; + { /* with */ + struct l2_DFIELD * anonym0 = l2_dbuf; + anonym0->len = anonym->datalen; + if (anonym0->len>257U) anonym0->len = 257U; + X2C_MOVE((char *)anonym->data,(char *)anonym0->info, + (uint32_t)anonym0->len); + } + SendBufferd(anonym->port, anonym->baud, 0x8000U); + } + } + Unlock(); +} /* end SendRaw() */ + + +static char Initlink(l2_pLINK * linkp, uint16_t hash, + uint16_t Uport, uint16_t baud) +{ + struct l2__D0 * anonym; /*statistics*/ + struct LINK * anonym0; + if (Alloc((char * *)linkp, 6U)) { + memset((char *)*linkp,(char)0,sizeof(struct LINK)); + { /* with */ + struct l2__D0 * anonym = &l2_PortSt[Uport]; + ++anonym->Links; + if (anonym->Links>anonym->MaxLinks) { + anonym->MaxLinks = anonym->Links; + } + } + { /* with */ + struct LINK * anonym0 = (struct LINK *)*linkp; + anonym0->Hash = hash; + if ((struct LINK *)AdrHash[anonym0->Hash]==0) { + anonym0->Hashnext = 0; /*append link to hashque*/ + } + else { + anonym0->Hashnext = AdrHash[anonym0->Hash]; + ((struct LINK *)AdrHash[anonym0->Hash])->Hashprev = *linkp; + } + AdrHash[anonym0->Hash] = *linkp; + anonym0->Baud = baud; + anonym0->IsInQue = 3U; /*not in sendque*/ + anonym0->Uplinkport = Uport; + anonym0->pid = '\360'; + anonym0->Started = Time; + anonym0->T3out = 65535U; /*start T1*/ + StartTimer(*linkp); /*each link has a timer till its disposed*/ + anonym0->haschains = 1; + } + return 1; + } + return 0; +} /* end Initlink() */ + + +static void Hashf(uint16_t * hash, uint16_t port) +{ + uint16_t i; + *hash = 0U; + for (i = 0U; i<=5U; i++) { + *hash += (uint16_t)((uint32_t)(uint8_t)l2_adress[i]+(uint32_t) + (uint8_t)l2_adress[i+7U]); /*hash function*/ + } /* end for */ + *hash = *hash/2U+port&15U; +} /* end Hashf() */ + + +static char CallComp(uint16_t p, AFIELDPO adr, uint16_t pp) +{ + uint16_t i; + for (i = 5U;; i--) { + if (l2_adress[p+i]!=adr[pp+i]) return 0; + if (i==0U) break; + } /* end for */ + return ((uint16_t)(uint32_t)(uint8_t)l2_adress[p+6U]&0x5EU) + ==((uint16_t)(uint32_t)(uint8_t)adr[pp+6U]&0x5EU); +} /* end CallComp() */ + + +extern l2_pLINK l2_Connect0(char * mp, l2_pCONNECT p) +/*NIL if no link*/ +{ + l2_pLINK linkp; + uint16_t hash; + l2_pDATA sabmi; + struct l2_CONNECT * anonym; + struct l2_DFIELD * anonym0; + struct LINK * anonym1; + { /* with */ + struct l2_CONNECT * anonym = p; + if ((anonym->port==0U || anonym->port>15U) + || l2_Parms[anonym->port-1U]._._0.Diversity==0U) return 0; + l2_L2Lock = 1; + l2_asize = 0U; /*uses static adress buffer, so not reentrant*/ + while (l2_asize<70U && anonym->l2adr[l2_asize]) { + l2_adress[l2_asize] = (char)((uint32_t)(uint8_t) + anonym->l2adr[l2_asize]*2UL+(uint32_t) + (anonym->l2adr[l2_asize+1U]==0)); + ++l2_asize; + } + ++l2_asize; + Hashf(&hash, l2_Parms[anonym->port-1U]._._0.Diversity); + linkp = AdrHash[hash]; + for (;;) { + /*look if a link from-to same calls exists*/ + if ((struct LINK *)linkp==0) break; + if (CallComp(0U, (AFIELDPO)((struct LINK *)linkp)->Adress, + 0U) && CallComp(7U, (AFIELDPO)((struct LINK *)linkp)->Adress, + 7U)) { + if (anonym->typ==l2_cTEST && ((struct LINK *)linkp)->State>1U) { + Unlock(); /*link exists*/ + return linkp; + } + /*WrStrLn("dispose6"); */ + DisposeLink(linkp, 1); /*and let the old one disappeare*/ + break; + } + linkp = ((struct LINK *)linkp)->Hashnext; + } + if (anonym->typ==l2_cTEST) { + Unlock(); + return 0; + } + /*extention, SABM with info*/ + sabmi = 0; + if (anonym->l3adr && anonym->l3adr[0U]) { + if (Alloc((char * *) &sabmi, 5U)) { + { /* with */ + struct l2_DFIELD * anonym0 = sabmi; + anonym0->len = 0U; + while (anonym0->len<=256U && anonym->l3adr[anonym0->len]) { + anonym0->info[anonym0->len] = anonym->l3adr[anonym0->len]; + ++anonym0->len; + } + } + } + else { + Unlock(); + return 0; + } + } + if (Initlink(&linkp, hash, anonym->port, + (uint16_t)((uint32_t)(uint8_t) + l2_Parms[anonym->port-1U].SendBauds[0U]-48UL))) { + { /* with */ + struct LINK * anonym1 = (struct LINK *)linkp; + anonym1->mycall = 65535U; /*is a downlink*/ + anonym1->host = mp; + anonym1->Magic = 2091827346UL; + anonym1->pid = (char)anonym->cpid; + anonym1->cCONNtyp = anonym->typ; + anonym1->State = 2U; + anonym1->T3out = 65535U; /*start T1*/ + if (anonym->typ==l2_cFLEXback || anonym1->cCONNtyp==l2_cCONNAK) { + anonym1->flexback = anonym->typ==l2_cFLEXback; + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym1->host, linkp, + l2_eCONNECTED); + StartT3(linkp); /*restart T3*/ + } + /*link setup*/ + anonym1->SABMinfo = sabmi; + anonym1->AdrLen = l2_asize; + memcpy(anonym1->Adress,l2_adress,71u); + if (l2_Parms[anonym->port-1U].DamaMaster) { + anonym1->Adress[13U] = (char)((uint16_t)(uint32_t) + (uint8_t)anonym1->Adress[13U]&~0x20U); + } + MakePoll(linkp); /*SABM ...*/ + if (anonym1->host) ++hosts; + } + Unlock(); + return linkp; + } + else { + if (sabmi) Dealloc((char * *) &sabmi); + Unlock(); + return 0; + } + } + return 0; +} /* end Connect() */ + + +static void CopyCall(l2_pLINK linkp, uint16_t to, uint16_t from) +/*and clean ssid from additional bits*/ +{ + uint16_t i; + struct LINK * anonym; + { /* with */ + struct LINK * anonym = (struct LINK *)linkp; + for (i = 0U; i<=5U; i++) { + anonym->Adress[to+i] = l2_adress[from+i]; + } /* end for */ + anonym->Adress[to+6U] = (char)((uint16_t)(uint32_t)(uint8_t) + l2_adress[from+6U]&0x7EU); + } +} /* end CopyCall() */ + + +static void invertpath(l2_pLINK linkp, char master, char flex) +{ + uint16_t j; + uint16_t i; + struct LINK * anonym; + CopyCall(linkp, 0U, 7U); /*invert direction*/ + CopyCall(linkp, 7U, 0U); + { /* with */ + struct LINK * anonym = (struct LINK *)linkp; + if (master) { + anonym->Adress[13U] = (char)((uint16_t)(uint32_t)(uint8_t) + anonym->Adress[13U]&~0x20U); /*set master bit*/ + } + i = 14U; /*invert digi-path*/ + j = l2_asize-8U; + while (j>=14U) { + CopyCall(linkp, i, j); + i += 7U; + j -= 7U; + } + if (flex) { + anonym->Adress[20U] = (char)((uint8_t)(uint8_t) + anonym->Adress[20U]|0x80U); /* set h-bit for pseudodigi */ + } + anonym->Adress[i-1U] = (char)((uint32_t)(uint8_t) + anonym->Adress[i-1U]+1UL); /*set address-end-bit*/ + anonym->AdrLen = i+1U; + } +} /* end invertpath() */ + + +static void rx(uint16_t Port) +/*analyse address-field*/ +{ + uint16_t hash; + uint16_t j; + uint16_t i; + l2_pLINK linkp; + char poll; + char v2; + char sabm; + char digisdone; + char isflex; + struct LINK lh; + struct l2__D1 * anonym; + struct LINK * anonym0; + /*memory avaliable*/ + struct LINK * anonym1; + /*memory avaliable*/ + struct LINK * anonym2; + { /* with */ + struct l2__D1 * anonym = &l2_PortSt[Port].Flows[Minute5]; + anonym->Bytegot = anonym->Bytegot+(uint32_t)l2_asize+(uint32_t) + l2_dbuf->len+3UL; /* + fcs + 1 flag */ + } + digisdone = l2_asize<22U || (uint8_t)l2_adress[l2_asize-2U]>=(uint8_t) + '\200'; /* no digis or last with h-bit */ + v2 = (uint8_t)l2_adress[6U]>=(uint8_t)'\200'==(uint8_t) + l2_adress[13U]<(uint8_t)'\200'; + poll = CP()==3U; + sabm = (v2 && poll) && (0xEFU&(uint16_t)(uint32_t)(uint8_t) + l2_adress[l2_asize-1U])==0x2FU; /* SABM.P v2.0 */ + isflex = (!digisdone && (l2_asize<29U || (uint8_t) + l2_adress[l2_asize-9U]>=(uint8_t)'\200')) + && CallComp(l2_asize-8U, (AFIELDPO)MyCalls[0U], 0U); + /* min 1 digi & last h-bit not set */ + /* 1 digi or second last h-bit set */ + /* my digi ask host for flexnet link */ + /*first look in existing links*/ + Hashf(&hash, l2_Parms[Port-1U]._._0.Diversity); + /*WrInt(hash, 10); WrStrLn(":hash "); */ + linkp = AdrHash[hash]; + /*WrInt(CAST(CARDINAL, linkp), 15); WrStrLn(":po "); */ + for (;;) { + if ((struct LINK *)linkp==0) break; + { /* with */ + struct LINK * anonym0 = (struct LINK *)linkp; + if (CallComp(0U, (AFIELDPO)anonym0->Adress, 7U) && CallComp(7U, + (AFIELDPO)anonym0->Adress, 0U)) { + i = 14U; + j = l2_asize-8U; /*all pseudodigis are compared too*/ + while (((j>=14U && (uint8_t)anonym0->Adress[i+6U]>=(uint8_t) + '\200') && (uint8_t)l2_adress[j+6U]<(uint8_t)'\200') + && CallComp(j, (AFIELDPO)anonym0->Adress, i)) { + i += 7U; + j -= 7U; + } + if (j<14U || (uint8_t)anonym0->Adress[i+6U]<(uint8_t) + '\200' && (uint8_t)l2_adress[j+6U]>=(uint8_t)'\200') { + break; + } + } + linkp = anonym0->Hashnext; + /*there may be more entries with same hash*/ + } + } + if ((struct LINK *)linkp) { + /*existing link*/ + if (v2) Uselink(linkp); + } + else if (digisdone && poll) { + /* new link */ + i = 1U; + for (;;) { + if (MyCalls[i][0U]==0) break; + if (CallComp(0U, (AFIELDPO)MyCalls[i], 0U) && Initlink(&linkp, hash, + Port, (uint16_t)((uint32_t)(uint8_t)l2_Parms[Port-1U].SendBauds[i]-48UL))) { + /*fitting mycall found*/ + { /* with */ + struct LINK * anonym1 = (struct LINK *)linkp; + anonym1->mycall = i; + anonym1->State = 1U; + invertpath(linkp, l2_Parms[Port-1U].DamaMaster, 0); + if (sabm) { + lh = *(struct LINK *)linkp; + /*WrStrLn("dispose1"); */ + DisposeLink(linkp, 1); + /* dispose before same flex backlink does it */ + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym1->host, + (l2_pLINK) &lh, l2_eCONNREQ); + } + else { + /* + StartT3(linkp); + (*start with T3*) + IF sabm THEN Uselink(linkp); + (*now it is an existing link*) + */ + ToSendQue(linkp, 0xFU, 1U); + /* say DM.F to any poll to mycall */ + } + } + break; + } + ++i; + } + } + else if (isflex) { + if (Initlink(&linkp, hash, Port, 0U)) { + { /* with */ + struct LINK * anonym2 = (struct LINK *)linkp; + anonym2->mycall = 0U; + anonym2->State = 1U; + invertpath(linkp, l2_Parms[Port-1U].DamaMaster, 1); + lh = *(struct LINK *)linkp; + /*WrStrLn("dispose1"); */ + DisposeLink(linkp, 1); + /* dispose before same flex backlink does it */ + if (sabm) { + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym2->host, + (l2_pLINK) &lh, l2_eCONNREQ); + /* call router to make link later */ + } + else { + X2C_CHKPROC(l2_CALLBACKPROC,Event)(&anonym2->host, + (l2_pLINK) &lh, l2_eFLEXDATA); + /* give router frame to digipeat */ + } + } + } + } +/* + + (*else if poll bit look for uplinks to a mycall*) + ELSIF (asize<=15) OR (adress[asize-2]>=200C) + OR isflex THEN (* no more digis in path or h-bits set *) +--WrStrLn(" newlink "); + i:=1; + LOOP + IF NOT isflex & (MyCalls[i][0]=0C) THEN EXIT END; + (*end of mycall-table*) + + IF isflex OR CallComp(0,ADR(MyCalls[i]), + 0) THEN (*fitting mycall found*) + IF (CP()=POLL) (*only polls a interesting*) + & ((adress[6]>=200C)=(adress[13]<200C)) (*is v2*) + & Initlink(linkp,hash,Port, + ORD(Parms[Port].SendBauds[i])-ORD("0")) + THEN (*memory avaliable*) + WITH linkp^ DO + mycall:=i; + IF isflex THEN mycall:=0 END; (* flex *) + State:=1; + CopyCall(0,7); (*invert direction*) + CopyCall(7,0); + IF Parms[Port].DamaMaster THEN + Adress[13]:=CAST(CHAR, CAST(SET16, ORD(Adress[13]))-DAMARR); + (*set master bit*) + END; + i:=14; (*invert digi-path*) + j:=asize-8; + WHILE j>=14 DO CopyCall(i,j); INC(i,7); DEC(j,7) END; + IF isflex THEN Adress[20]:=CAST(CHAR, CAST(SET8, + Adress[20])+SET8{7}) END; (* set h-bit for pseudodigi *) + Adress[i-1]:=CHR(ORD(Adress[i-1])+1); (*set address-end-bit*) + AdrLen:=i+1; + IF isflex THEN + lh:=linkp^; +--WrStrLn("dispose1"); + DisposeLink(linkp, TRUE); + (* dispose before same flex backlink does it *) + IF flexsabm THEN Event(host, ADR(lh), eCONNREQ) + ELSE Event(host, ADR(lh), eFLEXDATA) END; + ELSE + StartT3(linkp); (*start with T3*) + Uselink(linkp); (*now it is an existing link*) + END; + END; + END; + EXIT + + END; + INC(i); + END; + + (*at least look for digipeating*) + ELSIF Parms[Port].Digipeat & (asize>=15) THEN + i:=20; + LOOP + IF adress[i]<200C THEN (*no h-bit*) + IF CallComp(i-6,ADR(MyCalls[0]),0) THEN (*is my digicall*) + j:=0; + LOOP + IF DNot[j][0]=0C THEN (*end of dnot-table*) + adress[i]:=CHR(ORD(adress[i])+128); (*set h-bit*) +--WrStrLn("sendbuf"); + SendBufferd(Port,ORD(Parms[Port].SendBauds[0])-ORD("0"),NULL); + EXIT + + END; + k:=0; + WHILE DNot[j][k]=adress[k+7] DO + IF k=5 THEN EXIT END; + + INC(k); + END; + INC(j); + END; + END; + EXIT + + END; + INC(i,7); + IF i>asize THEN EXIT END; + + END; + END; +*/ +} /* end rx() */ + + +static void tx(l2_pLINK * SendQueIn, l2_pLINK * SendQueOut) +{ + l2_pLINK last; + l2_pDATA sendi; + char dealloc; + char isent; + struct LINK * anonym; + struct l2_DFIELD * anonym0; + /*WrStr("[");WrHex(CAST(CARD16,sendcmd), 1);WrStrLn("]"); */ + struct l2__D1 * anonym1; + struct LINK * anonym2; + /*WrStrLn("tx"); */ + while ((struct LINK *)*SendQueOut) { + { /* with */ + struct LINK * anonym = (struct LINK *)*SendQueOut; + sendi = 0; + isent = 0; + dealloc = 0; + if (anonym->mycall) { + if (anonym->State==5U && anonym->sendcmd==0x8000U || (anonym->sendcmd==0x1U && anonym->cp!=1U) + && !anonym->busyend) { + if (anonym->cCONNtyp) { + if (anonym->sendcmd==0x8000U) { + sendi = GetSendInfo(*SendQueOut); + if (sendi) { + anonym->sendcmd = 0x3U; + dealloc = 1; + anonym->txInfoOut = anonym->txInfoOut->next; + --anonym->txbuffers; + if (anonym->txfull) TestMem(*SendQueOut); + } + } + else anonym->sendcmd = 0x8000U; + } + else if (((((anonym->cp==3U && anonym->sendcmd==0x1U) + && anonym->sendinfo) + && anonym->sendinfo->len<=l2_Parms[anonym->Uplinkport-1U] + ._._0.IPoll) && !anonym->rembusy) && anonym->retry<=10U) { + /*& ((ns+9) MOD 8<>highsent)*/ + anonym->sendcmd = (uint16_t) + (2U*anonym->ns+32U*anonym->nr); /*I.P instead of RR.P*/ + anonym->sentnr = anonym->nr; + /*only for later check of windowsize*/ + sendi = anonym->sendinfo; + } + else { + /*RR may be sent as I*/ + sendi = GetSendInfo(*SendQueOut); + if (sendi) { + /*there is info to send*/ + if (sendi==anonym->txInfoIn) anonym->modifylast = 0; + ++l2_PortSt[anonym->Uplinkport].Flows[Minute5].Isent; + anonym->SentBytes = anonym->SentBytes+(uint32_t) + sendi->len; + if (anonym->sendinfo) anonym->ns = anonym->ns+1U&7U; + anonym->sendinfo = sendi; + anonym->sendcmd = (uint16_t) + (2U*anonym->ns+32U*anonym->nr); /*I-frame*/ + anonym->sentnr = anonym->nr; + /*only for later check of windowsize*/ + if (l2_Parms[anonym->Uplinkport-1U] + .DamaMaster && GetSendInfo(*SendQueOut)==0) { + anonym->cp = 3U; + anonym->damastop = 1; + } + else anonym->cp = 2U; + if (anonym->ns==anonym->highsent) { + anonym->highsent = anonym->highsent+1U&7U; + } + isent = 1; + } + } + } + else if (anonym->sendcmd==0x2FU) { + sendi = anonym->SABMinfo; /*extention, SABM with info*/ + } + else if (anonym->sendcmd==0x87U) { + if (Alloc((char * *) &sendi, 1U)) { + { /* with */ + struct l2_DFIELD * anonym0 = sendi; + anonym0->info[0U] = anonym->pid; + anonym0->info[1U] = 0; + /*may someone make it correct...*/ + anonym0->info[2U] = (char)anonym->nr; + anonym0->info[3U] = (char)anonym->ns; + anonym0->len = 4U; + } + dealloc = 1; + } + anonym->State = 1U; + } + } + else { + sendi = anonym->sendinfo; + dealloc = sendi!=0; + } + if (anonym->sendcmd!=0x8000U) { + if (anonym->sendcmd==0x1U) { + anonym->sendcmd = (uint16_t)((uint32_t)(uint16_t) + anonym->sendcmd+4UL*(uint32_t)(anonym->busy!=0U) + +8UL*(uint32_t)(anonym->rejsent && anonym->busy==0U) + +(uint32_t)(32U*anonym->nr)); + anonym->sentnr = anonym->nr; + /*only for later check of windowsize*/ + } + anonym->Adress[anonym->AdrLen-1U] = (char)((uint32_t) + (uint16_t)anonym->sendcmd+16UL*(uint32_t)(char) + (anonym->cp&1)); /*p/f bits*/ + anonym->Adress[6U] = (char)(128UL*(uint32_t) + (anonym->cp>=2U)+((uint32_t)(uint8_t) + anonym->Adress[6U]&127UL)); + anonym->Adress[13U] = (char)(128UL*(uint32_t) + (anonym->cp<2U)+((uint32_t)(uint8_t) + anonym->Adress[13U]&127UL)); + } + if (anonym->mycall==0U || anonym->sendcmd!=0x8000U) { + frameio_SendFrame((uint32_t) + l2_Parms[anonym->Uplinkport-1U]._._0.SendPort, + (uint32_t)anonym->Baud, anonym->Adress, 71ul, + (uint32_t)anonym->AdrLen, sendi); + /*WrStr("F:"); */ + /*IF sendi<>NIL THEN WrInt(sendi^.len,1) END; */ + { /* with */ + struct l2__D1 * anonym1 = &l2_PortSt[anonym->Uplinkport] + .Flows[Minute5]; + anonym1->Bytesent = anonym1->Bytesent+(uint32_t) + anonym->AdrLen+3UL; /* + fcs and 1 flag*/ + if (sendi) { + anonym1->Bytesent = anonym1->Bytesent+(uint32_t) + sendi->len; + } + } + if (l2_Parms[anonym->Uplinkport-1U].monitor) { + Mon(l2_Parms[anonym->Uplinkport-1U]._._0.SendPort, + anonym->Adress, anonym->AdrLen, sendi); + } + } + if (dealloc) Dealloc((char * *) &sendi); + anonym->IsInQue = 3U; + last = *SendQueOut; + if ((struct LINK *)*SendQueOut==(struct LINK *)*SendQueIn) { + *SendQueOut = 0; /*remove link from sendque*/ + } + else *SendQueOut = ((struct LINK *)*SendQueOut)->SendQuenext; + } + { /* with */ + struct LINK * anonym2 = (struct LINK *)last; + if (!anonym2->haschains) { + Dealloc((char * *) &last); + /*simple dealloc, there are no chains*/ + } + else { + anonym2->sendcmd = 0x4000U; + if (anonym2->State==5U) { + if (GetSendInfo(last)==0) { + /*no more info to send*/ + if (isent) { + /*but info sended*/ + RemoveTimer(last); + anonym2->T3out = 65535U; /*so restart T1*/ + StartTimer(last); + } + /*infostop:=Parms[Uplinkport].HalfDuplex;*/ + anonym2->damastop = l2_Parms[anonym2->Uplinkport-1U] + .DamaMaster; + } + else { + ToSendQue(last, 0x8000U, 2U); + /*reschedule for more I-frames*/ + } + } + else if (anonym2->State<=1U) DisposeLink(last, 0); + } + } + } +} /* end tx() */ + + +static void inctime(void) +{ + /* make always forward going time */ + uint32_t t; + uint32_t i; + t = osic_time(); + if (AbsTime!=t) { + AbsTime = t; + ++Time; + Minute5 = Minut5(); + if (ticker5!=Minute5) { + /*clear next statistics intervall*/ + ticker5 = Minute5; + for (i = 1UL; i<=15UL; i++) { + memset((char *) &l2_PortSt[i].Flows[Minute5],(char)0, + sizeof(struct l2__D1)); + } /* end for */ + } + } + ++tick10; + if (tick10%10UL==0UL) Second = (Second+1U)%20000U; +} /* end inctime() */ + +/* +PROCEDURE Layer2; (*started by ticker*) +VAR port,i:CARD16; + norx:BOOLEAN; +BEGIN +(* + IF LostINT>5 THEN LostINT:=5 END; +(*IF NOT L2Lock THEN + L2Lock:=TRUE; *) (*L2-interrupt must not be reentered!*) +*) + norx:=FALSE; + REPEAT + FOR port:=1 TO PORTS DO + WITH Parms[port] DO + WITH PortL2[port] DO + IF Diversity<>0 THEN (*port is enabled*) + + IF HalfDuplex THEN + IF dama THEN + IF dcd THEN + IF dcdguard0 THEN MH(port,adress,asize) END; + IF PortL2[SendPort].sendstate=TWAIT THEN PortL2[SendPort] + .txwait:=0 END; + + rx(Diversity); + + (*dcdguard:=0;*) + END; + ELSE norx:=TRUE END; + + END; + + IF Diversity=port THEN (*this ports has a sender*) + IF DamaMaster THEN + + IF (T1Out<>NIL) & NOT dcd & (PortL2[SendPort].txwait=0) THEN + Timeout(T1Out); + END; + ELSIF Ticker<>Second THEN + IF (NOT HalfDuplex OR (PortL2[SendPort].txwait=0) + & (NOT dcd OR damat1)) THEN (*timer is running*) + + IF (T1Out=NIL) OR (T1Out^.T1out<>QTicker) THEN + QTicker:=(QTicker+1) MOD SECMOD; + (*no timer in this second*) + ELSE Timeout(T1Out) END; + IF damat1 & (Ticker=Second) THEN damat1:=FALSE END; + END; + Ticker:=Second; + END; + + IF txwait<>0 THEN + IF (sendstate=TXDEL) OR NOT Sending(port) THEN DEC(txwait) + END; + IF txwait=0 THEN + IF sendstate=TXDEL THEN txwait:=TXtail; sendstate:=TXTAIL; + ELSIF (sendstate=TXTAIL) OR (sendstate=ECHO) THEN +-- StopFlags(port); + IF HalfDuplex THEN + txwait:=TXwait; +(* + IF T3count=0 THEN (*so restart T1*) + RemoveTimer(last); + StartTimer(last); + END; +*) + END; + sendstate:=TWAIT; + ELSE sendstate:=TWAIT END; + END; + + END; + + + IF dcd & (PortL2[SendPort].sendstate<>TXTAIL) THEN + dcd:=dama; + IF ((sendstate=TWAIT) OR (sendstate=DCDWAIT)) + & (txwait<=1) & (DCDwait<>0) & NOT dama THEN + IF NOT DamaMaster THEN + txwait:=((DCDwait*(tick10 MOD 256)) DIV 256)+2; +-- txwait:=DCDwait; + END; + sendstate:=DCDWAIT; + END; + + ELSIF lookinque THEN (*maybe sendque has an entry*) + WITH PortL2[SendPort] DO + IF (sendstate=TXTAIL) OR (txwait=0) THEN + i:=0; + LOOP + WITH PortL2[port].SendQues[i] DO + IF (SendQueOut<>NIL) THEN + IF (sendstate=TWAIT) & (TXdel<>0) THEN +-- StartFlags(Parms[port].SendPort, + SendQueOut^.Baud); + txwait:=TXdel; + sendstate:=TXDEL; + EXIT + + END; + tx(SendQueIn,SendQueOut); + txwait:=TXtail; + IF SendQueOut<>NIL THEN EXIT END; + (*sendbuffer is full*) + + END; + END; + INC(i); (*next sendque*) + IF i>=SENDQUES THEN PortL2[port].lookinque:=FALSE; + EXIT END; + + END; + END; + END; + ELSIF dama THEN dcd:=TRUE END; + END; + END; + END; + END; + + inctime; +(* + IF LostINT=0 THEN EXIT END; + + DEC(LostINT); + EXIT; +*) + + + UNTIL norx; +(* L2Lock:=FALSE; + END; *) +END Layer2; +*/ + +extern void l2_Layer2(void) +{ + /*started by ticker*/ + uint16_t i; + uint16_t port; + char test1; + char norx; + struct l2__D2 * anonym; + struct _0 * anonym0; + struct _1 * anonym1; + norx = 0; + do { + for (port = 1U; port<=15U; port++) { + { /* with */ + struct l2__D2 * anonym = &l2_Parms[port-1U]; + { /* with */ + struct _0 * anonym0 = &PortL2[port-1U]; + if (anonym->_._0.Diversity) { + /*port is enabled*/ + test1 = PortL2[anonym->_._0.Diversity-1U].dcd; + PortL2[anonym->_._0.Diversity-1U].dcd = 0; + if (anonym->HalfDuplex && frameio_DCD((uint32_t)port)) { + if (anonym0->dcdguard_._0.DCDIGNOR) { + PortL2[anonym->_._0.Diversity-1U].dcd = 1; + ++anonym0->dcdguard; + } + } + else anonym0->dcdguard = 0U; + /*IF PortL2[Diversity].dcd<>test1 THEN WrStr("d"); + WrInt(ORD(PortL2[Diversity].dcd),1) END; */ + if (frameio_GetFrame((uint32_t)port)) { + /*WrStr("R"); */ + if (anonym->monitor && (frameio_crcok || anonym->passall) + ) Mon(port, l2_adress, l2_asize, l2_dbuf); + if (frameio_crcok) { + if (PortL2[anonym->_._0.SendPort-1U] + .sendstate==l2_TWAIT) { + PortL2[anonym->_._0.SendPort-1U].txwait = 0U; + } + rx(anonym->_._0.Diversity); + } + } + else norx = 1; + } + if (anonym->_._0.Diversity==port) { + /*this ports has a sender*/ + if (anonym0->Ticker!=Second) { + if (!(PortL2[anonym->_._0.Diversity-1U] + .dcd || frameio_Sending((uint32_t)port))) { + /*timer is running*/ + if ((struct LINK *) + anonym0->T1Out==0 || ((struct LINK *)anonym0->T1Out) + ->T1out!=anonym0->QTicker) { + anonym0->QTicker = (anonym0->QTicker+1U)%20000U; + /*no timer in this second*/ + } + else Timeout(anonym0->T1Out); + } + anonym0->Ticker = Second; + } + if (!PortL2[anonym->_._0.Diversity-1U].dcd) { + i = 0U; + for (;;) { + { /* with */ + struct _1 * anonym1 = &PortL2[anonym->_._0.SendPort-1U] + .SendQues[i]; + if ((struct LINK *)anonym1->SendQueOut) { + /*WrStr("T"); */ + tx(&anonym1->SendQueIn, &anonym1->SendQueOut); + if ((struct LINK *)anonym1->SendQueOut) { + break; /*sendbuffer is full*/ + } + } + } + ++i; /*next sendque*/ + if (i>=3U) { + break; + } + } + } + } + } + } + } /* end for */ + inctime(); + } while (!norx); +} /* end Layer2() */ + + +extern void l2_L2Init(uint16_t bufs, uint16_t portset, + l2_CALLBACKPROC callback) +{ + uint16_t j; + uint16_t i; + struct l2__D2 * anonym; + struct _0 * anonym0; + /* init with default parameters */ + Event = callback; + hosts = 0U; + monbufs = 0U; + monBufOut = 0; + memset((char *)MyCalls,(char)0,119UL); + memset((char *)DNot,(char)0,63UL); + mfrom[0U] = 0; + maxrxbuffers = bufs/10U; + maxtxbuffers = 30U; + maxmonbufs = bufs/5U; + QTIME = 48U; + DMTIME = 60U; + DAMAMAXTIME = 15U; + DAMAFASTPOLLS = 4U; + l2_L2Lock = 0; + l2_LostINT = 0U; + for (i = 0U; i<=15U; i++) { + AdrHash[i] = 0; + } /* end for */ + Time = 0UL; + AbsTime = 0UL; + Second = 0U; + Minute5 = 0U; + memory = 0U; + Freechain = 0; + i = (uint16_t)sizeof(struct l2_DFIELD); + if (sizeof(struct LINK)>(uint32_t)i) { + i = (uint16_t)sizeof(struct LINK); + } + for (;;) { + osic_alloc((char * *) &l2_dbuf, (uint32_t)i); + if (memory>=bufs) break; + Dealloc((char * *) &l2_dbuf); + } + /*WrInt(SIZE(dbuf^), 10); WrInt(SIZE(monBufOut^), 10); WrStrLn(" d,l"); */ + for (i = 1U; i<=15U; i++) { + { /* with */ + struct l2__D2 * anonym = &l2_Parms[i-1U]; + memset((char *) &l2_Parms[i-1U],(char)0, + sizeof(struct l2__D2)); + /*defaults*/ + anonym->_._0.T1 = 20U; + anonym->_._0.T3 = 1800U; + anonym->_._0.BaudSwBytes = 5U; + anonym->_._0.TXdel = 20U; /* 25 */ + anonym->_._0.txDelByte = 126U; + anonym->_._0.TXwait = 2U; /* 80 */ + anonym->_._0.TXtail = 1U; /* 3 */ + anonym->_._0.DCDwait = 2U; + anonym->_._0.DCDlevel = 27000U; + anonym->_._0.SendPort = i; + /* IF (i>=8) & (i<12) THEN Diversity:=i; END;*/ + if (X2C_IN((int32_t)i,16,portset)) anonym->_._0.Diversity = i; + anonym->_._0.Retries = 25U; + anonym->HalfDuplex = 1; + anonym->DamaMaster = 0; + anonym->_._0.MaxFrames = 7U; + anonym->_._0.IPoll = 80U; + anonym->_._0.MhTime = 0U; + anonym->monitor = 0; + anonym->Digipeat = 1; + strncpy(anonym->SendBauds,"222222222",17u); + anonym->passall = 0; + anonym->_._0.DCDIGNOR = 6000U; /* 6000 */ + } + /* MODEMPOLL:=500; */ + { /* with */ + struct _0 * anonym0 = &PortL2[i-1U]; + memset((char *) &PortL2[i-1U],(char)0,sizeof(struct _0)); + anonym0->Ticker = 0U; + anonym0->QTicker = 0U; + anonym0->txwait = 0U; + anonym0->sendstate = l2_TWAIT; + anonym0->T1Out = 0; + anonym0->damaloop = 0; + for (j = 0U; j<=2U; j++) { + anonym0->SendQues[j].SendQueOut = 0; + } /* end for */ + } + CheckParms(i); + } /* end for */ + memset((char *)l2_PortSt,(char)0,sizeof(struct l2__D0 [16])); + frameio_Init(); +} /* end L2Init() */ + + +extern void l2_BEGIN(void) +{ + static int l2_init = 0; + if (l2_init) return; + l2_init = 1; + if (sizeof(uint16_t)!=2) X2C_ASSERT(0); + if (sizeof(uint8_t)!=1) X2C_ASSERT(0); + if (sizeof(l2_CALLTYP)!=7) X2C_ASSERT(0); + if (sizeof(l2_AFIELD)!=71) X2C_ASSERT(0); + if (sizeof(l2_SUMMS)!=28) X2C_ASSERT(0); + osi_BEGIN(); + frameio_BEGIN(); +} + diff --git a/src/l2.h b/src/l2.h new file mode 100644 index 0000000..b82639c --- /dev/null +++ b/src/l2.h @@ -0,0 +1,298 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef l2_H_ +#define l2_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif + +typedef uint16_t l2_SET16; + +typedef uint8_t l2_SET8; + +extern uint16_t l2_UA; + +extern uint16_t l2_DM; + +extern uint16_t l2_SABM; + +extern uint16_t l2_DISC; + +extern uint16_t l2_FRMR; + +extern uint16_t l2_UI; + +extern uint16_t l2_RR; + +extern uint16_t l2_REJ; + +extern uint16_t l2_RNR; + +#define l2_PORTS 15 +/* portset is SET16 */ + +#define l2_MYCALLS 16 + +typedef char l2_CALLTYP[7]; + +typedef char * l2_pSTRING; + +struct l2_DFIELD; + +typedef struct l2_DFIELD * l2_pDATA; + + +struct l2_DFIELD { + l2_pDATA next; + uint16_t len; + char info[257]; /*incl PID*/ +}; + +typedef void *l2_pLINK; + +typedef char l2_AFIELD[71]; + +enum l2_EVENT {l2_eCONNECTED, l2_eDISCONNECTED, l2_eBUSY, l2_eTXFREE, + l2_eRXDATA, l2_eMONITOR, + l2_eLISTEN, l2_eIDLE, l2_eCONNREQ, l2_eFLEXDATA}; + + +extern char l2_L2Lock; /*disable interrupt starting L2*/ + +extern uint16_t l2_LostINT; + +extern l2_pDATA l2_dbuf; /*must be new allocated after use*/ + +extern l2_AFIELD l2_adress; /*static adress field*/ + +extern uint16_t l2_asize; /*length of static adress*/ + +extern char l2_udp2buf[100]; /* axudp2 header after Getframe */ + +struct l2__D0; + +struct l2__D1; + + +struct l2__D1 { + uint16_t Isent; /*I-frames sent, without I.P*/ + uint16_t Iack; /*therefrom ackowledged*/ + uint16_t Igot; /*I-frames got and accepted*/ + uint32_t Bytesent; /*all frames + FCS + 1 flag*/ + uint32_t Bytegot; /*all frames + FCS + 1 flag*/ +}; + + +struct l2__D0 { + uint16_t Links; /*statistics: links, including inactives*/ + uint16_t MaxLinks; + struct l2__D1 Flows[13]; +}; + +extern struct l2__D0 l2_PortSt[16]; + +struct l2__D2; + + +struct l2__D2 { + union { + /* (*c*) = rangecheck necessary*/ + uint16_t card[17]; + struct { + uint16_t SendPort; /*c*/ /*associated send port to that uplinkport*/ + uint16_t Diversity; /*c*/ /*accept frames to existing links from ports with same numbers*/ + uint16_t DCDlevel; + uint16_t TXwait; /*wait after sending before sending again*/ + uint16_t TXtail; /*for fullduplex*/ + uint16_t TXdel; /*txdelay*/ + uint16_t DCDwait; /*wait after dcd before sending*/ + uint16_t BaudSwBytes; /*c*/ /*number of flags sent after baud-switch*/ + uint16_t txDelByte; /*bit pattern sent for sync*/ + uint16_t MaxFrames; /*c*/ /*send windowsize*/ + uint16_t T1; + uint16_t T3; + uint16_t IPoll; /*max info length for I.Poll*/ + uint16_t Retries; + uint16_t MhTime; /*0 = mh off*/ + uint16_t DCDIGNOR; /*ignore dcd longer than this time/dama slave off*/ + } _0; + } _; + char monitor; + char passall; + char DamaMaster; + char HalfDuplex; + char Digipeat; + char Echo; + char SendBauds[17]; /*relation mycall <-> baud*/ +}; + +extern struct l2__D2 l2_Parms[15]; + +typedef uint16_t l2_CMD; + +enum l2_CONNTYP {l2_cNORMAL, l2_cCONNAK, l2_cFLEXback, l2_cFLEXbusy, + l2_cTEST}; + + +struct l2_CONNECT; + +typedef struct l2_CONNECT * l2_pCONNECT; + + +struct l2_CONNECT { + /* cmd:CARD16;*/ + uint16_t handle; + uint16_t port; /*the port number of uplink port*/ + uint16_t baud; /*baud is the index of sendbaud-table*/ + uint16_t cpid; /*PID*/ + l2_pSTRING l2adr; /*0-terminated unshifted raw ax.25 adress*/ + l2_pSTRING l3adr; /*0-terminated SABM-with-info text for routing + unused if points to NIL*/ + uint8_t typ; /*TEST returns an existing link with same adress*/ +}; + +struct l2_SENDUI; + +typedef struct l2_SENDUI * l2_pSENDUI; + + +struct l2_SENDUI { + char cmd; /* frame cmd */ + uint16_t port; + uint16_t baud; + l2_pSTRING path; /*0-terminated, raw, unshifted ax.25 adress-field*/ + uint16_t datalen; + l2_pSTRING data; /* PID is part of data */ +}; + +struct l2_GETADRESS; + +typedef struct l2_GETADRESS * l2_pGETADRESS; + + +struct l2_GETADRESS { + uint16_t cmd; + uint16_t port; /*number of uplink port*/ + uint16_t my; /*number of mycall*/ + uint16_t cpid; /*65535 if not known*/ + char adress[72]; /*0-terminated, raw ax.25 adress*/ +}; + +struct l2_GETSTAT; + +typedef struct l2_GETSTAT * l2_pGETSTAT; + + +struct l2_GETSTAT { + uint16_t cmd; + l2_pLINK l; + uint16_t n; + uint16_t st; + uint16_t port; + uint16_t my; + uint16_t txbu; + uint16_t ret; + char bsy; + char remb; + l2_pLINK nudl; + char adress[72]; + uint32_t sent; + uint32_t ack; + uint32_t rcvd; + uint32_t since; +}; + +typedef uint32_t l2_SUMMS[7]; + +struct l2_PORTSTAT; + +typedef struct l2_PORTSTAT * l2_pPORTSTAT; + + +struct l2_PORTSTAT { + uint16_t cmd; + uint16_t port; + uint16_t minits5; + l2_SUMMS sums; + uint16_t mem; + uint32_t time0; +}; + +struct l2_PARMS0; + +typedef struct l2_PARMS0 * l2_pPARMS; + + +struct l2_PARMS0 { + uint16_t cmd; + uint16_t port; + uint16_t parm; + char test; /* get instead of set parm */ + uint32_t val; /* for numeric values */ + l2_pSTRING str; /* for string values */ +}; + +typedef void ( *l2_CALLBACKPROC)(char * *, l2_pLINK, uint8_t); + +extern l2_pLINK l2_Connect0(char *, l2_pCONNECT); +/* NIL if no link */ +/*mp: adress that is enclosed in all messages from L2 to +the host and may point to host-task-context*/ + +extern void l2_Disconnect(l2_pLINK *, char); +/*if dealloc, the owner of the link will be l2, else owner stays +the host and it must send a disconnect with dealloc later to +release memory and timers*/ + +extern void l2_Circuit(l2_pLINK *, l2_pLINK *, char, char, + uint16_t); +/*links streams of l1 and l2, if not reconn, then +the link will then belong to L2 again +reconn: if the other link disconnects, this links +datastream will be switched back to host +exitchar: if first char in l1-input-stream equals exitchar +the stream of l1 will be switched to host*/ + +extern void l2_GetAdress0(l2_pLINK, l2_pGETADRESS); + +extern void l2_Getudp2info(l2_pLINK, char [], uint32_t); + +extern char l2_GetChar(l2_pLINK, char, char *); +/*returns false if buffer is empty +delete: delete char from buffer after get*/ + +extern uint16_t l2_GetStr(l2_pLINK, uint16_t, l2_pSTRING); +/*return is length of data */ + +extern char l2_SendStr(l2_pLINK, uint16_t, l2_pSTRING); +/* max 256 byte, false if data not sent (sendbuffer full) */ + +extern void l2_SendRaw(l2_pSENDUI); +/* pid >255 send no pid */ + +extern void l2_GetStat0(l2_pGETSTAT); + +extern char l2_PortStat0(l2_pPORTSTAT); +/* true if port is enabled */ + +extern void l2_Parm(l2_pPARMS); + +extern l2_pLINK l2_GetMon(void); + +extern void l2_Layer2(void); +/*started by 10ms interrupt-ticker if not L2Lock*/ + +extern void l2_L2Init(uint16_t, uint16_t, l2_CALLBACKPROC); + + +extern void l2_BEGIN(void); + + +#endif /* l2_H_ */ diff --git a/src/l2cat.c b/src/l2cat.c new file mode 100644 index 0000000..7900645 --- /dev/null +++ b/src/l2cat.c @@ -0,0 +1,1960 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define l2cat_C_ +#ifndef Execlogin_H_ +#include "Execlogin.h" +#endif +#include +#include +#ifndef Select_H_ +#include "Select.h" +#endif +#ifndef cleanup_H_ +#include "cleanup.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef l2_H_ +#include "l2.h" +#endif +#ifndef frameio_H_ +#include "frameio.h" +#endif +#ifndef deflate_H_ +#include "deflate.h" +#endif + +/* layer2 to std in/out or start a task*/ +/* +FROM mlib IMPORT tcsetattr, tcgetattr, tcflag_t, + TCSAFLUSH, TIOCMGET, TIOCMBIS, TIOCMBIC, TCSANOW, ISIG, + CS8, CLOCAL, CREAD, CRTSCTS, B1200, B2400, + B4800, B9600, B19200, B38400, B57600, B115200, B230400, + B460800, TIOCM_CD, TIOCM_DTR, TIOCSCTTY; +*/ +#define l2cat_MAXCMDWORDS 64 + +#define l2cat_NL "\012" + +#define l2cat_PPPFLAG 0x7E + +#define l2cat_PPPESC 0x7D + +#define l2cat_LF "\012" + +#define l2cat_LOOPTIME 10000 + +#define l2cat_MINRECONTIME 2000000 + +#define l2cat_MAXRECONTIME 120000000 + +#define l2cat_RCTIMEBASE 1000 + +typedef char IOBUF[256]; + +struct JUNKBUF; + + +struct JUNKBUF { + IOBUF buf; + int32_t len; + int32_t time0; +}; + +struct DEFLATBUF; + + +struct DEFLATBUF { + char outbuf[20001]; /* 20000 */ + int32_t outlen; + char xoutbuf[4096]; + char pppbuf[4096]; + int32_t ppplen; + int32_t xoutlen; + int32_t inp0; + int32_t xinp; + char pppstate; + struct deflate_CONTEXT deflatcontext; + struct deflate_XCONTEXT expandcontext; + char done; + char pppframing; +}; + +struct TASK; + +typedef struct TASK * pTASK; + + +struct TASK { + pTASK next; + IOBUF inbuf; + IOBUF outbuf; + int32_t inlen; + int32_t outlen; + struct JUNKBUF junkbuf; + struct l2_GETADRESS l2addr; + l2_pLINK link0; + uint16_t events; + int32_t infd; + int32_t outfd; + uint8_t state; + uint32_t crlfmode; + uint32_t detectdone; + uint32_t inignor; + struct DEFLATBUF * pcdeflat; +}; + +static char terminate; + +static char keepconnected; + +static char verb; + +static char verb2; + +static char usedeflat; + +static char pppmode; + +static char autodet; + +static pTASK tasks; + +static uint32_t sockc; + +static uint32_t convlfcr; + +static uint32_t convtopipe; + +static uint32_t montyp; + +static uint32_t recontime; + +static uint32_t minrecontime; + +static uint32_t maxrecontime; + +static int32_t timesum; + +static int32_t pppdiscard; + +static char mycall[113]; + +static char cmdline[4096]; + +static char pipename[4096]; + +static char connectto0[256]; /* if active connect to this server */ + +static struct l2_PARMS0 parms; + +struct _0; + + +struct _0 { + int32_t port; + int32_t parmnum; + int32_t val; +}; + +static struct _0 numpar[256]; + +static l2_pLINK pmon; + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_Werr(text, text_len); + osi_Werr(" error abort\012", 14ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + +#define l2cat_QUOT "\"" + +#define l2cat_SEP " " + + +static void NextArgs(char s[], uint32_t s_len) +{ + char h[65536]; + int32_t l; + s[0UL] = 0; + l = 0L; + do { + osi_NextArg(h, 65536ul); + if (l==0L) { + if (h[0U]=='\"') aprsstr_Delstr(h, 65536ul, 0UL, 1UL); + else { + aprsstr_Append(s, s_len, h, 65536ul); + return; + } + } + l = (int32_t)aprsstr_Length(h, 65536ul); + if (l==0L) return; + if (h[l-1L]=='\"') { + aprsstr_Delstr(h, 65536ul, (uint32_t)(l-1L), 1UL); + l = 0L; + } + aprsstr_Append(s, s_len, " ", 2ul); + aprsstr_Append(s, s_len, h, 65536ul); + } while (l); +} /* end NextArgs() */ + + +static void Whex(char hd[], uint32_t hd_len, const char bu[], + uint32_t bu_len, int32_t len) +{ + int32_t i0; + uint32_t b; + int32_t tmp; + char tmp0; + X2C_PCOPY((void **)&hd,hd_len); + osi_Werr(hd, hd_len); + tmp = len-1L; + i0 = 0L; + if (i0<=tmp) for (;; i0++) { + b = (uint32_t)(uint8_t)bu[i0]/16UL; + if (b>=10UL) { + osi_Werr((char *)(tmp0 = (char)(b+55UL),&tmp0), 1u/1u); + } + else osi_Werr((char *)(tmp0 = (char)(b+48UL),&tmp0), 1u/1u); + b = (uint32_t)(uint8_t)bu[i0]&15UL; + if (b>=10UL) { + osi_Werr((char *)(tmp0 = (char)(b+55UL),&tmp0), 1u/1u); + } + else osi_Werr((char *)(tmp0 = (char)(b+48UL),&tmp0), 1u/1u); + if ((i0&31L)==31L) osi_Werr("\012", 2ul); + else osi_Werr(" ", 2ul); + if (i0==tmp) break; + } /* end for */ + osi_Werr("\012", 2ul); + X2C_PFREE(hd); +} /* end Whex() */ + + +static void CallStr(char c[], uint32_t c_len, uint32_t n, + char withssid, char s[], uint32_t s_len) +{ + uint32_t p; + uint32_t i0; + X2C_PCOPY((void **)&c,c_len); + n = n*7UL; + p = 0UL; + for (i0 = 0UL; i0<=5UL; i0++) { + if (c[i0+n]!=' ') { + s[p] = c[i0+n]; + ++p; + } + } /* end for */ + s[p] = 0; + if (withssid) { + i0 = (uint32_t)(uint8_t)c[n+6UL]&15UL; + if (i0) { + s[p] = '-'; + ++p; + if (i0>=10UL) { + s[p] = (char)(i0/10UL+48UL); + ++p; + } + s[p] = (char)(i0%10UL+48UL); + ++p; + } + s[p] = 0; + } + X2C_PFREE(c); +} /* end CallStr() */ + + +static void WerrCall(pTASK task) +{ + char h[256]; + if (verb && task) { + CallStr(task->l2addr.adress, 72ul, 0UL, 1, h, 256ul); + osi_Werr(h, 256ul); + } +} /* end WerrCall() */ + + +static void GetCall(const char from[], uint32_t from_len, + uint32_t * p, l2_pSTRING to) +{ + uint16_t len; + uint16_t i0; + len = (uint16_t)aprsstr_Length(from, from_len); + while (*p<(uint32_t)len && (uint8_t)from[*p]<=' ') ++*p; + for (i0 = 0U; i0<=5U; i0++) { + if ((*p<(uint32_t)len && from[*p]!='-') && from[*p]!=' ') { + to[i0] = X2C_CAP(from[*p]); + ++*p; + } + else to[i0] = ' '; + } /* end for */ + i0 = 0U; + if (from[*p]=='-') { + ++*p; + if ((uint8_t)from[*p]>='0' && (uint8_t)from[*p]<='9') { + i0 = (uint16_t)((uint32_t)(uint8_t)from[*p]-48UL); + ++*p; + } + if ((uint8_t)from[*p]>='0' && (uint8_t)from[*p]<='9') { + i0 = (uint16_t)(((uint32_t)(i0*10U)+(uint32_t)(uint8_t) + from[*p])-48UL); + ++*p; + } + } + to[6U] = (char)((i0&15U)+48U); +} /* end GetCall() */ + +static void Event(char * *, l2_pLINK, uint8_t); + + +static void Event(char * * atask, l2_pLINK link0, uint8_t event) +{ + struct l2_GETADRESS gadr; + pTASK ntask; + struct l2_CONNECT connect; + pTASK ptask; + if (event==l2_eCONNREQ) { + osic_alloc((char * *) &ntask, sizeof(struct TASK)); + if (ntask==0) return; + memset((char *)ntask,(char)0,sizeof(struct TASK)); + ntask->infd = -1L; + ntask->outfd = -1L; + ntask->link0 = link0; + ntask->state = 1U; + ntask->crlfmode = convlfcr; + ntask->detectdone = (uint32_t)autodet; + l2_GetAdress0(link0, &ntask->l2addr); + memset((char *) &connect,(char)0,sizeof(struct l2_CONNECT)); + connect.port = ntask->l2addr.port; + connect.baud = 1U; + connect.cpid = 240U; + connect.l2adr = (l2_pSTRING)ntask->l2addr.adress; + connect.typ = l2_cCONNAK; + ntask->link0 = l2_Connect0((char *)ntask, &connect); + ntask->next = tasks; + tasks = ntask; + if (verb) { + WerrCall(ntask); + osi_Werr(" connreq\012", 10ul); + } + } + else if (event==l2_eFLEXDATA) l2_GetAdress0(link0, &gadr); + else if (event==l2_eCONNECTED) { + /*WrStr(gadr.adress); */ + /*WrInt(dbuf^.len, 10); */ + /*WrStrLn(" flexdata"); */ + if (verb) { + WerrCall((pTASK)*atask); + osi_Werr(" connected!\012", 13ul); + } + if (*atask) { + ptask = (pTASK)*atask; + ptask->state = 1U; + } + } + else if (*atask) { + /* ELSIF event=eDISCONNECTED THEN */ + /*WrInt(ORD(event), 1);WrStrLn(":host got event"); */ + ptask = (pTASK)*atask; + ptask->events |= (1U<s_len-1 || s[i0]==0) break; + if (s[i0]==e) { + s[i0] = ' '; + break; + } + if (j=argbuf_len-1) { + /*argbuffer full*/ + argbuf[argbuf_len-1] = 0; + osi_Werr("ArgBuf full!\012", 14ul); + break; + } + argbuf[argp] = h[i0]; + ++argp; + if (h[i0]==0) break; + ++i0; + } + ++argc; + if (argc>=argwords_len-1) break; + } + argwords[argc] = 0; + X2C_PFREE(s); +} /* end taskparms() */ + +#define l2cat_M "%" + + +static void Makros(char c[], uint32_t c_len, char a[], + uint32_t a_len, char s[], uint32_t s_len) +{ + uint32_t i0; + char h[16]; + char m; + X2C_PCOPY((void **)&c,c_len); + X2C_PCOPY((void **)&a,a_len); + s[0UL] = 0; + i0 = 0UL; + m = 0; + while (i0<=c_len-1 && c[i0]) { + if (m) { + if (c[i0]=='%') aprsstr_Append(s, s_len, "%", 2ul); + else if (c[i0]=='m') { + CallStr(a, a_len, 1UL, 1, h, 16ul); + aprsstr_Append(s, s_len, h, 16ul); + } + else if (c[i0]=='u') { + CallStr(a, a_len, 0UL, 1, h, 16ul); + aprsstr_Append(s, s_len, h, 16ul); + } + else if (c[i0]=='U') { + CallStr(a, a_len, 0UL, 0, h, 16ul); + aprsstr_Append(s, s_len, h, 16ul); + } + else { + aprsstr_Append(s, s_len, "%", 2ul); + aprsstr_Append(s, s_len, (char *) &c[i0], 1u/1u); + } + m = 0; + } + else if (c[i0]=='%') m = 1; + else aprsstr_Append(s, s_len, (char *) &c[i0], 1u/1u); + ++i0; + } + X2C_PFREE(c); + X2C_PFREE(a); +} /* end Makros() */ + + +static void Login(int32_t * fd, char l2adr[], uint32_t l2adr_len) +{ + struct Execlogin_tEXEC cmdvec; + char argstr[8192]; + char argbuf[8192]; + char * argwords[65]; + X2C_PCOPY((void **)&l2adr,l2adr_len); + /*args:="/bin/login login"; */ + Makros(cmdline, 4096ul, l2adr, l2adr_len, argstr, 8192ul); + taskparms(argstr, 8192ul, argbuf, 8192ul, argwords, 65ul); + /*p:=argwords[0];WrLn;WrInt(CAST(CARDINAL, argwords[0]), 15); + WrInt(CAST(CARDINAL, p), 15);WrLn; */ + /*WrStrLn(p^);p:=argwords[1];WrStrLn(p^);WrStrLn(argbuf); */ + *fd = -1L; + cmdvec.cmdfn = (char *)argwords[0U]; + cmdvec.args = (X2C_pCHAR *) &argwords[1U]; + if (verb) { + osi_Werr("start: ", 8ul); + osi_Werr(cmdline, 4096ul); + osi_Werr("\012", 2ul); + } + *fd = Execlogin_StartLogin(&cmdvec); + /* + IF fd>=0 THEN + ret:=tcgetattr(fd, tio); + tio.c_lflag:=CAST(tcflag_t, CAST(BITSET, tio.c_lflag) + CAST(BITSET, + ISIG)); + ret:=tcsetattr (fd, TCSAFLUSH, tio); + END; + */ + if (*fd>=2L && *fd<=255L) { + if (verb) { + osi_Werr("login fd=", 10ul); + aprsstr_IntToStr(*fd, 1UL, argbuf, 8192ul); + osi_Werr(argbuf, 8192ul); + osi_Werr("\012", 2ul); + } + } + else { + if (verb) osi_Werr("login fd error\012", 16ul); + *fd = -1L; + } + X2C_PFREE(l2adr); +} /* end Login() */ + + +static char GetNum(const char h[], uint32_t h_len, char eot, + uint32_t * p, uint32_t * n) +{ + *n = 0UL; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + return h[*p]==eot; +} /* end GetNum() */ + + +static void Parms(void) +{ + char err; + char hh[1024]; + char h[1024]; + uint32_t l2parcnt; + uint32_t p; + uint32_t k; + uint32_t j; + uint32_t i0; + struct frameio_UDPSOCK * anonym; + err = 0; + sockc = 0UL; + for (i0 = 0UL; i0<=255UL; i0++) { + numpar[i0].port = 0L; + } /* end for */ + l2parcnt = 0UL; + for (;;) { + osi_NextArg(h, 1024ul); + if (h[0U]==0) break; + if (h[0U]=='-' && h[2U]==0) { + if (h[1U]=='C') { + /* -C ax25 destination */ + NextArgs(h, 1024ul); + i0 = 0UL; + j = 0UL; + while (j<63UL && i0=112UL || h[i0]!=' ')); + if (j<=112UL) mycall[j] = 0; + for (i0 = 0UL; i0<=6UL; i0++) { + mycall[i0] = mycall[i0+7UL]; /* first mycall is digi call*/ + } /* end for */ + } + else if (h[1U]=='j') { + /* -j convert cr lf to pipe */ + osi_NextArg(h, 1024ul); + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &convtopipe) || convtopipe>6UL) { + err = 1; + osi_WrStrLn("-j <0..6>", 10ul); + } + } + else if (h[1U]=='m') { + /* -j convert cr lf to pipe */ + osi_NextArg(h, 1024ul); + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &montyp)) { + err = 1; + osi_WrStrLn("-m <0..1>", 10ul); + } + } + else if (h[1U]=='D') { + /* -D discard frame len */ + osi_NextArg(h, 1024ul); + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &j)) { + err = 1; + osi_WrStrLn("-D <0..1500>", 13ul); + } + pppdiscard = (int32_t)j; + } + else if (h[1U]=='r') { + /* -j convert cr lf to pipe */ + osi_NextArg(h, 1024ul); + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &j) || j>4000000UL) { + err = 1; + osi_WrStrLn("-r (max 4000000)", 22ul); + } + else minrecontime = j*1000UL; + keepconnected = 1; + } + else if (h[1U]=='R') { + /* -r min reconn time */ + osi_NextArg(h, 1024ul); + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &j) || j>4000000UL) { + err = 1; + osi_WrStrLn("-R (max 4000000)", 22ul); + } + else { + maxrecontime = j*1000UL; + } + keepconnected = 1; + } + else if (h[1U]=='n') { + /* -R max reconn time */ + osi_NextArg(h, 1024ul); + if (h[0U]=='a') p = 16UL; + else { + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &p) || p>15UL) { + err = 1; + osi_WrStrLn("-n ", 30ul); + } + } + osi_NextArg(h, 1024ul); + switch ((unsigned)h[0U]) { + case 't': /* txwait */ + j = 17UL; + break; + case 'd': /* dwait */ + j = 20UL; + break; + case 'o': /* maxframes */ + j = 23UL; + break; + case 'f': /* t1 */ + j = 24UL; + break; + case 'F': /* t3 */ + j = 25UL; + break; + case 'I': /* ipoll */ + j = 26UL; + break; + case 'n': /* retr */ + j = 27UL; + break; + case 'h': /* halfduplex */ + j = 24UL; + break; + default:; + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &j) || j>255UL) { + err = 1; + osi_WrStrLn("-n ", 30ul); + } + break; + } /* end switch */ + osi_NextArg(h, 1024ul); + i0 = 0UL; + if (!GetNum(h, 1024ul, 0, &i0, &k)) { + err = 1; + osi_WrStrLn("-n ", 30ul); + } + if (!err) { + if (l2parcnt>255UL) Error("parameter table full", 21ul); + numpar[l2parcnt].port = (int32_t)p; + numpar[l2parcnt].parmnum = (int32_t)j; + numpar[l2parcnt].val = (int32_t)k; + ++l2parcnt; + } + } + else if (h[1U]=='U') { + osi_NextArg(h, 1024ul); + if (sockc>14UL) Error("too many ports", 15ul); + { /* with */ + struct frameio_UDPSOCK * anonym = &frameio_udpsocks0[sockc]; + if (aprsstr_GetIp2(h, 1024ul, &anonym->ipnum, &anonym->toport, + &anonym->fromport, &anonym->checkip)<0L) { + Error("-U wrong ip:port:port number", 29ul); + } + anonym->fd = openudp(); + if (anonym->fd<0L || bindudp(anonym->fd, + anonym->fromport)<0L) { + strncpy(h,"-U cannot open udp port ",1024u); + aprsstr_IntToStr((int32_t)anonym->fromport, 0UL, hh, + 1024ul); + aprsstr_Append(h, 1024ul, hh, 1024ul); + Error(h, 1024ul); + } + } + ++sockc; + } + else if (h[1U]=='a') autodet = 1; + else if (h[1U]=='P') { + pppmode = 1; + usedeflat = 1; + } + else if (h[1U]=='d') usedeflat = 1; + else if (h[1U]=='v') { + verb = 1; + } + else if (h[1U]=='V') { + verb = 1; + verb2 = 1; + } + else if (h[1U]=='l') convlfcr = 1UL; + else if (h[1U]=='L') convlfcr = 2UL; + else { + if (h[1U]=='h') { + osic_WrLn(); + osi_WrStrLn(" -a autodetect def\ +late + ppp on first bytes", 75ul); + osi_WrStrLn(" ppp + deflat\ +e:\"!p\",deflate;\"!d\"", 69ul); + osi_WrStrLn(" LF to CR:\"!\ +l\", strip LF:\"!L\"", 66ul); + osi_WrStrLn(" -C slave connect \ +destination -C \"OE0AAA-12 OE5XBL\"", 83ul); + osi_WrStrLn(" if no \"-C\"\ + run as server waiting for connect", 82ul); + osi_WrStrLn(" -c execute comman\ +d on connect -c \"/bin/bash bash %m %u\"", 88ul); + osi_WrStrLn(" %m=mycall %u\ +=usercall %U=same no SSID %%=%", 80ul); + osi_WrStrLn(" if no \"-c\"\ + data path is stdin/stdout", 74ul); + osi_WrStrLn(" -D discard longer\ + ppp frames if pr tx buffer full", 82ul); + osi_WrStrLn(" -d deflate on", + 46ul); + osi_WrStrLn(" -h this", 40ul); + osi_WrStrLn(" -i ... connectable ca\ +lls -i \"OE0AAA OE0AAA-15\"", 75ul); + osi_WrStrLn(" first mycall\ + is digi and used to connect out", 82ul); + osi_WrStrLn(" -j <1..6> 1:del LF, 2:de\ +l LF+CR>LF, 3:CR>LF, 4:del CR", 79ul); + osi_WrStrLn(" 5:del CR+LF>\ +CR, 6:LF>CR in stream from pr", 79ul); + osi_WrStrLn(" -l convert LF to \ +CR in stream to pr", 68ul); + osi_WrStrLn(" -L strip LF in st\ +ream to pr", 60ul); + osi_WrStrLn(" -m <0..2> ax25 Monitor t\ +o stderr (2 with info)", 72ul); + osi_WrStrLn(" -n layer 2 parms,\ + \"-n a\" set on all ports", 74ul); + osi_WrStrLn(" parm t:txwai\ +t d:dwait o:maxfr f:t1 F:t3", 77ul); + osi_WrStrLn(" parm I:ipoll\ + n:retr h:halfdup", 67ul); + osi_WrStrLn(" -P ppp + deflate \ +on", 52ul); + osi_WrStrLn(" -p data to/from t\ +his device/pipe -p /dev/ttyS0", 79ul); + osi_WrStrLn(" -R enable slave \\ +"keep connected\" with max reconnet delay", 89ul); + osi_WrStr(" (max 4000000ms\ +) (", 55ul); + osic_WrINT32(maxrecontime/1000UL, 1UL); + osi_WrStrLn(")", 2ul); + osi_WrStrLn(" -r enable slave \\ +"keep connected\" with min reconnet delay", 89ul); + osi_WrStr(" and doubles de\ +lay each conn try till \"-R\" (", 82ul); + osic_WrINT32(minrecontime/1000UL, 1UL); + osi_WrStrLn(")", 2ul); + osi_WrStrLn(" -U axudp (autodet\ +ect axudp2)", 61ul); + osi_WrStrLn(" repeat -U fo\ +r more ports", 62ul); + osi_WrStrLn(" -v verbous", + 43ul); + osi_WrStrLn(" -V more verbous", + 48ul); + osic_WrLn(); + X2C_ABORT(); + } + if (h[1U]=='-') Error("- - ?", 6ul); + if (h[1U]==0) Error("- ?", 5ul); + err = 1; + } + } + else err = 1; + if (err) break; + } + if (connectto0[0U]) { + /* insert mycall as it is valid after whole cmd line */ + if (mycall[7U]==0) Error("need -i for -C ", 23ul); + X2C_MOVE((char *) &mycall[7U],(char *) &connectto0[7U],7UL); + } +} /* end Parms() */ + + +static void Connectto(void) +{ + pTASK ntask; + struct l2_CONNECT connect; + osic_alloc((char * *) &ntask, sizeof(struct TASK)); + if (ntask==0) return; + memset((char *)ntask,(char)0,sizeof(struct TASK)); + ntask->infd = -1L; + ntask->outfd = -1L; + /* GetAdress(link, ADR(ntask^.l2addr)); */ + memset((char *) &connect,(char)0,sizeof(struct l2_CONNECT)); + connect.port = 1U; + connect.baud = 1U; + connect.cpid = 240U; + connect.l2adr = (l2_pSTRING)connectto0; + connect.l3adr = 0; + connect.typ = l2_cNORMAL; + ntask->link0 = l2_Connect0((char *)ntask, &connect); + ntask->state = 5U; + ntask->next = tasks; + ntask->crlfmode = convlfcr; + tasks = ntask; +} /* end Connectto() */ + +static void killdisc(int32_t); + + +static void killdisc(int32_t signum) +{ + if (verb) osi_Werr("sigint\012", 8ul); + /* IF (tasks<>NIL) & (tasks^.state=2) THEN WrStrLn("disc!"); + Disconnect(tasks^.link, TRUE); */ + /* ELSE HALT(signum) END; */ + if (terminate) X2C_ABORT(); + terminate = 1; +} /* end killdisc() */ + + +static void initcompress(pTASK pt0) +{ + /*IntToStr(SIZE(pt^.pcdeflat^), 1, deb); Werr(deb);Werr("=mem"); */ + osic_alloc((char * *) &pt0->pcdeflat, sizeof(struct DEFLATBUF)); + if (pt0->pcdeflat==0) Error("alloc compres memory", 21ul); + deflate_Initdeflate(&pt0->pcdeflat->deflatcontext); + deflate_Initexpand(&pt0->pcdeflat->expandcontext); + pt0->pcdeflat->outlen = 0L; + pt0->pcdeflat->xoutlen = 0L; + pt0->pcdeflat->inp0 = 0L; + pt0->pcdeflat->xinp = 0L; + pt0->pcdeflat->done = 0; + if (pppmode) pt0->pcdeflat->pppframing = 1; + pt0->pcdeflat->pppstate = 0; + if (verb) osi_Werr("init compression\012", 18ul); +} /* end initcompress() */ + + +static char pppcrc(char b[], uint32_t b_len, int32_t len) +{ + char crc2; + char crc1; + char ok0; + /*ShowHex(b, len); */ + if (len<2L) return 0; + len -= 2L; + crc1 = b[len]; + crc2 = b[len+1L]; + aprsstr_AppCRC(b, b_len, len); + ok0 = crc1==b[len] && crc2==b[len+1L]; + if (!ok0) osi_Werr(" crc-err \012", 11ul); + return ok0; +} /* end pppcrc() */ + + +static void compress(pTASK pt0) +{ + int32_t i0; + struct TASK * anonym; + int32_t tmp; + { /* with */ + struct TASK * anonym = pt0; + if (anonym->pcdeflat->pppframing) { + for (;;) { + if (anonym->pcdeflat->inp0>=anonym->inlen) { + /* out of data */ + anonym->pcdeflat->inp0 = 0L; + anonym->inlen = 0L; + break; + } + /*IF verb2 THEN WrHex(ORD(inbuf[pcdeflat^.inp]), 3) END; */ + if (anonym->pcdeflat->pppstate==0 && anonym->inbuf[anonym->pcdeflat->inp0] + =='~') { + /* hunt mode */ + anonym->pcdeflat->pppstate = '\001'; /* in frame */ + anonym->pcdeflat->ppplen = 0L; + } + else if (anonym->pcdeflat->pppstate=='\001') { + if (anonym->inbuf[anonym->pcdeflat->inp0]=='}') { + anonym->pcdeflat->pppstate = '\002'; + /* escaped char follows */ + } + else { + if (anonym->inbuf[anonym->pcdeflat->inp0]=='~') { + /* frame complete */ + if (anonym->pcdeflat->ppplen>0L) { + if (pppcrc(anonym->pcdeflat->pppbuf, 4096ul, + anonym->pcdeflat->ppplen)) { + /* frame good */ + /*IntToStr(pcdeflat^.ppplen, 7, deb);Werr(deb); + Werr("=c "); */ + if (anonym->pcdeflat->ppplen<=pppdiscard || l2_SendStr(anonym->link0, + 0U, 0)) { + tmp = anonym->pcdeflat->ppplen-1L; + i0 = 0L; + if (i0<=tmp) for (;; i0++) { + deflate_Deflatbyte(&anonym->pcdeflat->deflatcontext, + anonym->pcdeflat->pppbuf[i0], 0, anonym->pcdeflat->outbuf, + 20001ul, &anonym->pcdeflat->outlen); + if (i0==tmp) break; + } /* end for */ + deflate_Deflatbyte(&anonym->pcdeflat->deflatcontext, + 0, '\002', anonym->pcdeflat->outbuf, 20001ul, + &anonym->pcdeflat->outlen); + } + else if (verb) { + osi_Werr("ppp frame discarded\012", 21ul); + } + } + else osi_Werr("ppp frame crc error\012", 21ul); + /*IntToStr(pcdeflat^.outlen, 7, deb);Werr(deb); + Werr("=co "); */ + anonym->pcdeflat->ppplen = 0L; + } + ++anonym->pcdeflat->inp0; + break; + } + anonym->pcdeflat->pppbuf[anonym->pcdeflat->ppplen] + = anonym->inbuf[anonym->pcdeflat->inp0]; + if (anonym->pcdeflat->ppplen<4095L) { + ++anonym->pcdeflat->ppplen; + } + } + } + else if (anonym->pcdeflat->pppstate=='\002') { + /* stuffed byte */ + anonym->pcdeflat->pppbuf[anonym->pcdeflat->ppplen] + = (char)((uint8_t)(uint8_t) + anonym->inbuf[anonym->pcdeflat->inp0]^0x20U); + if (anonym->pcdeflat->ppplen<4095L) { + ++anonym->pcdeflat->ppplen; + } + anonym->pcdeflat->pppstate = '\001'; + } + ++anonym->pcdeflat->inp0; + } + } + else { + while (anonym->pcdeflat->inp0inlen && anonym->pcdeflat->outlen<3601L) + { + deflate_Deflatbyte(&anonym->pcdeflat->deflatcontext, + anonym->inbuf[anonym->pcdeflat->inp0], 0, + anonym->pcdeflat->outbuf, 20001ul, + &anonym->pcdeflat->outlen); + ++anonym->pcdeflat->inp0; + } + if (anonym->pcdeflat->inp0>=anonym->inlen) { + /* inbuffer empty so send compressed block */ + deflate_Deflatbyte(&anonym->pcdeflat->deflatcontext, 0, '\002', + anonym->pcdeflat->outbuf, 20001ul, + &anonym->pcdeflat->outlen); /* flush */ + anonym->pcdeflat->inp0 = 0L; + anonym->inlen = 0L; + } + } + } +/*ShowHex(pcdeflat^.outbuf, pcdeflat^.outlen); WrStrLn(""); */ +} /* end compress() */ + + +static void expand(pTASK pt0) +{ + char done; + char pb[3001]; + int32_t j; + int32_t i0; + struct TASK * anonym; + /*ShowHex(outbuf, outlen); */ + int32_t tmp; + { /* with */ + struct TASK * anonym = pt0; + for (;;) { + /*IF pcdeflat^.xoutlen>=SIZE(pcdeflat^.xoutbuf) + -300 THEN Werr(" outfull ") END; */ + if ((anonym->pcdeflat->xinp>=anonym->outlen || anonym->pcdeflat->xoutlen>=3796L) + || anonym->pcdeflat->xoutlen<0L) break; + /*WrHex(ORD(outbuf[pcdeflat^.xinp]), 3);INC(deb1); */ + deflate_Expandbyte(&anonym->pcdeflat->expandcontext, + anonym->outbuf[anonym->pcdeflat->xinp], + anonym->pcdeflat->xoutbuf, 4096ul, + &anonym->pcdeflat->xoutlen, &done); + /*IF pcdeflat^.xoutlen<0 THEN Werr(" expand error"+NL) END; */ + /*Werr("(");IntToStr(pcdeflat^.xoutlen, 1, deb);Werr(deb);Werr(")"); + */ + ++anonym->pcdeflat->xinp; + if (done && anonym->pcdeflat->pppframing) { + /* rebuild ppp frame */ + /*IntToStr(deb1, 7, deb);Werr(deb);Werr("=xi ");deb1:=0; */ + /*IntToStr(pcdeflat^.xoutlen, 7, deb);Werr(deb);Werr("=x "); */ + /*WrStrLn("done");ShowHex(pcdeflat^.xoutbuf, pcdeflat^.xoutlen); + */ + if (pppcrc(anonym->pcdeflat->xoutbuf, 4096ul, + anonym->pcdeflat->xoutlen)) { + /*WrStrLn("");WrStr("Y:"); + ShowHex(pcdeflat^.xoutbuf, pcdeflat^.xoutlen); WrStrLn(""); + */ + pb[0U] = '~'; + j = 1L; + tmp = anonym->pcdeflat->xoutlen-1L; + i0 = 0L; + if (i0<=tmp) for (;; i0++) { + if ((anonym->pcdeflat->xoutbuf[i0] + =='~' || anonym->pcdeflat->xoutbuf[i0]=='}') || (uint8_t) + anonym->pcdeflat->xoutbuf[i0]<' ') { + /* stuff */ + pb[j] = '}'; + if (j<3000L) ++j; + pb[j] = (char)((uint8_t)(uint8_t) + anonym->pcdeflat->xoutbuf[i0]^0x20U); + } + else pb[j] = anonym->pcdeflat->xoutbuf[i0]; + if (j<3000L) ++j; + if (i0==tmp) break; + } /* end for */ + pb[j] = '~'; + ++j; + i0 = 0L; + while (i0<4095L && i0pcdeflat->xoutbuf[i0] = pb[i0]; + ++i0; + } + anonym->pcdeflat->xoutlen = i0; + anonym->pcdeflat->done = 1; + /*WrStrLn("");WrStr("X:"); + ShowHex(pcdeflat^.xoutbuf, pcdeflat^.xoutlen); WrStrLn(""); + */ + break; + } + anonym->pcdeflat->xoutlen = -1L; /* crc error */ + } + } + if (anonym->pcdeflat->xinp>=anonym->outlen) { + /* outbuffer empty */ + anonym->pcdeflat->xinp = 0L; + anonym->outlen = 0L; + } + } +} /* end expand() */ + + +static void wrpipe(int32_t fd, char b[], uint32_t b_len, + int32_t * blen) +{ + int32_t i0; + int32_t len; + int32_t tmp; + /*WrStrLn("");WrStr("P:"); ShowHex(b, blen); WrStrLn(""); */ + len = write(fd, (char *)b, (uint32_t)*blen); + if (len>*blen) len = *blen; + if (len>0L) { + *blen -= len; + tmp = *blen-1L; + i0 = 0L; + if (i0<=tmp) for (;; i0++) { + b[i0] = b[i0+len]; + if (i0==tmp) break; + } /* end for */ + } +/* IF blen>0 THEN MOVE(ADR(b[len]), ADR(b), blen) END; */ +} /* end wrpipe() */ + + +static void sendjunk(l2_pLINK link0, struct JUNKBUF * junk) +{ + if (junk->len==256L || junk->len>=0L && junk->time0<=0L) { + if (l2_SendStr(link0, (uint16_t)junk->len, (l2_pSTRING)junk->buf)) { + junk->len = 0L; + } + } +} /* end sendjunk() */ + + +static void wrl2(l2_pLINK link0, char b[], uint32_t b_len, + int32_t * blen, struct JUNKBUF * junk) +{ + int32_t j; + int32_t i0; + int32_t len; + /*WrStr("L:"); WrInt(blen, 1); WrStr(" "); */ + if (*blen==0L) return; + if (junk->len<256L) { + len = 0L; + while (junk->len<256L && len<*blen) { + junk->buf[junk->len] = b[len]; + ++junk->len; + ++len; + } + j = len; + i0 = 0L; + while (j<*blen) { + b[i0] = b[j]; + ++j; + ++i0; + } + *blen -= len; + junk->time0 = 4L; + } + sendjunk(link0, junk); +} /* end wrl2() */ + + +static void wrclose(pTASK pt0, int32_t fd, char c[], uint32_t c_len) +{ + char s[100]; + X2C_PCOPY((void **)&c,c_len); + WerrCall(pt0); + aprsstr_IntToStr(fd, 1UL, s, 100ul); + osi_Werr(c, c_len); + osi_Werr(s, 100ul); + osi_Werr("\012", 2ul); + X2C_PFREE(c); +} /* end wrclose() */ + + +static void crlf(char b[], uint32_t b_len, int32_t * len, + uint32_t mode) +{ + int32_t j; + int32_t i0; + if (mode>0UL) { + /* convert LF to pr */ + i0 = 0L; + j = 0L; + while (i0<*len) { + if (b[i0]=='\012') { + if (mode==1UL) { + b[j] = '\015'; + ++j; + } + } + else { + b[j] = b[i0]; + ++j; + } + ++i0; + } + *len = j; + } +} /* end crlf() */ + + +static void crlfp(char b[], uint32_t b_len, int32_t * len, + uint32_t mode) +/*1 del lf, 2 del lf cr>lf, 3 cr>lf, 4 del cr, 5 del cr lf>cr, 6 lf>cr */ +{ + int32_t j; + int32_t i0; + if (mode>0UL) { + /* convert LF to pr */ + i0 = 0L; + j = 0L; + while (i0<*len) { + if (mode==1UL) { + if (b[i0]!='\012') { + b[j] = b[i0]; + ++j; + } + } + else if (mode==2UL) { + if (b[i0]=='\015') { + b[j] = '\012'; + ++j; + } + else if (b[i0]!='\012') { + b[j] = b[i0]; + ++j; + } + } + else if (mode==3UL) { + if (b[i0]=='\015') b[j] = '\012'; + else b[j] = b[i0]; + ++j; + } + else if (mode==4UL) { + if (b[i0]!='\015') { + b[j] = b[i0]; + ++j; + } + } + else if (mode==5UL) { + if (b[i0]=='\012') { + b[j] = '\015'; + ++j; + } + else if (b[i0]!='\015') { + b[j] = b[i0]; + ++j; + } + } + else if (mode==6UL) { + if (b[i0]=='\012') b[j] = '\015'; + else b[j] = b[i0]; + ++j; + } + ++i0; + } + *len = j; + } +} /* end crlfp() */ + + +static void detect(pTASK pt0) +/* startet task first sends command on stdout */ +{ + int32_t j; + int32_t i0; + struct TASK * anonym; + { /* with */ + struct TASK * anonym = pt0; + while (anonym->inlen>0L && anonym->detectdone>0UL) { + i0 = 0L; + if (anonym->detectdone==1UL) { + if (anonym->inbuf[0U]=='!') { + anonym->detectdone = 2UL; + i0 = 1L; + } + else anonym->detectdone = 0UL; + } + else if (anonym->detectdone==2UL) { + if (anonym->inbuf[0U]=='d') { + initcompress(pt0); + i0 = 1L; + if (verb) osi_Werr("task switched deflate on\012", 26ul); + } + else if (anonym->inbuf[0U]=='p') { + initcompress(pt0); + anonym->pcdeflat->pppframing = 1; + i0 = 1L; + if (verb) { + osi_Werr("task switched ppp + deflate on\012", 32ul); + } + } + else if (anonym->inbuf[0U]=='l') { + anonym->crlfmode = 1UL; + i0 = 1L; + if (verb) osi_Werr("task switched LF to CR on\012", 27ul); + } + else if (anonym->inbuf[0U]=='L') { + anonym->crlfmode = 2UL; + i0 = 1L; + if (verb) osi_Werr("task switched delete LF on\012", 28ul); + } + anonym->detectdone = 0UL; + } + else anonym->detectdone = 0UL; + if (i0>0L) { + /* delete command */ + j = 0L; + while (i0inlen) { + anonym->inbuf[j] = anonym->inbuf[i0]; + ++i0; + ++j; + } + anonym->inlen = j; + } + } + } +} /* end detect() */ + + +static void AppendTime(char s[], uint32_t s_len) +{ + char h[31]; + aprsstr_TimeToStr(osic_time()%86400UL, h, 31ul); + aprsstr_Append(s, s_len, " - ", 4ul); + aprsstr_Append(s, s_len, h, 31ul); +} /* end AppendTime() */ + +static uint16_t l2cat_UA = 0x63U; + +static uint16_t l2cat_DM = 0xFU; + +static uint16_t l2cat_SABM = 0x2FU; + +static uint16_t l2cat_DISC = 0x43U; + +static uint16_t l2cat_FRMR = 0x87U; + +static uint16_t l2cat_UI = 0x3U; + +static uint16_t l2cat_RR = 0x1U; + +static uint16_t l2cat_REJ = 0x9U; + +static uint16_t l2cat_RNR = 0x5U; + +#define l2cat_LF0 "\015" + +#define l2cat_LINELEN 78 + +static char l2cat_oneline = 0; + + +static void Nibble(int32_t * p, char rxbuf[2048], uint16_t n) +{ + rxbuf[*p] = (char)((uint32_t)(48U+n)+7UL*(uint32_t)(n>9U)); + ++*p; +} /* end Nibble() */ + + +static void WriteHex(char rxbuf[2048], int32_t * p, char c) +{ + Nibble(p, rxbuf, (uint16_t)((uint32_t)(uint8_t)c/16UL)); + Nibble(p, rxbuf, (uint16_t)((uint32_t)(uint8_t)c&15UL)); +} /* end WriteHex() */ + + +static void ShowCall(int32_t * p, char rxbuf[2048], + struct l2_GETADRESS * getadress, uint16_t cp, + char hbit) +{ + uint32_t i0; + char c; + uint32_t tmp; + tmp = (uint32_t)(cp+5U); + i0 = (uint32_t)cp; + if (i0<=tmp) for (;; i0++) { + c = getadress->adress[i0]; + if (c!=' ') { + if ((uint8_t)c>' ') { + rxbuf[*p] = c; + ++*p; + } + else WriteHex(rxbuf, p, c); + } + if (i0==tmp) break; + } /* end for */ + i0 = (uint32_t)(uint8_t)getadress->adress[cp+6U]&15UL; + if (i0) { + rxbuf[*p] = '-'; + ++*p; + if (i0>9UL) { + rxbuf[*p] = (char)(48UL+i0/10UL); + ++*p; + } + rxbuf[*p] = (char)(48UL+i0%10UL); + ++*p; + } + if (hbit && (0x40U & (uint16_t)(uint32_t)(uint8_t) + getadress->adress[cp+6U])) { + rxbuf[*p] = '*'; + ++*p; + } +} /* end ShowCall() */ + + +static void MonHead(char rxbuf[2048], struct l2_GETADRESS * getadress, + l2_pLINK l, int32_t ilen, const char info[], + uint32_t info_len) +{ + int32_t p; + int32_t i0; + uint32_t com; + uint16_t cmd; + char cr; + char pf; + char PF0[4]; + char s[21]; + /* udp2:ARRAY[0..99] OF CHAR; */ + int32_t tmp; + l2_GetAdress0(l, getadress); + aprsstr_IntToStr((int32_t)getadress->port, 1UL, rxbuf, 2048ul); + aprsstr_Append(rxbuf, 2048ul, ":fm ", 5ul); + p = (int32_t)aprsstr_Length(rxbuf, 2048ul); + ShowCall(&p, rxbuf, getadress, 7U, 0); + rxbuf[p] = ' '; + ++p; + rxbuf[p] = 't'; + ++p; + rxbuf[p] = 'o'; + ++p; + rxbuf[p] = ' '; + ++p; + ShowCall(&p, rxbuf, getadress, 0U, 0); + rxbuf[p] = ' '; + ++p; + i0 = 14L; + while (i0+7L<71L && getadress->adress[i0]) { + if (i0==14L) { + rxbuf[p] = 'v'; + ++p; + rxbuf[p] = 'i'; + ++p; + rxbuf[p] = 'a'; + ++p; + rxbuf[p] = ' '; + ++p; + } + ShowCall(&p, rxbuf, getadress, (uint16_t)i0, 1); + rxbuf[p] = ' '; + ++p; + i0 += 7L; + } + rxbuf[p] = 'c'; + ++p; + rxbuf[p] = 't'; + ++p; + rxbuf[p] = 'l'; + ++p; + rxbuf[p] = ' '; + ++p; + cmd = (uint16_t)getadress->my; + com = (uint32_t)((0x40U & (uint16_t)(uint32_t)(uint8_t) + getadress->adress[6U])!=0)+2UL*(uint32_t) + ((0x40U & (uint16_t)(uint32_t)(uint8_t) + getadress->adress[13U])!=0); + pf = (0x10U & cmd)!=0; + cmd = cmd&~0x10U; + if ((cmd&0xFU)==0x1U) { + strncpy(PF0,"RR ",4u); + PF0[2U] = (char)(48U+(uint16_t)cmd/32U); + } + else if ((cmd&0xFU)==0x5U) { + strncpy(PF0,"RNR ",4u); + PF0[3U] = (char)(48U+(uint16_t)cmd/32U); + } + else if ((cmd&0xFU)==0x9U) { + strncpy(PF0,"REJ ",4u); + PF0[3U] = (char)(48U+(uint16_t)cmd/32U); + } + else if ((cmd&0x1U)==0U) { + strncpy(PF0,"I ",4u); + PF0[2U] = (char)(48U+((uint16_t)cmd/2U&7U)); + PF0[1U] = (char)(48U+(uint16_t)cmd/32U); + } + else if (cmd==0x3U) strncpy(PF0,"UI ",4u); + else if (cmd==0xFU) strncpy(PF0,"DM ",4u); + else if (cmd==0x2FU) strncpy(PF0,"SABM",4u); + else if (cmd==0x43U) strncpy(PF0,"DISC",4u); + else if (cmd==0x63U) strncpy(PF0,"UA ",4u); + else if (cmd==0x87U) strncpy(PF0,"FRMR",4u); + else WriteHex(rxbuf, &p, (char)getadress->my); + for (i0 = 0L; i0<=3L; i0++) { + if (PF0[i0]!=' ') { + rxbuf[p] = PF0[i0]; + ++p; + } + } /* end for */ + strncpy(PF0,"v^-+",4u); + cr = 1; + if (com==0UL || com==3UL) { + rxbuf[p] = 'v'; + ++p; + rxbuf[p] = '1'; + ++p; + } + else { + rxbuf[p] = PF0[(com&1UL)+2UL*(uint32_t)pf]; + ++p; + } + if (getadress->cpid<=255U) { + rxbuf[p] = ' '; + ++p; + rxbuf[p] = 'p'; + ++p; + rxbuf[p] = 'i'; + ++p; + rxbuf[p] = 'd'; + ++p; + rxbuf[p] = ' '; + ++p; + WriteHex(rxbuf, &p, (char)getadress->cpid); + } + if ((0x10U & (uint16_t)(uint32_t)(uint8_t)getadress->adress[13U]) + ==0) { + rxbuf[p] = ' '; + ++p; + rxbuf[p] = 'd'; + ++p; + rxbuf[p] = 'a'; + ++p; + rxbuf[p] = 'm'; + ++p; + rxbuf[p] = 'a'; + ++p; + rxbuf[p] = ' '; + ++p; + } + /* + Getudp2info(l, udp2); + IF udp2[0]<>0C THEN + rxbuf[p]:=" "; + INC(p); + i:=0; + WHILE (p0C) DO rxbuf[p]:=udp2[i]; INC(p); + INC(i) END; + END; + */ + rxbuf[p] = 0; + if (ilen>0L && montyp==1UL) { + aprsstr_IntToStr(ilen, 1UL, s, 21ul); + aprsstr_Append(rxbuf, 2048ul, " ", 2ul); + aprsstr_Append(rxbuf, 2048ul, s, 21ul); + aprsstr_Append(rxbuf, 2048ul, "B", 2ul); + } + AppendTime(rxbuf, 2048ul); + if (ilen>0L && montyp>1UL) { + p = (int32_t)aprsstr_Length(rxbuf, 2048ul); + rxbuf[p] = '\012'; + ++p; + tmp = ilen-1L; + i0 = 0L; + if (i0<=tmp) for (;; i0++) { + if ((uint8_t)info[i0]>=' ' && (uint8_t)info[i0]<'\177') { + rxbuf[p] = info[i0]; + } + else rxbuf[p] = '.'; + ++p; + if (i0==tmp) break; + } /* end for */ + rxbuf[p] = 0; + } + osi_Werr(rxbuf, 2048ul); + osi_Werr("\012", 2ul); +} /* end MonHead() */ + + +static void Monitor(void) +{ + char rxbuf[2048]; + struct l2_GETADRESS getadress; + int32_t ilen; + char ibuf[300]; + if (pmon==0) pmon = l2_GetMon(); + if (pmon) { + ilen = (int32_t)l2_GetStr(pmon, 256U, (l2_pSTRING)ibuf); + MonHead(rxbuf, &getadress, pmon, ilen, ibuf, 300ul); + l2_Disconnect(&pmon, 1); /*release buffer*/ + } +} /* end Monitor() */ + + +static void sleeprecon(void) +{ + char s[21]; + if (!terminate) { + if (verb) { + aprsstr_IntToStr((int32_t)(recontime/1000UL), 1UL, s, 21ul); + osi_Werr(" delay ", 8ul); + osi_Werr(s, 21ul); + osi_Werr("ms before next connect\012", 24ul); + } + usleep(recontime); + } + if (recontime>maxrecontime/2UL) recontime = maxrecontime; + else recontime = recontime*2UL; +} /* end sleeprecon() */ + +static uint32_t i; + +static uint32_t ts; + +static uint32_t timeout; + +static int32_t ret; + +static l2_CALLBACKPROC eventproc; + +static pTASK pt; + +static pTASK pth; + +static int32_t pp0; + +static int32_t pp1; + +static uint16_t sockset; + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + uint32_t tmp; + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + if (sizeof(IOBUF)!=256) X2C_ASSERT(0); + deflate_BEGIN(); + frameio_BEGIN(); + l2_BEGIN(); + osi_BEGIN(); + aprsstr_BEGIN(); + Execlogin_BEGIN(); + memset((char *)frameio_udpsocks0,(char)0, + sizeof(struct frameio_UDPSOCK [15])); + cmdline[0] = 0; + pipename[0] = 0; + connectto0[0] = 0; + memset((char *)mycall,(char)0,113UL); + convlfcr = 0UL; + convtopipe = 0UL; + terminate = 0; + keepconnected = 0; + usedeflat = 0; + verb2 = 0; + verb = 0; + pppmode = 0; + autodet = 0; + pppdiscard = X2C_max_longint; + montyp = 0UL; + minrecontime = 2000000UL; + maxrecontime = 120000000UL; + Parms(); + pmon = 0; + eventproc = Event; + sockset = 0U; + tmp = sockc; + i = 0UL; + if (i<=tmp) for (;; i++) { + sockset |= (1U<0L) { + /* port configured */ + pp0 = numpar[i].port; + pp1 = pp0; + if (pp0>15L) { + /* set parameter to all ports */ + pp0 = 1L; + pp1 = 15L; + } + do { + parms.test = 0; + parms.port = (uint16_t)pp0; + parms.parm = (uint16_t)numpar[i].parmnum; + parms.val = (uint32_t)numpar[i].val; + if (verb2) { + osi_WrStr("set port ", 10ul); + osic_WrINT32((uint32_t)parms.port, 1UL); + osi_WrStr(" parmnum ", 10ul); + osic_WrINT32((uint32_t)parms.parm, 1UL); + osi_WrStr(" to value ", 11ul); + osic_WrINT32(parms.val, 1UL); + osi_WrStrLn("", 1ul); + } + l2_Parm(&parms); + ++pp0; + } while (pp0<=pp1); + } + } /* end for */ + if (connectto0[0U]) { + signal(SIGTERM, killdisc); + signal(SIGINT, killdisc); + signal(SIGPIPE, killdisc); + } + recontime = minrecontime; + tasks = 0; + timesum = 0L; + for (;;) { + if (tasks==0) { + if (terminate) X2C_ABORT(); + if (connectto0[0U]) { + for (;;) { + Connectto(); + if (terminate || tasks) break; + sleeprecon(); + } + } + } + fdclr(); + pt = tasks; + while (pt) { + if (pt->state==1U) { + /* recontime:=minrecontime; */ + if (cmdline[0U]) { + /* start task */ + Login(&pt->infd, pt->l2addr.adress, 72ul); + pt->outfd = pt->infd; + /*WrInt(pt^.fd, 1); WrStrLn(" fd"); */ + if (pt->infd>=0L) { + /*ioctl(pt^.fd, TIOCSCTTY, ADR(iocbuf)); */ + pt->state = 2U; + } + else { + pt->state = 3U; + if (verb) osi_Werr("task start failed\012", 19ul); + } + } + else if (pipename[0U]) { + /* use pipe */ + pt->infd = osi_OpenRW(pipename, 4096ul); + pt->outfd = pt->infd; + if (pt->infd>=0L) pt->state = 2U; + else { + pt->state = 3U; + if (verb) osi_Werr("pipe open error\012", 17ul); + } + } + else { + pt->state = 2U; /* use stdin stdout */ + pt->infd = 0L; + pt->outfd = 1L; + } + if (usedeflat) initcompress(pt); + else pt->pcdeflat = 0; + } + else if (pt->state==2U) { + if ((terminate || (0x2U & pt->events)) || (0x4U & pt->events)) { + pt->state = 3U; + if (verb) { + WerrCall(pt); + osi_Werr(" layer2 disconnect\012", 20ul); + } + if (cmdline[0U]==0 && connectto0[0U]==0) X2C_ABORT(); + } + if ((pt->infd>=0L && pt->inlen==0L) && pt->inignor==0UL) { + fdsetr((uint32_t)pt->infd); + } + if (pt->inignor>0UL) --pt->inignor; + } + else if (pt->state==3U) { + if (verb) { + WerrCall(pt); + osi_Werr(" disconnect\012", 13ul); + } + if (cmdline[0U]) { + if (pt->infd>=0L && pt->infd!=pt->outfd) { + if (verb) wrclose(pt, pt->infd, " close in pipe ", 16ul); + osic_Close(pt->infd); + } + if (pt->outfd>=0L) { + if (verb) wrclose(pt, pt->outfd, " close out pipe ", 17ul); + osic_Close(pt->outfd); + } + pt->infd = -1L; + pt->outfd = -1L; + fdclr(); + } + l2_Disconnect(&pt->link0, 0); + pt->state = 4U; + } + if (pt->state==4U || pt->state==5U) { + if ((terminate || (0x2U & pt->events)) || (0x4U & pt->events)) { + if (verb) { + WerrCall(pt); + osi_Werr(" deallocate link\012", 18ul); + } + l2_Disconnect(&pt->link0, 1); + if (verb) { + WerrCall(pt); + osi_Werr(" disconnect close layer2\012", 26ul); + } + if (tasks==pt) tasks = pt->next; + else { + pth = tasks; + while (pth->next!=pt) pth = pth->next; + pth->next = pt->next; + } + if (pt->pcdeflat) { + osic_free((char * *) &pt->pcdeflat, + sizeof(struct DEFLATBUF)); + } + osic_free((char * *) &pt, sizeof(struct TASK)); + pt = 0; + if (tasks==0) { + if (!keepconnected) terminate = 1; + else if (connectto0[0U]) sleeprecon(); + } + } + else pt = pt->next; + } + else pt = pt->next; + } + ts = 0UL; + timeout = 10000UL; + ret = selectrwt(&ts, &timeout); + timesum += (int32_t)(10000UL-timeout); + if (timesum>=10000L) { + /* IF timeout<=0 THEN */ + l2_Layer2(); + if (montyp>0UL) Monitor(); + timesum -= 10000L; + } + pt = tasks; + while (pt) { + if (pt->state==2U && pt->infd>=0L) { + /*WrInt(pt^.state, 1); WrStrLn(" st"); */ + if (issetr((uint32_t)pt->infd)) { + if (pt->inlen==0L) { + if (!terminate) { + /* read blocks after a SIGINT - why ever */ + pt->inlen = osi_RdBin(pt->infd, (char *)pt->inbuf, + 256u/1u, 256UL); + if (pt->inlen==0L) { + pt->inignor = 20UL; /* read from pipe why ever */ + } + } + } + if (verb2 && pt->inlen>0L) { + Whex("IN ", 4ul, pt->inbuf, 256ul, pt->inlen); + } + } + /*WrStrLn("");WrStr("I:"); ShowHex(pt^.inbuf, pt^.inlen); */ + if (pt->inlen>0L) { + if (~pt->detectdone>0UL) { + detect(pt); /* switch option with first bytes in stdin */ + } + if (pt->pcdeflat) { + /* compress */ + if (pt->pcdeflat->outlen==0L) compress(pt); + wrl2(pt->link0, pt->pcdeflat->outbuf, 20001ul, + &pt->pcdeflat->outlen, &pt->junkbuf); + } + else { + crlf(pt->inbuf, 256ul, &pt->inlen, pt->crlfmode); + wrl2(pt->link0, pt->inbuf, 256ul, &pt->inlen, + &pt->junkbuf); + } + } + else if (pt->inlen<0L) { + if (pt->junkbuf.len>0L) { + /* send rest */ + pt->junkbuf.time0 = 0L; + sendjunk(pt->link0, &pt->junkbuf); + } + else { + pt->state = 3U; + if (verb) osi_Werr("read pipe from task broken\012", 28ul); + } + } + if (pt->state==2U) { + for (;;) { + if (pt->outlen>0L) { + if (verb2) { + Whex("OUT ", 5ul, pt->outbuf, 256ul, pt->outlen); + } + if (pt->pcdeflat) { + /* decompress */ + if (!pt->pcdeflat->done) { + expand(pt); + if (pt->pcdeflat->xoutlen<0L) { + /* expand or crc error */ + pt->state = 3U; + if (verb) { + osi_Werr("deflate or crc error\012", 22ul); + } + break; + } + } + if (!pt->pcdeflat->pppframing || pt->pcdeflat->done) { + if (pt->pcdeflat->xoutlen>0L) { + wrpipe(pt->outfd, pt->pcdeflat->xoutbuf, + 4096ul, &pt->pcdeflat->xoutlen); + } + if (pt->pcdeflat->xoutlen==0L) { + pt->pcdeflat->done = 0; + } + } + } + else { + crlfp(pt->outbuf, 256ul, &pt->outlen, convtopipe); + wrpipe(pt->outfd, pt->outbuf, 256ul, &pt->outlen); + } + } + if (pt->outlen==0L) { + pt->outlen = (int32_t)l2_GetStr(pt->link0, 256U, + (l2_pSTRING)pt->outbuf); + if (pt->outlen<=0L) break; + } + else break; + } + } + } + if (pt->junkbuf.len>0L) { + if (pt->junkbuf.time0>0L) --pt->junkbuf.time0; + else sendjunk(pt->link0, &pt->junkbuf); + } + pt = pt->next; + } + } + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/lib_armv6/X11/X.h b/src/lib_armv6/X11/X.h new file mode 100644 index 0000000..5cf695d --- /dev/null +++ b/src/lib_armv6/X11/X.h @@ -0,0 +1,717 @@ +/* Definitions for the X window system likely to be used by applications */ + +#ifndef X_H +#define X_H + +/*********************************************************** + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#define X_PROTOCOL 11 /* current protocol version */ +#define X_PROTOCOL_REVISION 0 /* current minor version */ + +/* Resources */ + +/* + * _XSERVER64 must ONLY be defined when compiling X server sources on + * systems where unsigned long is not 32 bits, must NOT be used in + * client or library code. + */ +#ifndef _XSERVER64 +# ifndef _XTYPEDEF_XID +# define _XTYPEDEF_XID +typedef unsigned long XID; +# endif +# ifndef _XTYPEDEF_MASK +# define _XTYPEDEF_MASK +typedef unsigned long Mask; +# endif +# ifndef _XTYPEDEF_ATOM +# define _XTYPEDEF_ATOM +typedef unsigned long Atom; /* Also in Xdefs.h */ +# endif +typedef unsigned long VisualID; +typedef unsigned long Time; +#else +# include +# ifndef _XTYPEDEF_XID +# define _XTYPEDEF_XID +typedef CARD32 XID; +# endif +# ifndef _XTYPEDEF_MASK +# define _XTYPEDEF_MASK +typedef CARD32 Mask; +# endif +# ifndef _XTYPEDEF_ATOM +# define _XTYPEDEF_ATOM +typedef CARD32 Atom; +# endif +typedef CARD32 VisualID; +typedef CARD32 Time; +#endif + +typedef XID Window; +typedef XID Drawable; +#ifndef _XTYPEDEF_FONT +# define _XTYPEDEF_FONT +typedef XID Font; +#endif +typedef XID Pixmap; +typedef XID Cursor; +typedef XID Colormap; +typedef XID GContext; +typedef XID KeySym; + +typedef unsigned char KeyCode; + +/***************************************************************** + * RESERVED RESOURCE AND CONSTANT DEFINITIONS + *****************************************************************/ + +#ifndef None +#define None 0L /* universal null resource or null atom */ +#endif + +#define ParentRelative 1L /* background pixmap in CreateWindow + and ChangeWindowAttributes */ + +#define CopyFromParent 0L /* border pixmap in CreateWindow + and ChangeWindowAttributes + special VisualID and special window + class passed to CreateWindow */ + +#define PointerWindow 0L /* destination window in SendEvent */ +#define InputFocus 1L /* destination window in SendEvent */ + +#define PointerRoot 1L /* focus window in SetInputFocus */ + +#define AnyPropertyType 0L /* special Atom, passed to GetProperty */ + +#define AnyKey 0L /* special Key Code, passed to GrabKey */ + +#define AnyButton 0L /* special Button Code, passed to GrabButton */ + +#define AllTemporary 0L /* special Resource ID passed to KillClient */ + +#define CurrentTime 0L /* special Time */ + +#define NoSymbol 0L /* special KeySym */ + +/***************************************************************** + * EVENT DEFINITIONS + *****************************************************************/ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Event names. Used in "type" field in XEvent structures. Not to be +confused with event masks above. They start from 2 because 0 and 1 +are reserved in the protocol for errors and replies. */ + +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 +#define GenericEvent 35 +#define LASTEvent 36 /* must be bigger than any event # */ + + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, + state in various key-, mouse-, and button-related events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* modifier names. Used to build a SetModifierMapping request or + to read a GetModifierMapping request. These correspond to the + masks defined above. */ +#define ShiftMapIndex 0 +#define LockMapIndex 1 +#define ControlMapIndex 2 +#define Mod1MapIndex 3 +#define Mod2MapIndex 4 +#define Mod3MapIndex 5 +#define Mod4MapIndex 6 +#define Mod5MapIndex 7 + + +/* button masks. Used in same manner as Key masks above. Not to be confused + with button names below. */ + +#define Button1Mask (1<<8) +#define Button2Mask (1<<9) +#define Button3Mask (1<<10) +#define Button4Mask (1<<11) +#define Button5Mask (1<<12) + +#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ + + +/* button names. Used as arguments to GrabButton and as detail in ButtonPress + and ButtonRelease events. Not to be confused with button masks above. + Note that 0 is already defined above as "AnyButton". */ + +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define Button4 4 +#define Button5 5 + +/* Notify modes */ + +#define NotifyNormal 0 +#define NotifyGrab 1 +#define NotifyUngrab 2 +#define NotifyWhileGrabbed 3 + +#define NotifyHint 1 /* for MotionNotify events */ + +/* Notify detail */ + +#define NotifyAncestor 0 +#define NotifyVirtual 1 +#define NotifyInferior 2 +#define NotifyNonlinear 3 +#define NotifyNonlinearVirtual 4 +#define NotifyPointer 5 +#define NotifyPointerRoot 6 +#define NotifyDetailNone 7 + +/* Visibility notify */ + +#define VisibilityUnobscured 0 +#define VisibilityPartiallyObscured 1 +#define VisibilityFullyObscured 2 + +/* Circulation request */ + +#define PlaceOnTop 0 +#define PlaceOnBottom 1 + +/* protocol families */ + +#define FamilyInternet 0 /* IPv4 */ +#define FamilyDECnet 1 +#define FamilyChaos 2 +#define FamilyInternet6 6 /* IPv6 */ + +/* authentication families not tied to a specific protocol */ +#define FamilyServerInterpreted 5 + +/* Property notification */ + +#define PropertyNewValue 0 +#define PropertyDelete 1 + +/* Color Map notification */ + +#define ColormapUninstalled 0 +#define ColormapInstalled 1 + +/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + +#define GrabModeSync 0 +#define GrabModeAsync 1 + +/* GrabPointer, GrabKeyboard reply status */ + +#define GrabSuccess 0 +#define AlreadyGrabbed 1 +#define GrabInvalidTime 2 +#define GrabNotViewable 3 +#define GrabFrozen 4 + +/* AllowEvents modes */ + +#define AsyncPointer 0 +#define SyncPointer 1 +#define ReplayPointer 2 +#define AsyncKeyboard 3 +#define SyncKeyboard 4 +#define ReplayKeyboard 5 +#define AsyncBoth 6 +#define SyncBoth 7 + +/* Used in SetInputFocus, GetInputFocus */ + +#define RevertToNone (int)None +#define RevertToPointerRoot (int)PointerRoot +#define RevertToParent 2 + +/***************************************************************** + * ERROR CODES + *****************************************************************/ + +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +/***************************************************************** + * WINDOW DEFINITIONS + *****************************************************************/ + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Bit Gravity */ + +#define ForgetGravity 0 +#define NorthWestGravity 1 +#define NorthGravity 2 +#define NorthEastGravity 3 +#define WestGravity 4 +#define CenterGravity 5 +#define EastGravity 6 +#define SouthWestGravity 7 +#define SouthGravity 8 +#define SouthEastGravity 9 +#define StaticGravity 10 + +/* Window gravity + bit gravity above */ + +#define UnmapGravity 0 + +/* Used in CreateWindow for backing-store hint */ + +#define NotUseful 0 +#define WhenMapped 1 +#define Always 2 + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Used in ChangeSaveSet */ + +#define SetModeInsert 0 +#define SetModeDelete 1 + +/* Used in ChangeCloseDownMode */ + +#define DestroyAll 0 +#define RetainPermanent 1 +#define RetainTemporary 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* Circulation direction */ + +#define RaiseLowest 0 +#define LowerHighest 1 + +/* Property modes */ + +#define PropModeReplace 0 +#define PropModePrepend 1 +#define PropModeAppend 2 + +/***************************************************************** + * GRAPHICS DEFINITIONS + *****************************************************************/ + +/* graphics functions, as in GC.alu */ + +#define GXclear 0x0 /* 0 */ +#define GXand 0x1 /* src AND dst */ +#define GXandReverse 0x2 /* src AND NOT dst */ +#define GXcopy 0x3 /* src */ +#define GXandInverted 0x4 /* NOT src AND dst */ +#define GXnoop 0x5 /* dst */ +#define GXxor 0x6 /* src XOR dst */ +#define GXor 0x7 /* src OR dst */ +#define GXnor 0x8 /* NOT src AND NOT dst */ +#define GXequiv 0x9 /* NOT src XOR dst */ +#define GXinvert 0xa /* NOT dst */ +#define GXorReverse 0xb /* src OR NOT dst */ +#define GXcopyInverted 0xc /* NOT src */ +#define GXorInverted 0xd /* NOT src OR dst */ +#define GXnand 0xe /* NOT src OR NOT dst */ +#define GXset 0xf /* 1 */ + +/* LineStyle */ + +#define LineSolid 0 +#define LineOnOffDash 1 +#define LineDoubleDash 2 + +/* capStyle */ + +#define CapNotLast 0 +#define CapButt 1 +#define CapRound 2 +#define CapProjecting 3 + +/* joinStyle */ + +#define JoinMiter 0 +#define JoinRound 1 +#define JoinBevel 2 + +/* fillStyle */ + +#define FillSolid 0 +#define FillTiled 1 +#define FillStippled 2 +#define FillOpaqueStippled 3 + +/* fillRule */ + +#define EvenOddRule 0 +#define WindingRule 1 + +/* subwindow mode */ + +#define ClipByChildren 0 +#define IncludeInferiors 1 + +/* SetClipRectangles ordering */ + +#define Unsorted 0 +#define YSorted 1 +#define YXSorted 2 +#define YXBanded 3 + +/* CoordinateMode for drawing routines */ + +#define CoordModeOrigin 0 /* relative to the origin */ +#define CoordModePrevious 1 /* relative to previous point */ + +/* Polygon shapes */ + +#define Complex 0 /* paths may intersect */ +#define Nonconvex 1 /* no paths intersect, but not convex */ +#define Convex 2 /* wholly convex */ + +/* Arc modes for PolyFillArc */ + +#define ArcChord 0 /* join endpoints of arc */ +#define ArcPieSlice 1 /* join endpoints to center of arc */ + +/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into + GC.stateChanges */ + +#define GCFunction (1L<<0) +#define GCPlaneMask (1L<<1) +#define GCForeground (1L<<2) +#define GCBackground (1L<<3) +#define GCLineWidth (1L<<4) +#define GCLineStyle (1L<<5) +#define GCCapStyle (1L<<6) +#define GCJoinStyle (1L<<7) +#define GCFillStyle (1L<<8) +#define GCFillRule (1L<<9) +#define GCTile (1L<<10) +#define GCStipple (1L<<11) +#define GCTileStipXOrigin (1L<<12) +#define GCTileStipYOrigin (1L<<13) +#define GCFont (1L<<14) +#define GCSubwindowMode (1L<<15) +#define GCGraphicsExposures (1L<<16) +#define GCClipXOrigin (1L<<17) +#define GCClipYOrigin (1L<<18) +#define GCClipMask (1L<<19) +#define GCDashOffset (1L<<20) +#define GCDashList (1L<<21) +#define GCArcMode (1L<<22) + +#define GCLastBit 22 +/***************************************************************** + * FONTS + *****************************************************************/ + +/* used in QueryFont -- draw direction */ + +#define FontLeftToRight 0 +#define FontRightToLeft 1 + +#define FontChange 255 + +/***************************************************************** + * IMAGING + *****************************************************************/ + +/* ImageFormat -- PutImage, GetImage */ + +#define XYBitmap 0 /* depth 1, XYFormat */ +#define XYPixmap 1 /* depth == drawable depth */ +#define ZPixmap 2 /* depth == drawable depth */ + +/***************************************************************** + * COLOR MAP STUFF + *****************************************************************/ + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/***************************************************************** + * CURSOR STUFF + *****************************************************************/ + +/* QueryBestSize Class */ + +#define CursorShape 0 /* largest size that can be displayed */ +#define TileShape 1 /* size tiled fastest */ +#define StippleShape 2 /* size stippled fastest */ + +/***************************************************************** + * KEYBOARD/POINTER STUFF + *****************************************************************/ + +#define AutoRepeatModeOff 0 +#define AutoRepeatModeOn 1 +#define AutoRepeatModeDefault 2 + +#define LedModeOff 0 +#define LedModeOn 1 + +/* masks for ChangeKeyboardControl */ + +#define KBKeyClickPercent (1L<<0) +#define KBBellPercent (1L<<1) +#define KBBellPitch (1L<<2) +#define KBBellDuration (1L<<3) +#define KBLed (1L<<4) +#define KBLedMode (1L<<5) +#define KBKey (1L<<6) +#define KBAutoRepeatMode (1L<<7) + +#define MappingSuccess 0 +#define MappingBusy 1 +#define MappingFailed 2 + +#define MappingModifier 0 +#define MappingKeyboard 1 +#define MappingPointer 2 + +/***************************************************************** + * SCREEN SAVER STUFF + *****************************************************************/ + +#define DontPreferBlanking 0 +#define PreferBlanking 1 +#define DefaultBlanking 2 + +#define DisableScreenSaver 0 +#define DisableScreenInterval 0 + +#define DontAllowExposures 0 +#define AllowExposures 1 +#define DefaultExposures 2 + +/* for ForceScreenSaver */ + +#define ScreenSaverReset 0 +#define ScreenSaverActive 1 + +/***************************************************************** + * HOSTS AND CONNECTIONS + *****************************************************************/ + +/* for ChangeHosts */ + +#define HostInsert 0 +#define HostDelete 1 + +/* for ChangeAccessControl */ + +#define EnableAccess 1 +#define DisableAccess 0 + +/* Display classes used in opening the connection + * Note that the statically allocated ones are even numbered and the + * dynamically changeable ones are odd numbered */ + +#define StaticGray 0 +#define GrayScale 1 +#define StaticColor 2 +#define PseudoColor 3 +#define TrueColor 4 +#define DirectColor 5 + + +/* Byte order used in imageByteOrder and bitmapBitOrder */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#endif /* X_H */ diff --git a/src/lib_armv6/X11/Xfuncproto.h b/src/lib_armv6/X11/Xfuncproto.h new file mode 100644 index 0000000..acfa5b9 --- /dev/null +++ b/src/lib_armv6/X11/Xfuncproto.h @@ -0,0 +1,184 @@ +/* Xfuncproto.h. Generated from Xfuncproto.h.in by configure. */ +/* + * +Copyright 1989, 1991, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + * + */ + +/* Definitions to make function prototypes manageable */ + +#ifndef _XFUNCPROTO_H_ +#define _XFUNCPROTO_H_ + +#ifndef NeedFunctionPrototypes +#define NeedFunctionPrototypes 1 +#endif /* NeedFunctionPrototypes */ + +#ifndef NeedVarargsPrototypes +#define NeedVarargsPrototypes 1 +#endif /* NeedVarargsPrototypes */ + +#if NeedFunctionPrototypes + +#ifndef NeedNestedPrototypes +#define NeedNestedPrototypes 1 +#endif /* NeedNestedPrototypes */ + +#ifndef _Xconst +#define _Xconst const +#endif /* _Xconst */ + +/* Function prototype configuration (see configure for more info) */ +#ifndef NARROWPROTO +#define NARROWPROTO /**/ +#endif +#ifndef FUNCPROTO +#define FUNCPROTO 15 +#endif + +#ifndef NeedWidePrototypes +#ifdef NARROWPROTO +#define NeedWidePrototypes 0 +#else +#define NeedWidePrototypes 1 /* default to make interropt. easier */ +#endif +#endif /* NeedWidePrototypes */ + +#endif /* NeedFunctionPrototypes */ + +#ifndef _XFUNCPROTOBEGIN +#if defined(__cplusplus) || defined(c_plusplus) /* for C++ V2.0 */ +#define _XFUNCPROTOBEGIN extern "C" { /* do not leave open across includes */ +#define _XFUNCPROTOEND } +#else +#define _XFUNCPROTOBEGIN +#define _XFUNCPROTOEND +#endif +#endif /* _XFUNCPROTOBEGIN */ + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && (__GNUC__ >= 4) +# define _X_SENTINEL(x) __attribute__ ((__sentinel__(x))) +#else +# define _X_SENTINEL(x) +#endif /* GNUC >= 4 */ + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__CYGWIN__) && !defined(__MINGW32__) +# define _X_EXPORT __attribute__((visibility("default"))) +# define _X_HIDDEN __attribute__((visibility("hidden"))) +# define _X_INTERNAL __attribute__((visibility("internal"))) +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +# define _X_EXPORT __global +# define _X_HIDDEN __hidden +# define _X_INTERNAL __hidden +#else /* not gcc >= 4 and not Sun Studio >= 8 */ +# define _X_EXPORT +# define _X_HIDDEN +# define _X_INTERNAL +#endif /* GNUC >= 4 */ + +/* Branch prediction hints for individual conditionals */ +/* requires xproto >= 7.0.9 */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303) +# define _X_LIKELY(x) __builtin_expect(!!(x), 1) +# define _X_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else /* not gcc >= 3.3 */ +# define _X_LIKELY(x) (x) +# define _X_UNLIKELY(x) (x) +#endif + +/* Bulk branch prediction hints via marking error path functions as "cold" */ +/* requires xproto >= 7.0.25 */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403) /* 4.3+ */ +# define _X_COLD __attribute__((__cold__)) +#else +# define _X_COLD /* nothing */ +#endif + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301) +# define _X_DEPRECATED __attribute__((deprecated)) +#else /* not gcc >= 3.1 */ +# define _X_DEPRECATED +#endif + +/* requires xproto >= 7.0.17 */ +#if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)) \ + || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) +# define _X_NORETURN __attribute((noreturn)) +#else +# define _X_NORETURN +#endif /* GNUC */ + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203) +# define _X_ATTRIBUTE_PRINTF(x,y) __attribute__((__format__(__printf__,x,y))) +#else /* not gcc >= 2.3 */ +# define _X_ATTRIBUTE_PRINTF(x,y) +#endif + +/* requires xproto >= 7.0.22 - since this uses either gcc or C99 variable + argument macros, must be only used inside #ifdef _X_NONNULL guards, as + many legacy X clients are compiled in C89 mode still. */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303) +#define _X_NONNULL(args...) __attribute__((nonnull(args))) +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L) /* C99 */ +#define _X_NONNULL(...) /* */ +#endif + +/* requires xproto >= 7.0.22 */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205) +#define _X_UNUSED __attribute__((__unused__)) +#else +#define _X_UNUSED /* */ +#endif + +/* C99 keyword "inline" or equivalent extensions in pre-C99 compilers */ +/* requires xproto >= 7.0.9 + (introduced in 7.0.8 but didn't support all compilers until 7.0.9) */ +#if defined(inline) /* assume autoconf set it correctly */ || \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L)) /* C99 */ || \ + (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)) +# define _X_INLINE inline +#elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* gcc w/C89+extensions */ +# define _X_INLINE __inline__ +#else +# define _X_INLINE +#endif + +/* C99 keyword "restrict" or equivalent extensions in pre-C99 compilers */ +/* requires xproto >= 7.0.21 */ +#ifndef _X_RESTRICT_KYWD +# if defined(restrict) /* assume autoconf set it correctly */ || \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L) /* C99 */ \ + && !defined(__cplusplus)) /* Workaround g++ issue on Solaris */ +# define _X_RESTRICT_KYWD restrict +# elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* gcc w/C89+extensions */ +# define _X_RESTRICT_KYWD __restrict__ +# else +# define _X_RESTRICT_KYWD +# endif +#endif + +#endif /* _XFUNCPROTO_H_ */ diff --git a/src/lib_armv6/X11/Xlib.h b/src/lib_armv6/X11/Xlib.h new file mode 100644 index 0000000..65f253c --- /dev/null +++ b/src/lib_armv6/X11/Xlib.h @@ -0,0 +1,4032 @@ +/* + +Copyright 1985, 1986, 1987, 1991, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ + + +/* + * Xlib.h - Header definition and support file for the C subroutine + * interface library (Xlib) to the X Window System Protocol (V11). + * Structures and symbols starting with "_" are private to the library. + */ +#ifndef _X11_XLIB_H_ +#define _X11_XLIB_H_ + +#define XlibSpecificationRelease 6 + +#include + +#if defined(__SCO__) || defined(__UNIXWARE__) +#include +#endif + +#include + +/* applications should not depend on these two headers being included! */ +#include +#include + +#ifndef X_WCHAR +#include +#else +#ifdef __UNIXOS2__ +#include +#else +/* replace this with #include or typedef appropriate for your system */ +typedef unsigned long wchar_t; +#endif +#endif + +#if defined(ISC) && defined(USE_XMBTOWC) +#define wctomb(a,b) _Xwctomb(a,b) +#define mblen(a,b) _Xmblen(a,b) +#ifndef USE_XWCHAR_STRING +#define mbtowc(a,b,c) _Xmbtowc(a,b,c) +#endif +#endif + +extern int +_Xmblen( +#ifdef ISC + char const *str, + size_t len +#else + char *str, + int len +#endif + ); + +/* API mentioning "UTF8" or "utf8" is an XFree86 extension, introduced in + November 2000. Its presence is indicated through the following macro. */ +#define X_HAVE_UTF8_STRING 1 + +/* The Xlib structs are full of implicit padding to properly align members. + We can't clean that up without breaking ABI, so tell clang not to bother + complaining about it. */ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +typedef char *XPointer; + +#define Bool int +#define Status int +#define True 1 +#define False 0 + +#define QueuedAlready 0 +#define QueuedAfterReading 1 +#define QueuedAfterFlush 2 + +#define ConnectionNumber(dpy) (((_XPrivDisplay)dpy)->fd) +#define RootWindow(dpy, scr) (ScreenOfDisplay(dpy,scr)->root) +#define DefaultScreen(dpy) (((_XPrivDisplay)dpy)->default_screen) +#define DefaultRootWindow(dpy) (ScreenOfDisplay(dpy,DefaultScreen(dpy))->root) +#define DefaultVisual(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_visual) +#define DefaultGC(dpy, scr) (ScreenOfDisplay(dpy,scr)->default_gc) +#define BlackPixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->black_pixel) +#define WhitePixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->white_pixel) +#define AllPlanes ((unsigned long)~0L) +#define QLength(dpy) (((_XPrivDisplay)dpy)->qlen) +#define DisplayWidth(dpy, scr) (ScreenOfDisplay(dpy,scr)->width) +#define DisplayHeight(dpy, scr) (ScreenOfDisplay(dpy,scr)->height) +#define DisplayWidthMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mwidth) +#define DisplayHeightMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mheight) +#define DisplayPlanes(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_depth) +#define DisplayCells(dpy, scr) (DefaultVisual(dpy,scr)->map_entries) +#define ScreenCount(dpy) (((_XPrivDisplay)dpy)->nscreens) +#define ServerVendor(dpy) (((_XPrivDisplay)dpy)->vendor) +#define ProtocolVersion(dpy) (((_XPrivDisplay)dpy)->proto_major_version) +#define ProtocolRevision(dpy) (((_XPrivDisplay)dpy)->proto_minor_version) +#define VendorRelease(dpy) (((_XPrivDisplay)dpy)->release) +#define DisplayString(dpy) (((_XPrivDisplay)dpy)->display_name) +#define DefaultDepth(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_depth) +#define DefaultColormap(dpy, scr)(ScreenOfDisplay(dpy,scr)->cmap) +#define BitmapUnit(dpy) (((_XPrivDisplay)dpy)->bitmap_unit) +#define BitmapBitOrder(dpy) (((_XPrivDisplay)dpy)->bitmap_bit_order) +#define BitmapPad(dpy) (((_XPrivDisplay)dpy)->bitmap_pad) +#define ImageByteOrder(dpy) (((_XPrivDisplay)dpy)->byte_order) +#define NextRequest(dpy) (((_XPrivDisplay)dpy)->request + 1) +#define LastKnownRequestProcessed(dpy) (((_XPrivDisplay)dpy)->last_request_read) + +/* macros for screen oriented applications (toolkit) */ +#define ScreenOfDisplay(dpy, scr)(&((_XPrivDisplay)dpy)->screens[scr]) +#define DefaultScreenOfDisplay(dpy) ScreenOfDisplay(dpy,DefaultScreen(dpy)) +#define DisplayOfScreen(s) ((s)->display) +#define RootWindowOfScreen(s) ((s)->root) +#define BlackPixelOfScreen(s) ((s)->black_pixel) +#define WhitePixelOfScreen(s) ((s)->white_pixel) +#define DefaultColormapOfScreen(s)((s)->cmap) +#define DefaultDepthOfScreen(s) ((s)->root_depth) +#define DefaultGCOfScreen(s) ((s)->default_gc) +#define DefaultVisualOfScreen(s)((s)->root_visual) +#define WidthOfScreen(s) ((s)->width) +#define HeightOfScreen(s) ((s)->height) +#define WidthMMOfScreen(s) ((s)->mwidth) +#define HeightMMOfScreen(s) ((s)->mheight) +#define PlanesOfScreen(s) ((s)->root_depth) +#define CellsOfScreen(s) (DefaultVisualOfScreen((s))->map_entries) +#define MinCmapsOfScreen(s) ((s)->min_maps) +#define MaxCmapsOfScreen(s) ((s)->max_maps) +#define DoesSaveUnders(s) ((s)->save_unders) +#define DoesBackingStore(s) ((s)->backing_store) +#define EventMaskOfScreen(s) ((s)->root_input_mask) + +/* + * Extensions need a way to hang private data on some structures. + */ +typedef struct _XExtData { + int number; /* number returned by XRegisterExtension */ + struct _XExtData *next; /* next item on list of data for structure */ + int (*free_private)( /* called to free private storage */ + struct _XExtData *extension + ); + XPointer private_data; /* data private to this extension. */ +} XExtData; + +/* + * This file contains structures used by the extension mechanism. + */ +typedef struct { /* public to extension, cannot be changed */ + int extension; /* extension number */ + int major_opcode; /* major op-code assigned by server */ + int first_event; /* first event number for the extension */ + int first_error; /* first error number for the extension */ +} XExtCodes; + +/* + * Data structure for retrieving info about pixmap formats. + */ + +typedef struct { + int depth; + int bits_per_pixel; + int scanline_pad; +} XPixmapFormatValues; + + +/* + * Data structure for setting graphics context. + */ +typedef struct { + int function; /* logical operation */ + unsigned long plane_mask;/* plane mask */ + unsigned long foreground;/* foreground pixel */ + unsigned long background;/* background pixel */ + int line_width; /* line width */ + int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ + int cap_style; /* CapNotLast, CapButt, + CapRound, CapProjecting */ + int join_style; /* JoinMiter, JoinRound, JoinBevel */ + int fill_style; /* FillSolid, FillTiled, + FillStippled, FillOpaeueStippled */ + int fill_rule; /* EvenOddRule, WindingRule */ + int arc_mode; /* ArcChord, ArcPieSlice */ + Pixmap tile; /* tile pixmap for tiling operations */ + Pixmap stipple; /* stipple 1 plane pixmap for stipping */ + int ts_x_origin; /* offset for tile or stipple operations */ + int ts_y_origin; + Font font; /* default text font for text operations */ + int subwindow_mode; /* ClipByChildren, IncludeInferiors */ + Bool graphics_exposures;/* boolean, should exposures be generated */ + int clip_x_origin; /* origin for clipping */ + int clip_y_origin; + Pixmap clip_mask; /* bitmap clipping; other calls for rects */ + int dash_offset; /* patterned/dashed line information */ + char dashes; +} XGCValues; + +/* + * Graphics context. The contents of this structure are implementation + * dependent. A GC should be treated as opaque by application code. + */ + +typedef struct _XGC +#ifdef XLIB_ILLEGAL_ACCESS +{ + XExtData *ext_data; /* hook for extension to hang data */ + GContext gid; /* protocol ID for graphics context */ + /* there is more to this structure, but it is private to Xlib */ +} +#endif +*GC; + +/* + * Visual structure; contains information about colormapping possible. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + VisualID visualid; /* visual id of this visual */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ class of screen (monochrome, etc.) */ +#else + int class; /* class of screen (monochrome, etc.) */ +#endif + unsigned long red_mask, green_mask, blue_mask; /* mask values */ + int bits_per_rgb; /* log base 2 of distinct color values */ + int map_entries; /* color map entries */ +} Visual; + +/* + * Depth structure; contains information for each possible depth. + */ +typedef struct { + int depth; /* this depth (Z) of the depth */ + int nvisuals; /* number of Visual types at this depth */ + Visual *visuals; /* list of visuals possible at this depth */ +} Depth; + +/* + * Information about the screen. The contents of this structure are + * implementation dependent. A Screen should be treated as opaque + * by application code. + */ + +struct _XDisplay; /* Forward declare before use for C++ */ + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XDisplay *display;/* back pointer to display structure */ + Window root; /* Root window id. */ + int width, height; /* width and height of screen */ + int mwidth, mheight; /* width and height of in millimeters */ + int ndepths; /* number of depths possible */ + Depth *depths; /* list of allowable depths on the screen */ + int root_depth; /* bits per pixel */ + Visual *root_visual; /* root visual */ + GC default_gc; /* GC for the root root visual */ + Colormap cmap; /* default color map */ + unsigned long white_pixel; + unsigned long black_pixel; /* White and Black pixel values */ + int max_maps, min_maps; /* max and min color maps */ + int backing_store; /* Never, WhenMapped, Always */ + Bool save_unders; + long root_input_mask; /* initial root input mask */ +} Screen; + +/* + * Format structure; describes ZFormat data the screen will understand. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + int depth; /* depth of this image format */ + int bits_per_pixel; /* bits/pixel at this depth */ + int scanline_pad; /* scanline must padded to this multiple */ +} ScreenFormat; + +/* + * Data structure for setting window attributes. + */ +typedef struct { + Pixmap background_pixmap; /* background or None or ParentRelative */ + unsigned long background_pixel; /* background pixel */ + Pixmap border_pixmap; /* border of the window */ + unsigned long border_pixel; /* border pixel value */ + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preseved if possible */ + unsigned long backing_pixel;/* value to use in restoring planes */ + Bool save_under; /* should bits under be saved? (popups) */ + long event_mask; /* set of events that should be saved */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Colormap colormap; /* color map to be associated with window */ + Cursor cursor; /* cursor to be displayed (or None) */ +} XSetWindowAttributes; + +typedef struct { + int x, y; /* location of window */ + int width, height; /* width and height of window */ + int border_width; /* border width of window */ + int depth; /* depth of window */ + Visual *visual; /* the associated visual structure */ + Window root; /* root of screen containing window */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ InputOutput, InputOnly*/ +#else + int class; /* InputOutput, InputOnly*/ +#endif + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preserved if possible */ + unsigned long backing_pixel;/* value to be used when restoring planes */ + Bool save_under; /* boolean, should bits under be saved? */ + Colormap colormap; /* color map to be associated with window */ + Bool map_installed; /* boolean, is color map currently installed*/ + int map_state; /* IsUnmapped, IsUnviewable, IsViewable */ + long all_event_masks; /* set of events all people have interest in*/ + long your_event_mask; /* my event mask */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Screen *screen; /* back pointer to correct screen */ +} XWindowAttributes; + +/* + * Data structure for host setting; getting routines. + * + */ + +typedef struct { + int family; /* for example FamilyInternet */ + int length; /* length of address, in bytes */ + char *address; /* pointer to where to find the bytes */ +} XHostAddress; + +/* + * Data structure for ServerFamilyInterpreted addresses in host routines + */ +typedef struct { + int typelength; /* length of type string, in bytes */ + int valuelength; /* length of value string, in bytes */ + char *type; /* pointer to where to find the type string */ + char *value; /* pointer to where to find the address */ +} XServerInterpretedAddress; + +/* + * Data structure for "image" data, used by image manipulation routines. + */ +typedef struct _XImage { + int width, height; /* size of image */ + int xoffset; /* number of pixels offset in X direction */ + int format; /* XYBitmap, XYPixmap, ZPixmap */ + char *data; /* pointer to image data */ + int byte_order; /* data byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* quant. of scanline 8, 16, 32 */ + int bitmap_bit_order; /* LSBFirst, MSBFirst */ + int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ + int depth; /* depth of image */ + int bytes_per_line; /* accelarator to next line */ + int bits_per_pixel; /* bits per pixel (ZPixmap) */ + unsigned long red_mask; /* bits in z arrangment */ + unsigned long green_mask; + unsigned long blue_mask; + XPointer obdata; /* hook for the object routines to hang on */ + struct funcs { /* image manipulation routines */ + struct _XImage *(*create_image)( + struct _XDisplay* /* display */, + Visual* /* visual */, + unsigned int /* depth */, + int /* format */, + int /* offset */, + char* /* data */, + unsigned int /* width */, + unsigned int /* height */, + int /* bitmap_pad */, + int /* bytes_per_line */); + int (*destroy_image) (struct _XImage *); + unsigned long (*get_pixel) (struct _XImage *, int, int); + int (*put_pixel) (struct _XImage *, int, int, unsigned long); + struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int); + int (*add_pixel) (struct _XImage *, long); + } f; +} XImage; + +/* + * Data structure for XReconfigureWindow + */ +typedef struct { + int x, y; + int width, height; + int border_width; + Window sibling; + int stack_mode; +} XWindowChanges; + +/* + * Data structure used by color operations + */ +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ + char pad; +} XColor; + +/* + * Data structures for graphics operations. On most machines, these are + * congruent with the wire protocol structures, so reformatting the data + * can be avoided on these architectures. + */ +typedef struct { + short x1, y1, x2, y2; +} XSegment; + +typedef struct { + short x, y; +} XPoint; + +typedef struct { + short x, y; + unsigned short width, height; +} XRectangle; + +typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; +} XArc; + + +/* Data structure for XChangeKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + int bell_pitch; + int bell_duration; + int led; + int led_mode; + int key; + int auto_repeat_mode; /* On, Off, Default */ +} XKeyboardControl; + +/* Data structure for XGetKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + unsigned int bell_pitch, bell_duration; + unsigned long led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKeyboardState; + +/* Data structure for XGetMotionEvents. */ + +typedef struct { + Time time; + short x, y; +} XTimeCoord; + +/* Data structure for X{Set,Get}ModifierMapping */ + +typedef struct { + int max_keypermod; /* The server's max # of keys per modifier */ + KeyCode *modifiermap; /* An 8 by max_keypermod array of modifiers */ +} XModifierKeymap; + + +/* + * Display datatype maintaining display specific data. + * The contents of this structure are implementation dependent. + * A Display should be treated as opaque by application code. + */ +#ifndef XLIB_ILLEGAL_ACCESS +typedef struct _XDisplay Display; +#endif + +struct _XPrivate; /* Forward declare before use for C++ */ +struct _XrmHashBucketRec; + +typedef struct +#ifdef XLIB_ILLEGAL_ACCESS +_XDisplay +#endif +{ + XExtData *ext_data; /* hook for extension to hang data */ + struct _XPrivate *private1; + int fd; /* Network socket. */ + int private2; + int proto_major_version;/* major version of server's X protocol */ + int proto_minor_version;/* minor version of servers X protocol */ + char *vendor; /* vendor of the server hardware */ + XID private3; + XID private4; + XID private5; + int private6; + XID (*resource_alloc)( /* allocator function */ + struct _XDisplay* + ); + int byte_order; /* screen byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* padding and data requirements */ + int bitmap_pad; /* padding requirements on bitmaps */ + int bitmap_bit_order; /* LeastSignificant or MostSignificant */ + int nformats; /* number of pixmap formats in list */ + ScreenFormat *pixmap_format; /* pixmap format list */ + int private8; + int release; /* release of the server */ + struct _XPrivate *private9, *private10; + int qlen; /* Length of input event queue */ + unsigned long last_request_read; /* seq number of last event read */ + unsigned long request; /* sequence number of last request. */ + XPointer private11; + XPointer private12; + XPointer private13; + XPointer private14; + unsigned max_request_size; /* maximum number 32 bit words in request*/ + struct _XrmHashBucketRec *db; + int (*private15)( + struct _XDisplay* + ); + char *display_name; /* "host:display" string used on this connect*/ + int default_screen; /* default screen for operations */ + int nscreens; /* number of screens on this server*/ + Screen *screens; /* pointer to list of screens */ + unsigned long motion_buffer; /* size of motion buffer */ + unsigned long private16; + int min_keycode; /* minimum defined keycode */ + int max_keycode; /* maximum defined keycode */ + XPointer private17; + XPointer private18; + int private19; + char *xdefaults; /* contents of defaults from server */ + /* there is more to this structure, but it is private to Xlib */ +} +#ifdef XLIB_ILLEGAL_ACCESS +Display, +#endif +*_XPrivDisplay; + +#undef _XEVENT_ +#ifndef _XEVENT_ +/* + * Definitions of specific events. + */ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ +} XKeyEvent; +typedef XKeyEvent XKeyPressedEvent; +typedef XKeyEvent XKeyReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ +} XButtonEvent; +typedef XButtonEvent XButtonPressedEvent; +typedef XButtonEvent XButtonReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ +} XMotionEvent; +typedef XMotionEvent XPointerMovedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual + */ + Bool same_screen; /* same screen flag */ + Bool focus; /* boolean focus */ + unsigned int state; /* key or button mask */ +} XCrossingEvent; +typedef XCrossingEvent XEnterWindowEvent; +typedef XCrossingEvent XLeaveWindowEvent; + +typedef struct { + int type; /* FocusIn or FocusOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int mode; /* NotifyNormal, NotifyWhileGrabbed, + NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ +} XFocusChangeEvent; +typedef XFocusChangeEvent XFocusInEvent; +typedef XFocusChangeEvent XFocusOutEvent; + +/* generated on EnterWindow and FocusIn when KeyMapState selected */ +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + char key_vector[32]; +} XKeymapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ +} XExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XGraphicsExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XNoExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int state; /* Visibility state */ +} XVisibilityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; /* parent of the window */ + Window window; /* window id of window created */ + int x, y; /* window location */ + int width, height; /* size of window */ + int border_width; /* border width */ + Bool override_redirect; /* creation should be overridden */ +} XCreateWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; +} XDestroyWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool from_configure; +} XUnmapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool override_redirect; /* boolean, is override set... */ +} XMapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; +} XMapRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Window parent; + int x, y; + Bool override_redirect; +} XReparentEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + Bool override_redirect; +} XConfigureEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; +} XGravityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int width, height; +} XResizeRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + int detail; /* Above, Below, TopIf, BottomIf, Opposite */ + unsigned long value_mask; +} XConfigureRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom atom; + Time time; + int state; /* NewValue, Deleted */ +} XPropertyEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom selection; + Time time; +} XSelectionClearEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window owner; + Window requestor; + Atom selection; + Atom target; + Atom property; + Time time; +} XSelectionRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window requestor; + Atom selection; + Atom target; + Atom property; /* ATOM or None */ + Time time; +} XSelectionEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Colormap colormap; /* COLORMAP or None */ +#if defined(__cplusplus) || defined(c_plusplus) + Bool c_new; /* C++ */ +#else + Bool new; +#endif + int state; /* ColormapInstalled, ColormapUninstalled */ +} XColormapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom message_type; + int format; + union { + char b[20]; + short s[10]; + long l[5]; + } data; +} XClientMessageEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode; /* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XMappingEvent; + +typedef struct { + int type; + Display *display; /* Display the event was read from */ + XID resourceid; /* resource id */ + unsigned long serial; /* serial number of failed request */ + unsigned char error_code; /* error code of failed request */ + unsigned char request_code; /* Major op-code of failed request */ + unsigned char minor_code; /* Minor op-code of failed request */ +} XErrorEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display;/* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ +} XAnyEvent; + + +/*************************************************************** + * + * GenericEvent. This event is the standard event for all newer extensions. + */ + +typedef struct + { + int type; /* of event. Always GenericEvent */ + unsigned long serial; /* # of last request processed */ + Bool send_event; /* true if from SendEvent request */ + Display *display; /* Display the event was read from */ + int extension; /* major opcode of extension that caused the event */ + int evtype; /* actual event type. */ + } XGenericEvent; + +typedef struct { + int type; /* of event. Always GenericEvent */ + unsigned long serial; /* # of last request processed */ + Bool send_event; /* true if from SendEvent request */ + Display *display; /* Display the event was read from */ + int extension; /* major opcode of extension that caused the event */ + int evtype; /* actual event type. */ + unsigned int cookie; + void *data; +} XGenericEventCookie; + +/* + * this union is defined so Xlib can always use the same sized + * event structure internally, to avoid memory fragmentation. + */ +typedef union _XEvent { + int type; /* must not be changed; first element */ + XAnyEvent xany; + XKeyEvent xkey; + XButtonEvent xbutton; + XMotionEvent xmotion; + XCrossingEvent xcrossing; + XFocusChangeEvent xfocus; + XExposeEvent xexpose; + XGraphicsExposeEvent xgraphicsexpose; + XNoExposeEvent xnoexpose; + XVisibilityEvent xvisibility; + XCreateWindowEvent xcreatewindow; + XDestroyWindowEvent xdestroywindow; + XUnmapEvent xunmap; + XMapEvent xmap; + XMapRequestEvent xmaprequest; + XReparentEvent xreparent; + XConfigureEvent xconfigure; + XGravityEvent xgravity; + XResizeRequestEvent xresizerequest; + XConfigureRequestEvent xconfigurerequest; + XCirculateEvent xcirculate; + XCirculateRequestEvent xcirculaterequest; + XPropertyEvent xproperty; + XSelectionClearEvent xselectionclear; + XSelectionRequestEvent xselectionrequest; + XSelectionEvent xselection; + XColormapEvent xcolormap; + XClientMessageEvent xclient; + XMappingEvent xmapping; + XErrorEvent xerror; + XKeymapEvent xkeymap; + XGenericEvent xgeneric; + XGenericEventCookie xcookie; + long pad[24]; +} XEvent; +#endif + +#define XAllocID(dpy) ((*((_XPrivDisplay)dpy)->resource_alloc)((dpy))) + +/* + * per character font metric information. + */ +typedef struct { + short lbearing; /* origin to left edge of raster */ + short rbearing; /* origin to right edge of raster */ + short width; /* advance to next char's origin */ + short ascent; /* baseline to top edge of raster */ + short descent; /* baseline to bottom edge of raster */ + unsigned short attributes; /* per char flags (not predefined) */ +} XCharStruct; + +/* + * To allow arbitrary information with fonts, there are additional properties + * returned. + */ +typedef struct { + Atom name; + unsigned long card32; +} XFontProp; + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + Font fid; /* Font id for this font */ + unsigned direction; /* hint about direction the font is painted */ + unsigned min_char_or_byte2;/* first character */ + unsigned max_char_or_byte2;/* last character */ + unsigned min_byte1; /* first row that exists */ + unsigned max_byte1; /* last row that exists */ + Bool all_chars_exist;/* flag if all characters have non-zero size*/ + unsigned default_char; /* char to print for undefined character */ + int n_properties; /* how many properties there are */ + XFontProp *properties; /* pointer to array of additional properties*/ + XCharStruct min_bounds; /* minimum bounds over all existing char*/ + XCharStruct max_bounds; /* maximum bounds over all existing char*/ + XCharStruct *per_char; /* first_char to last_char information */ + int ascent; /* log. extent above baseline for spacing */ + int descent; /* log. descent below baseline for spacing */ +} XFontStruct; + +/* + * PolyText routines take these as arguments. + */ +typedef struct { + char *chars; /* pointer to string */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem; + +typedef struct { /* normal 16 bit characters are two bytes */ + unsigned char byte1; + unsigned char byte2; +} XChar2b; + +typedef struct { + XChar2b *chars; /* two byte characters */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem16; + + +typedef union { Display *display; + GC gc; + Visual *visual; + Screen *screen; + ScreenFormat *pixmap_format; + XFontStruct *font; } XEDataObject; + +typedef struct { + XRectangle max_ink_extent; + XRectangle max_logical_extent; +} XFontSetExtents; + +/* unused: +typedef void (*XOMProc)(); + */ + +typedef struct _XOM *XOM; +typedef struct _XOC *XOC, *XFontSet; + +typedef struct { + char *chars; + int nchars; + int delta; + XFontSet font_set; +} XmbTextItem; + +typedef struct { + wchar_t *chars; + int nchars; + int delta; + XFontSet font_set; +} XwcTextItem; + +#define XNRequiredCharSet "requiredCharSet" +#define XNQueryOrientation "queryOrientation" +#define XNBaseFontName "baseFontName" +#define XNOMAutomatic "omAutomatic" +#define XNMissingCharSet "missingCharSet" +#define XNDefaultString "defaultString" +#define XNOrientation "orientation" +#define XNDirectionalDependentDrawing "directionalDependentDrawing" +#define XNContextualDrawing "contextualDrawing" +#define XNFontInfo "fontInfo" + +typedef struct { + int charset_count; + char **charset_list; +} XOMCharSetList; + +typedef enum { + XOMOrientation_LTR_TTB, + XOMOrientation_RTL_TTB, + XOMOrientation_TTB_LTR, + XOMOrientation_TTB_RTL, + XOMOrientation_Context +} XOrientation; + +typedef struct { + int num_orientation; + XOrientation *orientation; /* Input Text description */ +} XOMOrientation; + +typedef struct { + int num_font; + XFontStruct **font_struct_list; + char **font_name_list; +} XOMFontInfo; + +typedef struct _XIM *XIM; +typedef struct _XIC *XIC; + +typedef void (*XIMProc)( + XIM, + XPointer, + XPointer +); + +typedef Bool (*XICProc)( + XIC, + XPointer, + XPointer +); + +typedef void (*XIDProc)( + Display*, + XPointer, + XPointer +); + +typedef unsigned long XIMStyle; + +typedef struct { + unsigned short count_styles; + XIMStyle *supported_styles; +} XIMStyles; + +#define XIMPreeditArea 0x0001L +#define XIMPreeditCallbacks 0x0002L +#define XIMPreeditPosition 0x0004L +#define XIMPreeditNothing 0x0008L +#define XIMPreeditNone 0x0010L +#define XIMStatusArea 0x0100L +#define XIMStatusCallbacks 0x0200L +#define XIMStatusNothing 0x0400L +#define XIMStatusNone 0x0800L + +#define XNVaNestedList "XNVaNestedList" +#define XNQueryInputStyle "queryInputStyle" +#define XNClientWindow "clientWindow" +#define XNInputStyle "inputStyle" +#define XNFocusWindow "focusWindow" +#define XNResourceName "resourceName" +#define XNResourceClass "resourceClass" +#define XNGeometryCallback "geometryCallback" +#define XNDestroyCallback "destroyCallback" +#define XNFilterEvents "filterEvents" +#define XNPreeditStartCallback "preeditStartCallback" +#define XNPreeditDoneCallback "preeditDoneCallback" +#define XNPreeditDrawCallback "preeditDrawCallback" +#define XNPreeditCaretCallback "preeditCaretCallback" +#define XNPreeditStateNotifyCallback "preeditStateNotifyCallback" +#define XNPreeditAttributes "preeditAttributes" +#define XNStatusStartCallback "statusStartCallback" +#define XNStatusDoneCallback "statusDoneCallback" +#define XNStatusDrawCallback "statusDrawCallback" +#define XNStatusAttributes "statusAttributes" +#define XNArea "area" +#define XNAreaNeeded "areaNeeded" +#define XNSpotLocation "spotLocation" +#define XNColormap "colorMap" +#define XNStdColormap "stdColorMap" +#define XNForeground "foreground" +#define XNBackground "background" +#define XNBackgroundPixmap "backgroundPixmap" +#define XNFontSet "fontSet" +#define XNLineSpace "lineSpace" +#define XNCursor "cursor" + +#define XNQueryIMValuesList "queryIMValuesList" +#define XNQueryICValuesList "queryICValuesList" +#define XNVisiblePosition "visiblePosition" +#define XNR6PreeditCallback "r6PreeditCallback" +#define XNStringConversionCallback "stringConversionCallback" +#define XNStringConversion "stringConversion" +#define XNResetState "resetState" +#define XNHotKey "hotKey" +#define XNHotKeyState "hotKeyState" +#define XNPreeditState "preeditState" +#define XNSeparatorofNestedList "separatorofNestedList" + +#define XBufferOverflow -1 +#define XLookupNone 1 +#define XLookupChars 2 +#define XLookupKeySym 3 +#define XLookupBoth 4 + +typedef void *XVaNestedList; + +typedef struct { + XPointer client_data; + XIMProc callback; +} XIMCallback; + +typedef struct { + XPointer client_data; + XICProc callback; +} XICCallback; + +typedef unsigned long XIMFeedback; + +#define XIMReverse 1L +#define XIMUnderline (1L<<1) +#define XIMHighlight (1L<<2) +#define XIMPrimary (1L<<5) +#define XIMSecondary (1L<<6) +#define XIMTertiary (1L<<7) +#define XIMVisibleToForward (1L<<8) +#define XIMVisibleToBackword (1L<<9) +#define XIMVisibleToCenter (1L<<10) + +typedef struct _XIMText { + unsigned short length; + XIMFeedback *feedback; + Bool encoding_is_wchar; + union { + char *multi_byte; + wchar_t *wide_char; + } string; +} XIMText; + +typedef unsigned long XIMPreeditState; + +#define XIMPreeditUnKnown 0L +#define XIMPreeditEnable 1L +#define XIMPreeditDisable (1L<<1) + +typedef struct _XIMPreeditStateNotifyCallbackStruct { + XIMPreeditState state; +} XIMPreeditStateNotifyCallbackStruct; + +typedef unsigned long XIMResetState; + +#define XIMInitialState 1L +#define XIMPreserveState (1L<<1) + +typedef unsigned long XIMStringConversionFeedback; + +#define XIMStringConversionLeftEdge (0x00000001) +#define XIMStringConversionRightEdge (0x00000002) +#define XIMStringConversionTopEdge (0x00000004) +#define XIMStringConversionBottomEdge (0x00000008) +#define XIMStringConversionConcealed (0x00000010) +#define XIMStringConversionWrapped (0x00000020) + +typedef struct _XIMStringConversionText { + unsigned short length; + XIMStringConversionFeedback *feedback; + Bool encoding_is_wchar; + union { + char *mbs; + wchar_t *wcs; + } string; +} XIMStringConversionText; + +typedef unsigned short XIMStringConversionPosition; + +typedef unsigned short XIMStringConversionType; + +#define XIMStringConversionBuffer (0x0001) +#define XIMStringConversionLine (0x0002) +#define XIMStringConversionWord (0x0003) +#define XIMStringConversionChar (0x0004) + +typedef unsigned short XIMStringConversionOperation; + +#define XIMStringConversionSubstitution (0x0001) +#define XIMStringConversionRetrieval (0x0002) + +typedef enum { + XIMForwardChar, XIMBackwardChar, + XIMForwardWord, XIMBackwardWord, + XIMCaretUp, XIMCaretDown, + XIMNextLine, XIMPreviousLine, + XIMLineStart, XIMLineEnd, + XIMAbsolutePosition, + XIMDontChange +} XIMCaretDirection; + +typedef struct _XIMStringConversionCallbackStruct { + XIMStringConversionPosition position; + XIMCaretDirection direction; + XIMStringConversionOperation operation; + unsigned short factor; + XIMStringConversionText *text; +} XIMStringConversionCallbackStruct; + +typedef struct _XIMPreeditDrawCallbackStruct { + int caret; /* Cursor offset within pre-edit string */ + int chg_first; /* Starting change position */ + int chg_length; /* Length of the change in character count */ + XIMText *text; +} XIMPreeditDrawCallbackStruct; + +typedef enum { + XIMIsInvisible, /* Disable caret feedback */ + XIMIsPrimary, /* UI defined caret feedback */ + XIMIsSecondary /* UI defined caret feedback */ +} XIMCaretStyle; + +typedef struct _XIMPreeditCaretCallbackStruct { + int position; /* Caret offset within pre-edit string */ + XIMCaretDirection direction; /* Caret moves direction */ + XIMCaretStyle style; /* Feedback of the caret */ +} XIMPreeditCaretCallbackStruct; + +typedef enum { + XIMTextType, + XIMBitmapType +} XIMStatusDataType; + +typedef struct _XIMStatusDrawCallbackStruct { + XIMStatusDataType type; + union { + XIMText *text; + Pixmap bitmap; + } data; +} XIMStatusDrawCallbackStruct; + +typedef struct _XIMHotKeyTrigger { + KeySym keysym; + int modifier; + int modifier_mask; +} XIMHotKeyTrigger; + +typedef struct _XIMHotKeyTriggers { + int num_hot_key; + XIMHotKeyTrigger *key; +} XIMHotKeyTriggers; + +typedef unsigned long XIMHotKeyState; + +#define XIMHotKeyStateON (0x0001L) +#define XIMHotKeyStateOFF (0x0002L) + +typedef struct { + unsigned short count_values; + char **supported_values; +} XIMValuesList; + +_XFUNCPROTOBEGIN + +#if defined(WIN32) && !defined(_XLIBINT_) +#define _Xdebug (*_Xdebug_p) +#endif + +extern int _Xdebug; + +extern XFontStruct *XLoadQueryFont( + Display* /* display */, + _Xconst char* /* name */ +); + +extern XFontStruct *XQueryFont( + Display* /* display */, + XID /* font_ID */ +); + + +extern XTimeCoord *XGetMotionEvents( + Display* /* display */, + Window /* w */, + Time /* start */, + Time /* stop */, + int* /* nevents_return */ +); + +extern XModifierKeymap *XDeleteModifiermapEntry( + XModifierKeymap* /* modmap */, +#if NeedWidePrototypes + unsigned int /* keycode_entry */, +#else + KeyCode /* keycode_entry */, +#endif + int /* modifier */ +); + +extern XModifierKeymap *XGetModifierMapping( + Display* /* display */ +); + +extern XModifierKeymap *XInsertModifiermapEntry( + XModifierKeymap* /* modmap */, +#if NeedWidePrototypes + unsigned int /* keycode_entry */, +#else + KeyCode /* keycode_entry */, +#endif + int /* modifier */ +); + +extern XModifierKeymap *XNewModifiermap( + int /* max_keys_per_mod */ +); + +extern XImage *XCreateImage( + Display* /* display */, + Visual* /* visual */, + unsigned int /* depth */, + int /* format */, + int /* offset */, + char* /* data */, + unsigned int /* width */, + unsigned int /* height */, + int /* bitmap_pad */, + int /* bytes_per_line */ +); +extern Status XInitImage( + XImage* /* image */ +); +extern XImage *XGetImage( + Display* /* display */, + Drawable /* d */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* plane_mask */, + int /* format */ +); +extern XImage *XGetSubImage( + Display* /* display */, + Drawable /* d */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* plane_mask */, + int /* format */, + XImage* /* dest_image */, + int /* dest_x */, + int /* dest_y */ +); + +/* + * X function declarations. + */ +extern Display *XOpenDisplay( + _Xconst char* /* display_name */ +); + +extern void XrmInitialize( + void +); + +extern char *XFetchBytes( + Display* /* display */, + int* /* nbytes_return */ +); +extern char *XFetchBuffer( + Display* /* display */, + int* /* nbytes_return */, + int /* buffer */ +); +extern char *XGetAtomName( + Display* /* display */, + Atom /* atom */ +); +extern Status XGetAtomNames( + Display* /* dpy */, + Atom* /* atoms */, + int /* count */, + char** /* names_return */ +); +extern char *XGetDefault( + Display* /* display */, + _Xconst char* /* program */, + _Xconst char* /* option */ +); +extern char *XDisplayName( + _Xconst char* /* string */ +); +extern char *XKeysymToString( + KeySym /* keysym */ +); + +extern int (*XSynchronize( + Display* /* display */, + Bool /* onoff */ +))( + Display* /* display */ +); +extern int (*XSetAfterFunction( + Display* /* display */, + int (*) ( + Display* /* display */ + ) /* procedure */ +))( + Display* /* display */ +); +extern Atom XInternAtom( + Display* /* display */, + _Xconst char* /* atom_name */, + Bool /* only_if_exists */ +); +extern Status XInternAtoms( + Display* /* dpy */, + char** /* names */, + int /* count */, + Bool /* onlyIfExists */, + Atom* /* atoms_return */ +); +extern Colormap XCopyColormapAndFree( + Display* /* display */, + Colormap /* colormap */ +); +extern Colormap XCreateColormap( + Display* /* display */, + Window /* w */, + Visual* /* visual */, + int /* alloc */ +); +extern Cursor XCreatePixmapCursor( + Display* /* display */, + Pixmap /* source */, + Pixmap /* mask */, + XColor* /* foreground_color */, + XColor* /* background_color */, + unsigned int /* x */, + unsigned int /* y */ +); +extern Cursor XCreateGlyphCursor( + Display* /* display */, + Font /* source_font */, + Font /* mask_font */, + unsigned int /* source_char */, + unsigned int /* mask_char */, + XColor _Xconst * /* foreground_color */, + XColor _Xconst * /* background_color */ +); +extern Cursor XCreateFontCursor( + Display* /* display */, + unsigned int /* shape */ +); +extern Font XLoadFont( + Display* /* display */, + _Xconst char* /* name */ +); +extern GC XCreateGC( + Display* /* display */, + Drawable /* d */, + unsigned long /* valuemask */, + XGCValues* /* values */ +); +extern GContext XGContextFromGC( + GC /* gc */ +); +extern void XFlushGC( + Display* /* display */, + GC /* gc */ +); +extern Pixmap XCreatePixmap( + Display* /* display */, + Drawable /* d */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* depth */ +); +extern Pixmap XCreateBitmapFromData( + Display* /* display */, + Drawable /* d */, + _Xconst char* /* data */, + unsigned int /* width */, + unsigned int /* height */ +); +extern Pixmap XCreatePixmapFromBitmapData( + Display* /* display */, + Drawable /* d */, + char* /* data */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* fg */, + unsigned long /* bg */, + unsigned int /* depth */ +); +extern Window XCreateSimpleWindow( + Display* /* display */, + Window /* parent */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* border_width */, + unsigned long /* border */, + unsigned long /* background */ +); +extern Window XGetSelectionOwner( + Display* /* display */, + Atom /* selection */ +); +extern Window XCreateWindow( + Display* /* display */, + Window /* parent */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* border_width */, + int /* depth */, + unsigned int /* class */, + Visual* /* visual */, + unsigned long /* valuemask */, + XSetWindowAttributes* /* attributes */ +); +extern Colormap *XListInstalledColormaps( + Display* /* display */, + Window /* w */, + int* /* num_return */ +); +extern char **XListFonts( + Display* /* display */, + _Xconst char* /* pattern */, + int /* maxnames */, + int* /* actual_count_return */ +); +extern char **XListFontsWithInfo( + Display* /* display */, + _Xconst char* /* pattern */, + int /* maxnames */, + int* /* count_return */, + XFontStruct** /* info_return */ +); +extern char **XGetFontPath( + Display* /* display */, + int* /* npaths_return */ +); +extern char **XListExtensions( + Display* /* display */, + int* /* nextensions_return */ +); +extern Atom *XListProperties( + Display* /* display */, + Window /* w */, + int* /* num_prop_return */ +); +extern XHostAddress *XListHosts( + Display* /* display */, + int* /* nhosts_return */, + Bool* /* state_return */ +); +_X_DEPRECATED +extern KeySym XKeycodeToKeysym( + Display* /* display */, +#if NeedWidePrototypes + unsigned int /* keycode */, +#else + KeyCode /* keycode */, +#endif + int /* index */ +); +extern KeySym XLookupKeysym( + XKeyEvent* /* key_event */, + int /* index */ +); +extern KeySym *XGetKeyboardMapping( + Display* /* display */, +#if NeedWidePrototypes + unsigned int /* first_keycode */, +#else + KeyCode /* first_keycode */, +#endif + int /* keycode_count */, + int* /* keysyms_per_keycode_return */ +); +extern KeySym XStringToKeysym( + _Xconst char* /* string */ +); +extern long XMaxRequestSize( + Display* /* display */ +); +extern long XExtendedMaxRequestSize( + Display* /* display */ +); +extern char *XResourceManagerString( + Display* /* display */ +); +extern char *XScreenResourceString( + Screen* /* screen */ +); +extern unsigned long XDisplayMotionBufferSize( + Display* /* display */ +); +extern VisualID XVisualIDFromVisual( + Visual* /* visual */ +); + +/* multithread routines */ + +extern Status XInitThreads( + void +); + +extern void XLockDisplay( + Display* /* display */ +); + +extern void XUnlockDisplay( + Display* /* display */ +); + +/* routines for dealing with extensions */ + +extern XExtCodes *XInitExtension( + Display* /* display */, + _Xconst char* /* name */ +); + +extern XExtCodes *XAddExtension( + Display* /* display */ +); +extern XExtData *XFindOnExtensionList( + XExtData** /* structure */, + int /* number */ +); +extern XExtData **XEHeadOfExtensionList( + XEDataObject /* object */ +); + +/* these are routines for which there are also macros */ +extern Window XRootWindow( + Display* /* display */, + int /* screen_number */ +); +extern Window XDefaultRootWindow( + Display* /* display */ +); +extern Window XRootWindowOfScreen( + Screen* /* screen */ +); +extern Visual *XDefaultVisual( + Display* /* display */, + int /* screen_number */ +); +extern Visual *XDefaultVisualOfScreen( + Screen* /* screen */ +); +extern GC XDefaultGC( + Display* /* display */, + int /* screen_number */ +); +extern GC XDefaultGCOfScreen( + Screen* /* screen */ +); +extern unsigned long XBlackPixel( + Display* /* display */, + int /* screen_number */ +); +extern unsigned long XWhitePixel( + Display* /* display */, + int /* screen_number */ +); +extern unsigned long XAllPlanes( + void +); +extern unsigned long XBlackPixelOfScreen( + Screen* /* screen */ +); +extern unsigned long XWhitePixelOfScreen( + Screen* /* screen */ +); +extern unsigned long XNextRequest( + Display* /* display */ +); +extern unsigned long XLastKnownRequestProcessed( + Display* /* display */ +); +extern char *XServerVendor( + Display* /* display */ +); +extern char *XDisplayString( + Display* /* display */ +); +extern Colormap XDefaultColormap( + Display* /* display */, + int /* screen_number */ +); +extern Colormap XDefaultColormapOfScreen( + Screen* /* screen */ +); +extern Display *XDisplayOfScreen( + Screen* /* screen */ +); +extern Screen *XScreenOfDisplay( + Display* /* display */, + int /* screen_number */ +); +extern Screen *XDefaultScreenOfDisplay( + Display* /* display */ +); +extern long XEventMaskOfScreen( + Screen* /* screen */ +); + +extern int XScreenNumberOfScreen( + Screen* /* screen */ +); + +typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ + Display* /* display */, + XErrorEvent* /* error_event */ +); + +extern XErrorHandler XSetErrorHandler ( + XErrorHandler /* handler */ +); + + +typedef int (*XIOErrorHandler) ( /* WARNING, this type not in Xlib spec */ + Display* /* display */ +); + +extern XIOErrorHandler XSetIOErrorHandler ( + XIOErrorHandler /* handler */ +); + + +extern XPixmapFormatValues *XListPixmapFormats( + Display* /* display */, + int* /* count_return */ +); +extern int *XListDepths( + Display* /* display */, + int /* screen_number */, + int* /* count_return */ +); + +/* ICCCM routines for things that don't require special include files; */ +/* other declarations are given in Xutil.h */ +extern Status XReconfigureWMWindow( + Display* /* display */, + Window /* w */, + int /* screen_number */, + unsigned int /* mask */, + XWindowChanges* /* changes */ +); + +extern Status XGetWMProtocols( + Display* /* display */, + Window /* w */, + Atom** /* protocols_return */, + int* /* count_return */ +); +extern Status XSetWMProtocols( + Display* /* display */, + Window /* w */, + Atom* /* protocols */, + int /* count */ +); +extern Status XIconifyWindow( + Display* /* display */, + Window /* w */, + int /* screen_number */ +); +extern Status XWithdrawWindow( + Display* /* display */, + Window /* w */, + int /* screen_number */ +); +extern Status XGetCommand( + Display* /* display */, + Window /* w */, + char*** /* argv_return */, + int* /* argc_return */ +); +extern Status XGetWMColormapWindows( + Display* /* display */, + Window /* w */, + Window** /* windows_return */, + int* /* count_return */ +); +extern Status XSetWMColormapWindows( + Display* /* display */, + Window /* w */, + Window* /* colormap_windows */, + int /* count */ +); +extern void XFreeStringList( + char** /* list */ +); +extern int XSetTransientForHint( + Display* /* display */, + Window /* w */, + Window /* prop_window */ +); + +/* The following are given in alphabetical order */ + +extern int XActivateScreenSaver( + Display* /* display */ +); + +extern int XAddHost( + Display* /* display */, + XHostAddress* /* host */ +); + +extern int XAddHosts( + Display* /* display */, + XHostAddress* /* hosts */, + int /* num_hosts */ +); + +extern int XAddToExtensionList( + struct _XExtData** /* structure */, + XExtData* /* ext_data */ +); + +extern int XAddToSaveSet( + Display* /* display */, + Window /* w */ +); + +extern Status XAllocColor( + Display* /* display */, + Colormap /* colormap */, + XColor* /* screen_in_out */ +); + +extern Status XAllocColorCells( + Display* /* display */, + Colormap /* colormap */, + Bool /* contig */, + unsigned long* /* plane_masks_return */, + unsigned int /* nplanes */, + unsigned long* /* pixels_return */, + unsigned int /* npixels */ +); + +extern Status XAllocColorPlanes( + Display* /* display */, + Colormap /* colormap */, + Bool /* contig */, + unsigned long* /* pixels_return */, + int /* ncolors */, + int /* nreds */, + int /* ngreens */, + int /* nblues */, + unsigned long* /* rmask_return */, + unsigned long* /* gmask_return */, + unsigned long* /* bmask_return */ +); + +extern Status XAllocNamedColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* color_name */, + XColor* /* screen_def_return */, + XColor* /* exact_def_return */ +); + +extern int XAllowEvents( + Display* /* display */, + int /* event_mode */, + Time /* time */ +); + +extern int XAutoRepeatOff( + Display* /* display */ +); + +extern int XAutoRepeatOn( + Display* /* display */ +); + +extern int XBell( + Display* /* display */, + int /* percent */ +); + +extern int XBitmapBitOrder( + Display* /* display */ +); + +extern int XBitmapPad( + Display* /* display */ +); + +extern int XBitmapUnit( + Display* /* display */ +); + +extern int XCellsOfScreen( + Screen* /* screen */ +); + +extern int XChangeActivePointerGrab( + Display* /* display */, + unsigned int /* event_mask */, + Cursor /* cursor */, + Time /* time */ +); + +extern int XChangeGC( + Display* /* display */, + GC /* gc */, + unsigned long /* valuemask */, + XGCValues* /* values */ +); + +extern int XChangeKeyboardControl( + Display* /* display */, + unsigned long /* value_mask */, + XKeyboardControl* /* values */ +); + +extern int XChangeKeyboardMapping( + Display* /* display */, + int /* first_keycode */, + int /* keysyms_per_keycode */, + KeySym* /* keysyms */, + int /* num_codes */ +); + +extern int XChangePointerControl( + Display* /* display */, + Bool /* do_accel */, + Bool /* do_threshold */, + int /* accel_numerator */, + int /* accel_denominator */, + int /* threshold */ +); + +extern int XChangeProperty( + Display* /* display */, + Window /* w */, + Atom /* property */, + Atom /* type */, + int /* format */, + int /* mode */, + _Xconst unsigned char* /* data */, + int /* nelements */ +); + +extern int XChangeSaveSet( + Display* /* display */, + Window /* w */, + int /* change_mode */ +); + +extern int XChangeWindowAttributes( + Display* /* display */, + Window /* w */, + unsigned long /* valuemask */, + XSetWindowAttributes* /* attributes */ +); + +extern Bool XCheckIfEvent( + Display* /* display */, + XEvent* /* event_return */, + Bool (*) ( + Display* /* display */, + XEvent* /* event */, + XPointer /* arg */ + ) /* predicate */, + XPointer /* arg */ +); + +extern Bool XCheckMaskEvent( + Display* /* display */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern Bool XCheckTypedEvent( + Display* /* display */, + int /* event_type */, + XEvent* /* event_return */ +); + +extern Bool XCheckTypedWindowEvent( + Display* /* display */, + Window /* w */, + int /* event_type */, + XEvent* /* event_return */ +); + +extern Bool XCheckWindowEvent( + Display* /* display */, + Window /* w */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern int XCirculateSubwindows( + Display* /* display */, + Window /* w */, + int /* direction */ +); + +extern int XCirculateSubwindowsDown( + Display* /* display */, + Window /* w */ +); + +extern int XCirculateSubwindowsUp( + Display* /* display */, + Window /* w */ +); + +extern int XClearArea( + Display* /* display */, + Window /* w */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + Bool /* exposures */ +); + +extern int XClearWindow( + Display* /* display */, + Window /* w */ +); + +extern int XCloseDisplay( + Display* /* display */ +); + +extern int XConfigureWindow( + Display* /* display */, + Window /* w */, + unsigned int /* value_mask */, + XWindowChanges* /* values */ +); + +extern int XConnectionNumber( + Display* /* display */ +); + +extern int XConvertSelection( + Display* /* display */, + Atom /* selection */, + Atom /* target */, + Atom /* property */, + Window /* requestor */, + Time /* time */ +); + +extern int XCopyArea( + Display* /* display */, + Drawable /* src */, + Drawable /* dest */, + GC /* gc */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + int /* dest_x */, + int /* dest_y */ +); + +extern int XCopyGC( + Display* /* display */, + GC /* src */, + unsigned long /* valuemask */, + GC /* dest */ +); + +extern int XCopyPlane( + Display* /* display */, + Drawable /* src */, + Drawable /* dest */, + GC /* gc */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + int /* dest_x */, + int /* dest_y */, + unsigned long /* plane */ +); + +extern int XDefaultDepth( + Display* /* display */, + int /* screen_number */ +); + +extern int XDefaultDepthOfScreen( + Screen* /* screen */ +); + +extern int XDefaultScreen( + Display* /* display */ +); + +extern int XDefineCursor( + Display* /* display */, + Window /* w */, + Cursor /* cursor */ +); + +extern int XDeleteProperty( + Display* /* display */, + Window /* w */, + Atom /* property */ +); + +extern int XDestroyWindow( + Display* /* display */, + Window /* w */ +); + +extern int XDestroySubwindows( + Display* /* display */, + Window /* w */ +); + +extern int XDoesBackingStore( + Screen* /* screen */ +); + +extern Bool XDoesSaveUnders( + Screen* /* screen */ +); + +extern int XDisableAccessControl( + Display* /* display */ +); + + +extern int XDisplayCells( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayHeight( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayHeightMM( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayKeycodes( + Display* /* display */, + int* /* min_keycodes_return */, + int* /* max_keycodes_return */ +); + +extern int XDisplayPlanes( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayWidth( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayWidthMM( + Display* /* display */, + int /* screen_number */ +); + +extern int XDrawArc( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + int /* angle1 */, + int /* angle2 */ +); + +extern int XDrawArcs( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XArc* /* arcs */, + int /* narcs */ +); + +extern int XDrawImageString( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* string */, + int /* length */ +); + +extern int XDrawImageString16( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst XChar2b* /* string */, + int /* length */ +); + +extern int XDrawLine( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x1 */, + int /* y1 */, + int /* x2 */, + int /* y2 */ +); + +extern int XDrawLines( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XPoint* /* points */, + int /* npoints */, + int /* mode */ +); + +extern int XDrawPoint( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */ +); + +extern int XDrawPoints( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XPoint* /* points */, + int /* npoints */, + int /* mode */ +); + +extern int XDrawRectangle( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XDrawRectangles( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XRectangle* /* rectangles */, + int /* nrectangles */ +); + +extern int XDrawSegments( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XSegment* /* segments */, + int /* nsegments */ +); + +extern int XDrawString( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* string */, + int /* length */ +); + +extern int XDrawString16( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst XChar2b* /* string */, + int /* length */ +); + +extern int XDrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XTextItem* /* items */, + int /* nitems */ +); + +extern int XDrawText16( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XTextItem16* /* items */, + int /* nitems */ +); + +extern int XEnableAccessControl( + Display* /* display */ +); + +extern int XEventsQueued( + Display* /* display */, + int /* mode */ +); + +extern Status XFetchName( + Display* /* display */, + Window /* w */, + char** /* window_name_return */ +); + +extern int XFillArc( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + int /* angle1 */, + int /* angle2 */ +); + +extern int XFillArcs( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XArc* /* arcs */, + int /* narcs */ +); + +extern int XFillPolygon( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XPoint* /* points */, + int /* npoints */, + int /* shape */, + int /* mode */ +); + +extern int XFillRectangle( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XFillRectangles( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XRectangle* /* rectangles */, + int /* nrectangles */ +); + +extern int XFlush( + Display* /* display */ +); + +extern int XForceScreenSaver( + Display* /* display */, + int /* mode */ +); + +extern int XFree( + void* /* data */ +); + +extern int XFreeColormap( + Display* /* display */, + Colormap /* colormap */ +); + +extern int XFreeColors( + Display* /* display */, + Colormap /* colormap */, + unsigned long* /* pixels */, + int /* npixels */, + unsigned long /* planes */ +); + +extern int XFreeCursor( + Display* /* display */, + Cursor /* cursor */ +); + +extern int XFreeExtensionList( + char** /* list */ +); + +extern int XFreeFont( + Display* /* display */, + XFontStruct* /* font_struct */ +); + +extern int XFreeFontInfo( + char** /* names */, + XFontStruct* /* free_info */, + int /* actual_count */ +); + +extern int XFreeFontNames( + char** /* list */ +); + +extern int XFreeFontPath( + char** /* list */ +); + +extern int XFreeGC( + Display* /* display */, + GC /* gc */ +); + +extern int XFreeModifiermap( + XModifierKeymap* /* modmap */ +); + +extern int XFreePixmap( + Display* /* display */, + Pixmap /* pixmap */ +); + +extern int XGeometry( + Display* /* display */, + int /* screen */, + _Xconst char* /* position */, + _Xconst char* /* default_position */, + unsigned int /* bwidth */, + unsigned int /* fwidth */, + unsigned int /* fheight */, + int /* xadder */, + int /* yadder */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */ +); + +extern int XGetErrorDatabaseText( + Display* /* display */, + _Xconst char* /* name */, + _Xconst char* /* message */, + _Xconst char* /* default_string */, + char* /* buffer_return */, + int /* length */ +); + +extern int XGetErrorText( + Display* /* display */, + int /* code */, + char* /* buffer_return */, + int /* length */ +); + +extern Bool XGetFontProperty( + XFontStruct* /* font_struct */, + Atom /* atom */, + unsigned long* /* value_return */ +); + +extern Status XGetGCValues( + Display* /* display */, + GC /* gc */, + unsigned long /* valuemask */, + XGCValues* /* values_return */ +); + +extern Status XGetGeometry( + Display* /* display */, + Drawable /* d */, + Window* /* root_return */, + int* /* x_return */, + int* /* y_return */, + unsigned int* /* width_return */, + unsigned int* /* height_return */, + unsigned int* /* border_width_return */, + unsigned int* /* depth_return */ +); + +extern Status XGetIconName( + Display* /* display */, + Window /* w */, + char** /* icon_name_return */ +); + +extern int XGetInputFocus( + Display* /* display */, + Window* /* focus_return */, + int* /* revert_to_return */ +); + +extern int XGetKeyboardControl( + Display* /* display */, + XKeyboardState* /* values_return */ +); + +extern int XGetPointerControl( + Display* /* display */, + int* /* accel_numerator_return */, + int* /* accel_denominator_return */, + int* /* threshold_return */ +); + +extern int XGetPointerMapping( + Display* /* display */, + unsigned char* /* map_return */, + int /* nmap */ +); + +extern int XGetScreenSaver( + Display* /* display */, + int* /* timeout_return */, + int* /* interval_return */, + int* /* prefer_blanking_return */, + int* /* allow_exposures_return */ +); + +extern Status XGetTransientForHint( + Display* /* display */, + Window /* w */, + Window* /* prop_window_return */ +); + +extern int XGetWindowProperty( + Display* /* display */, + Window /* w */, + Atom /* property */, + long /* long_offset */, + long /* long_length */, + Bool /* delete */, + Atom /* req_type */, + Atom* /* actual_type_return */, + int* /* actual_format_return */, + unsigned long* /* nitems_return */, + unsigned long* /* bytes_after_return */, + unsigned char** /* prop_return */ +); + +extern Status XGetWindowAttributes( + Display* /* display */, + Window /* w */, + XWindowAttributes* /* window_attributes_return */ +); + +extern int XGrabButton( + Display* /* display */, + unsigned int /* button */, + unsigned int /* modifiers */, + Window /* grab_window */, + Bool /* owner_events */, + unsigned int /* event_mask */, + int /* pointer_mode */, + int /* keyboard_mode */, + Window /* confine_to */, + Cursor /* cursor */ +); + +extern int XGrabKey( + Display* /* display */, + int /* keycode */, + unsigned int /* modifiers */, + Window /* grab_window */, + Bool /* owner_events */, + int /* pointer_mode */, + int /* keyboard_mode */ +); + +extern int XGrabKeyboard( + Display* /* display */, + Window /* grab_window */, + Bool /* owner_events */, + int /* pointer_mode */, + int /* keyboard_mode */, + Time /* time */ +); + +extern int XGrabPointer( + Display* /* display */, + Window /* grab_window */, + Bool /* owner_events */, + unsigned int /* event_mask */, + int /* pointer_mode */, + int /* keyboard_mode */, + Window /* confine_to */, + Cursor /* cursor */, + Time /* time */ +); + +extern int XGrabServer( + Display* /* display */ +); + +extern int XHeightMMOfScreen( + Screen* /* screen */ +); + +extern int XHeightOfScreen( + Screen* /* screen */ +); + +extern int XIfEvent( + Display* /* display */, + XEvent* /* event_return */, + Bool (*) ( + Display* /* display */, + XEvent* /* event */, + XPointer /* arg */ + ) /* predicate */, + XPointer /* arg */ +); + +extern int XImageByteOrder( + Display* /* display */ +); + +extern int XInstallColormap( + Display* /* display */, + Colormap /* colormap */ +); + +extern KeyCode XKeysymToKeycode( + Display* /* display */, + KeySym /* keysym */ +); + +extern int XKillClient( + Display* /* display */, + XID /* resource */ +); + +extern Status XLookupColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* color_name */, + XColor* /* exact_def_return */, + XColor* /* screen_def_return */ +); + +extern int XLowerWindow( + Display* /* display */, + Window /* w */ +); + +extern int XMapRaised( + Display* /* display */, + Window /* w */ +); + +extern int XMapSubwindows( + Display* /* display */, + Window /* w */ +); + +extern int XMapWindow( + Display* /* display */, + Window /* w */ +); + +extern int XMaskEvent( + Display* /* display */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern int XMaxCmapsOfScreen( + Screen* /* screen */ +); + +extern int XMinCmapsOfScreen( + Screen* /* screen */ +); + +extern int XMoveResizeWindow( + Display* /* display */, + Window /* w */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XMoveWindow( + Display* /* display */, + Window /* w */, + int /* x */, + int /* y */ +); + +extern int XNextEvent( + Display* /* display */, + XEvent* /* event_return */ +); + +extern int XNoOp( + Display* /* display */ +); + +extern Status XParseColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* spec */, + XColor* /* exact_def_return */ +); + +extern int XParseGeometry( + _Xconst char* /* parsestring */, + int* /* x_return */, + int* /* y_return */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern int XPeekEvent( + Display* /* display */, + XEvent* /* event_return */ +); + +extern int XPeekIfEvent( + Display* /* display */, + XEvent* /* event_return */, + Bool (*) ( + Display* /* display */, + XEvent* /* event */, + XPointer /* arg */ + ) /* predicate */, + XPointer /* arg */ +); + +extern int XPending( + Display* /* display */ +); + +extern int XPlanesOfScreen( + Screen* /* screen */ +); + +extern int XProtocolRevision( + Display* /* display */ +); + +extern int XProtocolVersion( + Display* /* display */ +); + + +extern int XPutBackEvent( + Display* /* display */, + XEvent* /* event */ +); + +extern int XPutImage( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XImage* /* image */, + int /* src_x */, + int /* src_y */, + int /* dest_x */, + int /* dest_y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XQLength( + Display* /* display */ +); + +extern Status XQueryBestCursor( + Display* /* display */, + Drawable /* d */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern Status XQueryBestSize( + Display* /* display */, + int /* class */, + Drawable /* which_screen */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern Status XQueryBestStipple( + Display* /* display */, + Drawable /* which_screen */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern Status XQueryBestTile( + Display* /* display */, + Drawable /* which_screen */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern int XQueryColor( + Display* /* display */, + Colormap /* colormap */, + XColor* /* def_in_out */ +); + +extern int XQueryColors( + Display* /* display */, + Colormap /* colormap */, + XColor* /* defs_in_out */, + int /* ncolors */ +); + +extern Bool XQueryExtension( + Display* /* display */, + _Xconst char* /* name */, + int* /* major_opcode_return */, + int* /* first_event_return */, + int* /* first_error_return */ +); + +extern int XQueryKeymap( + Display* /* display */, + char [32] /* keys_return */ +); + +extern Bool XQueryPointer( + Display* /* display */, + Window /* w */, + Window* /* root_return */, + Window* /* child_return */, + int* /* root_x_return */, + int* /* root_y_return */, + int* /* win_x_return */, + int* /* win_y_return */, + unsigned int* /* mask_return */ +); + +extern int XQueryTextExtents( + Display* /* display */, + XID /* font_ID */, + _Xconst char* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern int XQueryTextExtents16( + Display* /* display */, + XID /* font_ID */, + _Xconst XChar2b* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern Status XQueryTree( + Display* /* display */, + Window /* w */, + Window* /* root_return */, + Window* /* parent_return */, + Window** /* children_return */, + unsigned int* /* nchildren_return */ +); + +extern int XRaiseWindow( + Display* /* display */, + Window /* w */ +); + +extern int XReadBitmapFile( + Display* /* display */, + Drawable /* d */, + _Xconst char* /* filename */, + unsigned int* /* width_return */, + unsigned int* /* height_return */, + Pixmap* /* bitmap_return */, + int* /* x_hot_return */, + int* /* y_hot_return */ +); + +extern int XReadBitmapFileData( + _Xconst char* /* filename */, + unsigned int* /* width_return */, + unsigned int* /* height_return */, + unsigned char** /* data_return */, + int* /* x_hot_return */, + int* /* y_hot_return */ +); + +extern int XRebindKeysym( + Display* /* display */, + KeySym /* keysym */, + KeySym* /* list */, + int /* mod_count */, + _Xconst unsigned char* /* string */, + int /* bytes_string */ +); + +extern int XRecolorCursor( + Display* /* display */, + Cursor /* cursor */, + XColor* /* foreground_color */, + XColor* /* background_color */ +); + +extern int XRefreshKeyboardMapping( + XMappingEvent* /* event_map */ +); + +extern int XRemoveFromSaveSet( + Display* /* display */, + Window /* w */ +); + +extern int XRemoveHost( + Display* /* display */, + XHostAddress* /* host */ +); + +extern int XRemoveHosts( + Display* /* display */, + XHostAddress* /* hosts */, + int /* num_hosts */ +); + +extern int XReparentWindow( + Display* /* display */, + Window /* w */, + Window /* parent */, + int /* x */, + int /* y */ +); + +extern int XResetScreenSaver( + Display* /* display */ +); + +extern int XResizeWindow( + Display* /* display */, + Window /* w */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XRestackWindows( + Display* /* display */, + Window* /* windows */, + int /* nwindows */ +); + +extern int XRotateBuffers( + Display* /* display */, + int /* rotate */ +); + +extern int XRotateWindowProperties( + Display* /* display */, + Window /* w */, + Atom* /* properties */, + int /* num_prop */, + int /* npositions */ +); + +extern int XScreenCount( + Display* /* display */ +); + +extern int XSelectInput( + Display* /* display */, + Window /* w */, + long /* event_mask */ +); + +extern Status XSendEvent( + Display* /* display */, + Window /* w */, + Bool /* propagate */, + long /* event_mask */, + XEvent* /* event_send */ +); + +extern int XSetAccessControl( + Display* /* display */, + int /* mode */ +); + +extern int XSetArcMode( + Display* /* display */, + GC /* gc */, + int /* arc_mode */ +); + +extern int XSetBackground( + Display* /* display */, + GC /* gc */, + unsigned long /* background */ +); + +extern int XSetClipMask( + Display* /* display */, + GC /* gc */, + Pixmap /* pixmap */ +); + +extern int XSetClipOrigin( + Display* /* display */, + GC /* gc */, + int /* clip_x_origin */, + int /* clip_y_origin */ +); + +extern int XSetClipRectangles( + Display* /* display */, + GC /* gc */, + int /* clip_x_origin */, + int /* clip_y_origin */, + XRectangle* /* rectangles */, + int /* n */, + int /* ordering */ +); + +extern int XSetCloseDownMode( + Display* /* display */, + int /* close_mode */ +); + +extern int XSetCommand( + Display* /* display */, + Window /* w */, + char** /* argv */, + int /* argc */ +); + +extern int XSetDashes( + Display* /* display */, + GC /* gc */, + int /* dash_offset */, + _Xconst char* /* dash_list */, + int /* n */ +); + +extern int XSetFillRule( + Display* /* display */, + GC /* gc */, + int /* fill_rule */ +); + +extern int XSetFillStyle( + Display* /* display */, + GC /* gc */, + int /* fill_style */ +); + +extern int XSetFont( + Display* /* display */, + GC /* gc */, + Font /* font */ +); + +extern int XSetFontPath( + Display* /* display */, + char** /* directories */, + int /* ndirs */ +); + +extern int XSetForeground( + Display* /* display */, + GC /* gc */, + unsigned long /* foreground */ +); + +extern int XSetFunction( + Display* /* display */, + GC /* gc */, + int /* function */ +); + +extern int XSetGraphicsExposures( + Display* /* display */, + GC /* gc */, + Bool /* graphics_exposures */ +); + +extern int XSetIconName( + Display* /* display */, + Window /* w */, + _Xconst char* /* icon_name */ +); + +extern int XSetInputFocus( + Display* /* display */, + Window /* focus */, + int /* revert_to */, + Time /* time */ +); + +extern int XSetLineAttributes( + Display* /* display */, + GC /* gc */, + unsigned int /* line_width */, + int /* line_style */, + int /* cap_style */, + int /* join_style */ +); + +extern int XSetModifierMapping( + Display* /* display */, + XModifierKeymap* /* modmap */ +); + +extern int XSetPlaneMask( + Display* /* display */, + GC /* gc */, + unsigned long /* plane_mask */ +); + +extern int XSetPointerMapping( + Display* /* display */, + _Xconst unsigned char* /* map */, + int /* nmap */ +); + +extern int XSetScreenSaver( + Display* /* display */, + int /* timeout */, + int /* interval */, + int /* prefer_blanking */, + int /* allow_exposures */ +); + +extern int XSetSelectionOwner( + Display* /* display */, + Atom /* selection */, + Window /* owner */, + Time /* time */ +); + +extern int XSetState( + Display* /* display */, + GC /* gc */, + unsigned long /* foreground */, + unsigned long /* background */, + int /* function */, + unsigned long /* plane_mask */ +); + +extern int XSetStipple( + Display* /* display */, + GC /* gc */, + Pixmap /* stipple */ +); + +extern int XSetSubwindowMode( + Display* /* display */, + GC /* gc */, + int /* subwindow_mode */ +); + +extern int XSetTSOrigin( + Display* /* display */, + GC /* gc */, + int /* ts_x_origin */, + int /* ts_y_origin */ +); + +extern int XSetTile( + Display* /* display */, + GC /* gc */, + Pixmap /* tile */ +); + +extern int XSetWindowBackground( + Display* /* display */, + Window /* w */, + unsigned long /* background_pixel */ +); + +extern int XSetWindowBackgroundPixmap( + Display* /* display */, + Window /* w */, + Pixmap /* background_pixmap */ +); + +extern int XSetWindowBorder( + Display* /* display */, + Window /* w */, + unsigned long /* border_pixel */ +); + +extern int XSetWindowBorderPixmap( + Display* /* display */, + Window /* w */, + Pixmap /* border_pixmap */ +); + +extern int XSetWindowBorderWidth( + Display* /* display */, + Window /* w */, + unsigned int /* width */ +); + +extern int XSetWindowColormap( + Display* /* display */, + Window /* w */, + Colormap /* colormap */ +); + +extern int XStoreBuffer( + Display* /* display */, + _Xconst char* /* bytes */, + int /* nbytes */, + int /* buffer */ +); + +extern int XStoreBytes( + Display* /* display */, + _Xconst char* /* bytes */, + int /* nbytes */ +); + +extern int XStoreColor( + Display* /* display */, + Colormap /* colormap */, + XColor* /* color */ +); + +extern int XStoreColors( + Display* /* display */, + Colormap /* colormap */, + XColor* /* color */, + int /* ncolors */ +); + +extern int XStoreName( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */ +); + +extern int XStoreNamedColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* color */, + unsigned long /* pixel */, + int /* flags */ +); + +extern int XSync( + Display* /* display */, + Bool /* discard */ +); + +extern int XTextExtents( + XFontStruct* /* font_struct */, + _Xconst char* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern int XTextExtents16( + XFontStruct* /* font_struct */, + _Xconst XChar2b* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern int XTextWidth( + XFontStruct* /* font_struct */, + _Xconst char* /* string */, + int /* count */ +); + +extern int XTextWidth16( + XFontStruct* /* font_struct */, + _Xconst XChar2b* /* string */, + int /* count */ +); + +extern Bool XTranslateCoordinates( + Display* /* display */, + Window /* src_w */, + Window /* dest_w */, + int /* src_x */, + int /* src_y */, + int* /* dest_x_return */, + int* /* dest_y_return */, + Window* /* child_return */ +); + +extern int XUndefineCursor( + Display* /* display */, + Window /* w */ +); + +extern int XUngrabButton( + Display* /* display */, + unsigned int /* button */, + unsigned int /* modifiers */, + Window /* grab_window */ +); + +extern int XUngrabKey( + Display* /* display */, + int /* keycode */, + unsigned int /* modifiers */, + Window /* grab_window */ +); + +extern int XUngrabKeyboard( + Display* /* display */, + Time /* time */ +); + +extern int XUngrabPointer( + Display* /* display */, + Time /* time */ +); + +extern int XUngrabServer( + Display* /* display */ +); + +extern int XUninstallColormap( + Display* /* display */, + Colormap /* colormap */ +); + +extern int XUnloadFont( + Display* /* display */, + Font /* font */ +); + +extern int XUnmapSubwindows( + Display* /* display */, + Window /* w */ +); + +extern int XUnmapWindow( + Display* /* display */, + Window /* w */ +); + +extern int XVendorRelease( + Display* /* display */ +); + +extern int XWarpPointer( + Display* /* display */, + Window /* src_w */, + Window /* dest_w */, + int /* src_x */, + int /* src_y */, + unsigned int /* src_width */, + unsigned int /* src_height */, + int /* dest_x */, + int /* dest_y */ +); + +extern int XWidthMMOfScreen( + Screen* /* screen */ +); + +extern int XWidthOfScreen( + Screen* /* screen */ +); + +extern int XWindowEvent( + Display* /* display */, + Window /* w */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern int XWriteBitmapFile( + Display* /* display */, + _Xconst char* /* filename */, + Pixmap /* bitmap */, + unsigned int /* width */, + unsigned int /* height */, + int /* x_hot */, + int /* y_hot */ +); + +extern Bool XSupportsLocale (void); + +extern char *XSetLocaleModifiers( + const char* /* modifier_list */ +); + +extern XOM XOpenOM( + Display* /* display */, + struct _XrmHashBucketRec* /* rdb */, + _Xconst char* /* res_name */, + _Xconst char* /* res_class */ +); + +extern Status XCloseOM( + XOM /* om */ +); + +extern char *XSetOMValues( + XOM /* om */, + ... +) _X_SENTINEL(0); + +extern char *XGetOMValues( + XOM /* om */, + ... +) _X_SENTINEL(0); + +extern Display *XDisplayOfOM( + XOM /* om */ +); + +extern char *XLocaleOfOM( + XOM /* om */ +); + +extern XOC XCreateOC( + XOM /* om */, + ... +) _X_SENTINEL(0); + +extern void XDestroyOC( + XOC /* oc */ +); + +extern XOM XOMOfOC( + XOC /* oc */ +); + +extern char *XSetOCValues( + XOC /* oc */, + ... +) _X_SENTINEL(0); + +extern char *XGetOCValues( + XOC /* oc */, + ... +) _X_SENTINEL(0); + +extern XFontSet XCreateFontSet( + Display* /* display */, + _Xconst char* /* base_font_name_list */, + char*** /* missing_charset_list */, + int* /* missing_charset_count */, + char** /* def_string */ +); + +extern void XFreeFontSet( + Display* /* display */, + XFontSet /* font_set */ +); + +extern int XFontsOfFontSet( + XFontSet /* font_set */, + XFontStruct*** /* font_struct_list */, + char*** /* font_name_list */ +); + +extern char *XBaseFontNameListOfFontSet( + XFontSet /* font_set */ +); + +extern char *XLocaleOfFontSet( + XFontSet /* font_set */ +); + +extern Bool XContextDependentDrawing( + XFontSet /* font_set */ +); + +extern Bool XDirectionalDependentDrawing( + XFontSet /* font_set */ +); + +extern Bool XContextualDrawing( + XFontSet /* font_set */ +); + +extern XFontSetExtents *XExtentsOfFontSet( + XFontSet /* font_set */ +); + +extern int XmbTextEscapement( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern int XwcTextEscapement( + XFontSet /* font_set */, + _Xconst wchar_t* /* text */, + int /* num_wchars */ +); + +extern int Xutf8TextEscapement( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern int XmbTextExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern int XwcTextExtents( + XFontSet /* font_set */, + _Xconst wchar_t* /* text */, + int /* num_wchars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern int Xutf8TextExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern Status XmbTextPerCharExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* ink_extents_buffer */, + XRectangle* /* logical_extents_buffer */, + int /* buffer_size */, + int* /* num_chars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern Status XwcTextPerCharExtents( + XFontSet /* font_set */, + _Xconst wchar_t* /* text */, + int /* num_wchars */, + XRectangle* /* ink_extents_buffer */, + XRectangle* /* logical_extents_buffer */, + int /* buffer_size */, + int* /* num_chars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern Status Xutf8TextPerCharExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* ink_extents_buffer */, + XRectangle* /* logical_extents_buffer */, + int /* buffer_size */, + int* /* num_chars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern void XmbDrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XmbTextItem* /* text_items */, + int /* nitems */ +); + +extern void XwcDrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XwcTextItem* /* text_items */, + int /* nitems */ +); + +extern void Xutf8DrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XmbTextItem* /* text_items */, + int /* nitems */ +); + +extern void XmbDrawString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern void XwcDrawString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst wchar_t* /* text */, + int /* num_wchars */ +); + +extern void Xutf8DrawString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern void XmbDrawImageString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern void XwcDrawImageString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst wchar_t* /* text */, + int /* num_wchars */ +); + +extern void Xutf8DrawImageString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern XIM XOpenIM( + Display* /* dpy */, + struct _XrmHashBucketRec* /* rdb */, + char* /* res_name */, + char* /* res_class */ +); + +extern Status XCloseIM( + XIM /* im */ +); + +extern char *XGetIMValues( + XIM /* im */, ... +) _X_SENTINEL(0); + +extern char *XSetIMValues( + XIM /* im */, ... +) _X_SENTINEL(0); + +extern Display *XDisplayOfIM( + XIM /* im */ +); + +extern char *XLocaleOfIM( + XIM /* im*/ +); + +extern XIC XCreateIC( + XIM /* im */, ... +) _X_SENTINEL(0); + +extern void XDestroyIC( + XIC /* ic */ +); + +extern void XSetICFocus( + XIC /* ic */ +); + +extern void XUnsetICFocus( + XIC /* ic */ +); + +extern wchar_t *XwcResetIC( + XIC /* ic */ +); + +extern char *XmbResetIC( + XIC /* ic */ +); + +extern char *Xutf8ResetIC( + XIC /* ic */ +); + +extern char *XSetICValues( + XIC /* ic */, ... +) _X_SENTINEL(0); + +extern char *XGetICValues( + XIC /* ic */, ... +) _X_SENTINEL(0); + +extern XIM XIMOfIC( + XIC /* ic */ +); + +extern Bool XFilterEvent( + XEvent* /* event */, + Window /* window */ +); + +extern int XmbLookupString( + XIC /* ic */, + XKeyPressedEvent* /* event */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + Status* /* status_return */ +); + +extern int XwcLookupString( + XIC /* ic */, + XKeyPressedEvent* /* event */, + wchar_t* /* buffer_return */, + int /* wchars_buffer */, + KeySym* /* keysym_return */, + Status* /* status_return */ +); + +extern int Xutf8LookupString( + XIC /* ic */, + XKeyPressedEvent* /* event */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + Status* /* status_return */ +); + +extern XVaNestedList XVaCreateNestedList( + int /*unused*/, ... +) _X_SENTINEL(0); + +/* internal connections for IMs */ + +extern Bool XRegisterIMInstantiateCallback( + Display* /* dpy */, + struct _XrmHashBucketRec* /* rdb */, + char* /* res_name */, + char* /* res_class */, + XIDProc /* callback */, + XPointer /* client_data */ +); + +extern Bool XUnregisterIMInstantiateCallback( + Display* /* dpy */, + struct _XrmHashBucketRec* /* rdb */, + char* /* res_name */, + char* /* res_class */, + XIDProc /* callback */, + XPointer /* client_data */ +); + +typedef void (*XConnectionWatchProc)( + Display* /* dpy */, + XPointer /* client_data */, + int /* fd */, + Bool /* opening */, /* open or close flag */ + XPointer* /* watch_data */ /* open sets, close uses */ +); + + +extern Status XInternalConnectionNumbers( + Display* /* dpy */, + int** /* fd_return */, + int* /* count_return */ +); + +extern void XProcessInternalConnection( + Display* /* dpy */, + int /* fd */ +); + +extern Status XAddConnectionWatch( + Display* /* dpy */, + XConnectionWatchProc /* callback */, + XPointer /* client_data */ +); + +extern void XRemoveConnectionWatch( + Display* /* dpy */, + XConnectionWatchProc /* callback */, + XPointer /* client_data */ +); + +extern void XSetAuthorization( + char * /* name */, + int /* namelen */, + char * /* data */, + int /* datalen */ +); + +extern int _Xmbtowc( + wchar_t * /* wstr */, +#ifdef ISC + char const * /* str */, + size_t /* len */ +#else + char * /* str */, + int /* len */ +#endif +); + +extern int _Xwctomb( + char * /* str */, + wchar_t /* wc */ +); + +extern Bool XGetEventData( + Display* /* dpy */, + XGenericEventCookie* /* cookie*/ +); + +extern void XFreeEventData( + Display* /* dpy */, + XGenericEventCookie* /* cookie*/ +); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +_XFUNCPROTOEND + +#endif /* _X11_XLIB_H_ */ diff --git a/src/lib_armv6/X11/Xosdefs.h b/src/lib_armv6/X11/Xosdefs.h new file mode 100644 index 0000000..33eaee4 --- /dev/null +++ b/src/lib_armv6/X11/Xosdefs.h @@ -0,0 +1,116 @@ +/* + * O/S-dependent (mis)feature macro definitions + * +Copyright 1991, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + */ + +#ifndef _XOSDEFS_H_ +# define _XOSDEFS_H_ + +/* + * X_NOT_POSIX means does not have POSIX header files. Lack of this + * symbol does NOT mean that the POSIX environment is the default. + * You may still have to define _POSIX_SOURCE to get it. + */ + + +# ifdef _SCO_DS +# ifndef __SCO__ +# define __SCO__ +# endif +# endif + +# ifdef __i386__ +# ifdef SYSV +# if !defined(__SCO__) && \ + !defined(__UNIXWARE__) && !defined(__sun) +# if !defined(_POSIX_SOURCE) +# define X_NOT_POSIX +# endif +# endif +# endif +# endif + +# ifdef __sun +/* Imake configs define SVR4 on Solaris, but cc & gcc only define __SVR4 + * This check allows non-Imake configured programs to build correctly. + */ +# if defined(__SVR4) && !defined(SVR4) +# define SVR4 1 +# endif +# ifdef SVR4 +/* define this to whatever it needs to be */ +# define X_POSIX_C_SOURCE 199300L +# endif +# endif + +# ifdef WIN32 +# ifndef _POSIX_ +# define X_NOT_POSIX +# endif +# endif + + +# ifdef __APPLE__ +# define NULL_NOT_ZERO + +/* Defining any of these will sanitize the namespace to JUST want is defined by + * that particular standard. If that happens, we don't get some expected + * prototypes, typedefs, etc (like fd_mask). We can define _DARWIN_C_SOURCE to + * loosen our belts a tad. + */ +# if defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) +# ifndef _DARWIN_C_SOURCE +# define _DARWIN_C_SOURCE +# endif +# endif + +# endif + +# ifdef __GNU__ +# ifndef PATH_MAX +# define PATH_MAX 4096 +# endif +# ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +# endif +# endif + +# if defined(__SCO__) || defined(__UNIXWARE__) +# ifndef PATH_MAX +# define PATH_MAX 1024 +# endif +# ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +# endif +# endif + +# if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) \ + || defined(__APPLE__) || defined(__DragonFly__) +# ifndef CSRG_BASED +# define CSRG_BASED +# endif +# endif + +#endif /* _XOSDEFS_H_ */ + diff --git a/src/lib_armv6/X11/Xutil.h b/src/lib_armv6/X11/Xutil.h new file mode 100644 index 0000000..62cdf55 --- /dev/null +++ b/src/lib_armv6/X11/Xutil.h @@ -0,0 +1,838 @@ + +/*********************************************************** + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#ifndef _X11_XUTIL_H_ +#define _X11_XUTIL_H_ + +/* You must include before including this file */ +#include +#include + +/* The Xlib structs are full of implicit padding to properly align members. + We can't clean that up without breaking ABI, so tell clang not to bother + complaining about it. */ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +/* + * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding + * value (x, y, width, height) was found in the parsed string. + */ +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* + * new version containing base_width, base_height, and win_gravity fields; + * used with WM_NORMAL_HINTS. + */ +typedef struct { + long flags; /* marks which fields in this structure are defined */ + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; + struct { + int x; /* numerator */ + int y; /* denominator */ + } min_aspect, max_aspect; + int base_width, base_height; /* added by ICCCM version 1 */ + int win_gravity; /* added by ICCCM version 1 */ +} XSizeHints; + +/* + * The next block of definitions are for window manager properties that + * clients and applications use for communication. + */ + +/* flags argument in size hints */ +#define USPosition (1L << 0) /* user specified x, y */ +#define USSize (1L << 1) /* user specified width, height */ + +#define PPosition (1L << 2) /* program specified position */ +#define PSize (1L << 3) /* program specified size */ +#define PMinSize (1L << 4) /* program specified minimum size */ +#define PMaxSize (1L << 5) /* program specified maximum size */ +#define PResizeInc (1L << 6) /* program specified resize increments */ +#define PAspect (1L << 7) /* program specified min and max aspect ratios */ +#define PBaseSize (1L << 8) /* program specified base for incrementing */ +#define PWinGravity (1L << 9) /* program specified window gravity */ + +/* obsolete */ +#define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) + + + +typedef struct { + long flags; /* marks which fields in this structure are defined */ + Bool input; /* does this application rely on the window manager to + get keyboard input? */ + int initial_state; /* see below */ + Pixmap icon_pixmap; /* pixmap to be used as icon */ + Window icon_window; /* window to be used as icon */ + int icon_x, icon_y; /* initial position of icon */ + Pixmap icon_mask; /* icon mask bitmap */ + XID window_group; /* id of related window group */ + /* this structure may be extended in the future */ +} XWMHints; + +/* definition for flags of XWMHints */ + +#define InputHint (1L << 0) +#define StateHint (1L << 1) +#define IconPixmapHint (1L << 2) +#define IconWindowHint (1L << 3) +#define IconPositionHint (1L << 4) +#define IconMaskHint (1L << 5) +#define WindowGroupHint (1L << 6) +#define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \ +IconPositionHint|IconMaskHint|WindowGroupHint) +#define XUrgencyHint (1L << 8) + +/* definitions for initial window state */ +#define WithdrawnState 0 /* for windows that are not mapped */ +#define NormalState 1 /* most applications want to start this way */ +#define IconicState 3 /* application wants to start as an icon */ + +/* + * Obsolete states no longer defined by ICCCM + */ +#define DontCareState 0 /* don't know or care */ +#define ZoomState 2 /* application wants to start zoomed */ +#define InactiveState 4 /* application believes it is seldom used; */ + /* some wm's may put it on inactive menu */ + + +/* + * new structure for manipulating TEXT properties; used with WM_NAME, + * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND. + */ +typedef struct { + unsigned char *value; /* same as Property routines */ + Atom encoding; /* prop type */ + int format; /* prop data format: 8, 16, or 32 */ + unsigned long nitems; /* number of data items in value */ +} XTextProperty; + +#define XNoMemory -1 +#define XLocaleNotSupported -2 +#define XConverterNotFound -3 + +typedef enum { + XStringStyle, /* STRING */ + XCompoundTextStyle, /* COMPOUND_TEXT */ + XTextStyle, /* text in owner's encoding (current locale)*/ + XStdICCTextStyle, /* STRING, else COMPOUND_TEXT */ + /* The following is an XFree86 extension, introduced in November 2000 */ + XUTF8StringStyle /* UTF8_STRING */ +} XICCEncodingStyle; + +typedef struct { + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; +} XIconSize; + +typedef struct { + char *res_name; + char *res_class; +} XClassHint; + +#ifdef XUTIL_DEFINE_FUNCTIONS +extern int XDestroyImage( + XImage *ximage); +extern unsigned long XGetPixel( + XImage *ximage, + int x, int y); +extern int XPutPixel( + XImage *ximage, + int x, int y, + unsigned long pixel); +extern XImage *XSubImage( + XImage *ximage, + int x, int y, + unsigned int width, unsigned int height); +extern int XAddPixel( + XImage *ximage, + long value); +#else +/* + * These macros are used to give some sugar to the image routines so that + * naive people are more comfortable with them. + */ +#define XDestroyImage(ximage) \ + ((*((ximage)->f.destroy_image))((ximage))) +#define XGetPixel(ximage, x, y) \ + ((*((ximage)->f.get_pixel))((ximage), (x), (y))) +#define XPutPixel(ximage, x, y, pixel) \ + ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel))) +#define XSubImage(ximage, x, y, width, height) \ + ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height))) +#define XAddPixel(ximage, value) \ + ((*((ximage)->f.add_pixel))((ximage), (value))) +#endif + +/* + * Compose sequence status structure, used in calling XLookupString. + */ +typedef struct _XComposeStatus { + XPointer compose_ptr; /* state table pointer */ + int chars_matched; /* match state */ +} XComposeStatus; + +/* + * Keysym macros, used on Keysyms to test for classes of symbols + */ +#define IsKeypadKey(keysym) \ + (((KeySym)(keysym) >= XK_KP_Space) && ((KeySym)(keysym) <= XK_KP_Equal)) + +#define IsPrivateKeypadKey(keysym) \ + (((KeySym)(keysym) >= 0x11000000) && ((KeySym)(keysym) <= 0x1100FFFF)) + +#define IsCursorKey(keysym) \ + (((KeySym)(keysym) >= XK_Home) && ((KeySym)(keysym) < XK_Select)) + +#define IsPFKey(keysym) \ + (((KeySym)(keysym) >= XK_KP_F1) && ((KeySym)(keysym) <= XK_KP_F4)) + +#define IsFunctionKey(keysym) \ + (((KeySym)(keysym) >= XK_F1) && ((KeySym)(keysym) <= XK_F35)) + +#define IsMiscFunctionKey(keysym) \ + (((KeySym)(keysym) >= XK_Select) && ((KeySym)(keysym) <= XK_Break)) + +#ifdef XK_XKB_KEYS +#define IsModifierKey(keysym) \ + ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \ + || (((KeySym)(keysym) >= XK_ISO_Lock) && \ + ((KeySym)(keysym) <= XK_ISO_Level5_Lock)) \ + || ((KeySym)(keysym) == XK_Mode_switch) \ + || ((KeySym)(keysym) == XK_Num_Lock)) +#else +#define IsModifierKey(keysym) \ + ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \ + || ((KeySym)(keysym) == XK_Mode_switch) \ + || ((KeySym)(keysym) == XK_Num_Lock)) +#endif +/* + * opaque reference to Region data type + */ +typedef struct _XRegion *Region; + +/* Return values from XRectInRegion() */ + +#define RectangleOut 0 +#define RectangleIn 1 +#define RectanglePart 2 + + +/* + * Information used by the visual utility routines to find desired visual + * type from the many visuals a display may support. + */ + +typedef struct { + Visual *visual; + VisualID visualid; + int screen; + int depth; +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ */ +#else + int class; +#endif + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + int colormap_size; + int bits_per_rgb; +} XVisualInfo; + +#define VisualNoMask 0x0 +#define VisualIDMask 0x1 +#define VisualScreenMask 0x2 +#define VisualDepthMask 0x4 +#define VisualClassMask 0x8 +#define VisualRedMaskMask 0x10 +#define VisualGreenMaskMask 0x20 +#define VisualBlueMaskMask 0x40 +#define VisualColormapSizeMask 0x80 +#define VisualBitsPerRGBMask 0x100 +#define VisualAllMask 0x1FF + +/* + * This defines a window manager property that clients may use to + * share standard color maps of type RGB_COLOR_MAP: + */ +typedef struct { + Colormap colormap; + unsigned long red_max; + unsigned long red_mult; + unsigned long green_max; + unsigned long green_mult; + unsigned long blue_max; + unsigned long blue_mult; + unsigned long base_pixel; + VisualID visualid; /* added by ICCCM version 1 */ + XID killid; /* added by ICCCM version 1 */ +} XStandardColormap; + +#define ReleaseByFreeingColormap ((XID) 1L) /* for killid field above */ + + +/* + * return codes for XReadBitmapFile and XWriteBitmapFile + */ +#define BitmapSuccess 0 +#define BitmapOpenFailed 1 +#define BitmapFileInvalid 2 +#define BitmapNoMemory 3 + +/**************************************************************** + * + * Context Management + * + ****************************************************************/ + + +/* Associative lookup table return codes */ + +#define XCSUCCESS 0 /* No error. */ +#define XCNOMEM 1 /* Out of memory */ +#define XCNOENT 2 /* No entry in table */ + +typedef int XContext; + +#define XUniqueContext() ((XContext) XrmUniqueQuark()) +#define XStringToContext(string) ((XContext) XrmStringToQuark(string)) + +_XFUNCPROTOBEGIN + +/* The following declarations are alphabetized. */ + +extern XClassHint *XAllocClassHint ( + void +); + +extern XIconSize *XAllocIconSize ( + void +); + +extern XSizeHints *XAllocSizeHints ( + void +); + +extern XStandardColormap *XAllocStandardColormap ( + void +); + +extern XWMHints *XAllocWMHints ( + void +); + +extern int XClipBox( + Region /* r */, + XRectangle* /* rect_return */ +); + +extern Region XCreateRegion( + void +); + +extern const char *XDefaultString (void); + +extern int XDeleteContext( + Display* /* display */, + XID /* rid */, + XContext /* context */ +); + +extern int XDestroyRegion( + Region /* r */ +); + +extern int XEmptyRegion( + Region /* r */ +); + +extern int XEqualRegion( + Region /* r1 */, + Region /* r2 */ +); + +extern int XFindContext( + Display* /* display */, + XID /* rid */, + XContext /* context */, + XPointer* /* data_return */ +); + +extern Status XGetClassHint( + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints_return */ +); + +extern Status XGetIconSizes( + Display* /* display */, + Window /* w */, + XIconSize** /* size_list_return */, + int* /* count_return */ +); + +extern Status XGetNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */ +); + +extern Status XGetRGBColormaps( + Display* /* display */, + Window /* w */, + XStandardColormap** /* stdcmap_return */, + int* /* count_return */, + Atom /* property */ +); + +extern Status XGetSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + Atom /* property */ +); + +extern Status XGetStandardColormap( + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap_return */, + Atom /* property */ +); + +extern Status XGetTextProperty( + Display* /* display */, + Window /* window */, + XTextProperty* /* text_prop_return */, + Atom /* property */ +); + +extern XVisualInfo *XGetVisualInfo( + Display* /* display */, + long /* vinfo_mask */, + XVisualInfo* /* vinfo_template */, + int* /* nitems_return */ +); + +extern Status XGetWMClientMachine( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +); + +extern XWMHints *XGetWMHints( + Display* /* display */, + Window /* w */ +); + +extern Status XGetWMIconName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +); + +extern Status XGetWMName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +); + +extern Status XGetWMNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */ +); + +extern Status XGetWMSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */, + Atom /* property */ +); + +extern Status XGetZoomHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints_return */ +); + +extern int XIntersectRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +extern void XConvertCase( + KeySym /* sym */, + KeySym* /* lower */, + KeySym* /* upper */ +); + +extern int XLookupString( + XKeyEvent* /* event_struct */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + XComposeStatus* /* status_in_out */ +); + +extern Status XMatchVisualInfo( + Display* /* display */, + int /* screen */, + int /* depth */, + int /* class */, + XVisualInfo* /* vinfo_return */ +); + +extern int XOffsetRegion( + Region /* r */, + int /* dx */, + int /* dy */ +); + +extern Bool XPointInRegion( + Region /* r */, + int /* x */, + int /* y */ +); + +extern Region XPolygonRegion( + XPoint* /* points */, + int /* n */, + int /* fill_rule */ +); + +extern int XRectInRegion( + Region /* r */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XSaveContext( + Display* /* display */, + XID /* rid */, + XContext /* context */, + _Xconst char* /* data */ +); + +extern int XSetClassHint( + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints */ +); + +extern int XSetIconSizes( + Display* /* display */, + Window /* w */, + XIconSize* /* size_list */, + int /* count */ +); + +extern int XSetNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +); + +extern void XSetRGBColormaps( + Display* /* display */, + Window /* w */, + XStandardColormap* /* stdcmaps */, + int /* count */, + Atom /* property */ +); + +extern int XSetSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +); + +extern int XSetStandardProperties( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + Pixmap /* icon_pixmap */, + char** /* argv */, + int /* argc */, + XSizeHints* /* hints */ +); + +extern void XSetTextProperty( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */, + Atom /* property */ +); + +extern void XSetWMClientMachine( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +); + +extern int XSetWMHints( + Display* /* display */, + Window /* w */, + XWMHints* /* wm_hints */ +); + +extern void XSetWMIconName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +); + +extern void XSetWMName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +); + +extern void XSetWMNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +); + +extern void XSetWMProperties( + Display* /* display */, + Window /* w */, + XTextProperty* /* window_name */, + XTextProperty* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +); + +extern void XmbSetWMProperties( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +); + +extern void Xutf8SetWMProperties( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +); + +extern void XSetWMSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +); + +extern int XSetRegion( + Display* /* display */, + GC /* gc */, + Region /* r */ +); + +extern void XSetStandardColormap( + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap */, + Atom /* property */ +); + +extern int XSetZoomHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints */ +); + +extern int XShrinkRegion( + Region /* r */, + int /* dx */, + int /* dy */ +); + +extern Status XStringListToTextProperty( + char** /* list */, + int /* count */, + XTextProperty* /* text_prop_return */ +); + +extern int XSubtractRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +extern int XmbTextListToTextProperty( + Display* display, + char** list, + int count, + XICCEncodingStyle style, + XTextProperty* text_prop_return +); + +extern int XwcTextListToTextProperty( + Display* display, + wchar_t** list, + int count, + XICCEncodingStyle style, + XTextProperty* text_prop_return +); + +extern int Xutf8TextListToTextProperty( + Display* display, + char** list, + int count, + XICCEncodingStyle style, + XTextProperty* text_prop_return +); + +extern void XwcFreeStringList( + wchar_t** list +); + +extern Status XTextPropertyToStringList( + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +); + +extern int XmbTextPropertyToTextList( + Display* display, + const XTextProperty* text_prop, + char*** list_return, + int* count_return +); + +extern int XwcTextPropertyToTextList( + Display* display, + const XTextProperty* text_prop, + wchar_t*** list_return, + int* count_return +); + +extern int Xutf8TextPropertyToTextList( + Display* display, + const XTextProperty* text_prop, + char*** list_return, + int* count_return +); + +extern int XUnionRectWithRegion( + XRectangle* /* rectangle */, + Region /* src_region */, + Region /* dest_region_return */ +); + +extern int XUnionRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +extern int XWMGeometry( + Display* /* display */, + int /* screen_number */, + _Xconst char* /* user_geometry */, + _Xconst char* /* default_geometry */, + unsigned int /* border_width */, + XSizeHints* /* hints */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */, + int* /* gravity_return */ +); + +extern int XXorRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +_XFUNCPROTOEND + +#endif /* _X11_XUTIL_H_ */ diff --git a/src/lib_armv6/X11/keysym.h b/src/lib_armv6/X11/keysym.h new file mode 100644 index 0000000..4f58488 --- /dev/null +++ b/src/lib_armv6/X11/keysym.h @@ -0,0 +1,74 @@ +/*********************************************************** + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* default keysyms */ +#define XK_MISCELLANY +#define XK_XKB_KEYS +#define XK_LATIN1 +#define XK_LATIN2 +#define XK_LATIN3 +#define XK_LATIN4 +#define XK_LATIN8 +#define XK_LATIN9 +#define XK_CAUCASUS +#define XK_GREEK +#define XK_KATAKANA +#define XK_ARABIC +#define XK_CYRILLIC +#define XK_HEBREW +#define XK_THAI +#define XK_KOREAN +#define XK_ARMENIAN +#define XK_GEORGIAN +#define XK_VIETNAMESE +#define XK_CURRENCY +#define XK_MATHEMATICAL +#define XK_BRAILLE +#define XK_SINHALA + +#include + diff --git a/src/lib_armv6/X11/keysymdef.h b/src/lib_armv6/X11/keysymdef.h new file mode 100644 index 0000000..147ecf5 --- /dev/null +++ b/src/lib_armv6/X11/keysymdef.h @@ -0,0 +1,2497 @@ +/*********************************************************** +Copyright 1987, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* + * The "X11 Window System Protocol" standard defines in Appendix A the + * keysym codes. These 29-bit integer values identify characters or + * functions associated with each key (e.g., via the visible + * engraving) of a keyboard layout. This file assigns mnemonic macro + * names for these keysyms. + * + * This file is also compiled (by src/util/makekeys.c in libX11) into + * hash tables that can be accessed with X11 library functions such as + * XStringToKeysym() and XKeysymToString(). + * + * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode + * character, this is noted in a comment that provides both the U+xxxx + * Unicode position, as well as the official Unicode name of the + * character. + * + * Where the correspondence is either not one-to-one or semantically + * unclear, the Unicode position and name are enclosed in + * parentheses. Such legacy keysyms should be considered deprecated + * and are not recommended for use in future keyboard mappings. + * + * For any future extension of the keysyms with characters already + * found in ISO 10646 / Unicode, the following algorithm shall be + * used. The new keysym code position will simply be the character's + * Unicode number plus 0x01000000. The keysym values in the range + * 0x01000100 to 0x0110ffff are reserved to represent Unicode + * characters in the range U+0100 to U+10FFFF. + * + * While most newer Unicode-based X11 clients do already accept + * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it + * will remain necessary for clients -- in the interest of + * compatibility with existing servers -- to also understand the + * existing legacy keysym values in the range 0x0100 to 0x20ff. + * + * Where several mnemonic names are defined for the same keysym in this + * file, all but the first one listed should be considered deprecated. + * + * Mnemonic names for keysyms are defined in this file with lines + * that match one of these Perl regular expressions: + * + * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U+([0-9A-F]{4,6}) (.*) \*\/\s*$/ + * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ + * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ + * + * Before adding new keysyms, please do consider the following: In + * addition to the keysym names defined in this file, the + * XStringToKeysym() and XKeysymToString() functions will also handle + * any keysym string of the form "U0020" to "U007E" and "U00A0" to + * "U10FFFF" for all possible Unicode characters. In other words, + * every possible Unicode character has already a keysym string + * defined algorithmically, even if it is not listed here. Therefore, + * defining an additional keysym macro is only necessary where a + * non-hexadecimal mnemonic name is needed, or where the new keysym + * does not represent any existing Unicode character. + * + * When adding new keysyms to this file, do not forget to also update the + * following as needed: + * + * - the mappings in src/KeyBind.c in the repo + * git://anongit.freedesktop.org/xorg/lib/libX11.git + * + * - the protocol specification in specs/keysyms.xml + * in the repo git://anongit.freedesktop.org/xorg/proto/x11proto.git + * + */ + +#define XK_VoidSymbol 0xffffff /* Void symbol */ + +#ifdef XK_MISCELLANY +/* + * TTY function keys, cleverly chosen to map to ASCII, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code). + */ + +#define XK_BackSpace 0xff08 /* Back space, back char */ +#define XK_Tab 0xff09 +#define XK_Linefeed 0xff0a /* Linefeed, LF */ +#define XK_Clear 0xff0b +#define XK_Return 0xff0d /* Return, enter */ +#define XK_Pause 0xff13 /* Pause, hold */ +#define XK_Scroll_Lock 0xff14 +#define XK_Sys_Req 0xff15 +#define XK_Escape 0xff1b +#define XK_Delete 0xffff /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xff20 /* Multi-key character compose */ +#define XK_Codeinput 0xff37 +#define XK_SingleCandidate 0xff3c +#define XK_MultipleCandidate 0xff3d +#define XK_PreviousCandidate 0xff3e + +/* Japanese keyboard support */ + +#define XK_Kanji 0xff21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xff22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xff23 /* Start/Stop Conversion */ +#define XK_Henkan 0xff23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xff24 /* to Romaji */ +#define XK_Hiragana 0xff25 /* to Hiragana */ +#define XK_Katakana 0xff26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xff28 /* to Zenkaku */ +#define XK_Hankaku 0xff29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xff2b /* Add to Dictionary */ +#define XK_Massyo 0xff2c /* Delete from Dictionary */ +#define XK_Kana_Lock 0xff2d /* Kana Lock */ +#define XK_Kana_Shift 0xff2e /* Kana Shift */ +#define XK_Eisu_Shift 0xff2f /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xff30 /* Alphanumeric toggle */ +#define XK_Kanji_Bangou 0xff37 /* Codeinput */ +#define XK_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ +#define XK_Mae_Koho 0xff3e /* Previous Candidate */ + +/* 0xff31 thru 0xff3f are under XK_KOREAN */ + +/* Cursor control & motion */ + +#define XK_Home 0xff50 +#define XK_Left 0xff51 /* Move left, left arrow */ +#define XK_Up 0xff52 /* Move up, up arrow */ +#define XK_Right 0xff53 /* Move right, right arrow */ +#define XK_Down 0xff54 /* Move down, down arrow */ +#define XK_Prior 0xff55 /* Prior, previous */ +#define XK_Page_Up 0xff55 +#define XK_Next 0xff56 /* Next */ +#define XK_Page_Down 0xff56 +#define XK_End 0xff57 /* EOL */ +#define XK_Begin 0xff58 /* BOL */ + + +/* Misc functions */ + +#define XK_Select 0xff60 /* Select, mark */ +#define XK_Print 0xff61 +#define XK_Execute 0xff62 /* Execute, run, do */ +#define XK_Insert 0xff63 /* Insert, insert here */ +#define XK_Undo 0xff65 +#define XK_Redo 0xff66 /* Redo, again */ +#define XK_Menu 0xff67 +#define XK_Find 0xff68 /* Find, search */ +#define XK_Cancel 0xff69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xff6a /* Help */ +#define XK_Break 0xff6b +#define XK_Mode_switch 0xff7e /* Character set switch */ +#define XK_script_switch 0xff7e /* Alias for mode_switch */ +#define XK_Num_Lock 0xff7f + +/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ + +#define XK_KP_Space 0xff80 /* Space */ +#define XK_KP_Tab 0xff89 +#define XK_KP_Enter 0xff8d /* Enter */ +#define XK_KP_F1 0xff91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xff92 +#define XK_KP_F3 0xff93 +#define XK_KP_F4 0xff94 +#define XK_KP_Home 0xff95 +#define XK_KP_Left 0xff96 +#define XK_KP_Up 0xff97 +#define XK_KP_Right 0xff98 +#define XK_KP_Down 0xff99 +#define XK_KP_Prior 0xff9a +#define XK_KP_Page_Up 0xff9a +#define XK_KP_Next 0xff9b +#define XK_KP_Page_Down 0xff9b +#define XK_KP_End 0xff9c +#define XK_KP_Begin 0xff9d +#define XK_KP_Insert 0xff9e +#define XK_KP_Delete 0xff9f +#define XK_KP_Equal 0xffbd /* Equals */ +#define XK_KP_Multiply 0xffaa +#define XK_KP_Add 0xffab +#define XK_KP_Separator 0xffac /* Separator, often comma */ +#define XK_KP_Subtract 0xffad +#define XK_KP_Decimal 0xffae +#define XK_KP_Divide 0xffaf + +#define XK_KP_0 0xffb0 +#define XK_KP_1 0xffb1 +#define XK_KP_2 0xffb2 +#define XK_KP_3 0xffb3 +#define XK_KP_4 0xffb4 +#define XK_KP_5 0xffb5 +#define XK_KP_6 0xffb6 +#define XK_KP_7 0xffb7 +#define XK_KP_8 0xffb8 +#define XK_KP_9 0xffb9 + + + +/* + * Auxiliary functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufacturers have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xffbe +#define XK_F2 0xffbf +#define XK_F3 0xffc0 +#define XK_F4 0xffc1 +#define XK_F5 0xffc2 +#define XK_F6 0xffc3 +#define XK_F7 0xffc4 +#define XK_F8 0xffc5 +#define XK_F9 0xffc6 +#define XK_F10 0xffc7 +#define XK_F11 0xffc8 +#define XK_L1 0xffc8 +#define XK_F12 0xffc9 +#define XK_L2 0xffc9 +#define XK_F13 0xffca +#define XK_L3 0xffca +#define XK_F14 0xffcb +#define XK_L4 0xffcb +#define XK_F15 0xffcc +#define XK_L5 0xffcc +#define XK_F16 0xffcd +#define XK_L6 0xffcd +#define XK_F17 0xffce +#define XK_L7 0xffce +#define XK_F18 0xffcf +#define XK_L8 0xffcf +#define XK_F19 0xffd0 +#define XK_L9 0xffd0 +#define XK_F20 0xffd1 +#define XK_L10 0xffd1 +#define XK_F21 0xffd2 +#define XK_R1 0xffd2 +#define XK_F22 0xffd3 +#define XK_R2 0xffd3 +#define XK_F23 0xffd4 +#define XK_R3 0xffd4 +#define XK_F24 0xffd5 +#define XK_R4 0xffd5 +#define XK_F25 0xffd6 +#define XK_R5 0xffd6 +#define XK_F26 0xffd7 +#define XK_R6 0xffd7 +#define XK_F27 0xffd8 +#define XK_R7 0xffd8 +#define XK_F28 0xffd9 +#define XK_R8 0xffd9 +#define XK_F29 0xffda +#define XK_R9 0xffda +#define XK_F30 0xffdb +#define XK_R10 0xffdb +#define XK_F31 0xffdc +#define XK_R11 0xffdc +#define XK_F32 0xffdd +#define XK_R12 0xffdd +#define XK_F33 0xffde +#define XK_R13 0xffde +#define XK_F34 0xffdf +#define XK_R14 0xffdf +#define XK_F35 0xffe0 +#define XK_R15 0xffe0 + +/* Modifiers */ + +#define XK_Shift_L 0xffe1 /* Left shift */ +#define XK_Shift_R 0xffe2 /* Right shift */ +#define XK_Control_L 0xffe3 /* Left control */ +#define XK_Control_R 0xffe4 /* Right control */ +#define XK_Caps_Lock 0xffe5 /* Caps lock */ +#define XK_Shift_Lock 0xffe6 /* Shift lock */ + +#define XK_Meta_L 0xffe7 /* Left meta */ +#define XK_Meta_R 0xffe8 /* Right meta */ +#define XK_Alt_L 0xffe9 /* Left alt */ +#define XK_Alt_R 0xffea /* Right alt */ +#define XK_Super_L 0xffeb /* Left super */ +#define XK_Super_R 0xffec /* Right super */ +#define XK_Hyper_L 0xffed /* Left hyper */ +#define XK_Hyper_R 0xffee /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * Keyboard (XKB) Extension function and modifier keys + * (from Appendix C of "The X Keyboard Extension: Protocol Specification") + * Byte 3 = 0xfe + */ + +#ifdef XK_XKB_KEYS +#define XK_ISO_Lock 0xfe01 +#define XK_ISO_Level2_Latch 0xfe02 +#define XK_ISO_Level3_Shift 0xfe03 +#define XK_ISO_Level3_Latch 0xfe04 +#define XK_ISO_Level3_Lock 0xfe05 +#define XK_ISO_Level5_Shift 0xfe11 +#define XK_ISO_Level5_Latch 0xfe12 +#define XK_ISO_Level5_Lock 0xfe13 +#define XK_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ +#define XK_ISO_Group_Latch 0xfe06 +#define XK_ISO_Group_Lock 0xfe07 +#define XK_ISO_Next_Group 0xfe08 +#define XK_ISO_Next_Group_Lock 0xfe09 +#define XK_ISO_Prev_Group 0xfe0a +#define XK_ISO_Prev_Group_Lock 0xfe0b +#define XK_ISO_First_Group 0xfe0c +#define XK_ISO_First_Group_Lock 0xfe0d +#define XK_ISO_Last_Group 0xfe0e +#define XK_ISO_Last_Group_Lock 0xfe0f + +#define XK_ISO_Left_Tab 0xfe20 +#define XK_ISO_Move_Line_Up 0xfe21 +#define XK_ISO_Move_Line_Down 0xfe22 +#define XK_ISO_Partial_Line_Up 0xfe23 +#define XK_ISO_Partial_Line_Down 0xfe24 +#define XK_ISO_Partial_Space_Left 0xfe25 +#define XK_ISO_Partial_Space_Right 0xfe26 +#define XK_ISO_Set_Margin_Left 0xfe27 +#define XK_ISO_Set_Margin_Right 0xfe28 +#define XK_ISO_Release_Margin_Left 0xfe29 +#define XK_ISO_Release_Margin_Right 0xfe2a +#define XK_ISO_Release_Both_Margins 0xfe2b +#define XK_ISO_Fast_Cursor_Left 0xfe2c +#define XK_ISO_Fast_Cursor_Right 0xfe2d +#define XK_ISO_Fast_Cursor_Up 0xfe2e +#define XK_ISO_Fast_Cursor_Down 0xfe2f +#define XK_ISO_Continuous_Underline 0xfe30 +#define XK_ISO_Discontinuous_Underline 0xfe31 +#define XK_ISO_Emphasize 0xfe32 +#define XK_ISO_Center_Object 0xfe33 +#define XK_ISO_Enter 0xfe34 + +#define XK_dead_grave 0xfe50 +#define XK_dead_acute 0xfe51 +#define XK_dead_circumflex 0xfe52 +#define XK_dead_tilde 0xfe53 +#define XK_dead_perispomeni 0xfe53 /* alias for dead_tilde */ +#define XK_dead_macron 0xfe54 +#define XK_dead_breve 0xfe55 +#define XK_dead_abovedot 0xfe56 +#define XK_dead_diaeresis 0xfe57 +#define XK_dead_abovering 0xfe58 +#define XK_dead_doubleacute 0xfe59 +#define XK_dead_caron 0xfe5a +#define XK_dead_cedilla 0xfe5b +#define XK_dead_ogonek 0xfe5c +#define XK_dead_iota 0xfe5d +#define XK_dead_voiced_sound 0xfe5e +#define XK_dead_semivoiced_sound 0xfe5f +#define XK_dead_belowdot 0xfe60 +#define XK_dead_hook 0xfe61 +#define XK_dead_horn 0xfe62 +#define XK_dead_stroke 0xfe63 +#define XK_dead_abovecomma 0xfe64 +#define XK_dead_psili 0xfe64 /* alias for dead_abovecomma */ +#define XK_dead_abovereversedcomma 0xfe65 +#define XK_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ +#define XK_dead_doublegrave 0xfe66 +#define XK_dead_belowring 0xfe67 +#define XK_dead_belowmacron 0xfe68 +#define XK_dead_belowcircumflex 0xfe69 +#define XK_dead_belowtilde 0xfe6a +#define XK_dead_belowbreve 0xfe6b +#define XK_dead_belowdiaeresis 0xfe6c +#define XK_dead_invertedbreve 0xfe6d +#define XK_dead_belowcomma 0xfe6e +#define XK_dead_currency 0xfe6f + +/* extra dead elements for German T3 layout */ +#define XK_dead_lowline 0xfe90 +#define XK_dead_aboveverticalline 0xfe91 +#define XK_dead_belowverticalline 0xfe92 +#define XK_dead_longsolidusoverlay 0xfe93 + +/* dead vowels for universal syllable entry */ +#define XK_dead_a 0xfe80 +#define XK_dead_A 0xfe81 +#define XK_dead_e 0xfe82 +#define XK_dead_E 0xfe83 +#define XK_dead_i 0xfe84 +#define XK_dead_I 0xfe85 +#define XK_dead_o 0xfe86 +#define XK_dead_O 0xfe87 +#define XK_dead_u 0xfe88 +#define XK_dead_U 0xfe89 +#define XK_dead_small_schwa 0xfe8a +#define XK_dead_capital_schwa 0xfe8b + +#define XK_dead_greek 0xfe8c + +#define XK_First_Virtual_Screen 0xfed0 +#define XK_Prev_Virtual_Screen 0xfed1 +#define XK_Next_Virtual_Screen 0xfed2 +#define XK_Last_Virtual_Screen 0xfed4 +#define XK_Terminate_Server 0xfed5 + +#define XK_AccessX_Enable 0xfe70 +#define XK_AccessX_Feedback_Enable 0xfe71 +#define XK_RepeatKeys_Enable 0xfe72 +#define XK_SlowKeys_Enable 0xfe73 +#define XK_BounceKeys_Enable 0xfe74 +#define XK_StickyKeys_Enable 0xfe75 +#define XK_MouseKeys_Enable 0xfe76 +#define XK_MouseKeys_Accel_Enable 0xfe77 +#define XK_Overlay1_Enable 0xfe78 +#define XK_Overlay2_Enable 0xfe79 +#define XK_AudibleBell_Enable 0xfe7a + +#define XK_Pointer_Left 0xfee0 +#define XK_Pointer_Right 0xfee1 +#define XK_Pointer_Up 0xfee2 +#define XK_Pointer_Down 0xfee3 +#define XK_Pointer_UpLeft 0xfee4 +#define XK_Pointer_UpRight 0xfee5 +#define XK_Pointer_DownLeft 0xfee6 +#define XK_Pointer_DownRight 0xfee7 +#define XK_Pointer_Button_Dflt 0xfee8 +#define XK_Pointer_Button1 0xfee9 +#define XK_Pointer_Button2 0xfeea +#define XK_Pointer_Button3 0xfeeb +#define XK_Pointer_Button4 0xfeec +#define XK_Pointer_Button5 0xfeed +#define XK_Pointer_DblClick_Dflt 0xfeee +#define XK_Pointer_DblClick1 0xfeef +#define XK_Pointer_DblClick2 0xfef0 +#define XK_Pointer_DblClick3 0xfef1 +#define XK_Pointer_DblClick4 0xfef2 +#define XK_Pointer_DblClick5 0xfef3 +#define XK_Pointer_Drag_Dflt 0xfef4 +#define XK_Pointer_Drag1 0xfef5 +#define XK_Pointer_Drag2 0xfef6 +#define XK_Pointer_Drag3 0xfef7 +#define XK_Pointer_Drag4 0xfef8 +#define XK_Pointer_Drag5 0xfefd + +#define XK_Pointer_EnableKeys 0xfef9 +#define XK_Pointer_Accelerate 0xfefa +#define XK_Pointer_DfltBtnNext 0xfefb +#define XK_Pointer_DfltBtnPrev 0xfefc + +/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */ + +#define XK_ch 0xfea0 +#define XK_Ch 0xfea1 +#define XK_CH 0xfea2 +#define XK_c_h 0xfea3 +#define XK_C_h 0xfea4 +#define XK_C_H 0xfea5 + +#endif /* XK_XKB_KEYS */ + +/* + * 3270 Terminal Keys + * Byte 3 = 0xfd + */ + +#ifdef XK_3270 +#define XK_3270_Duplicate 0xfd01 +#define XK_3270_FieldMark 0xfd02 +#define XK_3270_Right2 0xfd03 +#define XK_3270_Left2 0xfd04 +#define XK_3270_BackTab 0xfd05 +#define XK_3270_EraseEOF 0xfd06 +#define XK_3270_EraseInput 0xfd07 +#define XK_3270_Reset 0xfd08 +#define XK_3270_Quit 0xfd09 +#define XK_3270_PA1 0xfd0a +#define XK_3270_PA2 0xfd0b +#define XK_3270_PA3 0xfd0c +#define XK_3270_Test 0xfd0d +#define XK_3270_Attn 0xfd0e +#define XK_3270_CursorBlink 0xfd0f +#define XK_3270_AltCursor 0xfd10 +#define XK_3270_KeyClick 0xfd11 +#define XK_3270_Jump 0xfd12 +#define XK_3270_Ident 0xfd13 +#define XK_3270_Rule 0xfd14 +#define XK_3270_Copy 0xfd15 +#define XK_3270_Play 0xfd16 +#define XK_3270_Setup 0xfd17 +#define XK_3270_Record 0xfd18 +#define XK_3270_ChangeScreen 0xfd19 +#define XK_3270_DeleteWord 0xfd1a +#define XK_3270_ExSelect 0xfd1b +#define XK_3270_CursorSelect 0xfd1c +#define XK_3270_PrintScreen 0xfd1d +#define XK_3270_Enter 0xfd1e +#endif /* XK_3270 */ + +/* + * Latin 1 + * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) + * Byte 3 = 0 + */ +#ifdef XK_LATIN1 +#define XK_space 0x0020 /* U+0020 SPACE */ +#define XK_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ +#define XK_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ +#define XK_numbersign 0x0023 /* U+0023 NUMBER SIGN */ +#define XK_dollar 0x0024 /* U+0024 DOLLAR SIGN */ +#define XK_percent 0x0025 /* U+0025 PERCENT SIGN */ +#define XK_ampersand 0x0026 /* U+0026 AMPERSAND */ +#define XK_apostrophe 0x0027 /* U+0027 APOSTROPHE */ +#define XK_quoteright 0x0027 /* deprecated */ +#define XK_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ +#define XK_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ +#define XK_asterisk 0x002a /* U+002A ASTERISK */ +#define XK_plus 0x002b /* U+002B PLUS SIGN */ +#define XK_comma 0x002c /* U+002C COMMA */ +#define XK_minus 0x002d /* U+002D HYPHEN-MINUS */ +#define XK_period 0x002e /* U+002E FULL STOP */ +#define XK_slash 0x002f /* U+002F SOLIDUS */ +#define XK_0 0x0030 /* U+0030 DIGIT ZERO */ +#define XK_1 0x0031 /* U+0031 DIGIT ONE */ +#define XK_2 0x0032 /* U+0032 DIGIT TWO */ +#define XK_3 0x0033 /* U+0033 DIGIT THREE */ +#define XK_4 0x0034 /* U+0034 DIGIT FOUR */ +#define XK_5 0x0035 /* U+0035 DIGIT FIVE */ +#define XK_6 0x0036 /* U+0036 DIGIT SIX */ +#define XK_7 0x0037 /* U+0037 DIGIT SEVEN */ +#define XK_8 0x0038 /* U+0038 DIGIT EIGHT */ +#define XK_9 0x0039 /* U+0039 DIGIT NINE */ +#define XK_colon 0x003a /* U+003A COLON */ +#define XK_semicolon 0x003b /* U+003B SEMICOLON */ +#define XK_less 0x003c /* U+003C LESS-THAN SIGN */ +#define XK_equal 0x003d /* U+003D EQUALS SIGN */ +#define XK_greater 0x003e /* U+003E GREATER-THAN SIGN */ +#define XK_question 0x003f /* U+003F QUESTION MARK */ +#define XK_at 0x0040 /* U+0040 COMMERCIAL AT */ +#define XK_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ +#define XK_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ +#define XK_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ +#define XK_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ +#define XK_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ +#define XK_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ +#define XK_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ +#define XK_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ +#define XK_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ +#define XK_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ +#define XK_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ +#define XK_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ +#define XK_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ +#define XK_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ +#define XK_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ +#define XK_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ +#define XK_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ +#define XK_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ +#define XK_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ +#define XK_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ +#define XK_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ +#define XK_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ +#define XK_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ +#define XK_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ +#define XK_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ +#define XK_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ +#define XK_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ +#define XK_backslash 0x005c /* U+005C REVERSE SOLIDUS */ +#define XK_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ +#define XK_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ +#define XK_underscore 0x005f /* U+005F LOW LINE */ +#define XK_grave 0x0060 /* U+0060 GRAVE ACCENT */ +#define XK_quoteleft 0x0060 /* deprecated */ +#define XK_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ +#define XK_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ +#define XK_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ +#define XK_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ +#define XK_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ +#define XK_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ +#define XK_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ +#define XK_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ +#define XK_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ +#define XK_j 0x006a /* U+006A LATIN SMALL LETTER J */ +#define XK_k 0x006b /* U+006B LATIN SMALL LETTER K */ +#define XK_l 0x006c /* U+006C LATIN SMALL LETTER L */ +#define XK_m 0x006d /* U+006D LATIN SMALL LETTER M */ +#define XK_n 0x006e /* U+006E LATIN SMALL LETTER N */ +#define XK_o 0x006f /* U+006F LATIN SMALL LETTER O */ +#define XK_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ +#define XK_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ +#define XK_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ +#define XK_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ +#define XK_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ +#define XK_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ +#define XK_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ +#define XK_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ +#define XK_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ +#define XK_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ +#define XK_z 0x007a /* U+007A LATIN SMALL LETTER Z */ +#define XK_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ +#define XK_bar 0x007c /* U+007C VERTICAL LINE */ +#define XK_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ +#define XK_asciitilde 0x007e /* U+007E TILDE */ + +#define XK_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ +#define XK_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ +#define XK_cent 0x00a2 /* U+00A2 CENT SIGN */ +#define XK_sterling 0x00a3 /* U+00A3 POUND SIGN */ +#define XK_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ +#define XK_yen 0x00a5 /* U+00A5 YEN SIGN */ +#define XK_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ +#define XK_section 0x00a7 /* U+00A7 SECTION SIGN */ +#define XK_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ +#define XK_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ +#define XK_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ +#define XK_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XK_notsign 0x00ac /* U+00AC NOT SIGN */ +#define XK_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ +#define XK_registered 0x00ae /* U+00AE REGISTERED SIGN */ +#define XK_macron 0x00af /* U+00AF MACRON */ +#define XK_degree 0x00b0 /* U+00B0 DEGREE SIGN */ +#define XK_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ +#define XK_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ +#define XK_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ +#define XK_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ +#define XK_mu 0x00b5 /* U+00B5 MICRO SIGN */ +#define XK_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ +#define XK_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ +#define XK_cedilla 0x00b8 /* U+00B8 CEDILLA */ +#define XK_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ +#define XK_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ +#define XK_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XK_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ +#define XK_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ +#define XK_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ +#define XK_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ +#define XK_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ +#define XK_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ +#define XK_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ +#define XK_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ +#define XK_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ +#define XK_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ +#define XK_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ +#define XK_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ +#define XK_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ +#define XK_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ +#define XK_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ +#define XK_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ +#define XK_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ +#define XK_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ +#define XK_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ +#define XK_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ +#define XK_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ +#define XK_Eth 0x00d0 /* deprecated */ +#define XK_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ +#define XK_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ +#define XK_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ +#define XK_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ +#define XK_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ +#define XK_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ +#define XK_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ +#define XK_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XK_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XK_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ +#define XK_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ +#define XK_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ +#define XK_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ +#define XK_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ +#define XK_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ +#define XK_Thorn 0x00de /* deprecated */ +#define XK_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ +#define XK_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ +#define XK_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ +#define XK_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ +#define XK_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ +#define XK_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ +#define XK_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ +#define XK_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ +#define XK_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ +#define XK_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ +#define XK_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ +#define XK_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ +#define XK_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ +#define XK_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ +#define XK_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ +#define XK_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ +#define XK_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ +#define XK_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ +#define XK_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ +#define XK_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ +#define XK_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ +#define XK_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ +#define XK_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ +#define XK_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ +#define XK_division 0x00f7 /* U+00F7 DIVISION SIGN */ +#define XK_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XK_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XK_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ +#define XK_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ +#define XK_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ +#define XK_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ +#define XK_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ +#define XK_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ +#define XK_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#ifdef XK_LATIN2 +#define XK_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ +#define XK_breve 0x01a2 /* U+02D8 BREVE */ +#define XK_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ +#define XK_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ +#define XK_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ +#define XK_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ +#define XK_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ +#define XK_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ +#define XK_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ +#define XK_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ +#define XK_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ +#define XK_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ +#define XK_ogonek 0x01b2 /* U+02DB OGONEK */ +#define XK_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ +#define XK_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ +#define XK_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ +#define XK_caron 0x01b7 /* U+02C7 CARON */ +#define XK_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ +#define XK_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ +#define XK_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ +#define XK_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ +#define XK_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ +#define XK_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ +#define XK_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ +#define XK_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ +#define XK_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ +#define XK_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ +#define XK_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ +#define XK_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ +#define XK_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ +#define XK_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ +#define XK_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ +#define XK_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ +#define XK_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ +#define XK_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ +#define XK_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ +#define XK_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ +#define XK_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ +#define XK_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ +#define XK_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ +#define XK_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ +#define XK_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ +#define XK_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ +#define XK_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ +#define XK_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ +#define XK_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ +#define XK_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ +#define XK_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ +#define XK_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ +#define XK_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ +#define XK_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ +#define XK_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ +#define XK_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ +#define XK_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ +#define XK_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ +#define XK_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ +#define XK_abovedot 0x01ff /* U+02D9 DOT ABOVE */ +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#ifdef XK_LATIN3 +#define XK_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ +#define XK_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ +#define XK_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ +#define XK_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ +#define XK_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ +#define XK_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ +#define XK_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ +#define XK_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ +#define XK_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ +#define XK_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ +#define XK_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ +#define XK_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ +#define XK_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ +#define XK_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ +#define XK_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ +#define XK_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ +#define XK_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ +#define XK_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ +#define XK_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ +#define XK_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ +#define XK_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ +#define XK_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#ifdef XK_LATIN4 +#define XK_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ +#define XK_kappa 0x03a2 /* deprecated */ +#define XK_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ +#define XK_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ +#define XK_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ +#define XK_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ +#define XK_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ +#define XK_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ +#define XK_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ +#define XK_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ +#define XK_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ +#define XK_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ +#define XK_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ +#define XK_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ +#define XK_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ +#define XK_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ +#define XK_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ +#define XK_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ +#define XK_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ +#define XK_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ +#define XK_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ +#define XK_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ +#define XK_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ +#define XK_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ +#define XK_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ +#define XK_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ +#define XK_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ +#define XK_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ +#define XK_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ +#define XK_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ +#define XK_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ +#define XK_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ +#define XK_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ +#define XK_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ +#define XK_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ +#define XK_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ +#endif /* XK_LATIN4 */ + +/* + * Latin 8 + */ +#ifdef XK_LATIN8 +#define XK_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ +#define XK_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ +#define XK_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ +#define XK_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ +#define XK_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ +#define XK_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ +#define XK_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ +#define XK_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ +#define XK_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ +#define XK_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ +#define XK_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ +#define XK_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ +#define XK_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ +#define XK_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ +#define XK_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ +#define XK_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ +#define XK_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ +#define XK_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ +#define XK_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ +#define XK_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ +#define XK_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ +#define XK_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ +#define XK_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ +#define XK_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ +#define XK_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ +#define XK_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ +#endif /* XK_LATIN8 */ + +/* + * Latin 9 + * Byte 3 = 0x13 + */ + +#ifdef XK_LATIN9 +#define XK_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ +#define XK_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ +#define XK_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ +#endif /* XK_LATIN9 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#ifdef XK_KATAKANA +#define XK_overline 0x047e /* U+203E OVERLINE */ +#define XK_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ +#define XK_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ +#define XK_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ +#define XK_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ +#define XK_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ +#define XK_kana_middledot 0x04a5 /* deprecated */ +#define XK_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ +#define XK_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ +#define XK_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ +#define XK_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ +#define XK_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ +#define XK_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ +#define XK_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ +#define XK_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ +#define XK_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ +#define XK_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ +#define XK_kana_tu 0x04af /* deprecated */ +#define XK_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ +#define XK_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ +#define XK_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ +#define XK_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ +#define XK_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ +#define XK_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ +#define XK_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ +#define XK_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ +#define XK_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ +#define XK_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ +#define XK_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ +#define XK_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ +#define XK_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ +#define XK_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ +#define XK_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ +#define XK_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ +#define XK_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ +#define XK_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ +#define XK_kana_TI 0x04c1 /* deprecated */ +#define XK_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ +#define XK_kana_TU 0x04c2 /* deprecated */ +#define XK_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ +#define XK_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ +#define XK_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ +#define XK_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ +#define XK_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ +#define XK_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ +#define XK_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ +#define XK_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ +#define XK_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ +#define XK_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ +#define XK_kana_HU 0x04cc /* deprecated */ +#define XK_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ +#define XK_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ +#define XK_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ +#define XK_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ +#define XK_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ +#define XK_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ +#define XK_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ +#define XK_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ +#define XK_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ +#define XK_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ +#define XK_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ +#define XK_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ +#define XK_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ +#define XK_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ +#define XK_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ +#define XK_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ +#define XK_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ +#define XK_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ +#define XK_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ +#define XK_kana_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#ifdef XK_ARABIC +#define XK_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ +#define XK_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ +#define XK_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ +#define XK_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ +#define XK_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ +#define XK_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ +#define XK_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ +#define XK_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ +#define XK_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ +#define XK_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ +#define XK_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ +#define XK_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ +#define XK_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ +#define XK_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ +#define XK_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ +#define XK_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ +#define XK_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ +#define XK_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ +#define XK_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ +#define XK_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ +#define XK_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ +#define XK_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ +#define XK_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ +#define XK_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ +#define XK_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ +#define XK_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ +#define XK_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ +#define XK_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ +#define XK_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ +#define XK_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ +#define XK_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ +#define XK_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ +#define XK_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ +#define XK_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ +#define XK_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ +#define XK_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ +#define XK_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ +#define XK_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ +#define XK_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ +#define XK_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ +#define XK_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ +#define XK_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ +#define XK_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ +#define XK_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ +#define XK_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ +#define XK_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ +#define XK_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ +#define XK_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ +#define XK_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ +#define XK_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ +#define XK_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ +#define XK_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ +#define XK_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ +#define XK_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ +#define XK_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ +#define XK_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ +#define XK_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ +#define XK_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ +#define XK_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ +#define XK_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ +#define XK_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ +#define XK_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ +#define XK_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ +#define XK_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ +#define XK_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ +#define XK_Arabic_heh 0x05e7 /* deprecated */ +#define XK_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ +#define XK_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ +#define XK_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ +#define XK_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ +#define XK_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ +#define XK_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ +#define XK_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ +#define XK_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ +#define XK_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ +#define XK_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ +#define XK_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ +#define XK_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ +#define XK_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ +#define XK_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ +#define XK_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ +#define XK_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ +#define XK_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ +#define XK_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ +#define XK_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ +#define XK_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ +#define XK_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XK_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XK_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ +#define XK_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ +#define XK_Arabic_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#ifdef XK_CYRILLIC +#define XK_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ +#define XK_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ +#define XK_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ +#define XK_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ +#define XK_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ +#define XK_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ +#define XK_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ +#define XK_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ +#define XK_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ +#define XK_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ +#define XK_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ +#define XK_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ +#define XK_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ +#define XK_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ +#define XK_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ +#define XK_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ +#define XK_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ +#define XK_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ +#define XK_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ +#define XK_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ +#define XK_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ +#define XK_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ + +#define XK_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ +#define XK_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ +#define XK_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ +#define XK_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ +#define XK_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ +#define XK_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ +#define XK_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ +#define XK_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ + +#define XK_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ +#define XK_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ +#define XK_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ +#define XK_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ +#define XK_Ukranian_je 0x06a4 /* deprecated */ +#define XK_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ +#define XK_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XK_Ukranian_i 0x06a6 /* deprecated */ +#define XK_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ +#define XK_Ukranian_yi 0x06a7 /* deprecated */ +#define XK_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ +#define XK_Serbian_je 0x06a8 /* deprecated */ +#define XK_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ +#define XK_Serbian_lje 0x06a9 /* deprecated */ +#define XK_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ +#define XK_Serbian_nje 0x06aa /* deprecated */ +#define XK_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ +#define XK_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ +#define XK_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ +#define XK_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ +#define XK_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ +#define XK_Serbian_dze 0x06af /* deprecated */ +#define XK_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ +#define XK_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ +#define XK_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ +#define XK_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ +#define XK_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ +#define XK_Ukranian_JE 0x06b4 /* deprecated */ +#define XK_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ +#define XK_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XK_Ukranian_I 0x06b6 /* deprecated */ +#define XK_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ +#define XK_Ukranian_YI 0x06b7 /* deprecated */ +#define XK_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ +#define XK_Serbian_JE 0x06b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ +#define XK_Serbian_LJE 0x06b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ +#define XK_Serbian_NJE 0x06ba /* deprecated */ +#define XK_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ +#define XK_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ +#define XK_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ +#define XK_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ +#define XK_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ +#define XK_Serbian_DZE 0x06bf /* deprecated */ +#define XK_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ +#define XK_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ +#define XK_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ +#define XK_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ +#define XK_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ +#define XK_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ +#define XK_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ +#define XK_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ +#define XK_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ +#define XK_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ +#define XK_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ +#define XK_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ +#define XK_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ +#define XK_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ +#define XK_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ +#define XK_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ +#define XK_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ +#define XK_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ +#define XK_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ +#define XK_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ +#define XK_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ +#define XK_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ +#define XK_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ +#define XK_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ +#define XK_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ +#define XK_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ +#define XK_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ +#define XK_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ +#define XK_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ +#define XK_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ +#define XK_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ +#define XK_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ +#define XK_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ +#define XK_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ +#define XK_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ +#define XK_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ +#define XK_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ +#define XK_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ +#define XK_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ +#define XK_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ +#define XK_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ +#define XK_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ +#define XK_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ +#define XK_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ +#define XK_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ +#define XK_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ +#define XK_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ +#define XK_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ +#define XK_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ +#define XK_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ +#define XK_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ +#define XK_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ +#define XK_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ +#define XK_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ +#define XK_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ +#define XK_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ +#define XK_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ +#define XK_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ +#define XK_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ +#define XK_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ +#define XK_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ +#define XK_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ +#define XK_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ +#define XK_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ +#endif /* XK_CYRILLIC */ + +/* + * Greek + * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) + * Byte 3 = 7 + */ + +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ +#define XK_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ +#define XK_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ +#define XK_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ +#define XK_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ +#define XK_Greek_IOTAdiaeresis 0x07a5 /* old typo */ +#define XK_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ +#define XK_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ +#define XK_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ +#define XK_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ +#define XK_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ +#define XK_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ +#define XK_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ +#define XK_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ +#define XK_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ +#define XK_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ +#define XK_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ +#define XK_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ +#define XK_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ +#define XK_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ +#define XK_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ +#define XK_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ +#define XK_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ +#define XK_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ +#define XK_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ +#define XK_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ +#define XK_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ +#define XK_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ +#define XK_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ +#define XK_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ +#define XK_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ +#define XK_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ +#define XK_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ +#define XK_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XK_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XK_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ +#define XK_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ +#define XK_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ +#define XK_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ +#define XK_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ +#define XK_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ +#define XK_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ +#define XK_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ +#define XK_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ +#define XK_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ +#define XK_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ +#define XK_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ +#define XK_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ +#define XK_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ +#define XK_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ +#define XK_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ +#define XK_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ +#define XK_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ +#define XK_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ +#define XK_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ +#define XK_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ +#define XK_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ +#define XK_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ +#define XK_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XK_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XK_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ +#define XK_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ +#define XK_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ +#define XK_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ +#define XK_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ +#define XK_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ +#define XK_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ +#define XK_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ +#define XK_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ +#define XK_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ +#define XK_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ +#define XK_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ +#define XK_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ +#define XK_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ +#define XK_Greek_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) + * Byte 3 = 8 + */ + +#ifdef XK_TECHNICAL +#define XK_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ +#define XK_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ +#define XK_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ +#define XK_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ +#define XK_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ +#define XK_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ +#define XK_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ +#define XK_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ +#define XK_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ +#define XK_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ +#define XK_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ +#define XK_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ +#define XK_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ +#define XK_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ +#define XK_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ +#define XK_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ +#define XK_topleftsummation 0x08b1 +#define XK_botleftsummation 0x08b2 +#define XK_topvertsummationconnector 0x08b3 +#define XK_botvertsummationconnector 0x08b4 +#define XK_toprightsummation 0x08b5 +#define XK_botrightsummation 0x08b6 +#define XK_rightmiddlesummation 0x08b7 +#define XK_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ +#define XK_notequal 0x08bd /* U+2260 NOT EQUAL TO */ +#define XK_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ +#define XK_integral 0x08bf /* U+222B INTEGRAL */ +#define XK_therefore 0x08c0 /* U+2234 THEREFORE */ +#define XK_variation 0x08c1 /* U+221D PROPORTIONAL TO */ +#define XK_infinity 0x08c2 /* U+221E INFINITY */ +#define XK_nabla 0x08c5 /* U+2207 NABLA */ +#define XK_approximate 0x08c8 /* U+223C TILDE OPERATOR */ +#define XK_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ +#define XK_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ +#define XK_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ +#define XK_identical 0x08cf /* U+2261 IDENTICAL TO */ +#define XK_radical 0x08d6 /* U+221A SQUARE ROOT */ +#define XK_includedin 0x08da /* U+2282 SUBSET OF */ +#define XK_includes 0x08db /* U+2283 SUPERSET OF */ +#define XK_intersection 0x08dc /* U+2229 INTERSECTION */ +#define XK_union 0x08dd /* U+222A UNION */ +#define XK_logicaland 0x08de /* U+2227 LOGICAL AND */ +#define XK_logicalor 0x08df /* U+2228 LOGICAL OR */ +#define XK_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ +#define XK_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ +#define XK_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ +#define XK_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ +#define XK_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ +#define XK_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ +#endif /* XK_TECHNICAL */ + +/* + * Special + * (from the DEC VT100 Special Graphics Character Set) + * Byte 3 = 9 + */ + +#ifdef XK_SPECIAL +#define XK_blank 0x09df +#define XK_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ +#define XK_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ +#define XK_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ +#define XK_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ +#define XK_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ +#define XK_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ +#define XK_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ +#define XK_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ +#define XK_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ +#define XK_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ +#define XK_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ +#define XK_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ +#define XK_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ +#define XK_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ +#define XK_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ +#define XK_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ +#define XK_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ +#define XK_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ +#define XK_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ +#define XK_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ +#define XK_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ +#define XK_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ +#define XK_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ +#endif /* XK_SPECIAL */ + +/* + * Publishing + * (these are probably from a long forgotten DEC Publishing + * font that once shipped with DECwrite) + * Byte 3 = 0x0a + */ + +#ifdef XK_PUBLISHING +#define XK_emspace 0x0aa1 /* U+2003 EM SPACE */ +#define XK_enspace 0x0aa2 /* U+2002 EN SPACE */ +#define XK_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ +#define XK_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ +#define XK_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ +#define XK_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ +#define XK_thinspace 0x0aa7 /* U+2009 THIN SPACE */ +#define XK_hairspace 0x0aa8 /* U+200A HAIR SPACE */ +#define XK_emdash 0x0aa9 /* U+2014 EM DASH */ +#define XK_endash 0x0aaa /* U+2013 EN DASH */ +#define XK_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ +#define XK_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ +#define XK_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ +#define XK_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ +#define XK_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ +#define XK_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ +#define XK_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ +#define XK_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ +#define XK_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ +#define XK_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ +#define XK_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ +#define XK_careof 0x0ab8 /* U+2105 CARE OF */ +#define XK_figdash 0x0abb /* U+2012 FIGURE DASH */ +#define XK_leftanglebracket 0x0abc /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ +#define XK_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ +#define XK_rightanglebracket 0x0abe /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ +#define XK_marker 0x0abf +#define XK_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ +#define XK_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ +#define XK_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ +#define XK_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ +#define XK_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ +#define XK_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ +#define XK_trademarkincircle 0x0acb +#define XK_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ +#define XK_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ +#define XK_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ +#define XK_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ +#define XK_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ +#define XK_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ +#define XK_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ +#define XK_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ +#define XK_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ +#define XK_permille 0x0ad5 /* U+2030 PER MILLE SIGN */ +#define XK_minutes 0x0ad6 /* U+2032 PRIME */ +#define XK_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ +#define XK_latincross 0x0ad9 /* U+271D LATIN CROSS */ +#define XK_hexagram 0x0ada +#define XK_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ +#define XK_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ +#define XK_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ +#define XK_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ +#define XK_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ +#define XK_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ +#define XK_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ +#define XK_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ +#define XK_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ +#define XK_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ +#define XK_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ +#define XK_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ +#define XK_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ +#define XK_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ +#define XK_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ +#define XK_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ +#define XK_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ +#define XK_club 0x0aec /* U+2663 BLACK CLUB SUIT */ +#define XK_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ +#define XK_heart 0x0aee /* U+2665 BLACK HEART SUIT */ +#define XK_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ +#define XK_dagger 0x0af1 /* U+2020 DAGGER */ +#define XK_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ +#define XK_checkmark 0x0af3 /* U+2713 CHECK MARK */ +#define XK_ballotcross 0x0af4 /* U+2717 BALLOT X */ +#define XK_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ +#define XK_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ +#define XK_malesymbol 0x0af7 /* U+2642 MALE SIGN */ +#define XK_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ +#define XK_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ +#define XK_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ +#define XK_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ +#define XK_caret 0x0afc /* U+2038 CARET */ +#define XK_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ +#define XK_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ +#define XK_cursor 0x0aff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = 0x0b + */ + +#ifdef XK_APL +#define XK_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ +#define XK_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ +#define XK_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ +#define XK_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ +#define XK_overbar 0x0bc0 /*(U+00AF MACRON)*/ +#define XK_downtack 0x0bc2 /* U+22A4 DOWN TACK */ +#define XK_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ +#define XK_downstile 0x0bc4 /* U+230A LEFT FLOOR */ +#define XK_underbar 0x0bc6 /*(U+005F LOW LINE)*/ +#define XK_jot 0x0bca /* U+2218 RING OPERATOR */ +#define XK_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ +#define XK_uptack 0x0bce /* U+22A5 UP TACK */ +#define XK_circle 0x0bcf /* U+25CB WHITE CIRCLE */ +#define XK_upstile 0x0bd3 /* U+2308 LEFT CEILING */ +#define XK_downshoe 0x0bd6 /*(U+222A UNION)*/ +#define XK_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ +#define XK_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ +#define XK_lefttack 0x0bdc /* U+22A3 LEFT TACK */ +#define XK_righttack 0x0bfc /* U+22A2 RIGHT TACK */ +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = 0x0c + */ + +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ +#define XK_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ +#define XK_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ +#define XK_hebrew_beth 0x0ce1 /* deprecated */ +#define XK_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ +#define XK_hebrew_gimmel 0x0ce2 /* deprecated */ +#define XK_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ +#define XK_hebrew_daleth 0x0ce3 /* deprecated */ +#define XK_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ +#define XK_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ +#define XK_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ +#define XK_hebrew_zayin 0x0ce6 /* deprecated */ +#define XK_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ +#define XK_hebrew_het 0x0ce7 /* deprecated */ +#define XK_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ +#define XK_hebrew_teth 0x0ce8 /* deprecated */ +#define XK_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ +#define XK_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ +#define XK_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ +#define XK_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ +#define XK_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ +#define XK_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ +#define XK_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ +#define XK_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ +#define XK_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ +#define XK_hebrew_samekh 0x0cf1 /* deprecated */ +#define XK_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ +#define XK_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ +#define XK_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ +#define XK_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ +#define XK_hebrew_finalzadi 0x0cf5 /* deprecated */ +#define XK_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ +#define XK_hebrew_zadi 0x0cf6 /* deprecated */ +#define XK_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ +#define XK_hebrew_kuf 0x0cf7 /* deprecated */ +#define XK_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ +#define XK_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ +#define XK_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ +#define XK_hebrew_taf 0x0cfa /* deprecated */ +#define XK_Hebrew_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + +/* + * Thai + * Byte 3 = 0x0d + */ + +#ifdef XK_THAI +#define XK_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ +#define XK_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ +#define XK_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ +#define XK_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ +#define XK_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ +#define XK_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ +#define XK_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ +#define XK_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ +#define XK_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ +#define XK_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ +#define XK_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ +#define XK_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ +#define XK_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ +#define XK_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ +#define XK_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ +#define XK_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ +#define XK_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ +#define XK_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ +#define XK_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ +#define XK_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ +#define XK_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ +#define XK_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ +#define XK_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ +#define XK_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ +#define XK_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ +#define XK_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ +#define XK_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ +#define XK_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ +#define XK_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ +#define XK_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ +#define XK_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ +#define XK_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ +#define XK_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ +#define XK_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ +#define XK_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ +#define XK_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ +#define XK_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ +#define XK_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ +#define XK_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ +#define XK_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ +#define XK_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ +#define XK_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ +#define XK_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ +#define XK_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ +#define XK_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ +#define XK_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ +#define XK_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ +#define XK_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ +#define XK_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ +#define XK_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ +#define XK_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ +#define XK_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ +#define XK_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ +#define XK_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ +#define XK_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ +#define XK_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ +#define XK_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ +#define XK_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ +#define XK_Thai_maihanakat_maitho 0x0dde +#define XK_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ +#define XK_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ +#define XK_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ +#define XK_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ +#define XK_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ +#define XK_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ +#define XK_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ +#define XK_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ +#define XK_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ +#define XK_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ +#define XK_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ +#define XK_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ +#define XK_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ +#define XK_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ +#define XK_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ +#define XK_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ +#define XK_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ +#define XK_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ +#define XK_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ +#define XK_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ +#define XK_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ +#define XK_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ +#define XK_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ +#define XK_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ +#define XK_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ +#endif /* XK_THAI */ + +/* + * Korean + * Byte 3 = 0x0e + */ + +#ifdef XK_KOREAN + +#define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */ +#define XK_Hangul_Start 0xff32 /* Hangul start */ +#define XK_Hangul_End 0xff33 /* Hangul end, English start */ +#define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ +#define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ +#define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ +#define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */ +#define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */ +#define XK_Hangul_Banja 0xff39 /* Banja mode */ +#define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ +#define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ +#define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */ +#define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ +#define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ +#define XK_Hangul_Special 0xff3f /* Special symbols */ +#define XK_Hangul_switch 0xff7e /* Alias for mode_switch */ + +/* Hangul Consonant Characters */ +#define XK_Hangul_Kiyeog 0x0ea1 +#define XK_Hangul_SsangKiyeog 0x0ea2 +#define XK_Hangul_KiyeogSios 0x0ea3 +#define XK_Hangul_Nieun 0x0ea4 +#define XK_Hangul_NieunJieuj 0x0ea5 +#define XK_Hangul_NieunHieuh 0x0ea6 +#define XK_Hangul_Dikeud 0x0ea7 +#define XK_Hangul_SsangDikeud 0x0ea8 +#define XK_Hangul_Rieul 0x0ea9 +#define XK_Hangul_RieulKiyeog 0x0eaa +#define XK_Hangul_RieulMieum 0x0eab +#define XK_Hangul_RieulPieub 0x0eac +#define XK_Hangul_RieulSios 0x0ead +#define XK_Hangul_RieulTieut 0x0eae +#define XK_Hangul_RieulPhieuf 0x0eaf +#define XK_Hangul_RieulHieuh 0x0eb0 +#define XK_Hangul_Mieum 0x0eb1 +#define XK_Hangul_Pieub 0x0eb2 +#define XK_Hangul_SsangPieub 0x0eb3 +#define XK_Hangul_PieubSios 0x0eb4 +#define XK_Hangul_Sios 0x0eb5 +#define XK_Hangul_SsangSios 0x0eb6 +#define XK_Hangul_Ieung 0x0eb7 +#define XK_Hangul_Jieuj 0x0eb8 +#define XK_Hangul_SsangJieuj 0x0eb9 +#define XK_Hangul_Cieuc 0x0eba +#define XK_Hangul_Khieuq 0x0ebb +#define XK_Hangul_Tieut 0x0ebc +#define XK_Hangul_Phieuf 0x0ebd +#define XK_Hangul_Hieuh 0x0ebe + +/* Hangul Vowel Characters */ +#define XK_Hangul_A 0x0ebf +#define XK_Hangul_AE 0x0ec0 +#define XK_Hangul_YA 0x0ec1 +#define XK_Hangul_YAE 0x0ec2 +#define XK_Hangul_EO 0x0ec3 +#define XK_Hangul_E 0x0ec4 +#define XK_Hangul_YEO 0x0ec5 +#define XK_Hangul_YE 0x0ec6 +#define XK_Hangul_O 0x0ec7 +#define XK_Hangul_WA 0x0ec8 +#define XK_Hangul_WAE 0x0ec9 +#define XK_Hangul_OE 0x0eca +#define XK_Hangul_YO 0x0ecb +#define XK_Hangul_U 0x0ecc +#define XK_Hangul_WEO 0x0ecd +#define XK_Hangul_WE 0x0ece +#define XK_Hangul_WI 0x0ecf +#define XK_Hangul_YU 0x0ed0 +#define XK_Hangul_EU 0x0ed1 +#define XK_Hangul_YI 0x0ed2 +#define XK_Hangul_I 0x0ed3 + +/* Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_Kiyeog 0x0ed4 +#define XK_Hangul_J_SsangKiyeog 0x0ed5 +#define XK_Hangul_J_KiyeogSios 0x0ed6 +#define XK_Hangul_J_Nieun 0x0ed7 +#define XK_Hangul_J_NieunJieuj 0x0ed8 +#define XK_Hangul_J_NieunHieuh 0x0ed9 +#define XK_Hangul_J_Dikeud 0x0eda +#define XK_Hangul_J_Rieul 0x0edb +#define XK_Hangul_J_RieulKiyeog 0x0edc +#define XK_Hangul_J_RieulMieum 0x0edd +#define XK_Hangul_J_RieulPieub 0x0ede +#define XK_Hangul_J_RieulSios 0x0edf +#define XK_Hangul_J_RieulTieut 0x0ee0 +#define XK_Hangul_J_RieulPhieuf 0x0ee1 +#define XK_Hangul_J_RieulHieuh 0x0ee2 +#define XK_Hangul_J_Mieum 0x0ee3 +#define XK_Hangul_J_Pieub 0x0ee4 +#define XK_Hangul_J_PieubSios 0x0ee5 +#define XK_Hangul_J_Sios 0x0ee6 +#define XK_Hangul_J_SsangSios 0x0ee7 +#define XK_Hangul_J_Ieung 0x0ee8 +#define XK_Hangul_J_Jieuj 0x0ee9 +#define XK_Hangul_J_Cieuc 0x0eea +#define XK_Hangul_J_Khieuq 0x0eeb +#define XK_Hangul_J_Tieut 0x0eec +#define XK_Hangul_J_Phieuf 0x0eed +#define XK_Hangul_J_Hieuh 0x0eee + +/* Ancient Hangul Consonant Characters */ +#define XK_Hangul_RieulYeorinHieuh 0x0eef +#define XK_Hangul_SunkyeongeumMieum 0x0ef0 +#define XK_Hangul_SunkyeongeumPieub 0x0ef1 +#define XK_Hangul_PanSios 0x0ef2 +#define XK_Hangul_KkogjiDalrinIeung 0x0ef3 +#define XK_Hangul_SunkyeongeumPhieuf 0x0ef4 +#define XK_Hangul_YeorinHieuh 0x0ef5 + +/* Ancient Hangul Vowel Characters */ +#define XK_Hangul_AraeA 0x0ef6 +#define XK_Hangul_AraeAE 0x0ef7 + +/* Ancient Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_PanSios 0x0ef8 +#define XK_Hangul_J_KkogjiDalrinIeung 0x0ef9 +#define XK_Hangul_J_YeorinHieuh 0x0efa + +/* Korean currency symbol */ +#define XK_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ + +#endif /* XK_KOREAN */ + +/* + * Armenian + */ + +#ifdef XK_ARMENIAN +#define XK_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ +#define XK_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XK_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XK_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ +#define XK_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ +#define XK_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XK_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XK_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XK_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XK_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XK_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XK_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XK_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XK_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ +#define XK_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ +#define XK_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ +#define XK_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ +#define XK_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ +#define XK_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ +#define XK_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ +#define XK_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ +#define XK_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ +#define XK_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ +#define XK_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ +#define XK_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ +#define XK_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ +#define XK_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ +#define XK_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ +#define XK_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ +#define XK_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ +#define XK_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ +#define XK_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ +#define XK_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ +#define XK_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ +#define XK_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ +#define XK_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ +#define XK_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ +#define XK_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ +#define XK_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ +#define XK_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ +#define XK_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ +#define XK_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ +#define XK_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ +#define XK_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ +#define XK_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ +#define XK_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ +#define XK_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ +#define XK_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ +#define XK_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ +#define XK_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ +#define XK_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ +#define XK_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ +#define XK_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ +#define XK_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ +#define XK_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ +#define XK_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ +#define XK_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ +#define XK_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ +#define XK_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ +#define XK_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ +#define XK_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ +#define XK_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ +#define XK_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ +#define XK_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ +#define XK_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ +#define XK_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ +#define XK_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ +#define XK_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ +#define XK_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ +#define XK_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ +#define XK_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ +#define XK_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ +#define XK_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ +#define XK_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ +#define XK_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ +#define XK_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ +#define XK_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ +#define XK_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ +#define XK_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ +#define XK_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ +#define XK_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ +#define XK_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ +#define XK_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ +#define XK_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ +#define XK_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ +#define XK_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ +#define XK_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ +#define XK_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ +#define XK_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ +#define XK_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ +#endif /* XK_ARMENIAN */ + +/* + * Georgian + */ + +#ifdef XK_GEORGIAN +#define XK_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ +#define XK_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ +#define XK_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ +#define XK_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ +#define XK_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ +#define XK_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ +#define XK_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ +#define XK_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ +#define XK_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ +#define XK_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ +#define XK_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ +#define XK_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ +#define XK_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ +#define XK_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ +#define XK_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ +#define XK_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ +#define XK_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ +#define XK_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ +#define XK_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ +#define XK_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ +#define XK_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ +#define XK_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ +#define XK_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ +#define XK_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ +#define XK_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ +#define XK_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ +#define XK_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ +#define XK_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ +#define XK_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ +#define XK_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ +#define XK_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ +#define XK_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ +#define XK_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ +#define XK_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ +#define XK_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ +#define XK_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ +#define XK_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ +#define XK_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ +#define XK_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ +#endif /* XK_GEORGIAN */ + +/* + * Azeri (and other Turkic or Caucasian languages) + */ + +#ifdef XK_CAUCASUS +/* latin */ +#define XK_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ +#define XK_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ +#define XK_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ +#define XK_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ +#define XK_Ocaron 0x10001d1 /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */ +#define XK_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ +#define XK_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ +#define XK_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ +#define XK_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ +#define XK_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ +#define XK_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ +#define XK_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ +#define XK_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ +#define XK_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ +#define XK_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */ +#define XK_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */ +/* those are not really Caucasus */ +/* For Inupiak */ +#define XK_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ +#define XK_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ +#endif /* XK_CAUCASUS */ + +/* + * Vietnamese + */ + +#ifdef XK_VIETNAMESE +#define XK_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ +#define XK_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ +#define XK_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ +#define XK_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ +#define XK_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XK_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XK_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XK_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XK_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XK_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XK_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ +#define XK_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ +#define XK_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ +#define XK_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ +#define XK_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XK_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XK_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ +#define XK_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ +#define XK_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ +#define XK_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ +#define XK_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ +#define XK_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ +#define XK_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ +#define XK_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ +#define XK_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ +#define XK_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ +#define XK_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XK_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XK_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XK_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XK_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XK_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XK_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ +#define XK_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ +#define XK_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ +#define XK_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ +#define XK_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ +#define XK_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ +#define XK_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ +#define XK_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ +#define XK_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XK_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XK_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XK_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XK_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XK_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XK_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ +#define XK_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ +#define XK_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ +#define XK_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ +#define XK_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ +#define XK_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ +#define XK_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ +#define XK_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ +#define XK_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ +#define XK_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ +#define XK_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ +#define XK_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ +#define XK_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ +#define XK_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ +#define XK_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ +#define XK_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ +#define XK_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ +#define XK_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ +#define XK_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ +#define XK_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ +#define XK_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ +#define XK_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ +#define XK_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ +#define XK_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ +#define XK_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ +#define XK_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ +#define XK_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ +#define XK_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ +#define XK_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ +#define XK_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ +#define XK_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ +#define XK_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ +#define XK_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ +#define XK_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ + +#endif /* XK_VIETNAMESE */ + +#ifdef XK_CURRENCY +#define XK_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ +#define XK_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ +#define XK_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ +#define XK_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ +#define XK_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ +#define XK_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ +#define XK_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ +#define XK_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ +#define XK_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ +#define XK_WonSign 0x10020a9 /* U+20A9 WON SIGN */ +#define XK_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ +#define XK_DongSign 0x10020ab /* U+20AB DONG SIGN */ +#define XK_EuroSign 0x20ac /* U+20AC EURO SIGN */ +#endif /* XK_CURRENCY */ + +#ifdef XK_MATHEMATICAL +/* one, two and three are defined above. */ +#define XK_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ +#define XK_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ +#define XK_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ +#define XK_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ +#define XK_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ +#define XK_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ +#define XK_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ +#define XK_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ +#define XK_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ +#define XK_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ +#define XK_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ +#define XK_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ +#define XK_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ +#define XK_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ +#define XK_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ +#define XK_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ +#define XK_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ +#define XK_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ +#define XK_emptyset 0x1002205 /* U+2205 NULL SET */ +#define XK_elementof 0x1002208 /* U+2208 ELEMENT OF */ +#define XK_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ +#define XK_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ +#define XK_squareroot 0x100221A /* U+221A SQUARE ROOT */ +#define XK_cuberoot 0x100221B /* U+221B CUBE ROOT */ +#define XK_fourthroot 0x100221C /* U+221C FOURTH ROOT */ +#define XK_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ +#define XK_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ +#define XK_because 0x1002235 /* U+2235 BECAUSE */ +#define XK_approxeq 0x1002248 /* U+2245 ALMOST EQUAL TO */ +#define XK_notapproxeq 0x1002247 /* U+2247 NOT ALMOST EQUAL TO */ +#define XK_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ +#define XK_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ +#endif /* XK_MATHEMATICAL */ + +#ifdef XK_BRAILLE +#define XK_braille_dot_1 0xfff1 +#define XK_braille_dot_2 0xfff2 +#define XK_braille_dot_3 0xfff3 +#define XK_braille_dot_4 0xfff4 +#define XK_braille_dot_5 0xfff5 +#define XK_braille_dot_6 0xfff6 +#define XK_braille_dot_7 0xfff7 +#define XK_braille_dot_8 0xfff8 +#define XK_braille_dot_9 0xfff9 +#define XK_braille_dot_10 0xfffa +#define XK_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ +#define XK_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ +#define XK_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ +#define XK_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ +#define XK_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ +#define XK_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ +#define XK_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ +#define XK_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ +#define XK_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ +#define XK_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ +#define XK_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ +#define XK_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ +#define XK_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ +#define XK_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ +#define XK_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ +#define XK_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ +#define XK_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ +#define XK_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ +#define XK_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ +#define XK_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ +#define XK_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ +#define XK_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ +#define XK_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ +#define XK_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ +#define XK_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ +#define XK_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ +#define XK_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ +#define XK_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ +#define XK_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ +#define XK_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ +#define XK_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ +#define XK_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ +#define XK_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ +#define XK_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ +#define XK_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ +#define XK_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ +#define XK_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ +#define XK_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ +#define XK_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ +#define XK_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ +#define XK_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ +#define XK_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ +#define XK_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ +#define XK_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ +#define XK_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ +#define XK_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ +#define XK_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ +#define XK_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ +#define XK_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ +#define XK_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ +#define XK_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ +#define XK_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ +#define XK_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ +#define XK_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ +#define XK_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ +#define XK_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ +#define XK_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ +#define XK_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ +#define XK_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ +#define XK_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ +#define XK_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ +#define XK_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ +#define XK_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ +#define XK_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ +#define XK_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ +#define XK_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ +#define XK_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ +#define XK_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ +#define XK_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ +#define XK_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ +#define XK_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ +#define XK_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ +#define XK_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ +#define XK_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ +#define XK_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ +#define XK_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ +#define XK_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ +#define XK_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ +#define XK_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ +#define XK_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ +#define XK_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ +#define XK_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ +#define XK_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ +#define XK_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ +#define XK_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ +#define XK_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ +#define XK_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ +#define XK_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ +#define XK_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ +#define XK_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ +#define XK_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ +#define XK_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ +#define XK_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ +#define XK_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ +#define XK_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ +#define XK_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ +#define XK_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ +#define XK_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ +#define XK_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ +#define XK_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ +#define XK_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ +#define XK_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ +#define XK_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ +#define XK_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ +#define XK_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ +#define XK_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ +#define XK_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ +#define XK_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ +#define XK_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ +#define XK_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ +#define XK_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ +#define XK_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ +#define XK_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ +#define XK_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ +#define XK_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ +#define XK_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ +#define XK_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ +#define XK_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ +#define XK_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ +#define XK_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ +#define XK_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ +#define XK_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ +#define XK_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ +#define XK_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ +#define XK_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ +#define XK_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ +#define XK_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ +#define XK_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ +#define XK_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ +#define XK_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ +#define XK_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ +#define XK_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ +#define XK_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ +#define XK_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ +#define XK_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ +#define XK_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ +#define XK_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ +#define XK_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ +#define XK_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ +#define XK_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ +#define XK_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ +#define XK_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ +#define XK_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ +#define XK_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ +#define XK_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ +#define XK_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ +#define XK_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ +#define XK_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ +#define XK_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ +#define XK_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ +#define XK_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ +#define XK_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ +#define XK_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ +#define XK_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ +#define XK_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ +#define XK_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ +#define XK_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ +#define XK_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ +#define XK_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ +#define XK_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ +#define XK_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ +#define XK_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ +#define XK_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ +#define XK_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ +#define XK_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ +#define XK_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ +#define XK_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ +#define XK_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ +#define XK_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ +#define XK_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ +#define XK_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ +#define XK_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ +#define XK_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ +#define XK_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ +#define XK_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ +#define XK_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ +#define XK_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ +#define XK_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ +#define XK_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ +#define XK_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ +#define XK_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ +#define XK_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ +#define XK_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ +#define XK_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ +#define XK_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ +#define XK_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ +#define XK_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ +#define XK_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ +#define XK_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ +#define XK_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ +#define XK_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ +#define XK_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ +#define XK_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ +#define XK_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ +#define XK_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ +#define XK_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ +#define XK_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ +#define XK_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ +#define XK_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ +#define XK_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ +#define XK_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ +#define XK_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ +#define XK_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ +#define XK_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ +#define XK_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ +#define XK_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ +#define XK_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ +#define XK_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ +#define XK_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ +#define XK_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ +#define XK_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ +#define XK_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ +#define XK_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ +#define XK_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ +#define XK_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ +#define XK_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ +#define XK_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ +#define XK_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ +#define XK_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ +#define XK_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ +#define XK_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ +#define XK_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ +#define XK_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ +#define XK_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ +#define XK_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ +#define XK_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ +#define XK_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ +#define XK_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ +#define XK_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ +#define XK_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ +#define XK_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ +#define XK_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ +#define XK_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ +#define XK_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ +#define XK_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ +#define XK_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ +#define XK_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ +#define XK_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ +#define XK_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ +#define XK_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ +#define XK_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ +#define XK_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ +#define XK_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ +#define XK_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ +#define XK_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ +#define XK_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ +#define XK_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ +#define XK_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ +#define XK_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ +#define XK_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ +#define XK_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ +#define XK_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ +#define XK_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ +#define XK_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ +#define XK_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ +#define XK_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ +#endif /* XK_BRAILLE */ + +/* + * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) + * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html + */ + +#ifdef XK_SINHALA +#define XK_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ +#define XK_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ +#define XK_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ +#define XK_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ +#define XK_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ +#define XK_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ +#define XK_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ +#define XK_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ +#define XK_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ +#define XK_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ +#define XK_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ +#define XK_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ +#define XK_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ +#define XK_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ +#define XK_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ +#define XK_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ +#define XK_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ +#define XK_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ +#define XK_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ +#define XK_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ +#define XK_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ +#define XK_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ +#define XK_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ +#define XK_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ +#define XK_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ +#define XK_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ +#define XK_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ +#define XK_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ +#define XK_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ +#define XK_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ +#define XK_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ +#define XK_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ +#define XK_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ +#define XK_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ +#define XK_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ +#define XK_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ +#define XK_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ +#define XK_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ +#define XK_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ +#define XK_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ +#define XK_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ +#define XK_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ +#define XK_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ +#define XK_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ +#define XK_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ +#define XK_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ +#define XK_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ +#define XK_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ +#define XK_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ +#define XK_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ +#define XK_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ +#define XK_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ +#define XK_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ +#define XK_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ +#define XK_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ +#define XK_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ +#define XK_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ +#define XK_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ +#define XK_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ +#define XK_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ +#define XK_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ +#define XK_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ +#define XK_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ +#define XK_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ +#define XK_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ +#define XK_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ +#define XK_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ +#define XK_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ +#define XK_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ +#define XK_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ +#define XK_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ +#define XK_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ +#define XK_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ +#define XK_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ +#define XK_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ +#define XK_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ +#define XK_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ +#define XK_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ +#define XK_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ +#define XK_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ +#endif /* XK_SINHALA */ diff --git a/src/lib_armv6/crossARMv6-libpng b/src/lib_armv6/crossARMv6-libpng new file mode 100755 index 0000000..7b3ae87 --- /dev/null +++ b/src/lib_armv6/crossARMv6-libpng @@ -0,0 +1,34 @@ +#!/bin/bash + +# architecture prefix +ARCH="arm-bcm2708hardfp-linux-gnueabi" + +# path to the toolchain and kernel base +TOOL_PATH=/home/petermaierh/rpi-tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/ + +# path to the toolchain base +BASE_PATH=$TOOL_PATH + +# cumulative toolchain prefix +PREFIX=$BASE_PATH/bin/$ARCH + +export CC=$PREFIX-gcc +export CXX=$PREFIX-g++ +export LD=$PREFIX-ld +export NM="$PREFIX-nm -B" +export AR=$PREFIX-ar +export RANLIB=$PREFIX-ranlib +export STRIP=$PREFIX-strip +export OBJCOPY=$PREFIX-objcopy +export LN_S="ln -s" + +export CFLAGS="-Wall -O3 -funroll-loops -I$BASE_PATH/include -I../zlib-1.2.8 -march=armv6zk -mfpu=vfp -mfloat-abi=hard -mcpu=arm1176jzf-s" +export CPPFLAGS="-I$BASE_PATH/include" +export CXXFLAGS="" + +export LDFLAGS="-L$BASE_PATH/lib -L$BASE_PATH/$ARCH/lib -L$BASE_PATH/lib/gcc/arm-bcm2708hardfp-linux-gnueabi/4.7.1 -L../zlib-1.2.8" + +./configure --host=$ARCH --prefix=$BASE_PATH --libdir=/home/petermaierh/work/dxlAPRS/src/lib_armv6/ +make +make install + diff --git a/src/lib_armv6/crossARMv6-libpng15 b/src/lib_armv6/crossARMv6-libpng15 new file mode 100755 index 0000000..35a81aa --- /dev/null +++ b/src/lib_armv6/crossARMv6-libpng15 @@ -0,0 +1,34 @@ +#!/bin/bash + +# architecture prefix +ARCH="arm-bcm2708hardfp-linux-gnueabi" + +# path to the toolchain and kernel base +TOOL_PATH=/home/petermaierh/rpi-tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/ + +# path to the toolchain base +BASE_PATH=$TOOL_PATH + +# cumulative toolchain prefix +PREFIX=$BASE_PATH/bin/$ARCH + +export CC=$PREFIX-gcc +export CXX=$PREFIX-g++ +export LD=$PREFIX-ld +export NM="$PREFIX-nm -B" +export AR=$PREFIX-ar +export RANLIB=$PREFIX-ranlib +export STRIP=$PREFIX-strip +export OBJCOPY=$PREFIX-objcopy +export LN_S="ln -s" + +export CFLAGS="-Wall -O3 -funroll-loops -I$BASE_PATH/include -I../zlib-1.2.8 -march=armv6zk -mfpu=vfp -mfloat-abi=hard -mcpu=arm1176jzf-s" +export CPPFLAGS="-I$BASE_PATH/include" +export CXXFLAGS="" + +export LDFLAGS="-L$BASE_PATH/lib -L$BASE_PATH/$ARCH/lib -L$BASE_PATH/lib/gcc/arm-bcm2708hardfp-linux-gnueabi/4.7.1 -L../zlib-1.2.8" + +./configure --host=$ARCH --prefix=$BASE_PATH --libdir=/home/petermaierh/work/dxlAPRS/src/lib_armv6/libpng15 --includedir=/home/petermaierh/work/dxlAPRS/src/lib_armv6/libpng15 +make +make install + diff --git a/src/lib_armv6/crossARMv6-zlib b/src/lib_armv6/crossARMv6-zlib new file mode 100755 index 0000000..79dc73b --- /dev/null +++ b/src/lib_armv6/crossARMv6-zlib @@ -0,0 +1,4 @@ +#!/bin/sh +CC=../src/arm-linux-rpi-gcc CFLAGS="-march=armv6zk -mfpu=vfp -mfloat-abi=hard -mcpu=arm1176jzf-s" ./configure +CC=../src/arm-linux-rpi-gcc CFLAGS="-march=armv6zk -mfpu=vfp -mfloat-abi=hard -mcpu=arm1176jzf-s" make + diff --git a/src/lib_armv6/jconfig.h b/src/lib_armv6/jconfig.h new file mode 100644 index 0000000..966b1d5 --- /dev/null +++ b/src/lib_armv6/jconfig.h @@ -0,0 +1,54 @@ +/* jconfig.h. Generated from jconfig.cfg by configure. */ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES 1 +#define HAVE_UNSIGNED_CHAR 1 +#define HAVE_UNSIGNED_SHORT 1 +/* #undef void */ +/* #undef const */ +/* #undef CHAR_IS_UNSIGNED */ +#define HAVE_STDDEF_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_LOCALE_H 1 +/* #undef NEED_BSD_STRINGS */ +/* #undef NEED_SYS_TYPES_H */ +/* #undef NEED_FAR_POINTERS */ +/* #undef NEED_SHORT_EXTERNAL_NAMES */ +/* Define this if you get warnings about undefined structures. */ +/* #undef INCOMPLETE_TYPES_BROKEN */ + +/* Define "boolean" as unsigned char, not int, on Windows systems. */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + +#ifdef JPEG_INTERNALS + +/* #undef RIGHT_SHIFT_IS_UNSIGNED */ +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +/* #undef DEFAULT_MAX_MEM */ +/* #undef NO_MKTEMP */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +/* #undef RLE_SUPPORTED */ +#define TARGA_SUPPORTED /* Targa image file format */ + +/* #undef TWO_FILE_COMMANDLINE */ +/* #undef NEED_SIGNAL_CATCHER */ +/* #undef DONT_USE_B_MODE */ + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +/* #undef PROGRESS_REPORT */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/lib_armv6/jerror.h b/src/lib_armv6/jerror.h new file mode 100644 index 0000000..a4b661f --- /dev/null +++ b/src/lib_armv6/jerror.h @@ -0,0 +1,304 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 1997-2012 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_BEFORE, "Invalid JPEG file structure: %s before SOF") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/src/lib_armv6/jmorecfg.h b/src/lib_armv6/jmorecfg.h new file mode 100644 index 0000000..2407edb --- /dev/null +++ b/src/lib_armv6/jmorecfg.h @@ -0,0 +1,390 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2012 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ +#ifndef _BASETSD_H /* MinGW is slightly different */ +#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ +typedef long INT32; +#endif +#endif +#endif +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* The noreturn type identifier is used to declare functions + * which cannot return. + * Compilers can thus create more optimized code and perform + * better checks for warnings and errors. + * Static analyzer tools can make improved inferences about + * execution paths and are prevented from giving false alerts. + * + * Unfortunately, the proposed specifications of corresponding + * extensions in the Dec 2011 ISO C standard revision (C11), + * GCC, MSVC, etc. are not viable. + * Thus we introduce a user defined type to declare noreturn + * functions at least for clarity. A proper compiler would + * have a suitable noreturn type to match in place of void. + */ + +#ifndef HAVE_NORETURN_T +typedef void noreturn_t; +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifndef FAR +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifdef HAVE_BOOLEAN +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif +#else +typedef enum { FALSE = 0, TRUE = 1 } boolean; +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/src/lib_armv6/jpeglib.h b/src/lib_armv6/jpeglib.h new file mode 100644 index 0000000..0a6dac4 --- /dev/null +++ b/src/lib_armv6/jpeglib.h @@ -0,0 +1,1173 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2002-2012 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +extern "C" { +#endif +#endif + +/* Version IDs for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 90". + */ + +#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */ +#define JPEG_LIB_VERSION_MAJOR 9 +#define JPEG_LIB_VERSION_MINOR 0 + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples, + * reflecting any scaling we choose to apply during the DCT step. + * Values from 1 to 16 are supported. + * Note that different components may receive different DCT scalings. + */ + int DCT_h_scaled_size; + int DCT_v_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface); + * DCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) + * and similarly for height. + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* Supported color transforms. */ + +typedef enum { + JCT_NONE = 0, + JCT_SUBTRACT_GREEN = 1 +} J_COLOR_TRANSFORM; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + JDIMENSION jpeg_width; /* scaled JPEG image width */ + JDIMENSION jpeg_height; /* scaled JPEG image height */ + /* Dimensions of actual JPEG image that will be written to file, + * derived from input dimensions by scaling factors above. + * These fields are computed by jpeg_start_compress(). + * You can also use jpeg_calc_jpeg_dimensions() to determine these values + * in advance of calling jpeg_start_compress(). + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + int q_scale_factor[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined, + * and corresponding scale factors (percentage, initialized 100). + */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + J_COLOR_TRANSFORM color_transform; + /* Color transform identifier, writes LSE marker if nonzero */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + J_COLOR_TRANSFORM color_transform; + /* Color transform identifier derived from LSE marker, otherwise zero */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* These fields are derived from Se of first SOS marker. + */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array for entropy decode */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_mem_dest jMemDest +#define jpeg_mem_src jMemSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_default_qtables jDefQTables +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_calc_jpeg_dimensions jCjpegDimensions +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_core_output_dimensions jCoreDimensions +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Data source and destination managers: memory buffers. */ +EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, + unsigned char ** outbuffer, + unsigned long * outsize)); +EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, + unsigned char * inbuffer, + unsigned long insize)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Precalculate JPEG dimensions for current compression parameters. */ +EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.txt concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +} +#endif +#endif + +#endif /* JPEGLIB_H */ diff --git a/src/lib_armv6/libX11.so b/src/lib_armv6/libX11.so new file mode 120000 index 0000000..3877db7 --- /dev/null +++ b/src/lib_armv6/libX11.so @@ -0,0 +1 @@ +libX11.so.6.3.0 \ No newline at end of file diff --git a/src/lib_armv6/libX11.so.6 b/src/lib_armv6/libX11.so.6 new file mode 120000 index 0000000..3877db7 --- /dev/null +++ b/src/lib_armv6/libX11.so.6 @@ -0,0 +1 @@ +libX11.so.6.3.0 \ No newline at end of file diff --git a/src/lib_armv6/libX11.so.6.3.0 b/src/lib_armv6/libX11.so.6.3.0 new file mode 100755 index 0000000..0fbf306 Binary files /dev/null and b/src/lib_armv6/libX11.so.6.3.0 differ diff --git a/src/lib_armv6/libXau.so b/src/lib_armv6/libXau.so new file mode 120000 index 0000000..339636b --- /dev/null +++ b/src/lib_armv6/libXau.so @@ -0,0 +1 @@ +libXau.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv6/libXau.so.6 b/src/lib_armv6/libXau.so.6 new file mode 120000 index 0000000..339636b --- /dev/null +++ b/src/lib_armv6/libXau.so.6 @@ -0,0 +1 @@ +libXau.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv6/libXau.so.6.0.0 b/src/lib_armv6/libXau.so.6.0.0 new file mode 100755 index 0000000..dc6d53e Binary files /dev/null and b/src/lib_armv6/libXau.so.6.0.0 differ diff --git a/src/lib_armv6/libXdmcp.so b/src/lib_armv6/libXdmcp.so new file mode 120000 index 0000000..bbf4646 --- /dev/null +++ b/src/lib_armv6/libXdmcp.so @@ -0,0 +1 @@ +libXdmcp.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv6/libXdmcp.so.6 b/src/lib_armv6/libXdmcp.so.6 new file mode 120000 index 0000000..bbf4646 --- /dev/null +++ b/src/lib_armv6/libXdmcp.so.6 @@ -0,0 +1 @@ +libXdmcp.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv6/libXdmcp.so.6.0.0 b/src/lib_armv6/libXdmcp.so.6.0.0 new file mode 100755 index 0000000..77657e4 Binary files /dev/null and b/src/lib_armv6/libXdmcp.so.6.0.0 differ diff --git a/src/lib_armv6/libXext.so b/src/lib_armv6/libXext.so new file mode 120000 index 0000000..465f805 --- /dev/null +++ b/src/lib_armv6/libXext.so @@ -0,0 +1 @@ +libXext.so.6.4.0 \ No newline at end of file diff --git a/src/lib_armv6/libXext.so.6 b/src/lib_armv6/libXext.so.6 new file mode 120000 index 0000000..465f805 --- /dev/null +++ b/src/lib_armv6/libXext.so.6 @@ -0,0 +1 @@ +libXext.so.6.4.0 \ No newline at end of file diff --git a/src/lib_armv6/libXext.so.6.4.0 b/src/lib_armv6/libXext.so.6.4.0 new file mode 100755 index 0000000..9e5ee64 Binary files /dev/null and b/src/lib_armv6/libXext.so.6.4.0 differ diff --git a/src/lib_armv6/libjpeg.a b/src/lib_armv6/libjpeg.a new file mode 100644 index 0000000..1a2b74b Binary files /dev/null and b/src/lib_armv6/libjpeg.a differ diff --git a/src/lib_armv6/libpng15/libpng.a b/src/lib_armv6/libpng15/libpng.a new file mode 120000 index 0000000..da6de64 --- /dev/null +++ b/src/lib_armv6/libpng15/libpng.a @@ -0,0 +1 @@ +libpng15.a \ No newline at end of file diff --git a/src/lib_armv6/libpng15/libpng15.a b/src/lib_armv6/libpng15/libpng15.a new file mode 100644 index 0000000..7c2fcc2 Binary files /dev/null and b/src/lib_armv6/libpng15/libpng15.a differ diff --git a/src/lib_armv6/libpng15/libpng15/png.h b/src/lib_armv6/libpng15/libpng15/png.h new file mode 100644 index 0000000..b900fa3 --- /dev/null +++ b/src/lib_armv6/libpng15/libpng15/png.h @@ -0,0 +1,2733 @@ + +/* png.h - header file for PNG reference library + * + * libpng version 1.5.18 - February 6, 2014 + * Copyright (c) 1998-2014 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license (See LICENSE, below) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.5.18 - February 6, 2014: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 12.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 12.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-7 13 10210 12.so.0.10[.0] + * 1.2.10rc1-2 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.4.0beta1-5 14 10400 14.so.0.0[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.4.0beta7-8 14 10400 14.so.0.0[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.4.0beta9-14 14 10400 14.so.0.0[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.4.0beta15-36 14 10400 14.so.0.0[.0] + * 1.4.0beta37-87 14 10400 14.so.14.0[.0] + * 1.4.0rc01 14 10400 14.so.14.0[.0] + * 1.4.0beta88-109 14 10400 14.so.14.0[.0] + * 1.4.0rc02-08 14 10400 14.so.14.0[.0] + * 1.4.0 14 10400 14.so.14.0[.0] + * 1.4.1beta01-03 14 10401 14.so.14.1[.0] + * 1.4.1rc01 14 10401 14.so.14.1[.0] + * 1.4.1beta04-12 14 10401 14.so.14.1[.0] + * 1.4.1 14 10401 14.so.14.1[.0] + * 1.4.2 14 10402 14.so.14.2[.0] + * 1.4.3 14 10403 14.so.14.3[.0] + * 1.4.4 14 10404 14.so.14.4[.0] + * 1.5.0beta01-58 15 10500 15.so.15.0[.0] + * 1.5.0rc01-07 15 10500 15.so.15.0[.0] + * 1.5.0 15 10500 15.so.15.0[.0] + * 1.5.1beta01-11 15 10501 15.so.15.1[.0] + * 1.5.1rc01-02 15 10501 15.so.15.1[.0] + * 1.5.1 15 10501 15.so.15.1[.0] + * 1.5.2beta01-03 15 10502 15.so.15.2[.0] + * 1.5.2rc01-03 15 10502 15.so.15.2[.0] + * 1.5.2 15 10502 15.so.15.2[.0] + * 1.5.3beta01-10 15 10503 15.so.15.3[.0] + * 1.5.3rc01-02 15 10503 15.so.15.3[.0] + * 1.5.3beta11 15 10503 15.so.15.3[.0] + * 1.5.3 [omitted] + * 1.5.4beta01-08 15 10504 15.so.15.4[.0] + * 1.5.4rc01 15 10504 15.so.15.4[.0] + * 1.5.4 15 10504 15.so.15.4[.0] + * 1.5.5beta01-08 15 10505 15.so.15.5[.0] + * 1.5.5rc01 15 10505 15.so.15.5[.0] + * 1.5.5 15 10505 15.so.15.5[.0] + * 1.5.6beta01-07 15 10506 15.so.15.6[.0] + * 1.5.6rc01-03 15 10506 15.so.15.6[.0] + * 1.5.6 15 10506 15.so.15.6[.0] + * 1.5.7beta01-05 15 10507 15.so.15.7[.0] + * 1.5.7rc01-03 15 10507 15.so.15.7[.0] + * 1.5.7 15 10507 15.so.15.7[.0] + * 1.5.8beta01 15 10508 15.so.15.8[.0] + * 1.5.8rc01 15 10508 15.so.15.8[.0] + * 1.5.8 15 10508 15.so.15.8[.0] + * 1.5.9beta01-02 15 10509 15.so.15.9[.0] + * 1.5.9rc01 15 10509 15.so.15.9[.0] + * 1.5.9 15 10509 15.so.15.9[.0] + * 1.5.10beta01-05 15 10510 15.so.15.10[.0] + * 1.5.10 15 10510 15.so.15.10[.0] + * 1.5.11beta01 15 10511 15.so.15.11[.0] + * 1.5.11rc01-05 15 10511 15.so.15.11[.0] + * 1.5.11 15 10511 15.so.15.11[.0] + * 1.5.12 15 10512 15.so.15.12[.0] + * 1.5.13beta01-02 15 10513 15.so.15.13[.0] + * 1.5.13rc01 15 10513 15.so.15.13[.0] + * 1.5.13 15 10513 15.so.15.13[.0] + * 1.5.14beta01-08 15 10514 15.so.15.14[.0] + * 1.5.14rc01-03 15 10514 15.so.15.14[.0] + * 1.5.14 15 10514 15.so.15.14[.0] + * 1.5.15beta01-09 15 10515 15.so.15.15[.0] + * 1.5.15rc01 15 10515 15.so.15.15[.0] + * 1.5.15 15 10515 15.so.15.15[.0] + * 1.5.16beta01-06 15 10516 15.so.15.16[.0] + * 1.5.16rc01 15 10516 15.so.15.16[.0] + * 1.5.16 15 10516 15.so.15.16[.0] + * 1.5.17beta01 15 10517 15.so.15.17[.0] + * 1.5.17rc01-03 15 10517 15.so.15.17[.0] + * 1.5.17 15 10517 15.so.15.17[.0] + * 1.5.18beta01-05 15 10518 15.so.15.18[.0] + * 1.5.18rc01-02 15 10518 15.so.15.18[.0] + * 1.5.18 15 10518 15.so.15.18[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcNN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng-manual.txt or libpng.3 for more information. The PNG + * specification is available as a W3C Recommendation and as an ISO + * Specification, +# endif + + /* Need the time information for converting tIME chunks, it + * defines struct tm: + */ +# ifdef PNG_CONVERT_tIME_SUPPORTED + /* "time.h" functions are not supported on all operating systems */ +# include +# endif +# endif + +/* Machine specific configuration. */ +# include "pngconf.h" +#endif /* PNG_VERSION_INFO_ONLY */ + +/* + * Added at libpng-1.2.8 + * + * Ref MSDN: Private as priority over Special + * VS_FF_PRIVATEBUILD File *was not* built using standard release + * procedures. If this value is given, the StringFileInfo block must + * contain a PrivateBuild string. + * + * VS_FF_SPECIALBUILD File *was* built by the original company using + * standard release procedures but is a variation of the standard + * file of the same version number. If this value is given, the + * StringFileInfo block must contain a SpecialBuild string. + */ + +#ifdef PNG_USER_PRIVATEBUILD /* From pnglibconf.h */ +# define PNG_LIBPNG_BUILD_TYPE \ + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE) +#else +# ifdef PNG_LIBPNG_SPECIALBUILD +# define PNG_LIBPNG_BUILD_TYPE \ + (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL) +# else +# define PNG_LIBPNG_BUILD_TYPE (PNG_LIBPNG_BUILD_BASE_TYPE) +# endif +#endif + +#ifndef PNG_VERSION_INFO_ONLY + +/* Inhibit C++ name-mangling for libpng functions but not for system calls. */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Version information for C files, stored in png.c. This had better match + * the version above. + */ +#define png_libpng_ver png_get_header_ver(NULL) + +/* This file is arranged in several sections: + * + * 1. Any configuration options that can be specified by for the application + * code when it is built. (Build time configuration is in pnglibconf.h) + * 2. Type definitions (base types are defined in pngconf.h), structure + * definitions. + * 3. Exported library functions. + * + * The library source code has additional files (principally pngpriv.h) that + * allow configuration of the library. + */ +/* Section 1: run time configuration + * See pnglibconf.h for build time configuration + * + * Run time configuration allows the application to choose between + * implementations of certain arithmetic APIs. The default is set + * at build time and recorded in pnglibconf.h, but it is safe to + * override these (and only these) settings. Note that this won't + * change what the library does, only application code, and the + * settings can (and probably should) be made on a per-file basis + * by setting the #defines before including png.h + * + * Use macros to read integers from PNG data or use the exported + * functions? + * PNG_USE_READ_MACROS: use the macros (see below) Note that + * the macros evaluate their argument multiple times. + * PNG_NO_USE_READ_MACROS: call the relevant library function. + * + * Use the alternative algorithm for compositing alpha samples that + * does not use division? + * PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division' + * algorithm. + * PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm. + * + * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is + * false? + * PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error + * APIs to png_warning. + * Otherwise the calls are mapped to png_error. + */ + +/* Section 2: type definitions, including structures and compile time + * constants. + * See pngconf.h for base types that vary by machine/system + */ + +/* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +typedef char* png_libpng_version_1_5_18; + +/* Three color definitions. The order of the red, green, and blue, (and the + * exact size) is not important, although the size of the fields need to + * be png_byte or png_uint_16 (as defined below). + */ +typedef struct png_color_struct +{ + png_byte red; + png_byte green; + png_byte blue; +} png_color; +typedef png_color FAR * png_colorp; +typedef PNG_CONST png_color FAR * png_const_colorp; +typedef png_color FAR * FAR * png_colorpp; + +typedef struct png_color_16_struct +{ + png_byte index; /* used for palette files */ + png_uint_16 red; /* for use in red green blue files */ + png_uint_16 green; + png_uint_16 blue; + png_uint_16 gray; /* for use in grayscale files */ +} png_color_16; +typedef png_color_16 FAR * png_color_16p; +typedef PNG_CONST png_color_16 FAR * png_const_color_16p; +typedef png_color_16 FAR * FAR * png_color_16pp; + +typedef struct png_color_8_struct +{ + png_byte red; /* for use in red green blue files */ + png_byte green; + png_byte blue; + png_byte gray; /* for use in grayscale files */ + png_byte alpha; /* for alpha channel files */ +} png_color_8; +typedef png_color_8 FAR * png_color_8p; +typedef PNG_CONST png_color_8 FAR * png_const_color_8p; +typedef png_color_8 FAR * FAR * png_color_8pp; + +/* + * The following two structures are used for the in-core representation + * of sPLT chunks. + */ +typedef struct png_sPLT_entry_struct +{ + png_uint_16 red; + png_uint_16 green; + png_uint_16 blue; + png_uint_16 alpha; + png_uint_16 frequency; +} png_sPLT_entry; +typedef png_sPLT_entry FAR * png_sPLT_entryp; +typedef PNG_CONST png_sPLT_entry FAR * png_const_sPLT_entryp; +typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp; + +/* When the depth of the sPLT palette is 8 bits, the color and alpha samples + * occupy the LSB of their respective members, and the MSB of each member + * is zero-filled. The frequency member always occupies the full 16 bits. + */ + +typedef struct png_sPLT_struct +{ + png_charp name; /* palette name */ + png_byte depth; /* depth of palette samples */ + png_sPLT_entryp entries; /* palette entries */ + png_int_32 nentries; /* number of palette entries */ +} png_sPLT_t; +typedef png_sPLT_t FAR * png_sPLT_tp; +typedef PNG_CONST png_sPLT_t FAR * png_const_sPLT_tp; +typedef png_sPLT_t FAR * FAR * png_sPLT_tpp; + +#ifdef PNG_TEXT_SUPPORTED +/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file, + * and whether that contents is compressed or not. The "key" field + * points to a regular zero-terminated C string. The "text" fields can be a + * regular C string, an empty string, or a NULL pointer. + * However, the structure returned by png_get_text() will always contain + * the "text" field as a regular zero-terminated C string (possibly + * empty), never a NULL pointer, so it can be safely used in printf() and + * other string-handling functions. Note that the "itxt_length", "lang", and + * "lang_key" members of the structure only exist when the library is built + * with iTXt chunk support. Prior to libpng-1.4.0 the library was built by + * default without iTXt support. Also note that when iTXt *is* supported, + * the "lang" and "lang_key" fields contain NULL pointers when the + * "compression" field contains * PNG_TEXT_COMPRESSION_NONE or + * PNG_TEXT_COMPRESSION_zTXt. Note that the "compression value" is not the + * same as what appears in the PNG tEXt/zTXt/iTXt chunk's "compression flag" + * which is always 0 or 1, or its "compression method" which is always 0. + */ +typedef struct png_text_struct +{ + int compression; /* compression value: + -1: tEXt, none + 0: zTXt, deflate + 1: iTXt, none + 2: iTXt, deflate */ + png_charp key; /* keyword, 1-79 character description of "text" */ + png_charp text; /* comment, may be an empty string (ie "") + or a NULL pointer */ + png_size_t text_length; /* length of the text string */ + png_size_t itxt_length; /* length of the itxt string */ + png_charp lang; /* language code, 0-79 characters + or a NULL pointer */ + png_charp lang_key; /* keyword translated UTF-8 string, 0 or more + chars or a NULL pointer */ +} png_text; +typedef png_text FAR * png_textp; +typedef PNG_CONST png_text FAR * png_const_textp; +typedef png_text FAR * FAR * png_textpp; +#endif + +/* Supported compression types for text in PNG files (tEXt, and zTXt). + * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */ +#define PNG_TEXT_COMPRESSION_NONE_WR -3 +#define PNG_TEXT_COMPRESSION_zTXt_WR -2 +#define PNG_TEXT_COMPRESSION_NONE -1 +#define PNG_TEXT_COMPRESSION_zTXt 0 +#define PNG_ITXT_COMPRESSION_NONE 1 +#define PNG_ITXT_COMPRESSION_zTXt 2 +#define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */ + +/* png_time is a way to hold the time in an machine independent way. + * Two conversions are provided, both from time_t and struct tm. There + * is no portable way to convert to either of these structures, as far + * as I know. If you know of a portable way, send it to me. As a side + * note - PNG has always been Year 2000 compliant! + */ +typedef struct png_time_struct +{ + png_uint_16 year; /* full year, as in, 1995 */ + png_byte month; /* month of year, 1 - 12 */ + png_byte day; /* day of month, 1 - 31 */ + png_byte hour; /* hour of day, 0 - 23 */ + png_byte minute; /* minute of hour, 0 - 59 */ + png_byte second; /* second of minute, 0 - 60 (for leap seconds) */ +} png_time; +typedef png_time FAR * png_timep; +typedef PNG_CONST png_time FAR * png_const_timep; +typedef png_time FAR * FAR * png_timepp; + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \ + defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) +/* png_unknown_chunk is a structure to hold queued chunks for which there is + * no specific support. The idea is that we can use this to queue + * up private chunks for output even though the library doesn't actually + * know about their semantics. + */ +typedef struct png_unknown_chunk_t +{ + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* libpng-using applications should NOT directly modify this byte. */ + png_byte location; /* mode of operation at read time */ +} + + +png_unknown_chunk; +typedef png_unknown_chunk FAR * png_unknown_chunkp; +typedef PNG_CONST png_unknown_chunk FAR * png_const_unknown_chunkp; +typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp; +#endif + +/* Values for the unknown chunk location byte */ + +#define PNG_HAVE_IHDR 0x01 +#define PNG_HAVE_PLTE 0x02 +#define PNG_AFTER_IDAT 0x08 + +/* The complete definition of png_info has, as of libpng-1.5.0, + * been moved into a separate header file that is not accessible to + * applications. Read libpng-manual.txt or libpng.3 for more info. + */ +typedef struct png_info_def png_info; +typedef png_info FAR * png_infop; +typedef PNG_CONST png_info FAR * png_const_infop; +typedef png_info FAR * FAR * png_infopp; + +/* Maximum positive integer used in PNG is (2^31)-1 */ +#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL) +#define PNG_UINT_32_MAX ((png_uint_32)(-1)) +#define PNG_SIZE_MAX ((png_size_t)(-1)) + +/* These are constants for fixed point values encoded in the + * PNG specification manner (x100000) + */ +#define PNG_FP_1 100000 +#define PNG_FP_HALF 50000 +#define PNG_FP_MAX ((png_fixed_point)0x7fffffffL) +#define PNG_FP_MIN (-PNG_FP_MAX) + +/* These describe the color_type field in png_info. */ +/* color type masks */ +#define PNG_COLOR_MASK_PALETTE 1 +#define PNG_COLOR_MASK_COLOR 2 +#define PNG_COLOR_MASK_ALPHA 4 + +/* color types. Note that not all combinations are legal */ +#define PNG_COLOR_TYPE_GRAY 0 +#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE) +#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) +#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) +#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) +/* aliases */ +#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA +#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA + +/* This is for compression type. PNG 1.0-1.2 only define the single type. */ +#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */ +#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE + +/* This is for filter type. PNG 1.0-1.2 only define the single type. */ +#define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */ +#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */ +#define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE + +/* These are for the interlacing type. These values should NOT be changed. */ +#define PNG_INTERLACE_NONE 0 /* Non-interlaced image */ +#define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */ +#define PNG_INTERLACE_LAST 2 /* Not a valid value */ + +/* These are for the oFFs chunk. These values should NOT be changed. */ +#define PNG_OFFSET_PIXEL 0 /* Offset in pixels */ +#define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */ +#define PNG_OFFSET_LAST 2 /* Not a valid value */ + +/* These are for the pCAL chunk. These values should NOT be changed. */ +#define PNG_EQUATION_LINEAR 0 /* Linear transformation */ +#define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */ +#define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */ +#define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */ +#define PNG_EQUATION_LAST 4 /* Not a valid value */ + +/* These are for the sCAL chunk. These values should NOT be changed. */ +#define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */ +#define PNG_SCALE_METER 1 /* meters per pixel */ +#define PNG_SCALE_RADIAN 2 /* radians per pixel */ +#define PNG_SCALE_LAST 3 /* Not a valid value */ + +/* These are for the pHYs chunk. These values should NOT be changed. */ +#define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */ +#define PNG_RESOLUTION_METER 1 /* pixels/meter */ +#define PNG_RESOLUTION_LAST 2 /* Not a valid value */ + +/* These are for the sRGB chunk. These values should NOT be changed. */ +#define PNG_sRGB_INTENT_PERCEPTUAL 0 +#define PNG_sRGB_INTENT_RELATIVE 1 +#define PNG_sRGB_INTENT_SATURATION 2 +#define PNG_sRGB_INTENT_ABSOLUTE 3 +#define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */ + +/* This is for text chunks */ +#define PNG_KEYWORD_MAX_LENGTH 79 + +/* Maximum number of entries in PLTE/sPLT/tRNS arrays */ +#define PNG_MAX_PALETTE_LENGTH 256 + +/* These determine if an ancillary chunk's data has been successfully read + * from the PNG header, or if the application has filled in the corresponding + * data in the info_struct to be written into the output file. The values + * of the PNG_INFO_ defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_size_t rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info FAR * png_row_infop; +typedef png_row_info FAR * FAR * png_row_infopp; + +/* The complete definition of png_struct has, as of libpng-1.5.0, + * been moved into a separate header file that is not accessible to + * applications. Read libpng-manual.txt or libpng.3 for more info. + */ +typedef struct png_struct_def png_struct; +typedef PNG_CONST png_struct FAR * png_const_structp; +typedef png_struct FAR * png_structp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. Note that the 'write' function must not + * modify the buffer it is passed. The 'read' function, on the other hand, is + * expected to return the read data in the buffer. + */ +typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp)); +typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t)); +typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp)); +typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, + int)); +typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, + int)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); +typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); + +/* The following callback receives png_uint_32 row_number, int pass for the + * png_bytep data of the row. When transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep, + png_uint_32, int)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop, + png_bytep)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, + png_unknown_chunkp)); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This must match the function definition in , and the application + * must include this before png.h to obtain the definition of jmp_buf. The + * function is required to be PNG_NORETURN, but this is not checked. If the + * function does return the application will crash via an abort() or similar + * system level call. + * + * If you get a warning here while building the library you may need to make + * changes to ensure that pnglibconf.h records the calling convention used by + * your compiler. This may be very difficult - try using a different compiler + * to build the library! + */ +PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER +#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ +/* Added to libpng-1.4.0 */ +#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */ +/* Added to libpng-1.5.4 */ +#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */ +#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +/* NOTE: prior to 1.5 these functions had no 'API' style declaration, + * this allowed the zlib default functions to be used on Windows + * platforms. In 1.5 the zlib default malloc (which just calls malloc and + * ignores the first argument) should be completely compatible with the + * following. + */ +typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, + png_alloc_size_t)); +typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp)); + +typedef png_struct FAR * FAR * png_structpp; + +/* Section 3: exported functions + * Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng-manual.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + * + * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in + * pngconf.h and in the *.dfn files in the scripts directory. + * + * PNG_EXPORT(ordinal, type, name, (args)); + * + * ordinal: ordinal that is used while building + * *.def files. The ordinal value is only + * relevant when preprocessing png.h with + * the *.dfn files for building symbol table + * entries, and are removed by pngconf.h. + * type: return type of the function + * name: function name + * args: function arguments, with types + * + * When we wish to append attributes to a function prototype we use + * the PNG_EXPORTA() macro instead. + * + * PNG_EXPORTA(ordinal, type, name, (args), attributes); + * + * ordinal, type, name, and args: same as in PNG_EXPORT(). + * attributes: function attributes + */ + +/* Returns the version number of the library */ +PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); + +/* Tell lib we have already handled the first magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +PNG_EXPORT(2, void, png_set_sig_bytes, (png_structp png_ptr, int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +PNG_EXPORTA(4, png_structp, png_create_read_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn), + PNG_ALLOCATED); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +PNG_EXPORTA(5, png_structp, png_create_write_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn), + PNG_ALLOCATED); + +PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, + (png_const_structp png_ptr)); + +PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr, + png_size_t size)); + +/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp + * match up. + */ +#ifdef PNG_SETJMP_SUPPORTED +/* This function returns the jmp_buf built in to *png_ptr. It must be + * supplied with an appropriate 'longjmp' function to use on that jmp_buf + * unless the default error function is overridden in which case NULL is + * acceptable. The size of the jmp_buf is checked against the actual size + * allocated by the library - the call will return NULL on a mismatch + * indicating an ABI mismatch. + */ +PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr, + png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); +# define png_jmpbuf(png_ptr) \ + (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) +#endif +/* This function should be used by libpng applications in place of + * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it + * will use it; otherwise it will call PNG_ABORT(). This function was + * added in libpng-1.5.0. + */ +PNG_EXPORTA(9, void, png_longjmp, (png_structp png_ptr, int val), + PNG_NORETURN); + +#ifdef PNG_READ_SUPPORTED +/* Reset the compression stream */ +PNG_EXPORT(10, int, png_reset_zstream, (png_structp png_ptr)); +#endif + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(11, png_structp, png_create_read_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +PNG_EXPORTA(12, png_structp, png_create_write_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +#endif + +/* Write the PNG file signature. */ +PNG_EXPORT(13, void, png_write_sig, (png_structp png_ptr)); + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +PNG_EXPORT(14, void, png_write_chunk, (png_structp png_ptr, png_const_bytep + chunk_name, png_const_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +PNG_EXPORT(15, void, png_write_chunk_start, (png_structp png_ptr, + png_const_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +PNG_EXPORT(16, void, png_write_chunk_data, (png_structp png_ptr, + png_const_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +PNG_EXPORT(17, void, png_write_chunk_end, (png_structp png_ptr)); + +/* Allocate and initialize the info structure */ +PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_structp png_ptr), + PNG_ALLOCATED); + +PNG_EXPORT(19, void, png_info_init_3, (png_infopp info_ptr, + png_size_t png_info_struct_size)); + +/* Writes all the PNG information before the image. */ +PNG_EXPORT(20, void, png_write_info_before_PLTE, + (png_structp png_ptr, png_infop info_ptr)); +PNG_EXPORT(21, void, png_write_info, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. */ +PNG_EXPORT(22, void, png_read_info, + (png_structp png_ptr, png_infop info_ptr)); +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED +PNG_EXPORT(23, png_const_charp, png_convert_to_rfc1123, + (png_structp png_ptr, + png_const_timep ptime)); +#endif + +#ifdef PNG_CONVERT_tIME_SUPPORTED +/* Convert from a struct tm to png_time */ +PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, + PNG_CONST struct tm FAR * ttime)); + +/* Convert from time_t to png_time. Uses gmtime() */ +PNG_EXPORT(25, void, png_convert_from_time_t, + (png_timep ptime, time_t ttime)); +#endif /* PNG_CONVERT_tIME_SUPPORTED */ + +#ifdef PNG_READ_EXPAND_SUPPORTED +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +PNG_EXPORT(26, void, png_set_expand, (png_structp png_ptr)); +PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structp png_ptr)); +PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structp png_ptr)); +PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_EXPAND_16_SUPPORTED +/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion + * of a tRNS chunk if present. + */ +PNG_EXPORT(221, void, png_set_expand_16, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +PNG_EXPORT(30, void, png_set_bgr, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +/* Expand the grayscale to 24-bit RGB if necessary. */ +PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +/* Reduce RGB to grayscale. */ +#define PNG_ERROR_ACTION_NONE 1 +#define PNG_ERROR_ACTION_WARN 2 +#define PNG_ERROR_ACTION_ERROR 3 +#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/ + +PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structp png_ptr, + int error_action, double red, double green)) +PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green)) + +PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structp + png_ptr)); +#endif + +#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, + png_colorp palette)); +#endif + +#ifdef PNG_READ_ALPHA_MODE_SUPPORTED +/* How the alpha channel is interpreted - this affects how the color channels of + * a PNG file are returned when an alpha channel, or tRNS chunk in a palette + * file, is present. + * + * This has no effect on the way pixels are written into a PNG output + * datastream. The color samples in a PNG datastream are never premultiplied + * with the alpha samples. + * + * The default is to return data according to the PNG specification: the alpha + * channel is a linear measure of the contribution of the pixel to the + * corresponding composited pixel. The gamma encoded color channels must be + * scaled according to the contribution and to do this it is necessary to undo + * the encoding, scale the color values, perform the composition and reencode + * the values. This is the 'PNG' mode. + * + * The alternative is to 'associate' the alpha with the color information by + * storing color channel values that have been scaled by the alpha. The + * advantage is that the color channels can be resampled (the image can be + * scaled) in this form. The disadvantage is that normal practice is to store + * linear, not (gamma) encoded, values and this requires 16-bit channels for + * still images rather than the 8-bit channels that are just about sufficient if + * gamma encoding is used. In addition all non-transparent pixel values, + * including completely opaque ones, must be gamma encoded to produce the final + * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the + * latter being the two common names for associated alpha color channels.) + * + * Since it is not necessary to perform arithmetic on opaque color values so + * long as they are not to be resampled and are in the final color space it is + * possible to optimize the handling of alpha by storing the opaque pixels in + * the PNG format (adjusted for the output color space) while storing partially + * opaque pixels in the standard, linear, format. The accuracy required for + * standard alpha composition is relatively low, because the pixels are + * isolated, therefore typically the accuracy loss in storing 8-bit linear + * values is acceptable. (This is not true if the alpha channel is used to + * simulate transparency over large areas - use 16 bits or the PNG mode in + * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is + * treated as opaque only if the alpha value is equal to the maximum value. + * + * The final choice is to gamma encode the alpha channel as well. This is + * broken because, in practice, no implementation that uses this choice + * correctly undoes the encoding before handling alpha composition. Use this + * choice only if other serious errors in the software or hardware you use + * mandate it; the typical serious error is for dark halos to appear around + * opaque areas of the composited PNG image because of arithmetic overflow. + * + * The API function png_set_alpha_mode specifies which of these choices to use + * with an enumerated 'mode' value and the gamma of the required output: + */ +#define PNG_ALPHA_PNG 0 /* according to the PNG standard */ +#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */ +#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */ +#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */ +#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */ +#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */ + +PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structp png_ptr, int mode, + double output_gamma)) +PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr, + int mode, png_fixed_point output_gamma)) +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED) +/* The output_gamma value is a screen gamma in libpng terminology: it expresses + * how to decode the output values, not how they are encoded. The values used + * correspond to the normal numbers used to describe the overall gamma of a + * computer display system; for example 2.2 for an sRGB conformant system. The + * values are scaled by 100000 in the _fixed version of the API (so 220000 for + * sRGB.) + * + * The inverse of the value is always used to provide a default for the PNG file + * encoding if it has no gAMA chunk and if png_set_gamma() has not been called + * to override the PNG gamma information. + * + * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode + * opaque pixels however pixels with lower alpha values are not encoded, + * regardless of the output gamma setting. + * + * When the standard Porter Duff handling is requested with mode 1 the output + * encoding is set to be linear and the output_gamma value is only relevant + * as a default for input data that has no gamma information. The linear output + * encoding will be overridden if png_set_gamma() is called - the results may be + * highly unexpected! + * + * The following numbers are derived from the sRGB standard and the research + * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of + * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing + * correction required to take account of any differences in the color + * environment of the original scene and the intended display environment; the + * value expresses how to *decode* the image for display, not how the original + * data was *encoded*. + * + * sRGB provides a peg for the PNG standard by defining a viewing environment. + * sRGB itself, and earlier TV standards, actually use a more complex transform + * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is + * limited to simple power laws.) By saying that an image for direct display on + * an sRGB conformant system should be stored with a gAMA chunk value of 45455 + * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification + * makes it possible to derive values for other display systems and + * environments. + * + * The Mac value is deduced from the sRGB based on an assumption that the actual + * extra viewing correction used in early Mac display systems was implemented as + * a power 1.45 lookup table. + * + * Any system where a programmable lookup table is used or where the behavior of + * the final display device characteristics can be changed requires system + * specific code to obtain the current characteristic. However this can be + * difficult and most PNG gamma correction only requires an approximate value. + * + * By default, if png_set_alpha_mode() is not called, libpng assumes that all + * values are unencoded, linear, values and that the output device also has a + * linear characteristic. This is only very rarely correct - it is invariably + * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the + * default if you don't know what the right answer is! + * + * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS + * 10.6) which used a correction table to implement a somewhat lower gamma on an + * otherwise sRGB system. + * + * Both these values are reserved (not simple gamma values) in order to allow + * more precise correction internally in the future. + * + * NOTE: the following values can be passed to either the fixed or floating + * point APIs, but the floating point API will also accept floating point + * values. + */ +#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */ +#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */ +#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */ +#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */ +#endif + +/* The following are examples of calls to png_set_alpha_mode to achieve the + * required overall gamma correction and, where necessary, alpha + * premultiplication. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * This is the default libpng handling of the alpha channel - it is not + * pre-multiplied into the color components. In addition the call states + * that the output is for a sRGB system and causes all PNG files without gAMA + * chunks to be assumed to be encoded using sRGB. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * In this case the output is assumed to be something like an sRGB conformant + * display preceeded by a power-law lookup table of power 1.45. This is how + * early Mac systems behaved. + * + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); + * This is the classic Jim Blinn approach and will work in academic + * environments where everything is done by the book. It has the shortcoming + * of assuming that input PNG data with no gamma information is linear - this + * is unlikely to be correct unless the PNG files where generated locally. + * Most of the time the output precision will be so low as to show + * significant banding in dark areas of the image. + * + * png_set_expand_16(pp); + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB); + * This is a somewhat more realistic Jim Blinn inspired approach. PNG files + * are assumed to have the sRGB encoding if not marked with a gamma value and + * the output is always 16 bits per component. This permits accurate scaling + * and processing of the data. If you know that your input PNG files were + * generated locally you might need to replace PNG_DEFAULT_sRGB with the + * correct value for your system. + * + * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB); + * If you just need to composite the PNG image onto an existing background + * and if you control the code that does this you can use the optimization + * setting. In this case you just copy completely opaque pixels to the + * output. For pixels that are not completely transparent (you just skip + * those) you do the composition math using png_composite or png_composite_16 + * below then encode the resultant 8-bit or 16-bit values to match the output + * encoding. + * + * Other cases + * If neither the PNG nor the standard linear encoding work for you because + * of the software or hardware you use then you have a big problem. The PNG + * case will probably result in halos around the image. The linear encoding + * will probably result in a washed out, too bright, image (it's actually too + * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably + * substantially reduce the halos. Alternatively try: + * + * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB); + * This option will also reduce the halos, but there will be slight dark + * halos round the opaque parts of the image where the background is light. + * In the OPTIMIZED mode the halos will be light halos where the background + * is dark. Take your pick - the halos are unavoidable unless you can get + * your hardware/software fixed! (The OPTIMIZED approach is slightly + * faster.) + * + * When the default gamma of PNG files doesn't match the output gamma. + * If you have PNG files with no gamma information png_set_alpha_mode allows + * you to provide a default gamma, but it also sets the ouput gamma to the + * matching value. If you know your PNG files have a gamma that doesn't + * match the output you can take advantage of the fact that + * png_set_alpha_mode always sets the output gamma but only sets the PNG + * default if it is not already set: + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * The first call sets both the default and the output gamma values, the + * second call overrides the output gamma without changing the default. This + * is easier than achieving the same effect with png_set_gamma. You must use + * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will + * fire if more than one call to png_set_alpha_mode and png_set_background is + * made in the same read operation, however multiple calls with PNG_ALPHA_PNG + * are ignored. + */ + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED +PNG_EXPORT(36, void, png_set_strip_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXPORT(37, void, png_set_swap_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXPORT(38, void, png_set_invert_alpha, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(39, void, png_set_filler, (png_structp png_ptr, png_uint_32 filler, + int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +# define PNG_FILLER_BEFORE 0 +# define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(40, void, png_set_add_alpha, + (png_structp png_ptr, png_uint_32 filler, + int flags)); +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +PNG_EXPORT(41, void, png_set_swap, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +PNG_EXPORT(42, void, png_set_packing, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ + defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +PNG_EXPORT(43, void, png_set_packswap, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +PNG_EXPORT(44, void, png_set_shift, (png_structp png_ptr, png_const_color_8p + true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. + * MUST be called before png_read_update_info or png_start_read_image, + * otherwise it will not have the desired effect. Note that it is still + * necessary to call png_read_row or png_read_rows png_get_image_height + * times for each pass. +*/ +PNG_EXPORT(45, int, png_set_interlace_handling, (png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +/* Handle alpha and tRNS by replacing with a background color. Prior to + * libpng-1.5.4 this API must not be called before the PNG file header has been + * read. Doing so will result in unexpected behavior and possible warnings or + * errors if the PNG file contains a bKGD chunk. + */ +PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)) +PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma)) +#endif +#ifdef PNG_READ_BACKGROUND_SUPPORTED +# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +# define PNG_BACKGROUND_GAMMA_SCREEN 1 +# define PNG_BACKGROUND_GAMMA_FILE 2 +# define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED +/* Scale a 16-bit depth file down to 8-bit, accurately. */ +PNG_EXPORT(229, void, png_set_scale_16, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */ +/* Strip the second byte of information from a 16-bit depth file. */ +PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr)); +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* Turn on quantizing, and reduce the palette to the number of colors + * available. + */ +PNG_EXPORT(49, void, png_set_quantize, + (png_structp png_ptr, png_colorp palette, + int num_palette, int maximum_colors, png_const_uint_16p histogram, + int full_quantize)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* The threshold on gamma processing is configurable but hard-wired into the + * library. The following is the floating point variant. + */ +#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) + +/* Handle gamma correction. Screen_gamma=(display_exponent). + * NOTE: this API simply sets the screen and file gamma values. It will + * therefore override the value for gamma in a PNG file if it is called after + * the file header has been read - use with care - call before reading the PNG + * file for best results! + * + * These routines accept the same gamma values as png_set_alpha_mode (described + * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either + * API (floating point or fixed.) Notice, however, that the 'file_gamma' value + * is the inverse of a 'screen gamma' value. + */ +PNG_FP_EXPORT(50, void, png_set_gamma, + (png_structp png_ptr, double screen_gamma, + double override_file_gamma)) +PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr, + png_fixed_point screen_gamma, png_fixed_point override_file_gamma)) +#endif + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +/* Set how many lines between output flushes - 0 for no flushing */ +PNG_EXPORT(51, void, png_set_flush, (png_structp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +PNG_EXPORT(52, void, png_write_flush, (png_structp png_ptr)); +#endif + +/* Optional update palette with requested transformations */ +PNG_EXPORT(53, void, png_start_read_image, (png_structp png_ptr)); + +/* Optional call to update the users info structure */ +PNG_EXPORT(54, void, png_read_update_info, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. */ +PNG_EXPORT(55, void, png_read_rows, (png_structp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read a row of data. */ +PNG_EXPORT(56, void, png_read_row, (png_structp png_ptr, png_bytep row, + png_bytep display_row)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the whole image into memory at once. */ +PNG_EXPORT(57, void, png_read_image, (png_structp png_ptr, png_bytepp image)); +#endif + +/* Write a row of image data */ +PNG_EXPORT(58, void, png_write_row, + (png_structp png_ptr, png_const_bytep row)); + +/* Write a few rows of image data: (*row) is not written; however, the type + * is declared as writeable to maintain compatibility with previous versions + * of libpng and to allow the 'display_row' array from read_rows to be passed + * unchanged to write_rows. + */ +PNG_EXPORT(59, void, png_write_rows, (png_structp png_ptr, png_bytepp row, + png_uint_32 num_rows)); + +/* Write the image data */ +PNG_EXPORT(60, void, png_write_image, + (png_structp png_ptr, png_bytepp image)); + +/* Write the end of the PNG file. */ +PNG_EXPORT(61, void, png_write_end, + (png_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. */ +PNG_EXPORT(62, void, png_read_end, (png_structp png_ptr, png_infop info_ptr)); +#endif + +/* Free any memory associated with the png_info_struct */ +PNG_EXPORT(63, void, png_destroy_info_struct, (png_structp png_ptr, + png_infopp info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr)); + +/* Set the libpng method of handling chunk CRC errors */ +PNG_EXPORT(66, void, png_set_crc_action, + (png_structp png_ptr, int crit_action, int ancil_action)); + +/* Values for png_set_crc_action() say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* Set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +PNG_EXPORT(67, void, png_set_filter, + (png_structp png_ptr, int method, int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs)) +PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, + (png_structp png_ptr, + int heuristic_method, int num_weights, png_const_fixed_point_p + filter_weights, png_const_fixed_point_p filter_costs)) +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +#ifdef PNG_WRITE_SUPPORTED +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +PNG_EXPORT(69, void, png_set_compression_level, + (png_structp png_ptr, int level)); + +PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structp png_ptr, + int mem_level)); + +PNG_EXPORT(71, void, png_set_compression_strategy, (png_structp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr, + int window_bits)); + +PNG_EXPORT(73, void, png_set_compression_method, (png_structp png_ptr, + int method)); +#endif + +#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +/* Also set zlib parameters for compressing non-IDAT chunks */ +PNG_EXPORT(222, void, png_set_text_compression_level, + (png_structp png_ptr, int level)); + +PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structp png_ptr, + int mem_level)); + +PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(225, void, png_set_text_compression_window_bits, (png_structp + png_ptr, int window_bits)); + +PNG_EXPORT(226, void, png_set_text_compression_method, (png_structp png_ptr, + int method)); +#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng-manual.txt for + * more information. + */ + +#ifdef PNG_STDIO_SUPPORTED +/* Initialize the input/output for the PNG file to the default functions. */ +PNG_EXPORT(74, void, png_init_io, (png_structp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +PNG_EXPORT(75, void, png_set_error_fn, + (png_structp png_ptr, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used. + */ +PNG_EXPORT(77, void, png_set_write_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +PNG_EXPORT(78, void, png_set_read_fn, (png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_structp png_ptr)); + +PNG_EXPORT(80, void, png_set_read_status_fn, (png_structp png_ptr, + png_read_status_ptr read_row_fn)); + +PNG_EXPORT(81, void, png_set_write_status_fn, (png_structp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +PNG_EXPORT(82, void, png_set_mem_fn, (png_structp png_ptr, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structp png_ptr)); +#endif + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr read_user_transform_fn)); +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structp png_ptr, + png_user_transform_ptr write_user_transform_fn)); +#endif + +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +PNG_EXPORT(86, void, png_set_user_transform_info, (png_structp png_ptr, + png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, + (png_const_structp png_ptr)); +#endif + +#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED +/* Return information about the row currently being processed. Note that these + * APIs do not fail but will return unexpected results if called outside a user + * transform callback. Also note that when transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structp)); +PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structp)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structp png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr, + png_voidp progressive_ptr, png_progressive_info_ptr info_fn, + png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); + +/* Returns the user pointer associated with the push read functions */ +PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structp png_ptr)); + +/* Function to be called when data becomes available */ +PNG_EXPORT(92, void, png_process_data, + (png_structp png_ptr, png_infop info_ptr, + png_bytep buffer, png_size_t buffer_size)); + +/* A function which may be called *only* within png_process_data to stop the + * processing of any more data. The function returns the number of bytes + * remaining, excluding any that libpng has cached internally. A subsequent + * call to png_process_data must supply these bytes again. If the argument + * 'save' is set to true the routine will first save all the pending data and + * will always return 0. + */ +PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save)); + +/* A function which may be called *only* outside (after) a call to + * png_process_data. It returns the number of bytes of data to skip in the + * input. Normally it will return 0, but if it returns a non-zero value the + * application must skip than number of bytes of input data and pass the + * following data to the next call to png_process_data. + */ +PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp)); + +#ifdef PNG_READ_INTERLACING_SUPPORTED +/* Function that combines rows. 'new_row' is a flag that should come from + * the callback and be non-NULL if anything needs to be done; the library + * stores its own version of the new data internally and ignores the passed + * in value. + */ +PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr, + png_bytep old_row, png_const_bytep new_row)); +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +PNG_EXPORTA(94, png_voidp, png_malloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); +/* Added at libpng version 1.4.0 */ +PNG_EXPORTA(95, png_voidp, png_calloc, + (png_structp png_ptr, png_alloc_size_t size), + PNG_ALLOCATED); + +/* Added at libpng version 1.2.4 */ +PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); + +/* Frees a pointer allocated by png_malloc() */ +PNG_EXPORT(97, void, png_free, (png_structp png_ptr, png_voidp ptr)); + +/* Free data that was allocated internally */ +PNG_EXPORT(98, void, png_free_data, + (png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); + +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application */ +PNG_EXPORT(99, void, png_data_freer, + (png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); + +/* Assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#define PNG_FREE_UNKN 0x0200 +#define PNG_FREE_LIST 0x0400 +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_structp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); +PNG_EXPORT(101, void, png_free_default, (png_structp png_ptr, png_voidp ptr)); +#endif + +#ifdef PNG_ERROR_TEXT_SUPPORTED +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(102, void, png_error, + (png_structp png_ptr, png_const_charp error_message), + PNG_NORETURN); + +/* The same, but the chunk name is prepended to the error string. */ +PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr, + png_const_charp error_message), PNG_NORETURN); + +#else +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(104, void, png_err, (png_structp png_ptr), PNG_NORETURN); +#endif + +#ifdef PNG_WARNINGS_SUPPORTED +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +PNG_EXPORT(105, void, png_warning, (png_structp png_ptr, + png_const_charp warning_message)); + +/* Non-fatal error in libpng, chunk name is prepended to message. */ +PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr, + png_const_charp warning_message)); +#endif + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +/* Benign error in libpng. Can continue, but may have a problem. + * User can choose whether to handle as a fatal error or as a warning. */ +# undef png_benign_error +PNG_EXPORT(107, void, png_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); + +/* Same, chunk name is prepended to message. */ +# undef png_chunk_benign_error +PNG_EXPORT(108, void, png_chunk_benign_error, (png_structp png_ptr, + png_const_charp warning_message)); + +PNG_EXPORT(109, void, png_set_benign_errors, + (png_structp png_ptr, int allowed)); +#else +# ifdef PNG_ALLOW_BENIGN_ERRORS +# define png_benign_error png_warning +# define png_chunk_benign_error png_chunk_warning +# else +# define png_benign_error png_error +# define png_chunk_benign_error png_chunk_error +# endif +#endif + +/* The png_set_ functions are for storing values in the png_info_struct. + * Similarly, the png_get_ calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_ functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +PNG_EXPORT(110, png_uint_32, png_get_valid, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* Returns row_pointers, which is an array of pointers to scanlines that was + * returned from png_read_png(). + */ +PNG_EXPORT(112, png_bytepp, png_get_rows, + (png_const_structp png_ptr, png_const_infop info_ptr)); +/* Set row_pointers, which is an array of pointers to scanlines for use + * by png_write_png(). + */ +PNG_EXPORT(113, void, png_set_rows, (png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +PNG_EXPORT(114, png_byte, png_get_channels, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image height in pixels. */ +PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image bit_depth. */ +PNG_EXPORT(117, png_byte, png_get_bit_depth, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns image color_type. */ +PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image filter_type. */ +PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image interlace_type. */ +PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image compression_type. */ +PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structp png_ptr, + png_const_infop info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, + (png_const_structp png_ptr, png_const_infop info_ptr)) +PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr)) + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); +PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +/* Returns pointer to signature string read from PNG header */ +PNG_EXPORT(130, png_const_bytep, png_get_signature, + (png_const_structp png_ptr, png_infop info_ptr)); + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(131, png_uint_32, png_get_bKGD, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_16p *background)); +#endif + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr, + png_const_color_16p background)); +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr, + png_const_infop info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)) +PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_structp png_ptr, + png_const_infop info_ptr, double *red_X, double *red_Y, double *red_Z, + double *green_X, double *green_Y, double *green_Z, double *blue_X, + double *blue_Y, double *blue_Z)) +#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */ +PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, + (png_const_structp png_ptr, + png_const_infop info_ptr, png_fixed_point *int_white_x, + png_fixed_point *int_white_y, png_fixed_point *int_red_x, + png_fixed_point *int_red_y, png_fixed_point *int_green_x, + png_fixed_point *int_green_y, png_fixed_point *int_blue_x, + png_fixed_point *int_blue_y)) +#endif +PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, + (png_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_red_X, png_fixed_point *int_red_Y, + png_fixed_point *int_red_Z, png_fixed_point *int_green_X, + png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, + png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, + png_fixed_point *int_blue_Z)) +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(135, void, png_set_cHRM, + (png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, double green_x, + double green_y, double blue_x, double blue_y)) +PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_structp png_ptr, + png_infop info_ptr, double red_X, double red_Y, double red_Z, + double green_X, double green_Y, double green_Z, double blue_X, + double blue_Y, double blue_Z)) +PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, + png_fixed_point int_white_y, png_fixed_point int_red_x, + png_fixed_point int_red_y, png_fixed_point int_green_x, + png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)) +PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, + png_fixed_point int_red_Z, png_fixed_point int_green_X, + png_fixed_point int_green_Y, png_fixed_point int_green_Z, + png_fixed_point int_blue_X, png_fixed_point int_blue_Y, + png_fixed_point int_blue_Z)) +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, + (png_const_structp png_ptr, png_const_infop info_ptr, + double *file_gamma)) +PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_file_gamma)) +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(139, void, png_set_gAMA, (png_structp png_ptr, + png_infop info_ptr, double file_gamma)) +PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)) +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(141, png_uint_32, png_get_hIST, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_16p *hist)); +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(142, void, png_set_hIST, (png_structp png_ptr, + png_infop info_ptr, png_const_uint_16p hist)); +#endif + +PNG_EXPORT(143, png_uint_32, png_get_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, + int *interlace_method, int *compression_method, int *filter_method)); + +PNG_EXPORT(144, void, png_set_IHDR, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, + int interlace_method, int compression_method, int filter_method)); + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(145, png_uint_32, png_get_oFFs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); +#endif + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(146, void, png_set_oFFs, + (png_structp png_ptr, png_infop info_ptr, + png_int_32 offset_x, png_int_32 offset_y, int unit_type)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(147, png_uint_32, png_get_pCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, + int *nparams, + png_charp *units, png_charpp *params)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(148, void, png_set_pCAL, (png_structp png_ptr, + png_infop info_ptr, + png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, + int nparams, png_const_charp units, png_charpp params)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(149, png_uint_32, png_get_pHYs, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(150, void, png_set_pHYs, + (png_structp png_ptr, png_infop info_ptr, + png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +PNG_EXPORT(151, png_uint_32, png_get_PLTE, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_colorp *palette, int *num_palette)); + +PNG_EXPORT(152, void, png_set_PLTE, + (png_structp png_ptr, png_infop info_ptr, + png_const_colorp palette, int num_palette)); + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(153, png_uint_32, png_get_sBIT, + (png_const_structp png_ptr, png_infop info_ptr, + png_color_8p *sig_bit)); +#endif + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(154, void, png_set_sBIT, + (png_structp png_ptr, png_infop info_ptr, png_const_color_8p sig_bit)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structp png_ptr, + png_const_infop info_ptr, int *file_srgb_intent)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(156, void, png_set_sRGB, + (png_structp png_ptr, png_infop info_ptr, int srgb_intent)); +PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_structp png_ptr, + png_infop info_ptr, int srgb_intent)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(158, png_uint_32, png_get_iCCP, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_charpp name, int *compression_type, png_bytepp profile, + png_uint_32 *proflen)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(159, void, png_set_iCCP, + (png_structp png_ptr, png_infop info_ptr, + png_const_charp name, int compression_type, png_const_bytep profile, + png_uint_32 proflen)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(160, png_uint_32, png_get_sPLT, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_sPLT_tpp entries)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(161, void, png_set_sPLT, + (png_structp png_ptr, png_infop info_ptr, + png_const_sPLT_tp entries, int nentries)); +#endif + +#ifdef PNG_TEXT_SUPPORTED +/* png_get_text also returns the number of text chunks in *num_text */ +PNG_EXPORT(162, png_uint_32, png_get_text, + (png_const_structp png_ptr, png_const_infop info_ptr, + png_textp *text_ptr, int *num_text)); +#endif + +/* Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#ifdef PNG_TEXT_SUPPORTED +PNG_EXPORT(163, void, png_set_text, + (png_structp png_ptr, png_infop info_ptr, + png_const_textp text_ptr, int num_text)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(164, png_uint_32, png_get_tIME, + (png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(165, void, png_set_tIME, + (png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(166, png_uint_32, png_get_tRNS, + (png_const_structp png_ptr, png_infop info_ptr, + png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(167, void, png_set_tRNS, + (png_structp png_ptr, png_infop info_ptr, + png_const_bytep trans_alpha, int num_trans, + png_const_color_16p trans_color)); +#endif + +#ifdef PNG_sCAL_SUPPORTED +PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, double *width, double *height)) +#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED +/* NOTE: this API is currently implemented using floating point arithmetic, + * consequently it can only be used on systems with floating point support. + * In any case the range of values supported by png_fixed_point is small and it + * is highly recommended that png_get_sCAL_s be used instead. + */ +PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, + (png_structp png_ptr, png_const_infop info_ptr, int *unit, + png_fixed_point *width, + png_fixed_point *height)) +#endif +PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, + (png_const_structp png_ptr, png_const_infop info_ptr, + int *unit, png_charpp swidth, png_charpp sheight)); + +PNG_FP_EXPORT(170, void, png_set_sCAL, + (png_structp png_ptr, png_infop info_ptr, + int unit, double width, double height)) +PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr, + png_infop info_ptr, int unit, png_fixed_point width, + png_fixed_point height)) +PNG_EXPORT(171, void, png_set_sCAL_s, + (png_structp png_ptr, png_infop info_ptr, + int unit, png_const_charp swidth, png_const_charp sheight)); +#endif /* PNG_sCAL_SUPPORTED */ + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +/* Provide a list of chunks and how they are to be handled, if the built-in + handling or default unknown chunk handling is not desired. Any chunks not + listed will be handled in the default manner. The IHDR and IEND chunks + must not be listed. Because this turns off the default handling for chunks + that would otherwise be recognized the behavior of libpng transformations may + well become incorrect! + keep = 0: PNG_HANDLE_CHUNK_AS_DEFAULT: follow default behavior + = 1: PNG_HANDLE_CHUNK_NEVER: do not keep + = 2: PNG_HANDLE_CHUNK_IF_SAFE: keep only if safe-to-copy + = 3: PNG_HANDLE_CHUNK_ALWAYS: keep even if unsafe-to-copy +*/ +PNG_EXPORT(172, void, png_set_keep_unknown_chunks, + (png_structp png_ptr, int keep, + png_const_bytep chunk_list, int num_chunks)); + +/* The handling code is returned; the result is therefore true (non-zero) if + * special handling is required, false for the default handling. + */ +PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr, + png_const_bytep chunk_name)); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +PNG_EXPORT(174, void, png_set_unknown_chunks, (png_structp png_ptr, + png_infop info_ptr, png_const_unknown_chunkp unknowns, + int num_unknowns)); +PNG_EXPORT(175, void, png_set_unknown_chunk_location, + (png_structp png_ptr, png_infop info_ptr, int chunk, int location)); +PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structp png_ptr, + png_const_infop info_ptr, png_unknown_chunkpp entries)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + * If you need to turn it off for a chunk that your application has freed, + * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); + */ +PNG_EXPORT(177, void, png_set_invalid, + (png_structp png_ptr, png_infop info_ptr, int mask)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* The "params" pointer is currently not used and is for future expansion. */ +PNG_EXPORT(178, void, png_read_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); +PNG_EXPORT(179, void, png_write_png, (png_structp png_ptr, png_infop info_ptr, + int transforms, png_voidp params)); +#endif + +PNG_EXPORT(180, png_const_charp, png_get_copyright, + (png_const_structp png_ptr)); +PNG_EXPORT(181, png_const_charp, png_get_header_ver, + (png_const_structp png_ptr)); +PNG_EXPORT(182, png_const_charp, png_get_header_version, + (png_const_structp png_ptr)); +PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, + (png_const_structp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr, + png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. + */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +PNG_EXPORT(185, void, png_set_strip_error_numbers, + (png_structp png_ptr, + png_uint_32 strip_mode)); +#endif + +/* Added in libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +PNG_EXPORT(186, void, png_set_user_limits, (png_structp png_ptr, + png_uint_32 user_width_max, png_uint_32 user_height_max)); +PNG_EXPORT(187, png_uint_32, png_get_user_width_max, + (png_const_structp png_ptr)); +PNG_EXPORT(188, png_uint_32, png_get_user_height_max, + (png_const_structp png_ptr)); +/* Added in libpng-1.4.0 */ +PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structp png_ptr, + png_uint_32 user_chunk_cache_max)); +PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, + (png_const_structp png_ptr)); +/* Added in libpng-1.4.1 */ +PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structp png_ptr, + png_alloc_size_t user_chunk_cache_max)); +PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, + (png_const_structp png_ptr)); +#endif + +#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) +PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, + (png_const_structp png_ptr, png_const_infop info_ptr)); + +PNG_FP_EXPORT(196, float, png_get_x_offset_inches, + (png_const_structp png_ptr, png_const_infop info_ptr)) +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)) +#endif + +PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr, + png_const_infop info_ptr)) +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, + (png_structp png_ptr, png_const_infop info_ptr)) +#endif + +# ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structp png_ptr, + png_const_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +# endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ + +/* Added in libpng-1.4.0 */ +#ifdef PNG_IO_STATE_SUPPORTED +PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_structp png_ptr)); + +PNG_EXPORTA(200, png_const_bytep, png_get_io_chunk_name, + (png_structp png_ptr), PNG_DEPRECATED); +PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, + (png_const_structp png_ptr)); + +/* The flags returned by png_get_io_state() are the following: */ +# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ +# define PNG_IO_READING 0x0001 /* currently reading */ +# define PNG_IO_WRITING 0x0002 /* currently writing */ +# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ +# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ +# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ +# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ +# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ +# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ +#endif /* ?PNG_IO_STATE_SUPPORTED */ + +/* Interlace support. The following macros are always defined so that if + * libpng interlace handling is turned off the macros may be used to handle + * interlaced images within the application. + */ +#define PNG_INTERLACE_ADAM7_PASSES 7 + +/* Two macros to return the first row and first column of the original, + * full, image which appears in a given pass. 'pass' is in the range 0 + * to 6 and the result is in the range 0 to 7. + */ +#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7) +#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7) + +/* A macro to return the offset between pixels in the output row for a pair of + * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that + * follows. Note that ROW_OFFSET is the offset from one row to the next whereas + * COL_OFFSET is from one column to the next, within a row. + */ +#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8) +#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1)) + +/* Two macros to help evaluate the number of rows or columns in each + * pass. This is expressed as a shift - effectively log2 of the number or + * rows or columns in each 8x8 tile of the original image. + */ +#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) +#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) + +/* Hence two macros to determine the number of rows or columns in a given + * pass of an image given its height or width. In fact these macros may + * return non-zero even though the sub-image is empty, because the other + * dimension may be empty for a small image. + */ +#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) +#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) + +/* For the reader row callbacks (both progressive and sequential) it is + * necessary to find the row in the output image given a row in an interlaced + * image, so two more macros: + */ +#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \ + (((yIn)<>(((7-(off))-(pass))<<2)) & 0xF) | \ + ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0)) + +#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ + ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) +#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ + ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ + * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 \ + - (png_uint_16)(alpha)) + 128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \ + * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(65535 \ + - (png_uint_32)(alpha)) + 32768); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* Standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + 127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \ + 32767) / 65535) +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); +PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); +PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); +#endif + +PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_structp png_ptr, + png_const_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); +#endif +#ifdef PNG_SAVE_INT_32_SUPPORTED +PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); +#endif + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ +#endif + +#ifdef PNG_USE_READ_MACROS +/* Inline macros to do direct reads of bytes from the input buffer. + * The png_get_int_32() routine assumes we are using two's complement + * format for negative values, which is almost certainly true. + */ +# define png_get_uint_32(buf) \ + (((png_uint_32)(*(buf)) << 24) + \ + ((png_uint_32)(*((buf) + 1)) << 16) + \ + ((png_uint_32)(*((buf) + 2)) << 8) + \ + ((png_uint_32)(*((buf) + 3)))) + + /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the + * function) incorrectly returned a value of type png_uint_32. + */ +# define png_get_uint_16(buf) \ + ((png_uint_16) \ + (((unsigned int)(*(buf)) << 8) + \ + ((unsigned int)(*((buf) + 1))))) + +# define png_get_int_32(buf) \ + ((png_int_32)((*(buf) & 0x80) \ + ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ + : (png_int_32)png_get_uint_32(buf))) +#endif + +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr, + int allowed)); +# ifdef PNG_GET_PALETTE_MAX_SUPPORTED +PNG_EXPORT(235, int, png_get_palette_max, (png_const_structp png_ptr, + png_const_infop info_ptr)); +# endif +#endif /* CHECK_FOR_INVALID_INDEX */ + +/******************************************************************************* + * IMPLEMENTATION OPTIONS + ******************************************************************************* + * + * Support for arbitrary implementation-specific optimizations. The API allows + * particular options to be turned on or off. 'Option' is the number of the + * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given + * by the PNG_OPTION_ defines below. + * + * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions, + * are detected at run time, however sometimes it may be impossible + * to do this in user mode, in which case it is necessary to discover + * the capabilities in an OS specific way. Such capabilities are + * listed here when libpng has support for them and must be turned + * ON by the application if present. + * + * SOFTWARE: sometimes software optimizations actually result in performance + * decrease on some architectures or systems, or with some sets of + * PNG images. 'Software' options allow such optimizations to be + * selected at run time. + */ +#ifdef PNG_SET_OPTION_SUPPORTED +#ifdef PNG_ARM_NEON_API_SUPPORTED +# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ +#endif +#define PNG_OPTION_NEXT 2 /* Next option - numbers must be even */ + +/* Return values: NOTE: there are four values and 'off' is *not* zero */ +#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ +#define PNG_OPTION_INVALID 1 /* Option number out of range */ +#define PNG_OPTION_OFF 2 +#define PNG_OPTION_ON 3 + +PNG_EXPORT(236, int, png_set_option, (png_structp png_ptr, int option, + int onoff)); +#endif + +/******************************************************************************* + * END OF HARDWARE OPTIONS + ******************************************************************************/ + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project + * defs + */ + +/* The last ordinal number (this is the *last* one already used; the next + * one to use is one more than this.) Maintainer, remember to add an entry to + * scripts/symbols.def as well. + */ +#ifdef PNG_EXPORT_LAST_ORDINAL + PNG_EXPORT_LAST_ORDINAL(236); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* Do not put anything past this line */ +#endif /* PNG_H */ diff --git a/src/lib_armv6/libpng15/libpng15/pngconf.h b/src/lib_armv6/libpng15/libpng15/pngconf.h new file mode 100644 index 0000000..0759db0 --- /dev/null +++ b/src/lib_armv6/libpng15/libpng15/pngconf.h @@ -0,0 +1,600 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.5.18 - February 6, 2014 + * + * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +#ifndef PNG_BUILDING_SYMBOL_TABLE +/* PNG_NO_LIMITS_H may be used to turn off the use of the standard C + * definition file for machine specific limits, this may impact the + * correctness of the definitions below (see uses of INT_MAX). + */ +# ifndef PNG_NO_LIMITS_H +# include +# endif + +/* For the memory copy APIs (i.e. the standard definitions of these), + * because this file defines png_memcpy and so on the base APIs must + * be defined here. + */ +# ifdef BSD +# include +# else +# include +# endif + +/* For png_FILE_p - this provides the standard definition of a + * FILE + */ +# ifdef PNG_STDIO_SUPPORTED +# include +# endif +#endif + +/* This controls optimization of the reading of 16 and 32 bit values + * from PNG files. It can be set on a per-app-file basis - it + * just changes whether a macro is used when the function is called. + * The library builder sets the default; if read functions are not + * built into the library the macro implementation is forced on. + */ +#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED +# define PNG_USE_READ_MACROS +#endif +#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) +# if PNG_DEFAULT_READ_MACROS +# define PNG_USE_READ_MACROS +# endif +#endif + +/* COMPILER SPECIFIC OPTIONS. + * + * These options are provided so that a variety of difficult compilers + * can be used. Some are fixed at build time (e.g. PNG_API_RULE + * below) but still have compiler specific implementations, others + * may be changed on a per-file basis when compiling against libpng. + */ + +/* The PNGARG macro protects us against machines that don't have function + * prototypes (ie K&R style headers). If your compiler does not handle + * function prototypes, define this macro and use the included ansi2knr. + * I've always been able to use _NO_PROTO as the indicator, but you may + * need to drag the empty declaration out in front of here, or change the + * ifdef to suit your own needs. + */ +#ifndef PNGARG + +# ifdef OF /* zlib prototype munger */ +# define PNGARG(arglist) OF(arglist) +# else + +# ifdef _NO_PROTO +# define PNGARG(arglist) () +# else +# define PNGARG(arglist) arglist +# endif /* _NO_PROTO */ + +# endif /* OF */ + +#endif /* PNGARG */ + +/* Function calling conventions. + * ============================= + * Normally it is not necessary to specify to the compiler how to call + * a function - it just does it - however on x86 systems derived from + * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems + * and some others) there are multiple ways to call a function and the + * default can be changed on the compiler command line. For this reason + * libpng specifies the calling convention of every exported function and + * every function called via a user supplied function pointer. This is + * done in this file by defining the following macros: + * + * PNGAPI Calling convention for exported functions. + * PNGCBAPI Calling convention for user provided (callback) functions. + * PNGCAPI Calling convention used by the ANSI-C library (required + * for longjmp callbacks and sometimes used internally to + * specify the calling convention for zlib). + * + * These macros should never be overridden. If it is necessary to + * change calling convention in a private build this can be done + * by setting PNG_API_RULE (which defaults to 0) to one of the values + * below to select the correct 'API' variants. + * + * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. + * This is correct in every known environment. + * PNG_API_RULE=1 Use the operating system convention for PNGAPI and + * the 'C' calling convention (from PNGCAPI) for + * callbacks (PNGCBAPI). This is no longer required + * in any known environment - if it has to be used + * please post an explanation of the problem to the + * libpng mailing list. + * + * These cases only differ if the operating system does not use the C + * calling convention, at present this just means the above cases + * (x86 DOS/Windows sytems) and, even then, this does not apply to + * Cygwin running on those systems. + * + * Note that the value must be defined in pnglibconf.h so that what + * the application uses to call the library matches the conventions + * set when building the library. + */ + +/* Symbol export + * ============= + * When building a shared library it is almost always necessary to tell + * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' + * is used to mark the symbols. On some systems these symbols can be + * extracted at link time and need no special processing by the compiler, + * on other systems the symbols are flagged by the compiler and just + * the declaration requires a special tag applied (unfortunately) in a + * compiler dependent way. Some systems can do either. + * + * A small number of older systems also require a symbol from a DLL to + * be flagged to the program that calls it. This is a problem because + * we do not know in the header file included by application code that + * the symbol will come from a shared library, as opposed to a statically + * linked one. For this reason the application must tell us by setting + * the magic flag PNG_USE_DLL to turn on the special processing before + * it includes png.h. + * + * Four additional macros are used to make this happen: + * + * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from + * the build or imported if PNG_USE_DLL is set - compiler + * and system specific. + * + * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to + * 'type', compiler specific. + * + * PNG_DLL_EXPORT Set to the magic to use during a libpng build to + * make a symbol exported from the DLL. Not used in the + * public header files; see pngpriv.h for how it is used + * in the libpng build. + * + * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come + * from a DLL - used to define PNG_IMPEXP when + * PNG_USE_DLL is set. + */ + +/* System specific discovery. + * ========================== + * This code is used at build time to find PNG_IMPEXP, the API settings + * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL + * import processing is possible. On Windows systems it also sets + * compiler-specific macros to the values required to change the calling + * conventions of the various functions. + */ +#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ + defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) + /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or + * MinGW on any architecture currently supported by Windows. Also includes + * Watcom builds but these need special treatment because they are not + * compatible with GCC or Visual C because of different calling conventions. + */ +# if PNG_API_RULE == 2 + /* If this line results in an error, either because __watcall is not + * understood or because of a redefine just below you cannot use *this* + * build of the library with the compiler you are using. *This* build was + * build using Watcom and applications must also be built using Watcom! + */ +# define PNGCAPI __watcall +# endif + +# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) +# define PNGCAPI __cdecl +# if PNG_API_RULE == 1 + /* If this line results in an error __stdcall is not understood and + * PNG_API_RULE should not have been set to '1'. + */ +# define PNGAPI __stdcall +# endif +# else + /* An older compiler, or one not detected (erroneously) above, + * if necessary override on the command line to get the correct + * variants for the compiler. + */ +# ifndef PNGCAPI +# define PNGCAPI _cdecl +# endif +# if PNG_API_RULE == 1 && !defined(PNGAPI) +# define PNGAPI _stdcall +# endif +# endif /* compiler/api */ + /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ + +# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) + ERROR: PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed +# endif + +# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ + (defined(__BORLANDC__) && __BORLANDC__ < 0x500) + /* older Borland and MSC + * compilers used '__export' and required this to be after + * the type. + */ +# ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP +# endif +# define PNG_DLL_EXPORT __export +# else /* newer compiler */ +# define PNG_DLL_EXPORT __declspec(dllexport) +# ifndef PNG_DLL_IMPORT +# define PNG_DLL_IMPORT __declspec(dllimport) +# endif +# endif /* compiler */ + +#else /* !Windows */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# define PNGAPI _System +# else /* !Windows/x86 && !OS/2 */ + /* Use the defaults, or define PNG*API on the command line (but + * this will have to be done for every compile!) + */ +# endif /* other system, !OS/2 */ +#endif /* !Windows/x86 */ + +/* Now do all the defaulting . */ +#ifndef PNGCAPI +# define PNGCAPI +#endif +#ifndef PNGCBAPI +# define PNGCBAPI PNGCAPI +#endif +#ifndef PNGAPI +# define PNGAPI PNGCAPI +#endif + +/* PNG_IMPEXP may be set on the compilation system command line or (if not set) + * then in an internal header file when building the library, otherwise (when + * using the library) it is set here. + */ +#ifndef PNG_IMPEXP +# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) + /* This forces use of a DLL, disallowing static linking */ +# define PNG_IMPEXP PNG_DLL_IMPORT +# endif + +# ifndef PNG_IMPEXP +# define PNG_IMPEXP +# endif +#endif + +/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat + * 'attributes' as a storage class - the attributes go at the start of the + * function definition, and attributes are always appended regardless of the + * compiler. This considerably simplifies these macros but may cause problems + * if any compilers both need function attributes and fail to handle them as + * a storage class (this is unlikely.) + */ +#ifndef PNG_FUNCTION +# define PNG_FUNCTION(type, name, args, attributes) attributes type name args +#endif + +#ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type +#endif + + /* The ordinal value is only relevant when preprocessing png.h for symbol + * table entries, so we discard it here. See the .dfn files in the + * scripts directory. + */ +#ifndef PNG_EXPORTA + +# define PNG_EXPORTA(ordinal, type, name, args, attributes)\ + PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \ + extern attributes) +#endif + +/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, + * so make something non-empty to satisfy the requirement: + */ +#define PNG_EMPTY /*empty list*/ + +#define PNG_EXPORT(ordinal, type, name, args)\ + PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) + +/* Use PNG_REMOVED to comment out a removed interface. */ +#ifndef PNG_REMOVED +# define PNG_REMOVED(ordinal, type, name, args, attributes) +#endif + +#ifndef PNG_CALLBACK +# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) +#endif + +/* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. + * + * Added at libpng-1.2.41. + */ + +#ifndef PNG_NO_PEDANTIC_WARNINGS +# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED +# define PNG_PEDANTIC_WARNINGS_SUPPORTED +# endif +#endif + +#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED + /* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. Added at libpng + * version 1.2.41. + */ + +# if defined(__GNUC__) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __attribute__((__noreturn__)) +# endif +# if __GNUC__ >= 3 +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __attribute__((__malloc__)) +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __attribute__((__deprecated__)) +# endif +# ifndef PNG_PRIVATE +# if 0 /* Doesn't work so we use deprecated instead*/ +# define PNG_PRIVATE \ + __attribute__((warning("This function is not exported by libpng."))) +# else +# define PNG_PRIVATE \ + __attribute__((__deprecated__)) +# endif +# endif +# endif /* __GNUC__ >= 3 */ +# endif /* __GNUC__ */ + +# if defined(_MSC_VER) && (_MSC_VER >= 1300) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* not supported */ +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __declspec(noreturn) +# endif +# ifndef PNG_ALLOCATED +# if (_MSC_VER >= 1400) +# define PNG_ALLOCATED __declspec(restrict) +# endif +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __declspec(deprecated) +# endif +# ifndef PNG_PRIVATE +# define PNG_PRIVATE __declspec(deprecated) +# endif +# endif /* _MSC_VER */ +#endif /* PNG_PEDANTIC_WARNINGS */ + +#ifndef PNG_DEPRECATED +# define PNG_DEPRECATED /* Use of this function is deprecated */ +#endif +#ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* The result of this function must be checked */ +#endif +#ifndef PNG_NORETURN +# define PNG_NORETURN /* This function does not return */ +#endif +#ifndef PNG_ALLOCATED +# define PNG_ALLOCATED /* The result of the function is new memory */ +#endif +#ifndef PNG_PRIVATE +# define PNG_PRIVATE /* This is a private libpng function */ +#endif +#ifndef PNG_FP_EXPORT /* A floating point API. */ +# ifdef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FP_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args); +# else /* No floating point APIs */ +# define PNG_FP_EXPORT(ordinal, type, name, args) +# endif +#endif +#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ +# ifdef PNG_FIXED_POINT_SUPPORTED +# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args); +# else /* No fixed point APIs */ +# define PNG_FIXED_EXPORT(ordinal, type, name, args) +# endif +#endif + +/* The following uses const char * instead of char * for error + * and warning message functions, so some compilers won't complain. + * If you do not want to use const, define PNG_NO_CONST here. + * + * This should not change how the APIs are called, so it can be done + * on a per-file basis in the application. + */ +#ifndef PNG_CONST +# ifndef PNG_NO_CONST +# define PNG_CONST const +# else +# define PNG_CONST +# endif +#endif + +/* Some typedefs to get us started. These should be safe on most of the + * common platforms. The typedefs should be at least as large as the + * numbers suggest (a png_uint_32 must be at least 32 bits long), but they + * don't have to be exactly that size. Some compilers dislike passing + * unsigned shorts as function parameters, so you may be better off using + * unsigned int for png_uint_16. + */ + +#if defined(INT_MAX) && (INT_MAX > 0x7ffffffeL) +typedef unsigned int png_uint_32; +typedef int png_int_32; +#else +typedef unsigned long png_uint_32; +typedef long png_int_32; +#endif +typedef unsigned short png_uint_16; +typedef short png_int_16; +typedef unsigned char png_byte; + +#ifdef PNG_NO_SIZE_T +typedef unsigned int png_size_t; +#else +typedef size_t png_size_t; +#endif +#define png_sizeof(x) (sizeof (x)) + +/* The following is needed for medium model support. It cannot be in the + * pngpriv.h header. Needs modification for other compilers besides + * MSC. Model independent support declares all arrays and pointers to be + * large using the far keyword. The zlib version used must also support + * model independent data. As of version zlib 1.0.4, the necessary changes + * have been made in zlib. The USE_FAR_KEYWORD define triggers other + * changes that are needed. (Tim Wegner) + */ + +/* Separate compiler dependencies (problem here is that zlib.h always + * defines FAR. (SJT) + */ +#ifdef __BORLANDC__ +# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) +# define LDATA 1 +# else +# define LDATA 0 +# endif + /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ +# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) +# define PNG_MAX_MALLOC_64K /* only used in build */ +# if (LDATA != 1) +# ifndef FAR +# define FAR __far +# endif +# define USE_FAR_KEYWORD +# endif /* LDATA != 1 */ + /* Possibly useful for moving data out of default segment. + * Uncomment it if you want. Could also define FARDATA as + * const if your compiler supports it. (SJT) +# define FARDATA FAR + */ +# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ +#endif /* __BORLANDC__ */ + + +/* Suggest testing for specific compiler first before testing for + * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, + * making reliance oncertain keywords suspect. (SJT) + */ + +/* MSC Medium model */ +#ifdef FAR +# ifdef M_I86MM +# define USE_FAR_KEYWORD +# define FARDATA FAR +# include +# endif +#endif + +/* SJT: default case */ +#ifndef FAR +# define FAR +#endif + +/* At this point FAR is always defined */ +#ifndef FARDATA +# define FARDATA +#endif + +/* Typedef for floating-point numbers that are converted + * to fixed-point with a multiple of 100,000, e.g., gamma + */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void FAR * png_voidp; +typedef PNG_CONST void FAR * png_const_voidp; +typedef png_byte FAR * png_bytep; +typedef PNG_CONST png_byte FAR * png_const_bytep; +typedef png_uint_32 FAR * png_uint_32p; +typedef PNG_CONST png_uint_32 FAR * png_const_uint_32p; +typedef png_int_32 FAR * png_int_32p; +typedef PNG_CONST png_int_32 FAR * png_const_int_32p; +typedef png_uint_16 FAR * png_uint_16p; +typedef PNG_CONST png_uint_16 FAR * png_const_uint_16p; +typedef png_int_16 FAR * png_int_16p; +typedef PNG_CONST png_int_16 FAR * png_const_int_16p; +typedef char FAR * png_charp; +typedef PNG_CONST char FAR * png_const_charp; +typedef png_fixed_point FAR * png_fixed_point_p; +typedef PNG_CONST png_fixed_point FAR * png_const_fixed_point_p; +typedef png_size_t FAR * png_size_tp; +typedef PNG_CONST png_size_t FAR * png_const_size_tp; + +#ifdef PNG_STDIO_SUPPORTED +typedef FILE * png_FILE_p; +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * png_doublep; +typedef PNG_CONST double FAR * png_const_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte FAR * FAR * png_bytepp; +typedef png_uint_32 FAR * FAR * png_uint_32pp; +typedef png_int_32 FAR * FAR * png_int_32pp; +typedef png_uint_16 FAR * FAR * png_uint_16pp; +typedef png_int_16 FAR * FAR * png_int_16pp; +typedef PNG_CONST char FAR * FAR * png_const_charpp; +typedef char FAR * FAR * png_charpp; +typedef png_fixed_point FAR * FAR * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * FAR * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char FAR * FAR * FAR * png_charppp; + +/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, + * and no smaller than png_uint_32. Casts from png_size_t or png_uint_32 + * to png_alloc_size_t are not necessary; in fact, it is recommended + * not to use them at all so that the compiler can complain when something + * turns out to be problematic. + * Casts in the other direction (from png_alloc_size_t to png_size_t or + * png_uint_32) should be explicitly applied; however, we do not expect + * to encounter practical situations that require such conversions. + */ +#if defined(__TURBOC__) && !defined(__FLAT__) + typedef unsigned long png_alloc_size_t; +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + typedef unsigned long png_alloc_size_t; +# else + /* This is an attempt to detect an old Windows system where (int) is + * actually 16 bits, in that case png_malloc must have an argument with a + * bigger size to accomodate the requirements of the library. + */ +# if (defined(_Windows) || defined(_WINDOWS) || defined(_WINDOWS_)) && \ + (!defined(INT_MAX) || INT_MAX <= 0x7ffffffeL) + typedef DWORD png_alloc_size_t; +# else + typedef png_size_t png_alloc_size_t; +# endif +# endif +#endif + +#endif /* PNGCONF_H */ diff --git a/src/lib_armv6/libpng15/libpng15/pnglibconf.h b/src/lib_armv6/libpng15/libpng15/pnglibconf.h new file mode 100644 index 0000000..8bc9ef8 --- /dev/null +++ b/src/lib_armv6/libpng15/libpng15/pnglibconf.h @@ -0,0 +1,186 @@ +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.5.18 - February 6, 2014 */ + +/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ +/* Derived from: scripts/pnglibconf.dfa */ +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* options */ +#define PNG_16BIT_SUPPORTED +#define PNG_ALIGNED_MEMORY_SUPPORTED +/*#undef PNG_ARM_NEON_API_SUPPORTED*/ +/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/ +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_CHECK_cHRM_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_GET_PALETTE_MAX_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_ALPHA_MODE_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_READ_COMPRESSED_TEXT_SUPPORTED +#define PNG_READ_EXPAND_16_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_GET_PALETTE_MAX_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_READ_SCALE_16_TO_8_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +/*#undef PNG_SAFE_LIMITS_SUPPORTED*/ +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +/*#undef PNG_SET_OPTION_SUPPORTED*/ +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED +#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_zTXt_SUPPORTED +/* end of options */ +/* settings */ +#define PNG_API_RULE 0 +#define PNG_CALLOC_SUPPORTED +#define PNG_COST_SHIFT 3 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +#define PNG_MAX_GAMMA_8 11 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_WEIGHT_SHIFT 8 +#define PNG_ZBUF_SIZE 8192 +#define PNG_sCAL_PRECISION 5 +/* end of settings */ +#endif /* PNGLCONF_H */ diff --git a/src/lib_armv6/libpng15/png.h b/src/lib_armv6/libpng15/png.h new file mode 120000 index 0000000..3cb4fc9 --- /dev/null +++ b/src/lib_armv6/libpng15/png.h @@ -0,0 +1 @@ +libpng15/png.h \ No newline at end of file diff --git a/src/lib_armv6/libpng15/pngconf.h b/src/lib_armv6/libpng15/pngconf.h new file mode 120000 index 0000000..09bc4a0 --- /dev/null +++ b/src/lib_armv6/libpng15/pngconf.h @@ -0,0 +1 @@ +libpng15/pngconf.h \ No newline at end of file diff --git a/src/lib_armv6/libpng15/pnglibconf.h b/src/lib_armv6/libpng15/pnglibconf.h new file mode 120000 index 0000000..547f001 --- /dev/null +++ b/src/lib_armv6/libpng15/pnglibconf.h @@ -0,0 +1 @@ +libpng15/pnglibconf.h \ No newline at end of file diff --git a/src/lib_armv6/libpng16/libpng.a b/src/lib_armv6/libpng16/libpng.a new file mode 100644 index 0000000..a9055a5 Binary files /dev/null and b/src/lib_armv6/libpng16/libpng.a differ diff --git a/src/lib_armv6/libpng16/png.h b/src/lib_armv6/libpng16/png.h new file mode 100644 index 0000000..cf1a27c --- /dev/null +++ b/src/lib_armv6/libpng16/png.h @@ -0,0 +1,3310 @@ + +/* png.h - header file for PNG reference library + * + * libpng version 1.6.3 - July 18, 2013 + * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license (See LICENSE, below) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.6.3 - July 18, 2013: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 12.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 12.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-7 13 10210 12.so.0.10[.0] + * 1.2.10rc1-2 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.4.0beta1-5 14 10400 14.so.0.0[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.4.0beta7-8 14 10400 14.so.0.0[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.4.0beta9-14 14 10400 14.so.0.0[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.4.0beta15-36 14 10400 14.so.0.0[.0] + * 1.4.0beta37-87 14 10400 14.so.14.0[.0] + * 1.4.0rc01 14 10400 14.so.14.0[.0] + * 1.4.0beta88-109 14 10400 14.so.14.0[.0] + * 1.4.0rc02-08 14 10400 14.so.14.0[.0] + * 1.4.0 14 10400 14.so.14.0[.0] + * 1.4.1beta01-03 14 10401 14.so.14.1[.0] + * 1.4.1rc01 14 10401 14.so.14.1[.0] + * 1.4.1beta04-12 14 10401 14.so.14.1[.0] + * 1.4.1 14 10401 14.so.14.1[.0] + * 1.4.2 14 10402 14.so.14.2[.0] + * 1.4.3 14 10403 14.so.14.3[.0] + * 1.4.4 14 10404 14.so.14.4[.0] + * 1.5.0beta01-58 15 10500 15.so.15.0[.0] + * 1.5.0rc01-07 15 10500 15.so.15.0[.0] + * 1.5.0 15 10500 15.so.15.0[.0] + * 1.5.1beta01-11 15 10501 15.so.15.1[.0] + * 1.5.1rc01-02 15 10501 15.so.15.1[.0] + * 1.5.1 15 10501 15.so.15.1[.0] + * 1.5.2beta01-03 15 10502 15.so.15.2[.0] + * 1.5.2rc01-03 15 10502 15.so.15.2[.0] + * 1.5.2 15 10502 15.so.15.2[.0] + * 1.5.3beta01-10 15 10503 15.so.15.3[.0] + * 1.5.3rc01-02 15 10503 15.so.15.3[.0] + * 1.5.3beta11 15 10503 15.so.15.3[.0] + * 1.5.3 [omitted] + * 1.5.4beta01-08 15 10504 15.so.15.4[.0] + * 1.5.4rc01 15 10504 15.so.15.4[.0] + * 1.5.4 15 10504 15.so.15.4[.0] + * 1.5.5beta01-08 15 10505 15.so.15.5[.0] + * 1.5.5rc01 15 10505 15.so.15.5[.0] + * 1.5.5 15 10505 15.so.15.5[.0] + * 1.5.6beta01-07 15 10506 15.so.15.6[.0] + * 1.5.6rc01-03 15 10506 15.so.15.6[.0] + * 1.5.6 15 10506 15.so.15.6[.0] + * 1.5.7beta01-05 15 10507 15.so.15.7[.0] + * 1.5.7rc01-03 15 10507 15.so.15.7[.0] + * 1.5.7 15 10507 15.so.15.7[.0] + * 1.6.0beta01-40 16 10600 16.so.16.0[.0] + * 1.6.0rc01-08 16 10600 16.so.16.0[.0] + * 1.6.0 16 10600 16.so.16.0[.0] + * 1.6.1beta01-09 16 10601 16.so.16.1[.0] + * 1.6.1rc01 16 10601 16.so.16.1[.0] + * 1.6.1 16 10601 16.so.16.1[.0] + * 1.6.2beta01 16 10602 16.so.16.2[.0] + * 1.6.2rc01-06 16 10602 16.so.16.2[.0] + * 1.6.2 16 10602 16.so.16.2[.0] + * 1.6.3beta01-11 16 10603 16.so.16.3[.0] + * 1.6.3rc01 16 10603 16.so.16.3[.0] + * 1.6.3 16 10603 16.so.16.3[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcNN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng-manual.txt or libpng.3 for more information. The PNG + * specification is available as a W3C Recommendation and as an ISO + * Specification, defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_size_t rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info * png_row_infop; +typedef png_row_info * * png_row_infopp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. Note that the 'write' function must not + * modify the buffer it is passed. The 'read' function, on the other hand, is + * expected to return the read data in the buffer. + */ +typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp)); +typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t)); +typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp)); +typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, + int)); +typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, + int)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); +typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); + +/* The following callback receives png_uint_32 row_number, int pass for the + * png_bytep data of the row. When transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep, + png_uint_32, int)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop, + png_bytep)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, + png_unknown_chunkp)); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +/* not used anywhere */ +/* typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); */ +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This must match the function definition in , and the application + * must include this before png.h to obtain the definition of jmp_buf. The + * function is required to be PNG_NORETURN, but this is not checked. If the + * function does return the application will crash via an abort() or similar + * system level call. + * + * If you get a warning here while building the library you may need to make + * changes to ensure that pnglibconf.h records the calling convention used by + * your compiler. This may be very difficult - try using a different compiler + * to build the library! + */ +PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER +#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ +/* Added to libpng-1.4.0 */ +#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */ +/* Added to libpng-1.5.4 */ +#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */ +#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +/* NOTE: prior to 1.5 these functions had no 'API' style declaration, + * this allowed the zlib default functions to be used on Windows + * platforms. In 1.5 the zlib default malloc (which just calls malloc and + * ignores the first argument) should be completely compatible with the + * following. + */ +typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, + png_alloc_size_t)); +typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp)); + +/* Section 3: exported functions + * Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng-manual.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + * + * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in + * pngconf.h and in the *.dfn files in the scripts directory. + * + * PNG_EXPORT(ordinal, type, name, (args)); + * + * ordinal: ordinal that is used while building + * *.def files. The ordinal value is only + * relevant when preprocessing png.h with + * the *.dfn files for building symbol table + * entries, and are removed by pngconf.h. + * type: return type of the function + * name: function name + * args: function arguments, with types + * + * When we wish to append attributes to a function prototype we use + * the PNG_EXPORTA() macro instead. + * + * PNG_EXPORTA(ordinal, type, name, (args), attributes); + * + * ordinal, type, name, and args: same as in PNG_EXPORT(). + * attributes: function attributes + */ + +/* Returns the version number of the library */ +PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); + +/* Tell lib we have already handled the first magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +PNG_EXPORT(2, void, png_set_sig_bytes, (png_structrp png_ptr, int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +PNG_EXPORTA(4, png_structp, png_create_read_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn), + PNG_ALLOCATED); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +PNG_EXPORTA(5, png_structp, png_create_write_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn), + PNG_ALLOCATED); + +PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, + (png_const_structrp png_ptr)); + +PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr, + png_size_t size)); + +/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp + * match up. + */ +#ifdef PNG_SETJMP_SUPPORTED +/* This function returns the jmp_buf built in to *png_ptr. It must be + * supplied with an appropriate 'longjmp' function to use on that jmp_buf + * unless the default error function is overridden in which case NULL is + * acceptable. The size of the jmp_buf is checked against the actual size + * allocated by the library - the call will return NULL on a mismatch + * indicating an ABI mismatch. + */ +PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr, + png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); +# define png_jmpbuf(png_ptr) \ + (*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf)))) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) +#endif +/* This function should be used by libpng applications in place of + * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it + * will use it; otherwise it will call PNG_ABORT(). This function was + * added in libpng-1.5.0. + */ +PNG_EXPORTA(9, void, png_longjmp, (png_const_structrp png_ptr, int val), + PNG_NORETURN); + +#ifdef PNG_READ_SUPPORTED +/* Reset the compression stream */ +PNG_EXPORTA(10, int, png_reset_zstream, (png_structrp png_ptr), PNG_DEPRECATED); +#endif + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(11, png_structp, png_create_read_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +PNG_EXPORTA(12, png_structp, png_create_write_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +#endif + +/* Write the PNG file signature. */ +PNG_EXPORT(13, void, png_write_sig, (png_structrp png_ptr)); + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +PNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep + chunk_name, png_const_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +PNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr, + png_const_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +PNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr, + png_const_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +PNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr)); + +/* Allocate and initialize the info structure */ +PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_const_structrp png_ptr), + PNG_ALLOCATED); + +/* DEPRECATED: this function allowed init structures to be created using the + * default allocation method (typically malloc). Use is deprecated in 1.6.0 and + * the API will be removed in the future. + */ +PNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr, + png_size_t png_info_struct_size), PNG_DEPRECATED); + +/* Writes all the PNG information before the image. */ +PNG_EXPORT(20, void, png_write_info_before_PLTE, + (png_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(21, void, png_write_info, + (png_structrp png_ptr, png_const_inforp info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. */ +PNG_EXPORT(22, void, png_read_info, + (png_structrp png_ptr, png_inforp info_ptr)); +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + /* Convert to a US string format: there is no localization support in this + * routine. The original implementation used a 29 character buffer in + * png_struct, this will be removed in future versions. + */ +#if PNG_LIBPNG_VER < 10700 +/* To do: remove this from libpng17 (and from libpng17/png.c and pngstruct.h) */ +PNG_EXPORTA(23, png_const_charp, png_convert_to_rfc1123, (png_structrp png_ptr, + png_const_timep ptime),PNG_DEPRECATED); +#endif +PNG_EXPORT(241, int, png_convert_to_rfc1123_buffer, (char out[29], + png_const_timep ptime)); +#endif + +#ifdef PNG_CONVERT_tIME_SUPPORTED +/* Convert from a struct tm to png_time */ +PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, + const struct tm * ttime)); + +/* Convert from time_t to png_time. Uses gmtime() */ +PNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime)); +#endif /* PNG_CONVERT_tIME_SUPPORTED */ + +#ifdef PNG_READ_EXPAND_SUPPORTED +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +PNG_EXPORT(26, void, png_set_expand, (png_structrp png_ptr)); +PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structrp png_ptr)); +PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structrp png_ptr)); +PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_EXPAND_16_SUPPORTED +/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion + * of a tRNS chunk if present. + */ +PNG_EXPORT(221, void, png_set_expand_16, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +PNG_EXPORT(30, void, png_set_bgr, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +/* Expand the grayscale to 24-bit RGB if necessary. */ +PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +/* Reduce RGB to grayscale. */ +#define PNG_ERROR_ACTION_NONE 1 +#define PNG_ERROR_ACTION_WARN 2 +#define PNG_ERROR_ACTION_ERROR 3 +#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/ + +PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structrp png_ptr, + int error_action, double red, double green)) +PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structrp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green)) + +PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structrp + png_ptr)); +#endif + +#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, + png_colorp palette)); +#endif + +#ifdef PNG_READ_ALPHA_MODE_SUPPORTED +/* How the alpha channel is interpreted - this affects how the color channels of + * a PNG file are returned when an alpha channel, or tRNS chunk in a palette + * file, is present. + * + * This has no effect on the way pixels are written into a PNG output + * datastream. The color samples in a PNG datastream are never premultiplied + * with the alpha samples. + * + * The default is to return data according to the PNG specification: the alpha + * channel is a linear measure of the contribution of the pixel to the + * corresponding composited pixel. The gamma encoded color channels must be + * scaled according to the contribution and to do this it is necessary to undo + * the encoding, scale the color values, perform the composition and reencode + * the values. This is the 'PNG' mode. + * + * The alternative is to 'associate' the alpha with the color information by + * storing color channel values that have been scaled by the alpha. The + * advantage is that the color channels can be resampled (the image can be + * scaled) in this form. The disadvantage is that normal practice is to store + * linear, not (gamma) encoded, values and this requires 16-bit channels for + * still images rather than the 8-bit channels that are just about sufficient if + * gamma encoding is used. In addition all non-transparent pixel values, + * including completely opaque ones, must be gamma encoded to produce the final + * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the + * latter being the two common names for associated alpha color channels.) + * + * Since it is not necessary to perform arithmetic on opaque color values so + * long as they are not to be resampled and are in the final color space it is + * possible to optimize the handling of alpha by storing the opaque pixels in + * the PNG format (adjusted for the output color space) while storing partially + * opaque pixels in the standard, linear, format. The accuracy required for + * standard alpha composition is relatively low, because the pixels are + * isolated, therefore typically the accuracy loss in storing 8-bit linear + * values is acceptable. (This is not true if the alpha channel is used to + * simulate transparency over large areas - use 16 bits or the PNG mode in + * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is + * treated as opaque only if the alpha value is equal to the maximum value. + * + * The final choice is to gamma encode the alpha channel as well. This is + * broken because, in practice, no implementation that uses this choice + * correctly undoes the encoding before handling alpha composition. Use this + * choice only if other serious errors in the software or hardware you use + * mandate it; the typical serious error is for dark halos to appear around + * opaque areas of the composited PNG image because of arithmetic overflow. + * + * The API function png_set_alpha_mode specifies which of these choices to use + * with an enumerated 'mode' value and the gamma of the required output: + */ +#define PNG_ALPHA_PNG 0 /* according to the PNG standard */ +#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */ +#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */ +#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */ +#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */ +#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */ + +PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structrp png_ptr, int mode, + double output_gamma)) +PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structrp png_ptr, + int mode, png_fixed_point output_gamma)) +#endif + +#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED) +/* The output_gamma value is a screen gamma in libpng terminology: it expresses + * how to decode the output values, not how they are encoded. The values used + * correspond to the normal numbers used to describe the overall gamma of a + * computer display system; for example 2.2 for an sRGB conformant system. The + * values are scaled by 100000 in the _fixed version of the API (so 220000 for + * sRGB.) + * + * The inverse of the value is always used to provide a default for the PNG file + * encoding if it has no gAMA chunk and if png_set_gamma() has not been called + * to override the PNG gamma information. + * + * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode + * opaque pixels however pixels with lower alpha values are not encoded, + * regardless of the output gamma setting. + * + * When the standard Porter Duff handling is requested with mode 1 the output + * encoding is set to be linear and the output_gamma value is only relevant + * as a default for input data that has no gamma information. The linear output + * encoding will be overridden if png_set_gamma() is called - the results may be + * highly unexpected! + * + * The following numbers are derived from the sRGB standard and the research + * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of + * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing + * correction required to take account of any differences in the color + * environment of the original scene and the intended display environment; the + * value expresses how to *decode* the image for display, not how the original + * data was *encoded*. + * + * sRGB provides a peg for the PNG standard by defining a viewing environment. + * sRGB itself, and earlier TV standards, actually use a more complex transform + * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is + * limited to simple power laws.) By saying that an image for direct display on + * an sRGB conformant system should be stored with a gAMA chunk value of 45455 + * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification + * makes it possible to derive values for other display systems and + * environments. + * + * The Mac value is deduced from the sRGB based on an assumption that the actual + * extra viewing correction used in early Mac display systems was implemented as + * a power 1.45 lookup table. + * + * Any system where a programmable lookup table is used or where the behavior of + * the final display device characteristics can be changed requires system + * specific code to obtain the current characteristic. However this can be + * difficult and most PNG gamma correction only requires an approximate value. + * + * By default, if png_set_alpha_mode() is not called, libpng assumes that all + * values are unencoded, linear, values and that the output device also has a + * linear characteristic. This is only very rarely correct - it is invariably + * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the + * default if you don't know what the right answer is! + * + * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS + * 10.6) which used a correction table to implement a somewhat lower gamma on an + * otherwise sRGB system. + * + * Both these values are reserved (not simple gamma values) in order to allow + * more precise correction internally in the future. + * + * NOTE: the following values can be passed to either the fixed or floating + * point APIs, but the floating point API will also accept floating point + * values. + */ +#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */ +#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */ +#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */ +#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */ +#endif + +/* The following are examples of calls to png_set_alpha_mode to achieve the + * required overall gamma correction and, where necessary, alpha + * premultiplication. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * This is the default libpng handling of the alpha channel - it is not + * pre-multiplied into the color components. In addition the call states + * that the output is for a sRGB system and causes all PNG files without gAMA + * chunks to be assumed to be encoded using sRGB. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * In this case the output is assumed to be something like an sRGB conformant + * display preceeded by a power-law lookup table of power 1.45. This is how + * early Mac systems behaved. + * + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); + * This is the classic Jim Blinn approach and will work in academic + * environments where everything is done by the book. It has the shortcoming + * of assuming that input PNG data with no gamma information is linear - this + * is unlikely to be correct unless the PNG files where generated locally. + * Most of the time the output precision will be so low as to show + * significant banding in dark areas of the image. + * + * png_set_expand_16(pp); + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB); + * This is a somewhat more realistic Jim Blinn inspired approach. PNG files + * are assumed to have the sRGB encoding if not marked with a gamma value and + * the output is always 16 bits per component. This permits accurate scaling + * and processing of the data. If you know that your input PNG files were + * generated locally you might need to replace PNG_DEFAULT_sRGB with the + * correct value for your system. + * + * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB); + * If you just need to composite the PNG image onto an existing background + * and if you control the code that does this you can use the optimization + * setting. In this case you just copy completely opaque pixels to the + * output. For pixels that are not completely transparent (you just skip + * those) you do the composition math using png_composite or png_composite_16 + * below then encode the resultant 8-bit or 16-bit values to match the output + * encoding. + * + * Other cases + * If neither the PNG nor the standard linear encoding work for you because + * of the software or hardware you use then you have a big problem. The PNG + * case will probably result in halos around the image. The linear encoding + * will probably result in a washed out, too bright, image (it's actually too + * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably + * substantially reduce the halos. Alternatively try: + * + * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB); + * This option will also reduce the halos, but there will be slight dark + * halos round the opaque parts of the image where the background is light. + * In the OPTIMIZED mode the halos will be light halos where the background + * is dark. Take your pick - the halos are unavoidable unless you can get + * your hardware/software fixed! (The OPTIMIZED approach is slightly + * faster.) + * + * When the default gamma of PNG files doesn't match the output gamma. + * If you have PNG files with no gamma information png_set_alpha_mode allows + * you to provide a default gamma, but it also sets the ouput gamma to the + * matching value. If you know your PNG files have a gamma that doesn't + * match the output you can take advantage of the fact that + * png_set_alpha_mode always sets the output gamma but only sets the PNG + * default if it is not already set: + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * The first call sets both the default and the output gamma values, the + * second call overrides the output gamma without changing the default. This + * is easier than achieving the same effect with png_set_gamma. You must use + * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will + * fire if more than one call to png_set_alpha_mode and png_set_background is + * made in the same read operation, however multiple calls with PNG_ALPHA_PNG + * are ignored. + */ + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED +PNG_EXPORT(36, void, png_set_strip_alpha, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXPORT(37, void, png_set_swap_alpha, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXPORT(38, void, png_set_invert_alpha, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler, + int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +# define PNG_FILLER_BEFORE 0 +# define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr, + png_uint_32 filler, int flags)); +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +PNG_EXPORT(41, void, png_set_swap, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +PNG_EXPORT(42, void, png_set_packing, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ + defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +PNG_EXPORT(43, void, png_set_packswap, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +PNG_EXPORT(44, void, png_set_shift, (png_structrp png_ptr, png_const_color_8p + true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. + * MUST be called before png_read_update_info or png_start_read_image, + * otherwise it will not have the desired effect. Note that it is still + * necessary to call png_read_row or png_read_rows png_get_image_height + * times for each pass. +*/ +PNG_EXPORT(45, int, png_set_interlace_handling, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +PNG_EXPORT(46, void, png_set_invert_mono, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +/* Handle alpha and tRNS by replacing with a background color. Prior to + * libpng-1.5.4 this API must not be called before the PNG file header has been + * read. Doing so will result in unexpected behavior and possible warnings or + * errors if the PNG file contains a bKGD chunk. + */ +PNG_FP_EXPORT(47, void, png_set_background, (png_structrp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)) +PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structrp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma)) +#endif +#ifdef PNG_READ_BACKGROUND_SUPPORTED +# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +# define PNG_BACKGROUND_GAMMA_SCREEN 1 +# define PNG_BACKGROUND_GAMMA_FILE 2 +# define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED +/* Scale a 16-bit depth file down to 8-bit, accurately. */ +PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */ +/* Strip the second byte of information from a 16-bit depth file. */ +PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* Turn on quantizing, and reduce the palette to the number of colors + * available. + */ +PNG_EXPORT(49, void, png_set_quantize, (png_structrp png_ptr, + png_colorp palette, int num_palette, int maximum_colors, + png_const_uint_16p histogram, int full_quantize)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* The threshold on gamma processing is configurable but hard-wired into the + * library. The following is the floating point variant. + */ +#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) + +/* Handle gamma correction. Screen_gamma=(display_exponent). + * NOTE: this API simply sets the screen and file gamma values. It will + * therefore override the value for gamma in a PNG file if it is called after + * the file header has been read - use with care - call before reading the PNG + * file for best results! + * + * These routines accept the same gamma values as png_set_alpha_mode (described + * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either + * API (floating point or fixed.) Notice, however, that the 'file_gamma' value + * is the inverse of a 'screen gamma' value. + */ +PNG_FP_EXPORT(50, void, png_set_gamma, (png_structrp png_ptr, + double screen_gamma, double override_file_gamma)) +PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structrp png_ptr, + png_fixed_point screen_gamma, png_fixed_point override_file_gamma)) +#endif + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +/* Set how many lines between output flushes - 0 for no flushing */ +PNG_EXPORT(51, void, png_set_flush, (png_structrp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +PNG_EXPORT(52, void, png_write_flush, (png_structrp png_ptr)); +#endif + +/* Optional update palette with requested transformations */ +PNG_EXPORT(53, void, png_start_read_image, (png_structrp png_ptr)); + +/* Optional call to update the users info structure */ +PNG_EXPORT(54, void, png_read_update_info, (png_structrp png_ptr, + png_inforp info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. */ +PNG_EXPORT(55, void, png_read_rows, (png_structrp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read a row of data. */ +PNG_EXPORT(56, void, png_read_row, (png_structrp png_ptr, png_bytep row, + png_bytep display_row)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the whole image into memory at once. */ +PNG_EXPORT(57, void, png_read_image, (png_structrp png_ptr, png_bytepp image)); +#endif + +/* Write a row of image data */ +PNG_EXPORT(58, void, png_write_row, (png_structrp png_ptr, + png_const_bytep row)); + +/* Write a few rows of image data: (*row) is not written; however, the type + * is declared as writeable to maintain compatibility with previous versions + * of libpng and to allow the 'display_row' array from read_rows to be passed + * unchanged to write_rows. + */ +PNG_EXPORT(59, void, png_write_rows, (png_structrp png_ptr, png_bytepp row, + png_uint_32 num_rows)); + +/* Write the image data */ +PNG_EXPORT(60, void, png_write_image, (png_structrp png_ptr, png_bytepp image)); + +/* Write the end of the PNG file. */ +PNG_EXPORT(61, void, png_write_end, (png_structrp png_ptr, + png_inforp info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. */ +PNG_EXPORT(62, void, png_read_end, (png_structrp png_ptr, png_inforp info_ptr)); +#endif + +/* Free any memory associated with the png_info_struct */ +PNG_EXPORT(63, void, png_destroy_info_struct, (png_const_structrp png_ptr, + png_infopp info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr)); + +/* Set the libpng method of handling chunk CRC errors */ +PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action, + int ancil_action)); + +/* Values for png_set_crc_action() say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* Set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method, + int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr, + int heuristic_method, int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs)) +PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, + (png_structrp png_ptr, int heuristic_method, int num_weights, + png_const_fixed_point_p filter_weights, + png_const_fixed_point_p filter_costs)) +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +#ifdef PNG_WRITE_SUPPORTED +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr, + int level)); + +PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structrp png_ptr, + int mem_level)); + +PNG_EXPORT(71, void, png_set_compression_strategy, (png_structrp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr, + int window_bits)); + +PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr, + int method)); +#endif + +#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +/* Also set zlib parameters for compressing non-IDAT chunks */ +PNG_EXPORT(222, void, png_set_text_compression_level, (png_structrp png_ptr, + int level)); + +PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structrp png_ptr, + int mem_level)); + +PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structrp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(225, void, png_set_text_compression_window_bits, + (png_structrp png_ptr, int window_bits)); + +PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr, + int method)); +#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng-manual.txt for + * more information. + */ + +#ifdef PNG_STDIO_SUPPORTED +/* Initialize the input/output for the PNG file to the default functions. */ +PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +PNG_EXPORT(75, void, png_set_error_fn, (png_structrp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structrp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used. + */ +PNG_EXPORT(77, void, png_set_write_fn, (png_structrp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +PNG_EXPORT(78, void, png_set_read_fn, (png_structrp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_const_structrp png_ptr)); + +PNG_EXPORT(80, void, png_set_read_status_fn, (png_structrp png_ptr, + png_read_status_ptr read_row_fn)); + +PNG_EXPORT(81, void, png_set_write_status_fn, (png_structrp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +PNG_EXPORT(82, void, png_set_mem_fn, (png_structrp png_ptr, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structrp png_ptr)); +#endif + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structrp png_ptr, + png_user_transform_ptr read_user_transform_fn)); +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structrp png_ptr, + png_user_transform_ptr write_user_transform_fn)); +#endif + +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +PNG_EXPORT(86, void, png_set_user_transform_info, (png_structrp png_ptr, + png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, + (png_const_structrp png_ptr)); +#endif + +#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED +/* Return information about the row currently being processed. Note that these + * APIs do not fail but will return unexpected results if called outside a user + * transform callback. Also note that when transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structrp)); +PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp)); +#endif + +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED +/* This callback is called only for *unknown* chunks. If + * PNG_HANDLE_AS_UNKNOWN_SUPPORTED is set then it is possible to set known + * chunks to be treated as unknown, however in this case the callback must do + * any processing required by the chunk (e.g. by calling the appropriate + * png_set_ APIs.) + * + * There is no write support - on write, by default, all the chunks in the + * 'unknown' list are written in the specified position. + * + * The integer return from the callback function is interpreted thus: + * + * negative: An error occured, png_chunk_error will be called. + * zero: The chunk was not handled, the chunk will be saved. A critical + * chunk will cause an error at this point unless it is to be saved. + * positive: The chunk was handled, libpng will ignore/discard it. + * + * See "INTERACTION WTIH USER CHUNK CALLBACKS" below for important notes about + * how this behavior will change in libpng 1.7 + */ +PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structrp png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structrp png_ptr, + png_voidp progressive_ptr, png_progressive_info_ptr info_fn, + png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); + +/* Returns the user pointer associated with the push read functions */ +PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, + (png_const_structrp png_ptr)); + +/* Function to be called when data becomes available */ +PNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr, + png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size)); + +/* A function which may be called *only* within png_process_data to stop the + * processing of any more data. The function returns the number of bytes + * remaining, excluding any that libpng has cached internally. A subsequent + * call to png_process_data must supply these bytes again. If the argument + * 'save' is set to true the routine will first save all the pending data and + * will always return 0. + */ +PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save)); + +/* A function which may be called *only* outside (after) a call to + * png_process_data. It returns the number of bytes of data to skip in the + * input. Normally it will return 0, but if it returns a non-zero value the + * application must skip than number of bytes of input data and pass the + * following data to the next call to png_process_data. + */ +PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp)); + +#ifdef PNG_READ_INTERLACING_SUPPORTED +/* Function that combines rows. 'new_row' is a flag that should come from + * the callback and be non-NULL if anything needs to be done; the library + * stores its own version of the new data internally and ignores the passed + * in value. + */ +PNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr, + png_bytep old_row, png_const_bytep new_row)); +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +PNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); +/* Added at libpng version 1.4.0 */ +PNG_EXPORTA(95, png_voidp, png_calloc, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); + +/* Added at libpng version 1.2.4 */ +PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); + +/* Frees a pointer allocated by png_malloc() */ +PNG_EXPORT(97, void, png_free, (png_const_structrp png_ptr, png_voidp ptr)); + +/* Free data that was allocated internally */ +PNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_32 free_me, int num)); + +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application; this works on the png_info structure passed + * in, it does not change the state for other png_info structures. + * + * It is unlikely that this function works correctly as of 1.6.0 and using it + * may result either in memory leaks or double free of allocated data. + */ +PNG_EXPORTA(99, void, png_data_freer, (png_const_structrp png_ptr, + png_inforp info_ptr, int freer, png_uint_32 mask), PNG_DEPRECATED); + +/* Assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_FREE_UNKN 0x0200 +#endif +/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */ +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED PNG_DEPRECATED); +PNG_EXPORTA(101, void, png_free_default, (png_const_structrp png_ptr, + png_voidp ptr), PNG_DEPRECATED); +#endif + +#ifdef PNG_ERROR_TEXT_SUPPORTED +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(102, void, png_error, (png_const_structrp png_ptr, + png_const_charp error_message), PNG_NORETURN); + +/* The same, but the chunk name is prepended to the error string. */ +PNG_EXPORTA(103, void, png_chunk_error, (png_const_structrp png_ptr, + png_const_charp error_message), PNG_NORETURN); + +#else +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(104, void, png_err, (png_const_structrp png_ptr), PNG_NORETURN); +#endif + +#ifdef PNG_WARNINGS_SUPPORTED +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +PNG_EXPORT(105, void, png_warning, (png_const_structrp png_ptr, + png_const_charp warning_message)); + +/* Non-fatal error in libpng, chunk name is prepended to message. */ +PNG_EXPORT(106, void, png_chunk_warning, (png_const_structrp png_ptr, + png_const_charp warning_message)); +#endif + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +/* Benign error in libpng. Can continue, but may have a problem. + * User can choose whether to handle as a fatal error or as a warning. */ +PNG_EXPORT(107, void, png_benign_error, (png_const_structrp png_ptr, + png_const_charp warning_message)); + +#ifdef PNG_READ_SUPPORTED +/* Same, chunk name is prepended to message (only during read) */ +PNG_EXPORT(108, void, png_chunk_benign_error, (png_const_structrp png_ptr, + png_const_charp warning_message)); +#endif + +PNG_EXPORT(109, void, png_set_benign_errors, + (png_structrp png_ptr, int allowed)); +#else +# ifdef PNG_ALLOW_BENIGN_ERRORS +# define png_benign_error png_warning +# define png_chunk_benign_error png_chunk_warning +# else +# define png_benign_error png_error +# define png_chunk_benign_error png_chunk_error +# endif +#endif + +/* The png_set_ functions are for storing values in the png_info_struct. + * Similarly, the png_get_ calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_ functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +PNG_EXPORT(110, png_uint_32, png_get_valid, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* Returns row_pointers, which is an array of pointers to scanlines that was + * returned from png_read_png(). + */ +PNG_EXPORT(112, png_bytepp, png_get_rows, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Set row_pointers, which is an array of pointers to scanlines for use + * by png_write_png(). + */ +PNG_EXPORT(113, void, png_set_rows, (png_const_structrp png_ptr, + png_inforp info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +PNG_EXPORT(114, png_byte, png_get_channels, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image height in pixels. */ +PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image bit_depth. */ +PNG_EXPORT(117, png_byte, png_get_bit_depth, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image color_type. */ +PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image filter_type. */ +PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image interlace_type. */ +PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image compression_type. */ +PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +#ifdef PNG_READ_SUPPORTED +/* Returns pointer to signature string read from PNG header */ +PNG_EXPORT(130, png_const_bytep, png_get_signature, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); +#endif + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(131, png_uint_32, png_get_bKGD, (png_const_structrp png_ptr, + png_inforp info_ptr, png_color_16p *background)); +#endif + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(132, void, png_set_bKGD, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_color_16p background)); +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structrp png_ptr, + png_const_inforp info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)) +PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_const_structrp png_ptr, + png_const_inforp info_ptr, double *red_X, double *red_Y, double *red_Z, + double *green_X, double *green_Y, double *green_Z, double *blue_X, + double *blue_Y, double *blue_Z)) +PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, + png_fixed_point *int_white_x, png_fixed_point *int_white_y, + png_fixed_point *int_red_x, png_fixed_point *int_red_y, + png_fixed_point *int_green_x, png_fixed_point *int_green_y, + png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)) +PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, + png_fixed_point *int_red_X, png_fixed_point *int_red_Y, + png_fixed_point *int_red_Z, png_fixed_point *int_green_X, + png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, + png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, + png_fixed_point *int_blue_Z)) +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(135, void, png_set_cHRM, (png_const_structrp png_ptr, + png_inforp info_ptr, + double white_x, double white_y, double red_x, double red_y, double green_x, + double green_y, double blue_x, double blue_y)) +PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_const_structrp png_ptr, + png_inforp info_ptr, double red_X, double red_Y, double red_Z, + double green_X, double green_Y, double green_Z, double blue_X, + double blue_Y, double blue_Z)) +PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, png_fixed_point int_white_x, + png_fixed_point int_white_y, png_fixed_point int_red_x, + png_fixed_point int_red_y, png_fixed_point int_green_x, + png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)) +PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, + png_fixed_point int_red_Z, png_fixed_point int_green_X, + png_fixed_point int_green_Y, png_fixed_point int_green_Z, + png_fixed_point int_blue_X, png_fixed_point int_blue_Y, + png_fixed_point int_blue_Z)) +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr, + png_const_inforp info_ptr, double *file_gamma)) +PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, + png_fixed_point *int_file_gamma)) +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(139, void, png_set_gAMA, (png_const_structrp png_ptr, + png_inforp info_ptr, double file_gamma)) +PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, png_fixed_point int_file_gamma)) +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_16p *hist)); +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_uint_16p hist)); +#endif + +PNG_EXPORT(143, png_uint_32, png_get_IHDR, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height, + int *bit_depth, int *color_type, int *interlace_method, + int *compression_method, int *filter_method)); + +PNG_EXPORT(144, void, png_set_IHDR, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_method, int compression_method, + int filter_method)); + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(145, png_uint_32, png_get_oFFs, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, + int *unit_type)); +#endif + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(146, void, png_set_oFFs, (png_const_structrp png_ptr, + png_inforp info_ptr, png_int_32 offset_x, png_int_32 offset_y, + int unit_type)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(147, png_uint_32, png_get_pCAL, (png_const_structrp png_ptr, + png_inforp info_ptr, png_charp *purpose, png_int_32 *X0, + png_int_32 *X1, int *type, int *nparams, png_charp *units, + png_charpp *params)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(148, void, png_set_pCAL, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1, + int type, int nparams, png_const_charp units, png_charpp params)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(149, png_uint_32, png_get_pHYs, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(150, void, png_set_pHYs, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +PNG_EXPORT(151, png_uint_32, png_get_PLTE, (png_const_structrp png_ptr, + png_inforp info_ptr, png_colorp *palette, int *num_palette)); + +PNG_EXPORT(152, void, png_set_PLTE, (png_structrp png_ptr, + png_inforp info_ptr, png_const_colorp palette, int num_palette)); + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(153, png_uint_32, png_get_sBIT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_color_8p *sig_bit)); +#endif + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(154, void, png_set_sBIT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_color_8p sig_bit)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structrp png_ptr, + png_const_inforp info_ptr, int *file_srgb_intent)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(156, void, png_set_sRGB, (png_const_structrp png_ptr, + png_inforp info_ptr, int srgb_intent)); +PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_const_structrp png_ptr, + png_inforp info_ptr, int srgb_intent)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(158, png_uint_32, png_get_iCCP, (png_const_structrp png_ptr, + png_inforp info_ptr, png_charpp name, int *compression_type, + png_bytepp profile, png_uint_32 *proflen)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(159, void, png_set_iCCP, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_charp name, int compression_type, + png_const_bytep profile, png_uint_32 proflen)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(160, int, png_get_sPLT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_sPLT_tpp entries)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(161, void, png_set_sPLT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)); +#endif + +#ifdef PNG_TEXT_SUPPORTED +/* png_get_text also returns the number of text chunks in *num_text */ +PNG_EXPORT(162, int, png_get_text, (png_const_structrp png_ptr, + png_inforp info_ptr, png_textp *text_ptr, int *num_text)); +#endif + +/* Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#ifdef PNG_TEXT_SUPPORTED +PNG_EXPORT(163, void, png_set_text, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_textp text_ptr, int num_text)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(164, png_uint_32, png_get_tIME, (png_const_structrp png_ptr, + png_inforp info_ptr, png_timep *mod_time)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(165, void, png_set_tIME, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_timep mod_time)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(166, png_uint_32, png_get_tRNS, (png_const_structrp png_ptr, + png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans, + png_color_16p *trans_color)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(167, void, png_set_tRNS, (png_structrp png_ptr, + png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans, + png_const_color_16p trans_color)); +#endif + +#ifdef PNG_sCAL_SUPPORTED +PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structrp png_ptr, + png_const_inforp info_ptr, int *unit, double *width, double *height)) +#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \ + defined(PNG_FLOATING_POINT_SUPPORTED) +/* NOTE: this API is currently implemented using floating point arithmetic, + * consequently it can only be used on systems with floating point support. + * In any case the range of values supported by png_fixed_point is small and it + * is highly recommended that png_get_sCAL_s be used instead. + */ +PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, + png_fixed_point *width, png_fixed_point *height)) +#endif +PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, + (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, + png_charpp swidth, png_charpp sheight)); + +PNG_FP_EXPORT(170, void, png_set_sCAL, (png_const_structrp png_ptr, + png_inforp info_ptr, int unit, double width, double height)) +PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, int unit, png_fixed_point width, + png_fixed_point height)) +PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr, + png_inforp info_ptr, int unit, + png_const_charp swidth, png_const_charp sheight)); +#endif /* PNG_sCAL_SUPPORTED */ + +#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED +/* Provide the default handling for all unknown chunks or, optionally, for + * specific unknown chunks. + * + * NOTE: prior to 1.6.0 the handling specified for particular chunks on read was + * ignored and the default was used, the per-chunk setting only had an effect on + * write. If you wish to have chunk-specific handling on read in code that must + * work on earlier versions you must use a user chunk callback to specify the + * desired handling (keep or discard.) + * + * The 'keep' parameter is a PNG_HANDLE_CHUNK_ value as listed below. The + * parameter is interpreted as follows: + * + * READ: + * PNG_HANDLE_CHUNK_AS_DEFAULT: + * Known chunks: do normal libpng processing, do not keep the chunk (but + * see the comments below about PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + * Unknown chunks: for a specific chunk use the global default, when used + * as the default discard the chunk data. + * PNG_HANDLE_CHUNK_NEVER: + * Discard the chunk data. + * PNG_HANDLE_CHUNK_IF_SAFE: + * Keep the chunk data if the chunk is not critical else raise a chunk + * error. + * PNG_HANDLE_CHUNK_ALWAYS: + * Keep the chunk data. + * + * If the chunk data is saved it can be retrieved using png_get_unknown_chunks, + * below. Notice that specifying "AS_DEFAULT" as a global default is equivalent + * to specifying "NEVER", however when "AS_DEFAULT" is used for specific chunks + * it simply resets the behavior to the libpng default. + * + * INTERACTION WTIH USER CHUNK CALLBACKS: + * The per-chunk handling is always used when there is a png_user_chunk_ptr + * callback and the callback returns 0; the chunk is then always stored *unless* + * it is critical and the per-chunk setting is other than ALWAYS. Notice that + * the global default is *not* used in this case. (In effect the per-chunk + * value is incremented to at least IF_SAFE.) + * + * IMPORTANT NOTE: this behavior will change in libpng 1.7 - the global and + * per-chunk defaults will be honored. If you want to preserve the current + * behavior when your callback returns 0 you must set PNG_HANDLE_CHUNK_IF_SAFE + * as the default - if you don't do this libpng 1.6 will issue a warning. + * + * If you want unhandled unknown chunks to be discarded in libpng 1.6 and + * earlier simply return '1' (handled). + * + * PNG_HANDLE_AS_UNKNOWN_SUPPORTED: + * If this is *not* set known chunks will always be handled by libpng and + * will never be stored in the unknown chunk list. Known chunks listed to + * png_set_keep_unknown_chunks will have no effect. If it is set then known + * chunks listed with a keep other than AS_DEFAULT will *never* be processed + * by libpng, in addition critical chunks must either be processed by the + * callback or saved. + * + * The IHDR and IEND chunks must not be listed. Because this turns off the + * default handling for chunks that would otherwise be recognized the + * behavior of libpng transformations may well become incorrect! + * + * WRITE: + * When writing chunks the options only apply to the chunks specified by + * png_set_unknown_chunks (below), libpng will *always* write known chunks + * required by png_set_ calls and will always write the core critical chunks + * (as required for PLTE). + * + * Each chunk in the png_set_unknown_chunks list is looked up in the + * png_set_keep_unknown_chunks list to find the keep setting, this is then + * interpreted as follows: + * + * PNG_HANDLE_CHUNK_AS_DEFAULT: + * Write safe-to-copy chunks and write other chunks if the global + * default is set to _ALWAYS, otherwise don't write this chunk. + * PNG_HANDLE_CHUNK_NEVER: + * Do not write the chunk. + * PNG_HANDLE_CHUNK_IF_SAFE: + * Write the chunk if it is safe-to-copy, otherwise do not write it. + * PNG_HANDLE_CHUNK_ALWAYS: + * Write the chunk. + * + * Note that the default behavior is effectively the opposite of the read case - + * in read unknown chunks are not stored by default, in write they are written + * by default. Also the behavior of PNG_HANDLE_CHUNK_IF_SAFE is very different + * - on write the safe-to-copy bit is checked, on read the critical bit is + * checked and on read if the chunk is critical an error will be raised. + * + * num_chunks: + * =========== + * If num_chunks is positive, then the "keep" parameter specifies the manner + * for handling only those chunks appearing in the chunk_list array, + * otherwise the chunk list array is ignored. + * + * If num_chunks is 0 the "keep" parameter specifies the default behavior for + * unknown chunks, as described above. + * + * If num_chunks is negative, then the "keep" parameter specifies the manner + * for handling all unknown chunks plus all chunks recognized by libpng + * except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to + * be processed by libpng. + */ +PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr, + int keep, png_const_bytep chunk_list, int num_chunks)); + +/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned; + * the result is therefore true (non-zero) if special handling is required, + * false for the default handling. + */ +PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr, + png_const_bytep chunk_name)); +#endif + +#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED +PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_unknown_chunkp unknowns, + int num_unknowns)); + /* NOTE: prior to 1.6.0 this routine set the 'location' field of the added + * unknowns to the location currently stored in the png_struct. This is + * invariably the wrong value on write. To fix this call the following API + * for each chunk in the list with the correct location. If you know your + * code won't be compiled on earlier versions you can rely on + * png_set_unknown_chunks(write-ptr, png_get_unknown_chunks(read-ptr)) doing + * the correct thing. + */ + +PNG_EXPORT(175, void, png_set_unknown_chunk_location, + (png_const_structrp png_ptr, png_inforp info_ptr, int chunk, int location)); + +PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structrp png_ptr, + png_inforp info_ptr, png_unknown_chunkpp entries)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + * If you need to turn it off for a chunk that your application has freed, + * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); + */ +PNG_EXPORT(177, void, png_set_invalid, (png_const_structrp png_ptr, + png_inforp info_ptr, int mask)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* The "params" pointer is currently not used and is for future expansion. */ +PNG_EXPORT(178, void, png_read_png, (png_structrp png_ptr, png_inforp info_ptr, + int transforms, png_voidp params)); +PNG_EXPORT(179, void, png_write_png, (png_structrp png_ptr, png_inforp info_ptr, + int transforms, png_voidp params)); +#endif + +PNG_EXPORT(180, png_const_charp, png_get_copyright, + (png_const_structrp png_ptr)); +PNG_EXPORT(181, png_const_charp, png_get_header_ver, + (png_const_structrp png_ptr)); +PNG_EXPORT(182, png_const_charp, png_get_header_version, + (png_const_structrp png_ptr)); +PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, + (png_const_structrp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structrp png_ptr, + png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 +#define PNG_HANDLE_CHUNK_LAST 4 + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. + */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +PNG_EXPORT(185, void, png_set_strip_error_numbers, (png_structrp png_ptr, + png_uint_32 strip_mode)); +#endif + +/* Added in libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +PNG_EXPORT(186, void, png_set_user_limits, (png_structrp png_ptr, + png_uint_32 user_width_max, png_uint_32 user_height_max)); +PNG_EXPORT(187, png_uint_32, png_get_user_width_max, + (png_const_structrp png_ptr)); +PNG_EXPORT(188, png_uint_32, png_get_user_height_max, + (png_const_structrp png_ptr)); +/* Added in libpng-1.4.0 */ +PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structrp png_ptr, + png_uint_32 user_chunk_cache_max)); +PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, + (png_const_structrp png_ptr)); +/* Added in libpng-1.4.1 */ +PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structrp png_ptr, + png_alloc_size_t user_chunk_cache_max)); +PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, + (png_const_structrp png_ptr)); +#endif + +#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) +PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +PNG_FP_EXPORT(196, float, png_get_x_offset_inches, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +#endif + +PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structrp png_ptr, + png_const_inforp info_ptr)) +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +#endif + +# ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +# endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ + +/* Added in libpng-1.4.0 */ +#ifdef PNG_IO_STATE_SUPPORTED +PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_const_structrp png_ptr)); + +/* Removed from libpng 1.6; use png_get_io_chunk_type. */ +PNG_REMOVED(200, png_const_bytep, png_get_io_chunk_name, (png_structrp png_ptr), + PNG_DEPRECATED) + +PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, + (png_const_structrp png_ptr)); + +/* The flags returned by png_get_io_state() are the following: */ +# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ +# define PNG_IO_READING 0x0001 /* currently reading */ +# define PNG_IO_WRITING 0x0002 /* currently writing */ +# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ +# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ +# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ +# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ +# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ +# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ +#endif /* ?PNG_IO_STATE_SUPPORTED */ + +/* Interlace support. The following macros are always defined so that if + * libpng interlace handling is turned off the macros may be used to handle + * interlaced images within the application. + */ +#define PNG_INTERLACE_ADAM7_PASSES 7 + +/* Two macros to return the first row and first column of the original, + * full, image which appears in a given pass. 'pass' is in the range 0 + * to 6 and the result is in the range 0 to 7. + */ +#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7) +#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7) + +/* A macro to return the offset between pixels in the output row for a pair of + * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that + * follows. Note that ROW_OFFSET is the offset from one row to the next whereas + * COL_OFFSET is from one column to the next, within a row. + */ +#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8) +#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1)) + +/* Two macros to help evaluate the number of rows or columns in each + * pass. This is expressed as a shift - effectively log2 of the number or + * rows or columns in each 8x8 tile of the original image. + */ +#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) +#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) + +/* Hence two macros to determine the number of rows or columns in a given + * pass of an image given its height or width. In fact these macros may + * return non-zero even though the sub-image is empty, because the other + * dimension may be empty for a small image. + */ +#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) +#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) + +/* For the reader row callbacks (both progressive and sequential) it is + * necessary to find the row in the output image given a row in an interlaced + * image, so two more macros: + */ +#define PNG_ROW_FROM_PASS_ROW(y_in, pass) \ + (((y_in)<>(((7-(off))-(pass))<<2)) & 0xF) | \ + ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0)) + +#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ + ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) +#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ + ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ + * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 \ + - (png_uint_16)(alpha)) + 128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \ + * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(65535 \ + - (png_uint_32)(alpha)) + 32768); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* Standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + 127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \ + 32767) / 65535) +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); +PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); +PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); +#endif + +PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_const_structrp png_ptr, + png_const_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); +#endif +#ifdef PNG_SAVE_INT_32_SUPPORTED +PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); +#endif + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ +#endif + +#ifdef PNG_USE_READ_MACROS +/* Inline macros to do direct reads of bytes from the input buffer. + * The png_get_int_32() routine assumes we are using two's complement + * format for negative values, which is almost certainly true. + */ +# define PNG_get_uint_32(buf) \ + (((png_uint_32)(*(buf)) << 24) + \ + ((png_uint_32)(*((buf) + 1)) << 16) + \ + ((png_uint_32)(*((buf) + 2)) << 8) + \ + ((png_uint_32)(*((buf) + 3)))) + + /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the + * function) incorrectly returned a value of type png_uint_32. + */ +# define PNG_get_uint_16(buf) \ + ((png_uint_16) \ + (((unsigned int)(*(buf)) << 8) + \ + ((unsigned int)(*((buf) + 1))))) + +# define PNG_get_int_32(buf) \ + ((png_int_32)((*(buf) & 0x80) \ + ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ + : (png_int_32)png_get_uint_32(buf))) + + /* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h, + * but defining a macro name prefixed with PNG_PREFIX. + */ +# ifndef PNG_PREFIX +# define png_get_uint_32(buf) PNG_get_uint_32(buf) +# define png_get_uint_16(buf) PNG_get_uint_16(buf) +# define png_get_int_32(buf) PNG_get_int_32(buf) +# endif +#else +# ifdef PNG_PREFIX + /* No macros; revert to the (redefined) function */ +# define PNG_get_uint_32 (png_get_uint_32) +# define PNG_get_uint_16 (png_get_uint_16) +# define PNG_get_int_32 (png_get_int_32) +# endif +#endif + +/******************************************************************************* + * SIMPLIFIED API + ******************************************************************************* + * + * Please read the documentation in libpng-manual.txt (TODO: write said + * documentation) if you don't understand what follows. + * + * The simplified API hides the details of both libpng and the PNG file format + * itself. It allows PNG files to be read into a very limited number of + * in-memory bitmap formats or to be written from the same formats. If these + * formats do not accomodate your needs then you can, and should, use the more + * sophisticated APIs above - these support a wide variety of in-memory formats + * and a wide variety of sophisticated transformations to those formats as well + * as a wide variety of APIs to manipulate ancillary information. + * + * To read a PNG file using the simplified API: + * + * 1) Declare a 'png_image' structure (see below) on the stack and set the + * version field to PNG_IMAGE_VERSION. + * 2) Call the appropriate png_image_begin_read... function. + * 3) Set the png_image 'format' member to the required sample format. + * 4) Allocate a buffer for the image and, if required, the color-map. + * 5) Call png_image_finish_read to read the image and, if required, the + * color-map into your buffers. + * + * There are no restrictions on the format of the PNG input itself; all valid + * color types, bit depths, and interlace methods are acceptable, and the + * input image is transformed as necessary to the requested in-memory format + * during the png_image_finish_read() step. The only caveat is that if you + * request a color-mapped image from a PNG that is full-color or makes + * complex use of an alpha channel the transformation is extremely lossy and the + * result may look terrible. + * + * To write a PNG file using the simplified API: + * + * 1) Declare a 'png_image' structure on the stack and memset() it to all zero. + * 2) Initialize the members of the structure that describe the image, setting + * the 'format' member to the format of the image samples. + * 3) Call the appropriate png_image_write... function with a pointer to the + * image and, if necessary, the color-map to write the PNG data. + * + * png_image is a structure that describes the in-memory format of an image + * when it is being read or defines the in-memory format of an image that you + * need to write: + */ +#define PNG_IMAGE_VERSION 1 + +typedef struct png_control *png_controlp; +typedef struct +{ + png_controlp opaque; /* Initialize to NULL, free with png_image_free */ + png_uint_32 version; /* Set to PNG_IMAGE_VERSION */ + png_uint_32 width; /* Image width in pixels (columns) */ + png_uint_32 height; /* Image height in pixels (rows) */ + png_uint_32 format; /* Image format as defined below */ + png_uint_32 flags; /* A bit mask containing informational flags */ + png_uint_32 colormap_entries; + /* Number of entries in the color-map */ + + /* In the event of an error or warning the following field will be set to a + * non-zero value and the 'message' field will contain a '\0' terminated + * string with the libpng error or warning message. If both warnings and + * an error were encountered, only the error is recorded. If there + * are multiple warnings, only the first one is recorded. + * + * The upper 30 bits of this value are reserved, the low two bits contain + * a value as follows: + */ +# define PNG_IMAGE_WARNING 1 +# define PNG_IMAGE_ERROR 2 + /* + * The result is a two bit code such that a value more than 1 indicates + * a failure in the API just called: + * + * 0 - no warning or error + * 1 - warning + * 2 - error + * 3 - error preceded by warning + */ +# define PNG_IMAGE_FAILED(png_cntrl) ((((png_cntrl).warning_or_error)&0x03)>1) + + png_uint_32 warning_or_error; + + char message[64]; +} png_image, *png_imagep; + +/* The samples of the image have one to four channels whose components have + * original values in the range 0 to 1.0: + * + * 1: A single gray or luminance channel (G). + * 2: A gray/luminance channel and an alpha channel (GA). + * 3: Three red, green, blue color channels (RGB). + * 4: Three color channels and an alpha channel (RGBA). + * + * The components are encoded in one of two ways: + * + * a) As a small integer, value 0..255, contained in a single byte. For the + * alpha channel the original value is simply value/255. For the color or + * luminance channels the value is encoded according to the sRGB specification + * and matches the 8-bit format expected by typical display devices. + * + * The color/gray channels are not scaled (pre-multiplied) by the alpha + * channel and are suitable for passing to color management software. + * + * b) As a value in the range 0..65535, contained in a 2-byte integer. All + * channels can be converted to the original value by dividing by 65535; all + * channels are linear. Color channels use the RGB encoding (RGB end-points) of + * the sRGB specification. This encoding is identified by the + * PNG_FORMAT_FLAG_LINEAR flag below. + * + * When the simplified API needs to convert between sRGB and linear colorspaces, + * the actual sRGB transfer curve defined in the sRGB specification (see the + * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2 + * approximation used elsewhere in libpng. + * + * When an alpha channel is present it is expected to denote pixel coverage + * of the color or luminance channels and is returned as an associated alpha + * channel: the color/gray channels are scaled (pre-multiplied) by the alpha + * value. + * + * The samples are either contained directly in the image data, between 1 and 8 + * bytes per pixel according to the encoding, or are held in a color-map indexed + * by bytes in the image data. In the case of a color-map the color-map entries + * are individual samples, encoded as above, and the image data has one byte per + * pixel to select the relevant sample from the color-map. + */ + +/* PNG_FORMAT_* + * + * #defines to be used in png_image::format. Each #define identifies a + * particular layout of sample data and, if present, alpha values. There are + * separate defines for each of the two component encodings. + * + * A format is built up using single bit flag values. All combinations are + * valid. Formats can be built up from the flag values or you can use one of + * the predefined values below. When testing formats always use the FORMAT_FLAG + * macros to test for individual features - future versions of the library may + * add new flags. + * + * When reading or writing color-mapped images the format should be set to the + * format of the entries in the color-map then png_image_{read,write}_colormap + * called to read or write the color-map and set the format correctly for the + * image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly! + * + * NOTE: libpng can be built with particular features disabled, if you see + * compiler errors because the definition of one of the following flags has been + * compiled out it is because libpng does not have the required support. It is + * possible, however, for the libpng configuration to enable the format on just + * read or just write; in that case you may see an error at run time. You can + * guard against this by checking for the definition of the appropriate + * "_SUPPORTED" macro, one of: + * + * PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED + */ +#define PNG_FORMAT_FLAG_ALPHA 0x01U /* format with an alpha channel */ +#define PNG_FORMAT_FLAG_COLOR 0x02U /* color format: otherwise grayscale */ +#define PNG_FORMAT_FLAG_LINEAR 0x04U /* 2 byte channels else 1 byte */ +#define PNG_FORMAT_FLAG_COLORMAP 0x08U /* image data is color-mapped */ + +#ifdef PNG_FORMAT_BGR_SUPPORTED +# define PNG_FORMAT_FLAG_BGR 0x10U /* BGR colors, else order is RGB */ +#endif + +#ifdef PNG_FORMAT_AFIRST_SUPPORTED +# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */ +#endif + +/* Commonly used formats have predefined macros. + * + * First the single byte (sRGB) formats: + */ +#define PNG_FORMAT_GRAY 0 +#define PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA +#define PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST) +#define PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR +#define PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR) +#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST) +#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST) + +/* Then the linear 2-byte formats. When naming these "Y" is used to + * indicate a luminance (gray) channel. + */ +#define PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR +#define PNG_FORMAT_LINEAR_Y_ALPHA (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_LINEAR_RGB (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR) +#define PNG_FORMAT_LINEAR_RGB_ALPHA \ + (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA) + +/* With color-mapped formats the image data is one byte for each pixel, the byte + * is an index into the color-map which is formatted as above. To obtain a + * color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP + * to one of the above definitions, or you can use one of the definitions below. + */ +#define PNG_FORMAT_RGB_COLORMAP (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_BGR_COLORMAP (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_RGBA_COLORMAP (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_ARGB_COLORMAP (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_BGRA_COLORMAP (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_ABGR_COLORMAP (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP) + +/* PNG_IMAGE macros + * + * These are convenience macros to derive information from a png_image + * structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the + * actual image sample values - either the entries in the color-map or the + * pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values + * for the pixels and will always return 1 for color-mapped formats. The + * remaining macros return information about the rows in the image and the + * complete image. + * + * NOTE: All the macros that take a png_image::format parameter are compile time + * constants if the format parameter is, itself, a constant. Therefore these + * macros can be used in array declarations and case labels where required. + * Similarly the macros are also pre-processor constants (sizeof is not used) so + * they can be used in #if tests. + * + * First the information about the samples. + */ +#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)\ + (((fmt)&(PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA))+1) + /* Return the total number of channels in a given format: 1..4 */ + +#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)\ + ((((fmt) & PNG_FORMAT_FLAG_LINEAR) >> 2)+1) + /* Return the size in bytes of a single component of a pixel or color-map + * entry (as appropriate) in the image: 1 or 2. + */ + +#define PNG_IMAGE_SAMPLE_SIZE(fmt)\ + (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)) + /* This is the size of the sample data for one sample. If the image is + * color-mapped it is the size of one color-map entry (and image pixels are + * one byte in size), otherwise it is the size of one image pixel. + */ + +#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\ + (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256) + /* The maximum size of the color-map required by the format expressed in a + * count of components. This can be used to compile-time allocate a + * color-map: + * + * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)]; + * + * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)]; + * + * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the + * information from one of the png_image_begin_read_ APIs and dynamically + * allocate the required memory. + */ + +/* Corresponding information about the pixels */ +#define PNG_IMAGE_PIXEL_(test,fmt)\ + (((fmt)&PNG_FORMAT_FLAG_COLORMAP)?1:test(fmt)) + +#define PNG_IMAGE_PIXEL_CHANNELS(fmt)\ + PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS,fmt) + /* The number of separate channels (components) in a pixel; 1 for a + * color-mapped image. + */ + +#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\ + PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt) + /* The size, in bytes, of each component in a pixel; 1 for a color-mapped + * image. + */ + +#define PNG_IMAGE_PIXEL_SIZE(fmt) PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_SIZE,fmt) + /* The size, in bytes, of a complete pixel; 1 for a color-mapped image. */ + +/* Information about the whole row, or whole image */ +#define PNG_IMAGE_ROW_STRIDE(image)\ + (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width) + /* Return the total number of components in a single row of the image; this + * is the minimum 'row stride', the minimum count of components between each + * row. For a color-mapped image this is the minimum number of bytes in a + * row. + */ + +#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\ + (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride)) + /* Return the size, in bytes, of an image buffer given a png_image and a row + * stride - the number of components to leave space for in each row. + */ + +#define PNG_IMAGE_SIZE(image)\ + PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image)) + /* Return the size, in bytes, of the image in memory given just a png_image; + * the row stride is the minimum stride required for the image. + */ + +#define PNG_IMAGE_COLORMAP_SIZE(image)\ + (PNG_IMAGE_SAMPLE_SIZE((image).format) * (image).colormap_entries) + /* Return the size, in bytes, of the color-map of this image. If the image + * format is not a color-map format this will return a size sufficient for + * 256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if + * you don't want to allocate a color-map in this case. + */ + +/* PNG_IMAGE_FLAG_* + * + * Flags containing additional information about the image are held in the + * 'flags' field of png_image. + */ +#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB 0x01 + /* This indicates the the RGB values of the in-memory bitmap do not + * correspond to the red, green and blue end-points defined by sRGB. + */ + +#define PNG_IMAGE_FLAG_FAST 0x02 + /* On write emphasise speed over compression; the resultant PNG file will be + * larger but will be produced significantly faster, particular for large + * images. Do not use this option for images which will be distributed, only + * used it when producing intermediate files that will be read back in + * repeatedly. For a typical 24-bit image the option will double the read + * speed at the cost of increasing the image size by 25%, however for many + * more compressible images the PNG file can be 10 times larger with only a + * slight speed gain. + */ + +#define PNG_IMAGE_FLAG_16BIT_sRGB 0x04 + /* On read if the image is a 16-bit per component image and there is no gAMA + * or sRGB chunk assume that the components are sRGB encoded. Notice that + * images output by the simplified API always have gamma information; setting + * this flag only affects the interpretation of 16-bit images from an + * external source. It is recommended that the application expose this flag + * to the user; the user can normally easily recognize the difference between + * linear and sRGB encoding. This flag has no effect on write - the data + * passed to the write APIs must have the correct encoding (as defined + * above.) + * + * If the flag is not set (the default) input 16-bit per component data is + * assumed to be linear. + * + * NOTE: the flag can only be set after the png_image_begin_read_ call, + * because that call initializes the 'flags' field. + */ + +#ifdef PNG_SIMPLIFIED_READ_SUPPORTED +/* READ APIs + * --------- + * + * The png_image passed to the read APIs must have been initialized by setting + * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.) + */ +#ifdef PNG_STDIO_SUPPORTED +PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image, + const char *file_name)); + /* The named file is opened for read and the image header is filled in + * from the PNG header in the file. + */ + +PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image, + FILE* file)); + /* The PNG header is read from the stdio FILE object. */ +#endif /* PNG_STDIO_SUPPORTED */ + +PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image, + png_const_voidp memory, png_size_t size)); + /* The PNG header is read from the given memory buffer. */ + +PNG_EXPORT(237, int, png_image_finish_read, (png_imagep image, + png_const_colorp background, void *buffer, png_int_32 row_stride, + void *colormap)); + /* Finish reading the image into the supplied buffer and clean up the + * png_image structure. + * + * row_stride is the step, in byte or 2-byte units as appropriate, + * between adjacent rows. A positive stride indicates that the top-most row + * is first in the buffer - the normal top-down arrangement. A negative + * stride indicates that the bottom-most row is first in the buffer. + * + * background need only be supplied if an alpha channel must be removed from + * a png_byte format and the removal is to be done by compositing on a solid + * color; otherwise it may be NULL and any composition will be done directly + * onto the buffer. The value is an sRGB color to use for the background, + * for grayscale output the green channel is used. + * + * background must be supplied when an alpha channel must be removed from a + * single byte color-mapped output format, in other words if: + * + * 1) The original format from png_image_begin_read_from_* had + * PNG_FORMAT_FLAG_ALPHA set. + * 2) The format set by the application does not. + * 3) The format set by the application has PNG_FORMAT_FLAG_COLORMAP set and + * PNG_FORMAT_FLAG_LINEAR *not* set. + * + * For linear output removing the alpha channel is always done by compositing + * on black and background is ignored. + * + * colormap must be supplied when PNG_FORMAT_FLAG_COLORMAP is set. It must + * be at least the size (in bytes) returned by PNG_IMAGE_COLORMAP_SIZE. + * image->colormap_entries will be updated to the actual number of entries + * written to the colormap; this may be less than the original value. + */ + +PNG_EXPORT(238, void, png_image_free, (png_imagep image)); + /* Free any data allocated by libpng in image->opaque, setting the pointer to + * NULL. May be called at any time after the structure is initialized. + */ +#endif /* PNG_SIMPLIFIED_READ_SUPPORTED */ + +#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED +#ifdef PNG_STDIO_SUPPORTED +/* WRITE APIS + * ---------- + * For write you must initialize a png_image structure to describe the image to + * be written. To do this use memset to set the whole structure to 0 then + * initialize fields describing your image. + * + * version: must be set to PNG_IMAGE_VERSION + * opaque: must be initialized to NULL + * width: image width in pixels + * height: image height in rows + * format: the format of the data (image and color-map) you wish to write + * flags: set to 0 unless one of the defined flags applies; set + * PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images where the RGB + * values do not correspond to the colors in sRGB. + * colormap_entries: set to the number of entries in the color-map (0 to 256) + */ +PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image, + const char *file, int convert_to_8bit, const void *buffer, + png_int_32 row_stride, const void *colormap)); + /* Write the image to the named file. */ + +PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file, + int convert_to_8_bit, const void *buffer, png_int_32 row_stride, + const void *colormap)); + /* Write the image to the given (FILE*). */ + +/* With both write APIs if image is in one of the linear formats with 16-bit + * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG + * gamma encoded according to the sRGB specification, otherwise a 16-bit linear + * encoded PNG file is written. + * + * With color-mapped data formats the colormap parameter point to a color-map + * with at least image->colormap_entries encoded in the specified format. If + * the format is linear the written PNG color-map will be converted to sRGB + * regardless of the convert_to_8_bit flag. + * + * With all APIs row_stride is handled as in the read APIs - it is the spacing + * from one row to the next in component sized units (1 or 2 bytes) and if + * negative indicates a bottom-up row layout in the buffer. + * + * Note that the write API does not support interlacing or sub-8-bit pixels. + */ +#endif /* PNG_STDIO_SUPPORTED */ +#endif /* PNG_SIMPLIFIED_WRITE_SUPPORTED */ +/******************************************************************************* + * END OF SIMPLIFIED API + ******************************************************************************/ + +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +PNG_EXPORT(242, void, png_set_check_for_invalid_index, + (png_structrp png_ptr, int allowed)); +# ifdef PNG_GET_PALETTE_MAX_SUPPORTED +PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr, + png_const_infop info_ptr)); +# endif +#endif /* CHECK_FOR_INVALID_INDEX */ + +/******************************************************************************* + * IMPLEMENTATION OPTIONS + ******************************************************************************* + * + * Support for arbitrary implementation-specific optimizations. The API allows + * particular options to be turned on or off. 'Option' is the number of the + * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given + * by the PNG_OPTION_ defines below. + * + * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions, + * are detected at run time, however sometimes it may be impossible + * to do this in user mode, in which case it is necessary to discover + * the capabilities in an OS specific way. Such capabilities are + * listed here when libpng has support for them and must be turned + * ON by the application if present. + * + * SOFTWARE: sometimes software optimizations actually result in performance + * decrease on some architectures or systems, or with some sets of + * PNG images. 'Software' options allow such optimizations to be + * selected at run time. + */ +#ifdef PNG_SET_OPTION_SUPPORTED +#ifdef PNG_ARM_NEON_API_SUPPORTED +# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ +#endif +#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */ +#define PNG_OPTION_NEXT 4 /* Next option - numbers must be even */ + +/* Return values: NOTE: there are four values and 'off' is *not* zero */ +#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ +#define PNG_OPTION_INVALID 1 /* Option number out of range */ +#define PNG_OPTION_OFF 2 +#define PNG_OPTION_ON 3 + +PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, + int onoff)); +#endif + +/******************************************************************************* + * END OF HARDWARE OPTIONS + ******************************************************************************/ + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project + * defs, scripts/pnglibconf.h, and scripts/pnglibconf.h.prebuilt + */ + +/* The last ordinal number (this is the *last* one already used; the next + * one to use is one more than this.) Maintainer, remember to add an entry to + * scripts/symbols.def as well. + */ +#ifdef PNG_EXPORT_LAST_ORDINAL + PNG_EXPORT_LAST_ORDINAL(244); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* Do not put anything past this line */ +#endif /* PNG_H */ diff --git a/src/lib_armv6/libpng16/pngconf.h b/src/lib_armv6/libpng16/pngconf.h new file mode 100644 index 0000000..0808c1c --- /dev/null +++ b/src/lib_armv6/libpng16/pngconf.h @@ -0,0 +1,617 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.6.3 - July 18, 2013 + * + * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +/* To do: Do all of this in scripts/pnglibconf.dfa */ +#ifdef PNG_SAFE_LIMITS_SUPPORTED +# ifdef PNG_USER_WIDTH_MAX +# undef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000L +# endif +# ifdef PNG_USER_HEIGHT_MAX +# undef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000L +# endif +# ifdef PNG_USER_CHUNK_MALLOC_MAX +# undef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 4000000L +# endif +# ifdef PNG_USER_CHUNK_CACHE_MAX +# undef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 128 +# endif +#endif + +#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */ + +/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C + * compiler for correct compilation. The following header files are required by + * the standard. If your compiler doesn't provide these header files, or they + * do not match the standard, you will need to provide/improve them. + */ +#include +#include + +/* Library header files. These header files are all defined by ISOC90; libpng + * expects conformant implementations, however, an ISOC90 conformant system need + * not provide these header files if the functionality cannot be implemented. + * In this case it will be necessary to disable the relevant parts of libpng in + * the build of pnglibconf.h. + * + * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not + * include this unnecessary header file. + */ + +#ifdef PNG_STDIO_SUPPORTED + /* Required for the definition of FILE: */ +# include +#endif + +#ifdef PNG_SETJMP_SUPPORTED + /* Required for the definition of jmp_buf and the declaration of longjmp: */ +# include +#endif + +#ifdef PNG_CONVERT_tIME_SUPPORTED + /* Required for struct tm: */ +# include +#endif + +#endif /* PNG_BUILDING_SYMBOL_TABLE */ + +/* Prior to 1.6.0 it was possible to turn off 'const' in declarations using + * PNG_NO_CONST; this is no longer supported except for data declarations which + * apparently still cause problems in 2011 on some compilers. + */ +#define PNG_CONST const /* backward compatibility only */ + +/* This controls optimization of the reading of 16 and 32 bit values + * from PNG files. It can be set on a per-app-file basis - it + * just changes whether a macro is used when the function is called. + * The library builder sets the default; if read functions are not + * built into the library the macro implementation is forced on. + */ +#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED +# define PNG_USE_READ_MACROS +#endif +#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) +# if PNG_DEFAULT_READ_MACROS +# define PNG_USE_READ_MACROS +# endif +#endif + +/* COMPILER SPECIFIC OPTIONS. + * + * These options are provided so that a variety of difficult compilers + * can be used. Some are fixed at build time (e.g. PNG_API_RULE + * below) but still have compiler specific implementations, others + * may be changed on a per-file basis when compiling against libpng. + */ + +/* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect + * against legacy (pre ISOC90) compilers that did not understand function + * prototypes. It is not required for modern C compilers. + */ +#ifndef PNGARG +# define PNGARG(arglist) arglist +#endif + +/* Function calling conventions. + * ============================= + * Normally it is not necessary to specify to the compiler how to call + * a function - it just does it - however on x86 systems derived from + * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems + * and some others) there are multiple ways to call a function and the + * default can be changed on the compiler command line. For this reason + * libpng specifies the calling convention of every exported function and + * every function called via a user supplied function pointer. This is + * done in this file by defining the following macros: + * + * PNGAPI Calling convention for exported functions. + * PNGCBAPI Calling convention for user provided (callback) functions. + * PNGCAPI Calling convention used by the ANSI-C library (required + * for longjmp callbacks and sometimes used internally to + * specify the calling convention for zlib). + * + * These macros should never be overridden. If it is necessary to + * change calling convention in a private build this can be done + * by setting PNG_API_RULE (which defaults to 0) to one of the values + * below to select the correct 'API' variants. + * + * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. + * This is correct in every known environment. + * PNG_API_RULE=1 Use the operating system convention for PNGAPI and + * the 'C' calling convention (from PNGCAPI) for + * callbacks (PNGCBAPI). This is no longer required + * in any known environment - if it has to be used + * please post an explanation of the problem to the + * libpng mailing list. + * + * These cases only differ if the operating system does not use the C + * calling convention, at present this just means the above cases + * (x86 DOS/Windows sytems) and, even then, this does not apply to + * Cygwin running on those systems. + * + * Note that the value must be defined in pnglibconf.h so that what + * the application uses to call the library matches the conventions + * set when building the library. + */ + +/* Symbol export + * ============= + * When building a shared library it is almost always necessary to tell + * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' + * is used to mark the symbols. On some systems these symbols can be + * extracted at link time and need no special processing by the compiler, + * on other systems the symbols are flagged by the compiler and just + * the declaration requires a special tag applied (unfortunately) in a + * compiler dependent way. Some systems can do either. + * + * A small number of older systems also require a symbol from a DLL to + * be flagged to the program that calls it. This is a problem because + * we do not know in the header file included by application code that + * the symbol will come from a shared library, as opposed to a statically + * linked one. For this reason the application must tell us by setting + * the magic flag PNG_USE_DLL to turn on the special processing before + * it includes png.h. + * + * Four additional macros are used to make this happen: + * + * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from + * the build or imported if PNG_USE_DLL is set - compiler + * and system specific. + * + * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to + * 'type', compiler specific. + * + * PNG_DLL_EXPORT Set to the magic to use during a libpng build to + * make a symbol exported from the DLL. Not used in the + * public header files; see pngpriv.h for how it is used + * in the libpng build. + * + * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come + * from a DLL - used to define PNG_IMPEXP when + * PNG_USE_DLL is set. + */ + +/* System specific discovery. + * ========================== + * This code is used at build time to find PNG_IMPEXP, the API settings + * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL + * import processing is possible. On Windows systems it also sets + * compiler-specific macros to the values required to change the calling + * conventions of the various functions. + */ +#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ + defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) + /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or + * MinGW on any architecture currently supported by Windows. Also includes + * Watcom builds but these need special treatment because they are not + * compatible with GCC or Visual C because of different calling conventions. + */ +# if PNG_API_RULE == 2 + /* If this line results in an error, either because __watcall is not + * understood or because of a redefine just below you cannot use *this* + * build of the library with the compiler you are using. *This* build was + * build using Watcom and applications must also be built using Watcom! + */ +# define PNGCAPI __watcall +# endif + +# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) +# define PNGCAPI __cdecl +# if PNG_API_RULE == 1 + /* If this line results in an error __stdcall is not understood and + * PNG_API_RULE should not have been set to '1'. + */ +# define PNGAPI __stdcall +# endif +# else + /* An older compiler, or one not detected (erroneously) above, + * if necessary override on the command line to get the correct + * variants for the compiler. + */ +# ifndef PNGCAPI +# define PNGCAPI _cdecl +# endif +# if PNG_API_RULE == 1 && !defined(PNGAPI) +# define PNGAPI _stdcall +# endif +# endif /* compiler/api */ + + /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ + +# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) +# error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed" +# endif + +# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ + (defined(__BORLANDC__) && __BORLANDC__ < 0x500) + /* older Borland and MSC + * compilers used '__export' and required this to be after + * the type. + */ +# ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP +# endif +# define PNG_DLL_EXPORT __export +# else /* newer compiler */ +# define PNG_DLL_EXPORT __declspec(dllexport) +# ifndef PNG_DLL_IMPORT +# define PNG_DLL_IMPORT __declspec(dllimport) +# endif +# endif /* compiler */ + +#else /* !Windows */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# define PNGAPI _System +# else /* !Windows/x86 && !OS/2 */ + /* Use the defaults, or define PNG*API on the command line (but + * this will have to be done for every compile!) + */ +# endif /* other system, !OS/2 */ +#endif /* !Windows/x86 */ + +/* Now do all the defaulting . */ +#ifndef PNGCAPI +# define PNGCAPI +#endif +#ifndef PNGCBAPI +# define PNGCBAPI PNGCAPI +#endif +#ifndef PNGAPI +# define PNGAPI PNGCAPI +#endif + +/* PNG_IMPEXP may be set on the compilation system command line or (if not set) + * then in an internal header file when building the library, otherwise (when + * using the library) it is set here. + */ +#ifndef PNG_IMPEXP +# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) + /* This forces use of a DLL, disallowing static linking */ +# define PNG_IMPEXP PNG_DLL_IMPORT +# endif + +# ifndef PNG_IMPEXP +# define PNG_IMPEXP +# endif +#endif + +/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat + * 'attributes' as a storage class - the attributes go at the start of the + * function definition, and attributes are always appended regardless of the + * compiler. This considerably simplifies these macros but may cause problems + * if any compilers both need function attributes and fail to handle them as + * a storage class (this is unlikely.) + */ +#ifndef PNG_FUNCTION +# define PNG_FUNCTION(type, name, args, attributes) attributes type name args +#endif + +#ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type +#endif + + /* The ordinal value is only relevant when preprocessing png.h for symbol + * table entries, so we discard it here. See the .dfn files in the + * scripts directory. + */ +#ifndef PNG_EXPORTA + +# define PNG_EXPORTA(ordinal, type, name, args, attributes)\ + PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \ + extern attributes) +#endif + +/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, + * so make something non-empty to satisfy the requirement: + */ +#define PNG_EMPTY /*empty list*/ + +#define PNG_EXPORT(ordinal, type, name, args)\ + PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) + +/* Use PNG_REMOVED to comment out a removed interface. */ +#ifndef PNG_REMOVED +# define PNG_REMOVED(ordinal, type, name, args, attributes) +#endif + +#ifndef PNG_CALLBACK +# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) +#endif + +/* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. + * + * Added at libpng-1.2.41. + */ + +#ifndef PNG_NO_PEDANTIC_WARNINGS +# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED +# define PNG_PEDANTIC_WARNINGS_SUPPORTED +# endif +#endif + +#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED + /* Support for compiler specific function attributes. These are used + * so that where compiler support is available, incorrect use of API + * functions in png.h will generate compiler warnings. Added at libpng + * version 1.2.41. Disabling these removes the warnings but may also produce + * less efficient code. + */ +# if defined(__GNUC__) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __attribute__((__noreturn__)) +# endif +# if __GNUC__ >= 3 +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __attribute__((__malloc__)) +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __attribute__((__deprecated__)) +# endif +# ifndef PNG_PRIVATE +# if 0 /* Doesn't work so we use deprecated instead*/ +# define PNG_PRIVATE \ + __attribute__((warning("This function is not exported by libpng."))) +# else +# define PNG_PRIVATE \ + __attribute__((__deprecated__)) +# endif +# endif +# if ((__GNUC__ != 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1)) +# ifndef PNG_RESTRICT +# define PNG_RESTRICT __restrict +# endif +# endif /* __GNUC__ == 3.0 */ +# endif /* __GNUC__ >= 3 */ + +# elif defined(_MSC_VER) && (_MSC_VER >= 1300) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* not supported */ +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __declspec(noreturn) +# endif +# ifndef PNG_ALLOCATED +# if (_MSC_VER >= 1400) +# define PNG_ALLOCATED __declspec(restrict) +# endif +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __declspec(deprecated) +# endif +# ifndef PNG_PRIVATE +# define PNG_PRIVATE __declspec(deprecated) +# endif +# ifndef PNG_RESTRICT +# if (_MSC_VER >= 1400) +# define PNG_RESTRICT __restrict +# endif +# endif + +# elif defined(__WATCOMC__) +# ifndef PNG_RESTRICT +# define PNG_RESTRICT __restrict +# endif +# endif /* _MSC_VER */ +#endif /* PNG_PEDANTIC_WARNINGS */ + +#ifndef PNG_DEPRECATED +# define PNG_DEPRECATED /* Use of this function is deprecated */ +#endif +#ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* The result of this function must be checked */ +#endif +#ifndef PNG_NORETURN +# define PNG_NORETURN /* This function does not return */ +#endif +#ifndef PNG_ALLOCATED +# define PNG_ALLOCATED /* The result of the function is new memory */ +#endif +#ifndef PNG_PRIVATE +# define PNG_PRIVATE /* This is a private libpng function */ +#endif +#ifndef PNG_RESTRICT +# define PNG_RESTRICT /* The C99 "restrict" feature */ +#endif +#ifndef PNG_FP_EXPORT /* A floating point API. */ +# ifdef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FP_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args); +# else /* No floating point APIs */ +# define PNG_FP_EXPORT(ordinal, type, name, args) +# endif +#endif +#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ +# ifdef PNG_FIXED_POINT_SUPPORTED +# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args); +# else /* No fixed point APIs */ +# define PNG_FIXED_EXPORT(ordinal, type, name, args) +# endif +#endif + +#ifndef PNG_BUILDING_SYMBOL_TABLE +/* Some typedefs to get us started. These should be safe on most of the common + * platforms. + * + * png_uint_32 and png_int_32 may, currently, be larger than required to hold a + * 32-bit value however this is not normally advisable. + * + * png_uint_16 and png_int_16 should always be two bytes in size - this is + * verified at library build time. + * + * png_byte must always be one byte in size. + * + * The checks below use constants from limits.h, as defined by the ISOC90 + * standard. + */ +#if CHAR_BIT == 8 && UCHAR_MAX == 255 + typedef unsigned char png_byte; +#else +# error "libpng requires 8 bit bytes" +#endif + +#if INT_MIN == -32768 && INT_MAX == 32767 + typedef int png_int_16; +#elif SHRT_MIN == -32768 && SHRT_MAX == 32767 + typedef short png_int_16; +#else +# error "libpng requires a signed 16 bit type" +#endif + +#if UINT_MAX == 65535 + typedef unsigned int png_uint_16; +#elif USHRT_MAX == 65535 + typedef unsigned short png_uint_16; +#else +# error "libpng requires an unsigned 16 bit type" +#endif + +#if INT_MIN < -2147483646 && INT_MAX > 2147483646 + typedef int png_int_32; +#elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646 + typedef long int png_int_32; +#else +# error "libpng requires a signed 32 bit (or more) type" +#endif + +#if UINT_MAX > 4294967294 + typedef unsigned int png_uint_32; +#elif ULONG_MAX > 4294967294 + typedef unsigned long int png_uint_32; +#else +# error "libpng requires an unsigned 32 bit (or more) type" +#endif + +/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however, + * requires an ISOC90 compiler and relies on consistent behavior of sizeof. + */ +typedef size_t png_size_t; +typedef ptrdiff_t png_ptrdiff_t; + +/* libpng needs to know the maximum value of 'size_t' and this controls the + * definition of png_alloc_size_t, below. This maximum value of size_t limits + * but does not control the maximum allocations the library makes - there is + * direct application control of this through png_set_user_limits(). + */ +#ifndef PNG_SMALL_SIZE_T + /* Compiler specific tests for systems where size_t is known to be less than + * 32 bits (some of these systems may no longer work because of the lack of + * 'far' support; see above.) + */ +# if (defined(__TURBOC__) && !defined(__FLAT__)) ||\ + (defined(_MSC_VER) && defined(MAXSEG_64K)) +# define PNG_SMALL_SIZE_T +# endif +#endif + +/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no + * smaller than png_uint_32. Casts from png_size_t or png_uint_32 to + * png_alloc_size_t are not necessary; in fact, it is recommended not to use + * them at all so that the compiler can complain when something turns out to be + * problematic. + * + * Casts in the other direction (from png_alloc_size_t to png_size_t or + * png_uint_32) should be explicitly applied; however, we do not expect to + * encounter practical situations that require such conversions. + * + * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than + * 4294967295 - i.e. less than the maximum value of png_uint_32. + */ +#ifdef PNG_SMALL_SIZE_T + typedef png_uint_32 png_alloc_size_t; +#else + typedef png_size_t png_alloc_size_t; +#endif + +/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler + * implementations of Intel CPU specific support of user-mode segmented address + * spaces, where 16-bit pointers address more than 65536 bytes of memory using + * separate 'segment' registers. The implementation requires two different + * types of pointer (only one of which includes the segment value.) + * + * If required this support is available in version 1.2 of libpng and may be + * available in versions through 1.5, although the correctness of the code has + * not been verified recently. + */ + +/* Typedef for floating-point numbers that are converted to fixed-point with a + * multiple of 100,000, e.g., gamma + */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void * png_voidp; +typedef const void * png_const_voidp; +typedef png_byte * png_bytep; +typedef const png_byte * png_const_bytep; +typedef png_uint_32 * png_uint_32p; +typedef const png_uint_32 * png_const_uint_32p; +typedef png_int_32 * png_int_32p; +typedef const png_int_32 * png_const_int_32p; +typedef png_uint_16 * png_uint_16p; +typedef const png_uint_16 * png_const_uint_16p; +typedef png_int_16 * png_int_16p; +typedef const png_int_16 * png_const_int_16p; +typedef char * png_charp; +typedef const char * png_const_charp; +typedef png_fixed_point * png_fixed_point_p; +typedef const png_fixed_point * png_const_fixed_point_p; +typedef png_size_t * png_size_tp; +typedef const png_size_t * png_const_size_tp; + +#ifdef PNG_STDIO_SUPPORTED +typedef FILE * png_FILE_p; +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double * png_doublep; +typedef const double * png_const_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte * * png_bytepp; +typedef png_uint_32 * * png_uint_32pp; +typedef png_int_32 * * png_int_32pp; +typedef png_uint_16 * * png_uint_16pp; +typedef png_int_16 * * png_int_16pp; +typedef const char * * png_const_charpp; +typedef char * * png_charpp; +typedef png_fixed_point * * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double * * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char * * * png_charppp; + +#endif /* PNG_BUILDING_SYMBOL_TABLE */ + +#endif /* PNGCONF_H */ diff --git a/src/lib_armv6/libpng16/pnglibconf.h b/src/lib_armv6/libpng16/pnglibconf.h new file mode 100644 index 0000000..9f5caa0 --- /dev/null +++ b/src/lib_armv6/libpng16/pnglibconf.h @@ -0,0 +1,209 @@ +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.6.3 - July 18, 2013 */ + +/* Copyright (c) 1998-2012 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ +/* Derived from: scripts/pnglibconf.dfa */ +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* options */ +#define PNG_16BIT_SUPPORTED +#define PNG_ALIGNED_MEMORY_SUPPORTED +/*#undef PNG_ARM_NEON_API_SUPPORTED*/ +/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/ +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_BENIGN_READ_ERRORS_SUPPORTED +/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/ +#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_COLORSPACE_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_FORMAT_AFIRST_SUPPORTED +#define PNG_FORMAT_BGR_SUPPORTED +#define PNG_GAMMA_SUPPORTED +#define PNG_GET_PALETTE_MAX_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_ALPHA_MODE_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_READ_COMPRESSED_TEXT_SUPPORTED +#define PNG_READ_EXPAND_16_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_GET_PALETTE_MAX_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_READ_SCALE_16_TO_8_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +/*#undef PNG_SAFE_LIMITS_SUPPORTED*/ +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#define PNG_SET_OPTION_SUPPORTED +#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED +#define PNG_SIMPLIFIED_READ_BGR_SUPPORTED +#define PNG_SIMPLIFIED_READ_SUPPORTED +#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED +#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED +#define PNG_SIMPLIFIED_WRITE_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED +#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_zTXt_SUPPORTED +/* end of options */ +/* settings */ +#define PNG_API_RULE 0 +#define PNG_CALLOC_SUPPORTED +#define PNG_COST_SHIFT 3 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE +#define PNG_INFLATE_BUF_SIZE 1024 +#define PNG_MAX_GAMMA_8 11 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1) +#define PNG_TEXT_Z_DEFAULT_STRATEGY 0 +#define PNG_WEIGHT_SHIFT 8 +#define PNG_ZBUF_SIZE 8192 +#define PNG_ZLIB_VERNUM 0x1280 +#define PNG_Z_DEFAULT_COMPRESSION (-1) +#define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 +#define PNG_Z_DEFAULT_STRATEGY 1 +#define PNG_sCAL_PRECISION 5 +#define PNG_sRGB_PROFILE_CHECKS 2 +/* end of settings */ +#endif /* PNGLCONF_H */ diff --git a/src/lib_armv6/libxcb.so b/src/lib_armv6/libxcb.so new file mode 120000 index 0000000..e858d46 --- /dev/null +++ b/src/lib_armv6/libxcb.so @@ -0,0 +1 @@ +libxcb.so.1.1.0 \ No newline at end of file diff --git a/src/lib_armv6/libxcb.so.1 b/src/lib_armv6/libxcb.so.1 new file mode 120000 index 0000000..e858d46 --- /dev/null +++ b/src/lib_armv6/libxcb.so.1 @@ -0,0 +1 @@ +libxcb.so.1.1.0 \ No newline at end of file diff --git a/src/lib_armv6/libxcb.so.1.1.0 b/src/lib_armv6/libxcb.so.1.1.0 new file mode 100755 index 0000000..86f24ee Binary files /dev/null and b/src/lib_armv6/libxcb.so.1.1.0 differ diff --git a/src/lib_armv6/libz.a b/src/lib_armv6/libz.a new file mode 100644 index 0000000..63e5c07 Binary files /dev/null and b/src/lib_armv6/libz.a differ diff --git a/src/lib_armv7hf/X11/X.h b/src/lib_armv7hf/X11/X.h new file mode 100644 index 0000000..5cf695d --- /dev/null +++ b/src/lib_armv7hf/X11/X.h @@ -0,0 +1,717 @@ +/* Definitions for the X window system likely to be used by applications */ + +#ifndef X_H +#define X_H + +/*********************************************************** + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#define X_PROTOCOL 11 /* current protocol version */ +#define X_PROTOCOL_REVISION 0 /* current minor version */ + +/* Resources */ + +/* + * _XSERVER64 must ONLY be defined when compiling X server sources on + * systems where unsigned long is not 32 bits, must NOT be used in + * client or library code. + */ +#ifndef _XSERVER64 +# ifndef _XTYPEDEF_XID +# define _XTYPEDEF_XID +typedef unsigned long XID; +# endif +# ifndef _XTYPEDEF_MASK +# define _XTYPEDEF_MASK +typedef unsigned long Mask; +# endif +# ifndef _XTYPEDEF_ATOM +# define _XTYPEDEF_ATOM +typedef unsigned long Atom; /* Also in Xdefs.h */ +# endif +typedef unsigned long VisualID; +typedef unsigned long Time; +#else +# include +# ifndef _XTYPEDEF_XID +# define _XTYPEDEF_XID +typedef CARD32 XID; +# endif +# ifndef _XTYPEDEF_MASK +# define _XTYPEDEF_MASK +typedef CARD32 Mask; +# endif +# ifndef _XTYPEDEF_ATOM +# define _XTYPEDEF_ATOM +typedef CARD32 Atom; +# endif +typedef CARD32 VisualID; +typedef CARD32 Time; +#endif + +typedef XID Window; +typedef XID Drawable; +#ifndef _XTYPEDEF_FONT +# define _XTYPEDEF_FONT +typedef XID Font; +#endif +typedef XID Pixmap; +typedef XID Cursor; +typedef XID Colormap; +typedef XID GContext; +typedef XID KeySym; + +typedef unsigned char KeyCode; + +/***************************************************************** + * RESERVED RESOURCE AND CONSTANT DEFINITIONS + *****************************************************************/ + +#ifndef None +#define None 0L /* universal null resource or null atom */ +#endif + +#define ParentRelative 1L /* background pixmap in CreateWindow + and ChangeWindowAttributes */ + +#define CopyFromParent 0L /* border pixmap in CreateWindow + and ChangeWindowAttributes + special VisualID and special window + class passed to CreateWindow */ + +#define PointerWindow 0L /* destination window in SendEvent */ +#define InputFocus 1L /* destination window in SendEvent */ + +#define PointerRoot 1L /* focus window in SetInputFocus */ + +#define AnyPropertyType 0L /* special Atom, passed to GetProperty */ + +#define AnyKey 0L /* special Key Code, passed to GrabKey */ + +#define AnyButton 0L /* special Button Code, passed to GrabButton */ + +#define AllTemporary 0L /* special Resource ID passed to KillClient */ + +#define CurrentTime 0L /* special Time */ + +#define NoSymbol 0L /* special KeySym */ + +/***************************************************************** + * EVENT DEFINITIONS + *****************************************************************/ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Event names. Used in "type" field in XEvent structures. Not to be +confused with event masks above. They start from 2 because 0 and 1 +are reserved in the protocol for errors and replies. */ + +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 +#define GenericEvent 35 +#define LASTEvent 36 /* must be bigger than any event # */ + + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, + state in various key-, mouse-, and button-related events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* modifier names. Used to build a SetModifierMapping request or + to read a GetModifierMapping request. These correspond to the + masks defined above. */ +#define ShiftMapIndex 0 +#define LockMapIndex 1 +#define ControlMapIndex 2 +#define Mod1MapIndex 3 +#define Mod2MapIndex 4 +#define Mod3MapIndex 5 +#define Mod4MapIndex 6 +#define Mod5MapIndex 7 + + +/* button masks. Used in same manner as Key masks above. Not to be confused + with button names below. */ + +#define Button1Mask (1<<8) +#define Button2Mask (1<<9) +#define Button3Mask (1<<10) +#define Button4Mask (1<<11) +#define Button5Mask (1<<12) + +#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ + + +/* button names. Used as arguments to GrabButton and as detail in ButtonPress + and ButtonRelease events. Not to be confused with button masks above. + Note that 0 is already defined above as "AnyButton". */ + +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define Button4 4 +#define Button5 5 + +/* Notify modes */ + +#define NotifyNormal 0 +#define NotifyGrab 1 +#define NotifyUngrab 2 +#define NotifyWhileGrabbed 3 + +#define NotifyHint 1 /* for MotionNotify events */ + +/* Notify detail */ + +#define NotifyAncestor 0 +#define NotifyVirtual 1 +#define NotifyInferior 2 +#define NotifyNonlinear 3 +#define NotifyNonlinearVirtual 4 +#define NotifyPointer 5 +#define NotifyPointerRoot 6 +#define NotifyDetailNone 7 + +/* Visibility notify */ + +#define VisibilityUnobscured 0 +#define VisibilityPartiallyObscured 1 +#define VisibilityFullyObscured 2 + +/* Circulation request */ + +#define PlaceOnTop 0 +#define PlaceOnBottom 1 + +/* protocol families */ + +#define FamilyInternet 0 /* IPv4 */ +#define FamilyDECnet 1 +#define FamilyChaos 2 +#define FamilyInternet6 6 /* IPv6 */ + +/* authentication families not tied to a specific protocol */ +#define FamilyServerInterpreted 5 + +/* Property notification */ + +#define PropertyNewValue 0 +#define PropertyDelete 1 + +/* Color Map notification */ + +#define ColormapUninstalled 0 +#define ColormapInstalled 1 + +/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + +#define GrabModeSync 0 +#define GrabModeAsync 1 + +/* GrabPointer, GrabKeyboard reply status */ + +#define GrabSuccess 0 +#define AlreadyGrabbed 1 +#define GrabInvalidTime 2 +#define GrabNotViewable 3 +#define GrabFrozen 4 + +/* AllowEvents modes */ + +#define AsyncPointer 0 +#define SyncPointer 1 +#define ReplayPointer 2 +#define AsyncKeyboard 3 +#define SyncKeyboard 4 +#define ReplayKeyboard 5 +#define AsyncBoth 6 +#define SyncBoth 7 + +/* Used in SetInputFocus, GetInputFocus */ + +#define RevertToNone (int)None +#define RevertToPointerRoot (int)PointerRoot +#define RevertToParent 2 + +/***************************************************************** + * ERROR CODES + *****************************************************************/ + +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +/***************************************************************** + * WINDOW DEFINITIONS + *****************************************************************/ + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Bit Gravity */ + +#define ForgetGravity 0 +#define NorthWestGravity 1 +#define NorthGravity 2 +#define NorthEastGravity 3 +#define WestGravity 4 +#define CenterGravity 5 +#define EastGravity 6 +#define SouthWestGravity 7 +#define SouthGravity 8 +#define SouthEastGravity 9 +#define StaticGravity 10 + +/* Window gravity + bit gravity above */ + +#define UnmapGravity 0 + +/* Used in CreateWindow for backing-store hint */ + +#define NotUseful 0 +#define WhenMapped 1 +#define Always 2 + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Used in ChangeSaveSet */ + +#define SetModeInsert 0 +#define SetModeDelete 1 + +/* Used in ChangeCloseDownMode */ + +#define DestroyAll 0 +#define RetainPermanent 1 +#define RetainTemporary 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* Circulation direction */ + +#define RaiseLowest 0 +#define LowerHighest 1 + +/* Property modes */ + +#define PropModeReplace 0 +#define PropModePrepend 1 +#define PropModeAppend 2 + +/***************************************************************** + * GRAPHICS DEFINITIONS + *****************************************************************/ + +/* graphics functions, as in GC.alu */ + +#define GXclear 0x0 /* 0 */ +#define GXand 0x1 /* src AND dst */ +#define GXandReverse 0x2 /* src AND NOT dst */ +#define GXcopy 0x3 /* src */ +#define GXandInverted 0x4 /* NOT src AND dst */ +#define GXnoop 0x5 /* dst */ +#define GXxor 0x6 /* src XOR dst */ +#define GXor 0x7 /* src OR dst */ +#define GXnor 0x8 /* NOT src AND NOT dst */ +#define GXequiv 0x9 /* NOT src XOR dst */ +#define GXinvert 0xa /* NOT dst */ +#define GXorReverse 0xb /* src OR NOT dst */ +#define GXcopyInverted 0xc /* NOT src */ +#define GXorInverted 0xd /* NOT src OR dst */ +#define GXnand 0xe /* NOT src OR NOT dst */ +#define GXset 0xf /* 1 */ + +/* LineStyle */ + +#define LineSolid 0 +#define LineOnOffDash 1 +#define LineDoubleDash 2 + +/* capStyle */ + +#define CapNotLast 0 +#define CapButt 1 +#define CapRound 2 +#define CapProjecting 3 + +/* joinStyle */ + +#define JoinMiter 0 +#define JoinRound 1 +#define JoinBevel 2 + +/* fillStyle */ + +#define FillSolid 0 +#define FillTiled 1 +#define FillStippled 2 +#define FillOpaqueStippled 3 + +/* fillRule */ + +#define EvenOddRule 0 +#define WindingRule 1 + +/* subwindow mode */ + +#define ClipByChildren 0 +#define IncludeInferiors 1 + +/* SetClipRectangles ordering */ + +#define Unsorted 0 +#define YSorted 1 +#define YXSorted 2 +#define YXBanded 3 + +/* CoordinateMode for drawing routines */ + +#define CoordModeOrigin 0 /* relative to the origin */ +#define CoordModePrevious 1 /* relative to previous point */ + +/* Polygon shapes */ + +#define Complex 0 /* paths may intersect */ +#define Nonconvex 1 /* no paths intersect, but not convex */ +#define Convex 2 /* wholly convex */ + +/* Arc modes for PolyFillArc */ + +#define ArcChord 0 /* join endpoints of arc */ +#define ArcPieSlice 1 /* join endpoints to center of arc */ + +/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into + GC.stateChanges */ + +#define GCFunction (1L<<0) +#define GCPlaneMask (1L<<1) +#define GCForeground (1L<<2) +#define GCBackground (1L<<3) +#define GCLineWidth (1L<<4) +#define GCLineStyle (1L<<5) +#define GCCapStyle (1L<<6) +#define GCJoinStyle (1L<<7) +#define GCFillStyle (1L<<8) +#define GCFillRule (1L<<9) +#define GCTile (1L<<10) +#define GCStipple (1L<<11) +#define GCTileStipXOrigin (1L<<12) +#define GCTileStipYOrigin (1L<<13) +#define GCFont (1L<<14) +#define GCSubwindowMode (1L<<15) +#define GCGraphicsExposures (1L<<16) +#define GCClipXOrigin (1L<<17) +#define GCClipYOrigin (1L<<18) +#define GCClipMask (1L<<19) +#define GCDashOffset (1L<<20) +#define GCDashList (1L<<21) +#define GCArcMode (1L<<22) + +#define GCLastBit 22 +/***************************************************************** + * FONTS + *****************************************************************/ + +/* used in QueryFont -- draw direction */ + +#define FontLeftToRight 0 +#define FontRightToLeft 1 + +#define FontChange 255 + +/***************************************************************** + * IMAGING + *****************************************************************/ + +/* ImageFormat -- PutImage, GetImage */ + +#define XYBitmap 0 /* depth 1, XYFormat */ +#define XYPixmap 1 /* depth == drawable depth */ +#define ZPixmap 2 /* depth == drawable depth */ + +/***************************************************************** + * COLOR MAP STUFF + *****************************************************************/ + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/***************************************************************** + * CURSOR STUFF + *****************************************************************/ + +/* QueryBestSize Class */ + +#define CursorShape 0 /* largest size that can be displayed */ +#define TileShape 1 /* size tiled fastest */ +#define StippleShape 2 /* size stippled fastest */ + +/***************************************************************** + * KEYBOARD/POINTER STUFF + *****************************************************************/ + +#define AutoRepeatModeOff 0 +#define AutoRepeatModeOn 1 +#define AutoRepeatModeDefault 2 + +#define LedModeOff 0 +#define LedModeOn 1 + +/* masks for ChangeKeyboardControl */ + +#define KBKeyClickPercent (1L<<0) +#define KBBellPercent (1L<<1) +#define KBBellPitch (1L<<2) +#define KBBellDuration (1L<<3) +#define KBLed (1L<<4) +#define KBLedMode (1L<<5) +#define KBKey (1L<<6) +#define KBAutoRepeatMode (1L<<7) + +#define MappingSuccess 0 +#define MappingBusy 1 +#define MappingFailed 2 + +#define MappingModifier 0 +#define MappingKeyboard 1 +#define MappingPointer 2 + +/***************************************************************** + * SCREEN SAVER STUFF + *****************************************************************/ + +#define DontPreferBlanking 0 +#define PreferBlanking 1 +#define DefaultBlanking 2 + +#define DisableScreenSaver 0 +#define DisableScreenInterval 0 + +#define DontAllowExposures 0 +#define AllowExposures 1 +#define DefaultExposures 2 + +/* for ForceScreenSaver */ + +#define ScreenSaverReset 0 +#define ScreenSaverActive 1 + +/***************************************************************** + * HOSTS AND CONNECTIONS + *****************************************************************/ + +/* for ChangeHosts */ + +#define HostInsert 0 +#define HostDelete 1 + +/* for ChangeAccessControl */ + +#define EnableAccess 1 +#define DisableAccess 0 + +/* Display classes used in opening the connection + * Note that the statically allocated ones are even numbered and the + * dynamically changeable ones are odd numbered */ + +#define StaticGray 0 +#define GrayScale 1 +#define StaticColor 2 +#define PseudoColor 3 +#define TrueColor 4 +#define DirectColor 5 + + +/* Byte order used in imageByteOrder and bitmapBitOrder */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#endif /* X_H */ diff --git a/src/lib_armv7hf/X11/Xfuncproto.h b/src/lib_armv7hf/X11/Xfuncproto.h new file mode 100644 index 0000000..acfa5b9 --- /dev/null +++ b/src/lib_armv7hf/X11/Xfuncproto.h @@ -0,0 +1,184 @@ +/* Xfuncproto.h. Generated from Xfuncproto.h.in by configure. */ +/* + * +Copyright 1989, 1991, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + * + */ + +/* Definitions to make function prototypes manageable */ + +#ifndef _XFUNCPROTO_H_ +#define _XFUNCPROTO_H_ + +#ifndef NeedFunctionPrototypes +#define NeedFunctionPrototypes 1 +#endif /* NeedFunctionPrototypes */ + +#ifndef NeedVarargsPrototypes +#define NeedVarargsPrototypes 1 +#endif /* NeedVarargsPrototypes */ + +#if NeedFunctionPrototypes + +#ifndef NeedNestedPrototypes +#define NeedNestedPrototypes 1 +#endif /* NeedNestedPrototypes */ + +#ifndef _Xconst +#define _Xconst const +#endif /* _Xconst */ + +/* Function prototype configuration (see configure for more info) */ +#ifndef NARROWPROTO +#define NARROWPROTO /**/ +#endif +#ifndef FUNCPROTO +#define FUNCPROTO 15 +#endif + +#ifndef NeedWidePrototypes +#ifdef NARROWPROTO +#define NeedWidePrototypes 0 +#else +#define NeedWidePrototypes 1 /* default to make interropt. easier */ +#endif +#endif /* NeedWidePrototypes */ + +#endif /* NeedFunctionPrototypes */ + +#ifndef _XFUNCPROTOBEGIN +#if defined(__cplusplus) || defined(c_plusplus) /* for C++ V2.0 */ +#define _XFUNCPROTOBEGIN extern "C" { /* do not leave open across includes */ +#define _XFUNCPROTOEND } +#else +#define _XFUNCPROTOBEGIN +#define _XFUNCPROTOEND +#endif +#endif /* _XFUNCPROTOBEGIN */ + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && (__GNUC__ >= 4) +# define _X_SENTINEL(x) __attribute__ ((__sentinel__(x))) +#else +# define _X_SENTINEL(x) +#endif /* GNUC >= 4 */ + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__CYGWIN__) && !defined(__MINGW32__) +# define _X_EXPORT __attribute__((visibility("default"))) +# define _X_HIDDEN __attribute__((visibility("hidden"))) +# define _X_INTERNAL __attribute__((visibility("internal"))) +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +# define _X_EXPORT __global +# define _X_HIDDEN __hidden +# define _X_INTERNAL __hidden +#else /* not gcc >= 4 and not Sun Studio >= 8 */ +# define _X_EXPORT +# define _X_HIDDEN +# define _X_INTERNAL +#endif /* GNUC >= 4 */ + +/* Branch prediction hints for individual conditionals */ +/* requires xproto >= 7.0.9 */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303) +# define _X_LIKELY(x) __builtin_expect(!!(x), 1) +# define _X_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else /* not gcc >= 3.3 */ +# define _X_LIKELY(x) (x) +# define _X_UNLIKELY(x) (x) +#endif + +/* Bulk branch prediction hints via marking error path functions as "cold" */ +/* requires xproto >= 7.0.25 */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403) /* 4.3+ */ +# define _X_COLD __attribute__((__cold__)) +#else +# define _X_COLD /* nothing */ +#endif + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301) +# define _X_DEPRECATED __attribute__((deprecated)) +#else /* not gcc >= 3.1 */ +# define _X_DEPRECATED +#endif + +/* requires xproto >= 7.0.17 */ +#if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)) \ + || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) +# define _X_NORETURN __attribute((noreturn)) +#else +# define _X_NORETURN +#endif /* GNUC */ + +/* Added in X11R6.9, so available in any version of modular xproto */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203) +# define _X_ATTRIBUTE_PRINTF(x,y) __attribute__((__format__(__printf__,x,y))) +#else /* not gcc >= 2.3 */ +# define _X_ATTRIBUTE_PRINTF(x,y) +#endif + +/* requires xproto >= 7.0.22 - since this uses either gcc or C99 variable + argument macros, must be only used inside #ifdef _X_NONNULL guards, as + many legacy X clients are compiled in C89 mode still. */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303) +#define _X_NONNULL(args...) __attribute__((nonnull(args))) +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L) /* C99 */ +#define _X_NONNULL(...) /* */ +#endif + +/* requires xproto >= 7.0.22 */ +#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205) +#define _X_UNUSED __attribute__((__unused__)) +#else +#define _X_UNUSED /* */ +#endif + +/* C99 keyword "inline" or equivalent extensions in pre-C99 compilers */ +/* requires xproto >= 7.0.9 + (introduced in 7.0.8 but didn't support all compilers until 7.0.9) */ +#if defined(inline) /* assume autoconf set it correctly */ || \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L)) /* C99 */ || \ + (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)) +# define _X_INLINE inline +#elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* gcc w/C89+extensions */ +# define _X_INLINE __inline__ +#else +# define _X_INLINE +#endif + +/* C99 keyword "restrict" or equivalent extensions in pre-C99 compilers */ +/* requires xproto >= 7.0.21 */ +#ifndef _X_RESTRICT_KYWD +# if defined(restrict) /* assume autoconf set it correctly */ || \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L) /* C99 */ \ + && !defined(__cplusplus)) /* Workaround g++ issue on Solaris */ +# define _X_RESTRICT_KYWD restrict +# elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* gcc w/C89+extensions */ +# define _X_RESTRICT_KYWD __restrict__ +# else +# define _X_RESTRICT_KYWD +# endif +#endif + +#endif /* _XFUNCPROTO_H_ */ diff --git a/src/lib_armv7hf/X11/Xlib.h b/src/lib_armv7hf/X11/Xlib.h new file mode 100644 index 0000000..65f253c --- /dev/null +++ b/src/lib_armv7hf/X11/Xlib.h @@ -0,0 +1,4032 @@ +/* + +Copyright 1985, 1986, 1987, 1991, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ + + +/* + * Xlib.h - Header definition and support file for the C subroutine + * interface library (Xlib) to the X Window System Protocol (V11). + * Structures and symbols starting with "_" are private to the library. + */ +#ifndef _X11_XLIB_H_ +#define _X11_XLIB_H_ + +#define XlibSpecificationRelease 6 + +#include + +#if defined(__SCO__) || defined(__UNIXWARE__) +#include +#endif + +#include + +/* applications should not depend on these two headers being included! */ +#include +#include + +#ifndef X_WCHAR +#include +#else +#ifdef __UNIXOS2__ +#include +#else +/* replace this with #include or typedef appropriate for your system */ +typedef unsigned long wchar_t; +#endif +#endif + +#if defined(ISC) && defined(USE_XMBTOWC) +#define wctomb(a,b) _Xwctomb(a,b) +#define mblen(a,b) _Xmblen(a,b) +#ifndef USE_XWCHAR_STRING +#define mbtowc(a,b,c) _Xmbtowc(a,b,c) +#endif +#endif + +extern int +_Xmblen( +#ifdef ISC + char const *str, + size_t len +#else + char *str, + int len +#endif + ); + +/* API mentioning "UTF8" or "utf8" is an XFree86 extension, introduced in + November 2000. Its presence is indicated through the following macro. */ +#define X_HAVE_UTF8_STRING 1 + +/* The Xlib structs are full of implicit padding to properly align members. + We can't clean that up without breaking ABI, so tell clang not to bother + complaining about it. */ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +typedef char *XPointer; + +#define Bool int +#define Status int +#define True 1 +#define False 0 + +#define QueuedAlready 0 +#define QueuedAfterReading 1 +#define QueuedAfterFlush 2 + +#define ConnectionNumber(dpy) (((_XPrivDisplay)dpy)->fd) +#define RootWindow(dpy, scr) (ScreenOfDisplay(dpy,scr)->root) +#define DefaultScreen(dpy) (((_XPrivDisplay)dpy)->default_screen) +#define DefaultRootWindow(dpy) (ScreenOfDisplay(dpy,DefaultScreen(dpy))->root) +#define DefaultVisual(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_visual) +#define DefaultGC(dpy, scr) (ScreenOfDisplay(dpy,scr)->default_gc) +#define BlackPixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->black_pixel) +#define WhitePixel(dpy, scr) (ScreenOfDisplay(dpy,scr)->white_pixel) +#define AllPlanes ((unsigned long)~0L) +#define QLength(dpy) (((_XPrivDisplay)dpy)->qlen) +#define DisplayWidth(dpy, scr) (ScreenOfDisplay(dpy,scr)->width) +#define DisplayHeight(dpy, scr) (ScreenOfDisplay(dpy,scr)->height) +#define DisplayWidthMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mwidth) +#define DisplayHeightMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mheight) +#define DisplayPlanes(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_depth) +#define DisplayCells(dpy, scr) (DefaultVisual(dpy,scr)->map_entries) +#define ScreenCount(dpy) (((_XPrivDisplay)dpy)->nscreens) +#define ServerVendor(dpy) (((_XPrivDisplay)dpy)->vendor) +#define ProtocolVersion(dpy) (((_XPrivDisplay)dpy)->proto_major_version) +#define ProtocolRevision(dpy) (((_XPrivDisplay)dpy)->proto_minor_version) +#define VendorRelease(dpy) (((_XPrivDisplay)dpy)->release) +#define DisplayString(dpy) (((_XPrivDisplay)dpy)->display_name) +#define DefaultDepth(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_depth) +#define DefaultColormap(dpy, scr)(ScreenOfDisplay(dpy,scr)->cmap) +#define BitmapUnit(dpy) (((_XPrivDisplay)dpy)->bitmap_unit) +#define BitmapBitOrder(dpy) (((_XPrivDisplay)dpy)->bitmap_bit_order) +#define BitmapPad(dpy) (((_XPrivDisplay)dpy)->bitmap_pad) +#define ImageByteOrder(dpy) (((_XPrivDisplay)dpy)->byte_order) +#define NextRequest(dpy) (((_XPrivDisplay)dpy)->request + 1) +#define LastKnownRequestProcessed(dpy) (((_XPrivDisplay)dpy)->last_request_read) + +/* macros for screen oriented applications (toolkit) */ +#define ScreenOfDisplay(dpy, scr)(&((_XPrivDisplay)dpy)->screens[scr]) +#define DefaultScreenOfDisplay(dpy) ScreenOfDisplay(dpy,DefaultScreen(dpy)) +#define DisplayOfScreen(s) ((s)->display) +#define RootWindowOfScreen(s) ((s)->root) +#define BlackPixelOfScreen(s) ((s)->black_pixel) +#define WhitePixelOfScreen(s) ((s)->white_pixel) +#define DefaultColormapOfScreen(s)((s)->cmap) +#define DefaultDepthOfScreen(s) ((s)->root_depth) +#define DefaultGCOfScreen(s) ((s)->default_gc) +#define DefaultVisualOfScreen(s)((s)->root_visual) +#define WidthOfScreen(s) ((s)->width) +#define HeightOfScreen(s) ((s)->height) +#define WidthMMOfScreen(s) ((s)->mwidth) +#define HeightMMOfScreen(s) ((s)->mheight) +#define PlanesOfScreen(s) ((s)->root_depth) +#define CellsOfScreen(s) (DefaultVisualOfScreen((s))->map_entries) +#define MinCmapsOfScreen(s) ((s)->min_maps) +#define MaxCmapsOfScreen(s) ((s)->max_maps) +#define DoesSaveUnders(s) ((s)->save_unders) +#define DoesBackingStore(s) ((s)->backing_store) +#define EventMaskOfScreen(s) ((s)->root_input_mask) + +/* + * Extensions need a way to hang private data on some structures. + */ +typedef struct _XExtData { + int number; /* number returned by XRegisterExtension */ + struct _XExtData *next; /* next item on list of data for structure */ + int (*free_private)( /* called to free private storage */ + struct _XExtData *extension + ); + XPointer private_data; /* data private to this extension. */ +} XExtData; + +/* + * This file contains structures used by the extension mechanism. + */ +typedef struct { /* public to extension, cannot be changed */ + int extension; /* extension number */ + int major_opcode; /* major op-code assigned by server */ + int first_event; /* first event number for the extension */ + int first_error; /* first error number for the extension */ +} XExtCodes; + +/* + * Data structure for retrieving info about pixmap formats. + */ + +typedef struct { + int depth; + int bits_per_pixel; + int scanline_pad; +} XPixmapFormatValues; + + +/* + * Data structure for setting graphics context. + */ +typedef struct { + int function; /* logical operation */ + unsigned long plane_mask;/* plane mask */ + unsigned long foreground;/* foreground pixel */ + unsigned long background;/* background pixel */ + int line_width; /* line width */ + int line_style; /* LineSolid, LineOnOffDash, LineDoubleDash */ + int cap_style; /* CapNotLast, CapButt, + CapRound, CapProjecting */ + int join_style; /* JoinMiter, JoinRound, JoinBevel */ + int fill_style; /* FillSolid, FillTiled, + FillStippled, FillOpaeueStippled */ + int fill_rule; /* EvenOddRule, WindingRule */ + int arc_mode; /* ArcChord, ArcPieSlice */ + Pixmap tile; /* tile pixmap for tiling operations */ + Pixmap stipple; /* stipple 1 plane pixmap for stipping */ + int ts_x_origin; /* offset for tile or stipple operations */ + int ts_y_origin; + Font font; /* default text font for text operations */ + int subwindow_mode; /* ClipByChildren, IncludeInferiors */ + Bool graphics_exposures;/* boolean, should exposures be generated */ + int clip_x_origin; /* origin for clipping */ + int clip_y_origin; + Pixmap clip_mask; /* bitmap clipping; other calls for rects */ + int dash_offset; /* patterned/dashed line information */ + char dashes; +} XGCValues; + +/* + * Graphics context. The contents of this structure are implementation + * dependent. A GC should be treated as opaque by application code. + */ + +typedef struct _XGC +#ifdef XLIB_ILLEGAL_ACCESS +{ + XExtData *ext_data; /* hook for extension to hang data */ + GContext gid; /* protocol ID for graphics context */ + /* there is more to this structure, but it is private to Xlib */ +} +#endif +*GC; + +/* + * Visual structure; contains information about colormapping possible. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + VisualID visualid; /* visual id of this visual */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ class of screen (monochrome, etc.) */ +#else + int class; /* class of screen (monochrome, etc.) */ +#endif + unsigned long red_mask, green_mask, blue_mask; /* mask values */ + int bits_per_rgb; /* log base 2 of distinct color values */ + int map_entries; /* color map entries */ +} Visual; + +/* + * Depth structure; contains information for each possible depth. + */ +typedef struct { + int depth; /* this depth (Z) of the depth */ + int nvisuals; /* number of Visual types at this depth */ + Visual *visuals; /* list of visuals possible at this depth */ +} Depth; + +/* + * Information about the screen. The contents of this structure are + * implementation dependent. A Screen should be treated as opaque + * by application code. + */ + +struct _XDisplay; /* Forward declare before use for C++ */ + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + struct _XDisplay *display;/* back pointer to display structure */ + Window root; /* Root window id. */ + int width, height; /* width and height of screen */ + int mwidth, mheight; /* width and height of in millimeters */ + int ndepths; /* number of depths possible */ + Depth *depths; /* list of allowable depths on the screen */ + int root_depth; /* bits per pixel */ + Visual *root_visual; /* root visual */ + GC default_gc; /* GC for the root root visual */ + Colormap cmap; /* default color map */ + unsigned long white_pixel; + unsigned long black_pixel; /* White and Black pixel values */ + int max_maps, min_maps; /* max and min color maps */ + int backing_store; /* Never, WhenMapped, Always */ + Bool save_unders; + long root_input_mask; /* initial root input mask */ +} Screen; + +/* + * Format structure; describes ZFormat data the screen will understand. + */ +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + int depth; /* depth of this image format */ + int bits_per_pixel; /* bits/pixel at this depth */ + int scanline_pad; /* scanline must padded to this multiple */ +} ScreenFormat; + +/* + * Data structure for setting window attributes. + */ +typedef struct { + Pixmap background_pixmap; /* background or None or ParentRelative */ + unsigned long background_pixel; /* background pixel */ + Pixmap border_pixmap; /* border of the window */ + unsigned long border_pixel; /* border pixel value */ + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preseved if possible */ + unsigned long backing_pixel;/* value to use in restoring planes */ + Bool save_under; /* should bits under be saved? (popups) */ + long event_mask; /* set of events that should be saved */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Colormap colormap; /* color map to be associated with window */ + Cursor cursor; /* cursor to be displayed (or None) */ +} XSetWindowAttributes; + +typedef struct { + int x, y; /* location of window */ + int width, height; /* width and height of window */ + int border_width; /* border width of window */ + int depth; /* depth of window */ + Visual *visual; /* the associated visual structure */ + Window root; /* root of screen containing window */ +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ InputOutput, InputOnly*/ +#else + int class; /* InputOutput, InputOnly*/ +#endif + int bit_gravity; /* one of bit gravity values */ + int win_gravity; /* one of the window gravity values */ + int backing_store; /* NotUseful, WhenMapped, Always */ + unsigned long backing_planes;/* planes to be preserved if possible */ + unsigned long backing_pixel;/* value to be used when restoring planes */ + Bool save_under; /* boolean, should bits under be saved? */ + Colormap colormap; /* color map to be associated with window */ + Bool map_installed; /* boolean, is color map currently installed*/ + int map_state; /* IsUnmapped, IsUnviewable, IsViewable */ + long all_event_masks; /* set of events all people have interest in*/ + long your_event_mask; /* my event mask */ + long do_not_propagate_mask; /* set of events that should not propagate */ + Bool override_redirect; /* boolean value for override-redirect */ + Screen *screen; /* back pointer to correct screen */ +} XWindowAttributes; + +/* + * Data structure for host setting; getting routines. + * + */ + +typedef struct { + int family; /* for example FamilyInternet */ + int length; /* length of address, in bytes */ + char *address; /* pointer to where to find the bytes */ +} XHostAddress; + +/* + * Data structure for ServerFamilyInterpreted addresses in host routines + */ +typedef struct { + int typelength; /* length of type string, in bytes */ + int valuelength; /* length of value string, in bytes */ + char *type; /* pointer to where to find the type string */ + char *value; /* pointer to where to find the address */ +} XServerInterpretedAddress; + +/* + * Data structure for "image" data, used by image manipulation routines. + */ +typedef struct _XImage { + int width, height; /* size of image */ + int xoffset; /* number of pixels offset in X direction */ + int format; /* XYBitmap, XYPixmap, ZPixmap */ + char *data; /* pointer to image data */ + int byte_order; /* data byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* quant. of scanline 8, 16, 32 */ + int bitmap_bit_order; /* LSBFirst, MSBFirst */ + int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ + int depth; /* depth of image */ + int bytes_per_line; /* accelarator to next line */ + int bits_per_pixel; /* bits per pixel (ZPixmap) */ + unsigned long red_mask; /* bits in z arrangment */ + unsigned long green_mask; + unsigned long blue_mask; + XPointer obdata; /* hook for the object routines to hang on */ + struct funcs { /* image manipulation routines */ + struct _XImage *(*create_image)( + struct _XDisplay* /* display */, + Visual* /* visual */, + unsigned int /* depth */, + int /* format */, + int /* offset */, + char* /* data */, + unsigned int /* width */, + unsigned int /* height */, + int /* bitmap_pad */, + int /* bytes_per_line */); + int (*destroy_image) (struct _XImage *); + unsigned long (*get_pixel) (struct _XImage *, int, int); + int (*put_pixel) (struct _XImage *, int, int, unsigned long); + struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int); + int (*add_pixel) (struct _XImage *, long); + } f; +} XImage; + +/* + * Data structure for XReconfigureWindow + */ +typedef struct { + int x, y; + int width, height; + int border_width; + Window sibling; + int stack_mode; +} XWindowChanges; + +/* + * Data structure used by color operations + */ +typedef struct { + unsigned long pixel; + unsigned short red, green, blue; + char flags; /* do_red, do_green, do_blue */ + char pad; +} XColor; + +/* + * Data structures for graphics operations. On most machines, these are + * congruent with the wire protocol structures, so reformatting the data + * can be avoided on these architectures. + */ +typedef struct { + short x1, y1, x2, y2; +} XSegment; + +typedef struct { + short x, y; +} XPoint; + +typedef struct { + short x, y; + unsigned short width, height; +} XRectangle; + +typedef struct { + short x, y; + unsigned short width, height; + short angle1, angle2; +} XArc; + + +/* Data structure for XChangeKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + int bell_pitch; + int bell_duration; + int led; + int led_mode; + int key; + int auto_repeat_mode; /* On, Off, Default */ +} XKeyboardControl; + +/* Data structure for XGetKeyboardControl */ + +typedef struct { + int key_click_percent; + int bell_percent; + unsigned int bell_pitch, bell_duration; + unsigned long led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKeyboardState; + +/* Data structure for XGetMotionEvents. */ + +typedef struct { + Time time; + short x, y; +} XTimeCoord; + +/* Data structure for X{Set,Get}ModifierMapping */ + +typedef struct { + int max_keypermod; /* The server's max # of keys per modifier */ + KeyCode *modifiermap; /* An 8 by max_keypermod array of modifiers */ +} XModifierKeymap; + + +/* + * Display datatype maintaining display specific data. + * The contents of this structure are implementation dependent. + * A Display should be treated as opaque by application code. + */ +#ifndef XLIB_ILLEGAL_ACCESS +typedef struct _XDisplay Display; +#endif + +struct _XPrivate; /* Forward declare before use for C++ */ +struct _XrmHashBucketRec; + +typedef struct +#ifdef XLIB_ILLEGAL_ACCESS +_XDisplay +#endif +{ + XExtData *ext_data; /* hook for extension to hang data */ + struct _XPrivate *private1; + int fd; /* Network socket. */ + int private2; + int proto_major_version;/* major version of server's X protocol */ + int proto_minor_version;/* minor version of servers X protocol */ + char *vendor; /* vendor of the server hardware */ + XID private3; + XID private4; + XID private5; + int private6; + XID (*resource_alloc)( /* allocator function */ + struct _XDisplay* + ); + int byte_order; /* screen byte order, LSBFirst, MSBFirst */ + int bitmap_unit; /* padding and data requirements */ + int bitmap_pad; /* padding requirements on bitmaps */ + int bitmap_bit_order; /* LeastSignificant or MostSignificant */ + int nformats; /* number of pixmap formats in list */ + ScreenFormat *pixmap_format; /* pixmap format list */ + int private8; + int release; /* release of the server */ + struct _XPrivate *private9, *private10; + int qlen; /* Length of input event queue */ + unsigned long last_request_read; /* seq number of last event read */ + unsigned long request; /* sequence number of last request. */ + XPointer private11; + XPointer private12; + XPointer private13; + XPointer private14; + unsigned max_request_size; /* maximum number 32 bit words in request*/ + struct _XrmHashBucketRec *db; + int (*private15)( + struct _XDisplay* + ); + char *display_name; /* "host:display" string used on this connect*/ + int default_screen; /* default screen for operations */ + int nscreens; /* number of screens on this server*/ + Screen *screens; /* pointer to list of screens */ + unsigned long motion_buffer; /* size of motion buffer */ + unsigned long private16; + int min_keycode; /* minimum defined keycode */ + int max_keycode; /* maximum defined keycode */ + XPointer private17; + XPointer private18; + int private19; + char *xdefaults; /* contents of defaults from server */ + /* there is more to this structure, but it is private to Xlib */ +} +#ifdef XLIB_ILLEGAL_ACCESS +Display, +#endif +*_XPrivDisplay; + +#undef _XEVENT_ +#ifndef _XEVENT_ +/* + * Definitions of specific events. + */ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ +} XKeyEvent; +typedef XKeyEvent XKeyPressedEvent; +typedef XKeyEvent XKeyReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window it is reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ +} XButtonEvent; +typedef XButtonEvent XButtonPressedEvent; +typedef XButtonEvent XButtonReleasedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ +} XMotionEvent; +typedef XMotionEvent XPointerMovedEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + Window root; /* root window that the event occurred on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* pointer x, y coordinates in event window */ + int x_root, y_root; /* coordinates relative to root */ + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual + */ + Bool same_screen; /* same screen flag */ + Bool focus; /* boolean focus */ + unsigned int state; /* key or button mask */ +} XCrossingEvent; +typedef XCrossingEvent XEnterWindowEvent; +typedef XCrossingEvent XLeaveWindowEvent; + +typedef struct { + int type; /* FocusIn or FocusOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int mode; /* NotifyNormal, NotifyWhileGrabbed, + NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ +} XFocusChangeEvent; +typedef XFocusChangeEvent XFocusInEvent; +typedef XFocusChangeEvent XFocusOutEvent; + +/* generated on EnterWindow and FocusIn when KeyMapState selected */ +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + char key_vector[32]; +} XKeymapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ +} XExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int x, y; + int width, height; + int count; /* if non-zero, at least this many more */ + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XGraphicsExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; + int major_code; /* core is CopyArea or CopyPlane */ + int minor_code; /* not defined in the core */ +} XNoExposeEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int state; /* Visibility state */ +} XVisibilityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; /* parent of the window */ + Window window; /* window id of window created */ + int x, y; /* window location */ + int width, height; /* size of window */ + int border_width; /* border width */ + Bool override_redirect; /* creation should be overridden */ +} XCreateWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; +} XDestroyWindowEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool from_configure; +} XUnmapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Bool override_redirect; /* boolean, is override set... */ +} XMapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; +} XMapRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + Window parent; + int x, y; + Bool override_redirect; +} XReparentEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + Bool override_redirect; +} XConfigureEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int x, y; +} XGravityEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + int width, height; +} XResizeRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int x, y; + int width, height; + int border_width; + Window above; + int detail; /* Above, Below, TopIf, BottomIf, Opposite */ + unsigned long value_mask; +} XConfigureRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window event; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window parent; + Window window; + int place; /* PlaceOnTop, PlaceOnBottom */ +} XCirculateRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom atom; + Time time; + int state; /* NewValue, Deleted */ +} XPropertyEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom selection; + Time time; +} XSelectionClearEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window owner; + Window requestor; + Atom selection; + Atom target; + Atom property; + Time time; +} XSelectionRequestEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window requestor; + Atom selection; + Atom target; + Atom property; /* ATOM or None */ + Time time; +} XSelectionEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Colormap colormap; /* COLORMAP or None */ +#if defined(__cplusplus) || defined(c_plusplus) + Bool c_new; /* C++ */ +#else + Bool new; +#endif + int state; /* ColormapInstalled, ColormapUninstalled */ +} XColormapEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + Atom message_type; + int format; + union { + char b[20]; + short s[10]; + long l[5]; + } data; +} XClientMessageEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode; /* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XMappingEvent; + +typedef struct { + int type; + Display *display; /* Display the event was read from */ + XID resourceid; /* resource id */ + unsigned long serial; /* serial number of failed request */ + unsigned char error_code; /* error code of failed request */ + unsigned char request_code; /* Major op-code of failed request */ + unsigned char minor_code; /* Minor op-code of failed request */ +} XErrorEvent; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display;/* Display the event was read from */ + Window window; /* window on which event was requested in event mask */ +} XAnyEvent; + + +/*************************************************************** + * + * GenericEvent. This event is the standard event for all newer extensions. + */ + +typedef struct + { + int type; /* of event. Always GenericEvent */ + unsigned long serial; /* # of last request processed */ + Bool send_event; /* true if from SendEvent request */ + Display *display; /* Display the event was read from */ + int extension; /* major opcode of extension that caused the event */ + int evtype; /* actual event type. */ + } XGenericEvent; + +typedef struct { + int type; /* of event. Always GenericEvent */ + unsigned long serial; /* # of last request processed */ + Bool send_event; /* true if from SendEvent request */ + Display *display; /* Display the event was read from */ + int extension; /* major opcode of extension that caused the event */ + int evtype; /* actual event type. */ + unsigned int cookie; + void *data; +} XGenericEventCookie; + +/* + * this union is defined so Xlib can always use the same sized + * event structure internally, to avoid memory fragmentation. + */ +typedef union _XEvent { + int type; /* must not be changed; first element */ + XAnyEvent xany; + XKeyEvent xkey; + XButtonEvent xbutton; + XMotionEvent xmotion; + XCrossingEvent xcrossing; + XFocusChangeEvent xfocus; + XExposeEvent xexpose; + XGraphicsExposeEvent xgraphicsexpose; + XNoExposeEvent xnoexpose; + XVisibilityEvent xvisibility; + XCreateWindowEvent xcreatewindow; + XDestroyWindowEvent xdestroywindow; + XUnmapEvent xunmap; + XMapEvent xmap; + XMapRequestEvent xmaprequest; + XReparentEvent xreparent; + XConfigureEvent xconfigure; + XGravityEvent xgravity; + XResizeRequestEvent xresizerequest; + XConfigureRequestEvent xconfigurerequest; + XCirculateEvent xcirculate; + XCirculateRequestEvent xcirculaterequest; + XPropertyEvent xproperty; + XSelectionClearEvent xselectionclear; + XSelectionRequestEvent xselectionrequest; + XSelectionEvent xselection; + XColormapEvent xcolormap; + XClientMessageEvent xclient; + XMappingEvent xmapping; + XErrorEvent xerror; + XKeymapEvent xkeymap; + XGenericEvent xgeneric; + XGenericEventCookie xcookie; + long pad[24]; +} XEvent; +#endif + +#define XAllocID(dpy) ((*((_XPrivDisplay)dpy)->resource_alloc)((dpy))) + +/* + * per character font metric information. + */ +typedef struct { + short lbearing; /* origin to left edge of raster */ + short rbearing; /* origin to right edge of raster */ + short width; /* advance to next char's origin */ + short ascent; /* baseline to top edge of raster */ + short descent; /* baseline to bottom edge of raster */ + unsigned short attributes; /* per char flags (not predefined) */ +} XCharStruct; + +/* + * To allow arbitrary information with fonts, there are additional properties + * returned. + */ +typedef struct { + Atom name; + unsigned long card32; +} XFontProp; + +typedef struct { + XExtData *ext_data; /* hook for extension to hang data */ + Font fid; /* Font id for this font */ + unsigned direction; /* hint about direction the font is painted */ + unsigned min_char_or_byte2;/* first character */ + unsigned max_char_or_byte2;/* last character */ + unsigned min_byte1; /* first row that exists */ + unsigned max_byte1; /* last row that exists */ + Bool all_chars_exist;/* flag if all characters have non-zero size*/ + unsigned default_char; /* char to print for undefined character */ + int n_properties; /* how many properties there are */ + XFontProp *properties; /* pointer to array of additional properties*/ + XCharStruct min_bounds; /* minimum bounds over all existing char*/ + XCharStruct max_bounds; /* maximum bounds over all existing char*/ + XCharStruct *per_char; /* first_char to last_char information */ + int ascent; /* log. extent above baseline for spacing */ + int descent; /* log. descent below baseline for spacing */ +} XFontStruct; + +/* + * PolyText routines take these as arguments. + */ +typedef struct { + char *chars; /* pointer to string */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem; + +typedef struct { /* normal 16 bit characters are two bytes */ + unsigned char byte1; + unsigned char byte2; +} XChar2b; + +typedef struct { + XChar2b *chars; /* two byte characters */ + int nchars; /* number of characters */ + int delta; /* delta between strings */ + Font font; /* font to print it in, None don't change */ +} XTextItem16; + + +typedef union { Display *display; + GC gc; + Visual *visual; + Screen *screen; + ScreenFormat *pixmap_format; + XFontStruct *font; } XEDataObject; + +typedef struct { + XRectangle max_ink_extent; + XRectangle max_logical_extent; +} XFontSetExtents; + +/* unused: +typedef void (*XOMProc)(); + */ + +typedef struct _XOM *XOM; +typedef struct _XOC *XOC, *XFontSet; + +typedef struct { + char *chars; + int nchars; + int delta; + XFontSet font_set; +} XmbTextItem; + +typedef struct { + wchar_t *chars; + int nchars; + int delta; + XFontSet font_set; +} XwcTextItem; + +#define XNRequiredCharSet "requiredCharSet" +#define XNQueryOrientation "queryOrientation" +#define XNBaseFontName "baseFontName" +#define XNOMAutomatic "omAutomatic" +#define XNMissingCharSet "missingCharSet" +#define XNDefaultString "defaultString" +#define XNOrientation "orientation" +#define XNDirectionalDependentDrawing "directionalDependentDrawing" +#define XNContextualDrawing "contextualDrawing" +#define XNFontInfo "fontInfo" + +typedef struct { + int charset_count; + char **charset_list; +} XOMCharSetList; + +typedef enum { + XOMOrientation_LTR_TTB, + XOMOrientation_RTL_TTB, + XOMOrientation_TTB_LTR, + XOMOrientation_TTB_RTL, + XOMOrientation_Context +} XOrientation; + +typedef struct { + int num_orientation; + XOrientation *orientation; /* Input Text description */ +} XOMOrientation; + +typedef struct { + int num_font; + XFontStruct **font_struct_list; + char **font_name_list; +} XOMFontInfo; + +typedef struct _XIM *XIM; +typedef struct _XIC *XIC; + +typedef void (*XIMProc)( + XIM, + XPointer, + XPointer +); + +typedef Bool (*XICProc)( + XIC, + XPointer, + XPointer +); + +typedef void (*XIDProc)( + Display*, + XPointer, + XPointer +); + +typedef unsigned long XIMStyle; + +typedef struct { + unsigned short count_styles; + XIMStyle *supported_styles; +} XIMStyles; + +#define XIMPreeditArea 0x0001L +#define XIMPreeditCallbacks 0x0002L +#define XIMPreeditPosition 0x0004L +#define XIMPreeditNothing 0x0008L +#define XIMPreeditNone 0x0010L +#define XIMStatusArea 0x0100L +#define XIMStatusCallbacks 0x0200L +#define XIMStatusNothing 0x0400L +#define XIMStatusNone 0x0800L + +#define XNVaNestedList "XNVaNestedList" +#define XNQueryInputStyle "queryInputStyle" +#define XNClientWindow "clientWindow" +#define XNInputStyle "inputStyle" +#define XNFocusWindow "focusWindow" +#define XNResourceName "resourceName" +#define XNResourceClass "resourceClass" +#define XNGeometryCallback "geometryCallback" +#define XNDestroyCallback "destroyCallback" +#define XNFilterEvents "filterEvents" +#define XNPreeditStartCallback "preeditStartCallback" +#define XNPreeditDoneCallback "preeditDoneCallback" +#define XNPreeditDrawCallback "preeditDrawCallback" +#define XNPreeditCaretCallback "preeditCaretCallback" +#define XNPreeditStateNotifyCallback "preeditStateNotifyCallback" +#define XNPreeditAttributes "preeditAttributes" +#define XNStatusStartCallback "statusStartCallback" +#define XNStatusDoneCallback "statusDoneCallback" +#define XNStatusDrawCallback "statusDrawCallback" +#define XNStatusAttributes "statusAttributes" +#define XNArea "area" +#define XNAreaNeeded "areaNeeded" +#define XNSpotLocation "spotLocation" +#define XNColormap "colorMap" +#define XNStdColormap "stdColorMap" +#define XNForeground "foreground" +#define XNBackground "background" +#define XNBackgroundPixmap "backgroundPixmap" +#define XNFontSet "fontSet" +#define XNLineSpace "lineSpace" +#define XNCursor "cursor" + +#define XNQueryIMValuesList "queryIMValuesList" +#define XNQueryICValuesList "queryICValuesList" +#define XNVisiblePosition "visiblePosition" +#define XNR6PreeditCallback "r6PreeditCallback" +#define XNStringConversionCallback "stringConversionCallback" +#define XNStringConversion "stringConversion" +#define XNResetState "resetState" +#define XNHotKey "hotKey" +#define XNHotKeyState "hotKeyState" +#define XNPreeditState "preeditState" +#define XNSeparatorofNestedList "separatorofNestedList" + +#define XBufferOverflow -1 +#define XLookupNone 1 +#define XLookupChars 2 +#define XLookupKeySym 3 +#define XLookupBoth 4 + +typedef void *XVaNestedList; + +typedef struct { + XPointer client_data; + XIMProc callback; +} XIMCallback; + +typedef struct { + XPointer client_data; + XICProc callback; +} XICCallback; + +typedef unsigned long XIMFeedback; + +#define XIMReverse 1L +#define XIMUnderline (1L<<1) +#define XIMHighlight (1L<<2) +#define XIMPrimary (1L<<5) +#define XIMSecondary (1L<<6) +#define XIMTertiary (1L<<7) +#define XIMVisibleToForward (1L<<8) +#define XIMVisibleToBackword (1L<<9) +#define XIMVisibleToCenter (1L<<10) + +typedef struct _XIMText { + unsigned short length; + XIMFeedback *feedback; + Bool encoding_is_wchar; + union { + char *multi_byte; + wchar_t *wide_char; + } string; +} XIMText; + +typedef unsigned long XIMPreeditState; + +#define XIMPreeditUnKnown 0L +#define XIMPreeditEnable 1L +#define XIMPreeditDisable (1L<<1) + +typedef struct _XIMPreeditStateNotifyCallbackStruct { + XIMPreeditState state; +} XIMPreeditStateNotifyCallbackStruct; + +typedef unsigned long XIMResetState; + +#define XIMInitialState 1L +#define XIMPreserveState (1L<<1) + +typedef unsigned long XIMStringConversionFeedback; + +#define XIMStringConversionLeftEdge (0x00000001) +#define XIMStringConversionRightEdge (0x00000002) +#define XIMStringConversionTopEdge (0x00000004) +#define XIMStringConversionBottomEdge (0x00000008) +#define XIMStringConversionConcealed (0x00000010) +#define XIMStringConversionWrapped (0x00000020) + +typedef struct _XIMStringConversionText { + unsigned short length; + XIMStringConversionFeedback *feedback; + Bool encoding_is_wchar; + union { + char *mbs; + wchar_t *wcs; + } string; +} XIMStringConversionText; + +typedef unsigned short XIMStringConversionPosition; + +typedef unsigned short XIMStringConversionType; + +#define XIMStringConversionBuffer (0x0001) +#define XIMStringConversionLine (0x0002) +#define XIMStringConversionWord (0x0003) +#define XIMStringConversionChar (0x0004) + +typedef unsigned short XIMStringConversionOperation; + +#define XIMStringConversionSubstitution (0x0001) +#define XIMStringConversionRetrieval (0x0002) + +typedef enum { + XIMForwardChar, XIMBackwardChar, + XIMForwardWord, XIMBackwardWord, + XIMCaretUp, XIMCaretDown, + XIMNextLine, XIMPreviousLine, + XIMLineStart, XIMLineEnd, + XIMAbsolutePosition, + XIMDontChange +} XIMCaretDirection; + +typedef struct _XIMStringConversionCallbackStruct { + XIMStringConversionPosition position; + XIMCaretDirection direction; + XIMStringConversionOperation operation; + unsigned short factor; + XIMStringConversionText *text; +} XIMStringConversionCallbackStruct; + +typedef struct _XIMPreeditDrawCallbackStruct { + int caret; /* Cursor offset within pre-edit string */ + int chg_first; /* Starting change position */ + int chg_length; /* Length of the change in character count */ + XIMText *text; +} XIMPreeditDrawCallbackStruct; + +typedef enum { + XIMIsInvisible, /* Disable caret feedback */ + XIMIsPrimary, /* UI defined caret feedback */ + XIMIsSecondary /* UI defined caret feedback */ +} XIMCaretStyle; + +typedef struct _XIMPreeditCaretCallbackStruct { + int position; /* Caret offset within pre-edit string */ + XIMCaretDirection direction; /* Caret moves direction */ + XIMCaretStyle style; /* Feedback of the caret */ +} XIMPreeditCaretCallbackStruct; + +typedef enum { + XIMTextType, + XIMBitmapType +} XIMStatusDataType; + +typedef struct _XIMStatusDrawCallbackStruct { + XIMStatusDataType type; + union { + XIMText *text; + Pixmap bitmap; + } data; +} XIMStatusDrawCallbackStruct; + +typedef struct _XIMHotKeyTrigger { + KeySym keysym; + int modifier; + int modifier_mask; +} XIMHotKeyTrigger; + +typedef struct _XIMHotKeyTriggers { + int num_hot_key; + XIMHotKeyTrigger *key; +} XIMHotKeyTriggers; + +typedef unsigned long XIMHotKeyState; + +#define XIMHotKeyStateON (0x0001L) +#define XIMHotKeyStateOFF (0x0002L) + +typedef struct { + unsigned short count_values; + char **supported_values; +} XIMValuesList; + +_XFUNCPROTOBEGIN + +#if defined(WIN32) && !defined(_XLIBINT_) +#define _Xdebug (*_Xdebug_p) +#endif + +extern int _Xdebug; + +extern XFontStruct *XLoadQueryFont( + Display* /* display */, + _Xconst char* /* name */ +); + +extern XFontStruct *XQueryFont( + Display* /* display */, + XID /* font_ID */ +); + + +extern XTimeCoord *XGetMotionEvents( + Display* /* display */, + Window /* w */, + Time /* start */, + Time /* stop */, + int* /* nevents_return */ +); + +extern XModifierKeymap *XDeleteModifiermapEntry( + XModifierKeymap* /* modmap */, +#if NeedWidePrototypes + unsigned int /* keycode_entry */, +#else + KeyCode /* keycode_entry */, +#endif + int /* modifier */ +); + +extern XModifierKeymap *XGetModifierMapping( + Display* /* display */ +); + +extern XModifierKeymap *XInsertModifiermapEntry( + XModifierKeymap* /* modmap */, +#if NeedWidePrototypes + unsigned int /* keycode_entry */, +#else + KeyCode /* keycode_entry */, +#endif + int /* modifier */ +); + +extern XModifierKeymap *XNewModifiermap( + int /* max_keys_per_mod */ +); + +extern XImage *XCreateImage( + Display* /* display */, + Visual* /* visual */, + unsigned int /* depth */, + int /* format */, + int /* offset */, + char* /* data */, + unsigned int /* width */, + unsigned int /* height */, + int /* bitmap_pad */, + int /* bytes_per_line */ +); +extern Status XInitImage( + XImage* /* image */ +); +extern XImage *XGetImage( + Display* /* display */, + Drawable /* d */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* plane_mask */, + int /* format */ +); +extern XImage *XGetSubImage( + Display* /* display */, + Drawable /* d */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* plane_mask */, + int /* format */, + XImage* /* dest_image */, + int /* dest_x */, + int /* dest_y */ +); + +/* + * X function declarations. + */ +extern Display *XOpenDisplay( + _Xconst char* /* display_name */ +); + +extern void XrmInitialize( + void +); + +extern char *XFetchBytes( + Display* /* display */, + int* /* nbytes_return */ +); +extern char *XFetchBuffer( + Display* /* display */, + int* /* nbytes_return */, + int /* buffer */ +); +extern char *XGetAtomName( + Display* /* display */, + Atom /* atom */ +); +extern Status XGetAtomNames( + Display* /* dpy */, + Atom* /* atoms */, + int /* count */, + char** /* names_return */ +); +extern char *XGetDefault( + Display* /* display */, + _Xconst char* /* program */, + _Xconst char* /* option */ +); +extern char *XDisplayName( + _Xconst char* /* string */ +); +extern char *XKeysymToString( + KeySym /* keysym */ +); + +extern int (*XSynchronize( + Display* /* display */, + Bool /* onoff */ +))( + Display* /* display */ +); +extern int (*XSetAfterFunction( + Display* /* display */, + int (*) ( + Display* /* display */ + ) /* procedure */ +))( + Display* /* display */ +); +extern Atom XInternAtom( + Display* /* display */, + _Xconst char* /* atom_name */, + Bool /* only_if_exists */ +); +extern Status XInternAtoms( + Display* /* dpy */, + char** /* names */, + int /* count */, + Bool /* onlyIfExists */, + Atom* /* atoms_return */ +); +extern Colormap XCopyColormapAndFree( + Display* /* display */, + Colormap /* colormap */ +); +extern Colormap XCreateColormap( + Display* /* display */, + Window /* w */, + Visual* /* visual */, + int /* alloc */ +); +extern Cursor XCreatePixmapCursor( + Display* /* display */, + Pixmap /* source */, + Pixmap /* mask */, + XColor* /* foreground_color */, + XColor* /* background_color */, + unsigned int /* x */, + unsigned int /* y */ +); +extern Cursor XCreateGlyphCursor( + Display* /* display */, + Font /* source_font */, + Font /* mask_font */, + unsigned int /* source_char */, + unsigned int /* mask_char */, + XColor _Xconst * /* foreground_color */, + XColor _Xconst * /* background_color */ +); +extern Cursor XCreateFontCursor( + Display* /* display */, + unsigned int /* shape */ +); +extern Font XLoadFont( + Display* /* display */, + _Xconst char* /* name */ +); +extern GC XCreateGC( + Display* /* display */, + Drawable /* d */, + unsigned long /* valuemask */, + XGCValues* /* values */ +); +extern GContext XGContextFromGC( + GC /* gc */ +); +extern void XFlushGC( + Display* /* display */, + GC /* gc */ +); +extern Pixmap XCreatePixmap( + Display* /* display */, + Drawable /* d */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* depth */ +); +extern Pixmap XCreateBitmapFromData( + Display* /* display */, + Drawable /* d */, + _Xconst char* /* data */, + unsigned int /* width */, + unsigned int /* height */ +); +extern Pixmap XCreatePixmapFromBitmapData( + Display* /* display */, + Drawable /* d */, + char* /* data */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* fg */, + unsigned long /* bg */, + unsigned int /* depth */ +); +extern Window XCreateSimpleWindow( + Display* /* display */, + Window /* parent */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* border_width */, + unsigned long /* border */, + unsigned long /* background */ +); +extern Window XGetSelectionOwner( + Display* /* display */, + Atom /* selection */ +); +extern Window XCreateWindow( + Display* /* display */, + Window /* parent */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* border_width */, + int /* depth */, + unsigned int /* class */, + Visual* /* visual */, + unsigned long /* valuemask */, + XSetWindowAttributes* /* attributes */ +); +extern Colormap *XListInstalledColormaps( + Display* /* display */, + Window /* w */, + int* /* num_return */ +); +extern char **XListFonts( + Display* /* display */, + _Xconst char* /* pattern */, + int /* maxnames */, + int* /* actual_count_return */ +); +extern char **XListFontsWithInfo( + Display* /* display */, + _Xconst char* /* pattern */, + int /* maxnames */, + int* /* count_return */, + XFontStruct** /* info_return */ +); +extern char **XGetFontPath( + Display* /* display */, + int* /* npaths_return */ +); +extern char **XListExtensions( + Display* /* display */, + int* /* nextensions_return */ +); +extern Atom *XListProperties( + Display* /* display */, + Window /* w */, + int* /* num_prop_return */ +); +extern XHostAddress *XListHosts( + Display* /* display */, + int* /* nhosts_return */, + Bool* /* state_return */ +); +_X_DEPRECATED +extern KeySym XKeycodeToKeysym( + Display* /* display */, +#if NeedWidePrototypes + unsigned int /* keycode */, +#else + KeyCode /* keycode */, +#endif + int /* index */ +); +extern KeySym XLookupKeysym( + XKeyEvent* /* key_event */, + int /* index */ +); +extern KeySym *XGetKeyboardMapping( + Display* /* display */, +#if NeedWidePrototypes + unsigned int /* first_keycode */, +#else + KeyCode /* first_keycode */, +#endif + int /* keycode_count */, + int* /* keysyms_per_keycode_return */ +); +extern KeySym XStringToKeysym( + _Xconst char* /* string */ +); +extern long XMaxRequestSize( + Display* /* display */ +); +extern long XExtendedMaxRequestSize( + Display* /* display */ +); +extern char *XResourceManagerString( + Display* /* display */ +); +extern char *XScreenResourceString( + Screen* /* screen */ +); +extern unsigned long XDisplayMotionBufferSize( + Display* /* display */ +); +extern VisualID XVisualIDFromVisual( + Visual* /* visual */ +); + +/* multithread routines */ + +extern Status XInitThreads( + void +); + +extern void XLockDisplay( + Display* /* display */ +); + +extern void XUnlockDisplay( + Display* /* display */ +); + +/* routines for dealing with extensions */ + +extern XExtCodes *XInitExtension( + Display* /* display */, + _Xconst char* /* name */ +); + +extern XExtCodes *XAddExtension( + Display* /* display */ +); +extern XExtData *XFindOnExtensionList( + XExtData** /* structure */, + int /* number */ +); +extern XExtData **XEHeadOfExtensionList( + XEDataObject /* object */ +); + +/* these are routines for which there are also macros */ +extern Window XRootWindow( + Display* /* display */, + int /* screen_number */ +); +extern Window XDefaultRootWindow( + Display* /* display */ +); +extern Window XRootWindowOfScreen( + Screen* /* screen */ +); +extern Visual *XDefaultVisual( + Display* /* display */, + int /* screen_number */ +); +extern Visual *XDefaultVisualOfScreen( + Screen* /* screen */ +); +extern GC XDefaultGC( + Display* /* display */, + int /* screen_number */ +); +extern GC XDefaultGCOfScreen( + Screen* /* screen */ +); +extern unsigned long XBlackPixel( + Display* /* display */, + int /* screen_number */ +); +extern unsigned long XWhitePixel( + Display* /* display */, + int /* screen_number */ +); +extern unsigned long XAllPlanes( + void +); +extern unsigned long XBlackPixelOfScreen( + Screen* /* screen */ +); +extern unsigned long XWhitePixelOfScreen( + Screen* /* screen */ +); +extern unsigned long XNextRequest( + Display* /* display */ +); +extern unsigned long XLastKnownRequestProcessed( + Display* /* display */ +); +extern char *XServerVendor( + Display* /* display */ +); +extern char *XDisplayString( + Display* /* display */ +); +extern Colormap XDefaultColormap( + Display* /* display */, + int /* screen_number */ +); +extern Colormap XDefaultColormapOfScreen( + Screen* /* screen */ +); +extern Display *XDisplayOfScreen( + Screen* /* screen */ +); +extern Screen *XScreenOfDisplay( + Display* /* display */, + int /* screen_number */ +); +extern Screen *XDefaultScreenOfDisplay( + Display* /* display */ +); +extern long XEventMaskOfScreen( + Screen* /* screen */ +); + +extern int XScreenNumberOfScreen( + Screen* /* screen */ +); + +typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ + Display* /* display */, + XErrorEvent* /* error_event */ +); + +extern XErrorHandler XSetErrorHandler ( + XErrorHandler /* handler */ +); + + +typedef int (*XIOErrorHandler) ( /* WARNING, this type not in Xlib spec */ + Display* /* display */ +); + +extern XIOErrorHandler XSetIOErrorHandler ( + XIOErrorHandler /* handler */ +); + + +extern XPixmapFormatValues *XListPixmapFormats( + Display* /* display */, + int* /* count_return */ +); +extern int *XListDepths( + Display* /* display */, + int /* screen_number */, + int* /* count_return */ +); + +/* ICCCM routines for things that don't require special include files; */ +/* other declarations are given in Xutil.h */ +extern Status XReconfigureWMWindow( + Display* /* display */, + Window /* w */, + int /* screen_number */, + unsigned int /* mask */, + XWindowChanges* /* changes */ +); + +extern Status XGetWMProtocols( + Display* /* display */, + Window /* w */, + Atom** /* protocols_return */, + int* /* count_return */ +); +extern Status XSetWMProtocols( + Display* /* display */, + Window /* w */, + Atom* /* protocols */, + int /* count */ +); +extern Status XIconifyWindow( + Display* /* display */, + Window /* w */, + int /* screen_number */ +); +extern Status XWithdrawWindow( + Display* /* display */, + Window /* w */, + int /* screen_number */ +); +extern Status XGetCommand( + Display* /* display */, + Window /* w */, + char*** /* argv_return */, + int* /* argc_return */ +); +extern Status XGetWMColormapWindows( + Display* /* display */, + Window /* w */, + Window** /* windows_return */, + int* /* count_return */ +); +extern Status XSetWMColormapWindows( + Display* /* display */, + Window /* w */, + Window* /* colormap_windows */, + int /* count */ +); +extern void XFreeStringList( + char** /* list */ +); +extern int XSetTransientForHint( + Display* /* display */, + Window /* w */, + Window /* prop_window */ +); + +/* The following are given in alphabetical order */ + +extern int XActivateScreenSaver( + Display* /* display */ +); + +extern int XAddHost( + Display* /* display */, + XHostAddress* /* host */ +); + +extern int XAddHosts( + Display* /* display */, + XHostAddress* /* hosts */, + int /* num_hosts */ +); + +extern int XAddToExtensionList( + struct _XExtData** /* structure */, + XExtData* /* ext_data */ +); + +extern int XAddToSaveSet( + Display* /* display */, + Window /* w */ +); + +extern Status XAllocColor( + Display* /* display */, + Colormap /* colormap */, + XColor* /* screen_in_out */ +); + +extern Status XAllocColorCells( + Display* /* display */, + Colormap /* colormap */, + Bool /* contig */, + unsigned long* /* plane_masks_return */, + unsigned int /* nplanes */, + unsigned long* /* pixels_return */, + unsigned int /* npixels */ +); + +extern Status XAllocColorPlanes( + Display* /* display */, + Colormap /* colormap */, + Bool /* contig */, + unsigned long* /* pixels_return */, + int /* ncolors */, + int /* nreds */, + int /* ngreens */, + int /* nblues */, + unsigned long* /* rmask_return */, + unsigned long* /* gmask_return */, + unsigned long* /* bmask_return */ +); + +extern Status XAllocNamedColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* color_name */, + XColor* /* screen_def_return */, + XColor* /* exact_def_return */ +); + +extern int XAllowEvents( + Display* /* display */, + int /* event_mode */, + Time /* time */ +); + +extern int XAutoRepeatOff( + Display* /* display */ +); + +extern int XAutoRepeatOn( + Display* /* display */ +); + +extern int XBell( + Display* /* display */, + int /* percent */ +); + +extern int XBitmapBitOrder( + Display* /* display */ +); + +extern int XBitmapPad( + Display* /* display */ +); + +extern int XBitmapUnit( + Display* /* display */ +); + +extern int XCellsOfScreen( + Screen* /* screen */ +); + +extern int XChangeActivePointerGrab( + Display* /* display */, + unsigned int /* event_mask */, + Cursor /* cursor */, + Time /* time */ +); + +extern int XChangeGC( + Display* /* display */, + GC /* gc */, + unsigned long /* valuemask */, + XGCValues* /* values */ +); + +extern int XChangeKeyboardControl( + Display* /* display */, + unsigned long /* value_mask */, + XKeyboardControl* /* values */ +); + +extern int XChangeKeyboardMapping( + Display* /* display */, + int /* first_keycode */, + int /* keysyms_per_keycode */, + KeySym* /* keysyms */, + int /* num_codes */ +); + +extern int XChangePointerControl( + Display* /* display */, + Bool /* do_accel */, + Bool /* do_threshold */, + int /* accel_numerator */, + int /* accel_denominator */, + int /* threshold */ +); + +extern int XChangeProperty( + Display* /* display */, + Window /* w */, + Atom /* property */, + Atom /* type */, + int /* format */, + int /* mode */, + _Xconst unsigned char* /* data */, + int /* nelements */ +); + +extern int XChangeSaveSet( + Display* /* display */, + Window /* w */, + int /* change_mode */ +); + +extern int XChangeWindowAttributes( + Display* /* display */, + Window /* w */, + unsigned long /* valuemask */, + XSetWindowAttributes* /* attributes */ +); + +extern Bool XCheckIfEvent( + Display* /* display */, + XEvent* /* event_return */, + Bool (*) ( + Display* /* display */, + XEvent* /* event */, + XPointer /* arg */ + ) /* predicate */, + XPointer /* arg */ +); + +extern Bool XCheckMaskEvent( + Display* /* display */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern Bool XCheckTypedEvent( + Display* /* display */, + int /* event_type */, + XEvent* /* event_return */ +); + +extern Bool XCheckTypedWindowEvent( + Display* /* display */, + Window /* w */, + int /* event_type */, + XEvent* /* event_return */ +); + +extern Bool XCheckWindowEvent( + Display* /* display */, + Window /* w */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern int XCirculateSubwindows( + Display* /* display */, + Window /* w */, + int /* direction */ +); + +extern int XCirculateSubwindowsDown( + Display* /* display */, + Window /* w */ +); + +extern int XCirculateSubwindowsUp( + Display* /* display */, + Window /* w */ +); + +extern int XClearArea( + Display* /* display */, + Window /* w */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + Bool /* exposures */ +); + +extern int XClearWindow( + Display* /* display */, + Window /* w */ +); + +extern int XCloseDisplay( + Display* /* display */ +); + +extern int XConfigureWindow( + Display* /* display */, + Window /* w */, + unsigned int /* value_mask */, + XWindowChanges* /* values */ +); + +extern int XConnectionNumber( + Display* /* display */ +); + +extern int XConvertSelection( + Display* /* display */, + Atom /* selection */, + Atom /* target */, + Atom /* property */, + Window /* requestor */, + Time /* time */ +); + +extern int XCopyArea( + Display* /* display */, + Drawable /* src */, + Drawable /* dest */, + GC /* gc */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + int /* dest_x */, + int /* dest_y */ +); + +extern int XCopyGC( + Display* /* display */, + GC /* src */, + unsigned long /* valuemask */, + GC /* dest */ +); + +extern int XCopyPlane( + Display* /* display */, + Drawable /* src */, + Drawable /* dest */, + GC /* gc */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + int /* dest_x */, + int /* dest_y */, + unsigned long /* plane */ +); + +extern int XDefaultDepth( + Display* /* display */, + int /* screen_number */ +); + +extern int XDefaultDepthOfScreen( + Screen* /* screen */ +); + +extern int XDefaultScreen( + Display* /* display */ +); + +extern int XDefineCursor( + Display* /* display */, + Window /* w */, + Cursor /* cursor */ +); + +extern int XDeleteProperty( + Display* /* display */, + Window /* w */, + Atom /* property */ +); + +extern int XDestroyWindow( + Display* /* display */, + Window /* w */ +); + +extern int XDestroySubwindows( + Display* /* display */, + Window /* w */ +); + +extern int XDoesBackingStore( + Screen* /* screen */ +); + +extern Bool XDoesSaveUnders( + Screen* /* screen */ +); + +extern int XDisableAccessControl( + Display* /* display */ +); + + +extern int XDisplayCells( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayHeight( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayHeightMM( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayKeycodes( + Display* /* display */, + int* /* min_keycodes_return */, + int* /* max_keycodes_return */ +); + +extern int XDisplayPlanes( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayWidth( + Display* /* display */, + int /* screen_number */ +); + +extern int XDisplayWidthMM( + Display* /* display */, + int /* screen_number */ +); + +extern int XDrawArc( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + int /* angle1 */, + int /* angle2 */ +); + +extern int XDrawArcs( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XArc* /* arcs */, + int /* narcs */ +); + +extern int XDrawImageString( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* string */, + int /* length */ +); + +extern int XDrawImageString16( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst XChar2b* /* string */, + int /* length */ +); + +extern int XDrawLine( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x1 */, + int /* y1 */, + int /* x2 */, + int /* y2 */ +); + +extern int XDrawLines( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XPoint* /* points */, + int /* npoints */, + int /* mode */ +); + +extern int XDrawPoint( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */ +); + +extern int XDrawPoints( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XPoint* /* points */, + int /* npoints */, + int /* mode */ +); + +extern int XDrawRectangle( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XDrawRectangles( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XRectangle* /* rectangles */, + int /* nrectangles */ +); + +extern int XDrawSegments( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XSegment* /* segments */, + int /* nsegments */ +); + +extern int XDrawString( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* string */, + int /* length */ +); + +extern int XDrawString16( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst XChar2b* /* string */, + int /* length */ +); + +extern int XDrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XTextItem* /* items */, + int /* nitems */ +); + +extern int XDrawText16( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XTextItem16* /* items */, + int /* nitems */ +); + +extern int XEnableAccessControl( + Display* /* display */ +); + +extern int XEventsQueued( + Display* /* display */, + int /* mode */ +); + +extern Status XFetchName( + Display* /* display */, + Window /* w */, + char** /* window_name_return */ +); + +extern int XFillArc( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + int /* angle1 */, + int /* angle2 */ +); + +extern int XFillArcs( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XArc* /* arcs */, + int /* narcs */ +); + +extern int XFillPolygon( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XPoint* /* points */, + int /* npoints */, + int /* shape */, + int /* mode */ +); + +extern int XFillRectangle( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XFillRectangles( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XRectangle* /* rectangles */, + int /* nrectangles */ +); + +extern int XFlush( + Display* /* display */ +); + +extern int XForceScreenSaver( + Display* /* display */, + int /* mode */ +); + +extern int XFree( + void* /* data */ +); + +extern int XFreeColormap( + Display* /* display */, + Colormap /* colormap */ +); + +extern int XFreeColors( + Display* /* display */, + Colormap /* colormap */, + unsigned long* /* pixels */, + int /* npixels */, + unsigned long /* planes */ +); + +extern int XFreeCursor( + Display* /* display */, + Cursor /* cursor */ +); + +extern int XFreeExtensionList( + char** /* list */ +); + +extern int XFreeFont( + Display* /* display */, + XFontStruct* /* font_struct */ +); + +extern int XFreeFontInfo( + char** /* names */, + XFontStruct* /* free_info */, + int /* actual_count */ +); + +extern int XFreeFontNames( + char** /* list */ +); + +extern int XFreeFontPath( + char** /* list */ +); + +extern int XFreeGC( + Display* /* display */, + GC /* gc */ +); + +extern int XFreeModifiermap( + XModifierKeymap* /* modmap */ +); + +extern int XFreePixmap( + Display* /* display */, + Pixmap /* pixmap */ +); + +extern int XGeometry( + Display* /* display */, + int /* screen */, + _Xconst char* /* position */, + _Xconst char* /* default_position */, + unsigned int /* bwidth */, + unsigned int /* fwidth */, + unsigned int /* fheight */, + int /* xadder */, + int /* yadder */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */ +); + +extern int XGetErrorDatabaseText( + Display* /* display */, + _Xconst char* /* name */, + _Xconst char* /* message */, + _Xconst char* /* default_string */, + char* /* buffer_return */, + int /* length */ +); + +extern int XGetErrorText( + Display* /* display */, + int /* code */, + char* /* buffer_return */, + int /* length */ +); + +extern Bool XGetFontProperty( + XFontStruct* /* font_struct */, + Atom /* atom */, + unsigned long* /* value_return */ +); + +extern Status XGetGCValues( + Display* /* display */, + GC /* gc */, + unsigned long /* valuemask */, + XGCValues* /* values_return */ +); + +extern Status XGetGeometry( + Display* /* display */, + Drawable /* d */, + Window* /* root_return */, + int* /* x_return */, + int* /* y_return */, + unsigned int* /* width_return */, + unsigned int* /* height_return */, + unsigned int* /* border_width_return */, + unsigned int* /* depth_return */ +); + +extern Status XGetIconName( + Display* /* display */, + Window /* w */, + char** /* icon_name_return */ +); + +extern int XGetInputFocus( + Display* /* display */, + Window* /* focus_return */, + int* /* revert_to_return */ +); + +extern int XGetKeyboardControl( + Display* /* display */, + XKeyboardState* /* values_return */ +); + +extern int XGetPointerControl( + Display* /* display */, + int* /* accel_numerator_return */, + int* /* accel_denominator_return */, + int* /* threshold_return */ +); + +extern int XGetPointerMapping( + Display* /* display */, + unsigned char* /* map_return */, + int /* nmap */ +); + +extern int XGetScreenSaver( + Display* /* display */, + int* /* timeout_return */, + int* /* interval_return */, + int* /* prefer_blanking_return */, + int* /* allow_exposures_return */ +); + +extern Status XGetTransientForHint( + Display* /* display */, + Window /* w */, + Window* /* prop_window_return */ +); + +extern int XGetWindowProperty( + Display* /* display */, + Window /* w */, + Atom /* property */, + long /* long_offset */, + long /* long_length */, + Bool /* delete */, + Atom /* req_type */, + Atom* /* actual_type_return */, + int* /* actual_format_return */, + unsigned long* /* nitems_return */, + unsigned long* /* bytes_after_return */, + unsigned char** /* prop_return */ +); + +extern Status XGetWindowAttributes( + Display* /* display */, + Window /* w */, + XWindowAttributes* /* window_attributes_return */ +); + +extern int XGrabButton( + Display* /* display */, + unsigned int /* button */, + unsigned int /* modifiers */, + Window /* grab_window */, + Bool /* owner_events */, + unsigned int /* event_mask */, + int /* pointer_mode */, + int /* keyboard_mode */, + Window /* confine_to */, + Cursor /* cursor */ +); + +extern int XGrabKey( + Display* /* display */, + int /* keycode */, + unsigned int /* modifiers */, + Window /* grab_window */, + Bool /* owner_events */, + int /* pointer_mode */, + int /* keyboard_mode */ +); + +extern int XGrabKeyboard( + Display* /* display */, + Window /* grab_window */, + Bool /* owner_events */, + int /* pointer_mode */, + int /* keyboard_mode */, + Time /* time */ +); + +extern int XGrabPointer( + Display* /* display */, + Window /* grab_window */, + Bool /* owner_events */, + unsigned int /* event_mask */, + int /* pointer_mode */, + int /* keyboard_mode */, + Window /* confine_to */, + Cursor /* cursor */, + Time /* time */ +); + +extern int XGrabServer( + Display* /* display */ +); + +extern int XHeightMMOfScreen( + Screen* /* screen */ +); + +extern int XHeightOfScreen( + Screen* /* screen */ +); + +extern int XIfEvent( + Display* /* display */, + XEvent* /* event_return */, + Bool (*) ( + Display* /* display */, + XEvent* /* event */, + XPointer /* arg */ + ) /* predicate */, + XPointer /* arg */ +); + +extern int XImageByteOrder( + Display* /* display */ +); + +extern int XInstallColormap( + Display* /* display */, + Colormap /* colormap */ +); + +extern KeyCode XKeysymToKeycode( + Display* /* display */, + KeySym /* keysym */ +); + +extern int XKillClient( + Display* /* display */, + XID /* resource */ +); + +extern Status XLookupColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* color_name */, + XColor* /* exact_def_return */, + XColor* /* screen_def_return */ +); + +extern int XLowerWindow( + Display* /* display */, + Window /* w */ +); + +extern int XMapRaised( + Display* /* display */, + Window /* w */ +); + +extern int XMapSubwindows( + Display* /* display */, + Window /* w */ +); + +extern int XMapWindow( + Display* /* display */, + Window /* w */ +); + +extern int XMaskEvent( + Display* /* display */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern int XMaxCmapsOfScreen( + Screen* /* screen */ +); + +extern int XMinCmapsOfScreen( + Screen* /* screen */ +); + +extern int XMoveResizeWindow( + Display* /* display */, + Window /* w */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XMoveWindow( + Display* /* display */, + Window /* w */, + int /* x */, + int /* y */ +); + +extern int XNextEvent( + Display* /* display */, + XEvent* /* event_return */ +); + +extern int XNoOp( + Display* /* display */ +); + +extern Status XParseColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* spec */, + XColor* /* exact_def_return */ +); + +extern int XParseGeometry( + _Xconst char* /* parsestring */, + int* /* x_return */, + int* /* y_return */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern int XPeekEvent( + Display* /* display */, + XEvent* /* event_return */ +); + +extern int XPeekIfEvent( + Display* /* display */, + XEvent* /* event_return */, + Bool (*) ( + Display* /* display */, + XEvent* /* event */, + XPointer /* arg */ + ) /* predicate */, + XPointer /* arg */ +); + +extern int XPending( + Display* /* display */ +); + +extern int XPlanesOfScreen( + Screen* /* screen */ +); + +extern int XProtocolRevision( + Display* /* display */ +); + +extern int XProtocolVersion( + Display* /* display */ +); + + +extern int XPutBackEvent( + Display* /* display */, + XEvent* /* event */ +); + +extern int XPutImage( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + XImage* /* image */, + int /* src_x */, + int /* src_y */, + int /* dest_x */, + int /* dest_y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XQLength( + Display* /* display */ +); + +extern Status XQueryBestCursor( + Display* /* display */, + Drawable /* d */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern Status XQueryBestSize( + Display* /* display */, + int /* class */, + Drawable /* which_screen */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern Status XQueryBestStipple( + Display* /* display */, + Drawable /* which_screen */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern Status XQueryBestTile( + Display* /* display */, + Drawable /* which_screen */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int* /* width_return */, + unsigned int* /* height_return */ +); + +extern int XQueryColor( + Display* /* display */, + Colormap /* colormap */, + XColor* /* def_in_out */ +); + +extern int XQueryColors( + Display* /* display */, + Colormap /* colormap */, + XColor* /* defs_in_out */, + int /* ncolors */ +); + +extern Bool XQueryExtension( + Display* /* display */, + _Xconst char* /* name */, + int* /* major_opcode_return */, + int* /* first_event_return */, + int* /* first_error_return */ +); + +extern int XQueryKeymap( + Display* /* display */, + char [32] /* keys_return */ +); + +extern Bool XQueryPointer( + Display* /* display */, + Window /* w */, + Window* /* root_return */, + Window* /* child_return */, + int* /* root_x_return */, + int* /* root_y_return */, + int* /* win_x_return */, + int* /* win_y_return */, + unsigned int* /* mask_return */ +); + +extern int XQueryTextExtents( + Display* /* display */, + XID /* font_ID */, + _Xconst char* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern int XQueryTextExtents16( + Display* /* display */, + XID /* font_ID */, + _Xconst XChar2b* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern Status XQueryTree( + Display* /* display */, + Window /* w */, + Window* /* root_return */, + Window* /* parent_return */, + Window** /* children_return */, + unsigned int* /* nchildren_return */ +); + +extern int XRaiseWindow( + Display* /* display */, + Window /* w */ +); + +extern int XReadBitmapFile( + Display* /* display */, + Drawable /* d */, + _Xconst char* /* filename */, + unsigned int* /* width_return */, + unsigned int* /* height_return */, + Pixmap* /* bitmap_return */, + int* /* x_hot_return */, + int* /* y_hot_return */ +); + +extern int XReadBitmapFileData( + _Xconst char* /* filename */, + unsigned int* /* width_return */, + unsigned int* /* height_return */, + unsigned char** /* data_return */, + int* /* x_hot_return */, + int* /* y_hot_return */ +); + +extern int XRebindKeysym( + Display* /* display */, + KeySym /* keysym */, + KeySym* /* list */, + int /* mod_count */, + _Xconst unsigned char* /* string */, + int /* bytes_string */ +); + +extern int XRecolorCursor( + Display* /* display */, + Cursor /* cursor */, + XColor* /* foreground_color */, + XColor* /* background_color */ +); + +extern int XRefreshKeyboardMapping( + XMappingEvent* /* event_map */ +); + +extern int XRemoveFromSaveSet( + Display* /* display */, + Window /* w */ +); + +extern int XRemoveHost( + Display* /* display */, + XHostAddress* /* host */ +); + +extern int XRemoveHosts( + Display* /* display */, + XHostAddress* /* hosts */, + int /* num_hosts */ +); + +extern int XReparentWindow( + Display* /* display */, + Window /* w */, + Window /* parent */, + int /* x */, + int /* y */ +); + +extern int XResetScreenSaver( + Display* /* display */ +); + +extern int XResizeWindow( + Display* /* display */, + Window /* w */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XRestackWindows( + Display* /* display */, + Window* /* windows */, + int /* nwindows */ +); + +extern int XRotateBuffers( + Display* /* display */, + int /* rotate */ +); + +extern int XRotateWindowProperties( + Display* /* display */, + Window /* w */, + Atom* /* properties */, + int /* num_prop */, + int /* npositions */ +); + +extern int XScreenCount( + Display* /* display */ +); + +extern int XSelectInput( + Display* /* display */, + Window /* w */, + long /* event_mask */ +); + +extern Status XSendEvent( + Display* /* display */, + Window /* w */, + Bool /* propagate */, + long /* event_mask */, + XEvent* /* event_send */ +); + +extern int XSetAccessControl( + Display* /* display */, + int /* mode */ +); + +extern int XSetArcMode( + Display* /* display */, + GC /* gc */, + int /* arc_mode */ +); + +extern int XSetBackground( + Display* /* display */, + GC /* gc */, + unsigned long /* background */ +); + +extern int XSetClipMask( + Display* /* display */, + GC /* gc */, + Pixmap /* pixmap */ +); + +extern int XSetClipOrigin( + Display* /* display */, + GC /* gc */, + int /* clip_x_origin */, + int /* clip_y_origin */ +); + +extern int XSetClipRectangles( + Display* /* display */, + GC /* gc */, + int /* clip_x_origin */, + int /* clip_y_origin */, + XRectangle* /* rectangles */, + int /* n */, + int /* ordering */ +); + +extern int XSetCloseDownMode( + Display* /* display */, + int /* close_mode */ +); + +extern int XSetCommand( + Display* /* display */, + Window /* w */, + char** /* argv */, + int /* argc */ +); + +extern int XSetDashes( + Display* /* display */, + GC /* gc */, + int /* dash_offset */, + _Xconst char* /* dash_list */, + int /* n */ +); + +extern int XSetFillRule( + Display* /* display */, + GC /* gc */, + int /* fill_rule */ +); + +extern int XSetFillStyle( + Display* /* display */, + GC /* gc */, + int /* fill_style */ +); + +extern int XSetFont( + Display* /* display */, + GC /* gc */, + Font /* font */ +); + +extern int XSetFontPath( + Display* /* display */, + char** /* directories */, + int /* ndirs */ +); + +extern int XSetForeground( + Display* /* display */, + GC /* gc */, + unsigned long /* foreground */ +); + +extern int XSetFunction( + Display* /* display */, + GC /* gc */, + int /* function */ +); + +extern int XSetGraphicsExposures( + Display* /* display */, + GC /* gc */, + Bool /* graphics_exposures */ +); + +extern int XSetIconName( + Display* /* display */, + Window /* w */, + _Xconst char* /* icon_name */ +); + +extern int XSetInputFocus( + Display* /* display */, + Window /* focus */, + int /* revert_to */, + Time /* time */ +); + +extern int XSetLineAttributes( + Display* /* display */, + GC /* gc */, + unsigned int /* line_width */, + int /* line_style */, + int /* cap_style */, + int /* join_style */ +); + +extern int XSetModifierMapping( + Display* /* display */, + XModifierKeymap* /* modmap */ +); + +extern int XSetPlaneMask( + Display* /* display */, + GC /* gc */, + unsigned long /* plane_mask */ +); + +extern int XSetPointerMapping( + Display* /* display */, + _Xconst unsigned char* /* map */, + int /* nmap */ +); + +extern int XSetScreenSaver( + Display* /* display */, + int /* timeout */, + int /* interval */, + int /* prefer_blanking */, + int /* allow_exposures */ +); + +extern int XSetSelectionOwner( + Display* /* display */, + Atom /* selection */, + Window /* owner */, + Time /* time */ +); + +extern int XSetState( + Display* /* display */, + GC /* gc */, + unsigned long /* foreground */, + unsigned long /* background */, + int /* function */, + unsigned long /* plane_mask */ +); + +extern int XSetStipple( + Display* /* display */, + GC /* gc */, + Pixmap /* stipple */ +); + +extern int XSetSubwindowMode( + Display* /* display */, + GC /* gc */, + int /* subwindow_mode */ +); + +extern int XSetTSOrigin( + Display* /* display */, + GC /* gc */, + int /* ts_x_origin */, + int /* ts_y_origin */ +); + +extern int XSetTile( + Display* /* display */, + GC /* gc */, + Pixmap /* tile */ +); + +extern int XSetWindowBackground( + Display* /* display */, + Window /* w */, + unsigned long /* background_pixel */ +); + +extern int XSetWindowBackgroundPixmap( + Display* /* display */, + Window /* w */, + Pixmap /* background_pixmap */ +); + +extern int XSetWindowBorder( + Display* /* display */, + Window /* w */, + unsigned long /* border_pixel */ +); + +extern int XSetWindowBorderPixmap( + Display* /* display */, + Window /* w */, + Pixmap /* border_pixmap */ +); + +extern int XSetWindowBorderWidth( + Display* /* display */, + Window /* w */, + unsigned int /* width */ +); + +extern int XSetWindowColormap( + Display* /* display */, + Window /* w */, + Colormap /* colormap */ +); + +extern int XStoreBuffer( + Display* /* display */, + _Xconst char* /* bytes */, + int /* nbytes */, + int /* buffer */ +); + +extern int XStoreBytes( + Display* /* display */, + _Xconst char* /* bytes */, + int /* nbytes */ +); + +extern int XStoreColor( + Display* /* display */, + Colormap /* colormap */, + XColor* /* color */ +); + +extern int XStoreColors( + Display* /* display */, + Colormap /* colormap */, + XColor* /* color */, + int /* ncolors */ +); + +extern int XStoreName( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */ +); + +extern int XStoreNamedColor( + Display* /* display */, + Colormap /* colormap */, + _Xconst char* /* color */, + unsigned long /* pixel */, + int /* flags */ +); + +extern int XSync( + Display* /* display */, + Bool /* discard */ +); + +extern int XTextExtents( + XFontStruct* /* font_struct */, + _Xconst char* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern int XTextExtents16( + XFontStruct* /* font_struct */, + _Xconst XChar2b* /* string */, + int /* nchars */, + int* /* direction_return */, + int* /* font_ascent_return */, + int* /* font_descent_return */, + XCharStruct* /* overall_return */ +); + +extern int XTextWidth( + XFontStruct* /* font_struct */, + _Xconst char* /* string */, + int /* count */ +); + +extern int XTextWidth16( + XFontStruct* /* font_struct */, + _Xconst XChar2b* /* string */, + int /* count */ +); + +extern Bool XTranslateCoordinates( + Display* /* display */, + Window /* src_w */, + Window /* dest_w */, + int /* src_x */, + int /* src_y */, + int* /* dest_x_return */, + int* /* dest_y_return */, + Window* /* child_return */ +); + +extern int XUndefineCursor( + Display* /* display */, + Window /* w */ +); + +extern int XUngrabButton( + Display* /* display */, + unsigned int /* button */, + unsigned int /* modifiers */, + Window /* grab_window */ +); + +extern int XUngrabKey( + Display* /* display */, + int /* keycode */, + unsigned int /* modifiers */, + Window /* grab_window */ +); + +extern int XUngrabKeyboard( + Display* /* display */, + Time /* time */ +); + +extern int XUngrabPointer( + Display* /* display */, + Time /* time */ +); + +extern int XUngrabServer( + Display* /* display */ +); + +extern int XUninstallColormap( + Display* /* display */, + Colormap /* colormap */ +); + +extern int XUnloadFont( + Display* /* display */, + Font /* font */ +); + +extern int XUnmapSubwindows( + Display* /* display */, + Window /* w */ +); + +extern int XUnmapWindow( + Display* /* display */, + Window /* w */ +); + +extern int XVendorRelease( + Display* /* display */ +); + +extern int XWarpPointer( + Display* /* display */, + Window /* src_w */, + Window /* dest_w */, + int /* src_x */, + int /* src_y */, + unsigned int /* src_width */, + unsigned int /* src_height */, + int /* dest_x */, + int /* dest_y */ +); + +extern int XWidthMMOfScreen( + Screen* /* screen */ +); + +extern int XWidthOfScreen( + Screen* /* screen */ +); + +extern int XWindowEvent( + Display* /* display */, + Window /* w */, + long /* event_mask */, + XEvent* /* event_return */ +); + +extern int XWriteBitmapFile( + Display* /* display */, + _Xconst char* /* filename */, + Pixmap /* bitmap */, + unsigned int /* width */, + unsigned int /* height */, + int /* x_hot */, + int /* y_hot */ +); + +extern Bool XSupportsLocale (void); + +extern char *XSetLocaleModifiers( + const char* /* modifier_list */ +); + +extern XOM XOpenOM( + Display* /* display */, + struct _XrmHashBucketRec* /* rdb */, + _Xconst char* /* res_name */, + _Xconst char* /* res_class */ +); + +extern Status XCloseOM( + XOM /* om */ +); + +extern char *XSetOMValues( + XOM /* om */, + ... +) _X_SENTINEL(0); + +extern char *XGetOMValues( + XOM /* om */, + ... +) _X_SENTINEL(0); + +extern Display *XDisplayOfOM( + XOM /* om */ +); + +extern char *XLocaleOfOM( + XOM /* om */ +); + +extern XOC XCreateOC( + XOM /* om */, + ... +) _X_SENTINEL(0); + +extern void XDestroyOC( + XOC /* oc */ +); + +extern XOM XOMOfOC( + XOC /* oc */ +); + +extern char *XSetOCValues( + XOC /* oc */, + ... +) _X_SENTINEL(0); + +extern char *XGetOCValues( + XOC /* oc */, + ... +) _X_SENTINEL(0); + +extern XFontSet XCreateFontSet( + Display* /* display */, + _Xconst char* /* base_font_name_list */, + char*** /* missing_charset_list */, + int* /* missing_charset_count */, + char** /* def_string */ +); + +extern void XFreeFontSet( + Display* /* display */, + XFontSet /* font_set */ +); + +extern int XFontsOfFontSet( + XFontSet /* font_set */, + XFontStruct*** /* font_struct_list */, + char*** /* font_name_list */ +); + +extern char *XBaseFontNameListOfFontSet( + XFontSet /* font_set */ +); + +extern char *XLocaleOfFontSet( + XFontSet /* font_set */ +); + +extern Bool XContextDependentDrawing( + XFontSet /* font_set */ +); + +extern Bool XDirectionalDependentDrawing( + XFontSet /* font_set */ +); + +extern Bool XContextualDrawing( + XFontSet /* font_set */ +); + +extern XFontSetExtents *XExtentsOfFontSet( + XFontSet /* font_set */ +); + +extern int XmbTextEscapement( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern int XwcTextEscapement( + XFontSet /* font_set */, + _Xconst wchar_t* /* text */, + int /* num_wchars */ +); + +extern int Xutf8TextEscapement( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern int XmbTextExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern int XwcTextExtents( + XFontSet /* font_set */, + _Xconst wchar_t* /* text */, + int /* num_wchars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern int Xutf8TextExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern Status XmbTextPerCharExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* ink_extents_buffer */, + XRectangle* /* logical_extents_buffer */, + int /* buffer_size */, + int* /* num_chars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern Status XwcTextPerCharExtents( + XFontSet /* font_set */, + _Xconst wchar_t* /* text */, + int /* num_wchars */, + XRectangle* /* ink_extents_buffer */, + XRectangle* /* logical_extents_buffer */, + int /* buffer_size */, + int* /* num_chars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern Status Xutf8TextPerCharExtents( + XFontSet /* font_set */, + _Xconst char* /* text */, + int /* bytes_text */, + XRectangle* /* ink_extents_buffer */, + XRectangle* /* logical_extents_buffer */, + int /* buffer_size */, + int* /* num_chars */, + XRectangle* /* overall_ink_return */, + XRectangle* /* overall_logical_return */ +); + +extern void XmbDrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XmbTextItem* /* text_items */, + int /* nitems */ +); + +extern void XwcDrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XwcTextItem* /* text_items */, + int /* nitems */ +); + +extern void Xutf8DrawText( + Display* /* display */, + Drawable /* d */, + GC /* gc */, + int /* x */, + int /* y */, + XmbTextItem* /* text_items */, + int /* nitems */ +); + +extern void XmbDrawString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern void XwcDrawString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst wchar_t* /* text */, + int /* num_wchars */ +); + +extern void Xutf8DrawString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern void XmbDrawImageString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern void XwcDrawImageString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst wchar_t* /* text */, + int /* num_wchars */ +); + +extern void Xutf8DrawImageString( + Display* /* display */, + Drawable /* d */, + XFontSet /* font_set */, + GC /* gc */, + int /* x */, + int /* y */, + _Xconst char* /* text */, + int /* bytes_text */ +); + +extern XIM XOpenIM( + Display* /* dpy */, + struct _XrmHashBucketRec* /* rdb */, + char* /* res_name */, + char* /* res_class */ +); + +extern Status XCloseIM( + XIM /* im */ +); + +extern char *XGetIMValues( + XIM /* im */, ... +) _X_SENTINEL(0); + +extern char *XSetIMValues( + XIM /* im */, ... +) _X_SENTINEL(0); + +extern Display *XDisplayOfIM( + XIM /* im */ +); + +extern char *XLocaleOfIM( + XIM /* im*/ +); + +extern XIC XCreateIC( + XIM /* im */, ... +) _X_SENTINEL(0); + +extern void XDestroyIC( + XIC /* ic */ +); + +extern void XSetICFocus( + XIC /* ic */ +); + +extern void XUnsetICFocus( + XIC /* ic */ +); + +extern wchar_t *XwcResetIC( + XIC /* ic */ +); + +extern char *XmbResetIC( + XIC /* ic */ +); + +extern char *Xutf8ResetIC( + XIC /* ic */ +); + +extern char *XSetICValues( + XIC /* ic */, ... +) _X_SENTINEL(0); + +extern char *XGetICValues( + XIC /* ic */, ... +) _X_SENTINEL(0); + +extern XIM XIMOfIC( + XIC /* ic */ +); + +extern Bool XFilterEvent( + XEvent* /* event */, + Window /* window */ +); + +extern int XmbLookupString( + XIC /* ic */, + XKeyPressedEvent* /* event */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + Status* /* status_return */ +); + +extern int XwcLookupString( + XIC /* ic */, + XKeyPressedEvent* /* event */, + wchar_t* /* buffer_return */, + int /* wchars_buffer */, + KeySym* /* keysym_return */, + Status* /* status_return */ +); + +extern int Xutf8LookupString( + XIC /* ic */, + XKeyPressedEvent* /* event */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + Status* /* status_return */ +); + +extern XVaNestedList XVaCreateNestedList( + int /*unused*/, ... +) _X_SENTINEL(0); + +/* internal connections for IMs */ + +extern Bool XRegisterIMInstantiateCallback( + Display* /* dpy */, + struct _XrmHashBucketRec* /* rdb */, + char* /* res_name */, + char* /* res_class */, + XIDProc /* callback */, + XPointer /* client_data */ +); + +extern Bool XUnregisterIMInstantiateCallback( + Display* /* dpy */, + struct _XrmHashBucketRec* /* rdb */, + char* /* res_name */, + char* /* res_class */, + XIDProc /* callback */, + XPointer /* client_data */ +); + +typedef void (*XConnectionWatchProc)( + Display* /* dpy */, + XPointer /* client_data */, + int /* fd */, + Bool /* opening */, /* open or close flag */ + XPointer* /* watch_data */ /* open sets, close uses */ +); + + +extern Status XInternalConnectionNumbers( + Display* /* dpy */, + int** /* fd_return */, + int* /* count_return */ +); + +extern void XProcessInternalConnection( + Display* /* dpy */, + int /* fd */ +); + +extern Status XAddConnectionWatch( + Display* /* dpy */, + XConnectionWatchProc /* callback */, + XPointer /* client_data */ +); + +extern void XRemoveConnectionWatch( + Display* /* dpy */, + XConnectionWatchProc /* callback */, + XPointer /* client_data */ +); + +extern void XSetAuthorization( + char * /* name */, + int /* namelen */, + char * /* data */, + int /* datalen */ +); + +extern int _Xmbtowc( + wchar_t * /* wstr */, +#ifdef ISC + char const * /* str */, + size_t /* len */ +#else + char * /* str */, + int /* len */ +#endif +); + +extern int _Xwctomb( + char * /* str */, + wchar_t /* wc */ +); + +extern Bool XGetEventData( + Display* /* dpy */, + XGenericEventCookie* /* cookie*/ +); + +extern void XFreeEventData( + Display* /* dpy */, + XGenericEventCookie* /* cookie*/ +); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +_XFUNCPROTOEND + +#endif /* _X11_XLIB_H_ */ diff --git a/src/lib_armv7hf/X11/Xosdefs.h b/src/lib_armv7hf/X11/Xosdefs.h new file mode 100644 index 0000000..33eaee4 --- /dev/null +++ b/src/lib_armv7hf/X11/Xosdefs.h @@ -0,0 +1,116 @@ +/* + * O/S-dependent (mis)feature macro definitions + * +Copyright 1991, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + */ + +#ifndef _XOSDEFS_H_ +# define _XOSDEFS_H_ + +/* + * X_NOT_POSIX means does not have POSIX header files. Lack of this + * symbol does NOT mean that the POSIX environment is the default. + * You may still have to define _POSIX_SOURCE to get it. + */ + + +# ifdef _SCO_DS +# ifndef __SCO__ +# define __SCO__ +# endif +# endif + +# ifdef __i386__ +# ifdef SYSV +# if !defined(__SCO__) && \ + !defined(__UNIXWARE__) && !defined(__sun) +# if !defined(_POSIX_SOURCE) +# define X_NOT_POSIX +# endif +# endif +# endif +# endif + +# ifdef __sun +/* Imake configs define SVR4 on Solaris, but cc & gcc only define __SVR4 + * This check allows non-Imake configured programs to build correctly. + */ +# if defined(__SVR4) && !defined(SVR4) +# define SVR4 1 +# endif +# ifdef SVR4 +/* define this to whatever it needs to be */ +# define X_POSIX_C_SOURCE 199300L +# endif +# endif + +# ifdef WIN32 +# ifndef _POSIX_ +# define X_NOT_POSIX +# endif +# endif + + +# ifdef __APPLE__ +# define NULL_NOT_ZERO + +/* Defining any of these will sanitize the namespace to JUST want is defined by + * that particular standard. If that happens, we don't get some expected + * prototypes, typedefs, etc (like fd_mask). We can define _DARWIN_C_SOURCE to + * loosen our belts a tad. + */ +# if defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) +# ifndef _DARWIN_C_SOURCE +# define _DARWIN_C_SOURCE +# endif +# endif + +# endif + +# ifdef __GNU__ +# ifndef PATH_MAX +# define PATH_MAX 4096 +# endif +# ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +# endif +# endif + +# if defined(__SCO__) || defined(__UNIXWARE__) +# ifndef PATH_MAX +# define PATH_MAX 1024 +# endif +# ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +# endif +# endif + +# if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) \ + || defined(__APPLE__) || defined(__DragonFly__) +# ifndef CSRG_BASED +# define CSRG_BASED +# endif +# endif + +#endif /* _XOSDEFS_H_ */ + diff --git a/src/lib_armv7hf/X11/Xutil.h b/src/lib_armv7hf/X11/Xutil.h new file mode 100644 index 0000000..62cdf55 --- /dev/null +++ b/src/lib_armv7hf/X11/Xutil.h @@ -0,0 +1,838 @@ + +/*********************************************************** + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#ifndef _X11_XUTIL_H_ +#define _X11_XUTIL_H_ + +/* You must include before including this file */ +#include +#include + +/* The Xlib structs are full of implicit padding to properly align members. + We can't clean that up without breaking ABI, so tell clang not to bother + complaining about it. */ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +/* + * Bitmask returned by XParseGeometry(). Each bit tells if the corresponding + * value (x, y, width, height) was found in the parsed string. + */ +#define NoValue 0x0000 +#define XValue 0x0001 +#define YValue 0x0002 +#define WidthValue 0x0004 +#define HeightValue 0x0008 +#define AllValues 0x000F +#define XNegative 0x0010 +#define YNegative 0x0020 + +/* + * new version containing base_width, base_height, and win_gravity fields; + * used with WM_NORMAL_HINTS. + */ +typedef struct { + long flags; /* marks which fields in this structure are defined */ + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; + struct { + int x; /* numerator */ + int y; /* denominator */ + } min_aspect, max_aspect; + int base_width, base_height; /* added by ICCCM version 1 */ + int win_gravity; /* added by ICCCM version 1 */ +} XSizeHints; + +/* + * The next block of definitions are for window manager properties that + * clients and applications use for communication. + */ + +/* flags argument in size hints */ +#define USPosition (1L << 0) /* user specified x, y */ +#define USSize (1L << 1) /* user specified width, height */ + +#define PPosition (1L << 2) /* program specified position */ +#define PSize (1L << 3) /* program specified size */ +#define PMinSize (1L << 4) /* program specified minimum size */ +#define PMaxSize (1L << 5) /* program specified maximum size */ +#define PResizeInc (1L << 6) /* program specified resize increments */ +#define PAspect (1L << 7) /* program specified min and max aspect ratios */ +#define PBaseSize (1L << 8) /* program specified base for incrementing */ +#define PWinGravity (1L << 9) /* program specified window gravity */ + +/* obsolete */ +#define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) + + + +typedef struct { + long flags; /* marks which fields in this structure are defined */ + Bool input; /* does this application rely on the window manager to + get keyboard input? */ + int initial_state; /* see below */ + Pixmap icon_pixmap; /* pixmap to be used as icon */ + Window icon_window; /* window to be used as icon */ + int icon_x, icon_y; /* initial position of icon */ + Pixmap icon_mask; /* icon mask bitmap */ + XID window_group; /* id of related window group */ + /* this structure may be extended in the future */ +} XWMHints; + +/* definition for flags of XWMHints */ + +#define InputHint (1L << 0) +#define StateHint (1L << 1) +#define IconPixmapHint (1L << 2) +#define IconWindowHint (1L << 3) +#define IconPositionHint (1L << 4) +#define IconMaskHint (1L << 5) +#define WindowGroupHint (1L << 6) +#define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \ +IconPositionHint|IconMaskHint|WindowGroupHint) +#define XUrgencyHint (1L << 8) + +/* definitions for initial window state */ +#define WithdrawnState 0 /* for windows that are not mapped */ +#define NormalState 1 /* most applications want to start this way */ +#define IconicState 3 /* application wants to start as an icon */ + +/* + * Obsolete states no longer defined by ICCCM + */ +#define DontCareState 0 /* don't know or care */ +#define ZoomState 2 /* application wants to start zoomed */ +#define InactiveState 4 /* application believes it is seldom used; */ + /* some wm's may put it on inactive menu */ + + +/* + * new structure for manipulating TEXT properties; used with WM_NAME, + * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND. + */ +typedef struct { + unsigned char *value; /* same as Property routines */ + Atom encoding; /* prop type */ + int format; /* prop data format: 8, 16, or 32 */ + unsigned long nitems; /* number of data items in value */ +} XTextProperty; + +#define XNoMemory -1 +#define XLocaleNotSupported -2 +#define XConverterNotFound -3 + +typedef enum { + XStringStyle, /* STRING */ + XCompoundTextStyle, /* COMPOUND_TEXT */ + XTextStyle, /* text in owner's encoding (current locale)*/ + XStdICCTextStyle, /* STRING, else COMPOUND_TEXT */ + /* The following is an XFree86 extension, introduced in November 2000 */ + XUTF8StringStyle /* UTF8_STRING */ +} XICCEncodingStyle; + +typedef struct { + int min_width, min_height; + int max_width, max_height; + int width_inc, height_inc; +} XIconSize; + +typedef struct { + char *res_name; + char *res_class; +} XClassHint; + +#ifdef XUTIL_DEFINE_FUNCTIONS +extern int XDestroyImage( + XImage *ximage); +extern unsigned long XGetPixel( + XImage *ximage, + int x, int y); +extern int XPutPixel( + XImage *ximage, + int x, int y, + unsigned long pixel); +extern XImage *XSubImage( + XImage *ximage, + int x, int y, + unsigned int width, unsigned int height); +extern int XAddPixel( + XImage *ximage, + long value); +#else +/* + * These macros are used to give some sugar to the image routines so that + * naive people are more comfortable with them. + */ +#define XDestroyImage(ximage) \ + ((*((ximage)->f.destroy_image))((ximage))) +#define XGetPixel(ximage, x, y) \ + ((*((ximage)->f.get_pixel))((ximage), (x), (y))) +#define XPutPixel(ximage, x, y, pixel) \ + ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel))) +#define XSubImage(ximage, x, y, width, height) \ + ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height))) +#define XAddPixel(ximage, value) \ + ((*((ximage)->f.add_pixel))((ximage), (value))) +#endif + +/* + * Compose sequence status structure, used in calling XLookupString. + */ +typedef struct _XComposeStatus { + XPointer compose_ptr; /* state table pointer */ + int chars_matched; /* match state */ +} XComposeStatus; + +/* + * Keysym macros, used on Keysyms to test for classes of symbols + */ +#define IsKeypadKey(keysym) \ + (((KeySym)(keysym) >= XK_KP_Space) && ((KeySym)(keysym) <= XK_KP_Equal)) + +#define IsPrivateKeypadKey(keysym) \ + (((KeySym)(keysym) >= 0x11000000) && ((KeySym)(keysym) <= 0x1100FFFF)) + +#define IsCursorKey(keysym) \ + (((KeySym)(keysym) >= XK_Home) && ((KeySym)(keysym) < XK_Select)) + +#define IsPFKey(keysym) \ + (((KeySym)(keysym) >= XK_KP_F1) && ((KeySym)(keysym) <= XK_KP_F4)) + +#define IsFunctionKey(keysym) \ + (((KeySym)(keysym) >= XK_F1) && ((KeySym)(keysym) <= XK_F35)) + +#define IsMiscFunctionKey(keysym) \ + (((KeySym)(keysym) >= XK_Select) && ((KeySym)(keysym) <= XK_Break)) + +#ifdef XK_XKB_KEYS +#define IsModifierKey(keysym) \ + ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \ + || (((KeySym)(keysym) >= XK_ISO_Lock) && \ + ((KeySym)(keysym) <= XK_ISO_Level5_Lock)) \ + || ((KeySym)(keysym) == XK_Mode_switch) \ + || ((KeySym)(keysym) == XK_Num_Lock)) +#else +#define IsModifierKey(keysym) \ + ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \ + || ((KeySym)(keysym) == XK_Mode_switch) \ + || ((KeySym)(keysym) == XK_Num_Lock)) +#endif +/* + * opaque reference to Region data type + */ +typedef struct _XRegion *Region; + +/* Return values from XRectInRegion() */ + +#define RectangleOut 0 +#define RectangleIn 1 +#define RectanglePart 2 + + +/* + * Information used by the visual utility routines to find desired visual + * type from the many visuals a display may support. + */ + +typedef struct { + Visual *visual; + VisualID visualid; + int screen; + int depth; +#if defined(__cplusplus) || defined(c_plusplus) + int c_class; /* C++ */ +#else + int class; +#endif + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; + int colormap_size; + int bits_per_rgb; +} XVisualInfo; + +#define VisualNoMask 0x0 +#define VisualIDMask 0x1 +#define VisualScreenMask 0x2 +#define VisualDepthMask 0x4 +#define VisualClassMask 0x8 +#define VisualRedMaskMask 0x10 +#define VisualGreenMaskMask 0x20 +#define VisualBlueMaskMask 0x40 +#define VisualColormapSizeMask 0x80 +#define VisualBitsPerRGBMask 0x100 +#define VisualAllMask 0x1FF + +/* + * This defines a window manager property that clients may use to + * share standard color maps of type RGB_COLOR_MAP: + */ +typedef struct { + Colormap colormap; + unsigned long red_max; + unsigned long red_mult; + unsigned long green_max; + unsigned long green_mult; + unsigned long blue_max; + unsigned long blue_mult; + unsigned long base_pixel; + VisualID visualid; /* added by ICCCM version 1 */ + XID killid; /* added by ICCCM version 1 */ +} XStandardColormap; + +#define ReleaseByFreeingColormap ((XID) 1L) /* for killid field above */ + + +/* + * return codes for XReadBitmapFile and XWriteBitmapFile + */ +#define BitmapSuccess 0 +#define BitmapOpenFailed 1 +#define BitmapFileInvalid 2 +#define BitmapNoMemory 3 + +/**************************************************************** + * + * Context Management + * + ****************************************************************/ + + +/* Associative lookup table return codes */ + +#define XCSUCCESS 0 /* No error. */ +#define XCNOMEM 1 /* Out of memory */ +#define XCNOENT 2 /* No entry in table */ + +typedef int XContext; + +#define XUniqueContext() ((XContext) XrmUniqueQuark()) +#define XStringToContext(string) ((XContext) XrmStringToQuark(string)) + +_XFUNCPROTOBEGIN + +/* The following declarations are alphabetized. */ + +extern XClassHint *XAllocClassHint ( + void +); + +extern XIconSize *XAllocIconSize ( + void +); + +extern XSizeHints *XAllocSizeHints ( + void +); + +extern XStandardColormap *XAllocStandardColormap ( + void +); + +extern XWMHints *XAllocWMHints ( + void +); + +extern int XClipBox( + Region /* r */, + XRectangle* /* rect_return */ +); + +extern Region XCreateRegion( + void +); + +extern const char *XDefaultString (void); + +extern int XDeleteContext( + Display* /* display */, + XID /* rid */, + XContext /* context */ +); + +extern int XDestroyRegion( + Region /* r */ +); + +extern int XEmptyRegion( + Region /* r */ +); + +extern int XEqualRegion( + Region /* r1 */, + Region /* r2 */ +); + +extern int XFindContext( + Display* /* display */, + XID /* rid */, + XContext /* context */, + XPointer* /* data_return */ +); + +extern Status XGetClassHint( + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints_return */ +); + +extern Status XGetIconSizes( + Display* /* display */, + Window /* w */, + XIconSize** /* size_list_return */, + int* /* count_return */ +); + +extern Status XGetNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */ +); + +extern Status XGetRGBColormaps( + Display* /* display */, + Window /* w */, + XStandardColormap** /* stdcmap_return */, + int* /* count_return */, + Atom /* property */ +); + +extern Status XGetSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + Atom /* property */ +); + +extern Status XGetStandardColormap( + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap_return */, + Atom /* property */ +); + +extern Status XGetTextProperty( + Display* /* display */, + Window /* window */, + XTextProperty* /* text_prop_return */, + Atom /* property */ +); + +extern XVisualInfo *XGetVisualInfo( + Display* /* display */, + long /* vinfo_mask */, + XVisualInfo* /* vinfo_template */, + int* /* nitems_return */ +); + +extern Status XGetWMClientMachine( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +); + +extern XWMHints *XGetWMHints( + Display* /* display */, + Window /* w */ +); + +extern Status XGetWMIconName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +); + +extern Status XGetWMName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop_return */ +); + +extern Status XGetWMNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */ +); + +extern Status XGetWMSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints_return */, + long* /* supplied_return */, + Atom /* property */ +); + +extern Status XGetZoomHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints_return */ +); + +extern int XIntersectRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +extern void XConvertCase( + KeySym /* sym */, + KeySym* /* lower */, + KeySym* /* upper */ +); + +extern int XLookupString( + XKeyEvent* /* event_struct */, + char* /* buffer_return */, + int /* bytes_buffer */, + KeySym* /* keysym_return */, + XComposeStatus* /* status_in_out */ +); + +extern Status XMatchVisualInfo( + Display* /* display */, + int /* screen */, + int /* depth */, + int /* class */, + XVisualInfo* /* vinfo_return */ +); + +extern int XOffsetRegion( + Region /* r */, + int /* dx */, + int /* dy */ +); + +extern Bool XPointInRegion( + Region /* r */, + int /* x */, + int /* y */ +); + +extern Region XPolygonRegion( + XPoint* /* points */, + int /* n */, + int /* fill_rule */ +); + +extern int XRectInRegion( + Region /* r */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */ +); + +extern int XSaveContext( + Display* /* display */, + XID /* rid */, + XContext /* context */, + _Xconst char* /* data */ +); + +extern int XSetClassHint( + Display* /* display */, + Window /* w */, + XClassHint* /* class_hints */ +); + +extern int XSetIconSizes( + Display* /* display */, + Window /* w */, + XIconSize* /* size_list */, + int /* count */ +); + +extern int XSetNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +); + +extern void XSetRGBColormaps( + Display* /* display */, + Window /* w */, + XStandardColormap* /* stdcmaps */, + int /* count */, + Atom /* property */ +); + +extern int XSetSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +); + +extern int XSetStandardProperties( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + Pixmap /* icon_pixmap */, + char** /* argv */, + int /* argc */, + XSizeHints* /* hints */ +); + +extern void XSetTextProperty( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */, + Atom /* property */ +); + +extern void XSetWMClientMachine( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +); + +extern int XSetWMHints( + Display* /* display */, + Window /* w */, + XWMHints* /* wm_hints */ +); + +extern void XSetWMIconName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +); + +extern void XSetWMName( + Display* /* display */, + Window /* w */, + XTextProperty* /* text_prop */ +); + +extern void XSetWMNormalHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */ +); + +extern void XSetWMProperties( + Display* /* display */, + Window /* w */, + XTextProperty* /* window_name */, + XTextProperty* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +); + +extern void XmbSetWMProperties( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +); + +extern void Xutf8SetWMProperties( + Display* /* display */, + Window /* w */, + _Xconst char* /* window_name */, + _Xconst char* /* icon_name */, + char** /* argv */, + int /* argc */, + XSizeHints* /* normal_hints */, + XWMHints* /* wm_hints */, + XClassHint* /* class_hints */ +); + +extern void XSetWMSizeHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* hints */, + Atom /* property */ +); + +extern int XSetRegion( + Display* /* display */, + GC /* gc */, + Region /* r */ +); + +extern void XSetStandardColormap( + Display* /* display */, + Window /* w */, + XStandardColormap* /* colormap */, + Atom /* property */ +); + +extern int XSetZoomHints( + Display* /* display */, + Window /* w */, + XSizeHints* /* zhints */ +); + +extern int XShrinkRegion( + Region /* r */, + int /* dx */, + int /* dy */ +); + +extern Status XStringListToTextProperty( + char** /* list */, + int /* count */, + XTextProperty* /* text_prop_return */ +); + +extern int XSubtractRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +extern int XmbTextListToTextProperty( + Display* display, + char** list, + int count, + XICCEncodingStyle style, + XTextProperty* text_prop_return +); + +extern int XwcTextListToTextProperty( + Display* display, + wchar_t** list, + int count, + XICCEncodingStyle style, + XTextProperty* text_prop_return +); + +extern int Xutf8TextListToTextProperty( + Display* display, + char** list, + int count, + XICCEncodingStyle style, + XTextProperty* text_prop_return +); + +extern void XwcFreeStringList( + wchar_t** list +); + +extern Status XTextPropertyToStringList( + XTextProperty* /* text_prop */, + char*** /* list_return */, + int* /* count_return */ +); + +extern int XmbTextPropertyToTextList( + Display* display, + const XTextProperty* text_prop, + char*** list_return, + int* count_return +); + +extern int XwcTextPropertyToTextList( + Display* display, + const XTextProperty* text_prop, + wchar_t*** list_return, + int* count_return +); + +extern int Xutf8TextPropertyToTextList( + Display* display, + const XTextProperty* text_prop, + char*** list_return, + int* count_return +); + +extern int XUnionRectWithRegion( + XRectangle* /* rectangle */, + Region /* src_region */, + Region /* dest_region_return */ +); + +extern int XUnionRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +extern int XWMGeometry( + Display* /* display */, + int /* screen_number */, + _Xconst char* /* user_geometry */, + _Xconst char* /* default_geometry */, + unsigned int /* border_width */, + XSizeHints* /* hints */, + int* /* x_return */, + int* /* y_return */, + int* /* width_return */, + int* /* height_return */, + int* /* gravity_return */ +); + +extern int XXorRegion( + Region /* sra */, + Region /* srb */, + Region /* dr_return */ +); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +_XFUNCPROTOEND + +#endif /* _X11_XUTIL_H_ */ diff --git a/src/lib_armv7hf/X11/keysym.h b/src/lib_armv7hf/X11/keysym.h new file mode 100644 index 0000000..4f58488 --- /dev/null +++ b/src/lib_armv7hf/X11/keysym.h @@ -0,0 +1,74 @@ +/*********************************************************** + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* default keysyms */ +#define XK_MISCELLANY +#define XK_XKB_KEYS +#define XK_LATIN1 +#define XK_LATIN2 +#define XK_LATIN3 +#define XK_LATIN4 +#define XK_LATIN8 +#define XK_LATIN9 +#define XK_CAUCASUS +#define XK_GREEK +#define XK_KATAKANA +#define XK_ARABIC +#define XK_CYRILLIC +#define XK_HEBREW +#define XK_THAI +#define XK_KOREAN +#define XK_ARMENIAN +#define XK_GEORGIAN +#define XK_VIETNAMESE +#define XK_CURRENCY +#define XK_MATHEMATICAL +#define XK_BRAILLE +#define XK_SINHALA + +#include + diff --git a/src/lib_armv7hf/X11/keysymdef.h b/src/lib_armv7hf/X11/keysymdef.h new file mode 100644 index 0000000..147ecf5 --- /dev/null +++ b/src/lib_armv7hf/X11/keysymdef.h @@ -0,0 +1,2497 @@ +/*********************************************************** +Copyright 1987, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* + * The "X11 Window System Protocol" standard defines in Appendix A the + * keysym codes. These 29-bit integer values identify characters or + * functions associated with each key (e.g., via the visible + * engraving) of a keyboard layout. This file assigns mnemonic macro + * names for these keysyms. + * + * This file is also compiled (by src/util/makekeys.c in libX11) into + * hash tables that can be accessed with X11 library functions such as + * XStringToKeysym() and XKeysymToString(). + * + * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode + * character, this is noted in a comment that provides both the U+xxxx + * Unicode position, as well as the official Unicode name of the + * character. + * + * Where the correspondence is either not one-to-one or semantically + * unclear, the Unicode position and name are enclosed in + * parentheses. Such legacy keysyms should be considered deprecated + * and are not recommended for use in future keyboard mappings. + * + * For any future extension of the keysyms with characters already + * found in ISO 10646 / Unicode, the following algorithm shall be + * used. The new keysym code position will simply be the character's + * Unicode number plus 0x01000000. The keysym values in the range + * 0x01000100 to 0x0110ffff are reserved to represent Unicode + * characters in the range U+0100 to U+10FFFF. + * + * While most newer Unicode-based X11 clients do already accept + * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it + * will remain necessary for clients -- in the interest of + * compatibility with existing servers -- to also understand the + * existing legacy keysym values in the range 0x0100 to 0x20ff. + * + * Where several mnemonic names are defined for the same keysym in this + * file, all but the first one listed should be considered deprecated. + * + * Mnemonic names for keysyms are defined in this file with lines + * that match one of these Perl regular expressions: + * + * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U+([0-9A-F]{4,6}) (.*) \*\/\s*$/ + * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ + * /^\#define XK_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ + * + * Before adding new keysyms, please do consider the following: In + * addition to the keysym names defined in this file, the + * XStringToKeysym() and XKeysymToString() functions will also handle + * any keysym string of the form "U0020" to "U007E" and "U00A0" to + * "U10FFFF" for all possible Unicode characters. In other words, + * every possible Unicode character has already a keysym string + * defined algorithmically, even if it is not listed here. Therefore, + * defining an additional keysym macro is only necessary where a + * non-hexadecimal mnemonic name is needed, or where the new keysym + * does not represent any existing Unicode character. + * + * When adding new keysyms to this file, do not forget to also update the + * following as needed: + * + * - the mappings in src/KeyBind.c in the repo + * git://anongit.freedesktop.org/xorg/lib/libX11.git + * + * - the protocol specification in specs/keysyms.xml + * in the repo git://anongit.freedesktop.org/xorg/proto/x11proto.git + * + */ + +#define XK_VoidSymbol 0xffffff /* Void symbol */ + +#ifdef XK_MISCELLANY +/* + * TTY function keys, cleverly chosen to map to ASCII, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code). + */ + +#define XK_BackSpace 0xff08 /* Back space, back char */ +#define XK_Tab 0xff09 +#define XK_Linefeed 0xff0a /* Linefeed, LF */ +#define XK_Clear 0xff0b +#define XK_Return 0xff0d /* Return, enter */ +#define XK_Pause 0xff13 /* Pause, hold */ +#define XK_Scroll_Lock 0xff14 +#define XK_Sys_Req 0xff15 +#define XK_Escape 0xff1b +#define XK_Delete 0xffff /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xff20 /* Multi-key character compose */ +#define XK_Codeinput 0xff37 +#define XK_SingleCandidate 0xff3c +#define XK_MultipleCandidate 0xff3d +#define XK_PreviousCandidate 0xff3e + +/* Japanese keyboard support */ + +#define XK_Kanji 0xff21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xff22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xff23 /* Start/Stop Conversion */ +#define XK_Henkan 0xff23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xff24 /* to Romaji */ +#define XK_Hiragana 0xff25 /* to Hiragana */ +#define XK_Katakana 0xff26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xff28 /* to Zenkaku */ +#define XK_Hankaku 0xff29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xff2b /* Add to Dictionary */ +#define XK_Massyo 0xff2c /* Delete from Dictionary */ +#define XK_Kana_Lock 0xff2d /* Kana Lock */ +#define XK_Kana_Shift 0xff2e /* Kana Shift */ +#define XK_Eisu_Shift 0xff2f /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xff30 /* Alphanumeric toggle */ +#define XK_Kanji_Bangou 0xff37 /* Codeinput */ +#define XK_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ +#define XK_Mae_Koho 0xff3e /* Previous Candidate */ + +/* 0xff31 thru 0xff3f are under XK_KOREAN */ + +/* Cursor control & motion */ + +#define XK_Home 0xff50 +#define XK_Left 0xff51 /* Move left, left arrow */ +#define XK_Up 0xff52 /* Move up, up arrow */ +#define XK_Right 0xff53 /* Move right, right arrow */ +#define XK_Down 0xff54 /* Move down, down arrow */ +#define XK_Prior 0xff55 /* Prior, previous */ +#define XK_Page_Up 0xff55 +#define XK_Next 0xff56 /* Next */ +#define XK_Page_Down 0xff56 +#define XK_End 0xff57 /* EOL */ +#define XK_Begin 0xff58 /* BOL */ + + +/* Misc functions */ + +#define XK_Select 0xff60 /* Select, mark */ +#define XK_Print 0xff61 +#define XK_Execute 0xff62 /* Execute, run, do */ +#define XK_Insert 0xff63 /* Insert, insert here */ +#define XK_Undo 0xff65 +#define XK_Redo 0xff66 /* Redo, again */ +#define XK_Menu 0xff67 +#define XK_Find 0xff68 /* Find, search */ +#define XK_Cancel 0xff69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xff6a /* Help */ +#define XK_Break 0xff6b +#define XK_Mode_switch 0xff7e /* Character set switch */ +#define XK_script_switch 0xff7e /* Alias for mode_switch */ +#define XK_Num_Lock 0xff7f + +/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ + +#define XK_KP_Space 0xff80 /* Space */ +#define XK_KP_Tab 0xff89 +#define XK_KP_Enter 0xff8d /* Enter */ +#define XK_KP_F1 0xff91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xff92 +#define XK_KP_F3 0xff93 +#define XK_KP_F4 0xff94 +#define XK_KP_Home 0xff95 +#define XK_KP_Left 0xff96 +#define XK_KP_Up 0xff97 +#define XK_KP_Right 0xff98 +#define XK_KP_Down 0xff99 +#define XK_KP_Prior 0xff9a +#define XK_KP_Page_Up 0xff9a +#define XK_KP_Next 0xff9b +#define XK_KP_Page_Down 0xff9b +#define XK_KP_End 0xff9c +#define XK_KP_Begin 0xff9d +#define XK_KP_Insert 0xff9e +#define XK_KP_Delete 0xff9f +#define XK_KP_Equal 0xffbd /* Equals */ +#define XK_KP_Multiply 0xffaa +#define XK_KP_Add 0xffab +#define XK_KP_Separator 0xffac /* Separator, often comma */ +#define XK_KP_Subtract 0xffad +#define XK_KP_Decimal 0xffae +#define XK_KP_Divide 0xffaf + +#define XK_KP_0 0xffb0 +#define XK_KP_1 0xffb1 +#define XK_KP_2 0xffb2 +#define XK_KP_3 0xffb3 +#define XK_KP_4 0xffb4 +#define XK_KP_5 0xffb5 +#define XK_KP_6 0xffb6 +#define XK_KP_7 0xffb7 +#define XK_KP_8 0xffb8 +#define XK_KP_9 0xffb9 + + + +/* + * Auxiliary functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufacturers have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xffbe +#define XK_F2 0xffbf +#define XK_F3 0xffc0 +#define XK_F4 0xffc1 +#define XK_F5 0xffc2 +#define XK_F6 0xffc3 +#define XK_F7 0xffc4 +#define XK_F8 0xffc5 +#define XK_F9 0xffc6 +#define XK_F10 0xffc7 +#define XK_F11 0xffc8 +#define XK_L1 0xffc8 +#define XK_F12 0xffc9 +#define XK_L2 0xffc9 +#define XK_F13 0xffca +#define XK_L3 0xffca +#define XK_F14 0xffcb +#define XK_L4 0xffcb +#define XK_F15 0xffcc +#define XK_L5 0xffcc +#define XK_F16 0xffcd +#define XK_L6 0xffcd +#define XK_F17 0xffce +#define XK_L7 0xffce +#define XK_F18 0xffcf +#define XK_L8 0xffcf +#define XK_F19 0xffd0 +#define XK_L9 0xffd0 +#define XK_F20 0xffd1 +#define XK_L10 0xffd1 +#define XK_F21 0xffd2 +#define XK_R1 0xffd2 +#define XK_F22 0xffd3 +#define XK_R2 0xffd3 +#define XK_F23 0xffd4 +#define XK_R3 0xffd4 +#define XK_F24 0xffd5 +#define XK_R4 0xffd5 +#define XK_F25 0xffd6 +#define XK_R5 0xffd6 +#define XK_F26 0xffd7 +#define XK_R6 0xffd7 +#define XK_F27 0xffd8 +#define XK_R7 0xffd8 +#define XK_F28 0xffd9 +#define XK_R8 0xffd9 +#define XK_F29 0xffda +#define XK_R9 0xffda +#define XK_F30 0xffdb +#define XK_R10 0xffdb +#define XK_F31 0xffdc +#define XK_R11 0xffdc +#define XK_F32 0xffdd +#define XK_R12 0xffdd +#define XK_F33 0xffde +#define XK_R13 0xffde +#define XK_F34 0xffdf +#define XK_R14 0xffdf +#define XK_F35 0xffe0 +#define XK_R15 0xffe0 + +/* Modifiers */ + +#define XK_Shift_L 0xffe1 /* Left shift */ +#define XK_Shift_R 0xffe2 /* Right shift */ +#define XK_Control_L 0xffe3 /* Left control */ +#define XK_Control_R 0xffe4 /* Right control */ +#define XK_Caps_Lock 0xffe5 /* Caps lock */ +#define XK_Shift_Lock 0xffe6 /* Shift lock */ + +#define XK_Meta_L 0xffe7 /* Left meta */ +#define XK_Meta_R 0xffe8 /* Right meta */ +#define XK_Alt_L 0xffe9 /* Left alt */ +#define XK_Alt_R 0xffea /* Right alt */ +#define XK_Super_L 0xffeb /* Left super */ +#define XK_Super_R 0xffec /* Right super */ +#define XK_Hyper_L 0xffed /* Left hyper */ +#define XK_Hyper_R 0xffee /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * Keyboard (XKB) Extension function and modifier keys + * (from Appendix C of "The X Keyboard Extension: Protocol Specification") + * Byte 3 = 0xfe + */ + +#ifdef XK_XKB_KEYS +#define XK_ISO_Lock 0xfe01 +#define XK_ISO_Level2_Latch 0xfe02 +#define XK_ISO_Level3_Shift 0xfe03 +#define XK_ISO_Level3_Latch 0xfe04 +#define XK_ISO_Level3_Lock 0xfe05 +#define XK_ISO_Level5_Shift 0xfe11 +#define XK_ISO_Level5_Latch 0xfe12 +#define XK_ISO_Level5_Lock 0xfe13 +#define XK_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ +#define XK_ISO_Group_Latch 0xfe06 +#define XK_ISO_Group_Lock 0xfe07 +#define XK_ISO_Next_Group 0xfe08 +#define XK_ISO_Next_Group_Lock 0xfe09 +#define XK_ISO_Prev_Group 0xfe0a +#define XK_ISO_Prev_Group_Lock 0xfe0b +#define XK_ISO_First_Group 0xfe0c +#define XK_ISO_First_Group_Lock 0xfe0d +#define XK_ISO_Last_Group 0xfe0e +#define XK_ISO_Last_Group_Lock 0xfe0f + +#define XK_ISO_Left_Tab 0xfe20 +#define XK_ISO_Move_Line_Up 0xfe21 +#define XK_ISO_Move_Line_Down 0xfe22 +#define XK_ISO_Partial_Line_Up 0xfe23 +#define XK_ISO_Partial_Line_Down 0xfe24 +#define XK_ISO_Partial_Space_Left 0xfe25 +#define XK_ISO_Partial_Space_Right 0xfe26 +#define XK_ISO_Set_Margin_Left 0xfe27 +#define XK_ISO_Set_Margin_Right 0xfe28 +#define XK_ISO_Release_Margin_Left 0xfe29 +#define XK_ISO_Release_Margin_Right 0xfe2a +#define XK_ISO_Release_Both_Margins 0xfe2b +#define XK_ISO_Fast_Cursor_Left 0xfe2c +#define XK_ISO_Fast_Cursor_Right 0xfe2d +#define XK_ISO_Fast_Cursor_Up 0xfe2e +#define XK_ISO_Fast_Cursor_Down 0xfe2f +#define XK_ISO_Continuous_Underline 0xfe30 +#define XK_ISO_Discontinuous_Underline 0xfe31 +#define XK_ISO_Emphasize 0xfe32 +#define XK_ISO_Center_Object 0xfe33 +#define XK_ISO_Enter 0xfe34 + +#define XK_dead_grave 0xfe50 +#define XK_dead_acute 0xfe51 +#define XK_dead_circumflex 0xfe52 +#define XK_dead_tilde 0xfe53 +#define XK_dead_perispomeni 0xfe53 /* alias for dead_tilde */ +#define XK_dead_macron 0xfe54 +#define XK_dead_breve 0xfe55 +#define XK_dead_abovedot 0xfe56 +#define XK_dead_diaeresis 0xfe57 +#define XK_dead_abovering 0xfe58 +#define XK_dead_doubleacute 0xfe59 +#define XK_dead_caron 0xfe5a +#define XK_dead_cedilla 0xfe5b +#define XK_dead_ogonek 0xfe5c +#define XK_dead_iota 0xfe5d +#define XK_dead_voiced_sound 0xfe5e +#define XK_dead_semivoiced_sound 0xfe5f +#define XK_dead_belowdot 0xfe60 +#define XK_dead_hook 0xfe61 +#define XK_dead_horn 0xfe62 +#define XK_dead_stroke 0xfe63 +#define XK_dead_abovecomma 0xfe64 +#define XK_dead_psili 0xfe64 /* alias for dead_abovecomma */ +#define XK_dead_abovereversedcomma 0xfe65 +#define XK_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ +#define XK_dead_doublegrave 0xfe66 +#define XK_dead_belowring 0xfe67 +#define XK_dead_belowmacron 0xfe68 +#define XK_dead_belowcircumflex 0xfe69 +#define XK_dead_belowtilde 0xfe6a +#define XK_dead_belowbreve 0xfe6b +#define XK_dead_belowdiaeresis 0xfe6c +#define XK_dead_invertedbreve 0xfe6d +#define XK_dead_belowcomma 0xfe6e +#define XK_dead_currency 0xfe6f + +/* extra dead elements for German T3 layout */ +#define XK_dead_lowline 0xfe90 +#define XK_dead_aboveverticalline 0xfe91 +#define XK_dead_belowverticalline 0xfe92 +#define XK_dead_longsolidusoverlay 0xfe93 + +/* dead vowels for universal syllable entry */ +#define XK_dead_a 0xfe80 +#define XK_dead_A 0xfe81 +#define XK_dead_e 0xfe82 +#define XK_dead_E 0xfe83 +#define XK_dead_i 0xfe84 +#define XK_dead_I 0xfe85 +#define XK_dead_o 0xfe86 +#define XK_dead_O 0xfe87 +#define XK_dead_u 0xfe88 +#define XK_dead_U 0xfe89 +#define XK_dead_small_schwa 0xfe8a +#define XK_dead_capital_schwa 0xfe8b + +#define XK_dead_greek 0xfe8c + +#define XK_First_Virtual_Screen 0xfed0 +#define XK_Prev_Virtual_Screen 0xfed1 +#define XK_Next_Virtual_Screen 0xfed2 +#define XK_Last_Virtual_Screen 0xfed4 +#define XK_Terminate_Server 0xfed5 + +#define XK_AccessX_Enable 0xfe70 +#define XK_AccessX_Feedback_Enable 0xfe71 +#define XK_RepeatKeys_Enable 0xfe72 +#define XK_SlowKeys_Enable 0xfe73 +#define XK_BounceKeys_Enable 0xfe74 +#define XK_StickyKeys_Enable 0xfe75 +#define XK_MouseKeys_Enable 0xfe76 +#define XK_MouseKeys_Accel_Enable 0xfe77 +#define XK_Overlay1_Enable 0xfe78 +#define XK_Overlay2_Enable 0xfe79 +#define XK_AudibleBell_Enable 0xfe7a + +#define XK_Pointer_Left 0xfee0 +#define XK_Pointer_Right 0xfee1 +#define XK_Pointer_Up 0xfee2 +#define XK_Pointer_Down 0xfee3 +#define XK_Pointer_UpLeft 0xfee4 +#define XK_Pointer_UpRight 0xfee5 +#define XK_Pointer_DownLeft 0xfee6 +#define XK_Pointer_DownRight 0xfee7 +#define XK_Pointer_Button_Dflt 0xfee8 +#define XK_Pointer_Button1 0xfee9 +#define XK_Pointer_Button2 0xfeea +#define XK_Pointer_Button3 0xfeeb +#define XK_Pointer_Button4 0xfeec +#define XK_Pointer_Button5 0xfeed +#define XK_Pointer_DblClick_Dflt 0xfeee +#define XK_Pointer_DblClick1 0xfeef +#define XK_Pointer_DblClick2 0xfef0 +#define XK_Pointer_DblClick3 0xfef1 +#define XK_Pointer_DblClick4 0xfef2 +#define XK_Pointer_DblClick5 0xfef3 +#define XK_Pointer_Drag_Dflt 0xfef4 +#define XK_Pointer_Drag1 0xfef5 +#define XK_Pointer_Drag2 0xfef6 +#define XK_Pointer_Drag3 0xfef7 +#define XK_Pointer_Drag4 0xfef8 +#define XK_Pointer_Drag5 0xfefd + +#define XK_Pointer_EnableKeys 0xfef9 +#define XK_Pointer_Accelerate 0xfefa +#define XK_Pointer_DfltBtnNext 0xfefb +#define XK_Pointer_DfltBtnPrev 0xfefc + +/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */ + +#define XK_ch 0xfea0 +#define XK_Ch 0xfea1 +#define XK_CH 0xfea2 +#define XK_c_h 0xfea3 +#define XK_C_h 0xfea4 +#define XK_C_H 0xfea5 + +#endif /* XK_XKB_KEYS */ + +/* + * 3270 Terminal Keys + * Byte 3 = 0xfd + */ + +#ifdef XK_3270 +#define XK_3270_Duplicate 0xfd01 +#define XK_3270_FieldMark 0xfd02 +#define XK_3270_Right2 0xfd03 +#define XK_3270_Left2 0xfd04 +#define XK_3270_BackTab 0xfd05 +#define XK_3270_EraseEOF 0xfd06 +#define XK_3270_EraseInput 0xfd07 +#define XK_3270_Reset 0xfd08 +#define XK_3270_Quit 0xfd09 +#define XK_3270_PA1 0xfd0a +#define XK_3270_PA2 0xfd0b +#define XK_3270_PA3 0xfd0c +#define XK_3270_Test 0xfd0d +#define XK_3270_Attn 0xfd0e +#define XK_3270_CursorBlink 0xfd0f +#define XK_3270_AltCursor 0xfd10 +#define XK_3270_KeyClick 0xfd11 +#define XK_3270_Jump 0xfd12 +#define XK_3270_Ident 0xfd13 +#define XK_3270_Rule 0xfd14 +#define XK_3270_Copy 0xfd15 +#define XK_3270_Play 0xfd16 +#define XK_3270_Setup 0xfd17 +#define XK_3270_Record 0xfd18 +#define XK_3270_ChangeScreen 0xfd19 +#define XK_3270_DeleteWord 0xfd1a +#define XK_3270_ExSelect 0xfd1b +#define XK_3270_CursorSelect 0xfd1c +#define XK_3270_PrintScreen 0xfd1d +#define XK_3270_Enter 0xfd1e +#endif /* XK_3270 */ + +/* + * Latin 1 + * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) + * Byte 3 = 0 + */ +#ifdef XK_LATIN1 +#define XK_space 0x0020 /* U+0020 SPACE */ +#define XK_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ +#define XK_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ +#define XK_numbersign 0x0023 /* U+0023 NUMBER SIGN */ +#define XK_dollar 0x0024 /* U+0024 DOLLAR SIGN */ +#define XK_percent 0x0025 /* U+0025 PERCENT SIGN */ +#define XK_ampersand 0x0026 /* U+0026 AMPERSAND */ +#define XK_apostrophe 0x0027 /* U+0027 APOSTROPHE */ +#define XK_quoteright 0x0027 /* deprecated */ +#define XK_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ +#define XK_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ +#define XK_asterisk 0x002a /* U+002A ASTERISK */ +#define XK_plus 0x002b /* U+002B PLUS SIGN */ +#define XK_comma 0x002c /* U+002C COMMA */ +#define XK_minus 0x002d /* U+002D HYPHEN-MINUS */ +#define XK_period 0x002e /* U+002E FULL STOP */ +#define XK_slash 0x002f /* U+002F SOLIDUS */ +#define XK_0 0x0030 /* U+0030 DIGIT ZERO */ +#define XK_1 0x0031 /* U+0031 DIGIT ONE */ +#define XK_2 0x0032 /* U+0032 DIGIT TWO */ +#define XK_3 0x0033 /* U+0033 DIGIT THREE */ +#define XK_4 0x0034 /* U+0034 DIGIT FOUR */ +#define XK_5 0x0035 /* U+0035 DIGIT FIVE */ +#define XK_6 0x0036 /* U+0036 DIGIT SIX */ +#define XK_7 0x0037 /* U+0037 DIGIT SEVEN */ +#define XK_8 0x0038 /* U+0038 DIGIT EIGHT */ +#define XK_9 0x0039 /* U+0039 DIGIT NINE */ +#define XK_colon 0x003a /* U+003A COLON */ +#define XK_semicolon 0x003b /* U+003B SEMICOLON */ +#define XK_less 0x003c /* U+003C LESS-THAN SIGN */ +#define XK_equal 0x003d /* U+003D EQUALS SIGN */ +#define XK_greater 0x003e /* U+003E GREATER-THAN SIGN */ +#define XK_question 0x003f /* U+003F QUESTION MARK */ +#define XK_at 0x0040 /* U+0040 COMMERCIAL AT */ +#define XK_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ +#define XK_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ +#define XK_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ +#define XK_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ +#define XK_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ +#define XK_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ +#define XK_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ +#define XK_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ +#define XK_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ +#define XK_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ +#define XK_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ +#define XK_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ +#define XK_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ +#define XK_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ +#define XK_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ +#define XK_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ +#define XK_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ +#define XK_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ +#define XK_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ +#define XK_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ +#define XK_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ +#define XK_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ +#define XK_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ +#define XK_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ +#define XK_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ +#define XK_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ +#define XK_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ +#define XK_backslash 0x005c /* U+005C REVERSE SOLIDUS */ +#define XK_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ +#define XK_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ +#define XK_underscore 0x005f /* U+005F LOW LINE */ +#define XK_grave 0x0060 /* U+0060 GRAVE ACCENT */ +#define XK_quoteleft 0x0060 /* deprecated */ +#define XK_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ +#define XK_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ +#define XK_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ +#define XK_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ +#define XK_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ +#define XK_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ +#define XK_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ +#define XK_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ +#define XK_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ +#define XK_j 0x006a /* U+006A LATIN SMALL LETTER J */ +#define XK_k 0x006b /* U+006B LATIN SMALL LETTER K */ +#define XK_l 0x006c /* U+006C LATIN SMALL LETTER L */ +#define XK_m 0x006d /* U+006D LATIN SMALL LETTER M */ +#define XK_n 0x006e /* U+006E LATIN SMALL LETTER N */ +#define XK_o 0x006f /* U+006F LATIN SMALL LETTER O */ +#define XK_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ +#define XK_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ +#define XK_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ +#define XK_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ +#define XK_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ +#define XK_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ +#define XK_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ +#define XK_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ +#define XK_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ +#define XK_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ +#define XK_z 0x007a /* U+007A LATIN SMALL LETTER Z */ +#define XK_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ +#define XK_bar 0x007c /* U+007C VERTICAL LINE */ +#define XK_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ +#define XK_asciitilde 0x007e /* U+007E TILDE */ + +#define XK_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ +#define XK_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ +#define XK_cent 0x00a2 /* U+00A2 CENT SIGN */ +#define XK_sterling 0x00a3 /* U+00A3 POUND SIGN */ +#define XK_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ +#define XK_yen 0x00a5 /* U+00A5 YEN SIGN */ +#define XK_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ +#define XK_section 0x00a7 /* U+00A7 SECTION SIGN */ +#define XK_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ +#define XK_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ +#define XK_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ +#define XK_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XK_notsign 0x00ac /* U+00AC NOT SIGN */ +#define XK_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ +#define XK_registered 0x00ae /* U+00AE REGISTERED SIGN */ +#define XK_macron 0x00af /* U+00AF MACRON */ +#define XK_degree 0x00b0 /* U+00B0 DEGREE SIGN */ +#define XK_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ +#define XK_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ +#define XK_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ +#define XK_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ +#define XK_mu 0x00b5 /* U+00B5 MICRO SIGN */ +#define XK_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ +#define XK_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ +#define XK_cedilla 0x00b8 /* U+00B8 CEDILLA */ +#define XK_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ +#define XK_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ +#define XK_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ +#define XK_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ +#define XK_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ +#define XK_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ +#define XK_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ +#define XK_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ +#define XK_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ +#define XK_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ +#define XK_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ +#define XK_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ +#define XK_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ +#define XK_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ +#define XK_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ +#define XK_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ +#define XK_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ +#define XK_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ +#define XK_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ +#define XK_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ +#define XK_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ +#define XK_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ +#define XK_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ +#define XK_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ +#define XK_Eth 0x00d0 /* deprecated */ +#define XK_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ +#define XK_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ +#define XK_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ +#define XK_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ +#define XK_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ +#define XK_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ +#define XK_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ +#define XK_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XK_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ +#define XK_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ +#define XK_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ +#define XK_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ +#define XK_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ +#define XK_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ +#define XK_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ +#define XK_Thorn 0x00de /* deprecated */ +#define XK_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ +#define XK_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ +#define XK_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ +#define XK_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ +#define XK_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ +#define XK_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ +#define XK_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ +#define XK_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ +#define XK_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ +#define XK_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ +#define XK_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ +#define XK_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ +#define XK_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ +#define XK_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ +#define XK_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ +#define XK_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ +#define XK_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ +#define XK_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ +#define XK_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ +#define XK_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ +#define XK_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ +#define XK_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ +#define XK_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ +#define XK_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ +#define XK_division 0x00f7 /* U+00F7 DIVISION SIGN */ +#define XK_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XK_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ +#define XK_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ +#define XK_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ +#define XK_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ +#define XK_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ +#define XK_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ +#define XK_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ +#define XK_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#ifdef XK_LATIN2 +#define XK_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ +#define XK_breve 0x01a2 /* U+02D8 BREVE */ +#define XK_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ +#define XK_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ +#define XK_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ +#define XK_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ +#define XK_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ +#define XK_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ +#define XK_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ +#define XK_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ +#define XK_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ +#define XK_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ +#define XK_ogonek 0x01b2 /* U+02DB OGONEK */ +#define XK_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ +#define XK_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ +#define XK_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ +#define XK_caron 0x01b7 /* U+02C7 CARON */ +#define XK_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ +#define XK_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ +#define XK_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ +#define XK_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ +#define XK_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ +#define XK_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ +#define XK_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ +#define XK_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ +#define XK_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ +#define XK_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ +#define XK_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ +#define XK_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ +#define XK_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ +#define XK_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ +#define XK_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ +#define XK_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ +#define XK_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ +#define XK_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ +#define XK_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ +#define XK_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ +#define XK_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ +#define XK_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ +#define XK_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ +#define XK_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ +#define XK_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ +#define XK_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ +#define XK_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ +#define XK_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ +#define XK_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ +#define XK_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ +#define XK_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ +#define XK_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ +#define XK_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ +#define XK_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ +#define XK_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ +#define XK_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ +#define XK_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ +#define XK_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ +#define XK_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ +#define XK_abovedot 0x01ff /* U+02D9 DOT ABOVE */ +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#ifdef XK_LATIN3 +#define XK_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ +#define XK_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ +#define XK_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ +#define XK_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ +#define XK_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ +#define XK_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ +#define XK_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ +#define XK_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ +#define XK_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ +#define XK_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ +#define XK_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ +#define XK_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ +#define XK_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ +#define XK_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ +#define XK_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ +#define XK_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ +#define XK_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ +#define XK_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ +#define XK_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ +#define XK_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ +#define XK_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ +#define XK_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#ifdef XK_LATIN4 +#define XK_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ +#define XK_kappa 0x03a2 /* deprecated */ +#define XK_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ +#define XK_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ +#define XK_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ +#define XK_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ +#define XK_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ +#define XK_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ +#define XK_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ +#define XK_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ +#define XK_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ +#define XK_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ +#define XK_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ +#define XK_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ +#define XK_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ +#define XK_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ +#define XK_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ +#define XK_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ +#define XK_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ +#define XK_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ +#define XK_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ +#define XK_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ +#define XK_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ +#define XK_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ +#define XK_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ +#define XK_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ +#define XK_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ +#define XK_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ +#define XK_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ +#define XK_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ +#define XK_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ +#define XK_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ +#define XK_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ +#define XK_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ +#define XK_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ +#define XK_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ +#endif /* XK_LATIN4 */ + +/* + * Latin 8 + */ +#ifdef XK_LATIN8 +#define XK_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ +#define XK_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ +#define XK_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ +#define XK_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ +#define XK_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ +#define XK_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ +#define XK_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ +#define XK_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ +#define XK_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ +#define XK_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ +#define XK_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ +#define XK_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ +#define XK_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ +#define XK_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ +#define XK_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ +#define XK_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ +#define XK_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ +#define XK_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ +#define XK_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ +#define XK_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ +#define XK_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ +#define XK_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ +#define XK_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ +#define XK_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ +#define XK_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ +#define XK_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ +#endif /* XK_LATIN8 */ + +/* + * Latin 9 + * Byte 3 = 0x13 + */ + +#ifdef XK_LATIN9 +#define XK_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ +#define XK_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ +#define XK_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ +#endif /* XK_LATIN9 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#ifdef XK_KATAKANA +#define XK_overline 0x047e /* U+203E OVERLINE */ +#define XK_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ +#define XK_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ +#define XK_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ +#define XK_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ +#define XK_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ +#define XK_kana_middledot 0x04a5 /* deprecated */ +#define XK_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ +#define XK_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ +#define XK_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ +#define XK_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ +#define XK_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ +#define XK_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ +#define XK_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ +#define XK_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ +#define XK_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ +#define XK_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ +#define XK_kana_tu 0x04af /* deprecated */ +#define XK_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ +#define XK_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ +#define XK_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ +#define XK_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ +#define XK_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ +#define XK_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ +#define XK_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ +#define XK_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ +#define XK_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ +#define XK_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ +#define XK_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ +#define XK_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ +#define XK_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ +#define XK_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ +#define XK_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ +#define XK_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ +#define XK_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ +#define XK_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ +#define XK_kana_TI 0x04c1 /* deprecated */ +#define XK_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ +#define XK_kana_TU 0x04c2 /* deprecated */ +#define XK_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ +#define XK_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ +#define XK_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ +#define XK_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ +#define XK_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ +#define XK_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ +#define XK_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ +#define XK_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ +#define XK_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ +#define XK_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ +#define XK_kana_HU 0x04cc /* deprecated */ +#define XK_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ +#define XK_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ +#define XK_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ +#define XK_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ +#define XK_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ +#define XK_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ +#define XK_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ +#define XK_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ +#define XK_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ +#define XK_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ +#define XK_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ +#define XK_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ +#define XK_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ +#define XK_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ +#define XK_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ +#define XK_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ +#define XK_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ +#define XK_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ +#define XK_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ +#define XK_kana_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#ifdef XK_ARABIC +#define XK_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ +#define XK_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ +#define XK_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ +#define XK_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ +#define XK_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ +#define XK_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ +#define XK_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ +#define XK_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ +#define XK_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ +#define XK_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ +#define XK_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ +#define XK_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ +#define XK_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ +#define XK_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ +#define XK_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ +#define XK_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ +#define XK_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ +#define XK_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ +#define XK_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ +#define XK_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ +#define XK_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ +#define XK_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ +#define XK_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ +#define XK_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ +#define XK_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ +#define XK_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ +#define XK_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ +#define XK_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ +#define XK_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ +#define XK_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ +#define XK_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ +#define XK_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ +#define XK_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ +#define XK_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ +#define XK_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ +#define XK_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ +#define XK_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ +#define XK_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ +#define XK_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ +#define XK_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ +#define XK_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ +#define XK_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ +#define XK_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ +#define XK_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ +#define XK_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ +#define XK_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ +#define XK_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ +#define XK_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ +#define XK_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ +#define XK_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ +#define XK_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ +#define XK_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ +#define XK_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ +#define XK_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ +#define XK_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ +#define XK_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ +#define XK_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ +#define XK_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ +#define XK_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ +#define XK_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ +#define XK_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ +#define XK_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ +#define XK_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ +#define XK_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ +#define XK_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ +#define XK_Arabic_heh 0x05e7 /* deprecated */ +#define XK_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ +#define XK_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ +#define XK_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ +#define XK_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ +#define XK_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ +#define XK_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ +#define XK_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ +#define XK_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ +#define XK_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ +#define XK_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ +#define XK_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ +#define XK_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ +#define XK_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ +#define XK_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ +#define XK_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ +#define XK_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ +#define XK_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ +#define XK_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ +#define XK_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ +#define XK_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ +#define XK_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XK_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ +#define XK_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ +#define XK_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ +#define XK_Arabic_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#ifdef XK_CYRILLIC +#define XK_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ +#define XK_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ +#define XK_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ +#define XK_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ +#define XK_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ +#define XK_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ +#define XK_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ +#define XK_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ +#define XK_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ +#define XK_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ +#define XK_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ +#define XK_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ +#define XK_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ +#define XK_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ +#define XK_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ +#define XK_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ +#define XK_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ +#define XK_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ +#define XK_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ +#define XK_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ +#define XK_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ +#define XK_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ + +#define XK_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ +#define XK_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ +#define XK_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ +#define XK_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ +#define XK_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ +#define XK_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ +#define XK_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ +#define XK_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ + +#define XK_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ +#define XK_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ +#define XK_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ +#define XK_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ +#define XK_Ukranian_je 0x06a4 /* deprecated */ +#define XK_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ +#define XK_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XK_Ukranian_i 0x06a6 /* deprecated */ +#define XK_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ +#define XK_Ukranian_yi 0x06a7 /* deprecated */ +#define XK_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ +#define XK_Serbian_je 0x06a8 /* deprecated */ +#define XK_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ +#define XK_Serbian_lje 0x06a9 /* deprecated */ +#define XK_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ +#define XK_Serbian_nje 0x06aa /* deprecated */ +#define XK_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ +#define XK_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ +#define XK_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ +#define XK_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ +#define XK_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ +#define XK_Serbian_dze 0x06af /* deprecated */ +#define XK_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ +#define XK_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ +#define XK_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ +#define XK_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ +#define XK_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ +#define XK_Ukranian_JE 0x06b4 /* deprecated */ +#define XK_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ +#define XK_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ +#define XK_Ukranian_I 0x06b6 /* deprecated */ +#define XK_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ +#define XK_Ukranian_YI 0x06b7 /* deprecated */ +#define XK_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ +#define XK_Serbian_JE 0x06b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ +#define XK_Serbian_LJE 0x06b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ +#define XK_Serbian_NJE 0x06ba /* deprecated */ +#define XK_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ +#define XK_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ +#define XK_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ +#define XK_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ +#define XK_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ +#define XK_Serbian_DZE 0x06bf /* deprecated */ +#define XK_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ +#define XK_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ +#define XK_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ +#define XK_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ +#define XK_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ +#define XK_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ +#define XK_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ +#define XK_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ +#define XK_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ +#define XK_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ +#define XK_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ +#define XK_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ +#define XK_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ +#define XK_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ +#define XK_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ +#define XK_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ +#define XK_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ +#define XK_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ +#define XK_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ +#define XK_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ +#define XK_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ +#define XK_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ +#define XK_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ +#define XK_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ +#define XK_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ +#define XK_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ +#define XK_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ +#define XK_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ +#define XK_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ +#define XK_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ +#define XK_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ +#define XK_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ +#define XK_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ +#define XK_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ +#define XK_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ +#define XK_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ +#define XK_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ +#define XK_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ +#define XK_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ +#define XK_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ +#define XK_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ +#define XK_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ +#define XK_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ +#define XK_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ +#define XK_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ +#define XK_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ +#define XK_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ +#define XK_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ +#define XK_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ +#define XK_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ +#define XK_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ +#define XK_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ +#define XK_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ +#define XK_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ +#define XK_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ +#define XK_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ +#define XK_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ +#define XK_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ +#define XK_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ +#define XK_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ +#define XK_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ +#define XK_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ +#define XK_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ +#define XK_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ +#endif /* XK_CYRILLIC */ + +/* + * Greek + * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) + * Byte 3 = 7 + */ + +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ +#define XK_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ +#define XK_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ +#define XK_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ +#define XK_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ +#define XK_Greek_IOTAdiaeresis 0x07a5 /* old typo */ +#define XK_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ +#define XK_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ +#define XK_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ +#define XK_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ +#define XK_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ +#define XK_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ +#define XK_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ +#define XK_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ +#define XK_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ +#define XK_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ +#define XK_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ +#define XK_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ +#define XK_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ +#define XK_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ +#define XK_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ +#define XK_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ +#define XK_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ +#define XK_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ +#define XK_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ +#define XK_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ +#define XK_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ +#define XK_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ +#define XK_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ +#define XK_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ +#define XK_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ +#define XK_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ +#define XK_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ +#define XK_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XK_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ +#define XK_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ +#define XK_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ +#define XK_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ +#define XK_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ +#define XK_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ +#define XK_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ +#define XK_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ +#define XK_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ +#define XK_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ +#define XK_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ +#define XK_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ +#define XK_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ +#define XK_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ +#define XK_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ +#define XK_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ +#define XK_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ +#define XK_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ +#define XK_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ +#define XK_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ +#define XK_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ +#define XK_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ +#define XK_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ +#define XK_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ +#define XK_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XK_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ +#define XK_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ +#define XK_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ +#define XK_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ +#define XK_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ +#define XK_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ +#define XK_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ +#define XK_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ +#define XK_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ +#define XK_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ +#define XK_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ +#define XK_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ +#define XK_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ +#define XK_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ +#define XK_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ +#define XK_Greek_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) + * Byte 3 = 8 + */ + +#ifdef XK_TECHNICAL +#define XK_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ +#define XK_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ +#define XK_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ +#define XK_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ +#define XK_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ +#define XK_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ +#define XK_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ +#define XK_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ +#define XK_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ +#define XK_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ +#define XK_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ +#define XK_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ +#define XK_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ +#define XK_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ +#define XK_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ +#define XK_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ +#define XK_topleftsummation 0x08b1 +#define XK_botleftsummation 0x08b2 +#define XK_topvertsummationconnector 0x08b3 +#define XK_botvertsummationconnector 0x08b4 +#define XK_toprightsummation 0x08b5 +#define XK_botrightsummation 0x08b6 +#define XK_rightmiddlesummation 0x08b7 +#define XK_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ +#define XK_notequal 0x08bd /* U+2260 NOT EQUAL TO */ +#define XK_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ +#define XK_integral 0x08bf /* U+222B INTEGRAL */ +#define XK_therefore 0x08c0 /* U+2234 THEREFORE */ +#define XK_variation 0x08c1 /* U+221D PROPORTIONAL TO */ +#define XK_infinity 0x08c2 /* U+221E INFINITY */ +#define XK_nabla 0x08c5 /* U+2207 NABLA */ +#define XK_approximate 0x08c8 /* U+223C TILDE OPERATOR */ +#define XK_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ +#define XK_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ +#define XK_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ +#define XK_identical 0x08cf /* U+2261 IDENTICAL TO */ +#define XK_radical 0x08d6 /* U+221A SQUARE ROOT */ +#define XK_includedin 0x08da /* U+2282 SUBSET OF */ +#define XK_includes 0x08db /* U+2283 SUPERSET OF */ +#define XK_intersection 0x08dc /* U+2229 INTERSECTION */ +#define XK_union 0x08dd /* U+222A UNION */ +#define XK_logicaland 0x08de /* U+2227 LOGICAL AND */ +#define XK_logicalor 0x08df /* U+2228 LOGICAL OR */ +#define XK_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ +#define XK_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ +#define XK_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ +#define XK_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ +#define XK_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ +#define XK_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ +#endif /* XK_TECHNICAL */ + +/* + * Special + * (from the DEC VT100 Special Graphics Character Set) + * Byte 3 = 9 + */ + +#ifdef XK_SPECIAL +#define XK_blank 0x09df +#define XK_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ +#define XK_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ +#define XK_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ +#define XK_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ +#define XK_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ +#define XK_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ +#define XK_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ +#define XK_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ +#define XK_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ +#define XK_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ +#define XK_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ +#define XK_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ +#define XK_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ +#define XK_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ +#define XK_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ +#define XK_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ +#define XK_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ +#define XK_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ +#define XK_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ +#define XK_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ +#define XK_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ +#define XK_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ +#define XK_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ +#endif /* XK_SPECIAL */ + +/* + * Publishing + * (these are probably from a long forgotten DEC Publishing + * font that once shipped with DECwrite) + * Byte 3 = 0x0a + */ + +#ifdef XK_PUBLISHING +#define XK_emspace 0x0aa1 /* U+2003 EM SPACE */ +#define XK_enspace 0x0aa2 /* U+2002 EN SPACE */ +#define XK_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ +#define XK_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ +#define XK_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ +#define XK_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ +#define XK_thinspace 0x0aa7 /* U+2009 THIN SPACE */ +#define XK_hairspace 0x0aa8 /* U+200A HAIR SPACE */ +#define XK_emdash 0x0aa9 /* U+2014 EM DASH */ +#define XK_endash 0x0aaa /* U+2013 EN DASH */ +#define XK_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ +#define XK_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ +#define XK_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ +#define XK_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ +#define XK_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ +#define XK_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ +#define XK_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ +#define XK_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ +#define XK_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ +#define XK_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ +#define XK_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ +#define XK_careof 0x0ab8 /* U+2105 CARE OF */ +#define XK_figdash 0x0abb /* U+2012 FIGURE DASH */ +#define XK_leftanglebracket 0x0abc /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ +#define XK_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ +#define XK_rightanglebracket 0x0abe /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ +#define XK_marker 0x0abf +#define XK_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ +#define XK_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ +#define XK_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ +#define XK_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ +#define XK_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ +#define XK_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ +#define XK_trademarkincircle 0x0acb +#define XK_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ +#define XK_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ +#define XK_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ +#define XK_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ +#define XK_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ +#define XK_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ +#define XK_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ +#define XK_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ +#define XK_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ +#define XK_permille 0x0ad5 /* U+2030 PER MILLE SIGN */ +#define XK_minutes 0x0ad6 /* U+2032 PRIME */ +#define XK_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ +#define XK_latincross 0x0ad9 /* U+271D LATIN CROSS */ +#define XK_hexagram 0x0ada +#define XK_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ +#define XK_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ +#define XK_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ +#define XK_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ +#define XK_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ +#define XK_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ +#define XK_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ +#define XK_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ +#define XK_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ +#define XK_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ +#define XK_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ +#define XK_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ +#define XK_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ +#define XK_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ +#define XK_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ +#define XK_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ +#define XK_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ +#define XK_club 0x0aec /* U+2663 BLACK CLUB SUIT */ +#define XK_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ +#define XK_heart 0x0aee /* U+2665 BLACK HEART SUIT */ +#define XK_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ +#define XK_dagger 0x0af1 /* U+2020 DAGGER */ +#define XK_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ +#define XK_checkmark 0x0af3 /* U+2713 CHECK MARK */ +#define XK_ballotcross 0x0af4 /* U+2717 BALLOT X */ +#define XK_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ +#define XK_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ +#define XK_malesymbol 0x0af7 /* U+2642 MALE SIGN */ +#define XK_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ +#define XK_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ +#define XK_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ +#define XK_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ +#define XK_caret 0x0afc /* U+2038 CARET */ +#define XK_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ +#define XK_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ +#define XK_cursor 0x0aff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = 0x0b + */ + +#ifdef XK_APL +#define XK_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ +#define XK_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ +#define XK_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ +#define XK_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ +#define XK_overbar 0x0bc0 /*(U+00AF MACRON)*/ +#define XK_downtack 0x0bc2 /* U+22A4 DOWN TACK */ +#define XK_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ +#define XK_downstile 0x0bc4 /* U+230A LEFT FLOOR */ +#define XK_underbar 0x0bc6 /*(U+005F LOW LINE)*/ +#define XK_jot 0x0bca /* U+2218 RING OPERATOR */ +#define XK_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ +#define XK_uptack 0x0bce /* U+22A5 UP TACK */ +#define XK_circle 0x0bcf /* U+25CB WHITE CIRCLE */ +#define XK_upstile 0x0bd3 /* U+2308 LEFT CEILING */ +#define XK_downshoe 0x0bd6 /*(U+222A UNION)*/ +#define XK_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ +#define XK_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ +#define XK_lefttack 0x0bdc /* U+22A3 LEFT TACK */ +#define XK_righttack 0x0bfc /* U+22A2 RIGHT TACK */ +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = 0x0c + */ + +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ +#define XK_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ +#define XK_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ +#define XK_hebrew_beth 0x0ce1 /* deprecated */ +#define XK_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ +#define XK_hebrew_gimmel 0x0ce2 /* deprecated */ +#define XK_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ +#define XK_hebrew_daleth 0x0ce3 /* deprecated */ +#define XK_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ +#define XK_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ +#define XK_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ +#define XK_hebrew_zayin 0x0ce6 /* deprecated */ +#define XK_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ +#define XK_hebrew_het 0x0ce7 /* deprecated */ +#define XK_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ +#define XK_hebrew_teth 0x0ce8 /* deprecated */ +#define XK_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ +#define XK_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ +#define XK_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ +#define XK_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ +#define XK_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ +#define XK_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ +#define XK_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ +#define XK_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ +#define XK_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ +#define XK_hebrew_samekh 0x0cf1 /* deprecated */ +#define XK_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ +#define XK_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ +#define XK_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ +#define XK_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ +#define XK_hebrew_finalzadi 0x0cf5 /* deprecated */ +#define XK_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ +#define XK_hebrew_zadi 0x0cf6 /* deprecated */ +#define XK_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ +#define XK_hebrew_kuf 0x0cf7 /* deprecated */ +#define XK_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ +#define XK_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ +#define XK_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ +#define XK_hebrew_taf 0x0cfa /* deprecated */ +#define XK_Hebrew_switch 0xff7e /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + +/* + * Thai + * Byte 3 = 0x0d + */ + +#ifdef XK_THAI +#define XK_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ +#define XK_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ +#define XK_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ +#define XK_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ +#define XK_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ +#define XK_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ +#define XK_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ +#define XK_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ +#define XK_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ +#define XK_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ +#define XK_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ +#define XK_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ +#define XK_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ +#define XK_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ +#define XK_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ +#define XK_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ +#define XK_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ +#define XK_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ +#define XK_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ +#define XK_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ +#define XK_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ +#define XK_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ +#define XK_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ +#define XK_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ +#define XK_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ +#define XK_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ +#define XK_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ +#define XK_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ +#define XK_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ +#define XK_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ +#define XK_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ +#define XK_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ +#define XK_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ +#define XK_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ +#define XK_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ +#define XK_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ +#define XK_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ +#define XK_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ +#define XK_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ +#define XK_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ +#define XK_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ +#define XK_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ +#define XK_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ +#define XK_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ +#define XK_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ +#define XK_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ +#define XK_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ +#define XK_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ +#define XK_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ +#define XK_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ +#define XK_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ +#define XK_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ +#define XK_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ +#define XK_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ +#define XK_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ +#define XK_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ +#define XK_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ +#define XK_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ +#define XK_Thai_maihanakat_maitho 0x0dde +#define XK_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ +#define XK_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ +#define XK_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ +#define XK_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ +#define XK_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ +#define XK_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ +#define XK_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ +#define XK_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ +#define XK_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ +#define XK_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ +#define XK_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ +#define XK_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ +#define XK_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ +#define XK_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ +#define XK_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ +#define XK_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ +#define XK_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ +#define XK_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ +#define XK_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ +#define XK_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ +#define XK_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ +#define XK_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ +#define XK_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ +#define XK_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ +#define XK_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ +#endif /* XK_THAI */ + +/* + * Korean + * Byte 3 = 0x0e + */ + +#ifdef XK_KOREAN + +#define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */ +#define XK_Hangul_Start 0xff32 /* Hangul start */ +#define XK_Hangul_End 0xff33 /* Hangul end, English start */ +#define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ +#define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ +#define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ +#define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */ +#define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */ +#define XK_Hangul_Banja 0xff39 /* Banja mode */ +#define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ +#define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ +#define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */ +#define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ +#define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ +#define XK_Hangul_Special 0xff3f /* Special symbols */ +#define XK_Hangul_switch 0xff7e /* Alias for mode_switch */ + +/* Hangul Consonant Characters */ +#define XK_Hangul_Kiyeog 0x0ea1 +#define XK_Hangul_SsangKiyeog 0x0ea2 +#define XK_Hangul_KiyeogSios 0x0ea3 +#define XK_Hangul_Nieun 0x0ea4 +#define XK_Hangul_NieunJieuj 0x0ea5 +#define XK_Hangul_NieunHieuh 0x0ea6 +#define XK_Hangul_Dikeud 0x0ea7 +#define XK_Hangul_SsangDikeud 0x0ea8 +#define XK_Hangul_Rieul 0x0ea9 +#define XK_Hangul_RieulKiyeog 0x0eaa +#define XK_Hangul_RieulMieum 0x0eab +#define XK_Hangul_RieulPieub 0x0eac +#define XK_Hangul_RieulSios 0x0ead +#define XK_Hangul_RieulTieut 0x0eae +#define XK_Hangul_RieulPhieuf 0x0eaf +#define XK_Hangul_RieulHieuh 0x0eb0 +#define XK_Hangul_Mieum 0x0eb1 +#define XK_Hangul_Pieub 0x0eb2 +#define XK_Hangul_SsangPieub 0x0eb3 +#define XK_Hangul_PieubSios 0x0eb4 +#define XK_Hangul_Sios 0x0eb5 +#define XK_Hangul_SsangSios 0x0eb6 +#define XK_Hangul_Ieung 0x0eb7 +#define XK_Hangul_Jieuj 0x0eb8 +#define XK_Hangul_SsangJieuj 0x0eb9 +#define XK_Hangul_Cieuc 0x0eba +#define XK_Hangul_Khieuq 0x0ebb +#define XK_Hangul_Tieut 0x0ebc +#define XK_Hangul_Phieuf 0x0ebd +#define XK_Hangul_Hieuh 0x0ebe + +/* Hangul Vowel Characters */ +#define XK_Hangul_A 0x0ebf +#define XK_Hangul_AE 0x0ec0 +#define XK_Hangul_YA 0x0ec1 +#define XK_Hangul_YAE 0x0ec2 +#define XK_Hangul_EO 0x0ec3 +#define XK_Hangul_E 0x0ec4 +#define XK_Hangul_YEO 0x0ec5 +#define XK_Hangul_YE 0x0ec6 +#define XK_Hangul_O 0x0ec7 +#define XK_Hangul_WA 0x0ec8 +#define XK_Hangul_WAE 0x0ec9 +#define XK_Hangul_OE 0x0eca +#define XK_Hangul_YO 0x0ecb +#define XK_Hangul_U 0x0ecc +#define XK_Hangul_WEO 0x0ecd +#define XK_Hangul_WE 0x0ece +#define XK_Hangul_WI 0x0ecf +#define XK_Hangul_YU 0x0ed0 +#define XK_Hangul_EU 0x0ed1 +#define XK_Hangul_YI 0x0ed2 +#define XK_Hangul_I 0x0ed3 + +/* Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_Kiyeog 0x0ed4 +#define XK_Hangul_J_SsangKiyeog 0x0ed5 +#define XK_Hangul_J_KiyeogSios 0x0ed6 +#define XK_Hangul_J_Nieun 0x0ed7 +#define XK_Hangul_J_NieunJieuj 0x0ed8 +#define XK_Hangul_J_NieunHieuh 0x0ed9 +#define XK_Hangul_J_Dikeud 0x0eda +#define XK_Hangul_J_Rieul 0x0edb +#define XK_Hangul_J_RieulKiyeog 0x0edc +#define XK_Hangul_J_RieulMieum 0x0edd +#define XK_Hangul_J_RieulPieub 0x0ede +#define XK_Hangul_J_RieulSios 0x0edf +#define XK_Hangul_J_RieulTieut 0x0ee0 +#define XK_Hangul_J_RieulPhieuf 0x0ee1 +#define XK_Hangul_J_RieulHieuh 0x0ee2 +#define XK_Hangul_J_Mieum 0x0ee3 +#define XK_Hangul_J_Pieub 0x0ee4 +#define XK_Hangul_J_PieubSios 0x0ee5 +#define XK_Hangul_J_Sios 0x0ee6 +#define XK_Hangul_J_SsangSios 0x0ee7 +#define XK_Hangul_J_Ieung 0x0ee8 +#define XK_Hangul_J_Jieuj 0x0ee9 +#define XK_Hangul_J_Cieuc 0x0eea +#define XK_Hangul_J_Khieuq 0x0eeb +#define XK_Hangul_J_Tieut 0x0eec +#define XK_Hangul_J_Phieuf 0x0eed +#define XK_Hangul_J_Hieuh 0x0eee + +/* Ancient Hangul Consonant Characters */ +#define XK_Hangul_RieulYeorinHieuh 0x0eef +#define XK_Hangul_SunkyeongeumMieum 0x0ef0 +#define XK_Hangul_SunkyeongeumPieub 0x0ef1 +#define XK_Hangul_PanSios 0x0ef2 +#define XK_Hangul_KkogjiDalrinIeung 0x0ef3 +#define XK_Hangul_SunkyeongeumPhieuf 0x0ef4 +#define XK_Hangul_YeorinHieuh 0x0ef5 + +/* Ancient Hangul Vowel Characters */ +#define XK_Hangul_AraeA 0x0ef6 +#define XK_Hangul_AraeAE 0x0ef7 + +/* Ancient Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_PanSios 0x0ef8 +#define XK_Hangul_J_KkogjiDalrinIeung 0x0ef9 +#define XK_Hangul_J_YeorinHieuh 0x0efa + +/* Korean currency symbol */ +#define XK_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ + +#endif /* XK_KOREAN */ + +/* + * Armenian + */ + +#ifdef XK_ARMENIAN +#define XK_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ +#define XK_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XK_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ +#define XK_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ +#define XK_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ +#define XK_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XK_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ +#define XK_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XK_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ +#define XK_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XK_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ +#define XK_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XK_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ +#define XK_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ +#define XK_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ +#define XK_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ +#define XK_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ +#define XK_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ +#define XK_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ +#define XK_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ +#define XK_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ +#define XK_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ +#define XK_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ +#define XK_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ +#define XK_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ +#define XK_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ +#define XK_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ +#define XK_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ +#define XK_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ +#define XK_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ +#define XK_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ +#define XK_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ +#define XK_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ +#define XK_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ +#define XK_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ +#define XK_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ +#define XK_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ +#define XK_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ +#define XK_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ +#define XK_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ +#define XK_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ +#define XK_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ +#define XK_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ +#define XK_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ +#define XK_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ +#define XK_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ +#define XK_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ +#define XK_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ +#define XK_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ +#define XK_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ +#define XK_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ +#define XK_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ +#define XK_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ +#define XK_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ +#define XK_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ +#define XK_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ +#define XK_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ +#define XK_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ +#define XK_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ +#define XK_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ +#define XK_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ +#define XK_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ +#define XK_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ +#define XK_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ +#define XK_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ +#define XK_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ +#define XK_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ +#define XK_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ +#define XK_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ +#define XK_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ +#define XK_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ +#define XK_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ +#define XK_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ +#define XK_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ +#define XK_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ +#define XK_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ +#define XK_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ +#define XK_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ +#define XK_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ +#define XK_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ +#define XK_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ +#define XK_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ +#define XK_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ +#define XK_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ +#define XK_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ +#define XK_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ +#define XK_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ +#define XK_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ +#define XK_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ +#define XK_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ +#endif /* XK_ARMENIAN */ + +/* + * Georgian + */ + +#ifdef XK_GEORGIAN +#define XK_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ +#define XK_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ +#define XK_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ +#define XK_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ +#define XK_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ +#define XK_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ +#define XK_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ +#define XK_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ +#define XK_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ +#define XK_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ +#define XK_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ +#define XK_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ +#define XK_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ +#define XK_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ +#define XK_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ +#define XK_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ +#define XK_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ +#define XK_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ +#define XK_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ +#define XK_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ +#define XK_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ +#define XK_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ +#define XK_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ +#define XK_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ +#define XK_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ +#define XK_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ +#define XK_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ +#define XK_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ +#define XK_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ +#define XK_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ +#define XK_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ +#define XK_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ +#define XK_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ +#define XK_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ +#define XK_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ +#define XK_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ +#define XK_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ +#define XK_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ +#define XK_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ +#endif /* XK_GEORGIAN */ + +/* + * Azeri (and other Turkic or Caucasian languages) + */ + +#ifdef XK_CAUCASUS +/* latin */ +#define XK_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ +#define XK_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ +#define XK_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ +#define XK_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ +#define XK_Ocaron 0x10001d1 /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */ +#define XK_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ +#define XK_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ +#define XK_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ +#define XK_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ +#define XK_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ +#define XK_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ +#define XK_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ +#define XK_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ +#define XK_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ +#define XK_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */ +#define XK_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */ +/* those are not really Caucasus */ +/* For Inupiak */ +#define XK_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ +#define XK_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ +#endif /* XK_CAUCASUS */ + +/* + * Vietnamese + */ + +#ifdef XK_VIETNAMESE +#define XK_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ +#define XK_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ +#define XK_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ +#define XK_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ +#define XK_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XK_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ +#define XK_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XK_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ +#define XK_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XK_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ +#define XK_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ +#define XK_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ +#define XK_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ +#define XK_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ +#define XK_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XK_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ +#define XK_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ +#define XK_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ +#define XK_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ +#define XK_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ +#define XK_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ +#define XK_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ +#define XK_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ +#define XK_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ +#define XK_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ +#define XK_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ +#define XK_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XK_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ +#define XK_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XK_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ +#define XK_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XK_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ +#define XK_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ +#define XK_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ +#define XK_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ +#define XK_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ +#define XK_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ +#define XK_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ +#define XK_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ +#define XK_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ +#define XK_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XK_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ +#define XK_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XK_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ +#define XK_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ +#define XK_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XK_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ +#define XK_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ +#define XK_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ +#define XK_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ +#define XK_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ +#define XK_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ +#define XK_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ +#define XK_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ +#define XK_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ +#define XK_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ +#define XK_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ +#define XK_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ +#define XK_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ +#define XK_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ +#define XK_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ +#define XK_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ +#define XK_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ +#define XK_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ +#define XK_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ +#define XK_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ +#define XK_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ +#define XK_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ +#define XK_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ +#define XK_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ +#define XK_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ +#define XK_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ +#define XK_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ +#define XK_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ +#define XK_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ +#define XK_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ +#define XK_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ +#define XK_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ +#define XK_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ +#define XK_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ +#define XK_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ +#define XK_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ + +#endif /* XK_VIETNAMESE */ + +#ifdef XK_CURRENCY +#define XK_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ +#define XK_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ +#define XK_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ +#define XK_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ +#define XK_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ +#define XK_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ +#define XK_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ +#define XK_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ +#define XK_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ +#define XK_WonSign 0x10020a9 /* U+20A9 WON SIGN */ +#define XK_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ +#define XK_DongSign 0x10020ab /* U+20AB DONG SIGN */ +#define XK_EuroSign 0x20ac /* U+20AC EURO SIGN */ +#endif /* XK_CURRENCY */ + +#ifdef XK_MATHEMATICAL +/* one, two and three are defined above. */ +#define XK_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ +#define XK_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ +#define XK_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ +#define XK_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ +#define XK_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ +#define XK_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ +#define XK_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ +#define XK_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ +#define XK_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ +#define XK_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ +#define XK_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ +#define XK_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ +#define XK_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ +#define XK_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ +#define XK_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ +#define XK_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ +#define XK_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ +#define XK_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ +#define XK_emptyset 0x1002205 /* U+2205 NULL SET */ +#define XK_elementof 0x1002208 /* U+2208 ELEMENT OF */ +#define XK_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ +#define XK_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ +#define XK_squareroot 0x100221A /* U+221A SQUARE ROOT */ +#define XK_cuberoot 0x100221B /* U+221B CUBE ROOT */ +#define XK_fourthroot 0x100221C /* U+221C FOURTH ROOT */ +#define XK_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ +#define XK_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ +#define XK_because 0x1002235 /* U+2235 BECAUSE */ +#define XK_approxeq 0x1002248 /* U+2245 ALMOST EQUAL TO */ +#define XK_notapproxeq 0x1002247 /* U+2247 NOT ALMOST EQUAL TO */ +#define XK_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ +#define XK_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ +#endif /* XK_MATHEMATICAL */ + +#ifdef XK_BRAILLE +#define XK_braille_dot_1 0xfff1 +#define XK_braille_dot_2 0xfff2 +#define XK_braille_dot_3 0xfff3 +#define XK_braille_dot_4 0xfff4 +#define XK_braille_dot_5 0xfff5 +#define XK_braille_dot_6 0xfff6 +#define XK_braille_dot_7 0xfff7 +#define XK_braille_dot_8 0xfff8 +#define XK_braille_dot_9 0xfff9 +#define XK_braille_dot_10 0xfffa +#define XK_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ +#define XK_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ +#define XK_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ +#define XK_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ +#define XK_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ +#define XK_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ +#define XK_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ +#define XK_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ +#define XK_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ +#define XK_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ +#define XK_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ +#define XK_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ +#define XK_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ +#define XK_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ +#define XK_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ +#define XK_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ +#define XK_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ +#define XK_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ +#define XK_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ +#define XK_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ +#define XK_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ +#define XK_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ +#define XK_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ +#define XK_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ +#define XK_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ +#define XK_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ +#define XK_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ +#define XK_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ +#define XK_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ +#define XK_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ +#define XK_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ +#define XK_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ +#define XK_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ +#define XK_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ +#define XK_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ +#define XK_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ +#define XK_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ +#define XK_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ +#define XK_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ +#define XK_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ +#define XK_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ +#define XK_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ +#define XK_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ +#define XK_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ +#define XK_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ +#define XK_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ +#define XK_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ +#define XK_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ +#define XK_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ +#define XK_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ +#define XK_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ +#define XK_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ +#define XK_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ +#define XK_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ +#define XK_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ +#define XK_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ +#define XK_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ +#define XK_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ +#define XK_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ +#define XK_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ +#define XK_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ +#define XK_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ +#define XK_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ +#define XK_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ +#define XK_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ +#define XK_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ +#define XK_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ +#define XK_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ +#define XK_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ +#define XK_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ +#define XK_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ +#define XK_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ +#define XK_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ +#define XK_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ +#define XK_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ +#define XK_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ +#define XK_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ +#define XK_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ +#define XK_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ +#define XK_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ +#define XK_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ +#define XK_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ +#define XK_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ +#define XK_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ +#define XK_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ +#define XK_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ +#define XK_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ +#define XK_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ +#define XK_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ +#define XK_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ +#define XK_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ +#define XK_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ +#define XK_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ +#define XK_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ +#define XK_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ +#define XK_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ +#define XK_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ +#define XK_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ +#define XK_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ +#define XK_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ +#define XK_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ +#define XK_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ +#define XK_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ +#define XK_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ +#define XK_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ +#define XK_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ +#define XK_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ +#define XK_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ +#define XK_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ +#define XK_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ +#define XK_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ +#define XK_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ +#define XK_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ +#define XK_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ +#define XK_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ +#define XK_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ +#define XK_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ +#define XK_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ +#define XK_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ +#define XK_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ +#define XK_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ +#define XK_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ +#define XK_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ +#define XK_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ +#define XK_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ +#define XK_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ +#define XK_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ +#define XK_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ +#define XK_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ +#define XK_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ +#define XK_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ +#define XK_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ +#define XK_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ +#define XK_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ +#define XK_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ +#define XK_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ +#define XK_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ +#define XK_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ +#define XK_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ +#define XK_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ +#define XK_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ +#define XK_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ +#define XK_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ +#define XK_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ +#define XK_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ +#define XK_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ +#define XK_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ +#define XK_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ +#define XK_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ +#define XK_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ +#define XK_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ +#define XK_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ +#define XK_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ +#define XK_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ +#define XK_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ +#define XK_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ +#define XK_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ +#define XK_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ +#define XK_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ +#define XK_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ +#define XK_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ +#define XK_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ +#define XK_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ +#define XK_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ +#define XK_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ +#define XK_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ +#define XK_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ +#define XK_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ +#define XK_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ +#define XK_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ +#define XK_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ +#define XK_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ +#define XK_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ +#define XK_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ +#define XK_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ +#define XK_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ +#define XK_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ +#define XK_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ +#define XK_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ +#define XK_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ +#define XK_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ +#define XK_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ +#define XK_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ +#define XK_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ +#define XK_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ +#define XK_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ +#define XK_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ +#define XK_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ +#define XK_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ +#define XK_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ +#define XK_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ +#define XK_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ +#define XK_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ +#define XK_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ +#define XK_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ +#define XK_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ +#define XK_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ +#define XK_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ +#define XK_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ +#define XK_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ +#define XK_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ +#define XK_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ +#define XK_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ +#define XK_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ +#define XK_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ +#define XK_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ +#define XK_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ +#define XK_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ +#define XK_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ +#define XK_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ +#define XK_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ +#define XK_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ +#define XK_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ +#define XK_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ +#define XK_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ +#define XK_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ +#define XK_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ +#define XK_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ +#define XK_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ +#define XK_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ +#define XK_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ +#define XK_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ +#define XK_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ +#define XK_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ +#define XK_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ +#define XK_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ +#define XK_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ +#define XK_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ +#define XK_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ +#define XK_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ +#define XK_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ +#define XK_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ +#define XK_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ +#define XK_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ +#define XK_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ +#define XK_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ +#define XK_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ +#define XK_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ +#define XK_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ +#define XK_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ +#define XK_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ +#define XK_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ +#define XK_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ +#define XK_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ +#define XK_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ +#define XK_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ +#define XK_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ +#define XK_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ +#define XK_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ +#define XK_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ +#define XK_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ +#define XK_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ +#define XK_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ +#define XK_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ +#define XK_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ +#define XK_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ +#endif /* XK_BRAILLE */ + +/* + * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) + * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html + */ + +#ifdef XK_SINHALA +#define XK_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ +#define XK_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ +#define XK_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ +#define XK_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ +#define XK_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ +#define XK_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ +#define XK_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ +#define XK_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ +#define XK_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ +#define XK_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ +#define XK_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ +#define XK_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ +#define XK_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ +#define XK_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ +#define XK_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ +#define XK_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ +#define XK_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ +#define XK_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ +#define XK_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ +#define XK_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ +#define XK_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ +#define XK_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ +#define XK_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ +#define XK_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ +#define XK_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ +#define XK_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ +#define XK_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ +#define XK_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ +#define XK_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ +#define XK_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ +#define XK_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ +#define XK_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ +#define XK_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ +#define XK_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ +#define XK_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ +#define XK_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ +#define XK_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ +#define XK_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ +#define XK_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ +#define XK_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ +#define XK_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ +#define XK_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ +#define XK_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ +#define XK_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ +#define XK_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ +#define XK_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ +#define XK_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ +#define XK_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ +#define XK_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ +#define XK_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ +#define XK_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ +#define XK_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ +#define XK_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ +#define XK_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ +#define XK_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ +#define XK_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ +#define XK_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ +#define XK_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ +#define XK_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ +#define XK_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ +#define XK_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ +#define XK_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ +#define XK_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ +#define XK_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ +#define XK_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ +#define XK_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ +#define XK_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ +#define XK_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ +#define XK_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ +#define XK_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ +#define XK_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ +#define XK_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ +#define XK_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ +#define XK_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ +#define XK_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ +#define XK_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ +#define XK_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ +#define XK_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ +#define XK_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ +#define XK_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ +#endif /* XK_SINHALA */ diff --git a/src/lib_armv7hf/crossARMv7hf-libjpeg b/src/lib_armv7hf/crossARMv7hf-libjpeg new file mode 100755 index 0000000..aaa43ac --- /dev/null +++ b/src/lib_armv7hf/crossARMv7hf-libjpeg @@ -0,0 +1,4 @@ +CC=../src/arm-linux-armv7hf-gcc CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8" ./configure --host=arm-linux-gnueabihf --prefix=/tmp/libjpeg --libdir=/home/petermaierh/work/dxlAPRS/src/lib_armv7hf --includedir=/home/petermaierh/work/dxlAPRS/src/lib_armv7hf +CC=../src/arm-linux-armv7hf-gcc CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8" make +CC=../src/arm-linux-armv7hf-gcc CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8" make install + diff --git a/src/lib_armv7hf/crossARMv7hf-libpng b/src/lib_armv7hf/crossARMv7hf-libpng new file mode 100755 index 0000000..36babb6 --- /dev/null +++ b/src/lib_armv7hf/crossARMv7hf-libpng @@ -0,0 +1,33 @@ +#!/bin/bash + +# architecture prefix +ARCH="arm-linux-gnueabihf" + +# path to the toolchain and kernel base +TOOL_PATH=/home/petermaierh/gcc-linaro-arm-linux-gnueabihf-4.8-2014-07-1 + +# path to the toolchain base +BASE_PATH=$TOOL_PATH + +# cumulative toolchain prefix +PREFIX=$BASE_PATH/bin/$ARCH + +export CC=$PREFIX-gcc +export CXX=$PREFIX-g++ +export LD=$PREFIX-ld +export NM="$PREFIX-nm -B" +export AR=$PREFIX-ar +export RANLIB=$PREFIX-ranlib +export STRIP=$PREFIX-strip +export OBJCOPY=$PREFIX-objcopy +export LN_S="ln -s" + +export CFLAGS="-Wall -O3 -funroll-loops -march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 -I$BASE_PATH/include -I../zlib-1.2.8" +export CPPFLAGS="-I$BASE_PATH/include" +export CXXFLAGS="" + +export LDFLAGS="-L$BASE_PATH/lib -L$BASE_PATH/$ARCH/lib -L$BASE_PATH/lib/gcc/arm-linux-gnueabihf/4.8.2 -L../zlib-1.2.8" + +./configure --host=$ARCH --prefix=/tmp/libpng --libdir=/home/petermaierh/work/dxlAPRS/src/lib_armv7hf --includedir=/home/petermaierh/work/dxlAPRS/src/lib_armv7hf +make +make install \ No newline at end of file diff --git a/src/lib_armv7hf/crossARMv7hf-zlib b/src/lib_armv7hf/crossARMv7hf-zlib new file mode 100755 index 0000000..a702ffc --- /dev/null +++ b/src/lib_armv7hf/crossARMv7hf-zlib @@ -0,0 +1,4 @@ +#!/bin/sh +CC=../src/arm-linux-armv7hf-gcc CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8" ./configure +CC=../src/arm-linux-armv7hf-gcc CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8" make + diff --git a/src/lib_armv7hf/jconfig.h b/src/lib_armv7hf/jconfig.h new file mode 100644 index 0000000..966b1d5 --- /dev/null +++ b/src/lib_armv7hf/jconfig.h @@ -0,0 +1,54 @@ +/* jconfig.h. Generated from jconfig.cfg by configure. */ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES 1 +#define HAVE_UNSIGNED_CHAR 1 +#define HAVE_UNSIGNED_SHORT 1 +/* #undef void */ +/* #undef const */ +/* #undef CHAR_IS_UNSIGNED */ +#define HAVE_STDDEF_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_LOCALE_H 1 +/* #undef NEED_BSD_STRINGS */ +/* #undef NEED_SYS_TYPES_H */ +/* #undef NEED_FAR_POINTERS */ +/* #undef NEED_SHORT_EXTERNAL_NAMES */ +/* Define this if you get warnings about undefined structures. */ +/* #undef INCOMPLETE_TYPES_BROKEN */ + +/* Define "boolean" as unsigned char, not int, on Windows systems. */ +#ifdef _WIN32 +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif + +#ifdef JPEG_INTERNALS + +/* #undef RIGHT_SHIFT_IS_UNSIGNED */ +#define INLINE __inline__ +/* These are for configuring the JPEG memory manager. */ +/* #undef DEFAULT_MAX_MEM */ +/* #undef NO_MKTEMP */ + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +/* #undef RLE_SUPPORTED */ +#define TARGA_SUPPORTED /* Targa image file format */ + +/* #undef TWO_FILE_COMMANDLINE */ +/* #undef NEED_SIGNAL_CATCHER */ +/* #undef DONT_USE_B_MODE */ + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +/* #undef PROGRESS_REPORT */ + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/src/lib_armv7hf/jerror.h b/src/lib_armv7hf/jerror.h new file mode 100644 index 0000000..a4b661f --- /dev/null +++ b/src/lib_armv7hf/jerror.h @@ -0,0 +1,304 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 1997-2012 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_BEFORE, "Invalid JPEG file structure: %s before SOF") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/src/lib_armv7hf/jmorecfg.h b/src/lib_armv7hf/jmorecfg.h new file mode 100644 index 0000000..2407edb --- /dev/null +++ b/src/lib_armv7hf/jmorecfg.h @@ -0,0 +1,390 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2012 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ +#ifndef _BASETSD_H /* MinGW is slightly different */ +#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ +typedef long INT32; +#endif +#endif +#endif +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* The noreturn type identifier is used to declare functions + * which cannot return. + * Compilers can thus create more optimized code and perform + * better checks for warnings and errors. + * Static analyzer tools can make improved inferences about + * execution paths and are prevented from giving false alerts. + * + * Unfortunately, the proposed specifications of corresponding + * extensions in the Dec 2011 ISO C standard revision (C11), + * GCC, MSVC, etc. are not viable. + * Thus we introduce a user defined type to declare noreturn + * functions at least for clarity. A proper compiler would + * have a suitable noreturn type to match in place of void. + */ + +#ifndef HAVE_NORETURN_T +typedef void noreturn_t; +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifndef FAR +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifdef HAVE_BOOLEAN +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif +#else +typedef enum { FALSE = 0, TRUE = 1 } boolean; +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/src/lib_armv7hf/jpeglib.h b/src/lib_armv7hf/jpeglib.h new file mode 100644 index 0000000..0a6dac4 --- /dev/null +++ b/src/lib_armv7hf/jpeglib.h @@ -0,0 +1,1173 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2002-2012 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +extern "C" { +#endif +#endif + +/* Version IDs for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 90". + */ + +#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */ +#define JPEG_LIB_VERSION_MAJOR 9 +#define JPEG_LIB_VERSION_MINOR 0 + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples, + * reflecting any scaling we choose to apply during the DCT step. + * Values from 1 to 16 are supported. + * Note that different components may receive different DCT scalings. + */ + int DCT_h_scaled_size; + int DCT_v_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface); + * DCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) + * and similarly for height. + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* Supported color transforms. */ + +typedef enum { + JCT_NONE = 0, + JCT_SUBTRACT_GREEN = 1 +} J_COLOR_TRANSFORM; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + JDIMENSION jpeg_width; /* scaled JPEG image width */ + JDIMENSION jpeg_height; /* scaled JPEG image height */ + /* Dimensions of actual JPEG image that will be written to file, + * derived from input dimensions by scaling factors above. + * These fields are computed by jpeg_start_compress(). + * You can also use jpeg_calc_jpeg_dimensions() to determine these values + * in advance of calling jpeg_start_compress(). + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + int q_scale_factor[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined, + * and corresponding scale factors (percentage, initialized 100). + */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + J_COLOR_TRANSFORM color_transform; + /* Color transform identifier, writes LSE marker if nonzero */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + J_COLOR_TRANSFORM color_transform; + /* Color transform identifier derived from LSE marker, otherwise zero */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* These fields are derived from Se of first SOS marker. + */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array for entropy decode */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_mem_dest jMemDest +#define jpeg_mem_src jMemSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_default_qtables jDefQTables +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_calc_jpeg_dimensions jCjpegDimensions +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_core_output_dimensions jCoreDimensions +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Data source and destination managers: memory buffers. */ +EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, + unsigned char ** outbuffer, + unsigned long * outsize)); +EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, + unsigned char * inbuffer, + unsigned long insize)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Precalculate JPEG dimensions for current compression parameters. */ +EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.txt concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +} +#endif +#endif + +#endif /* JPEGLIB_H */ diff --git a/src/lib_armv7hf/libX11.so b/src/lib_armv7hf/libX11.so new file mode 120000 index 0000000..3877db7 --- /dev/null +++ b/src/lib_armv7hf/libX11.so @@ -0,0 +1 @@ +libX11.so.6.3.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libX11.so.6 b/src/lib_armv7hf/libX11.so.6 new file mode 120000 index 0000000..3877db7 --- /dev/null +++ b/src/lib_armv7hf/libX11.so.6 @@ -0,0 +1 @@ +libX11.so.6.3.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libX11.so.6.3.0 b/src/lib_armv7hf/libX11.so.6.3.0 new file mode 100755 index 0000000..3aba4fd Binary files /dev/null and b/src/lib_armv7hf/libX11.so.6.3.0 differ diff --git a/src/lib_armv7hf/libXau.so b/src/lib_armv7hf/libXau.so new file mode 120000 index 0000000..339636b --- /dev/null +++ b/src/lib_armv7hf/libXau.so @@ -0,0 +1 @@ +libXau.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libXau.so.6 b/src/lib_armv7hf/libXau.so.6 new file mode 120000 index 0000000..339636b --- /dev/null +++ b/src/lib_armv7hf/libXau.so.6 @@ -0,0 +1 @@ +libXau.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libXau.so.6.0.0 b/src/lib_armv7hf/libXau.so.6.0.0 new file mode 100755 index 0000000..a25d2ee Binary files /dev/null and b/src/lib_armv7hf/libXau.so.6.0.0 differ diff --git a/src/lib_armv7hf/libXdmcp.so b/src/lib_armv7hf/libXdmcp.so new file mode 120000 index 0000000..bbf4646 --- /dev/null +++ b/src/lib_armv7hf/libXdmcp.so @@ -0,0 +1 @@ +libXdmcp.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libXdmcp.so.6 b/src/lib_armv7hf/libXdmcp.so.6 new file mode 120000 index 0000000..bbf4646 --- /dev/null +++ b/src/lib_armv7hf/libXdmcp.so.6 @@ -0,0 +1 @@ +libXdmcp.so.6.0.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libXdmcp.so.6.0.0 b/src/lib_armv7hf/libXdmcp.so.6.0.0 new file mode 100755 index 0000000..4e5e0e2 Binary files /dev/null and b/src/lib_armv7hf/libXdmcp.so.6.0.0 differ diff --git a/src/lib_armv7hf/libXext.so b/src/lib_armv7hf/libXext.so new file mode 120000 index 0000000..465f805 --- /dev/null +++ b/src/lib_armv7hf/libXext.so @@ -0,0 +1 @@ +libXext.so.6.4.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libXext.so.6 b/src/lib_armv7hf/libXext.so.6 new file mode 120000 index 0000000..465f805 --- /dev/null +++ b/src/lib_armv7hf/libXext.so.6 @@ -0,0 +1 @@ +libXext.so.6.4.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libXext.so.6.4.0 b/src/lib_armv7hf/libXext.so.6.4.0 new file mode 100755 index 0000000..a624624 Binary files /dev/null and b/src/lib_armv7hf/libXext.so.6.4.0 differ diff --git a/src/lib_armv7hf/libjpeg.a b/src/lib_armv7hf/libjpeg.a new file mode 100644 index 0000000..570b232 Binary files /dev/null and b/src/lib_armv7hf/libjpeg.a differ diff --git a/src/lib_armv7hf/libjpeg.la b/src/lib_armv7hf/libjpeg.la new file mode 100755 index 0000000..7974a34 --- /dev/null +++ b/src/lib_armv7hf/libjpeg.la @@ -0,0 +1,41 @@ +# libjpeg.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.2 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libjpeg.so.9' + +# Names of this library. +library_names='libjpeg.so.9.0.0 libjpeg.so.9 libjpeg.so' + +# The name of the static archive. +old_library='libjpeg.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs='' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libjpeg. +current=9 +age=0 +revision=0 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/home/petermaierh/work/dxlARPS/src/lib_armv7hf' diff --git a/src/lib_armv7hf/libjpeg.so b/src/lib_armv7hf/libjpeg.so new file mode 120000 index 0000000..1d5d612 --- /dev/null +++ b/src/lib_armv7hf/libjpeg.so @@ -0,0 +1 @@ +libjpeg.so.9.0.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libjpeg.so.9 b/src/lib_armv7hf/libjpeg.so.9 new file mode 120000 index 0000000..1d5d612 --- /dev/null +++ b/src/lib_armv7hf/libjpeg.so.9 @@ -0,0 +1 @@ +libjpeg.so.9.0.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libjpeg.so.9.0.0 b/src/lib_armv7hf/libjpeg.so.9.0.0 new file mode 100755 index 0000000..513b114 Binary files /dev/null and b/src/lib_armv7hf/libjpeg.so.9.0.0 differ diff --git a/src/lib_armv7hf/libpng.a b/src/lib_armv7hf/libpng.a new file mode 120000 index 0000000..5671875 --- /dev/null +++ b/src/lib_armv7hf/libpng.a @@ -0,0 +1 @@ +libpng16.a \ No newline at end of file diff --git a/src/lib_armv7hf/libpng16.a b/src/lib_armv7hf/libpng16.a new file mode 100644 index 0000000..fb90c76 Binary files /dev/null and b/src/lib_armv7hf/libpng16.a differ diff --git a/src/lib_armv7hf/libpng16/png.h b/src/lib_armv7hf/libpng16/png.h new file mode 100644 index 0000000..cf1a27c --- /dev/null +++ b/src/lib_armv7hf/libpng16/png.h @@ -0,0 +1,3310 @@ + +/* png.h - header file for PNG reference library + * + * libpng version 1.6.3 - July 18, 2013 + * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license (See LICENSE, below) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.6.3 - July 18, 2013: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 12.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 12.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-7 13 10210 12.so.0.10[.0] + * 1.2.10rc1-2 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.4.0beta1-5 14 10400 14.so.0.0[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.4.0beta7-8 14 10400 14.so.0.0[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.4.0beta9-14 14 10400 14.so.0.0[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.4.0beta15-36 14 10400 14.so.0.0[.0] + * 1.4.0beta37-87 14 10400 14.so.14.0[.0] + * 1.4.0rc01 14 10400 14.so.14.0[.0] + * 1.4.0beta88-109 14 10400 14.so.14.0[.0] + * 1.4.0rc02-08 14 10400 14.so.14.0[.0] + * 1.4.0 14 10400 14.so.14.0[.0] + * 1.4.1beta01-03 14 10401 14.so.14.1[.0] + * 1.4.1rc01 14 10401 14.so.14.1[.0] + * 1.4.1beta04-12 14 10401 14.so.14.1[.0] + * 1.4.1 14 10401 14.so.14.1[.0] + * 1.4.2 14 10402 14.so.14.2[.0] + * 1.4.3 14 10403 14.so.14.3[.0] + * 1.4.4 14 10404 14.so.14.4[.0] + * 1.5.0beta01-58 15 10500 15.so.15.0[.0] + * 1.5.0rc01-07 15 10500 15.so.15.0[.0] + * 1.5.0 15 10500 15.so.15.0[.0] + * 1.5.1beta01-11 15 10501 15.so.15.1[.0] + * 1.5.1rc01-02 15 10501 15.so.15.1[.0] + * 1.5.1 15 10501 15.so.15.1[.0] + * 1.5.2beta01-03 15 10502 15.so.15.2[.0] + * 1.5.2rc01-03 15 10502 15.so.15.2[.0] + * 1.5.2 15 10502 15.so.15.2[.0] + * 1.5.3beta01-10 15 10503 15.so.15.3[.0] + * 1.5.3rc01-02 15 10503 15.so.15.3[.0] + * 1.5.3beta11 15 10503 15.so.15.3[.0] + * 1.5.3 [omitted] + * 1.5.4beta01-08 15 10504 15.so.15.4[.0] + * 1.5.4rc01 15 10504 15.so.15.4[.0] + * 1.5.4 15 10504 15.so.15.4[.0] + * 1.5.5beta01-08 15 10505 15.so.15.5[.0] + * 1.5.5rc01 15 10505 15.so.15.5[.0] + * 1.5.5 15 10505 15.so.15.5[.0] + * 1.5.6beta01-07 15 10506 15.so.15.6[.0] + * 1.5.6rc01-03 15 10506 15.so.15.6[.0] + * 1.5.6 15 10506 15.so.15.6[.0] + * 1.5.7beta01-05 15 10507 15.so.15.7[.0] + * 1.5.7rc01-03 15 10507 15.so.15.7[.0] + * 1.5.7 15 10507 15.so.15.7[.0] + * 1.6.0beta01-40 16 10600 16.so.16.0[.0] + * 1.6.0rc01-08 16 10600 16.so.16.0[.0] + * 1.6.0 16 10600 16.so.16.0[.0] + * 1.6.1beta01-09 16 10601 16.so.16.1[.0] + * 1.6.1rc01 16 10601 16.so.16.1[.0] + * 1.6.1 16 10601 16.so.16.1[.0] + * 1.6.2beta01 16 10602 16.so.16.2[.0] + * 1.6.2rc01-06 16 10602 16.so.16.2[.0] + * 1.6.2 16 10602 16.so.16.2[.0] + * 1.6.3beta01-11 16 10603 16.so.16.3[.0] + * 1.6.3rc01 16 10603 16.so.16.3[.0] + * 1.6.3 16 10603 16.so.16.3[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcNN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng-manual.txt or libpng.3 for more information. The PNG + * specification is available as a W3C Recommendation and as an ISO + * Specification, defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_size_t rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info * png_row_infop; +typedef png_row_info * * png_row_infopp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. Note that the 'write' function must not + * modify the buffer it is passed. The 'read' function, on the other hand, is + * expected to return the read data in the buffer. + */ +typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp)); +typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t)); +typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp)); +typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, + int)); +typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, + int)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); +typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); + +/* The following callback receives png_uint_32 row_number, int pass for the + * png_bytep data of the row. When transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep, + png_uint_32, int)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop, + png_bytep)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, + png_unknown_chunkp)); +#endif +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED +/* not used anywhere */ +/* typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); */ +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This must match the function definition in , and the application + * must include this before png.h to obtain the definition of jmp_buf. The + * function is required to be PNG_NORETURN, but this is not checked. If the + * function does return the application will crash via an abort() or similar + * system level call. + * + * If you get a warning here while building the library you may need to make + * changes to ensure that pnglibconf.h records the calling convention used by + * your compiler. This may be very difficult - try using a different compiler + * to build the library! + */ +PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER +#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ +/* Added to libpng-1.4.0 */ +#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */ +/* Added to libpng-1.5.4 */ +#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */ +#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +/* NOTE: prior to 1.5 these functions had no 'API' style declaration, + * this allowed the zlib default functions to be used on Windows + * platforms. In 1.5 the zlib default malloc (which just calls malloc and + * ignores the first argument) should be completely compatible with the + * following. + */ +typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, + png_alloc_size_t)); +typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp)); + +/* Section 3: exported functions + * Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng-manual.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + * + * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in + * pngconf.h and in the *.dfn files in the scripts directory. + * + * PNG_EXPORT(ordinal, type, name, (args)); + * + * ordinal: ordinal that is used while building + * *.def files. The ordinal value is only + * relevant when preprocessing png.h with + * the *.dfn files for building symbol table + * entries, and are removed by pngconf.h. + * type: return type of the function + * name: function name + * args: function arguments, with types + * + * When we wish to append attributes to a function prototype we use + * the PNG_EXPORTA() macro instead. + * + * PNG_EXPORTA(ordinal, type, name, (args), attributes); + * + * ordinal, type, name, and args: same as in PNG_EXPORT(). + * attributes: function attributes + */ + +/* Returns the version number of the library */ +PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); + +/* Tell lib we have already handled the first magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +PNG_EXPORT(2, void, png_set_sig_bytes, (png_structrp png_ptr, int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +PNG_EXPORTA(4, png_structp, png_create_read_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn), + PNG_ALLOCATED); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +PNG_EXPORTA(5, png_structp, png_create_write_struct, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn), + PNG_ALLOCATED); + +PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, + (png_const_structrp png_ptr)); + +PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr, + png_size_t size)); + +/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp + * match up. + */ +#ifdef PNG_SETJMP_SUPPORTED +/* This function returns the jmp_buf built in to *png_ptr. It must be + * supplied with an appropriate 'longjmp' function to use on that jmp_buf + * unless the default error function is overridden in which case NULL is + * acceptable. The size of the jmp_buf is checked against the actual size + * allocated by the library - the call will return NULL on a mismatch + * indicating an ABI mismatch. + */ +PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr, + png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); +# define png_jmpbuf(png_ptr) \ + (*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf)))) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) +#endif +/* This function should be used by libpng applications in place of + * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it + * will use it; otherwise it will call PNG_ABORT(). This function was + * added in libpng-1.5.0. + */ +PNG_EXPORTA(9, void, png_longjmp, (png_const_structrp png_ptr, int val), + PNG_NORETURN); + +#ifdef PNG_READ_SUPPORTED +/* Reset the compression stream */ +PNG_EXPORTA(10, int, png_reset_zstream, (png_structrp png_ptr), PNG_DEPRECATED); +#endif + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(11, png_structp, png_create_read_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +PNG_EXPORTA(12, png_structp, png_create_write_struct_2, + (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warn_fn, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), + PNG_ALLOCATED); +#endif + +/* Write the PNG file signature. */ +PNG_EXPORT(13, void, png_write_sig, (png_structrp png_ptr)); + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +PNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep + chunk_name, png_const_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +PNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr, + png_const_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +PNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr, + png_const_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +PNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr)); + +/* Allocate and initialize the info structure */ +PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_const_structrp png_ptr), + PNG_ALLOCATED); + +/* DEPRECATED: this function allowed init structures to be created using the + * default allocation method (typically malloc). Use is deprecated in 1.6.0 and + * the API will be removed in the future. + */ +PNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr, + png_size_t png_info_struct_size), PNG_DEPRECATED); + +/* Writes all the PNG information before the image. */ +PNG_EXPORT(20, void, png_write_info_before_PLTE, + (png_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(21, void, png_write_info, + (png_structrp png_ptr, png_const_inforp info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. */ +PNG_EXPORT(22, void, png_read_info, + (png_structrp png_ptr, png_inforp info_ptr)); +#endif + +#ifdef PNG_TIME_RFC1123_SUPPORTED + /* Convert to a US string format: there is no localization support in this + * routine. The original implementation used a 29 character buffer in + * png_struct, this will be removed in future versions. + */ +#if PNG_LIBPNG_VER < 10700 +/* To do: remove this from libpng17 (and from libpng17/png.c and pngstruct.h) */ +PNG_EXPORTA(23, png_const_charp, png_convert_to_rfc1123, (png_structrp png_ptr, + png_const_timep ptime),PNG_DEPRECATED); +#endif +PNG_EXPORT(241, int, png_convert_to_rfc1123_buffer, (char out[29], + png_const_timep ptime)); +#endif + +#ifdef PNG_CONVERT_tIME_SUPPORTED +/* Convert from a struct tm to png_time */ +PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, + const struct tm * ttime)); + +/* Convert from time_t to png_time. Uses gmtime() */ +PNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime)); +#endif /* PNG_CONVERT_tIME_SUPPORTED */ + +#ifdef PNG_READ_EXPAND_SUPPORTED +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +PNG_EXPORT(26, void, png_set_expand, (png_structrp png_ptr)); +PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structrp png_ptr)); +PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structrp png_ptr)); +PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_EXPAND_16_SUPPORTED +/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion + * of a tRNS chunk if present. + */ +PNG_EXPORT(221, void, png_set_expand_16, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +PNG_EXPORT(30, void, png_set_bgr, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED +/* Expand the grayscale to 24-bit RGB if necessary. */ +PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +/* Reduce RGB to grayscale. */ +#define PNG_ERROR_ACTION_NONE 1 +#define PNG_ERROR_ACTION_WARN 2 +#define PNG_ERROR_ACTION_ERROR 3 +#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/ + +PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structrp png_ptr, + int error_action, double red, double green)) +PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structrp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green)) + +PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structrp + png_ptr)); +#endif + +#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, + png_colorp palette)); +#endif + +#ifdef PNG_READ_ALPHA_MODE_SUPPORTED +/* How the alpha channel is interpreted - this affects how the color channels of + * a PNG file are returned when an alpha channel, or tRNS chunk in a palette + * file, is present. + * + * This has no effect on the way pixels are written into a PNG output + * datastream. The color samples in a PNG datastream are never premultiplied + * with the alpha samples. + * + * The default is to return data according to the PNG specification: the alpha + * channel is a linear measure of the contribution of the pixel to the + * corresponding composited pixel. The gamma encoded color channels must be + * scaled according to the contribution and to do this it is necessary to undo + * the encoding, scale the color values, perform the composition and reencode + * the values. This is the 'PNG' mode. + * + * The alternative is to 'associate' the alpha with the color information by + * storing color channel values that have been scaled by the alpha. The + * advantage is that the color channels can be resampled (the image can be + * scaled) in this form. The disadvantage is that normal practice is to store + * linear, not (gamma) encoded, values and this requires 16-bit channels for + * still images rather than the 8-bit channels that are just about sufficient if + * gamma encoding is used. In addition all non-transparent pixel values, + * including completely opaque ones, must be gamma encoded to produce the final + * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the + * latter being the two common names for associated alpha color channels.) + * + * Since it is not necessary to perform arithmetic on opaque color values so + * long as they are not to be resampled and are in the final color space it is + * possible to optimize the handling of alpha by storing the opaque pixels in + * the PNG format (adjusted for the output color space) while storing partially + * opaque pixels in the standard, linear, format. The accuracy required for + * standard alpha composition is relatively low, because the pixels are + * isolated, therefore typically the accuracy loss in storing 8-bit linear + * values is acceptable. (This is not true if the alpha channel is used to + * simulate transparency over large areas - use 16 bits or the PNG mode in + * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is + * treated as opaque only if the alpha value is equal to the maximum value. + * + * The final choice is to gamma encode the alpha channel as well. This is + * broken because, in practice, no implementation that uses this choice + * correctly undoes the encoding before handling alpha composition. Use this + * choice only if other serious errors in the software or hardware you use + * mandate it; the typical serious error is for dark halos to appear around + * opaque areas of the composited PNG image because of arithmetic overflow. + * + * The API function png_set_alpha_mode specifies which of these choices to use + * with an enumerated 'mode' value and the gamma of the required output: + */ +#define PNG_ALPHA_PNG 0 /* according to the PNG standard */ +#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */ +#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */ +#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */ +#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */ +#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */ + +PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structrp png_ptr, int mode, + double output_gamma)) +PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structrp png_ptr, + int mode, png_fixed_point output_gamma)) +#endif + +#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED) +/* The output_gamma value is a screen gamma in libpng terminology: it expresses + * how to decode the output values, not how they are encoded. The values used + * correspond to the normal numbers used to describe the overall gamma of a + * computer display system; for example 2.2 for an sRGB conformant system. The + * values are scaled by 100000 in the _fixed version of the API (so 220000 for + * sRGB.) + * + * The inverse of the value is always used to provide a default for the PNG file + * encoding if it has no gAMA chunk and if png_set_gamma() has not been called + * to override the PNG gamma information. + * + * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode + * opaque pixels however pixels with lower alpha values are not encoded, + * regardless of the output gamma setting. + * + * When the standard Porter Duff handling is requested with mode 1 the output + * encoding is set to be linear and the output_gamma value is only relevant + * as a default for input data that has no gamma information. The linear output + * encoding will be overridden if png_set_gamma() is called - the results may be + * highly unexpected! + * + * The following numbers are derived from the sRGB standard and the research + * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of + * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing + * correction required to take account of any differences in the color + * environment of the original scene and the intended display environment; the + * value expresses how to *decode* the image for display, not how the original + * data was *encoded*. + * + * sRGB provides a peg for the PNG standard by defining a viewing environment. + * sRGB itself, and earlier TV standards, actually use a more complex transform + * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is + * limited to simple power laws.) By saying that an image for direct display on + * an sRGB conformant system should be stored with a gAMA chunk value of 45455 + * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification + * makes it possible to derive values for other display systems and + * environments. + * + * The Mac value is deduced from the sRGB based on an assumption that the actual + * extra viewing correction used in early Mac display systems was implemented as + * a power 1.45 lookup table. + * + * Any system where a programmable lookup table is used or where the behavior of + * the final display device characteristics can be changed requires system + * specific code to obtain the current characteristic. However this can be + * difficult and most PNG gamma correction only requires an approximate value. + * + * By default, if png_set_alpha_mode() is not called, libpng assumes that all + * values are unencoded, linear, values and that the output device also has a + * linear characteristic. This is only very rarely correct - it is invariably + * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the + * default if you don't know what the right answer is! + * + * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS + * 10.6) which used a correction table to implement a somewhat lower gamma on an + * otherwise sRGB system. + * + * Both these values are reserved (not simple gamma values) in order to allow + * more precise correction internally in the future. + * + * NOTE: the following values can be passed to either the fixed or floating + * point APIs, but the floating point API will also accept floating point + * values. + */ +#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */ +#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */ +#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */ +#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */ +#endif + +/* The following are examples of calls to png_set_alpha_mode to achieve the + * required overall gamma correction and, where necessary, alpha + * premultiplication. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * This is the default libpng handling of the alpha channel - it is not + * pre-multiplied into the color components. In addition the call states + * that the output is for a sRGB system and causes all PNG files without gAMA + * chunks to be assumed to be encoded using sRGB. + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * In this case the output is assumed to be something like an sRGB conformant + * display preceeded by a power-law lookup table of power 1.45. This is how + * early Mac systems behaved. + * + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); + * This is the classic Jim Blinn approach and will work in academic + * environments where everything is done by the book. It has the shortcoming + * of assuming that input PNG data with no gamma information is linear - this + * is unlikely to be correct unless the PNG files where generated locally. + * Most of the time the output precision will be so low as to show + * significant banding in dark areas of the image. + * + * png_set_expand_16(pp); + * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB); + * This is a somewhat more realistic Jim Blinn inspired approach. PNG files + * are assumed to have the sRGB encoding if not marked with a gamma value and + * the output is always 16 bits per component. This permits accurate scaling + * and processing of the data. If you know that your input PNG files were + * generated locally you might need to replace PNG_DEFAULT_sRGB with the + * correct value for your system. + * + * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB); + * If you just need to composite the PNG image onto an existing background + * and if you control the code that does this you can use the optimization + * setting. In this case you just copy completely opaque pixels to the + * output. For pixels that are not completely transparent (you just skip + * those) you do the composition math using png_composite or png_composite_16 + * below then encode the resultant 8-bit or 16-bit values to match the output + * encoding. + * + * Other cases + * If neither the PNG nor the standard linear encoding work for you because + * of the software or hardware you use then you have a big problem. The PNG + * case will probably result in halos around the image. The linear encoding + * will probably result in a washed out, too bright, image (it's actually too + * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably + * substantially reduce the halos. Alternatively try: + * + * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB); + * This option will also reduce the halos, but there will be slight dark + * halos round the opaque parts of the image where the background is light. + * In the OPTIMIZED mode the halos will be light halos where the background + * is dark. Take your pick - the halos are unavoidable unless you can get + * your hardware/software fixed! (The OPTIMIZED approach is slightly + * faster.) + * + * When the default gamma of PNG files doesn't match the output gamma. + * If you have PNG files with no gamma information png_set_alpha_mode allows + * you to provide a default gamma, but it also sets the ouput gamma to the + * matching value. If you know your PNG files have a gamma that doesn't + * match the output you can take advantage of the fact that + * png_set_alpha_mode always sets the output gamma but only sets the PNG + * default if it is not already set: + * + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); + * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); + * The first call sets both the default and the output gamma values, the + * second call overrides the output gamma without changing the default. This + * is easier than achieving the same effect with png_set_gamma. You must use + * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will + * fire if more than one call to png_set_alpha_mode and png_set_background is + * made in the same read operation, however multiple calls with PNG_ALPHA_PNG + * are ignored. + */ + +#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED +PNG_EXPORT(36, void, png_set_strip_alpha, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXPORT(37, void, png_set_swap_alpha, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXPORT(38, void, png_set_invert_alpha, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler, + int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +# define PNG_FILLER_BEFORE 0 +# define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +PNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr, + png_uint_32 filler, int flags)); +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +PNG_EXPORT(41, void, png_set_swap, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +PNG_EXPORT(42, void, png_set_packing, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ + defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +PNG_EXPORT(43, void, png_set_packswap, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +PNG_EXPORT(44, void, png_set_shift, (png_structrp png_ptr, png_const_color_8p + true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. + * MUST be called before png_read_update_info or png_start_read_image, + * otherwise it will not have the desired effect. Note that it is still + * necessary to call png_read_row or png_read_rows png_get_image_height + * times for each pass. +*/ +PNG_EXPORT(45, int, png_set_interlace_handling, (png_structrp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +PNG_EXPORT(46, void, png_set_invert_mono, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +/* Handle alpha and tRNS by replacing with a background color. Prior to + * libpng-1.5.4 this API must not be called before the PNG file header has been + * read. Doing so will result in unexpected behavior and possible warnings or + * errors if the PNG file contains a bKGD chunk. + */ +PNG_FP_EXPORT(47, void, png_set_background, (png_structrp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)) +PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structrp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma)) +#endif +#ifdef PNG_READ_BACKGROUND_SUPPORTED +# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +# define PNG_BACKGROUND_GAMMA_SCREEN 1 +# define PNG_BACKGROUND_GAMMA_FILE 2 +# define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED +/* Scale a 16-bit depth file down to 8-bit, accurately. */ +PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */ +/* Strip the second byte of information from a 16-bit depth file. */ +PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr)); +#endif + +#ifdef PNG_READ_QUANTIZE_SUPPORTED +/* Turn on quantizing, and reduce the palette to the number of colors + * available. + */ +PNG_EXPORT(49, void, png_set_quantize, (png_structrp png_ptr, + png_colorp palette, int num_palette, int maximum_colors, + png_const_uint_16p histogram, int full_quantize)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +/* The threshold on gamma processing is configurable but hard-wired into the + * library. The following is the floating point variant. + */ +#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) + +/* Handle gamma correction. Screen_gamma=(display_exponent). + * NOTE: this API simply sets the screen and file gamma values. It will + * therefore override the value for gamma in a PNG file if it is called after + * the file header has been read - use with care - call before reading the PNG + * file for best results! + * + * These routines accept the same gamma values as png_set_alpha_mode (described + * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either + * API (floating point or fixed.) Notice, however, that the 'file_gamma' value + * is the inverse of a 'screen gamma' value. + */ +PNG_FP_EXPORT(50, void, png_set_gamma, (png_structrp png_ptr, + double screen_gamma, double override_file_gamma)) +PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structrp png_ptr, + png_fixed_point screen_gamma, png_fixed_point override_file_gamma)) +#endif + +#ifdef PNG_WRITE_FLUSH_SUPPORTED +/* Set how many lines between output flushes - 0 for no flushing */ +PNG_EXPORT(51, void, png_set_flush, (png_structrp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +PNG_EXPORT(52, void, png_write_flush, (png_structrp png_ptr)); +#endif + +/* Optional update palette with requested transformations */ +PNG_EXPORT(53, void, png_start_read_image, (png_structrp png_ptr)); + +/* Optional call to update the users info structure */ +PNG_EXPORT(54, void, png_read_update_info, (png_structrp png_ptr, + png_inforp info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. */ +PNG_EXPORT(55, void, png_read_rows, (png_structrp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read a row of data. */ +PNG_EXPORT(56, void, png_read_row, (png_structrp png_ptr, png_bytep row, + png_bytep display_row)); +#endif + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the whole image into memory at once. */ +PNG_EXPORT(57, void, png_read_image, (png_structrp png_ptr, png_bytepp image)); +#endif + +/* Write a row of image data */ +PNG_EXPORT(58, void, png_write_row, (png_structrp png_ptr, + png_const_bytep row)); + +/* Write a few rows of image data: (*row) is not written; however, the type + * is declared as writeable to maintain compatibility with previous versions + * of libpng and to allow the 'display_row' array from read_rows to be passed + * unchanged to write_rows. + */ +PNG_EXPORT(59, void, png_write_rows, (png_structrp png_ptr, png_bytepp row, + png_uint_32 num_rows)); + +/* Write the image data */ +PNG_EXPORT(60, void, png_write_image, (png_structrp png_ptr, png_bytepp image)); + +/* Write the end of the PNG file. */ +PNG_EXPORT(61, void, png_write_end, (png_structrp png_ptr, + png_inforp info_ptr)); + +#ifdef PNG_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. */ +PNG_EXPORT(62, void, png_read_end, (png_structrp png_ptr, png_inforp info_ptr)); +#endif + +/* Free any memory associated with the png_info_struct */ +PNG_EXPORT(63, void, png_destroy_info_struct, (png_const_structrp png_ptr, + png_infopp info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, + png_infopp info_ptr_ptr)); + +/* Set the libpng method of handling chunk CRC errors */ +PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action, + int ancil_action)); + +/* Values for png_set_crc_action() say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* Set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method, + int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr, + int heuristic_method, int num_weights, png_const_doublep filter_weights, + png_const_doublep filter_costs)) +PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, + (png_structrp png_ptr, int heuristic_method, int num_weights, + png_const_fixed_point_p filter_weights, + png_const_fixed_point_p filter_costs)) +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +#ifdef PNG_WRITE_SUPPORTED +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr, + int level)); + +PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structrp png_ptr, + int mem_level)); + +PNG_EXPORT(71, void, png_set_compression_strategy, (png_structrp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr, + int window_bits)); + +PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr, + int method)); +#endif + +#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +/* Also set zlib parameters for compressing non-IDAT chunks */ +PNG_EXPORT(222, void, png_set_text_compression_level, (png_structrp png_ptr, + int level)); + +PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structrp png_ptr, + int mem_level)); + +PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structrp png_ptr, + int strategy)); + +/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a + * smaller value of window_bits if it can do so safely. + */ +PNG_EXPORT(225, void, png_set_text_compression_window_bits, + (png_structrp png_ptr, int window_bits)); + +PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr, + int method)); +#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng-manual.txt for + * more information. + */ + +#ifdef PNG_STDIO_SUPPORTED +/* Initialize the input/output for the PNG file to the default functions. */ +PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +PNG_EXPORT(75, void, png_set_error_fn, (png_structrp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structrp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used. + */ +PNG_EXPORT(77, void, png_set_write_fn, (png_structrp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +PNG_EXPORT(78, void, png_set_read_fn, (png_structrp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_const_structrp png_ptr)); + +PNG_EXPORT(80, void, png_set_read_status_fn, (png_structrp png_ptr, + png_read_status_ptr read_row_fn)); + +PNG_EXPORT(81, void, png_set_write_status_fn, (png_structrp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +PNG_EXPORT(82, void, png_set_mem_fn, (png_structrp png_ptr, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structrp png_ptr)); +#endif + +#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structrp png_ptr, + png_user_transform_ptr read_user_transform_fn)); +#endif + +#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED +PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structrp png_ptr, + png_user_transform_ptr write_user_transform_fn)); +#endif + +#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED +PNG_EXPORT(86, void, png_set_user_transform_info, (png_structrp png_ptr, + png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, + (png_const_structrp png_ptr)); +#endif + +#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED +/* Return information about the row currently being processed. Note that these + * APIs do not fail but will return unexpected results if called outside a user + * transform callback. Also note that when transforming an interlaced image the + * row number is the row number within the sub-image of the interlace pass, so + * the value will increase to the height of the sub-image (not the full image) + * then reset to 0 for the next pass. + * + * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to + * find the output pixel (x,y) given an interlaced sub-image pixel + * (row,col,pass). (See below for these macros.) + */ +PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structrp)); +PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp)); +#endif + +#ifdef PNG_READ_USER_CHUNKS_SUPPORTED +/* This callback is called only for *unknown* chunks. If + * PNG_HANDLE_AS_UNKNOWN_SUPPORTED is set then it is possible to set known + * chunks to be treated as unknown, however in this case the callback must do + * any processing required by the chunk (e.g. by calling the appropriate + * png_set_ APIs.) + * + * There is no write support - on write, by default, all the chunks in the + * 'unknown' list are written in the specified position. + * + * The integer return from the callback function is interpreted thus: + * + * negative: An error occured, png_chunk_error will be called. + * zero: The chunk was not handled, the chunk will be saved. A critical + * chunk will cause an error at this point unless it is to be saved. + * positive: The chunk was handled, libpng will ignore/discard it. + * + * See "INTERACTION WTIH USER CHUNK CALLBACKS" below for important notes about + * how this behavior will change in libpng 1.7 + */ +PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structrp png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structrp png_ptr, + png_voidp progressive_ptr, png_progressive_info_ptr info_fn, + png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); + +/* Returns the user pointer associated with the push read functions */ +PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, + (png_const_structrp png_ptr)); + +/* Function to be called when data becomes available */ +PNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr, + png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size)); + +/* A function which may be called *only* within png_process_data to stop the + * processing of any more data. The function returns the number of bytes + * remaining, excluding any that libpng has cached internally. A subsequent + * call to png_process_data must supply these bytes again. If the argument + * 'save' is set to true the routine will first save all the pending data and + * will always return 0. + */ +PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save)); + +/* A function which may be called *only* outside (after) a call to + * png_process_data. It returns the number of bytes of data to skip in the + * input. Normally it will return 0, but if it returns a non-zero value the + * application must skip than number of bytes of input data and pass the + * following data to the next call to png_process_data. + */ +PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp)); + +#ifdef PNG_READ_INTERLACING_SUPPORTED +/* Function that combines rows. 'new_row' is a flag that should come from + * the callback and be non-NULL if anything needs to be done; the library + * stores its own version of the new data internally and ignores the passed + * in value. + */ +PNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr, + png_bytep old_row, png_const_bytep new_row)); +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +PNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); +/* Added at libpng version 1.4.0 */ +PNG_EXPORTA(95, png_voidp, png_calloc, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); + +/* Added at libpng version 1.2.4 */ +PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED); + +/* Frees a pointer allocated by png_malloc() */ +PNG_EXPORT(97, void, png_free, (png_const_structrp png_ptr, png_voidp ptr)); + +/* Free data that was allocated internally */ +PNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_32 free_me, int num)); + +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application; this works on the png_info structure passed + * in, it does not change the state for other png_info structures. + * + * It is unlikely that this function works correctly as of 1.6.0 and using it + * may result either in memory leaks or double free of allocated data. + */ +PNG_EXPORTA(99, void, png_data_freer, (png_const_structrp png_ptr, + png_inforp info_ptr, int freer, png_uint_32 mask), PNG_DEPRECATED); + +/* Assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_FREE_UNKN 0x0200 +#endif +/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */ +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr, + png_alloc_size_t size), PNG_ALLOCATED PNG_DEPRECATED); +PNG_EXPORTA(101, void, png_free_default, (png_const_structrp png_ptr, + png_voidp ptr), PNG_DEPRECATED); +#endif + +#ifdef PNG_ERROR_TEXT_SUPPORTED +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(102, void, png_error, (png_const_structrp png_ptr, + png_const_charp error_message), PNG_NORETURN); + +/* The same, but the chunk name is prepended to the error string. */ +PNG_EXPORTA(103, void, png_chunk_error, (png_const_structrp png_ptr, + png_const_charp error_message), PNG_NORETURN); + +#else +/* Fatal error in PNG image of libpng - can't continue */ +PNG_EXPORTA(104, void, png_err, (png_const_structrp png_ptr), PNG_NORETURN); +#endif + +#ifdef PNG_WARNINGS_SUPPORTED +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +PNG_EXPORT(105, void, png_warning, (png_const_structrp png_ptr, + png_const_charp warning_message)); + +/* Non-fatal error in libpng, chunk name is prepended to message. */ +PNG_EXPORT(106, void, png_chunk_warning, (png_const_structrp png_ptr, + png_const_charp warning_message)); +#endif + +#ifdef PNG_BENIGN_ERRORS_SUPPORTED +/* Benign error in libpng. Can continue, but may have a problem. + * User can choose whether to handle as a fatal error or as a warning. */ +PNG_EXPORT(107, void, png_benign_error, (png_const_structrp png_ptr, + png_const_charp warning_message)); + +#ifdef PNG_READ_SUPPORTED +/* Same, chunk name is prepended to message (only during read) */ +PNG_EXPORT(108, void, png_chunk_benign_error, (png_const_structrp png_ptr, + png_const_charp warning_message)); +#endif + +PNG_EXPORT(109, void, png_set_benign_errors, + (png_structrp png_ptr, int allowed)); +#else +# ifdef PNG_ALLOW_BENIGN_ERRORS +# define png_benign_error png_warning +# define png_chunk_benign_error png_chunk_warning +# else +# define png_benign_error png_error +# define png_chunk_benign_error png_chunk_error +# endif +#endif + +/* The png_set_ functions are for storing values in the png_info_struct. + * Similarly, the png_get_ calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_ functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +PNG_EXPORT(110, png_uint_32, png_get_valid, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* Returns row_pointers, which is an array of pointers to scanlines that was + * returned from png_read_png(). + */ +PNG_EXPORT(112, png_bytepp, png_get_rows, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Set row_pointers, which is an array of pointers to scanlines for use + * by png_write_png(). + */ +PNG_EXPORT(113, void, png_set_rows, (png_const_structrp png_ptr, + png_inforp info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +PNG_EXPORT(114, png_byte, png_get_channels, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image height in pixels. */ +PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image bit_depth. */ +PNG_EXPORT(117, png_byte, png_get_bit_depth, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image color_type. */ +PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image filter_type. */ +PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image interlace_type. */ +PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image compression_type. */ +PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); +PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +#ifdef PNG_READ_SUPPORTED +/* Returns pointer to signature string read from PNG header */ +PNG_EXPORT(130, png_const_bytep, png_get_signature, (png_const_structrp png_ptr, + png_const_inforp info_ptr)); +#endif + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(131, png_uint_32, png_get_bKGD, (png_const_structrp png_ptr, + png_inforp info_ptr, png_color_16p *background)); +#endif + +#ifdef PNG_bKGD_SUPPORTED +PNG_EXPORT(132, void, png_set_bKGD, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_color_16p background)); +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structrp png_ptr, + png_const_inforp info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)) +PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_const_structrp png_ptr, + png_const_inforp info_ptr, double *red_X, double *red_Y, double *red_Z, + double *green_X, double *green_Y, double *green_Z, double *blue_X, + double *blue_Y, double *blue_Z)) +PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, + png_fixed_point *int_white_x, png_fixed_point *int_white_y, + png_fixed_point *int_red_x, png_fixed_point *int_red_y, + png_fixed_point *int_green_x, png_fixed_point *int_green_y, + png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)) +PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, + png_fixed_point *int_red_X, png_fixed_point *int_red_Y, + png_fixed_point *int_red_Z, png_fixed_point *int_green_X, + png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, + png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, + png_fixed_point *int_blue_Z)) +#endif + +#ifdef PNG_cHRM_SUPPORTED +PNG_FP_EXPORT(135, void, png_set_cHRM, (png_const_structrp png_ptr, + png_inforp info_ptr, + double white_x, double white_y, double red_x, double red_y, double green_x, + double green_y, double blue_x, double blue_y)) +PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_const_structrp png_ptr, + png_inforp info_ptr, double red_X, double red_Y, double red_Z, + double green_X, double green_Y, double green_Z, double blue_X, + double blue_Y, double blue_Z)) +PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, png_fixed_point int_white_x, + png_fixed_point int_white_y, png_fixed_point int_red_x, + png_fixed_point int_red_y, png_fixed_point int_green_x, + png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)) +PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, + png_fixed_point int_red_Z, png_fixed_point int_green_X, + png_fixed_point int_green_Y, png_fixed_point int_green_Z, + png_fixed_point int_blue_X, png_fixed_point int_blue_Y, + png_fixed_point int_blue_Z)) +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr, + png_const_inforp info_ptr, double *file_gamma)) +PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, + png_fixed_point *int_file_gamma)) +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_FP_EXPORT(139, void, png_set_gAMA, (png_const_structrp png_ptr, + png_inforp info_ptr, double file_gamma)) +PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, png_fixed_point int_file_gamma)) +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_16p *hist)); +#endif + +#ifdef PNG_hIST_SUPPORTED +PNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_uint_16p hist)); +#endif + +PNG_EXPORT(143, png_uint_32, png_get_IHDR, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height, + int *bit_depth, int *color_type, int *interlace_method, + int *compression_method, int *filter_method)); + +PNG_EXPORT(144, void, png_set_IHDR, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_method, int compression_method, + int filter_method)); + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(145, png_uint_32, png_get_oFFs, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, + int *unit_type)); +#endif + +#ifdef PNG_oFFs_SUPPORTED +PNG_EXPORT(146, void, png_set_oFFs, (png_const_structrp png_ptr, + png_inforp info_ptr, png_int_32 offset_x, png_int_32 offset_y, + int unit_type)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(147, png_uint_32, png_get_pCAL, (png_const_structrp png_ptr, + png_inforp info_ptr, png_charp *purpose, png_int_32 *X0, + png_int_32 *X1, int *type, int *nparams, png_charp *units, + png_charpp *params)); +#endif + +#ifdef PNG_pCAL_SUPPORTED +PNG_EXPORT(148, void, png_set_pCAL, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1, + int type, int nparams, png_const_charp units, png_charpp params)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(149, png_uint_32, png_get_pHYs, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +#endif + +#ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(150, void, png_set_pHYs, (png_const_structrp png_ptr, + png_inforp info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +PNG_EXPORT(151, png_uint_32, png_get_PLTE, (png_const_structrp png_ptr, + png_inforp info_ptr, png_colorp *palette, int *num_palette)); + +PNG_EXPORT(152, void, png_set_PLTE, (png_structrp png_ptr, + png_inforp info_ptr, png_const_colorp palette, int num_palette)); + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(153, png_uint_32, png_get_sBIT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_color_8p *sig_bit)); +#endif + +#ifdef PNG_sBIT_SUPPORTED +PNG_EXPORT(154, void, png_set_sBIT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_color_8p sig_bit)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structrp png_ptr, + png_const_inforp info_ptr, int *file_srgb_intent)); +#endif + +#ifdef PNG_sRGB_SUPPORTED +PNG_EXPORT(156, void, png_set_sRGB, (png_const_structrp png_ptr, + png_inforp info_ptr, int srgb_intent)); +PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_const_structrp png_ptr, + png_inforp info_ptr, int srgb_intent)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(158, png_uint_32, png_get_iCCP, (png_const_structrp png_ptr, + png_inforp info_ptr, png_charpp name, int *compression_type, + png_bytepp profile, png_uint_32 *proflen)); +#endif + +#ifdef PNG_iCCP_SUPPORTED +PNG_EXPORT(159, void, png_set_iCCP, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_charp name, int compression_type, + png_const_bytep profile, png_uint_32 proflen)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(160, int, png_get_sPLT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_sPLT_tpp entries)); +#endif + +#ifdef PNG_sPLT_SUPPORTED +PNG_EXPORT(161, void, png_set_sPLT, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)); +#endif + +#ifdef PNG_TEXT_SUPPORTED +/* png_get_text also returns the number of text chunks in *num_text */ +PNG_EXPORT(162, int, png_get_text, (png_const_structrp png_ptr, + png_inforp info_ptr, png_textp *text_ptr, int *num_text)); +#endif + +/* Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#ifdef PNG_TEXT_SUPPORTED +PNG_EXPORT(163, void, png_set_text, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_textp text_ptr, int num_text)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(164, png_uint_32, png_get_tIME, (png_const_structrp png_ptr, + png_inforp info_ptr, png_timep *mod_time)); +#endif + +#ifdef PNG_tIME_SUPPORTED +PNG_EXPORT(165, void, png_set_tIME, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_timep mod_time)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(166, png_uint_32, png_get_tRNS, (png_const_structrp png_ptr, + png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans, + png_color_16p *trans_color)); +#endif + +#ifdef PNG_tRNS_SUPPORTED +PNG_EXPORT(167, void, png_set_tRNS, (png_structrp png_ptr, + png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans, + png_const_color_16p trans_color)); +#endif + +#ifdef PNG_sCAL_SUPPORTED +PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structrp png_ptr, + png_const_inforp info_ptr, int *unit, double *width, double *height)) +#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \ + defined(PNG_FLOATING_POINT_SUPPORTED) +/* NOTE: this API is currently implemented using floating point arithmetic, + * consequently it can only be used on systems with floating point support. + * In any case the range of values supported by png_fixed_point is small and it + * is highly recommended that png_get_sCAL_s be used instead. + */ +PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, + png_fixed_point *width, png_fixed_point *height)) +#endif +PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, + (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, + png_charpp swidth, png_charpp sheight)); + +PNG_FP_EXPORT(170, void, png_set_sCAL, (png_const_structrp png_ptr, + png_inforp info_ptr, int unit, double width, double height)) +PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr, + png_inforp info_ptr, int unit, png_fixed_point width, + png_fixed_point height)) +PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr, + png_inforp info_ptr, int unit, + png_const_charp swidth, png_const_charp sheight)); +#endif /* PNG_sCAL_SUPPORTED */ + +#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED +/* Provide the default handling for all unknown chunks or, optionally, for + * specific unknown chunks. + * + * NOTE: prior to 1.6.0 the handling specified for particular chunks on read was + * ignored and the default was used, the per-chunk setting only had an effect on + * write. If you wish to have chunk-specific handling on read in code that must + * work on earlier versions you must use a user chunk callback to specify the + * desired handling (keep or discard.) + * + * The 'keep' parameter is a PNG_HANDLE_CHUNK_ value as listed below. The + * parameter is interpreted as follows: + * + * READ: + * PNG_HANDLE_CHUNK_AS_DEFAULT: + * Known chunks: do normal libpng processing, do not keep the chunk (but + * see the comments below about PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + * Unknown chunks: for a specific chunk use the global default, when used + * as the default discard the chunk data. + * PNG_HANDLE_CHUNK_NEVER: + * Discard the chunk data. + * PNG_HANDLE_CHUNK_IF_SAFE: + * Keep the chunk data if the chunk is not critical else raise a chunk + * error. + * PNG_HANDLE_CHUNK_ALWAYS: + * Keep the chunk data. + * + * If the chunk data is saved it can be retrieved using png_get_unknown_chunks, + * below. Notice that specifying "AS_DEFAULT" as a global default is equivalent + * to specifying "NEVER", however when "AS_DEFAULT" is used for specific chunks + * it simply resets the behavior to the libpng default. + * + * INTERACTION WTIH USER CHUNK CALLBACKS: + * The per-chunk handling is always used when there is a png_user_chunk_ptr + * callback and the callback returns 0; the chunk is then always stored *unless* + * it is critical and the per-chunk setting is other than ALWAYS. Notice that + * the global default is *not* used in this case. (In effect the per-chunk + * value is incremented to at least IF_SAFE.) + * + * IMPORTANT NOTE: this behavior will change in libpng 1.7 - the global and + * per-chunk defaults will be honored. If you want to preserve the current + * behavior when your callback returns 0 you must set PNG_HANDLE_CHUNK_IF_SAFE + * as the default - if you don't do this libpng 1.6 will issue a warning. + * + * If you want unhandled unknown chunks to be discarded in libpng 1.6 and + * earlier simply return '1' (handled). + * + * PNG_HANDLE_AS_UNKNOWN_SUPPORTED: + * If this is *not* set known chunks will always be handled by libpng and + * will never be stored in the unknown chunk list. Known chunks listed to + * png_set_keep_unknown_chunks will have no effect. If it is set then known + * chunks listed with a keep other than AS_DEFAULT will *never* be processed + * by libpng, in addition critical chunks must either be processed by the + * callback or saved. + * + * The IHDR and IEND chunks must not be listed. Because this turns off the + * default handling for chunks that would otherwise be recognized the + * behavior of libpng transformations may well become incorrect! + * + * WRITE: + * When writing chunks the options only apply to the chunks specified by + * png_set_unknown_chunks (below), libpng will *always* write known chunks + * required by png_set_ calls and will always write the core critical chunks + * (as required for PLTE). + * + * Each chunk in the png_set_unknown_chunks list is looked up in the + * png_set_keep_unknown_chunks list to find the keep setting, this is then + * interpreted as follows: + * + * PNG_HANDLE_CHUNK_AS_DEFAULT: + * Write safe-to-copy chunks and write other chunks if the global + * default is set to _ALWAYS, otherwise don't write this chunk. + * PNG_HANDLE_CHUNK_NEVER: + * Do not write the chunk. + * PNG_HANDLE_CHUNK_IF_SAFE: + * Write the chunk if it is safe-to-copy, otherwise do not write it. + * PNG_HANDLE_CHUNK_ALWAYS: + * Write the chunk. + * + * Note that the default behavior is effectively the opposite of the read case - + * in read unknown chunks are not stored by default, in write they are written + * by default. Also the behavior of PNG_HANDLE_CHUNK_IF_SAFE is very different + * - on write the safe-to-copy bit is checked, on read the critical bit is + * checked and on read if the chunk is critical an error will be raised. + * + * num_chunks: + * =========== + * If num_chunks is positive, then the "keep" parameter specifies the manner + * for handling only those chunks appearing in the chunk_list array, + * otherwise the chunk list array is ignored. + * + * If num_chunks is 0 the "keep" parameter specifies the default behavior for + * unknown chunks, as described above. + * + * If num_chunks is negative, then the "keep" parameter specifies the manner + * for handling all unknown chunks plus all chunks recognized by libpng + * except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to + * be processed by libpng. + */ +PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr, + int keep, png_const_bytep chunk_list, int num_chunks)); + +/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned; + * the result is therefore true (non-zero) if special handling is required, + * false for the default handling. + */ +PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr, + png_const_bytep chunk_name)); +#endif + +#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED +PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr, + png_inforp info_ptr, png_const_unknown_chunkp unknowns, + int num_unknowns)); + /* NOTE: prior to 1.6.0 this routine set the 'location' field of the added + * unknowns to the location currently stored in the png_struct. This is + * invariably the wrong value on write. To fix this call the following API + * for each chunk in the list with the correct location. If you know your + * code won't be compiled on earlier versions you can rely on + * png_set_unknown_chunks(write-ptr, png_get_unknown_chunks(read-ptr)) doing + * the correct thing. + */ + +PNG_EXPORT(175, void, png_set_unknown_chunk_location, + (png_const_structrp png_ptr, png_inforp info_ptr, int chunk, int location)); + +PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structrp png_ptr, + png_inforp info_ptr, png_unknown_chunkpp entries)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + * If you need to turn it off for a chunk that your application has freed, + * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); + */ +PNG_EXPORT(177, void, png_set_invalid, (png_const_structrp png_ptr, + png_inforp info_ptr, int mask)); + +#ifdef PNG_INFO_IMAGE_SUPPORTED +/* The "params" pointer is currently not used and is for future expansion. */ +PNG_EXPORT(178, void, png_read_png, (png_structrp png_ptr, png_inforp info_ptr, + int transforms, png_voidp params)); +PNG_EXPORT(179, void, png_write_png, (png_structrp png_ptr, png_inforp info_ptr, + int transforms, png_voidp params)); +#endif + +PNG_EXPORT(180, png_const_charp, png_get_copyright, + (png_const_structrp png_ptr)); +PNG_EXPORT(181, png_const_charp, png_get_header_ver, + (png_const_structrp png_ptr)); +PNG_EXPORT(182, png_const_charp, png_get_header_version, + (png_const_structrp png_ptr)); +PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, + (png_const_structrp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structrp png_ptr, + png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 +#define PNG_HANDLE_CHUNK_LAST 4 + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. + */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +PNG_EXPORT(185, void, png_set_strip_error_numbers, (png_structrp png_ptr, + png_uint_32 strip_mode)); +#endif + +/* Added in libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +PNG_EXPORT(186, void, png_set_user_limits, (png_structrp png_ptr, + png_uint_32 user_width_max, png_uint_32 user_height_max)); +PNG_EXPORT(187, png_uint_32, png_get_user_width_max, + (png_const_structrp png_ptr)); +PNG_EXPORT(188, png_uint_32, png_get_user_height_max, + (png_const_structrp png_ptr)); +/* Added in libpng-1.4.0 */ +PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structrp png_ptr, + png_uint_32 user_chunk_cache_max)); +PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, + (png_const_structrp png_ptr)); +/* Added in libpng-1.4.1 */ +PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structrp png_ptr, + png_alloc_size_t user_chunk_cache_max)); +PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, + (png_const_structrp png_ptr)); +#endif + +#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) +PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, + (png_const_structrp png_ptr, png_const_inforp info_ptr)); + +PNG_FP_EXPORT(196, float, png_get_x_offset_inches, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +#endif + +PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structrp png_ptr, + png_const_inforp info_ptr)) +#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ +PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, + (png_const_structrp png_ptr, png_const_inforp info_ptr)) +#endif + +# ifdef PNG_pHYs_SUPPORTED +PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr, + png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, + int *unit_type)); +# endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ + +/* Added in libpng-1.4.0 */ +#ifdef PNG_IO_STATE_SUPPORTED +PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_const_structrp png_ptr)); + +/* Removed from libpng 1.6; use png_get_io_chunk_type. */ +PNG_REMOVED(200, png_const_bytep, png_get_io_chunk_name, (png_structrp png_ptr), + PNG_DEPRECATED) + +PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, + (png_const_structrp png_ptr)); + +/* The flags returned by png_get_io_state() are the following: */ +# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ +# define PNG_IO_READING 0x0001 /* currently reading */ +# define PNG_IO_WRITING 0x0002 /* currently writing */ +# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ +# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ +# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ +# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ +# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ +# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ +#endif /* ?PNG_IO_STATE_SUPPORTED */ + +/* Interlace support. The following macros are always defined so that if + * libpng interlace handling is turned off the macros may be used to handle + * interlaced images within the application. + */ +#define PNG_INTERLACE_ADAM7_PASSES 7 + +/* Two macros to return the first row and first column of the original, + * full, image which appears in a given pass. 'pass' is in the range 0 + * to 6 and the result is in the range 0 to 7. + */ +#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7) +#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7) + +/* A macro to return the offset between pixels in the output row for a pair of + * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that + * follows. Note that ROW_OFFSET is the offset from one row to the next whereas + * COL_OFFSET is from one column to the next, within a row. + */ +#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8) +#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1)) + +/* Two macros to help evaluate the number of rows or columns in each + * pass. This is expressed as a shift - effectively log2 of the number or + * rows or columns in each 8x8 tile of the original image. + */ +#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) +#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) + +/* Hence two macros to determine the number of rows or columns in a given + * pass of an image given its height or width. In fact these macros may + * return non-zero even though the sub-image is empty, because the other + * dimension may be empty for a small image. + */ +#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) +#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) + +/* For the reader row callbacks (both progressive and sequential) it is + * necessary to find the row in the output image given a row in an interlaced + * image, so two more macros: + */ +#define PNG_ROW_FROM_PASS_ROW(y_in, pass) \ + (((y_in)<>(((7-(off))-(pass))<<2)) & 0xF) | \ + ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0)) + +#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ + ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) +#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ + ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ + * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 \ + - (png_uint_16)(alpha)) + 128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \ + * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(65535 \ + - (png_uint_32)(alpha)) + 32768); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* Standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + 127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \ + 32767) / 65535) +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); +PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); +PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); +#endif + +PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_const_structrp png_ptr, + png_const_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); +#endif +#ifdef PNG_SAVE_INT_32_SUPPORTED +PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); +#endif + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED +PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ +#endif + +#ifdef PNG_USE_READ_MACROS +/* Inline macros to do direct reads of bytes from the input buffer. + * The png_get_int_32() routine assumes we are using two's complement + * format for negative values, which is almost certainly true. + */ +# define PNG_get_uint_32(buf) \ + (((png_uint_32)(*(buf)) << 24) + \ + ((png_uint_32)(*((buf) + 1)) << 16) + \ + ((png_uint_32)(*((buf) + 2)) << 8) + \ + ((png_uint_32)(*((buf) + 3)))) + + /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the + * function) incorrectly returned a value of type png_uint_32. + */ +# define PNG_get_uint_16(buf) \ + ((png_uint_16) \ + (((unsigned int)(*(buf)) << 8) + \ + ((unsigned int)(*((buf) + 1))))) + +# define PNG_get_int_32(buf) \ + ((png_int_32)((*(buf) & 0x80) \ + ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ + : (png_int_32)png_get_uint_32(buf))) + + /* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h, + * but defining a macro name prefixed with PNG_PREFIX. + */ +# ifndef PNG_PREFIX +# define png_get_uint_32(buf) PNG_get_uint_32(buf) +# define png_get_uint_16(buf) PNG_get_uint_16(buf) +# define png_get_int_32(buf) PNG_get_int_32(buf) +# endif +#else +# ifdef PNG_PREFIX + /* No macros; revert to the (redefined) function */ +# define PNG_get_uint_32 (png_get_uint_32) +# define PNG_get_uint_16 (png_get_uint_16) +# define PNG_get_int_32 (png_get_int_32) +# endif +#endif + +/******************************************************************************* + * SIMPLIFIED API + ******************************************************************************* + * + * Please read the documentation in libpng-manual.txt (TODO: write said + * documentation) if you don't understand what follows. + * + * The simplified API hides the details of both libpng and the PNG file format + * itself. It allows PNG files to be read into a very limited number of + * in-memory bitmap formats or to be written from the same formats. If these + * formats do not accomodate your needs then you can, and should, use the more + * sophisticated APIs above - these support a wide variety of in-memory formats + * and a wide variety of sophisticated transformations to those formats as well + * as a wide variety of APIs to manipulate ancillary information. + * + * To read a PNG file using the simplified API: + * + * 1) Declare a 'png_image' structure (see below) on the stack and set the + * version field to PNG_IMAGE_VERSION. + * 2) Call the appropriate png_image_begin_read... function. + * 3) Set the png_image 'format' member to the required sample format. + * 4) Allocate a buffer for the image and, if required, the color-map. + * 5) Call png_image_finish_read to read the image and, if required, the + * color-map into your buffers. + * + * There are no restrictions on the format of the PNG input itself; all valid + * color types, bit depths, and interlace methods are acceptable, and the + * input image is transformed as necessary to the requested in-memory format + * during the png_image_finish_read() step. The only caveat is that if you + * request a color-mapped image from a PNG that is full-color or makes + * complex use of an alpha channel the transformation is extremely lossy and the + * result may look terrible. + * + * To write a PNG file using the simplified API: + * + * 1) Declare a 'png_image' structure on the stack and memset() it to all zero. + * 2) Initialize the members of the structure that describe the image, setting + * the 'format' member to the format of the image samples. + * 3) Call the appropriate png_image_write... function with a pointer to the + * image and, if necessary, the color-map to write the PNG data. + * + * png_image is a structure that describes the in-memory format of an image + * when it is being read or defines the in-memory format of an image that you + * need to write: + */ +#define PNG_IMAGE_VERSION 1 + +typedef struct png_control *png_controlp; +typedef struct +{ + png_controlp opaque; /* Initialize to NULL, free with png_image_free */ + png_uint_32 version; /* Set to PNG_IMAGE_VERSION */ + png_uint_32 width; /* Image width in pixels (columns) */ + png_uint_32 height; /* Image height in pixels (rows) */ + png_uint_32 format; /* Image format as defined below */ + png_uint_32 flags; /* A bit mask containing informational flags */ + png_uint_32 colormap_entries; + /* Number of entries in the color-map */ + + /* In the event of an error or warning the following field will be set to a + * non-zero value and the 'message' field will contain a '\0' terminated + * string with the libpng error or warning message. If both warnings and + * an error were encountered, only the error is recorded. If there + * are multiple warnings, only the first one is recorded. + * + * The upper 30 bits of this value are reserved, the low two bits contain + * a value as follows: + */ +# define PNG_IMAGE_WARNING 1 +# define PNG_IMAGE_ERROR 2 + /* + * The result is a two bit code such that a value more than 1 indicates + * a failure in the API just called: + * + * 0 - no warning or error + * 1 - warning + * 2 - error + * 3 - error preceded by warning + */ +# define PNG_IMAGE_FAILED(png_cntrl) ((((png_cntrl).warning_or_error)&0x03)>1) + + png_uint_32 warning_or_error; + + char message[64]; +} png_image, *png_imagep; + +/* The samples of the image have one to four channels whose components have + * original values in the range 0 to 1.0: + * + * 1: A single gray or luminance channel (G). + * 2: A gray/luminance channel and an alpha channel (GA). + * 3: Three red, green, blue color channels (RGB). + * 4: Three color channels and an alpha channel (RGBA). + * + * The components are encoded in one of two ways: + * + * a) As a small integer, value 0..255, contained in a single byte. For the + * alpha channel the original value is simply value/255. For the color or + * luminance channels the value is encoded according to the sRGB specification + * and matches the 8-bit format expected by typical display devices. + * + * The color/gray channels are not scaled (pre-multiplied) by the alpha + * channel and are suitable for passing to color management software. + * + * b) As a value in the range 0..65535, contained in a 2-byte integer. All + * channels can be converted to the original value by dividing by 65535; all + * channels are linear. Color channels use the RGB encoding (RGB end-points) of + * the sRGB specification. This encoding is identified by the + * PNG_FORMAT_FLAG_LINEAR flag below. + * + * When the simplified API needs to convert between sRGB and linear colorspaces, + * the actual sRGB transfer curve defined in the sRGB specification (see the + * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2 + * approximation used elsewhere in libpng. + * + * When an alpha channel is present it is expected to denote pixel coverage + * of the color or luminance channels and is returned as an associated alpha + * channel: the color/gray channels are scaled (pre-multiplied) by the alpha + * value. + * + * The samples are either contained directly in the image data, between 1 and 8 + * bytes per pixel according to the encoding, or are held in a color-map indexed + * by bytes in the image data. In the case of a color-map the color-map entries + * are individual samples, encoded as above, and the image data has one byte per + * pixel to select the relevant sample from the color-map. + */ + +/* PNG_FORMAT_* + * + * #defines to be used in png_image::format. Each #define identifies a + * particular layout of sample data and, if present, alpha values. There are + * separate defines for each of the two component encodings. + * + * A format is built up using single bit flag values. All combinations are + * valid. Formats can be built up from the flag values or you can use one of + * the predefined values below. When testing formats always use the FORMAT_FLAG + * macros to test for individual features - future versions of the library may + * add new flags. + * + * When reading or writing color-mapped images the format should be set to the + * format of the entries in the color-map then png_image_{read,write}_colormap + * called to read or write the color-map and set the format correctly for the + * image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly! + * + * NOTE: libpng can be built with particular features disabled, if you see + * compiler errors because the definition of one of the following flags has been + * compiled out it is because libpng does not have the required support. It is + * possible, however, for the libpng configuration to enable the format on just + * read or just write; in that case you may see an error at run time. You can + * guard against this by checking for the definition of the appropriate + * "_SUPPORTED" macro, one of: + * + * PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED + */ +#define PNG_FORMAT_FLAG_ALPHA 0x01U /* format with an alpha channel */ +#define PNG_FORMAT_FLAG_COLOR 0x02U /* color format: otherwise grayscale */ +#define PNG_FORMAT_FLAG_LINEAR 0x04U /* 2 byte channels else 1 byte */ +#define PNG_FORMAT_FLAG_COLORMAP 0x08U /* image data is color-mapped */ + +#ifdef PNG_FORMAT_BGR_SUPPORTED +# define PNG_FORMAT_FLAG_BGR 0x10U /* BGR colors, else order is RGB */ +#endif + +#ifdef PNG_FORMAT_AFIRST_SUPPORTED +# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */ +#endif + +/* Commonly used formats have predefined macros. + * + * First the single byte (sRGB) formats: + */ +#define PNG_FORMAT_GRAY 0 +#define PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA +#define PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST) +#define PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR +#define PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR) +#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST) +#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST) + +/* Then the linear 2-byte formats. When naming these "Y" is used to + * indicate a luminance (gray) channel. + */ +#define PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR +#define PNG_FORMAT_LINEAR_Y_ALPHA (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_LINEAR_RGB (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR) +#define PNG_FORMAT_LINEAR_RGB_ALPHA \ + (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA) + +/* With color-mapped formats the image data is one byte for each pixel, the byte + * is an index into the color-map which is formatted as above. To obtain a + * color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP + * to one of the above definitions, or you can use one of the definitions below. + */ +#define PNG_FORMAT_RGB_COLORMAP (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_BGR_COLORMAP (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_RGBA_COLORMAP (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_ARGB_COLORMAP (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_BGRA_COLORMAP (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP) +#define PNG_FORMAT_ABGR_COLORMAP (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP) + +/* PNG_IMAGE macros + * + * These are convenience macros to derive information from a png_image + * structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the + * actual image sample values - either the entries in the color-map or the + * pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values + * for the pixels and will always return 1 for color-mapped formats. The + * remaining macros return information about the rows in the image and the + * complete image. + * + * NOTE: All the macros that take a png_image::format parameter are compile time + * constants if the format parameter is, itself, a constant. Therefore these + * macros can be used in array declarations and case labels where required. + * Similarly the macros are also pre-processor constants (sizeof is not used) so + * they can be used in #if tests. + * + * First the information about the samples. + */ +#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)\ + (((fmt)&(PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA))+1) + /* Return the total number of channels in a given format: 1..4 */ + +#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)\ + ((((fmt) & PNG_FORMAT_FLAG_LINEAR) >> 2)+1) + /* Return the size in bytes of a single component of a pixel or color-map + * entry (as appropriate) in the image: 1 or 2. + */ + +#define PNG_IMAGE_SAMPLE_SIZE(fmt)\ + (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)) + /* This is the size of the sample data for one sample. If the image is + * color-mapped it is the size of one color-map entry (and image pixels are + * one byte in size), otherwise it is the size of one image pixel. + */ + +#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\ + (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256) + /* The maximum size of the color-map required by the format expressed in a + * count of components. This can be used to compile-time allocate a + * color-map: + * + * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)]; + * + * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)]; + * + * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the + * information from one of the png_image_begin_read_ APIs and dynamically + * allocate the required memory. + */ + +/* Corresponding information about the pixels */ +#define PNG_IMAGE_PIXEL_(test,fmt)\ + (((fmt)&PNG_FORMAT_FLAG_COLORMAP)?1:test(fmt)) + +#define PNG_IMAGE_PIXEL_CHANNELS(fmt)\ + PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS,fmt) + /* The number of separate channels (components) in a pixel; 1 for a + * color-mapped image. + */ + +#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\ + PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt) + /* The size, in bytes, of each component in a pixel; 1 for a color-mapped + * image. + */ + +#define PNG_IMAGE_PIXEL_SIZE(fmt) PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_SIZE,fmt) + /* The size, in bytes, of a complete pixel; 1 for a color-mapped image. */ + +/* Information about the whole row, or whole image */ +#define PNG_IMAGE_ROW_STRIDE(image)\ + (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width) + /* Return the total number of components in a single row of the image; this + * is the minimum 'row stride', the minimum count of components between each + * row. For a color-mapped image this is the minimum number of bytes in a + * row. + */ + +#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\ + (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride)) + /* Return the size, in bytes, of an image buffer given a png_image and a row + * stride - the number of components to leave space for in each row. + */ + +#define PNG_IMAGE_SIZE(image)\ + PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image)) + /* Return the size, in bytes, of the image in memory given just a png_image; + * the row stride is the minimum stride required for the image. + */ + +#define PNG_IMAGE_COLORMAP_SIZE(image)\ + (PNG_IMAGE_SAMPLE_SIZE((image).format) * (image).colormap_entries) + /* Return the size, in bytes, of the color-map of this image. If the image + * format is not a color-map format this will return a size sufficient for + * 256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if + * you don't want to allocate a color-map in this case. + */ + +/* PNG_IMAGE_FLAG_* + * + * Flags containing additional information about the image are held in the + * 'flags' field of png_image. + */ +#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB 0x01 + /* This indicates the the RGB values of the in-memory bitmap do not + * correspond to the red, green and blue end-points defined by sRGB. + */ + +#define PNG_IMAGE_FLAG_FAST 0x02 + /* On write emphasise speed over compression; the resultant PNG file will be + * larger but will be produced significantly faster, particular for large + * images. Do not use this option for images which will be distributed, only + * used it when producing intermediate files that will be read back in + * repeatedly. For a typical 24-bit image the option will double the read + * speed at the cost of increasing the image size by 25%, however for many + * more compressible images the PNG file can be 10 times larger with only a + * slight speed gain. + */ + +#define PNG_IMAGE_FLAG_16BIT_sRGB 0x04 + /* On read if the image is a 16-bit per component image and there is no gAMA + * or sRGB chunk assume that the components are sRGB encoded. Notice that + * images output by the simplified API always have gamma information; setting + * this flag only affects the interpretation of 16-bit images from an + * external source. It is recommended that the application expose this flag + * to the user; the user can normally easily recognize the difference between + * linear and sRGB encoding. This flag has no effect on write - the data + * passed to the write APIs must have the correct encoding (as defined + * above.) + * + * If the flag is not set (the default) input 16-bit per component data is + * assumed to be linear. + * + * NOTE: the flag can only be set after the png_image_begin_read_ call, + * because that call initializes the 'flags' field. + */ + +#ifdef PNG_SIMPLIFIED_READ_SUPPORTED +/* READ APIs + * --------- + * + * The png_image passed to the read APIs must have been initialized by setting + * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.) + */ +#ifdef PNG_STDIO_SUPPORTED +PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image, + const char *file_name)); + /* The named file is opened for read and the image header is filled in + * from the PNG header in the file. + */ + +PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image, + FILE* file)); + /* The PNG header is read from the stdio FILE object. */ +#endif /* PNG_STDIO_SUPPORTED */ + +PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image, + png_const_voidp memory, png_size_t size)); + /* The PNG header is read from the given memory buffer. */ + +PNG_EXPORT(237, int, png_image_finish_read, (png_imagep image, + png_const_colorp background, void *buffer, png_int_32 row_stride, + void *colormap)); + /* Finish reading the image into the supplied buffer and clean up the + * png_image structure. + * + * row_stride is the step, in byte or 2-byte units as appropriate, + * between adjacent rows. A positive stride indicates that the top-most row + * is first in the buffer - the normal top-down arrangement. A negative + * stride indicates that the bottom-most row is first in the buffer. + * + * background need only be supplied if an alpha channel must be removed from + * a png_byte format and the removal is to be done by compositing on a solid + * color; otherwise it may be NULL and any composition will be done directly + * onto the buffer. The value is an sRGB color to use for the background, + * for grayscale output the green channel is used. + * + * background must be supplied when an alpha channel must be removed from a + * single byte color-mapped output format, in other words if: + * + * 1) The original format from png_image_begin_read_from_* had + * PNG_FORMAT_FLAG_ALPHA set. + * 2) The format set by the application does not. + * 3) The format set by the application has PNG_FORMAT_FLAG_COLORMAP set and + * PNG_FORMAT_FLAG_LINEAR *not* set. + * + * For linear output removing the alpha channel is always done by compositing + * on black and background is ignored. + * + * colormap must be supplied when PNG_FORMAT_FLAG_COLORMAP is set. It must + * be at least the size (in bytes) returned by PNG_IMAGE_COLORMAP_SIZE. + * image->colormap_entries will be updated to the actual number of entries + * written to the colormap; this may be less than the original value. + */ + +PNG_EXPORT(238, void, png_image_free, (png_imagep image)); + /* Free any data allocated by libpng in image->opaque, setting the pointer to + * NULL. May be called at any time after the structure is initialized. + */ +#endif /* PNG_SIMPLIFIED_READ_SUPPORTED */ + +#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED +#ifdef PNG_STDIO_SUPPORTED +/* WRITE APIS + * ---------- + * For write you must initialize a png_image structure to describe the image to + * be written. To do this use memset to set the whole structure to 0 then + * initialize fields describing your image. + * + * version: must be set to PNG_IMAGE_VERSION + * opaque: must be initialized to NULL + * width: image width in pixels + * height: image height in rows + * format: the format of the data (image and color-map) you wish to write + * flags: set to 0 unless one of the defined flags applies; set + * PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images where the RGB + * values do not correspond to the colors in sRGB. + * colormap_entries: set to the number of entries in the color-map (0 to 256) + */ +PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image, + const char *file, int convert_to_8bit, const void *buffer, + png_int_32 row_stride, const void *colormap)); + /* Write the image to the named file. */ + +PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file, + int convert_to_8_bit, const void *buffer, png_int_32 row_stride, + const void *colormap)); + /* Write the image to the given (FILE*). */ + +/* With both write APIs if image is in one of the linear formats with 16-bit + * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG + * gamma encoded according to the sRGB specification, otherwise a 16-bit linear + * encoded PNG file is written. + * + * With color-mapped data formats the colormap parameter point to a color-map + * with at least image->colormap_entries encoded in the specified format. If + * the format is linear the written PNG color-map will be converted to sRGB + * regardless of the convert_to_8_bit flag. + * + * With all APIs row_stride is handled as in the read APIs - it is the spacing + * from one row to the next in component sized units (1 or 2 bytes) and if + * negative indicates a bottom-up row layout in the buffer. + * + * Note that the write API does not support interlacing or sub-8-bit pixels. + */ +#endif /* PNG_STDIO_SUPPORTED */ +#endif /* PNG_SIMPLIFIED_WRITE_SUPPORTED */ +/******************************************************************************* + * END OF SIMPLIFIED API + ******************************************************************************/ + +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +PNG_EXPORT(242, void, png_set_check_for_invalid_index, + (png_structrp png_ptr, int allowed)); +# ifdef PNG_GET_PALETTE_MAX_SUPPORTED +PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr, + png_const_infop info_ptr)); +# endif +#endif /* CHECK_FOR_INVALID_INDEX */ + +/******************************************************************************* + * IMPLEMENTATION OPTIONS + ******************************************************************************* + * + * Support for arbitrary implementation-specific optimizations. The API allows + * particular options to be turned on or off. 'Option' is the number of the + * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given + * by the PNG_OPTION_ defines below. + * + * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions, + * are detected at run time, however sometimes it may be impossible + * to do this in user mode, in which case it is necessary to discover + * the capabilities in an OS specific way. Such capabilities are + * listed here when libpng has support for them and must be turned + * ON by the application if present. + * + * SOFTWARE: sometimes software optimizations actually result in performance + * decrease on some architectures or systems, or with some sets of + * PNG images. 'Software' options allow such optimizations to be + * selected at run time. + */ +#ifdef PNG_SET_OPTION_SUPPORTED +#ifdef PNG_ARM_NEON_API_SUPPORTED +# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ +#endif +#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */ +#define PNG_OPTION_NEXT 4 /* Next option - numbers must be even */ + +/* Return values: NOTE: there are four values and 'off' is *not* zero */ +#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ +#define PNG_OPTION_INVALID 1 /* Option number out of range */ +#define PNG_OPTION_OFF 2 +#define PNG_OPTION_ON 3 + +PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, + int onoff)); +#endif + +/******************************************************************************* + * END OF HARDWARE OPTIONS + ******************************************************************************/ + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project + * defs, scripts/pnglibconf.h, and scripts/pnglibconf.h.prebuilt + */ + +/* The last ordinal number (this is the *last* one already used; the next + * one to use is one more than this.) Maintainer, remember to add an entry to + * scripts/symbols.def as well. + */ +#ifdef PNG_EXPORT_LAST_ORDINAL + PNG_EXPORT_LAST_ORDINAL(244); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* Do not put anything past this line */ +#endif /* PNG_H */ diff --git a/src/lib_armv7hf/libpng16/pngconf.h b/src/lib_armv7hf/libpng16/pngconf.h new file mode 100644 index 0000000..0808c1c --- /dev/null +++ b/src/lib_armv7hf/libpng16/pngconf.h @@ -0,0 +1,617 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.6.3 - July 18, 2013 + * + * Copyright (c) 1998-2013 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +/* To do: Do all of this in scripts/pnglibconf.dfa */ +#ifdef PNG_SAFE_LIMITS_SUPPORTED +# ifdef PNG_USER_WIDTH_MAX +# undef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000L +# endif +# ifdef PNG_USER_HEIGHT_MAX +# undef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000L +# endif +# ifdef PNG_USER_CHUNK_MALLOC_MAX +# undef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 4000000L +# endif +# ifdef PNG_USER_CHUNK_CACHE_MAX +# undef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 128 +# endif +#endif + +#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */ + +/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C + * compiler for correct compilation. The following header files are required by + * the standard. If your compiler doesn't provide these header files, or they + * do not match the standard, you will need to provide/improve them. + */ +#include +#include + +/* Library header files. These header files are all defined by ISOC90; libpng + * expects conformant implementations, however, an ISOC90 conformant system need + * not provide these header files if the functionality cannot be implemented. + * In this case it will be necessary to disable the relevant parts of libpng in + * the build of pnglibconf.h. + * + * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not + * include this unnecessary header file. + */ + +#ifdef PNG_STDIO_SUPPORTED + /* Required for the definition of FILE: */ +# include +#endif + +#ifdef PNG_SETJMP_SUPPORTED + /* Required for the definition of jmp_buf and the declaration of longjmp: */ +# include +#endif + +#ifdef PNG_CONVERT_tIME_SUPPORTED + /* Required for struct tm: */ +# include +#endif + +#endif /* PNG_BUILDING_SYMBOL_TABLE */ + +/* Prior to 1.6.0 it was possible to turn off 'const' in declarations using + * PNG_NO_CONST; this is no longer supported except for data declarations which + * apparently still cause problems in 2011 on some compilers. + */ +#define PNG_CONST const /* backward compatibility only */ + +/* This controls optimization of the reading of 16 and 32 bit values + * from PNG files. It can be set on a per-app-file basis - it + * just changes whether a macro is used when the function is called. + * The library builder sets the default; if read functions are not + * built into the library the macro implementation is forced on. + */ +#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED +# define PNG_USE_READ_MACROS +#endif +#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) +# if PNG_DEFAULT_READ_MACROS +# define PNG_USE_READ_MACROS +# endif +#endif + +/* COMPILER SPECIFIC OPTIONS. + * + * These options are provided so that a variety of difficult compilers + * can be used. Some are fixed at build time (e.g. PNG_API_RULE + * below) but still have compiler specific implementations, others + * may be changed on a per-file basis when compiling against libpng. + */ + +/* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect + * against legacy (pre ISOC90) compilers that did not understand function + * prototypes. It is not required for modern C compilers. + */ +#ifndef PNGARG +# define PNGARG(arglist) arglist +#endif + +/* Function calling conventions. + * ============================= + * Normally it is not necessary to specify to the compiler how to call + * a function - it just does it - however on x86 systems derived from + * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems + * and some others) there are multiple ways to call a function and the + * default can be changed on the compiler command line. For this reason + * libpng specifies the calling convention of every exported function and + * every function called via a user supplied function pointer. This is + * done in this file by defining the following macros: + * + * PNGAPI Calling convention for exported functions. + * PNGCBAPI Calling convention for user provided (callback) functions. + * PNGCAPI Calling convention used by the ANSI-C library (required + * for longjmp callbacks and sometimes used internally to + * specify the calling convention for zlib). + * + * These macros should never be overridden. If it is necessary to + * change calling convention in a private build this can be done + * by setting PNG_API_RULE (which defaults to 0) to one of the values + * below to select the correct 'API' variants. + * + * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. + * This is correct in every known environment. + * PNG_API_RULE=1 Use the operating system convention for PNGAPI and + * the 'C' calling convention (from PNGCAPI) for + * callbacks (PNGCBAPI). This is no longer required + * in any known environment - if it has to be used + * please post an explanation of the problem to the + * libpng mailing list. + * + * These cases only differ if the operating system does not use the C + * calling convention, at present this just means the above cases + * (x86 DOS/Windows sytems) and, even then, this does not apply to + * Cygwin running on those systems. + * + * Note that the value must be defined in pnglibconf.h so that what + * the application uses to call the library matches the conventions + * set when building the library. + */ + +/* Symbol export + * ============= + * When building a shared library it is almost always necessary to tell + * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' + * is used to mark the symbols. On some systems these symbols can be + * extracted at link time and need no special processing by the compiler, + * on other systems the symbols are flagged by the compiler and just + * the declaration requires a special tag applied (unfortunately) in a + * compiler dependent way. Some systems can do either. + * + * A small number of older systems also require a symbol from a DLL to + * be flagged to the program that calls it. This is a problem because + * we do not know in the header file included by application code that + * the symbol will come from a shared library, as opposed to a statically + * linked one. For this reason the application must tell us by setting + * the magic flag PNG_USE_DLL to turn on the special processing before + * it includes png.h. + * + * Four additional macros are used to make this happen: + * + * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from + * the build or imported if PNG_USE_DLL is set - compiler + * and system specific. + * + * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to + * 'type', compiler specific. + * + * PNG_DLL_EXPORT Set to the magic to use during a libpng build to + * make a symbol exported from the DLL. Not used in the + * public header files; see pngpriv.h for how it is used + * in the libpng build. + * + * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come + * from a DLL - used to define PNG_IMPEXP when + * PNG_USE_DLL is set. + */ + +/* System specific discovery. + * ========================== + * This code is used at build time to find PNG_IMPEXP, the API settings + * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL + * import processing is possible. On Windows systems it also sets + * compiler-specific macros to the values required to change the calling + * conventions of the various functions. + */ +#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ + defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) + /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or + * MinGW on any architecture currently supported by Windows. Also includes + * Watcom builds but these need special treatment because they are not + * compatible with GCC or Visual C because of different calling conventions. + */ +# if PNG_API_RULE == 2 + /* If this line results in an error, either because __watcall is not + * understood or because of a redefine just below you cannot use *this* + * build of the library with the compiler you are using. *This* build was + * build using Watcom and applications must also be built using Watcom! + */ +# define PNGCAPI __watcall +# endif + +# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) +# define PNGCAPI __cdecl +# if PNG_API_RULE == 1 + /* If this line results in an error __stdcall is not understood and + * PNG_API_RULE should not have been set to '1'. + */ +# define PNGAPI __stdcall +# endif +# else + /* An older compiler, or one not detected (erroneously) above, + * if necessary override on the command line to get the correct + * variants for the compiler. + */ +# ifndef PNGCAPI +# define PNGCAPI _cdecl +# endif +# if PNG_API_RULE == 1 && !defined(PNGAPI) +# define PNGAPI _stdcall +# endif +# endif /* compiler/api */ + + /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ + +# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) +# error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed" +# endif + +# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ + (defined(__BORLANDC__) && __BORLANDC__ < 0x500) + /* older Borland and MSC + * compilers used '__export' and required this to be after + * the type. + */ +# ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP +# endif +# define PNG_DLL_EXPORT __export +# else /* newer compiler */ +# define PNG_DLL_EXPORT __declspec(dllexport) +# ifndef PNG_DLL_IMPORT +# define PNG_DLL_IMPORT __declspec(dllimport) +# endif +# endif /* compiler */ + +#else /* !Windows */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# define PNGAPI _System +# else /* !Windows/x86 && !OS/2 */ + /* Use the defaults, or define PNG*API on the command line (but + * this will have to be done for every compile!) + */ +# endif /* other system, !OS/2 */ +#endif /* !Windows/x86 */ + +/* Now do all the defaulting . */ +#ifndef PNGCAPI +# define PNGCAPI +#endif +#ifndef PNGCBAPI +# define PNGCBAPI PNGCAPI +#endif +#ifndef PNGAPI +# define PNGAPI PNGCAPI +#endif + +/* PNG_IMPEXP may be set on the compilation system command line or (if not set) + * then in an internal header file when building the library, otherwise (when + * using the library) it is set here. + */ +#ifndef PNG_IMPEXP +# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) + /* This forces use of a DLL, disallowing static linking */ +# define PNG_IMPEXP PNG_DLL_IMPORT +# endif + +# ifndef PNG_IMPEXP +# define PNG_IMPEXP +# endif +#endif + +/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat + * 'attributes' as a storage class - the attributes go at the start of the + * function definition, and attributes are always appended regardless of the + * compiler. This considerably simplifies these macros but may cause problems + * if any compilers both need function attributes and fail to handle them as + * a storage class (this is unlikely.) + */ +#ifndef PNG_FUNCTION +# define PNG_FUNCTION(type, name, args, attributes) attributes type name args +#endif + +#ifndef PNG_EXPORT_TYPE +# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type +#endif + + /* The ordinal value is only relevant when preprocessing png.h for symbol + * table entries, so we discard it here. See the .dfn files in the + * scripts directory. + */ +#ifndef PNG_EXPORTA + +# define PNG_EXPORTA(ordinal, type, name, args, attributes)\ + PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \ + extern attributes) +#endif + +/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, + * so make something non-empty to satisfy the requirement: + */ +#define PNG_EMPTY /*empty list*/ + +#define PNG_EXPORT(ordinal, type, name, args)\ + PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) + +/* Use PNG_REMOVED to comment out a removed interface. */ +#ifndef PNG_REMOVED +# define PNG_REMOVED(ordinal, type, name, args, attributes) +#endif + +#ifndef PNG_CALLBACK +# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) +#endif + +/* Support for compiler specific function attributes. These are used + * so that where compiler support is available incorrect use of API + * functions in png.h will generate compiler warnings. + * + * Added at libpng-1.2.41. + */ + +#ifndef PNG_NO_PEDANTIC_WARNINGS +# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED +# define PNG_PEDANTIC_WARNINGS_SUPPORTED +# endif +#endif + +#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED + /* Support for compiler specific function attributes. These are used + * so that where compiler support is available, incorrect use of API + * functions in png.h will generate compiler warnings. Added at libpng + * version 1.2.41. Disabling these removes the warnings but may also produce + * less efficient code. + */ +# if defined(__GNUC__) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __attribute__((__noreturn__)) +# endif +# if __GNUC__ >= 3 +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __attribute__((__malloc__)) +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __attribute__((__deprecated__)) +# endif +# ifndef PNG_PRIVATE +# if 0 /* Doesn't work so we use deprecated instead*/ +# define PNG_PRIVATE \ + __attribute__((warning("This function is not exported by libpng."))) +# else +# define PNG_PRIVATE \ + __attribute__((__deprecated__)) +# endif +# endif +# if ((__GNUC__ != 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1)) +# ifndef PNG_RESTRICT +# define PNG_RESTRICT __restrict +# endif +# endif /* __GNUC__ == 3.0 */ +# endif /* __GNUC__ >= 3 */ + +# elif defined(_MSC_VER) && (_MSC_VER >= 1300) +# ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* not supported */ +# endif +# ifndef PNG_NORETURN +# define PNG_NORETURN __declspec(noreturn) +# endif +# ifndef PNG_ALLOCATED +# if (_MSC_VER >= 1400) +# define PNG_ALLOCATED __declspec(restrict) +# endif +# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __declspec(deprecated) +# endif +# ifndef PNG_PRIVATE +# define PNG_PRIVATE __declspec(deprecated) +# endif +# ifndef PNG_RESTRICT +# if (_MSC_VER >= 1400) +# define PNG_RESTRICT __restrict +# endif +# endif + +# elif defined(__WATCOMC__) +# ifndef PNG_RESTRICT +# define PNG_RESTRICT __restrict +# endif +# endif /* _MSC_VER */ +#endif /* PNG_PEDANTIC_WARNINGS */ + +#ifndef PNG_DEPRECATED +# define PNG_DEPRECATED /* Use of this function is deprecated */ +#endif +#ifndef PNG_USE_RESULT +# define PNG_USE_RESULT /* The result of this function must be checked */ +#endif +#ifndef PNG_NORETURN +# define PNG_NORETURN /* This function does not return */ +#endif +#ifndef PNG_ALLOCATED +# define PNG_ALLOCATED /* The result of the function is new memory */ +#endif +#ifndef PNG_PRIVATE +# define PNG_PRIVATE /* This is a private libpng function */ +#endif +#ifndef PNG_RESTRICT +# define PNG_RESTRICT /* The C99 "restrict" feature */ +#endif +#ifndef PNG_FP_EXPORT /* A floating point API. */ +# ifdef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FP_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args); +# else /* No floating point APIs */ +# define PNG_FP_EXPORT(ordinal, type, name, args) +# endif +#endif +#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ +# ifdef PNG_FIXED_POINT_SUPPORTED +# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ + PNG_EXPORT(ordinal, type, name, args); +# else /* No fixed point APIs */ +# define PNG_FIXED_EXPORT(ordinal, type, name, args) +# endif +#endif + +#ifndef PNG_BUILDING_SYMBOL_TABLE +/* Some typedefs to get us started. These should be safe on most of the common + * platforms. + * + * png_uint_32 and png_int_32 may, currently, be larger than required to hold a + * 32-bit value however this is not normally advisable. + * + * png_uint_16 and png_int_16 should always be two bytes in size - this is + * verified at library build time. + * + * png_byte must always be one byte in size. + * + * The checks below use constants from limits.h, as defined by the ISOC90 + * standard. + */ +#if CHAR_BIT == 8 && UCHAR_MAX == 255 + typedef unsigned char png_byte; +#else +# error "libpng requires 8 bit bytes" +#endif + +#if INT_MIN == -32768 && INT_MAX == 32767 + typedef int png_int_16; +#elif SHRT_MIN == -32768 && SHRT_MAX == 32767 + typedef short png_int_16; +#else +# error "libpng requires a signed 16 bit type" +#endif + +#if UINT_MAX == 65535 + typedef unsigned int png_uint_16; +#elif USHRT_MAX == 65535 + typedef unsigned short png_uint_16; +#else +# error "libpng requires an unsigned 16 bit type" +#endif + +#if INT_MIN < -2147483646 && INT_MAX > 2147483646 + typedef int png_int_32; +#elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646 + typedef long int png_int_32; +#else +# error "libpng requires a signed 32 bit (or more) type" +#endif + +#if UINT_MAX > 4294967294 + typedef unsigned int png_uint_32; +#elif ULONG_MAX > 4294967294 + typedef unsigned long int png_uint_32; +#else +# error "libpng requires an unsigned 32 bit (or more) type" +#endif + +/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however, + * requires an ISOC90 compiler and relies on consistent behavior of sizeof. + */ +typedef size_t png_size_t; +typedef ptrdiff_t png_ptrdiff_t; + +/* libpng needs to know the maximum value of 'size_t' and this controls the + * definition of png_alloc_size_t, below. This maximum value of size_t limits + * but does not control the maximum allocations the library makes - there is + * direct application control of this through png_set_user_limits(). + */ +#ifndef PNG_SMALL_SIZE_T + /* Compiler specific tests for systems where size_t is known to be less than + * 32 bits (some of these systems may no longer work because of the lack of + * 'far' support; see above.) + */ +# if (defined(__TURBOC__) && !defined(__FLAT__)) ||\ + (defined(_MSC_VER) && defined(MAXSEG_64K)) +# define PNG_SMALL_SIZE_T +# endif +#endif + +/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no + * smaller than png_uint_32. Casts from png_size_t or png_uint_32 to + * png_alloc_size_t are not necessary; in fact, it is recommended not to use + * them at all so that the compiler can complain when something turns out to be + * problematic. + * + * Casts in the other direction (from png_alloc_size_t to png_size_t or + * png_uint_32) should be explicitly applied; however, we do not expect to + * encounter practical situations that require such conversions. + * + * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than + * 4294967295 - i.e. less than the maximum value of png_uint_32. + */ +#ifdef PNG_SMALL_SIZE_T + typedef png_uint_32 png_alloc_size_t; +#else + typedef png_size_t png_alloc_size_t; +#endif + +/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler + * implementations of Intel CPU specific support of user-mode segmented address + * spaces, where 16-bit pointers address more than 65536 bytes of memory using + * separate 'segment' registers. The implementation requires two different + * types of pointer (only one of which includes the segment value.) + * + * If required this support is available in version 1.2 of libpng and may be + * available in versions through 1.5, although the correctness of the code has + * not been verified recently. + */ + +/* Typedef for floating-point numbers that are converted to fixed-point with a + * multiple of 100,000, e.g., gamma + */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void * png_voidp; +typedef const void * png_const_voidp; +typedef png_byte * png_bytep; +typedef const png_byte * png_const_bytep; +typedef png_uint_32 * png_uint_32p; +typedef const png_uint_32 * png_const_uint_32p; +typedef png_int_32 * png_int_32p; +typedef const png_int_32 * png_const_int_32p; +typedef png_uint_16 * png_uint_16p; +typedef const png_uint_16 * png_const_uint_16p; +typedef png_int_16 * png_int_16p; +typedef const png_int_16 * png_const_int_16p; +typedef char * png_charp; +typedef const char * png_const_charp; +typedef png_fixed_point * png_fixed_point_p; +typedef const png_fixed_point * png_const_fixed_point_p; +typedef png_size_t * png_size_tp; +typedef const png_size_t * png_const_size_tp; + +#ifdef PNG_STDIO_SUPPORTED +typedef FILE * png_FILE_p; +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double * png_doublep; +typedef const double * png_const_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte * * png_bytepp; +typedef png_uint_32 * * png_uint_32pp; +typedef png_int_32 * * png_int_32pp; +typedef png_uint_16 * * png_uint_16pp; +typedef png_int_16 * * png_int_16pp; +typedef const char * * png_const_charpp; +typedef char * * png_charpp; +typedef png_fixed_point * * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double * * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char * * * png_charppp; + +#endif /* PNG_BUILDING_SYMBOL_TABLE */ + +#endif /* PNGCONF_H */ diff --git a/src/lib_armv7hf/libpng16/pnglibconf.h b/src/lib_armv7hf/libpng16/pnglibconf.h new file mode 100644 index 0000000..9f5caa0 --- /dev/null +++ b/src/lib_armv7hf/libpng16/pnglibconf.h @@ -0,0 +1,209 @@ +/* pnglibconf.h - library build configuration */ + +/* libpng version 1.6.3 - July 18, 2013 */ + +/* Copyright (c) 1998-2012 Glenn Randers-Pehrson */ + +/* This code is released under the libpng license. */ +/* For conditions of distribution and use, see the disclaimer */ +/* and license in png.h */ + +/* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ +/* Derived from: scripts/pnglibconf.dfa */ +#ifndef PNGLCONF_H +#define PNGLCONF_H +/* options */ +#define PNG_16BIT_SUPPORTED +#define PNG_ALIGNED_MEMORY_SUPPORTED +/*#undef PNG_ARM_NEON_API_SUPPORTED*/ +/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/ +#define PNG_BENIGN_ERRORS_SUPPORTED +#define PNG_BENIGN_READ_ERRORS_SUPPORTED +/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/ +#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED +#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_COLORSPACE_SUPPORTED +#define PNG_CONSOLE_IO_SUPPORTED +#define PNG_CONVERT_tIME_SUPPORTED +#define PNG_EASY_ACCESS_SUPPORTED +/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ +#define PNG_ERROR_TEXT_SUPPORTED +#define PNG_FIXED_POINT_SUPPORTED +#define PNG_FLOATING_ARITHMETIC_SUPPORTED +#define PNG_FLOATING_POINT_SUPPORTED +#define PNG_FORMAT_AFIRST_SUPPORTED +#define PNG_FORMAT_BGR_SUPPORTED +#define PNG_GAMMA_SUPPORTED +#define PNG_GET_PALETTE_MAX_SUPPORTED +#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +#define PNG_INCH_CONVERSIONS_SUPPORTED +#define PNG_INFO_IMAGE_SUPPORTED +#define PNG_IO_STATE_SUPPORTED +#define PNG_MNG_FEATURES_SUPPORTED +#define PNG_POINTER_INDEXING_SUPPORTED +#define PNG_PROGRESSIVE_READ_SUPPORTED +#define PNG_READ_16BIT_SUPPORTED +#define PNG_READ_ALPHA_MODE_SUPPORTED +#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_READ_BACKGROUND_SUPPORTED +#define PNG_READ_BGR_SUPPORTED +#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_READ_COMPOSITE_NODIV_SUPPORTED +#define PNG_READ_COMPRESSED_TEXT_SUPPORTED +#define PNG_READ_EXPAND_16_SUPPORTED +#define PNG_READ_EXPAND_SUPPORTED +#define PNG_READ_FILLER_SUPPORTED +#define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_GET_PALETTE_MAX_SUPPORTED +#define PNG_READ_GRAY_TO_RGB_SUPPORTED +#define PNG_READ_INTERLACING_SUPPORTED +#define PNG_READ_INT_FUNCTIONS_SUPPORTED +#define PNG_READ_INVERT_ALPHA_SUPPORTED +#define PNG_READ_INVERT_SUPPORTED +#define PNG_READ_OPT_PLTE_SUPPORTED +#define PNG_READ_PACKSWAP_SUPPORTED +#define PNG_READ_PACK_SUPPORTED +#define PNG_READ_QUANTIZE_SUPPORTED +#define PNG_READ_RGB_TO_GRAY_SUPPORTED +#define PNG_READ_SCALE_16_TO_8_SUPPORTED +#define PNG_READ_SHIFT_SUPPORTED +#define PNG_READ_STRIP_16_TO_8_SUPPORTED +#define PNG_READ_STRIP_ALPHA_SUPPORTED +#define PNG_READ_SUPPORTED +#define PNG_READ_SWAP_ALPHA_SUPPORTED +#define PNG_READ_SWAP_SUPPORTED +#define PNG_READ_TEXT_SUPPORTED +#define PNG_READ_TRANSFORMS_SUPPORTED +#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_READ_USER_CHUNKS_SUPPORTED +#define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED +#define PNG_READ_zTXt_SUPPORTED +/*#undef PNG_SAFE_LIMITS_SUPPORTED*/ +#define PNG_SAVE_INT_32_SUPPORTED +#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_SEQUENTIAL_READ_SUPPORTED +#define PNG_SETJMP_SUPPORTED +#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED +#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#define PNG_SET_OPTION_SUPPORTED +#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_SET_USER_LIMITS_SUPPORTED +#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED +#define PNG_SIMPLIFIED_READ_BGR_SUPPORTED +#define PNG_SIMPLIFIED_READ_SUPPORTED +#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED +#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED +#define PNG_SIMPLIFIED_WRITE_SUPPORTED +#define PNG_STDIO_SUPPORTED +#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_TEXT_SUPPORTED +#define PNG_TIME_RFC1123_SUPPORTED +#define PNG_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_USER_CHUNKS_SUPPORTED +#define PNG_USER_LIMITS_SUPPORTED +#define PNG_USER_MEM_SUPPORTED +#define PNG_USER_TRANSFORM_INFO_SUPPORTED +#define PNG_USER_TRANSFORM_PTR_SUPPORTED +#define PNG_WARNINGS_SUPPORTED +#define PNG_WRITE_16BIT_SUPPORTED +#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#define PNG_WRITE_BGR_SUPPORTED +#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED +#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED +#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED +#define PNG_WRITE_FILLER_SUPPORTED +#define PNG_WRITE_FILTER_SUPPORTED +#define PNG_WRITE_FLUSH_SUPPORTED +#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED +#define PNG_WRITE_INTERLACING_SUPPORTED +#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED +#define PNG_WRITE_INVERT_ALPHA_SUPPORTED +#define PNG_WRITE_INVERT_SUPPORTED +#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_WRITE_iTXt_SUPPORTED +#define PNG_WRITE_oFFs_SUPPORTED +#define PNG_WRITE_pCAL_SUPPORTED +#define PNG_WRITE_pHYs_SUPPORTED +#define PNG_WRITE_sBIT_SUPPORTED +#define PNG_WRITE_sCAL_SUPPORTED +#define PNG_WRITE_sPLT_SUPPORTED +#define PNG_WRITE_sRGB_SUPPORTED +#define PNG_WRITE_tEXt_SUPPORTED +#define PNG_WRITE_tIME_SUPPORTED +#define PNG_WRITE_tRNS_SUPPORTED +#define PNG_WRITE_zTXt_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_tRNS_SUPPORTED +#define PNG_zTXt_SUPPORTED +/* end of options */ +/* settings */ +#define PNG_API_RULE 0 +#define PNG_CALLOC_SUPPORTED +#define PNG_COST_SHIFT 3 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE +#define PNG_INFLATE_BUF_SIZE 1024 +#define PNG_MAX_GAMMA_8 11 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1) +#define PNG_TEXT_Z_DEFAULT_STRATEGY 0 +#define PNG_WEIGHT_SHIFT 8 +#define PNG_ZBUF_SIZE 8192 +#define PNG_ZLIB_VERNUM 0x1280 +#define PNG_Z_DEFAULT_COMPRESSION (-1) +#define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 +#define PNG_Z_DEFAULT_STRATEGY 1 +#define PNG_sCAL_PRECISION 5 +#define PNG_sRGB_PROFILE_CHECKS 2 +/* end of settings */ +#endif /* PNGLCONF_H */ diff --git a/src/lib_armv7hf/libxcb.so b/src/lib_armv7hf/libxcb.so new file mode 120000 index 0000000..e858d46 --- /dev/null +++ b/src/lib_armv7hf/libxcb.so @@ -0,0 +1 @@ +libxcb.so.1.1.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libxcb.so.1 b/src/lib_armv7hf/libxcb.so.1 new file mode 120000 index 0000000..e858d46 --- /dev/null +++ b/src/lib_armv7hf/libxcb.so.1 @@ -0,0 +1 @@ +libxcb.so.1.1.0 \ No newline at end of file diff --git a/src/lib_armv7hf/libxcb.so.1.1.0 b/src/lib_armv7hf/libxcb.so.1.1.0 new file mode 100755 index 0000000..ca334bd Binary files /dev/null and b/src/lib_armv7hf/libxcb.so.1.1.0 differ diff --git a/src/lib_armv7hf/libz.a b/src/lib_armv7hf/libz.a new file mode 100644 index 0000000..2af2aa7 Binary files /dev/null and b/src/lib_armv7hf/libz.a differ diff --git a/src/lib_armv7hf/png.h b/src/lib_armv7hf/png.h new file mode 120000 index 0000000..bbca0e8 --- /dev/null +++ b/src/lib_armv7hf/png.h @@ -0,0 +1 @@ +libpng16/png.h \ No newline at end of file diff --git a/src/lib_armv7hf/pngconf.h b/src/lib_armv7hf/pngconf.h new file mode 120000 index 0000000..addd8a1 --- /dev/null +++ b/src/lib_armv7hf/pngconf.h @@ -0,0 +1 @@ +libpng16/pngconf.h \ No newline at end of file diff --git a/src/lib_armv7hf/pnglibconf.h b/src/lib_armv7hf/pnglibconf.h new file mode 120000 index 0000000..64d182a --- /dev/null +++ b/src/lib_armv7hf/pnglibconf.h @@ -0,0 +1 @@ +libpng16/pnglibconf.h \ No newline at end of file diff --git a/src/maptool.c b/src/maptool.c new file mode 100644 index 0000000..ee78f1c --- /dev/null +++ b/src/maptool.c @@ -0,0 +1,5658 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef maptool_H_ +#include "maptool.h" +#endif +#define maptool_C_ +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif +#ifndef xosi_H_ +#include "xosi.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef pngread_H_ +#include "pngread.h" +#endif +#ifndef pngwrite_H_ +#include "pngwrite.h" +#endif +#ifndef jpgdec_H_ +#include "jpgdec.h" +#endif +#ifndef useri_H_ +#include "useri.h" +#endif +#ifndef aprstext_H_ +#include "aprstext.h" +#endif + + + + + +int32_t maptool_xsize; +int32_t maptool_ysize; +float maptool_shiftx; +float maptool_shifty; + + +struct maptool__D0 maptool_mappack; +/* aprs tracks on osm map by oe5dxl */ +/*FROM TimeConv IMPORT time; */ +/*FROM Storage IMPORT ALLOCATE, DEALLOCATE; */ +#define maptool_LF "\012" + +#define maptool_MAXCOL 30000 + +#define maptool_SYMX 16 + +#define maptool_SYMY 16 + +#define maptool_SYMN 192 + +#define maptool_MAPGETFN "gettiles" +/* tiles request filename */ + +#define maptool_MAXFONTY 18 + +#define maptool_MINFONTY 7 + +#define maptool_DEFAULTFONTY 10 + +#define maptool_FONTFN "font.png" + +#define maptool_PNGEXT ".png" + +#define maptool_JPGEXT ".jpg" + +#define maptool_CHARS 97 + +#define maptool_NOMAPR 100 +/* have no map fill colour */ + +#define maptool_NOMAPG 120 + +#define maptool_NOMAPB 100 + +#define maptool_SRTMXY 3600 + +#define maptool_STRIPS 3 + +struct PIX8; + + +struct PIX8 { + uint8_t r8; + uint8_t g8; + uint8_t b8; +}; + +typedef struct PIX8 ROWS0[256]; + +typedef struct PIX8 * pROWS0; + +typedef pROWS0 PNGBUF[256]; + +typedef pROWS0 * pPNGBUF; + +typedef char FN[1024]; + +/* srtm */ +typedef short * pSRTMSTRIP; + +struct SRTMTILE; + +typedef struct SRTMTILE * pSRTMTILE; + + +struct SRTMTILE { + uint8_t typ; + int32_t fd; + uint8_t used[3][3600]; + pSRTMSTRIP strips[3][3600]; +}; + +typedef pSRTMTILE SRTMLAT[180]; + +typedef pSRTMTILE * pSRTMLAT; + +typedef pSRTMLAT SRTMLONG[360]; + +struct _0; + + +struct _0 { + int32_t fd; + char havefile; /* have tried to open file */ +}; +/* srtm */ + +typedef struct _0 SRTM30FD[9][4]; + +static struct PIX8 symbols[3072][17]; + +static PNGBUF pngbuf; + +struct _1; + + +struct _1 { + uint8_t char0[19][8]; + uint16_t mask[21]; + uint8_t width; +}; + +static struct _1 font[97]; + +static char gammatab[1024]; + +static uint32_t maploadstart; + +static char mapnamesbuf[4096]; /* tile name buffer */ + +static uint8_t mapnamesdone; + +/* tile names written to file */ +static uint32_t lastmapreq; /* time of last map requested */ + +static uint32_t maploopcnt; + +/* count same tile requests */ +static uint32_t mapdelay; /* delay map load start on map moves */ + +static SRTMLONG srtmcache; + +static pSRTMTILE srtmmiss; /* cache no file info with pointer to here */ + +static SRTM30FD srtm30fd; /* open srtm30 files */ + +static uint32_t lastpoinum; + +/*open, miss, hit:CARDINAL; */ + +static float sqr(float x) +{ + return x*x; +} /* end sqr() */ + +#define maptool_GAMMA 4.5454545454545E-1 + + +static void makegammatab(void) +{ + uint32_t c; + gammatab[0U] = 0; + for (c = 1UL; c<=1023UL; c++) { + gammatab[c] = (char)aprsdecode_trunc(osic_exp(osic_ln(X2C_DIVR((float) + c,1024.0f))*4.5454545454545E-1f)*255.5f); + } /* end for */ +} /* end makegammatab() */ + + +extern void maptool_clr(maptool_pIMAGE img) +{ + uint32_t x; + uint32_t tmp; + tmp = img->Len1-1; + x = 0UL; + if (x<=tmp) for (;; x++) { + memset((char *)(img->Adr+(x)*img->Len0),(char)0,img->Size1); + if (x==tmp) break; + } /* end for */ +} /* end clr() */ + + +extern char maptool_vistime(uint32_t t) +{ + return aprsdecode_systimelong0>3.1415926535898f) pos->long0 = 3.1415926535898f; + else if (pos->long0<(-3.1415926535898f)) pos->long0 = (-3.1415926535898f); + if (pos->lat>1.484f) pos->lat = 1.484f; + else if (pos->lat<(-1.484f)) pos->lat = (-1.484f); +} /* end limpos() */ + + +extern void maptool_startmapdelay(void) +{ + mapdelay = (uint32_t)useri_conf2int(useri_fDELAYGETMAP, 0UL, 0L, 60L, + 0L); + lastmapreq = aprsdecode_realtime; + maploopcnt = 0UL; /* operator moves map */ +} /* end startmapdelay() */ + + +static void findinfo(int32_t nx, int32_t ny) +{ + int32_t d; + uint32_t i; + struct aprsdecode__D0 * anonym; + { /* with */ + struct aprsdecode__D0 * anonym = &aprsdecode_click; + d = labs(anonym->x-nx)+labs(anonym->y-ny); + /*IF (d<=5) & (ops<>NIL) THEN WrInt(d, 3);WrInt(entries, 3); + WrStrLn(ops^.call); END; */ + if (d<=anonym->min0 && anonym->ops) { + /* ops to ignore cc text */ + if (anonym->min0>0L) anonym->entries = 0UL; + else if (anonym->entries>9UL) anonym->entries = 9UL; + anonym->min0 = d; + i = 0UL; + while (ientries && anonym->table[i].opf!=anonym->ops) ++i; + anonym->table[i].opf = anonym->ops; + anonym->table[i].pff = anonym->pf; + anonym->table[i].pff0 = anonym->pf0; + anonym->table[i].typf = anonym->typ; + if (i>=anonym->entries) ++anonym->entries; + } + } +} /* end findinfo() */ + + +extern void maptool_area(maptool_pIMAGE img, int32_t x0, int32_t y00, + int32_t x1, int32_t y1, struct aprsdecode_COLTYP col0, + char add) +{ + int32_t h; + int32_t yy; + int32_t xx; + struct maptool_PIX * anonym; + int32_t tmp; + int32_t tmp0; + if (x0>x1) { + h = x0; + x0 = x1; + x1 = h; + } + if (y00>y1) { + h = y00; + y00 = y1; + y1 = h; + } + if (x0<0L) x0 = 0L; + if (x1<0L) x1 = 0L; + if (y00<0L) y00 = 0L; + if (y1<0L) y1 = 0L; + if (x0>(int32_t)(img->Len1-1)) x0 = (int32_t)(img->Len1-1); + if (x1>(int32_t)(img->Len1-1)) x1 = (int32_t)(img->Len1-1); + if (y00>(int32_t)(img->Len0-1)) y00 = (int32_t)(img->Len0-1); + if (y1>(int32_t)(img->Len0-1)) y1 = (int32_t)(img->Len0-1); + tmp = y1; + yy = y00; + if (yy<=tmp) for (;; yy++) { + tmp0 = x1; + xx = x0; + if (xx<=tmp0) for (;; xx++) { + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(xx)*img->Len0+yy]; + if (add) { + anonym->r += (uint16_t)col0.r; + anonym->g += (uint16_t)col0.g; + anonym->b += (uint16_t)col0.b; + } + else { + anonym->r = (uint16_t)col0.r; + anonym->g = (uint16_t)col0.g; + anonym->b = (uint16_t)col0.b; + } + } + if (xx==tmp0) break; + } /* end for */ + if (yy==tmp) break; + } /* end for */ +} /* end area() */ + + +extern float maptool_realzoom(int32_t zi, float zf) +{ + return ((float)zi+zf)-1.0f; +} /* end realzoom() */ + + +static float expzoom(int32_t z) +{ + return (float)(uint32_t)X2C_LSH(0x1UL,32,z); +} /* end expzoom() */ + + +extern void maptool_xytodeg(float x, float y, + struct aprspos_POSITION * pos) +{ + int32_t zi; + float ysf; + float zoom; + float pixrad; + zoom = maptool_realzoom(aprsdecode_initzoom, aprsdecode_finezoom); + ysf = (float)maptool_ysize; + y = ysf-y; + if (y<0.0f) y = 0.0f; + else if (y>ysf) y = ysf; + if ((float)fabs(aprsdecode_mappos.lat)>1.484f) { + aprsdecode_posinval(pos); + return; + } + zi = (int32_t)aprsdecode_trunc(zoom); + pixrad = X2C_DIVR(6.2831853071796f, + ((1.0f+zoom)-(float)zi)*256.0f*expzoom((int32_t) + aprsdecode_trunc(zoom))); + pos->long0 = aprsdecode_mappos.long0+pixrad*x; + pos->lat = 2.0f*osic_arctan(osic_exp(osic_ln(osic_tan(aprsdecode_mappos.lat) + +X2C_DIVR(1.0f,osic_cos(aprsdecode_mappos.lat)))-pixrad*y))-1.5707963267949f; + maptool_limpos(pos); +} /* end xytodeg() */ + + +extern void maptool_shiftmap(int32_t x, int32_t y, int32_t ysize, + float zoom, struct aprspos_POSITION * pos) +{ + int32_t zi; + float pixrad; + zi = (int32_t)aprsdecode_trunc(zoom); + pixrad = ((1.0f+zoom)-(float)zi)*256.0f*expzoom((int32_t) + aprsdecode_trunc(zoom)); + pos->long0 = pos->long0-(X2C_DIVR(6.2831853071796f,pixrad))*(float)x; + pos->lat = 2.0f*osic_arctan(osic_exp(osic_ln(osic_tan(pos->lat) + +X2C_DIVR(1.0f,osic_cos(pos->lat)))+(X2C_DIVR(6.2831853071796f, + pixrad))*(float)(ysize-y)))-1.5707963267949f; + maptool_limpos(pos); +} /* end shiftmap() */ + + +extern void maptool_center(int32_t xsize, int32_t ysize, float zoom, + struct aprspos_POSITION centpos, + struct aprspos_POSITION * pos) +{ + int32_t zi; + float pixrad; + zi = (int32_t)aprsdecode_trunc(zoom); + pixrad = ((1.0f+zoom)-(float)zi)*256.0f*expzoom((int32_t) + aprsdecode_trunc(zoom)); + pos->long0 = centpos.long0-(X2C_DIVR(6.2831853071796f, + pixrad))*(float)(xsize/2L); + pos->lat = 2.0f*osic_arctan(osic_exp(osic_ln(osic_tan(centpos.lat) + +X2C_DIVR(1.0f,osic_cos(centpos.lat)))+(X2C_DIVR(6.2831853071796f, + pixrad))*(float)(ysize/2L)))-1.5707963267949f; + maptool_limpos(pos); +} /* end center() */ + +#define maptool_TOL 0.0001 + + +extern void maptool_mercator(float lon, float lat, int32_t zoom, + int32_t * tilex, int32_t * tiley, float * x, + float * y) +{ + float z; + if (lat>1.484f) lat = 1.484f; + else if (lat<(-1.484f)) lat = (-1.484f); + if (lon>3.1414926535898f) lon = 3.1414926535898f; + else if (lon<(-3.1414926535898f)) lon = (-3.1414926535898f); + lat = osic_ln(osic_tan(lat)+X2C_DIVR(1.0f,osic_cos(lat))); + z = expzoom(zoom); + *x = (0.5f+lon*1.591549430919E-1f)*z; + *y = (0.5f-lat*1.591549430919E-1f)*z; + *tilex = (int32_t)aprsdecode_trunc(*x); + *tiley = (int32_t)aprsdecode_trunc(*y); + *x = (*x-(float)*tilex)*256.0f; + *y = (*y-(float)*tiley)*256.0f; +} /* end mercator() */ + + +extern int32_t maptool_mapxy(struct aprspos_POSITION pos, float * x, + float * y) +{ + int32_t tiley; + int32_t tilex; + float ys; + float xs; + if (aprspos_posvalid(pos)) { + maptool_mercator(pos.long0, pos.lat, aprsdecode_initzoom, &tilex, + &tiley, x, y); + tilex -= aprsdecode_inittilex; + tiley -= aprsdecode_inittiley; + *x = ((*x+(float)(tilex*256L))-maptool_shiftx)*aprsdecode_finezoom; + *y = (float)maptool_ysize-(((float)(tiley*256L)+*y) + -maptool_shifty)*aprsdecode_finezoom; + /*WrFixed(x, 5, 10); WrFixed(FLOAT(xsize), 5, 10); WrFixed(y, 5, 10); + WrFixed(FLOAT(ysize), 5, 10); WrLn; */ + /*doreorder error: IF (x>=0.0) & (x<=FLOAT(xsize)) & (y>=0.0) + & (y<=FLOAT(ysize)) THEN RETURN 0 END; */ + xs = (float)maptool_xsize; + ys = (float)maptool_ysize; + if (((*x>=0.0f && *x<=xs) && *y>=0.0f) && *y<=ys) return 0L; + } + return -1L; +} /* end mapxy() */ + + +extern void maptool_pullmap(int32_t x, int32_t y, char init) +{ + struct aprspos_POSITION top; + uint32_t i; + if (init) { + maptool_xytodeg((float)x, (float)y, &aprsdecode_click.pullpos); + xosi_sethand(xosi_cPULL4); + xosi_pulling = 1; + } + else { + for (i = 0UL; i<=9UL; i++) { + maptool_xytodeg((float)x, (float)y, &top); + aprsdecode_mappos.lat = aprsdecode_mappos.lat-(top.lat-aprsdecode_click.pullpos.lat) + *0.5f; + aprsdecode_mappos.long0 = aprsdecode_mappos.long0-(top.long0-aprsdecode_click.pullpos.long0) + ; + maptool_limpos(&aprsdecode_mappos); + } /* end for */ + } +} /* end pullmap() */ + + +extern void maptool_loctopos(struct aprspos_POSITION * pos, char loc[], + uint32_t loc_len) +{ + uint32_t l; + uint32_t i; + char ok0; + X2C_PCOPY((void **)&loc,loc_len); + ok0 = 0; + l = aprsstr_Length(loc, loc_len); + i = 0UL; + while (i=6UL && (uint8_t)loc[0UL]>='A') && (uint8_t) + loc[0UL]<='R') && (uint8_t)loc[1UL]>='A') && (uint8_t) + loc[1UL]<='R') && (uint8_t)loc[2UL]>='0') && (uint8_t) + loc[2UL]<='9') && (uint8_t)loc[3UL]>='0') && (uint8_t) + loc[3UL]<='9') && (uint8_t)loc[4UL]>='A') && (uint8_t) + loc[4UL]<='X') && (uint8_t)loc[5UL]>='A') && (uint8_t) + loc[5UL]<='X') { + pos->long0 = (float)((uint32_t)(uint8_t)loc[0UL]-65UL) + *20.0f+(float)((uint32_t)(uint8_t)loc[2UL]-48UL) + *2.0f+X2C_DIVR((float)((uint32_t)(uint8_t) + loc[4UL]-65UL)+0.5f,12.0f); + pos->lat = (float)((uint32_t)(uint8_t)loc[1UL]-65UL) + *10.0f+(float)((uint32_t)(uint8_t)loc[3UL]-48UL) + +X2C_DIVR((float)((uint32_t)(uint8_t)loc[5UL]-65UL) + +0.5f,24.0f); + if (l==6UL) ok0 = 1; + if ((((l>=8UL && (uint8_t)loc[6UL]>='0') && (uint8_t)loc[6UL]<='9') + && (uint8_t)loc[7UL]>='0') && (uint8_t)loc[7UL]<='9') { + pos->long0 = (pos->long0+X2C_DIVR((float)((uint32_t)(uint8_t) + loc[6UL]-48UL),120.0f))-0.0375f; + pos->lat = (pos->lat+X2C_DIVR((float)((uint32_t)(uint8_t) + loc[7UL]-48UL),240.0f))-0.01875f; + if (l==8UL) ok0 = 1; + } + if ((((l>=10UL && (uint8_t)loc[8UL]>='A') && (uint8_t) + loc[8UL]<='R') && (uint8_t)loc[9UL]>='A') && (uint8_t) + loc[9UL]<='R') { + pos->long0 = (pos->long0+X2C_DIVR((float)((uint32_t)(uint8_t) + loc[8UL]-65UL),2880.0f))-3.9930555555556E-3f; + pos->lat = (pos->lat+X2C_DIVR((float)((uint32_t)(uint8_t) + loc[9UL]-65UL),5760.0f))-1.9965277777778E-3f; + if (l==10UL) ok0 = 1; + } + } + if (ok0) { + pos->long0 = (pos->long0-180.0f)*1.7453292519943E-2f; + pos->lat = (pos->lat-90.0f)*1.7453292519943E-2f; + } + else aprsdecode_posinval(pos); + X2C_PFREE(loc); +} /* end loctopos() */ + + +extern void maptool_postoloc(char loc[], uint32_t loc_len, + struct aprspos_POSITION pos) +{ + uint32_t bc; + uint32_t lc; + float br; + float lr; + maptool_limpos(&pos); + lr = (pos.long0*5.7295779513082E+1f+180.0f)*2880.0f; + if (lr<0.0f) lr = 0.0f; + lc = aprsdecode_trunc(lr); + br = (pos.lat*5.7295779513082E+1f+90.0f)*5760.0f; + if (br<0.0f) br = 0.0f; + bc = aprsdecode_trunc(br); + loc[0UL] = (char)(65UL+lc/57600UL); + loc[1UL] = (char)(65UL+bc/57600UL); + loc[2UL] = (char)(48UL+(lc/5760UL)%10UL); + loc[3UL] = (char)(48UL+(bc/5760UL)%10UL); + loc[4UL] = (char)(65UL+(lc/240UL)%24UL); + loc[5UL] = (char)(65UL+(bc/240UL)%24UL); + loc[6UL] = (char)(48UL+(lc/24UL)%10UL); + loc[7UL] = (char)(48UL+(bc/24UL)%10UL); + loc[8UL] = (char)(65UL+lc%24UL); + loc[9UL] = (char)(65UL+bc%24UL); + loc[10UL] = 0; +} /* end postoloc() */ + +#define maptool_SRTM3DIR "srtm3" + +#define maptool_SRTM1DIR "srtm1" + +#define maptool_SRTM30DIR "srtm30" + + +/* === srtm lib */ +static int32_t opensrtm(uint8_t t, uint32_t tlat, uint32_t tlong) +{ + char s[21]; + FN path; + uint32_t xd; + uint32_t yi; + uint32_t xi; + uint32_t n; + int32_t f; + useri_confstr(useri_fOSMDIR, path, 1024ul); + if (t==3U) aprsstr_Append(path, 1024ul, "/srtm3/", 8ul); + else if (t==1U) aprsstr_Append(path, 1024ul, "/srtm1/", 8ul); + if (t<=3U) { + if (tlat<90UL) { + s[0U] = 'S'; + n = 90UL-tlat; + } + else { + s[0U] = 'N'; + n = tlat-90UL; + } + s[1U] = (char)(n/10UL+48UL); + s[2U] = (char)(n%10UL+48UL); + if (tlong<180UL) { + s[3U] = 'W'; + n = 180UL-tlong; + } + else { + s[3U] = 'E'; + n = tlong-180UL; + } + s[4U] = (char)(n/100UL+48UL); + s[5U] = (char)((n/10UL)%10UL+48UL); + s[6U] = (char)(n%10UL+48UL); + s[7U] = '.'; + s[8U] = 'h'; + s[9U] = 'g'; + s[10U] = 't'; + s[11U] = 0; + aprsstr_Append(path, 1024ul, s, 21ul); + return osi_OpenRead(path, 1024ul); + } + else { + aprsstr_Append(path, 1024ul, "/srtm30/", 9ul); + xi = tlong/40UL; + xd = xi*40UL; + if (xd<180UL) { + s[0U] = 'W'; + n = 180UL-xd; + } + else { + s[0U] = 'E'; + n = xd-180UL; + } + s[1U] = (char)(n/100UL+48UL); + s[2U] = (char)((n/10UL)%10UL+48UL); + s[3U] = (char)(n%10UL+48UL); + if (tlat>=130UL) { + s[4U] = 'N'; + s[5U] = '9'; + yi = 3UL; + } + else if (tlat>=90UL) { + s[4U] = 'N'; + s[5U] = '4'; + yi = 2UL; + } + else if (tlat>=50UL) { + s[4U] = 'S'; + s[5U] = '0'; + yi = 1UL; + } + else { + s[4U] = 'S'; + s[5U] = '4'; + yi = 0UL; + } + if (srtm30fd[xi][yi].havefile && srtm30fd[xi][yi].fd!=-1L) { + return srtm30fd[xi][yi].fd; + } + s[6U] = '0'; + s[7U] = '.'; + s[8U] = 'D'; + s[9U] = 'E'; + s[10U] = 'M'; + s[11U] = 0; + aprsstr_Append(path, 1024ul, s, 21ul); + f = osi_OpenRead(path, 1024ul); + srtm30fd[xi][yi].fd = f; + srtm30fd[xi][yi].havefile = 1; + return f; + } + return 0; +} /* end opensrtm() */ + + +static void purgesrtm(char all) +{ + uint32_t asize; + uint32_t y; + uint32_t x; + uint32_t yd; + uint32_t xd; + pSRTMTILE pt; + pSRTMLAT pl; + pSRTMSTRIP pb; + struct SRTMTILE * anonym; + for (xd = 0UL; xd<=359UL; xd++) { + pl = srtmcache[xd]; + if (pl) { + for (yd = 0UL; yd<=179UL; yd++) { + pt = pl[yd]; + if (pt && pt!=srtmmiss) { + { /* with */ + struct SRTMTILE * anonym = pt; + for (y = 0UL; y<=3599UL; y++) { + for (x = 0UL; x<=2UL; x++) { + pb = anonym->strips[x][y]; + if (pb) { + if (anonym->used[x][y]>0U) { + --anonym->used[x][y]; + } + if (all || anonym->used[x][y]==0U) { + asize = 2400UL; + if (pt->typ>3U) asize = 240UL; + osic_free((char * *) &pb, asize); + useri_debugmem.srtm -= asize; + anonym->strips[x][y] = 0; + } + } + } /* end for */ + } /* end for */ + } + if (all) { + if (pt->fd!=-1L) osic_Close(pt->fd); + osic_free((char * *) &pt, sizeof(struct SRTMTILE)); + useri_debugmem.srtm -= sizeof(struct SRTMTILE); + pl[yd] = 0; + } + } + } /* end for */ + if (all) { + osic_free((char * *) &pl, sizeof(SRTMLAT)); + useri_debugmem.srtm -= sizeof(SRTMLAT); + srtmcache[xd] = 0; + } + } + } /* end for */ + if (all) { + for (x = 0UL; x<=8UL; x++) { + for (y = 0UL; y<=3UL; y++) { + if (srtm30fd[x][y].havefile && srtm30fd[x][y].fd!=-1L) { + osic_Close(srtm30fd[x][y].fd); + srtm30fd[x][y].fd = -1L; + } + } /* end for */ + } /* end for */ + } +} /* end purgesrtm() */ + +#define maptool_NOALT0 32767.0 + + +static float getsrtm1(uint32_t ilat, uint32_t ilong, + uint32_t * div0) +/* 1 pixel altitude */ +{ + uint32_t rdsize; + uint32_t xdeg; + uint32_t ydeg; + uint32_t xx; + uint32_t y; + uint32_t x; + uint32_t i; + int32_t seek; + int32_t f; + pSRTMTILE pt; + pSRTMSTRIP pb; + int32_t a; + uint8_t t; + struct SRTMTILE * anonym; + struct SRTMTILE * anonym0; + uint32_t tmp; + ydeg = ilat/3600UL; + xdeg = ilong/3600UL; + if (xdeg>359UL || ydeg>179UL) return 32767.0f; + if (srtmcache[xdeg]==0) { + /* empty lat array */ + osic_alloc((char * *) &srtmcache[xdeg], sizeof(SRTMLAT)); + if (srtmcache[xdeg]==0) return 32767.0f; + /* out of memory */ + useri_debugmem.srtm += sizeof(SRTMLAT); + memset((char *)srtmcache[xdeg],(char)0,sizeof(SRTMLAT)); + } + else if (srtmcache[xdeg][ydeg]==srtmmiss) return 32767.0f; + /* tile file not avaliable */ + pt = srtmcache[xdeg][ydeg]; + if (pt==0) { + t = 1U; + f = opensrtm(1U, ydeg, xdeg); + if (f==-1L) { + t = 3U; + f = opensrtm(3U, ydeg, xdeg); + if (f==-1L) { + t = 30U; + f = opensrtm(30U, ydeg, xdeg); + if (f==-1L) { + srtmcache[xdeg][ydeg] = srtmmiss; + return 32767.0f; + } + } + } + /*INC(open); */ + osic_alloc((char * *) &pt, sizeof(struct SRTMTILE)); + /* a new 1x1 deg buffer */ + if (pt==0) return 32767.0f; + useri_debugmem.srtm += sizeof(struct SRTMTILE); + { /* with */ + struct SRTMTILE * anonym = pt; + memset((char *)anonym->strips,(char)0, + sizeof(pSRTMSTRIP [3][3600])); + memset((char *)anonym->used,(char)0,10800UL); + anonym->typ = t; + anonym->fd = f; + } + srtmcache[xdeg][ydeg] = pt; + } + { /* with */ + struct SRTMTILE * anonym0 = pt; + *div0 = (uint32_t)anonym0->typ; + if (anonym0->typ==1U) { + y = ilat%3600UL; + x = ilong%3600UL; + xx = x/1200UL; + x = x%1200UL; + } + else if (anonym0->typ==3U) { + y = (ilat%3600UL)/3UL; + x = (ilong%3600UL)/3UL; + xx = 0UL; + } + else { + y = (ilat%3600UL)/30UL; + x = (ilong%3600UL)/30UL; + xx = 0UL; + } + pb = anonym0->strips[xx][y]; + if (pb==0) { + if (anonym0->typ==1U) { + seek = (int32_t)((3599UL-y)*7202UL+xx*2400UL); + rdsize = 2400UL; + } + else if (anonym0->typ==3U) { + seek = (int32_t)((1199UL-y)*2402UL); + rdsize = 2400UL; + } + else { + seek = (int32_t)((xdeg%40UL)*240UL-(ilat/30UL)*9600UL); + if (ydeg>=130UL) seek += 207350400L; + else if (ydeg>=90UL) seek += 149750400L; + else if (ydeg>=50UL) seek += 103670400L; + else seek += 57590400L; + rdsize = 240UL; /* fill 1/10 buffer */ + } + /*INC(miss); */ + osic_alloc((char * *) &pb, rdsize); + if (pb==0) return 32767.0f; + useri_debugmem.srtm += rdsize; + anonym0->strips[xx][y] = pb; + osic_Seek(anonym0->fd, (uint32_t)seek); + if (osi_RdBin(anonym0->fd, (char *)pb, 2400u/1u, + rdsize)!=(int32_t)rdsize) return 32767.0f; + /* + c-translator frissts nicht + FOR i:=0 TO rdsize DIV 2-1 DO pb^[i]:=pb^[i]<<8 + pb^[i] + >>8 END; (* motorola format *) + */ + tmp = rdsize/2UL-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + pb[i] = (short)(X2C_LSH((uint16_t)pb[i],16, + 8)|X2C_LSH((uint16_t)pb[i],16,-8)); + if (i==tmp) break; + } /* end for */ + } + /* motorola format */ + /*ELSE INC(hit); */ + anonym0->used[xx][y] = 10U; + a = (int32_t)pb[x]; + if (a>30000L || a<-30000L) return 32767.0f; + return (float)a; + } +} /* end getsrtm1() */ + +#define maptool_NOALT 32767.0 + +#define maptool_ERRALT 30000.0 + + +extern float maptool_getsrtm(struct aprspos_POSITION pos, + uint32_t quality, float * resolution) +{ + uint32_t d; + uint32_t div0; + uint32_t ilong; + uint32_t ilat; + float vy; + float vx; + float a3; + float a2; + float a1; + float a0; + /*limpos(pos); */ + pos.lat = 3.24E+5f+pos.lat*2.0626480625299E+5f; + pos.long0 = 6.48E+5f+pos.long0*2.0626480625299E+5f; + ilat = aprsdecode_trunc(pos.lat); + ilong = aprsdecode_trunc(pos.long0); + a0 = getsrtm1(ilat, ilong, &div0); + if (div0==1UL) { + *resolution = 30.0f; + if (quality>29UL) return a0; + } + else if (div0==3UL) { + *resolution = 90.0f; + if (quality>60UL) return a0; + } + else { + *resolution = 900.0f; + if (quality>300UL) return a0; + } + /*interpolate 4 dots */ + a1 = getsrtm1(ilat, ilong+div0, &d); + a2 = getsrtm1(ilat+div0, ilong, &d); + a3 = getsrtm1(ilat+div0, ilong+div0, &d); + if (a0>30000.0f) { + /* ignore missing pixels */ + a0 = a1; + if (a0>30000.0f) { + a0 = a2; + if (a0>30000.0f) { + a0 = a3; + if (a0>30000.0f) return 32767.0f; + } + } + } + if (a1>30000.0f) a1 = a0; + if (a2>30000.0f) a2 = a0; + if (a3>30000.0f) a3 = a0; + if (div0==1UL) { + /* interpolation wights */ + vx = pos.long0-(float)ilong; + vy = pos.lat-(float)ilat; + } + else if (div0==3UL) { + vx = (pos.long0-(float)((ilong/3UL)*3UL))*3.3333333333333E-1f; + vy = (pos.lat-(float)((ilat/3UL)*3UL))*3.3333333333333E-1f; + } + else { + vx = (pos.long0-(float)((ilong/30UL)*30UL))*3.3333333333333E-2f; + vy = (pos.lat-(float)((ilat/30UL)*30UL))*3.3333333333333E-2f; + } + return (a0*(1.0f-vx)+a1*vx)*(1.0f-vy)+(a2*(1.0f-vx)+a3*vx)*vy; +/* wighted median of 4 pixels*/ +} /* end getsrtm() */ + + +static void initsrtm(void) +{ + uint32_t yi; + uint32_t xi; + /*open:=0; miss:=0; hit:=0; */ + memset((char *)srtmcache,(char)0,sizeof(SRTMLONG)); + for (xi = 0UL; xi<=8UL; xi++) { + for (yi = 0UL; yi<=3UL; yi++) { + srtm30fd[xi][yi].havefile = 0; + } /* end for */ + } /* end for */ +} /* end initsrtm() */ + + +extern void maptool_closesrtmfile(void) +{ + purgesrtm(1); + /*WrInt(open, 10); WrInt(miss, 10); WrInt(hit, 10); + WrStrLn(" open miss hit"); */ + initsrtm(); +} /* end closesrtmfile() */ + +/* === srtm lib */ +/* +PROCEDURE wgs84(lat, long, heig:REAL; VAR x,y,z:REAL); (* wgs84 ecef *) +CONST + A=6378137; +-- B=6356752; +-- F=(A-B)/A; +-- E=2*F-F*F; + E=0.081819190842522; + +VAR n,sl,h:REAL; +BEGIN + sl:=sin(lat); + n:=A/sqrt(1.0-E*E*sl*sl); + h:=heig+n; + z:=(n*(1.0-E*E)+heig)*sl; + y:=h*sin(long)*cos(lat); + x:=h*cos(long)*cos(lat); +END wgs84; +*/ + +static void wgs84s(float lat, float long0, float nn, float * x, + float * y, float * z) +/* km */ +{ + float c; + float h; + h = nn+6370.0f; + *z = h*osic_sin(lat); + c = osic_cos(lat); + *y = h*osic_sin(long0)*c; + *x = h*osic_cos(long0)*c; +} /* end wgs84s() */ + + +static void wgs84r(float x, float y, float z, float * lat, + float * long0, float * heig) +/* km */ +{ + float h; + h = x*x+y*y; + if ((float)fabs(x)>(float)fabs(y)) { + *long0 = osic_arctan(X2C_DIVR(y,x)); + if (x<0.0f) { + if (y>0.0f) *long0 = 3.1415926535898f+*long0; + else *long0 = *long0-3.1415926535898f; + } + } + else { + *long0 = 1.5707963267949f-osic_arctan(X2C_DIVR(x,y)); + if (y<0.0f) *long0 = *long0-3.1415926535898f; + } + *lat = osic_arctan(X2C_DIVR(z,osic_sqrt(h))); + *heig = osic_sqrt(h+z*z)-6370.0f; +} /* end wgs84r() */ + + +static float fresnel(float a, float b, float lambda) +{ + if (lambda==0.0f) return 0.0f; + else return osic_sqrt(X2C_DIVR(lambda*a*b,a+b)); + return 0; +} /* end fresnel() */ + +#define maptool_M 700 + + +static void frescol(float a, uint16_t * r, uint16_t * g, + uint16_t * b) +{ + *b = 700U; + *r = 0U; + *g = 100U; + if (a<=0.001f) { + *r = 700U; + *g = 0U; + *b = 0U; + } + else if (a<0.999f) { + *b = 0U; + if (a<0.5f) { + *r = 700U; + *g = (uint16_t)aprsdecode_trunc(a*1400.0f); + } + else { + *g = 700U; + *r = (uint16_t)aprsdecode_trunc((1.0f-a)*1400.0f); + } + } +} /* end frescol() */ + + +static void elevation(float x0, float y00, float z0, float x1, + float y1, float z1, float * e0, float * e1) +{ + float r; + float s; + float c; + float b; + float a; + *e1 = 0.0f; + *e0 = 0.0f; + a = osic_sqrt(x0*x0+y00*y00+z0*z0); + b = osic_sqrt(x1*x1+y1*y1+z1*z1); + x1 = x1-x0; + y1 = y1-y00; + z1 = z1-z0; + c = osic_sqrt(x1*x1+y1*y1+z1*z1); + /* halbwinkelsatz */ + s = (a+b+c)*0.5f; + if (s==0.0f) return; + r = X2C_DIVR((s-a)*(s-b)*(s-c),s); + if (r<=0.0f) return; + r = osic_sqrt(r); + *e1 = 1.1459155902616E+2f*osic_arctan(X2C_DIVR(r,s-a))-90.0f; + *e0 = 1.1459155902616E+2f*osic_arctan(X2C_DIVR(r,s-b))-90.0f; +} /* end elevation() */ + + +static void ruler(maptool_pIMAGE image, float m, float x, float y, + char over, char right) +/* write meter to largest heigth */ +{ + signed char void0; + char s[21]; + struct aprsdecode_COLTYP c; + uint32_t l; + aprsstr_IntToStr((int32_t)X2C_TRUNCI(m,X2C_min_longint,X2C_max_longint), + 0UL, s, 21ul); + aprsstr_Append(s, 21ul, "m", 2ul); + l = aprsstr_Length(s, 21ul)*6UL; + c.r = 400UL; + c.g = 400UL; + c.b = 400UL; + if (right) x = x-(float)l; + if (over) y = y-(float)aprsdecode_lums.fontysize; + maptool_drawstr(image, s, 21ul, osic_floor(x), osic_floor(y), 250UL, 0UL, + c, &void0, 0UL, 1, 0); +} /* end ruler() */ + +#define maptool_SCALEHLINES 0.1 +/* size of headroom lines to rf path size */ + +#define maptool_DOTSTEP 2 + +#define maptool_MAXDIST 1000000 + +#define maptool_HERR (-2.E+4) + +#define maptool_ER 6.37E+6 + +struct HTAB; + +typedef struct HTAB * pHTAB; + + +struct HTAB { + pHTAB next; + float tx; + float ty; + float alt; +}; + + +extern int32_t maptool_geoprofile(maptool_pIMAGE image, + struct aprspos_POSITION pos0, struct aprspos_POSITION pos1, + float lambda, char ant1nn, int32_t ant1, + int32_t ant2, float * dist, float * a1, + float * a2, float * ele1, float * ele2) +{ + int32_t fstep; + int32_t fs; + int32_t nn; + float yproj; + float xproj; + float ysh; + float xsh; + float wdif; + float a; + float resol; + float hmid; + float h1; + float h0; + float dh; + float fullsum; + float fresmin; + float fressum; + float refrac; + float odist; + float nv; + float kf; + float yo; + float xo; + float maxfres; + float fres; + float y; + float x; + float d; + float h; + float dz; + float dy; + float dx; + float z1; + float y1; + float x1; + float z0; + float y00; + float x0; + struct aprspos_POSITION posf; + struct aprspos_POSITION pos; + uint16_t red; + uint16_t green; + uint16_t blue; + pHTAB phmax; + pHTAB pht; + pHTAB phtab; + uint32_t maxcache; + int32_t tmp; + maxcache = (uint32_t)(useri_conf2int(useri_fSRTMCACHE, 0UL, 0L, 2000L, + 20L)*1000000L); + *dist = 0.0f; + if (ant1nn) nn = 0L; + else { + nn = (int32_t)X2C_TRUNCI(maptool_getsrtm(pos0, 0UL, &resol), + X2C_min_longint,X2C_max_longint); + if (nn>=30000L) { + maptool_closesrtmfile(); + return -1L; + } + } + *a1 = (float)(nn+ant1); + wgs84s(pos0.lat, pos0.long0, *a1*0.001f, &x0, &y00, &z0); + nn = (int32_t)X2C_TRUNCI(maptool_getsrtm(pos1, 0UL, &resol), + X2C_min_longint,X2C_max_longint); + if (nn>=30000L) { + maptool_closesrtmfile(); + return -1L; + } + *a2 = (float)(nn+ant2); + wgs84s(pos1.lat, pos1.long0, *a2*0.001f, &x1, &y1, &z1); + elevation(x0, y00, z0, x1, y1, z1, ele1, ele2); + x1 = x1-x0; + y1 = y1-y00; + z1 = z1-z0; + *dist = osic_sqrt(x1*x1+y1*y1+z1*z1)*1000.0f; + if (*dist<1.0f) { + maptool_closesrtmfile(); + return -3L; + } + if (*dist>1.E+6f) { + maptool_closesrtmfile(); + return -2L; + } + refrac = (6.37E+6f-osic_sqrt(4.05769E+13f+ *dist* *dist*0.25f)) + *useri_conf2real(useri_fREFRACT, 0UL, (-10.0f), 10.0f, + 0.0f)*4.0f; + /*WrFixed(refrac,3, 10); WrStrLn(" refra"); */ + odist = X2C_DIVR(0.7071f,*dist); /* step 1/sqrt(2) of map resolution */ + d = 0.0f; + maxfres = fresnel( *dist*0.5f, *dist*0.5f, lambda); + if (maxfres==0.0f) maxfres = 1.0f; + xo = 0.0f; + yo = 0.0f; + fresmin = 1.0f; + nv = aprspos_azimuth(pos0, pos1)*1.7453292519943E-2f; + phtab = 0; + do { + fres = fresnel( *dist*d, *dist*(1.0f-d), lambda); + dx = x0+x1*d; + dy = y00+y1*d; + dz = z0+z1*d; + wgs84r(dx, dy, dz, &pos.lat, &pos.long0, &hmid); + if (maptool_mapxy(pos, &x, &y)>=0L) { + hmid = hmid*1000.0f-(d-d*d)*refrac; + fressum = 0.0f; + fullsum = 0.0f; + fstep = (int32_t)aprsdecode_trunc(X2C_DIVR(fres*0.5f,resol)); + tmp = fstep; + fs = -fstep; + if (fs<=tmp) for (;; fs++) { + kf = (X2C_DIVR((float)fs*resol,2.E+7f))*3.1415926535898f; + posf.lat = pos.lat+kf*osic_sin(nv); + posf.long0 = pos.long0-kf*osic_cos(nv); + dh = sqr(fres*0.5f)-sqr((float)fs*resol); + nn = (int32_t)X2C_TRUNCI(maptool_getsrtm(posf, 0UL, + &resol)+0.5f,X2C_min_longint,X2C_max_longint); + if (nn>=30000L) h = (-2.E+4f); + else h = (float)nn; + if (dh>0.0f) { + dh = osic_sqrt(dh); + h0 = hmid-dh; + h1 = hmid+dh; + /*WrFixed(dh, 3, 10); WrFixed(h0, 3, 10); WrFixed(h1, 3, 10); + WrStrLn(" dh"); */ + fullsum = fullsum+(h1-h0); + /*WrFixed(h, 3, 10); WrFixed(h0, 3, 10); WrStrLn(" hh0"); */ + if (h>h0) h0 = h; + if (h1>h0) fressum = fressum+(h1-h0); + } + else { + fullsum = 1.0f; + if (h0.0f) { + fressum = X2C_DIVR(fressum,fullsum); + if (fressum4.0f) { + if (h==(-2.E+4f)) { + maptool_waypoint(image, x, y, 1.5f, 500L, 500L, 500L); + /* have no srtm */ + } + else { + frescol(fresmin, &red, &green, &blue); + maptool_waypoint(image, x, y, 1.25f+X2C_DIVR(1.25f*fres, + maxfres), (int32_t)red, (int32_t)green, (int32_t)blue); + osic_alloc((char * *) &pht, sizeof(struct HTAB)); + /* store headroom values for scaling later */ + if (pht) { + pht->next = phtab; + phtab = pht; + pht->alt = hmid-(float)nn; + /* meters over (or under) ground */ + pht->tx = x; /* pixel on screen */ + pht->ty = y; + } + } + xo = x; + yo = y; + fresmin = 1.0f; + } + } + } + d = d+resol*odist; + if (useri_debugmem.srtm>=maxcache) purgesrtm(0); + } while (d<=1.0f); + if (phtab) { + phmax = 0; + pht = phtab; + d = X2C_max_real; + a = 1.0f; + for (;;) { + /* find maximum for scaling */ + if ((float)fabs(pht->alt)>a) a = (float)fabs(pht->alt); + h = (float)fabs((float)(image->Len1-1)*0.5f-pht->tx) + +(float)fabs((float)(image->Len0-1)*0.5f-pht->ty); + if (hnext==0) break; + pht = pht->next; + } + /*WrFixed(a, 10,1);WrStrLn("m"); */ + d = osic_sqrt(1.0f+sqr(phtab->tx-pht->tx)+sqr(phtab->ty-pht->ty)); + /* rftrack pixels on screen */ + wdif = sqr((pos0.long0-pos1.long0)*osic_cos(pos0.lat)) + +sqr(pos0.lat-pos1.lat); + if (wdif!=0.0f) { + wdif = osic_sqrt(wdif); /* dist pos0-pos1 */ + wdif = X2C_DIVR(wdif*a,d*0.1f); + xproj = X2C_DIVR(pos0.lat-pos1.lat,wdif); + /* 90 deg rotatationsvector */ + yproj = X2C_DIVR((pos0.long0-pos1.long0)*osic_cos(pos0.lat),wdif); + /* for headroom lines to track */ + } + else { + xproj = 0.0f; + yproj = 0.0f; + } + while (phtab) { + a = phtab->alt; + if (a<0.0f) { + red = 100U; /* no sight */ + green = 0U; + blue = 0U; + } + else { + red = 0U; /* sight */ + green = 50U; + blue = 150U; + } + if (yproj<0.0f) a = -a; + xsh = phtab->tx+a*xproj; /* rotate to normalvector */ + ysh = phtab->ty-a*yproj; /* rotate to normalvector */ + if (phtab==phmax && (float)fabs(a)<10000.0f) { + /* max sight marker */ + ruler(image, phtab->alt, xsh, ysh, a*yproj>=0.0f, a*xproj<0.0f); + red = 150U; + green = 200U; + } + maptool_vector(image, phtab->tx, phtab->ty, xsh, ysh, + (int32_t)red, (int32_t)green, (int32_t)blue, 256UL, + 0.0f); /* headroom line */ + maptool_waypoint(image, xsh, ysh, 1.5f, (int32_t)(red*3U), + (int32_t)(green*3U), (int32_t)(blue*3U)); + /* thicken end of headroom line */ + pht = phtab; + phtab = phtab->next; + osic_free((char * *) &pht, sizeof(struct HTAB)); + } + } + return 0L; +} /* end geoprofile() */ + + +static void progress(uint32_t startt, const char s[], uint32_t s_len, + uint32_t perc, char final) +{ + uint32_t rt; + char ss1[101]; + char ss[101]; + rt = osic_time(); + if (final || rt!=aprsdecode_realtime) { + aprsdecode_realtime = rt; + if (final || startt+4ULLen0-1)-1UL; + y = 1UL; + if (y<=tmp) for (;; y++) { + tmp0 = (image->Len1-1)-1UL; + x = 1UL; + if (x<=tmp0) for (;; x++) { + if (colnr==0UL) { + c = image->Adr[(x+1UL)*image->Len0+y].r; + c += image->Adr[(x)*image->Len0+(y+1UL)].r; + c += image->Adr[(x-1UL)*image->Len0+y].r; + c += image->Adr[(x)*image->Len0+(y-1UL)].r; + image->Adr[(x)*image->Len0+y].b = c/4U; + } + else { + c = image->Adr[(x+1UL)*image->Len0+y].g; + c += image->Adr[(x)*image->Len0+(y+1UL)].g; + c += image->Adr[(x-1UL)*image->Len0+y].g; + c += image->Adr[(x)*image->Len0+(y-1UL)].g; + image->Adr[(x)*image->Len0+y].b = c/4U; + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ + tmp = (image->Len0-1)-1UL; + y = 1UL; + if (y<=tmp) for (;; y++) { + tmp0 = (image->Len1-1)-1UL; + x = 1UL; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &image->Adr[(x)*image->Len0+y]; + if (colnr==0UL) { + if (anonym->b>anonym->r) anonym->r = anonym->b; + } + else if (anonym->b>anonym->g) anonym->g = anonym->b; + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ +} /* end postfilter() */ + + +static float meterperpix(maptool_pIMAGE image) +{ + struct aprspos_POSITION pos1; + struct aprspos_POSITION pos; + maptool_xytodeg(0.0f, 0.0f, &pos); + maptool_xytodeg((float)(image->Len1-1), 0.0f, &pos1); + return X2C_DIVR(aprspos_distance(pos, pos1)*1000.0f, + (float)(image->Len1-1)); +/* meter per pixel */ +} /* end meterperpix() */ + + +static void setcol(uint16_t bri, uint32_t colnr, struct maptool_PIX * p) +{ + if (colnr==0UL) { + if (bri>p->r) p->r = bri; + } + else if (bri>p->g) p->g = bri; +} /* end setcol() */ + +/* + PROCEDURE setcol(VAR p:PIX); + BEGIN + IF colnr=0 THEN p.r:=bri ELSE p.g:=bri END; + END setcol; +*/ +#define maptool_MAXSLANT 0.5 +/* shadow deepness to step relation */ + +#define maptool_FULLUM 1000.0 +/* full bright in image */ + +#define maptool_DISTHOP 6000 +/* m jump sightline linear interpolated */ + +#define maptool_PIXHOP 50000 +/* m jump pixels linear interpolated */ + + +extern void maptool_Radiorange(maptool_pIMAGE image, + struct aprspos_POSITION txpos, int32_t ant1, + int32_t ant2, uint32_t smooth, uint32_t colnr, + uint32_t qualnum, char * abort0) +{ + uint16_t bri; + uint32_t progr; + uint32_t qual; + uint32_t maxcache; + uint32_t frame; + uint32_t yp; + uint32_t xp; + int32_t void0; + int32_t nn; + float alt1; + float dyimag; + float dximag; + float mperpix; + float sight; + float hs; + float atx; + float arx; + float h; + float rais; + float dnext; + float dd; + float d; + float dpnext; + float py0; + float px0; + float pixstep; + float framestep; + float osmooth; + float lum; + float dalt; + float alt0; + float alt; + float resoltx; + float resol; + float oodist; + float yi; + float xi; + float ytx; + float xtx; + float y; + float x; + float dz; + float dy; + float dx; + float z1; + float y1; + float x1; + float z0; + float y00; + float x0; + struct aprspos_POSITION dpos; + struct aprspos_POSITION pos1; + struct aprspos_POSITION pos0; + struct aprspos_POSITION pos; + uint32_t startt; + char ss[101]; + startt = osic_time(); + nn = (int32_t)X2C_TRUNCI(maptool_getsrtm(txpos, 0UL, &resoltx), + X2C_min_longint,X2C_max_longint); + /* altitude of tx an map resolution in m here */ + if (nn>=30000L) { + maptool_closesrtmfile(); + return; + } + atx = (float)(nn+ant1); /* ant1 over NN */ + wgs84s(txpos.lat, txpos.long0, atx*0.001f, &x0, &y00, &z0); + arx = (float)ant2; /* ant2 over ground */ + xi = 0.0f; + yi = 0.0f; + nn = maptool_mapxy(txpos, &xtx, &ytx); + frame = 0UL; + maxcache = (uint32_t)(useri_conf2int(useri_fSRTMCACHE, 0UL, 0L, 2000L, + 100L)*1000000L); + mperpix = meterperpix(image); /* meter per pixel */ + if (mperpix<1.0f) { + maptool_closesrtmfile(); + return; + } + if (qualnum==0UL) { + framestep = 2.2f; /* pixel step along corner of image */ + qual = (uint32_t)X2C_TRUNCC(mperpix,0UL,X2C_max_longcard); + smooth = (smooth*22UL)/10UL; + } + else if (qualnum==1UL) { + framestep = 1.5f; + qual = (uint32_t)X2C_TRUNCC(mperpix*0.5f,0UL,X2C_max_longcard); + smooth = (smooth*15UL)/10UL; + } + else { + framestep = 1.0f; + qual = (uint32_t)X2C_TRUNCC(mperpix*0.25f,0UL,X2C_max_longcard); + } + if (smooth>0UL) osmooth = X2C_DIVR(1000.0f,(float)smooth); + else osmooth = 1000.0f; + progr = 0UL; + for (;;) { + maptool_xytodeg(xi, yi, &pos); /* screen frame pos */ + if (((frame==0UL && ytx>0.0f || frame==2UL && ytx<(float) + maptool_ysize) || frame==1UL && xtx>0.0f) + || frame==3UL && xtx<(float)maptool_xsize) { + wgs84s(pos.lat, pos.long0, atx*0.001f, &x1, &y1, &z1); + /* screen frame xyz at ant1 alt */ + dx = x1-x0; + dy = y1-y00; + dz = z1-z0; + oodist = dx*dx+dy*dy+dz*dz; + if (oodist>1.E-6f) { + oodist = X2C_DIVR(0.001f,osic_sqrt(oodist)); + /* 1/sight line length in m */ + pixstep = 0.0f; + resol = resoltx; + d = resol*oodist; + rais = (-1.E+9f); /* initial sightline angle **/ + dnext = 0.0f; + dpnext = 0.0f; + do { + /* do one sight line */ + if (d>=dnext) { + /* next fixpoint in interpolate sight line pos */ + dnext = d+6000.0f*oodist; + if (dnext>1.0f) dnext = 1.0f; + dd = dnext-d; + if (dd!=0.0f) { + wgs84r(x0+dx*d, y00+dy*d, z0+dz*d, &pos1.lat, + &pos1.long0, &alt1); + alt1 = alt1*1000.0f; + wgs84r(x0+dx*dnext, y00+dy*dnext, z0+dz*dnext, &pos.lat, + &pos.long0, &alt); + alt = alt*1000.0f; + dpos.lat = X2C_DIVR(pos.lat-pos1.lat,dd); + dpos.long0 = X2C_DIVR(pos.long0-pos1.long0,dd); + dalt = X2C_DIVR(alt-alt1,dd); + pos0.lat = pos1.lat-dpos.lat*d; + pos0.long0 = pos1.long0-dpos.long0*d; + alt0 = alt1-dalt*d; + } + } + pos.lat = pos0.lat+dpos.lat*d; + pos.long0 = pos0.long0+dpos.long0*d; + alt = alt0+dalt*d; + h = maptool_getsrtm(pos, qual, &resol); + /* ground over NN in m */ + if (h<30000.0f) { + /* srtm valid */ + h = h-alt; /* m ground over searchpath */ + hs = rais*d; /* h sight line m over searchpath */ + sight = (h+arx)-hs; + if (sight>0.0f) { + /* rx antenna in sight */ + if (d>=dpnext) { + /* next fixpoint in image pixel interpolation */ + dpnext = d+50000.0f*oodist; + if (dpnext>1.0f) dpnext = 1.0f; + dd = dpnext-d; + if (dd!=0.0f) { + wgs84r(x0+dx*d, y00+dy*d, z0+dz*d, &pos1.lat, + &pos1.long0, &alt1); + wgs84r(x0+dx*dpnext, y00+dy*dpnext, z0+dz*dpnext, + &pos.lat, &pos.long0, &alt); + void0 = maptool_mapxy(pos, &x, &y); + void0 = maptool_mapxy(pos1, &px0, &py0); + dximag = X2C_DIVR(x-px0,dd); + dyimag = X2C_DIVR(y-py0,dd); + px0 = px0-dximag*d; + py0 = py0-dyimag*d; + } + } + x = px0+dximag*d; + y = py0+dyimag*d; + if (x>1.5f && y>1.5f) { + /* room for large low res pixel */ + if (pixstep==0.0f) { + pixstep = mperpix*oodist*framestep; + } + xp = (uint32_t)X2C_TRUNCC(x,0UL,X2C_max_longcard); + yp = (uint32_t)X2C_TRUNCC(y,0UL,X2C_max_longcard); + if (xpLen1-1 && ypLen0-1) { + /* 1 pixel room for large low res pixel */ + lum = sight*osmooth; + /* luma is equal to riseing higth */ + if (lum>1000.0f) lum = 1000.0f; + bri = (uint16_t)(uint32_t)X2C_TRUNCC(lum,0UL, + X2C_max_longcard); + if (colnr==0UL) { + image->Adr[(xp) + *image->Len0+yp].r = (uint16_t)(uint32_t)X2C_TRUNCC(lum, + 0UL,X2C_max_longcard); + } + else { + image->Adr[(xp) + *image->Len0+yp].g = (uint16_t)(uint32_t)X2C_TRUNCC(lum, + 0UL,X2C_max_longcard); + } + if (qualnum<=1UL) { + bri = (uint16_t)(uint32_t) + X2C_TRUNCC(lum*0.8f,0UL,X2C_max_longcard); + setcol(bri, colnr, + &image->Adr[(xp+1UL)*image->Len0+yp]); + setcol(bri, colnr, + &image->Adr[(xp)*image->Len0+(yp+1UL)]); + setcol(bri, colnr, + &image->Adr[(xp-1UL)*image->Len0+(yp+1UL)]); + setcol(bri, colnr, + &image->Adr[(xp)*image->Len0+(yp-1UL)]); + if (qualnum==0UL) { + bri = (uint16_t)(uint32_t) + X2C_TRUNCC(lum*0.5f,0UL,X2C_max_longcard); + setcol(bri, colnr, + &image->Adr[(xp-1UL)*image->Len0+(yp+1UL)]); + setcol(bri, colnr, + &image->Adr[(xp-1UL)*image->Len0+(yp-1UL)]); + setcol(bri, colnr, + &image->Adr[(xp+1UL)*image->Len0+(yp+1UL)]); + setcol(bri, colnr, + &image->Adr[(xp+1UL)*image->Len0+(yp-1UL)]); + } + } + } + } + } + if (h>hs) { + rais = X2C_DIVR(h,d); + /* this point has light on ground */ + } + if (sight>-resol) { + if (pixstep==0.0f) d = d+resol*oodist; + else d = d+pixstep; + } + else if (resol>-(sight*0.5f)) d = d+resol*oodist; + else d = d-sight*oodist*0.5f; + } + else d = d+resol*oodist; + } while (d<=1.0f); + } + } + /* go along next side of image */ + switch (frame) { + case 0UL: + xi = xi+(1.0f+(float)fabs(X2C_DIVR(xi-xtx,yi-ytx)))*framestep; + if (xi>=(float)(image->Len1-1)) { + xi = 0.0f; + ++frame; + } + break; + case 1UL: + yi = yi+(1.0f+(float)fabs(X2C_DIVR(yi-ytx,xi-xtx)))*framestep; + if (yi>=(float)(image->Len0-1)) { + yi = (float)(image->Len0-1); + ++frame; + } + break; + case 2UL: + xi = xi+(1.0f+(float)fabs(X2C_DIVR(xi-xtx,yi-ytx)))*framestep; + if (xi>=(float)(image->Len1-1)) { + xi = (float)(image->Len1-1); + ++frame; + } + break; + default:; + if (yi>0.0f) { + yi = yi-(1.0f+(float)fabs(X2C_DIVR(yi-ytx,xi-xtx)))*framestep; + } + else goto loop_exit; + break; + } /* end switch */ + progr += 100UL; + strncpy(ss,"Radiorange",101u); + if (colnr) aprsstr_Append(ss, 101ul, " 2", 3ul); + progress(startt, ss, 101ul, + progr/(((image->Len0-1)+(image->Len1-1))*2UL), 0); + if (!aprsdecode_click.withradio) { + *abort0 = 1; + break; + } + if (useri_debugmem.srtm>=maxcache) purgesrtm(0); + } + loop_exit:; + postfilter(image, colnr); /* fill in missing pixels */ + useri_killmenuid(5UL); +} /* end Radiorange() */ + +#define maptool_MINH 1000 +/* to max all alt positiv */ + +#define maptool_MINHISTPIX 10 +/* min pixel in alt hist for max/min */ + +#define maptool_DIFMIN 10000 + +#define maptool_MAXDIF 500000 + + +extern char maptool_SimpleRelief(maptool_pIMAGE image) +{ + uint32_t sum; + uint32_t jump; + uint32_t qual; + uint32_t maxcache; + uint32_t xi; + uint32_t yp; + uint32_t xp; + float jm; + float jd; + float jr; + float hr; + float mperpix; + float resol; + struct aprspos_POSITION pos1; + struct aprspos_POSITION pos; + int32_t bri; + int32_t mul; + int32_t max0; + int32_t min0; + int32_t h; + uint32_t startt; + char ok0; + uint32_t hist[10000]; + struct maptool_PIX lut[1024]; + struct maptool_PIX * anonym; + struct maptool_PIX * anonym0; + uint32_t tmp; + uint32_t tmp0; + startt = osic_time(); + maxcache = (uint32_t)(useri_conf2int(useri_fSRTMCACHE, 0UL, 0L, 2000L, + 100L)*1000000L); + for (xi = 0UL; xi<=1023UL; xi++) { + { /* with */ + struct maptool_PIX * anonym = &lut[xi]; + if (xi<400UL) anonym->r = (uint16_t)(((400UL-xi)*900UL)/400UL); + else anonym->r = (uint16_t)(((xi-400UL)*900UL)/624UL); + if (xi<200UL) anonym->g = (uint16_t)((xi*900UL)/200UL); + else if (xi<640UL) { + anonym->g = (uint16_t)(((640UL-xi)*900UL)/440UL); + } + else anonym->g = (uint16_t)(((xi-640UL)*900UL)/372UL); + if (xi<320UL) anonym->b = 0U; + else if (xi<640UL) { + anonym->b = (uint16_t)(((xi-320UL)*900UL)/320UL); + } + else anonym->b = 900U; + } + } /* end for */ + /* + r:=xi; + g:=xi; + b:=xi; + */ + mperpix = meterperpix(image); + if (mperpix<1.0f) { + maptool_closesrtmfile(); + return 0; + } + qual = (uint32_t)X2C_TRUNCC(mperpix*0.25f,0UL,X2C_max_longcard); + jump = 1UL+aprsdecode_trunc(X2C_DIVR(6000.0f,mperpix)); + memset((char *)hist,(char)0,40000UL); + yp = 0UL; + ok0 = 0; + do { + xp = 0UL; + maptool_xytodeg(0.0f, (float)yp, &pos); + for (;;) { + xi = xp; + xp += jump; + if (xp>image->Len1-1) xp = (image->Len1-1)+1UL; + if (xi>=xp) break; + jr = (float)(xp-xi); + maptool_xytodeg((float)xp, (float)yp, &pos1); + pos1.lat = X2C_DIVR(pos1.lat-pos.lat,jr); + pos1.long0 = X2C_DIVR(pos1.long0-pos.long0,jr); + do { + hr = maptool_getsrtm(pos, qual, &resol); + if (hr<10000.0f) { + h = (int32_t)aprsdecode_trunc(1000.0f+hr); + /* ground over NN in m */ + image->Adr[(xi)*image->Len0+yp].r = (uint16_t)h; + /* IF xi=0 THEN ho:=h END; */ + /* image^[xi][yp].g:=h-ho+10000; */ + /* ho:=h; */ + if (xi>0UL && yp>0UL) { + image->Adr[(xi)*image->Len0+yp].g = (uint16_t) + (((h*3L-(int32_t)image->Adr[(xi-1UL)*image->Len0+yp].r*2L) + -(int32_t)image->Adr[(xi)*image->Len0+(yp-1UL)].r)+10000L); + } + else image->Adr[(xi)*image->Len0+yp].g = 0U; + if (h<=9999L) ++hist[h]; + ok0 = 1; + } + pos.lat = pos.lat+pos1.lat; + pos.long0 = pos.long0+pos1.long0; + ++xi; + } while (xi=maxcache) purgesrtm(0); + ++yp; + if (yp%20UL==0UL) { + progress(startt, "Geomap", 7ul, (yp*100UL)/(image->Len0-1), 0); + } + } while (!(yp>image->Len0-1 || !aprsdecode_click.withradio)); + min0 = 0L; + sum = 0UL; + while (min0<9999L && sum<10UL) { + sum += hist[min0]; + ++min0; + } + max0 = 9999L; + sum = 0UL; + while (max0>0L && sum<10UL) { + sum += hist[max0]; + --max0; + } + if (aprsdecode_click.withradio && max0>0L) { + h = max0-min0; + if (h<10L) h = 10L; + bri = useri_conf2int(useri_fGEOBRIGHTNESS, 0UL, 0L, 100L, 50L); + mul = 1024000L/h; + /* difmul:=trunc(20000000.0/((FLOAT(h)*sqrt(mperpix)))); + (* highpass level *) */ + /* difmul:=trunc(50000000.0/(sqrt(mperpix)*FLOAT(h))); + (* highpass level *) */ + jm = X2C_DIVR(2.0f*(float)bri,(float)h*osic_sqrt(mperpix)); + tmp = image->Len0-1; + yp = 0UL; + if (yp<=tmp) for (;; yp++) { + tmp0 = image->Len1-1; + xp = 0UL; + if (xp<=tmp0) for (;; xp++) { + h = (int32_t)image->Adr[(xp)*image->Len0+yp].r; + if (h) { + h -= min0; + /* dif:=(VAL(INTEGER, + image^[xp][yp].g)-DIFMIN)*difmul; */ + /* IF dif>MAXDIF THEN dif:=MAXDIF ELSIF dif<-MAXDIF THEN dif:=-MAXDIF END; + */ + if (h<10000L) h = (h*mul)/1024L; + else h = 0L; + if (h<0L) h = 0L; + else if (h>1023L) h = 1023L; + { /* with */ + struct maptool_PIX * anonym0 = &image->Adr[(xp) + *image->Len0+yp]; + jd = 1.0f+((float)anonym0->g-10000.0f)*jm; + if (jd<0.4f) jd = 0.4f; + else if (jd>2.0f) jd = 2.0f; + jd = jd*(float)bri*0.01f; + jr = (float)lut[h].r*jd; + if (jr<0.0f) jr = 0.0f; + anonym0->r = (uint16_t)aprsdecode_trunc(jr); + jr = (float)lut[h].g*jd; + if (jr<0.0f) jr = 0.0f; + anonym0->g = (uint16_t)aprsdecode_trunc(jr); + jr = (float)lut[h].b*jd; + if (jr<0.0f) jr = 0.0f; + anonym0->b = (uint16_t)aprsdecode_trunc(jr); + } + } + if (xp==tmp0) break; + } /* end for */ + if (yp==tmp) break; + } /* end for */ + } + else maptool_clr(image); + useri_killmenuid(5UL); + return ok0; +} /* end SimpleRelief() */ + +/*Panorama */ +/* +PROCEDURE normvector(var nx,ny,nz:real;face:facepo); +var cx,cy,cz:real; +begin + with face^ do begin + with edge3^ do begin + cx:=x; + cy:=y; + cz:=z; + end; + nx:=(edge1^.y-cy)*(edge2^.z-cz) - (edge1^.z-cz)*(edge2^.y-cy); + ny:=(edge1^.z-cz)*(edge2^.x-cx) - (edge1^.x-cx)*(edge2^.z-cz); + nz:=(edge1^.x-cx)*(edge2^.y-cy) - (edge1^.y-cy)*(edge2^.x-cx); + end; +END normvector; +*/ +#define maptool_TESTDIST 30.0 + + +static void raytrace(float minqual, float x0, float y00, + float z0, float dx, float dy, float dz, + float maxdist, float * dist, float * lum, + float * h, float * alt, float * subpix, + struct aprspos_POSITION * pos) +{ + float deltah; + float minsp; + float sp; + float lastsp; + float h2; + float h1; + float resol; + float qual; + struct aprspos_POSITION pos1; + *lum = 1.0f; + qual = minqual; + minsp = 0.0f; + if (*dist==0.0f) lastsp = 0.0f; + else lastsp = X2C_max_real; + deltah = *alt; + wgs84r(x0+dx* *dist, y00+dy* *dist, z0+dz* *dist, &pos->lat, &pos->long0, + alt); + *alt = *alt*1000.0f; + deltah = *alt-deltah; + /*WrStr("next:"); WrFixed(deltah, 2, 12); */ + *subpix = 0.0f; + do { + wgs84r(x0+dx* *dist, y00+dy* *dist, z0+dz* *dist, &pos->lat, + &pos->long0, alt); + *alt = *alt*1000.0f; + /* + IF mapxy(pos, xtt, ytt)>=-1 THEN + waypoint(testimg, xtt,ytt,1.0, 255,255,100); END; + */ + *h = maptool_getsrtm(*pos, aprsdecode_trunc(qual), &resol); + /* ground over NN in m */ + /*WrFixed(dist, 1,15); WrFixed(alt, 1,15); WrFixed(h, 1,15); + WrStr(" =d alt h"); */ + if (*h<30000.0f) { + sp = *alt-*h; + if (sp>0.0f) { + qual = sp*0.25f; + if (qual>250.0f) qual = 250.0f; + /* IF dist>1.0 THEN qual:=qual*dist END; */ + if (quallat+4.7123889803847E-6f; + pos1.long0 = pos->long0; + h1 = maptool_getsrtm(pos1, 1UL, &resol); + pos1.long0 = pos->long0+X2C_DIVR(4.7123889803847E-6f, + osic_cos(pos->lat)); + pos1.lat = pos->lat; + h2 = maptool_getsrtm(pos1, 1UL, &resol); + *lum = osic_cos(osic_arctan((h1-*h)*3.3333333333333E-2f)) + *osic_cos(osic_arctan((h2-*h)*3.3333333333333E-2f)); + /* lum:=1.0-ABS(h-h1)*(2.0/TESTDIST); */ + /* IF lum>1.0 THEN lum:=1.0 END; */ + /* + pos.long:=pos.long + (TESTDIST/20000000.0*pi) + /cos(pos.lat); + h2:=getsrtm(pos, trunc(qual), resol); + lum:=cos(arctan(ABS(h1-h)*(1.0/TESTDIST))) + *cos(arctan(ABS(h2-h)*(1.0/TESTDIST))); + */ + if (deltah!=0.0f) { + *subpix = X2C_DIVR(minsp,deltah); + if (*subpix>1.0f) *subpix = 1.0f; + } + /*WrStr("subpix:"); WrFixed(subpix, 3, 7); */ + return; + } + } + else qual = resol; + *dist = *dist+qual; + } while (*dist<=maxdist); + /* we are in dust or heaven */ + if (deltah!=0.0f) { + *subpix = X2C_DIVR(minsp,deltah); + if (*subpix>1.0f) *subpix = 1.0f; + } +} /* end raytrace() */ +/* antialiasing: search for peaks and set highest pixel smooth */ + + +static void rotvector(float * a, float * b, float cw, float sw) +{ + float h; + h = *a*cw+ *b*sw; + *b = *b*cw- *a*sw; + *a = h; +} /* end rotvector() */ + +#define maptool_ERRALT0 30000 + +#define maptool_FULLUM0 1000.0 +/* full bright in image */ + +#define maptool_MAXHP 0.08 +/* vertical spatial luminance highpass */ + + +static void Panofind(char find, const struct maptool_PANOWIN panpar, + float * res, struct aprspos_POSITION * pos) +{ + uint32_t yi; + uint32_t xi; + int32_t nn; + float azi; + float cazi; + float sazi; + float zn; + float yn; + float xn; + float clong; + float slong; + float ele0; + float eled; + float azid; + float resoltx; + float space; + float lasth; + float maxdist; + float hc1; + float hc; + float lb; + float lg; + float lr; + float hb; + float hg; + float hr; + float z0; + float y00; + float x0; + float azi0; + float clat; + float slat; + float wy; + float wx; + float tree; + float light; + float llum; + float lum; + float lastlum; + float dlum; + float lummul; + float atx; + float oldh; + float d; + float oob; + float oog; + float oor; + float ob; + float og; + float or; + char heaven; + uint32_t startt; + struct aprsdecode_COLTYP col0; + struct maptool_PIX * anonym; + startt = osic_time(); + if ((!aprspos_posvalid(panpar.eye) || !aprspos_posvalid(panpar.horizon)) + || maptool_getsrtm(panpar.horizon, 0UL, &resoltx)>=30000.0f) { + return; + } + /* no alt at horizon */ + maxdist = aprspos_distance(panpar.eye, panpar.horizon)*1000.0f; + if (maxdist<100.0f) return; + /* horizon too near */ + /*azi0:=conf2real(fANT2, 0, -360.0, 360.0, 0.0)-90; */ + /*maxdist:=FLOAT(conf2int(fANT2, 1, 1, 150, 20))*1000.0; */ + /*WrFixed(yzoom, 4,15); WrFixed(maxdist, 4,15); WrStrLn("yzoom dist"); */ + if (!find) { + col0.r = (uint32_t)useri_conf2int(useri_fCOLMARK1, 0UL, 0L, 100L, + 0L); + col0.g = (uint32_t)useri_conf2int(useri_fCOLMARK1, 1UL, 0L, 100L, + 0L); + col0.b = (uint32_t)useri_conf2int(useri_fCOLMARK1, 2UL, 0L, 100L, + 100L); + hr = (float)col0.r*0.01f; + hg = (float)col0.g*0.01f; + hb = (float)col0.b*0.01f; + lummul = X2C_DIVR(1000.0f,maxdist); + } + nn = (int32_t)X2C_TRUNCI(maptool_getsrtm(panpar.eye, 0UL, &resoltx), + X2C_min_longint,X2C_max_longint); + /* altitude of tx an map resolution in m here */ + if (nn>=30000L) { + maptool_closesrtmfile(); + return; + } + atx = (float)(nn+panpar.eyealt); /* ant1 over NN */ + wgs84s(panpar.eye.lat, panpar.eye.long0, atx*0.001f, &x0, &y00, &z0); + azi = aprspos_azimuth(panpar.eye, panpar.horizon)*1.7453292519444E-2f; + azi0 = -(panpar.angle*0.5f)*1.7453292519444E-2f; + azid = X2C_DIVR(panpar.angle*1.7453292519444E-2f, + (float)((panpar.image->Len1-1)+1UL)); + eled = X2C_DIVR(azid,panpar.yzoom); + ele0 = (panpar.elevation-X2C_DIVR((X2C_DIVR(panpar.angle*0.5f, + panpar.yzoom))*(float)((panpar.image->Len0-1)+1UL), + (float)((panpar.image->Len1-1)+1UL)))*1.7453292519444E-2f; + slat = osic_sin(-panpar.eye.lat); + clat = osic_cos(-panpar.eye.lat); + slong = osic_sin(-panpar.eye.long0); + clong = osic_cos(-panpar.eye.long0); + sazi = osic_sin(azi); + cazi = osic_cos(azi); + /*WrFixed(azi0/RAD, 4, 10); WrFixed(azid/RAD, 4, 10); + WrStrLn(" adi0 azid"); */ + /*WrFixed(panpar.elevation*RAD/azid, 4, 12); WrStrLn(" adi0 azid"); */ + xi = 0UL; + if (find) xi = (uint32_t)panpar.hx; + do { + /* wx:=panpar.angle*RAD*(FLOAT(xi)-FLOAT(HIGH(panpar.image^)+1)*0.5) + /FLOAT(HIGH(panpar.image^)+1); */ + wx = azi0+azid*(float)xi; + if (panpar.flatscreen) wx = osic_arctan(wx); + yi = 0UL; + if (find) { + yi = (uint32_t)((int32_t)((panpar.image->Len0-1)+1UL)-panpar.hy) + ; + } + d = 0.0f; + dlum = 0.0f; + lastlum = 0.0f; + heaven = 0; + do { + if (!heaven) { + wy = ele0+eled*(float)yi; + if (panpar.flatscreen) wy = osic_arctan(wy); + /*IF xi=0 THEN WrFixed(wx/RAD, 2, 8); WrFixed(wy/RAD, 2, 8); + WrStr(" wx wy"); END; */ + zn = osic_cos(wx)*osic_cos(wy); + yn = osic_sin(wx); + xn = osic_sin(wy); + rotvector(&yn, &zn, cazi, sazi); + /*IF xi=0 THEN WrFixed(xn, 2, 7); WrFixed(yn, 2, 7); + WrFixed(zn, 2, 7); END; */ + rotvector(&xn, &zn, clat, slat); + rotvector(&xn, &yn, clong, slong); + /*IF (ABS(wy)>0.5) & (d>maxdist*0.1) THEN d:=d-maxdist*0.1 END; + (* jump back if sight from above *) */ + raytrace(5.0f, x0, y00, z0, xn*0.001f, yn*0.001f, zn*0.001f, + maxdist, &d, &light, &oldh, &lasth, &space, pos); + if (d>maxdist) heaven = 1; + if (find) { + if (heaven) aprsdecode_posinval(pos); + return; + } + } + else light = 1.0f; + if (heaven) { + d = maxdist*4.0f*(1.25f-X2C_DIVR((float)yi, + (float)(panpar.image->Len0-1))); + } + lum = d*0.2f; + llum = (lum-lastlum)*20.0f; + if (llum>0.08f*maxdist) llum = 0.08f*maxdist; + if (llum>dlum) dlum = llum; + lastlum = lum; + if (!heaven) { + tree = 1600.0f-oldh; + if (tree<0.0f) tree = 0.0f; + else if (tree>600.0f) tree = 600.0f; + tree = tree*1.5833333333333E-3f*(1.0f-X2C_DIVR(d,maxdist)); + /* tree:=tree*(0.95/600.0); */ + /*WrFixed(light, 5,2); WrStr(" "); */ + light = light-0.65f; + if (light<0.0f) { + light = light*(-2.0f); + if (light>1.0f) light = 1.0f; + light = 1.0f+light; /**(1.0-d/maxdist)*/ + light = light*(1.7f-tree); + lr = lum*light*1.4f+dlum; + lg = lum*light*1.1f+dlum; + lb = lum*light*0.8f+dlum; + } + else { + lr = lum*(1.7f-tree*1.3f)+dlum; + lg = lum*(1.7f-tree*0.8f)+dlum; + lb = lum*(1.7f-tree*1.7f)+dlum; + } + if (lr>maxdist) lr = maxdist; + if (lg>maxdist) lg = maxdist; + if (lb>maxdist) lb = maxdist; + lr = lr*lummul; + lg = lg*lummul; + lb = lb*lummul; + } + lum = lum+dlum; + if (lum>maxdist) lum = maxdist; + lum = lum*lummul; + dlum = dlum*0.84f; + { /* with */ + struct maptool_PIX * anonym = &panpar.image->Adr[(xi) + *panpar.image->Len0+yi]; + if (heaven) { + /* heaven */ + /* hc:=VAL(REAL, 2*yi)/VAL(REAL, + HIGH(panpar.image^[0]))-1.0; */ + /* hc:=(ele0 + eled*FLOAT(yi))*6.0; */ + hc = X2C_DIVR(((float) + yi+X2C_DIVR(panpar.elevation*1.7453292519444E-2f,azid))*2.0f, + (float)(panpar.image->Len0-1))-1.0f; + if (hc<0.0f) hc = 0.0f; + else if (hc>1.0f) hc = 1.0f; + hc1 = 1.0f-hc; + anonym->r = (uint16_t)aprsdecode_trunc(lum*hc1+lum*hr*hc); + anonym->g = (uint16_t)aprsdecode_trunc(lum*hc1+lum*hg*hc); + anonym->b = (uint16_t)aprsdecode_trunc(lum*hc1+lum*hb*hc); + } + else { + anonym->r = (uint16_t)aprsdecode_trunc(lr); + anonym->g = (uint16_t)aprsdecode_trunc(lg); + anonym->b = (uint16_t)aprsdecode_trunc(lb); + } + or = (float)anonym->r; + og = (float)anonym->g; + ob = (float)anonym->b; + if (yi>1UL) { + anonym->r = (uint16_t) + aprsdecode_trunc(or*space+oor*(1.0f-space)); + anonym->g = (uint16_t) + aprsdecode_trunc(og*space+oog*(1.0f-space)); + anonym->b = (uint16_t) + aprsdecode_trunc(ob*space+oob*(1.0f-space)); + } + oor = or; + oog = og; + oob = ob; + } + ++yi; + } while (yi<=panpar.image->Len0-1); + /*WrInt(xi, 5); WrFixed(pos.lat*180.0/pi, 4,8); + WrFixed(pos.long*180.0/pi, 4,8); WrStrLn(" xi lat long az"); + */ + ++xi; + } while (xi<=panpar.image->Len1-1); +/* killmenuid(5); */ +} /* end Panofind() */ + + +extern void maptool_Panorama(maptool_pIMAGE testimg, + struct maptool_PANOWIN panpar, char * abort0) +{ + float res; + struct aprspos_POSITION pos; + Panofind(0, panpar, &res, &pos); +} /* end Panorama() */ + + +extern void maptool_findpanopos(struct maptool_PANOWIN panpar, + struct aprspos_POSITION * pos, float * dist, + int32_t * alt) +{ + float resol; + float res; + Panofind(1, panpar, &res, pos); + if (aprspos_posvalid(*pos)) { + *alt = (int32_t)X2C_TRUNCI(maptool_getsrtm(*pos, 0UL, &resol)+0.5f, + X2C_min_longint,X2C_max_longint); + *dist = aprspos_distance(panpar.eye, *pos); + } +/*WrFixed(res, 1, 10); WrStrLn("=d"); */ +} /* end findpanopos() */ + +/* +find exact earth point with cross point of trace and earth line +yzoom xzoom(deg) ypan xpan(deg) maxdist ant mousepos show-marker2 sun-xy snow-alt heaven-col +cursor ^ v < > + - + +no interpolate in search mode +antialiasing measure scanline to peack distance +start rescan next y with same d +soft change wood-rock +*/ +/*Panorama */ + +extern void maptool_xytoloc(struct aprspos_POSITION mpos, char s[], + uint32_t s_len) +/* lat/long + locator string of pos */ +{ + char h[101]; + int32_t nn; + float resol; + /* xytodeg(VAL(REAL,x), VAL(REAL,y), mpos); */ + aprstext_postostr(mpos, '3', s, s_len); + aprsstr_Append(s, s_len, " \373", 3ul); + aprstext_postostr(mpos, '1', h, 101ul); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, " \376", 3ul); + aprsstr_FixToStr(X2C_DIVR(mpos.lat,1.7453292519444E-2f), 6UL, h, 101ul); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, " ", 2ul); + aprsstr_FixToStr(X2C_DIVR(mpos.long0,1.7453292519444E-2f), 6UL, h, 101ul); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, " \373", 3ul); + maptool_postoloc(h, 101ul, mpos); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, "\376", 2ul); + nn = (int32_t)X2C_TRUNCI(maptool_getsrtm(mpos, 0UL, &resol)+0.5f, + X2C_min_longint,X2C_max_longint); + if (nn<30000L) { + aprsstr_IntToStr(nn, 0UL, h, 101ul); + aprsstr_Append(s, s_len, " ", 2ul); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, "m", 2ul); + } + if (aprspos_posvalid(aprsdecode_click.markpos)) { + /*(click.marktime=0) &*/ + aprsstr_FixToStr(aprspos_distance(aprsdecode_click.markpos, mpos), 4UL, + h, 101ul); + aprsstr_Append(s, s_len, " \373", 3ul); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, "km ", 4ul); + aprsstr_FixToStr(aprspos_azimuth(aprsdecode_click.markpos, mpos), 2UL, + h, 101ul); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, "\177\376", 3ul); + } +} /* end xytoloc() */ + +#define maptool_MOUNTAINDIST 10.0 + + +extern void maptool_POIname(struct aprspos_POSITION * mpos, char s[], + uint32_t s_len) +/* get name of nearest POI */ +{ + char h[101]; + float mindist; + float d; + aprsdecode_pMOUNTAIN pmin; + aprsdecode_pMOUNTAIN pm; + struct aprsdecode_MOUNTAIN * anonym; + pm = aprsdecode_mountains; + mindist = 2560.0f*osic_power(2.0f, -maptool_realzoom(aprsdecode_initzoom, + aprsdecode_finezoom)); + if (mindist>10.0f) mindist = 10.0f; + /*WrFixed(mpos.lat, 4, 8);WrFixed(mpos.long, 4, 8); WrStrLn(""); */ + pmin = 0; + while (pm) { + { /* with */ + struct aprsdecode_MOUNTAIN * anonym = pm; + if ((float)fabs(anonym->pos.lat-mpos->lat) + <1.5707963267949E-3f && (float) + fabs(anonym->pos.long0-mpos->long0)<1.5707963267949E-3f) { + d = aprspos_distance(anonym->pos, *mpos); + /*WrFixed(d, 1, 6); WrStrLn(""); */ + if (dnext; + } + } + if (pmin) { + aprsstr_Assign(s, s_len, pmin->name, 32ul); + if (pmin->alt>0) { + aprsstr_Append(s, s_len, " ", 2ul); + aprsstr_IntToStr((int32_t)pmin->alt, 0UL, h, 101ul); + aprsstr_Append(s, s_len, h, 101ul); + aprsstr_Append(s, s_len, "m", 2ul); + } + *mpos = pmin->pos; + } + else s[0UL] = 0; +} /* end POIname() */ + +#define maptool_WILDCARD "*" + +#define maptool_WILD "?" + + +static void POIfindfrom(struct aprspos_POSITION * mpos, char s[], + uint32_t s_len) +/* get position of POI name */ +{ + uint32_t cnt; + uint32_t ls; + uint32_t i; + aprsdecode_pMOUNTAIN pmax; + aprsdecode_pMOUNTAIN pm; + struct aprsdecode_MOUNTAIN * anonym; + X2C_PCOPY((void **)&s,s_len); + pm = aprsdecode_mountains; + pmax = 0; + if (31UL=lastpoinum) { + /* start from last time */ + i = 0UL; + while (iname[i]) + ==X2C_CAP(s[i]))) ++i; + if (i>=ls && anonym->name[i]==0 || s[i]=='*') { + pmax = pm; /* fit */ + break; + } + } + ++cnt; + pm = anonym->next; + } + } + if (pmax) { + *mpos = pmax->pos; + aprsdecode_click.bubblpos = pmax->pos; + aprsstr_Assign(aprsdecode_click.bubblstr, 50ul, pmax->name, 32ul); + aprsdecode_click.lastpoi = lastpoinum==0UL; + lastpoinum = cnt+1UL; /* next time goon from this entry */ + } + else aprsdecode_posinval(mpos); + X2C_PFREE(s); +} /* end POIfindfrom() */ + + +extern void maptool_POIfind(struct aprspos_POSITION * mpos, char s[], + uint32_t s_len) +/* get position of POI name */ +{ + if (lastpoinum==0UL) POIfindfrom(mpos, s, s_len); + else { + POIfindfrom(mpos, s, s_len); /* find next */ + if (!aprspos_posvalid(*mpos)) { + lastpoinum = 0UL; + POIfindfrom(mpos, s, s_len); /* else try again from start */ + } + } +} /* end POIfind() */ + + +extern void maptool_Colset(struct aprsdecode_COLTYP * c, char w) +{ + c->r = 256UL; + c->g = 256UL; + c->b = 256UL; + if (w=='Y') c->b = 0UL; + else if (w=='R') { + c->b = 0UL; + c->g = 0UL; + } + else if (w=='G') { + c->r = 0UL; + c->b = 0UL; + } + else if (w=='B') { + c->r = 0UL; + c->g = 60UL; + } + else if (w=='O') { + c->b = 0UL; + c->g = 150UL; + } + else if (w=='V') c->g = 0UL; + else if (w=='L') c->r = 160UL; + else if (w=='0') { + c->r = 255UL; + c->g = 40UL; + c->b = 10UL; + } + else if (w=='1') { + c->r = 240UL; + c->g = 120UL; + c->b = 10UL; + } + else if (w=='2') { + c->r = 240UL; + c->g = 190UL; + c->b = 10UL; + } + else if (w=='3') { + c->r = 240UL; + c->g = 250UL; + c->b = 10UL; + } + else if (w=='4') { + c->r = 110UL; + c->g = 250UL; + c->b = 10UL; + } + else if (w=='5') { + c->r = 10UL; + c->g = 250UL; + c->b = 50UL; + } + else if (w=='6') { + c->r = 10UL; + c->g = 190UL; + c->b = 220UL; + } + else if (w=='7') { + c->r = 10UL; + c->g = 90UL; + c->b = 255UL; + } + else if (w=='8') { + c->r = 140UL; + c->g = 5UL; + c->b = 255UL; + } + else if (w=='9') { + c->r = 250UL; + c->g = 5UL; + c->b = 200UL; + } +} /* end Colset() */ + + +static void addcol(struct maptool_PIX * pixel, int32_t rr, int32_t gg, + int32_t bb, int32_t f) +{ + int32_t fh; + struct maptool_PIX * anonym; + { /* with */ + struct maptool_PIX * anonym = pixel; + fh = (int32_t)anonym->r+(rr*f)/256L; + if (fh<0L) fh = 0L; + else if (fh>30000L) fh = 30000L; + anonym->r = (uint16_t)fh; + fh = (int32_t)anonym->g+(gg*f)/256L; + if (fh<0L) fh = 0L; + else if (fh>30000L) fh = 30000L; + anonym->g = (uint16_t)fh; + fh = (int32_t)anonym->b+(bb*f)/256L; + if (fh<0L) fh = 0L; + else if (fh>30000L) fh = 30000L; + anonym->b = (uint16_t)fh; + } +} /* end addcol() */ + + +extern void maptool_waypoint(maptool_pIMAGE image, float x, float y, + float r, int32_t rr, int32_t gg, int32_t bb) +{ + int32_t ri; + int32_t ty; + int32_t tx; + int32_t yi; + int32_t xi; + float h; + float my; + float mx; + float fy; + float fx; + int32_t tmp; + int32_t tmp0; + if (((x>r && x<(float)((image->Len1-1)+1UL)-r) && y>r) && y<(float) + ((image->Len0-1)+1UL)-r) { + ri = (int32_t)(aprsdecode_trunc(r)+1UL); + tx = (int32_t)aprsdecode_trunc(x); + fx = x-(float)tx; + ty = (int32_t)aprsdecode_trunc(y); + fy = y-(float)ty; + tmp = ri; + yi = -ri; + if (yi<=tmp) for (;; yi++) { + tmp0 = ri; + xi = -ri; + if (xi<=tmp0) for (;; xi++) { + mx = (float)xi-fx; + my = (float)yi-fy; + h = mx*mx+my*my; + if (h>0.0f) h = osic_sqrt(h); + h = r-h; + if (h>0.0f) { + if (h>1.0f) h = 1.0f; + addcol(&image->Adr[(tx+xi)*image->Len0+(ty+yi)], rr, gg, bb, + (int32_t)aprsdecode_trunc(h*256.0f)); + } + if (xi==tmp0) break; + } /* end for */ + if (yi==tmp) break; + } /* end for */ + } +} /* end waypoint() */ + +#define maptool_K 65536 + +#define maptool_KF 256 + + +extern void maptool_vector(maptool_pIMAGE image, float x0, float y00, + float x1, float y1, int32_t rr, int32_t gg, + int32_t bb, uint32_t width, float glow) +{ + float ro; + float w2; + float w1; + float r; + float h; + uint32_t f1; + uint32_t iw2; + uint32_t e1; + uint32_t de0; + uint32_t e0; + uint32_t n0; + uint32_t n; + uint32_t yb; + uint32_t ya; + uint32_t yie; + uint32_t yi; + uint32_t xi; + int32_t fgg; + int32_t fbb; + int32_t frr; + int32_t k; + char mirr; + char mirror; + char flip; + /*scissoring*/ + mirr = y00>y1; + if (x0>x1) { + h = x1; + x1 = x0; + x0 = h; + h = y1; + y1 = y00; + y00 = h; + mirror = 1; + } + else mirror = 0; + if (x0>=(float)((image->Len1-1)-1UL) || x1<=0.0f) return; + /* hor out */ + if (x0<=0.0f) { + y00 = y00+X2C_DIVR((y1-y00)*x0,x0-x1); + x0 = 1.0f; + } + if (x1>=(float)((image->Len1-1)-1UL)) { + y1 = y00+X2C_DIVR((y1-y00)*((float)((image->Len1-1)-1UL)-x0),x1-x0); + x1 = (float)((image->Len1-1)-1UL); + } + if (y00<=0.0f) { + if (y1<=0.0f) return; + /* bottom out */ + x0 = x0+X2C_DIVR((x1-x0)*y00,y00-y1); + y00 = 1.0f; + } + else if (y00>=(float)((image->Len0-1)-1UL)) { + if (y1>=(float)((image->Len0-1)-1UL)) return; + /* top out */ + x0 = x0+X2C_DIVR((x1-x0)*((float)((image->Len0-1)-1UL)-y00),y1-y00); + y00 = (float)((image->Len0-1)-1UL); + } + if (y1<=0.0f) { + x1 = x1+X2C_DIVR((x1-x0)*y1,y00-y1); + y1 = 1.0f; + } + else if (y1>=(float)((image->Len0-1)-1UL)) { + x1 = x0+X2C_DIVR((x1-x0)*((float)((image->Len0-1)-1UL)-y00),y1-y00); + y1 = (float)((image->Len0-1)-1UL); + } + /*scissoring*/ + if (x0<2.0f) x0 = 2.0f; + if (x0>(float)((image->Len1-1)-1UL)) { + x0 = (float)((image->Len1-1)-1UL); + } + if (y00<2.0f) y00 = 2.0f; + if (y00>(float)((image->Len0-1)-1UL)) { + y00 = (float)((image->Len0-1)-1UL); + } + if (x1<2.0f) x1 = 2.0f; + if (x1>(float)((image->Len1-1)-1UL)) { + x1 = (float)((image->Len1-1)-1UL); + } + if (y1<2.0f) y1 = 2.0f; + if (y1>(float)((image->Len0-1)-1UL)) { + y1 = (float)((image->Len0-1)-1UL); + } + w1 = X2C_DIVR((float)width,512.0f); + if (x1-x0<(float)fabs(y1-y00)) { + h = x0; + x0 = y00; + y00 = h; + h = x1; + x1 = y1; + y1 = h; + flip = 1; + } + else flip = 0; + if (x0>x1) { + h = y1; + y1 = y00; + y00 = h; + h = x1; + x1 = x0; + x0 = h; + mirror = !mirror; + } + if (x1==x0) return; + h = X2C_DIVR(y1-y00,x1-x0); + ro = osic_sqrt(1.0f+h*h); + w2 = w1*ro; + iw2 = aprsdecode_trunc(w2*65536.0f); + r = w1*osic_sin(osic_arctan(h)); + xi = aprsdecode_trunc(x0-(float)fabs(r)); + w1 = (((y00-h*(float)fabs(r))-w2)-0.5f)*65536.0f; + if (w1<0.0f) ya = 0UL; + else ya = aprsdecode_trunc(w1); + /* + ya:=TRUNC((y0-h*ABS(r)-w2-0.5)*K); + */ + e0 = iw2*2UL; + yb = ya+e0; + if ((float)fabs(r)>0.1f) { + de0 = aprsdecode_trunc(X2C_DIVR((float)e0,(float)fabs(r)*2.0f)); + } + else de0 = e0; + k = (int32_t)X2C_TRUNCI(h*65536.0f,X2C_min_longint,X2C_max_longint); + n = aprsdecode_trunc((x1-(float)xi)+(float)fabs(r)); + mirr = y00>y1; + if (aprsdecode_click.dryrun) ya = (ya+yb)/2UL; + glow = X2C_DIVR(glow,ro); + e1 = 0UL; + n0 = n; + while (n>0UL) { + if (aprsdecode_click.dryrun) { + yi = ya/65536UL; + if (flip) { + findinfo((int32_t)(yi-1UL), (int32_t)xi); + findinfo((int32_t)yi, (int32_t)xi); + findinfo((int32_t)(yi+1UL), (int32_t)xi); + } + else { + findinfo((int32_t)xi, (int32_t)(yi-1UL)); + findinfo((int32_t)xi, (int32_t)yi); + findinfo((int32_t)xi, (int32_t)(yi+1UL)); + } + } + else { + if (mirror) h = (float)n; + else h = (float)(n0-n); + if (hde0) { + yie = yb-e0; + e0 -= de0; + } + else yie = yb; + if (n<=aprsdecode_trunc((float)fabs(r)*2.0f)) ya += de0; + yi = ya; + } + else { + if (e0>de0) { + yi = ya+e0; + e0 -= de0; + } + else yi = ya; + if (n<=aprsdecode_trunc((float)fabs(r)*2.0f)) yb -= de0; + yie = yb; + } + f1 = 256UL-(yi&65535UL)/256UL; + yi = (yi/65536UL)*65536UL; + do { + if (flip) { + addcol(&image->Adr[(yi/65536UL)*image->Len0+xi], frr, fgg, + fbb, (int32_t)f1); + } + else { + addcol(&image->Adr[(xi)*image->Len0+yi/65536UL], frr, fgg, + fbb, (int32_t)f1); + } + yi += 65536UL; + f1 = 256UL; + } while (yiAdr[(yi/65536UL)*image->Len0+xi], frr, fgg, fbb, + (int32_t)f1); + } + else { + addcol(&image->Adr[(xi)*image->Len0+yi/65536UL], frr, fgg, fbb, + (int32_t)f1); + } + /* INC(yb, k); */ + yb = (uint32_t)((int32_t)yb+k); + } + /* INC(ya, k); */ + ya = (uint32_t)((int32_t)ya+k); + ++xi; + --n; + } +} /* end vector() */ + + +extern void maptool_setmark(maptool_pIMAGE image, + struct aprspos_POSITION pos, char hard) +{ + int32_t i; + float y; + float x; + struct aprsdecode_COLTYP col0; + if (aprspos_posvalid(pos) && maptool_mapxy(pos, &x, &y)>=0L) { + col0.r = 0UL; + col0.g = 1000UL; + col0.b = 1000UL; + if (hard) { + col0.r = 1000UL; + col0.b = 0UL; + } + for (i = -6L; i<=6L; i++) { + maptool_waypoint(image, x+(float)(i*3L), y, 1.3f, + (int32_t)col0.r, (int32_t)col0.g, (int32_t)col0.b); + maptool_waypoint(image, x, y+(float)(i*3L), 1.3f, + (int32_t)col0.r, (int32_t)col0.g, (int32_t)col0.b); + } /* end for */ + } +} /* end setmark() */ + +#define maptool_ALPHA 255 + +#define maptool_WHITE 1023 + + +static void dim(float dimmlev, maptool_pIMAGE img, int32_t x, + int32_t y) +{ + float lum; + struct maptool_PIX * anonym; + if (((x<0L || x>=(int32_t)(img->Len1-1)) || y<0L) || y>=(int32_t) + (img->Len0-1)) return; + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(x)*img->Len0+y]; + lum = (float)((uint32_t)anonym->r*87UL+(uint32_t) + anonym->g*140UL+(uint32_t)anonym->b*28UL); + if (lum>dimmlev) { + lum = X2C_DIVR(dimmlev,lum); + anonym->r = (uint16_t)aprsdecode_trunc((float)anonym->r*lum); + anonym->g = (uint16_t)aprsdecode_trunc((float)anonym->g*lum); + anonym->b = (uint16_t)aprsdecode_trunc((float)anonym->b*lum); + } + } +} /* end dim() */ + + +extern void maptool_drawchar(maptool_pIMAGE img, char ch, float x0r, + float y0r, int32_t * inc0, uint32_t bri, + uint32_t contrast, struct aprsdecode_COLTYP col0, + char dryrun) +{ + int32_t fine; + int32_t yy; + int32_t xx; + int32_t y00; + int32_t x0; + int32_t y; + int32_t x; + uint32_t cn; + uint32_t cf; + uint32_t c; + uint32_t fy; + uint32_t fx; + float dimmlev; + struct _1 * anonym; + struct maptool_PIX * anonym0; + struct maptool_PIX * anonym1; + struct maptool_PIX * anonym2; + struct maptool_PIX * anonym3; + int32_t tmp; + if (((uint8_t)ch>=' ' && x0r>=0.0f) && y0r>=0.0f) { + cn = (uint32_t)(uint8_t)ch-32UL; + if (cn>96UL) cn = 0UL; + dimmlev = 20480.0f; + if (contrast==1UL) { + dimmlev = (float)((col0.r*87UL+col0.g*140UL+col0.b*28UL)*bri) + *0.002f; + } + x0 = (int32_t)aprsdecode_trunc(x0r); + y00 = (int32_t)aprsdecode_trunc(y0r); + fx = aprsdecode_trunc((x0r-(float)x0)*256.0f); + fy = aprsdecode_trunc((y0r-(float)y00)*256.0f); + fine = (int32_t)(uint32_t)(fx || fy); + { /* with */ + struct _1 * anonym = &font[cn]; + if (contrast>0UL && !dryrun) { + tmp = (int32_t)(aprsdecode_lums.fontysize-1UL); + y = 0L; + if (y<=tmp) for (;; y++) { + for (x = 0L; x<=15L; x++) { + /* + IF hicontrast & (mask[y]<>SET16{} + ) OR (x IN mask[y]) THEN dim(x0+x, y0+y) END; + */ + if (X2C_IN(x,16,anonym->mask[y])) { + dim(dimmlev, img, x0+x+fine, y00+y); + } + } /* end for */ + if (y==tmp) break; + } /* end for */ + } + tmp = (int32_t)(aprsdecode_lums.fontysize-3UL); + y = 0L; + if (y<=tmp) for (;; y++) { + yy = y00+y+1L; + for (x = 0L; x<=7L; x++) { + xx = x0+x+1L; + c = ((uint32_t)anonym->char0[y][x]*bri)/256UL; + if ((((c>0UL && xx>=0L) && xx+1L<(int32_t)(img->Len1-1)) + && yy>=0L) && yy+1L<(int32_t)(img->Len0-1)) { + if (dryrun) findinfo(xx, yy); + else { + cf = (c*(256UL-fx)*(256UL-fy))/65536UL; + { /* with */ + struct maptool_PIX * anonym0 = &img->Adr[(xx) + *img->Len0+yy]; + anonym0->r += (uint16_t)((cf*col0.r)/256UL); + anonym0->g += (uint16_t)((cf*col0.g)/256UL); + anonym0->b += (uint16_t)((cf*col0.b)/256UL); + if (((uint32_t)anonym0->g+col0.g&1)) { + --anonym0->g; /* even is invert enable */ + } + } + if (fine) { + /* save cpu */ + cf = (c*fx*(256UL-fy))/65536UL; + { /* with */ + struct maptool_PIX * anonym1 = &img->Adr[(xx+1L) + *img->Len0+yy]; + anonym1->r += (uint16_t)((cf*col0.r)/256UL); + anonym1->g += (uint16_t)((cf*col0.g)/256UL); + anonym1->b += (uint16_t)((cf*col0.b)/256UL); + } + cf = (c*(256UL-fx)*fy)/65536UL; + { /* with */ + struct maptool_PIX * anonym2 = &img->Adr[(xx) + *img->Len0+(yy+1L)]; + anonym2->r += (uint16_t)((cf*col0.r)/256UL); + anonym2->g += (uint16_t)((cf*col0.g)/256UL); + anonym2->b += (uint16_t)((cf*col0.b)/256UL); + } + cf = (c*fx*fy)/65536UL; + { /* with */ + struct maptool_PIX * anonym3 = &img->Adr[(xx+1L) + *img->Len0+(yy+1L)]; + anonym3->r += (uint16_t)((cf*col0.r)/256UL); + anonym3->g += (uint16_t)((cf*col0.g)/256UL); + anonym3->b += (uint16_t)((cf*col0.b)/256UL); + } + } + } + } + } /* end for */ + if (y==tmp) break; + } /* end for */ + *inc0 = (int32_t)(anonym->width+1U); + } + } +} /* end drawchar() */ + + +extern uint32_t maptool_charwidth0(char ch) +{ + uint32_t cn; + if ((uint8_t)ch>=' ') { + cn = (uint32_t)(uint8_t)ch-32UL; + if (cn>96UL) cn = 0UL; + return (uint32_t)(font[cn].width+1U); + } + return 0UL; +} /* end charwidth() */ + +#define maptool_ALPHA0 220 + +#define maptool_WHITELEV 250 + + +extern void maptool_drawsym(maptool_pIMAGE image, char tab, char sym, + char mirror, float x0r, float y0r, + uint32_t bri) +{ + int32_t sx; + int32_t xi; + int32_t y00; + int32_t x0; + int32_t y; + int32_t x; + uint32_t b; + uint32_t br0d; + uint32_t br1d; + uint32_t br0c; + uint32_t br1c; + uint32_t br0b; + uint32_t br1b; + uint32_t br0a; + uint32_t br1a; + struct aprsdecode_COLTYP col0; + uint32_t fy; + uint32_t fx; + struct PIX8 * anonym; + struct maptool_PIX * anonym0; + /* save cpu */ + struct maptool_PIX * anonym1; + struct maptool_PIX * anonym2; + struct maptool_PIX * anonym3; + if (bri==0UL) return; + sx = (int32_t)(uint8_t)sym-32L; + if (((((sx<=0L || sx>=96L) || x0r<(-16.0f)) || y0r<(-16.0f)) + || x0r>(float)((image->Len1-1)+16UL)) || y0r>(float) + ((image->Len0-1)+16UL)) return; + if (tab!='/') sx += 96L; + sx = sx*16L; + if (bri>255UL) bri = 255UL; + x0 = (int32_t)X2C_TRUNCI(x0r,X2C_min_longint,X2C_max_longint); + y00 = (int32_t)X2C_TRUNCI(y0r,X2C_min_longint,X2C_max_longint); + if (x0<0L) fx = 0UL; + else fx = aprsdecode_trunc((x0r-(float)x0)*256.0f); + if (y00<0L) fy = 0UL; + else fy = aprsdecode_trunc((y0r-(float)y00)*256.0f); + x0 -= 8L; + y00 -= 8L; + b = (bri*(256UL-fx)*(256UL-fy))/65536UL; + br1a = 256UL-b; + br0a = (b*256000UL)/65536UL; + if (fx || fy) { + /* save cpu */ + b = (bri*fx*(256UL-fy))/65536UL; + br1b = 256UL-b; + br0b = (b*256000UL)/65536UL; + b = (bri*(256UL-fx)*fy)/65536UL; + br1c = 256UL-b; + br0c = (b*256000UL)/65536UL; + b = (bri*fx*fy)/65536UL; + br1d = 256UL-b; + br0d = (b*256000UL)/65536UL; + } + for (y = 0L; y<=15L; y++) { + for (x = 0L; x<=15L; x++) { + if (((x0+x>=0L && y00+y>=0L) && x+x0+1L<(int32_t)(image->Len1-1)) + && y+y00+1L<(int32_t)(image->Len0-1)) { + if (mirror) xi = (15L-x)+sx; + else xi = x+sx; + { /* with */ + struct PIX8 * anonym = &symbols[xi][y]; + if ((anonym->r8<220U || anonym->g8<220U) || anonym->b8<220U) { + if (aprsdecode_click.dryrun) findinfo(x+x0, y+y00); + else { + { /* with */ + struct maptool_PIX * anonym0 = &image->Adr[(x+x0) + *image->Len0+(y+y00)]; + anonym0->r = (uint16_t)(((uint32_t) + anonym0->r*br1a+(uint32_t)anonym->r8*br0a)/256UL); + anonym0->g = (uint16_t)(((uint32_t) + anonym0->g*br1a+(uint32_t)anonym->g8*br0a)/256UL); + anonym0->b = (uint16_t)(((uint32_t) + anonym0->b*br1a+(uint32_t)anonym->b8*br0a)/256UL); + } + if (fx || fy) { + { /* with */ + struct maptool_PIX * anonym1 = &image->Adr[(x+x0+1L) + *image->Len0+(y+y00)]; + anonym1->r = (uint16_t)(((uint32_t) + anonym1->r*br1b+(uint32_t)anonym->r8*br0b)/256UL); + anonym1->g = (uint16_t)(((uint32_t) + anonym1->g*br1b+(uint32_t)anonym->g8*br0b)/256UL); + anonym1->b = (uint16_t)(((uint32_t) + anonym1->b*br1b+(uint32_t)anonym->b8*br0b)/256UL); + } + { /* with */ + struct maptool_PIX * anonym2 = &image->Adr[(x+x0) + *image->Len0+(y+y00+1L)]; + anonym2->r = (uint16_t)(((uint32_t) + anonym2->r*br1c+(uint32_t)anonym->r8*br0c)/256UL); + anonym2->g = (uint16_t)(((uint32_t) + anonym2->g*br1c+(uint32_t)anonym->g8*br0c)/256UL); + anonym2->b = (uint16_t)(((uint32_t) + anonym2->b*br1c+(uint32_t)anonym->b8*br0c)/256UL); + } + { /* with */ + struct maptool_PIX * anonym3 = &image->Adr[(x+x0+1L) + *image->Len0+(y+y00+1L)]; + anonym3->r = (uint16_t)(((uint32_t) + anonym3->r*br1d+(uint32_t)anonym->r8*br0d)/256UL); + anonym3->g = (uint16_t)(((uint32_t) + anonym3->g*br1d+(uint32_t)anonym->g8*br0d)/256UL); + anonym3->b = (uint16_t)(((uint32_t) + anonym3->b*br1d+(uint32_t)anonym->b8*br0d)/256UL); + } + } + } + } + } + } + } /* end for */ + } /* end for */ + if (((uint8_t)tab>='0' && (uint8_t)tab<='9' || (uint8_t) + tab>='A' && (uint8_t)tab<='Z') || (uint8_t) + tab>='a' && (uint8_t)tab<='z') { + maptool_Colset(&col0, 'W'); + maptool_drawchar(image, tab, x0r-4.0f, + y0r-((8.0f-(16.0f-(float)aprsdecode_lums.fontysize)*0.5f) + +0.5f), &sx, bri*2UL, 1UL, col0, aprsdecode_click.dryrun); + } +} /* end drawsym() */ + +#define maptool_FILLLUM 30 + + +static uint32_t lim(float x, uint32_t m) +{ + uint32_t r; + if (x<=0.0f) return 0UL; + r = aprsdecode_trunc(x); + if (r>m) return m; + return r; +} /* end lim() */ + + +static void arc(uint32_t b, uint32_t g, uint32_t r, + maptool_pIMAGE image, char fill, float xh, + float * y1, float yh, float * y00, uint32_t yi0, + float * x0, float * x1, uint32_t i, char oct, + float * xhh) +{ + uint32_t lum; + if (*xhh>(-1.0f)) { + if (oct) { + *xhh = 1.0f-sqr(X2C_DIVR((float)i-*x1,*x1-*x0)); + if (*xhh<=0.0f) *xhh = 0.0f; + *xhh = (float)fabs(((float)yi0-*y00)-yh)-(*y1-*y00) + *0.5f*osic_sqrt(*xhh); + } + else *xhh = (float)fabs(*x1-(float)i)-xh; + *xhh = (1.5f-(float)fabs(*xhh+1.5f))*1.7066666666667E+2f; + } + if (*xhh>0.0f) { + if (aprsdecode_click.dryrun) findinfo((int32_t)i, (int32_t)yi0); + lum = aprsdecode_trunc(*xhh); + } + else if (fill) lum = 30UL; + else lum = 0UL; + addcol(&image->Adr[(i)*image->Len0+yi0], (int32_t)r, (int32_t)g, + (int32_t)b, (int32_t)lum); +} /* end arc() */ + + +extern void maptool_drawareasym(maptool_pIMAGE image, + struct aprspos_POSITION pm, struct aprsdecode_AREASYMB area, + uint32_t bri) +{ + int32_t ret; + struct aprspos_POSITION p1; + struct aprspos_POSITION p0; + float xho; + float yh; + float xhh; + float xh; + float y1; + float x1; + float y00; + float x0; + uint32_t xm; + uint32_t i; + uint32_t yi1; + uint32_t xi1; + uint32_t yi0; + uint32_t xi0; + char oct; + char fill; + uint32_t b; + uint32_t g; + uint32_t r; + uint32_t tmp; + switch ((unsigned)(area.color&7U)) { + case 0U: /* we have no black so make gray */ + r = 128UL; + g = 128UL; + b = 128UL; + break; + case 1U: + r = 0UL; + g = 0UL; + b = 255UL; + break; + case 2U: + r = 0UL; + g = 255UL; + b = 0UL; + break; + case 3U: + r = 0UL; + g = 255UL; + b = 255UL; + break; + case 4U: + r = 255UL; + g = 0UL; + b = 0UL; + break; + case 5U: + r = 255UL; + g = 0UL; + b = 255UL; + break; + case 6U: + r = 255UL; + g = 255UL; + b = 0UL; + break; + case 7U: + r = 255UL; + g = 255UL; + b = 255UL; + break; + } /* end switch */ + if (area.color>=8U) { + r = r/2UL; + g = g/2UL; + b = b/2UL; + } + r = (r*bri)/64UL; + g = (g*bri)/64UL; + b = (b*bri)/64UL; + if (area.typ=='1' || area.typ=='6') { + /* line */ + p0.lat = pm.lat+area.dpos.lat; + p0.long0 = pm.long0-area.dpos.long0; + p1.lat = pm.lat-area.dpos.lat; + p1.long0 = pm.long0+area.dpos.long0; + ret = maptool_mapxy(p0, &x0, &y00); + ret = maptool_mapxy(p1, &x1, &y1); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 300UL, 0.0f); + } + else if (area.typ=='4' || area.typ=='9') { + /* box */ + p0.lat = pm.lat+area.dpos.lat; + p0.long0 = pm.long0-area.dpos.long0; + p1.lat = p0.lat; + p1.long0 = pm.long0+area.dpos.long0; + ret = maptool_mapxy(p0, &x0, &y00); + ret = maptool_mapxy(p1, &x1, &y1); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 200UL, 0.0f); + p0.lat = pm.lat-area.dpos.lat; + p0.long0 = pm.long0+area.dpos.long0; + ret = maptool_mapxy(p0, &x0, &y00); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 200UL, 0.0f); + p1.lat = pm.lat-area.dpos.lat; + p1.long0 = pm.long0-area.dpos.long0; + ret = maptool_mapxy(p1, &x1, &y1); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 200UL, 0.0f); + p0.lat = pm.lat+area.dpos.lat; + p0.long0 = pm.long0-area.dpos.long0; + ret = maptool_mapxy(p0, &x0, &y00); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 200UL, 0.0f); + if (area.typ=='9') { + /* fill */ + p0.lat = pm.lat-area.dpos.lat; + p0.long0 = pm.long0-area.dpos.long0; + p1.lat = pm.lat+area.dpos.lat; + p1.long0 = pm.long0+area.dpos.long0; + ret = maptool_mapxy(p0, &x0, &y00); + ret = maptool_mapxy(p1, &x1, &y1); + xi0 = lim(x0, image->Len1-1); + xi1 = lim(x1, image->Len1-1); + yi0 = lim(y00, image->Len0-1); + yi1 = lim(y1, image->Len0-1); + while (yi0Adr[(i)*image->Len0+yi0], (int32_t)r, + (int32_t)g, (int32_t)b, 30L); + if (i==tmp) break; + } /* end for */ + ++yi0; + } + } + } + else if (area.typ=='3' || area.typ=='8') { + /* triangle */ + p0.lat = pm.lat+area.dpos.lat; + p0.long0 = pm.long0; + p1.lat = pm.lat-area.dpos.lat; + p1.long0 = pm.long0-area.dpos.long0; + ret = maptool_mapxy(p0, &x0, &y00); + ret = maptool_mapxy(p1, &x1, &y1); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 200UL, 0.0f); + p1.long0 = pm.long0+area.dpos.long0; + ret = maptool_mapxy(p1, &x1, &y1); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 200UL, 0.0f); + p0.lat = pm.lat-area.dpos.lat; + p0.long0 = pm.long0-area.dpos.long0; + ret = maptool_mapxy(p0, &x0, &y00); + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, (int32_t)g, + (int32_t)b, 200UL, 0.0f); + if (area.typ=='8') { + /* fill */ + p0.lat = pm.lat-area.dpos.lat; + p0.long0 = pm.long0-area.dpos.long0; + p1.lat = pm.lat+area.dpos.lat; + p1.long0 = pm.long0; + ret = maptool_mapxy(p0, &x0, &y00); + ret = maptool_mapxy(p1, &x1, &y1); + xhh = y1-y00; + if (xhh!=0.0f) { + yi0 = lim(y00, image->Len0-1); + yi1 = lim(y1, image->Len0-1); + xhh = X2C_DIVR(x1-x0,xhh); + while (yi0Len1-1); + i = lim(x1-xh, image->Len1-1); + if (i<=tmp) for (;; i++) { + addcol(&image->Adr[(i)*image->Len0+yi0], (int32_t)r, + (int32_t)g, (int32_t)b, 30L); + if (i==tmp) break; + } /* end for */ + ++yi0; + } + } + } + } + else if (((area.typ=='0' || area.typ=='2') || area.typ=='5') + || area.typ=='7') { + /* circle ellipse */ + p0.lat = pm.lat-area.dpos.lat; + p0.long0 = pm.long0-area.dpos.long0; + p1.lat = pm.lat+area.dpos.lat; + p1.long0 = pm.long0; + ret = maptool_mapxy(p0, &x0, &y00); + ret = maptool_mapxy(p1, &x1, &y1); + if (area.typ=='0' || area.typ=='5') x0 = x1-(y1-y00)*0.5f; + yi0 = lim(y00+0.5f, image->Len0-1); + yi1 = lim(y1+0.5f, image->Len0-1); + yh = (y1-y00)*0.5f; + xho = 0.0f; + fill = area.typ=='5' || area.typ=='7'; + if (yh!=0.0f && x0!=x1) { + while (yi0=1.0f; + xho = xh; + xm = lim(x1+0.5f, image->Len1-1); + xhh = 0.0f; + tmp = xm; + i = lim((x1-xh)+0.5f, image->Len1-1)+1UL; + if (i<=tmp) for (;; i++) { + arc(b, g, r, image, fill, xh, &y1, yh, &y00, yi0, &x0, &x1, i, + oct, &xhh); + if (i==tmp) break; + } /* end for */ + xhh = 0.0f; + tmp = xm+1UL; + i = lim(x1+xh+0.5f, image->Len1-1)-1UL; + if (i>=tmp) for (;; i--) { + arc(b, g, r, image, fill, xh, &y1, yh, &y00, yi0, &x0, &x1, i, + oct, &xhh); + if (i==tmp) break; + } /* end for */ + ++yi0; + } + } + } +} /* end drawareasym() */ + + +static void dashvec(maptool_pIMAGE image, float x0, float y00, + float x1, float y1, uint32_t r, uint32_t g, + uint32_t b, float double0, uint32_t len, + uint32_t wid) +{ + float dy; + float dx; + float l; + float m1; + float m0; + float k; + float y; + float x; + uint32_t d; + uint32_t i; + uint32_t tmp; + x = x1-x0; + y = y1-y00; + k = x*x+y*y; + if (k==0.0f) return; + k = osic_sqrt(k); + dx = X2C_DIVR(double0*y,k); + dy = -(X2C_DIVR(double0*x,k)); /* rotate vector 90 deg for double dash */ + l = (float)len; + if (k<100.0f) l = l*0.8f; + else if (k<50.0f) l = l*0.5f; + d = 1UL+(aprsdecode_trunc(X2C_DIVR(k,l))/2UL)*2UL; + k = X2C_DIVR(1.0f,(float)d); + tmp = d-1UL; + i = 0UL; + if (i<=tmp) for (tmp = (uint32_t)(tmp-i)/2UL;;) { + m0 = k*(float)i; + m1 = k*(float)(i+1UL); + maptool_vector(image, x0+x*m0, y00+y*m0, x0+x*m1, y00+y*m1, + (int32_t)r, (int32_t)g, (int32_t)b, wid, 0.0f); + if (double0!=0.0f) { + maptool_vector(image, x0+x*m0+dx, y00+y*m0+dy, x0+x*m1+dx, + y00+y*m1+dy, (int32_t)r, (int32_t)g, (int32_t)b, wid, + 0.0f); + } + if (!tmp) break; + --tmp; + i += 2UL; + } /* end for */ +} /* end dashvec() */ + + +static void policolor(uint32_t c, uint32_t bri, uint32_t * r, + uint32_t * g, uint32_t * b) +/* colour for poliline object */ +{ + c = c&3UL; + *r = 0UL; + *g = 0UL; + *b = 0UL; + switch (c) { + case 0UL: + *r = 255UL; + break; + case 1UL: + *r = 170UL; + *g = 180UL; + break; + case 2UL: + *g = 50UL; + *b = 400UL; + break; + case 3UL: + *g = 230UL; + break; + } /* end switch */ + *r = ( *r*bri)/64UL; + *g = ( *g*bri)/64UL; + *b = ( *b*bri)/64UL; +} /* end policolor() */ + +struct _2; + + +struct _2 { + int32_t xi; + int32_t yi; +}; + + +static void fillpoligon(maptool_pIMAGE image, struct aprspos_POSITION pm, + const struct aprsdecode_MULTILINE md, uint32_t bri) +{ + uint32_t hachuresize; + uint32_t nc; + uint32_t nv; + uint32_t j; + uint32_t i; + uint32_t bf; + uint32_t gf; + uint32_t rf; + int32_t miny; + int32_t maxy; + int32_t minx; + int32_t maxx; + int32_t x; + int32_t ret; + struct _2 vert[41]; + int32_t cross[41]; + struct aprspos_POSITION p; + float yr; + float xr; + char done; + struct _2 * anonym; + struct maptool_PIX * anonym0; + int32_t tmp; + if ((uint8_t)md.filltyp<'2' || (uint8_t)md.filltyp>'9') return; + i = (uint32_t)(uint8_t)md.filltyp-50UL; + if (i<4UL) { + hachuresize = 0UL; + bri = bri/6UL; + } + else { + hachuresize = 3UL; + bri = bri/2UL; + } + policolor(i, bri, &rf, &gf, &bf); + maxx = X2C_min_longint; + maxy = X2C_min_longint; + minx = X2C_max_longint; + miny = X2C_max_longint; + nv = md.size+1UL; /* always a poligon */ + if (nv<4UL || nv>40UL) return; + i = 0UL; + while (ixi = (int32_t)X2C_TRUNCI(xr,X2C_min_longint, + X2C_max_longint); + anonym->yi = (int32_t)X2C_TRUNCI(yr,X2C_min_longint, + X2C_max_longint); + if (anonym->xi>maxx) maxx = anonym->xi; + if (anonym->xixi; + if (anonym->yi>maxy) maxy = anonym->yi; + if (anonym->yiyi; + } + ++i; + } + if (miny<0L) miny = 0L; + if (maxy>(int32_t)(image->Len0-1)) maxy = (int32_t)(image->Len0-1); + if (minx<0L) minx = 0L; + if (maxx>(int32_t)(image->Len1-1)) maxx = (int32_t)(image->Len1-1); + if (hachuresize>0UL) { + /* modify hachure with image size */ + x = ((maxx-minx)+maxy)-miny; + if (x>0L) { + hachuresize += aprsdecode_trunc(0.35f*osic_sqrt((float)x)); + } + } + while (maxy>miny) { + nc = 0UL; + i = 0UL; + while (imaxy!=vert[i+1UL].yi>maxy) { + /* vector crosses scanline */ + x = vert[i].xi+(int32_t)X2C_TRUNCI(X2C_DIVR((float) + (vert[i+1UL].xi-vert[i].xi)*(float)(vert[i].yi-maxy), + (float)(vert[i].yi-vert[i+1UL].yi)),X2C_min_longint, + X2C_max_longint); + if (xmaxx) x = maxx; + cross[nc] = x; + ++nc; + } + ++i; + } + if (nc>=2UL && !(nc&1)) { + /* should always be even */ + do { + /* sort crossings from left to right */ + i = 0UL; + done = 1; + while (icross[i+1UL]) { + x = cross[i]; + cross[i] = cross[i+1UL]; + cross[i+1UL] = x; + done = 0; + } + ++i; + } + } while (!done); + /* done:=TRUE; */ + j = 1UL; + tmp = cross[nc-1UL]; + x = cross[0U]; + if (x<=tmp) for (;; x++) { + while (x==cross[j]) { + done = !done; + ++j; + } + if (done && (hachuresize==0UL || (uint32_t)(maxy+x) + %hachuresize==0UL)) { + { /* with */ + struct maptool_PIX * anonym0 = &image->Adr[(x) + *image->Len0+maxy]; + anonym0->r += (uint16_t)rf; + anonym0->g += (uint16_t)gf; + anonym0->b += (uint16_t)bf; + } + } + if (x==tmp) break; + } /* end for */ + } + --maxy; + } +} /* end fillpoligon() */ + + +extern void maptool_drawpoligon(maptool_pIMAGE image, + struct aprspos_POSITION pm, struct aprsdecode_MULTILINE md, + char tab, char sym, uint32_t bri) +{ + int32_t ret; + struct aprspos_POSITION p; + float y1; + float x1; + float y00; + float x0; + uint32_t j; + uint32_t i; + uint32_t sz; + uint32_t widt; + uint32_t col0; + uint32_t b; + uint32_t g; + uint32_t r; + if ((uint8_t)md.linetyp<'a' || md.size<=1UL) return; + col0 = (uint32_t)(uint8_t)md.linetyp-97UL; + policolor(col0/3UL&3UL, bri, &r, &g, &b); + i = 0UL; + widt = 300UL; + if ((uint8_t)md.filltyp>'1') widt = 160UL; + sz = md.size+(uint32_t)(md.filltyp!='1'); /* closed poligon */ + while (i0UL) { + switch (col0%3UL) { + case 0UL: + maptool_vector(image, x0, y00, x1, y1, (int32_t)r, + (int32_t)g, (int32_t)b, widt, 0.0f); + break; + case 1UL: + dashvec(image, x0, y00, x1, y1, r, g, b, 0.0f, 8UL, widt); + break; + case 2UL: + dashvec(image, x0, y00, x1, y1, r, g, b, 2.5f, 6UL, 200UL); + break; + } /* end switch */ + } + x0 = x1; + y00 = y1; + ++i; + } + if (i>0UL && md.filltyp=='1') { + maptool_drawsym(image, tab, sym, 0, x0, y00, bri); + } + fillpoligon(image, pm, md, bri); +} /* end drawpoligon() */ + + +extern void maptool_drawpoliobj(maptool_pIMAGE image) +{ + char cs[251]; + struct aprsdecode_MULTILINE ml; + struct aprspos_POSITION center; + uint32_t i; + useri_confstr(useri_fRBPOS, cs, 251ul); + aprstext_deganytopos(cs, 251ul, ¢er); + if (!aprspos_posvalid(center)) return; + useri_confstr(useri_fRBCOMMENT, cs, 251ul); + aprsdecode_GetMultiline(cs, 251ul, &i, &ml); + useri_confstr(useri_fRBSYMB, cs, 251ul); + maptool_drawpoligon(image, center, ml, cs[0U], cs[1U], 250UL); +} /* end drawpoliobj() */ + + +extern char maptool_findmultiline(struct aprspos_POSITION pos, + struct aprspos_POSITION * foundpos) +{ + char cs[251]; + struct aprsdecode_MULTILINE ml; + struct aprspos_POSITION center; + uint32_t mini; + uint32_t i; + float d; + float mind; + useri_confstr(useri_fRBPOS, cs, 251ul); + aprstext_deganytopos(cs, 251ul, ¢er); + if (!aprspos_posvalid(center)) return 0; + useri_confstr(useri_fRBCOMMENT, cs, 251ul); + aprsdecode_GetMultiline(cs, 251ul, &i, &ml); + mind = X2C_max_real; + mini = ml.size; + i = 0UL; + while (ilat = ml.vec[mini].lat+center.lat; + foundpos->long0 = ml.vec[mini].long0+center.long0; + aprsdecode_click.polilinecursor = mini; + return 1; + } + return 0; +} /* end findmultiline() */ + +#define maptool_HY 18 + +#define maptool_MARGIN 2 + + +static void OptTextPlace(maptool_pIMAGE img, char s[], uint32_t s_len, + int32_t * xt, int32_t * yt) +{ + uint32_t cn; + uint32_t i; + /*max,*/ + int32_t fonty; + int32_t n; + int32_t ymin; + int32_t min0; + int32_t lb; + int32_t lg; + int32_t lr; + int32_t cont; + int32_t yh; + int32_t y; + int32_t x; + int32_t wid; + int32_t ct[54]; + struct maptool_PIX * anonym; + int32_t tmp; + int32_t tmp0; + X2C_PCOPY((void **)&s,s_len); + fonty = (int32_t)(aprsdecode_lums.fontysize-3UL); + if (((*xt<0L || *xt>=(int32_t)(img->Len1-1)) || *yt<-fonty) + || *yt>=(int32_t)(img->Len0-1)+fonty) goto label; + i = 0UL; + wid = 0L; + while (i<=s_len-1 && s[i]) { + if ((uint8_t)s[i]>=' ') { + cn = (uint32_t)(uint8_t)s[i]-32UL; + if (cn>96UL) cn = 0UL; + wid += (int32_t)font[cn].width; + } + ++i; + } + min0 = X2C_max_longint; + n = 0L; + tmp = 3L*fonty-1L; + y = 0L; + if (y<=tmp) for (;; y++) { + yh = (*yt+y)-fonty; + if (yh>=2L && yh<(int32_t)((img->Len0-1)+1UL)-2L) { + /* never place text outside drawable */ + cont = 0L; + lr = 0L; + lg = 0L; + lb = 0L; + tmp0 = (*xt+wid)-1L; + x = *xt; + if (x<=tmp0) for (;; x++) { + if (x<(int32_t)((img->Len1-1)-1UL)) { + { /* with */ + struct maptool_PIX * anonym = &img->Adr[(x)*img->Len0+yh]; + cont += labs((int32_t)anonym->r-lr)+labs((int32_t) + anonym->g-lg)+labs((int32_t)anonym->b-lb); + lr = (int32_t)anonym->r; + lg = (int32_t)anonym->g; + lb = (int32_t)anonym->b; + } + } + if (x==tmp0) break; + } /* end for */ + } + else cont = wid*32768L; + if (y=fonty*2L) cont = (cont*400L)/256L; + ct[y] = cont; + n += cont; + if (y>=fonty) { + n -= ct[y-fonty]; + if (n0UL) { + if (fixpos) yr = yr+(float)*pos; + else { + y = (int32_t)X2C_TRUNCI(yr,X2C_min_longint,X2C_max_longint); + x = (int32_t)X2C_TRUNCI(xr,X2C_min_longint,X2C_max_longint); + dy = y; + OptTextPlace(image, s, s_len, &x, &y); + y = (y/2L)*2L+1L; /* not odd lines for better 420 color conversion */ + *pos = (signed char)(y-dy); + xr = (float)x; + yr = (float)y; + } + } + i = 0UL; + while (i<=s_len-1 && s[i]) { + maptool_drawchar(image, s[i], xr, yr, &inc0, bri, contrast, col0, + dryrun); + xr = xr+(float)inc0; + /* xr:=xr + CHARWIDTH; */ + ++i; + } +} /* end drawstr() */ + + +extern void maptool_drawstri(maptool_pIMAGE image, char s[], + uint32_t s_len, int32_t xr, int32_t yr, uint32_t bri, + uint32_t contrast, struct aprsdecode_COLTYP col0, + char proportional, char dryrun) +{ + uint32_t i; + int32_t inc0; + char c; + i = 0UL; + for (;;) { + if (i>s_len-1) break; + c = s[i]; + if (c==0) break; + if ((uint8_t)c>=(uint8_t)'\360' && (uint8_t)c<=(uint8_t)'\370') + xr += (int32_t)((uint32_t)(uint8_t)c-239UL); + else { + maptool_drawchar(image, s[i], (float)xr, (float)yr, &inc0, + bri, contrast, col0, dryrun); + if (proportional) xr += inc0; + else xr += 6L; + } + ++i; + } +} /* end drawstri() */ + +#define maptool_L 7 + +#define maptool_WS 20 +/* wind fethers per kmh */ + +#define maptool_MAXWIND 250 +/* limit to nonsense windspeed */ + +#define maptool_LW 8 + +#define maptool_WW 4 + +#define maptool_A 0.12 + +#define maptool_W (-1.25) + + +extern void maptool_drawarrow(maptool_pIMAGE image, float x0, + float y00, float len, float ang, uint32_t wind, + uint32_t bri, struct aprsdecode_COLTYP col0) +{ + int32_t wi; + int32_t b; + int32_t g; + int32_t r; + float c1; + float s1; + float l; + float c; + float s; + float y1; + float x1; + /*WrInt(wind, 10);WrStrLn("=w"); */ + s = osic_sin(ang); + c = osic_cos(ang); + r = (int32_t)((bri*col0.r)/256UL); + g = (int32_t)((bri*col0.g)/256UL); + b = (int32_t)((bri*col0.b)/256UL); + if (wind==0UL) { + maptool_vector(image, x0, y00, x0-(len-5.0f)*s, y00+(len-5.0f)*c, r, g, + b, 400UL, 0.0f); + x1 = x0-len*s; + y1 = y00+len*c; + l = len-7.0f; + maptool_vector(image, x1, y1, x0-l*osic_sin(ang+0.12f), + y00+l*osic_cos(ang+0.12f), r, g, b, 200UL, 0.0f); + maptool_vector(image, x1, y1, x0-l*osic_sin(ang-0.12f), + y00+l*osic_cos(ang-0.12f), r, g, b, 200UL, 0.0f); + } + else { + len = len+(float)((4UL*wind)/20UL); + maptool_vector(image, x0, y00, x0-len*s, y00+len*c, r, g, b, 250UL, + 0.0f); + s1 = osic_sin(ang+(-1.25f)); + c1 = osic_cos(ang+(-1.25f)); + wi = (int32_t)wind; + if (wi<20L) wi = 20L; + else if (wi>250L) wi = 250L; + do { + x1 = x0-len*s; /*-s1*/ + y1 = y00+len*c; /*+c1*/ + l = 8.0f; + if (wi<20L) l = X2C_DIVR(8.0f*(float)wi,20.0f); + maptool_vector(image, x1, y1, x1-l*s1, y1+l*c1, r, g, b, 250UL, + 0.0f); + wi -= 20L; + len = len-4.0f; + } while (wi>0L); + } +} /* end drawarrow() */ + + +extern void maptool_cc(maptool_pIMAGE img, uint32_t from, uint32_t to) +{ + struct aprsdecode_COLTYP col0; + char h[1024]; + char s[1024]; + signed char pos; + aprsdecode_click.ops = 0; + if (aprsdecode_lums.map>0L) { + strncpy(s,"Maps:(c)www.openstreetmap.org",1024u); + } + else s[0] = 0; + if (img->Len1-1>=399UL || aprsdecode_lums.map==0L) { + /* Append(s, " Time:"); */ + aprsstr_Append(s, 1024ul, " ", 2ul); + aprstext_DateLocToStr(from, h, 1024ul); + aprsstr_Append(s, 1024ul, h, 1024ul); + if (to) { + aprsstr_Append(s, 1024ul, "-", 2ul); + aprsstr_TimeToStr((to+useri_localtime())%86400UL, h, 1024ul); + aprsstr_Append(s, 1024ul, h, 1024ul); + } + } + maptool_Colset(&col0, 'G'); + aprsstr_Append(s, 1024ul, " Zoom:", 7ul); + aprsstr_FixToStr(((float)aprsdecode_initzoom-0.995f) + +aprsdecode_finezoom, 3UL, h, 1024ul); + aprsstr_Append(s, 1024ul, h, 1024ul); + maptool_drawstr(img, s, 1024ul, 5.0f, + (float)(((img->Len0-1)-aprsdecode_lums.fontysize)-30UL), + 300UL, 0UL, col0, &pos, 3UL, 0, aprsdecode_click.dryrun); +} /* end cc() */ + +#define maptool_RULERY 10 + +#define maptool_RULERX0 20 + +#define maptool_RULERX1 300 + + +extern void maptool_ruler(maptool_pIMAGE img) +{ + struct aprspos_POSITION rpos; + struct aprspos_POSITION lpos; + char s[101]; + char h[101]; + float e; + float d; + float r; + uint32_t w; + uint32_t m; + signed char pos; + struct aprsdecode_COLTYP col0; + if (300L>maptool_xsize || aprsdecode_initzoom<6L) return; + maptool_xytodeg(20.0f, 10.0f, &lpos); + maptool_xytodeg(300.0f, 10.0f, &rpos); + d = 1000.0f*aprspos_distance(lpos, rpos); + if (d==0.0f) return; + r = d; + m = 1UL; + while (r>=10.0f) { + r = r*0.1f; + m = m*10UL; + } + e = r; + if (r>=5.0f) r = 5.0f; + else if (r>=2.0f) r = 2.0f; + else r = 1.0f; + e = (X2C_DIVR(r,e))*280.0f; + maptool_vector(img, 20.0f, 10.0f, 20.0f+e, 10.0f, 0L, 120L, 100L, 200UL, + 0.0f); + maptool_vector(img, 20.0f, 7.0f, 20.0f, 13.0f, 0L, 120L, 100L, 200UL, + 0.0f); + maptool_vector(img, 20.0f+e, 7.0f, 20.0f+e, 13.0f, 0L, 120L, 100L, 200UL, + 0.0f); + m = m*aprsdecode_trunc(r); + w = m; + if (w>=1000UL) w = w/1000UL; + aprsstr_IntToStr((int32_t)w, 1UL, h, 101ul); + if (m>=1000UL) aprsstr_Append(h, 101ul, "km", 3ul); + else aprsstr_Append(h, 101ul, "m", 2ul); + maptool_Colset(&col0, 'G'); + aprsstr_Append(h, 101ul, " [", 3ul); + aprsstr_FixToStr(((float)aprsdecode_initzoom-0.95f) + +aprsdecode_finezoom, 2UL, s, 101ul); + aprsstr_Append(h, 101ul, s, 101ul); + aprsstr_Append(h, 101ul, "]", 2ul); + maptool_drawstr(img, h, 101ul, (20.0f+e*0.5f)-21.0f, 10.0f, 250UL, 0UL, + col0, &pos, 0UL, 1, aprsdecode_click.dryrun); +} /* end ruler() */ + +#define maptool_VIS 80.0 + +#define maptool_PEAK 1000.0 + + +static int32_t smoo(float ex, int32_t x) +{ + if (x<=0L) return x; + else { + return (int32_t)aprsdecode_trunc(osic_exp(osic_ln(X2C_DIVR((float) + x,80.0f))*ex)*80.0f); + } + return 0; +} /* end smoo() */ + +/*BEGIN RETURN trunc(FLOAT(x)/FLOAT(max)*5000.0) END smoo; */ + +extern void maptool_shine(maptool_pIMAGE image, int32_t lum) +{ + int32_t max0; + int32_t y; + int32_t x; + uint32_t bb; + uint32_t gg; + uint32_t rr; + uint32_t c; + uint32_t f; + char done; + float ex; + struct maptool_PIX * anonym; + struct maptool_PIX * anonym0; + struct maptool_PIX * anonym1; + struct maptool_PIX * anonym2; + struct maptool_PIX * anonym3; + struct maptool_PIX * anonym4; + struct maptool_PIX * anonym5; + struct maptool_PIX * anonym6; + struct maptool_PIX * anonym7; + struct maptool_PIX * anonym8; + struct maptool_PIX * anonym9; + struct maptool_PIX * anonym10; + struct maptool_PIX * anonym11; + struct maptool_PIX * anonym12; + struct maptool_PIX * anonym13; + struct maptool_PIX * anonym14; + int32_t tmp; + int32_t tmp0; + max0 = (int32_t)(aprsdecode_trunc(80.0f)+1UL); + tmp = (int32_t)(image->Len0-1); + y = 0L; + if (y<=tmp) for (;; y++) { + tmp0 = (int32_t)(image->Len1-1); + x = 0L; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &image->Adr[(x)*image->Len0+y]; + if ((int32_t)anonym->g>max0) max0 = (int32_t)anonym->g; + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ + ex = X2C_DIVR(osic_ln(12.5f),osic_ln(X2C_DIVR((float)max0,80.0f))); + if (ex>1.5f) ex = 1.5f; + /*WrInt(max, 10);WrFixed(ex, 3,10);WrLn; */ + tmp = (int32_t)(image->Len0-1); + y = 0L; + if (y<=tmp) for (;; y++) { + tmp0 = (int32_t)(image->Len1-1); + x = 0L; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym0 = &image->Adr[(x)*image->Len0+y]; + anonym0->r = (uint16_t)smoo(ex, (int32_t)anonym0->r); + anonym0->g = (uint16_t)smoo(ex, (int32_t)anonym0->g); + anonym0->b = (uint16_t)smoo(ex, (int32_t)anonym0->b); + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ + do { + done = 1; + tmp = (int32_t)((image->Len0-1)-2UL); + y = 2L; + if (y<=tmp) for (;; y++) { + tmp0 = (int32_t)((image->Len1-1)-2UL); + x = 2L; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym1 = &image->Adr[(x)*image->Len0+y]; + + c = (uint32_t)(anonym1->r/2U); + if ((uint32_t)anonym1->g>c) c = (uint32_t)anonym1->g; + if ((uint32_t)anonym1->b>c) c = (uint32_t)anonym1->b; + if (c>=256UL) { + rr = 0UL; + gg = 0UL; + bb = 0UL; + f = 65535UL/c; + c = ((uint32_t)anonym1->r*f)/256UL; + if ((uint32_t)anonym1->r>c) { + rr = ((uint32_t)anonym1->r-c)/10UL; + } + anonym1->r = (uint16_t)c; + c = ((uint32_t)anonym1->g*f)/256UL; + if ((uint32_t)anonym1->g>c) { + gg = ((uint32_t)anonym1->g-c)/12UL; + } + anonym1->g = (uint16_t)c; + c = ((uint32_t)anonym1->b*f)/256UL; + if ((uint32_t)anonym1->b>c) { + bb = ((uint32_t)anonym1->b-c)/12UL; + } + anonym1->b = (uint16_t)c; + { /* with */ + struct maptool_PIX * anonym2 = &image->Adr[(x-1L) + *image->Len0+(y-1L)]; + anonym2->r += (uint16_t)rr; + anonym2->g += (uint16_t)gg; + anonym2->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym3 = &image->Adr[(x-1L) + *image->Len0+y]; + anonym3->r += (uint16_t)rr; + anonym3->g += (uint16_t)gg; + anonym3->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym4 = &image->Adr[(x-1L) + *image->Len0+(y+1L)]; + anonym4->r += (uint16_t)rr; + anonym4->g += (uint16_t)gg; + anonym4->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym5 = &image->Adr[(x+1L) + *image->Len0+(y-1L)]; + anonym5->r += (uint16_t)rr; + anonym5->g += (uint16_t)gg; + anonym5->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym6 = &image->Adr[(x+1L) + *image->Len0+y]; + anonym6->r += (uint16_t)rr; + anonym6->g += (uint16_t)gg; + anonym6->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym7 = &image->Adr[(x+1L) + *image->Len0+(y+1L)]; + anonym7->r += (uint16_t)rr; + anonym7->g += (uint16_t)gg; + anonym7->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym8 = &image->Adr[(x) + *image->Len0+(y+1L)]; + anonym8->r += (uint16_t)rr; + anonym8->g += (uint16_t)gg; + anonym8->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym9 = &image->Adr[(x) + *image->Len0+(y-1L)]; + anonym9->r += (uint16_t)rr; + anonym9->g += (uint16_t)gg; + anonym9->b += (uint16_t)bb; + } + { /* with */ + struct maptool_PIX * anonym10 = &image->Adr[(x-2L) + *image->Len0+y]; + anonym10->r += (uint16_t)(rr/2UL); + anonym10->g += (uint16_t)(gg/2UL); + anonym10->b += (uint16_t)(bb/2UL); + } + { /* with */ + struct maptool_PIX * anonym11 = &image->Adr[(x+2L) + *image->Len0+y]; + anonym11->r += (uint16_t)(rr/2UL); + anonym11->g += (uint16_t)(gg/2UL); + anonym11->b += (uint16_t)(bb/2UL); + } + { /* with */ + struct maptool_PIX * anonym12 = &image->Adr[(x) + *image->Len0+(y-2L)]; + anonym12->r += (uint16_t)(rr/2UL); + anonym12->g += (uint16_t)(gg/2UL); + anonym12->b += (uint16_t)(bb/2UL); + } + { /* with */ + struct maptool_PIX * anonym13 = &image->Adr[(x) + *image->Len0+(y+2L)]; + anonym13->r += (uint16_t)(rr/2UL); + anonym13->g += (uint16_t)(gg/2UL); + anonym13->b += (uint16_t)(bb/2UL); + } + done = 0; + } + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ + } while (!done); + tmp = (int32_t)(image->Len0-1); + y = 0L; + if (y<=tmp) for (;; y++) { + tmp0 = (int32_t)(image->Len1-1); + x = 0L; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym14 = &image->Adr[(x)*image->Len0+y]; + anonym14->r = (uint16_t)(((int32_t)anonym14->r*lum)/512L); + anonym14->g = (uint16_t)(((int32_t)anonym14->g*lum)/512L); + anonym14->b = (uint16_t)(((int32_t)anonym14->b*lum)/512L); + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ +} /* end shine() */ + + +extern void maptool_makebw(maptool_pIMAGE p) +{ + uint32_t w; + uint32_t y; + uint32_t x; + struct maptool_PIX * anonym; + uint32_t tmp; + uint32_t tmp0; + tmp = p->Len0-1; + y = 0UL; + if (y<=tmp) for (;; y++) { + tmp0 = p->Len1-1; + x = 0UL; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &p->Adr[(x)*p->Len0+y]; + w = ((uint32_t)anonym->r*340UL+(uint32_t) + anonym->g*550UL+(uint32_t)anonym->b*110UL)/1000UL; + anonym->r = (uint16_t)w; + anonym->g = (uint16_t)w; + anonym->b = (uint16_t)w; + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ +} /* end makebw() */ + +/* +PROCEDURE lim(n:CARDINAL):CARD16; +BEGIN IF n>MAX(CARD16) THEN RETURN MAX(CARD16) ELSE RETURN n END; END lim; +*/ + +static void addpix(struct maptool_PIX * s, struct maptool_PIX * a) +{ + /* + h:=s.r + a.r; IF h>MAX(CARD16) THEN s.r:=MAX(CARD16) ELSE s.r:=h END; + h:=s.g + a.g; IF h>MAX(CARD16) THEN s.g:=MAX(CARD16) ELSE s.g:=h END; + h:=s.b + a.b; IF h>MAX(CARD16) THEN s.b:=MAX(CARD16) ELSE s.b:=h END; + */ + s->r += a->r; + s->g += a->g; + s->b += a->b; +} /* end addpix() */ + + +extern void maptool_addmap(maptool_pIMAGE image, maptool_pIMAGE map) +{ + int32_t y; + int32_t x; + int32_t tmp; + int32_t tmp0; + tmp = (int32_t)(image->Len1-1); + x = 0L; + if (x<=tmp) for (;; x++) { + tmp0 = (int32_t)(image->Len0-1); + y = 0L; + if (y<=tmp0) for (;; y++) { + addpix(&image->Adr[(x)*image->Len0+y], &map->Adr[(x)*map->Len0+y]); + if (y==tmp0) break; + } /* end for */ + if (x==tmp) break; + } /* end for */ +/* + image^[x+xsize*y].r:=lim(map^[x+xsize*y].r + image^[x+xsize*y].r); + image^[x+xsize*y].g:=lim(map^[x+xsize*y].g + image^[x+xsize*y].g); + image^[x+xsize*y].b:=lim(map^[x+xsize*y].b + image^[x+xsize*y].b); +*/ +} /* end addmap() */ + +/* +PROCEDURE openppm(fn:ARRAY OF CHAR; verb:BOOLEAN):File; +VAR fd:File; + line:INTEGER; + ch, cho:CHAR; +BEGIN + cleanfilename(fn); + fd:=OpenRead(fn); + IF NOT FdValid(fd) THEN + IF verb THEN WrStr(fn); WrStrLn(" not found"); END; + RETURN InvalidFd; + END; + + line:=0; + cho:=0C; + LOOP + IF RdBin(fd, ch, 1)<>1 THEN + WrStr(fn); WrStrLn(" read error"); Close(fd); RETURN InvalidFd + END; + IF ch=LF THEN INC(line) END; + IF line=3 THEN EXIT END; + IF (ch="#") & (cho=LF) THEN DEC(line) END; + cho:=ch; + END; + RETURN fd +END openppm; +*/ + +static void mapname(int32_t x, int32_t y, int32_t zoom, char fn[], + uint32_t fn_len, char reqn[], uint32_t reqn_len) +{ + char hh[21]; + char path[1001]; + fn[0UL] = 0; + useri_confstr(useri_fOSMDIR, path, 1001ul); + aprsstr_Append(fn, fn_len, path, 1001ul); + aprsstr_Append(fn, fn_len, "/", 2ul); + aprsstr_Append(fn, fn_len, aprsdecode_lums.mapname, 41ul); + aprsstr_Append(fn, fn_len, "/", 2ul); + /*WrInt(zoom,6);WrInt(x,6);WrInt(y,6);WrStrLn(" zoom x y"); */ + aprsstr_IntToStr(zoom, 1UL, hh, 21ul); + aprsstr_Append(fn, fn_len, hh, 21ul); + aprsstr_Append(fn, fn_len, "/", 2ul); + /* Append(fn, hh); */ + reqn[0UL] = 0; + aprsstr_Append(reqn, reqn_len, aprsdecode_lums.mapname, 41ul); + aprsstr_Append(reqn, reqn_len, " ", 2ul); + aprsstr_Append(reqn, reqn_len, hh, 21ul); + aprsstr_Append(reqn, reqn_len, " ", 2ul); + /* + IntToStr(x, 1, hh); + + Append(fn,"-"); + Append(fn, hh); + Append(fn,"-"); + */ + aprsstr_IntToStr(x, 1UL, hh, 21ul); + aprsstr_Append(fn, fn_len, hh, 21ul); + aprsstr_Append(fn, fn_len, "/", 2ul); + aprsstr_Append(reqn, reqn_len, hh, 21ul); + aprsstr_Append(reqn, reqn_len, " ", 2ul); + aprsstr_IntToStr(y, 1UL, hh, 21ul); + aprsstr_Append(fn, fn_len, hh, 21ul); + /* Append(fn,".png"); */ + aprsstr_Append(reqn, reqn_len, hh, 21ul); + aprsstr_Append(reqn, reqn_len, "\012", 2ul); +} /* end mapname() */ + + +static uint32_t squaredelay(uint32_t c) +{ + uint32_t n; + n = 1UL; + while (c>0UL) { + n += n; + --c; + } + return n-1UL; +} /* end squaredelay() */ + + +static char decodetile(const char fn[], uint32_t fn_len, + pPNGBUF ppngbuf, int32_t maxx, int32_t maxy, + int32_t maxxbyte) +{ + char s[100]; + aprsstr_Assign(s, 100ul, fn, fn_len); + aprsstr_Append(s, 100ul, ".png", 5ul); + if (ppngbuf) { + if (readpng(s, (char * *)ppngbuf, &maxx, &maxy, + &maxxbyte)>=0L || readjpg(s, (char * *)ppngbuf, &maxx, + &maxy, &maxxbyte)>=0L) { + /* normal png in .png */ + return 1; + } + } + else if (osi_Exists(s, 100ul)) { + /* jpg hided in .png */ + return 1; + } + aprsstr_Assign(s, 100ul, fn, fn_len); + aprsstr_Append(s, 100ul, ".jpg", 5ul); + if (ppngbuf) { + return readjpg(s, (char * *)ppngbuf, &maxx, &maxy, &maxxbyte)>=0L; + + } + /* jpg in .jpg */ + return osi_Exists(s, 100ul); +} /* end decodetile() */ + +/* +PROCEDURE existsimg(fn-:ARRAY OF CHAR):BOOLEAN; +VAR s:ARRAY[0..99] OF CHAR; +BEGIN + Assign(s, fn); Append(s, PNGEXT); + IF Exists(s) THEN RETURN TRUE END; + Assign(s, fn); Append(s, JPGEXT); + RETURN Exists(s) +END existsimg; +*/ +#define maptool_MAPLOADPROGSTARTDELAY 10 + +#define maptool_MINSPACE 80 + + +static void reqmap(char wfn[], uint32_t wfn_len, char byop) +/* append filename of missing tiles to file, 0C is flush */ +{ + char h[1000]; + char s[1000]; + int32_t fd; + uint32_t lb; + X2C_PCOPY((void **)&wfn,wfn_len); + /*WrStr(">");WrStr(wfn); */ + if (!byop) mapdelay = 0UL; + if (mapnamesdone==1U) { + /* filled buffer written */ + mapnamesdone = 0U; + if (!osi_Exists("gettiles", 9ul)) { + /* a maploader is at work */ + if ((byop && wfn[0UL]) && aprsstr_InStr(mapnamesbuf, 4096ul, wfn, + wfn_len)>=0L) mapnamesdone = 2U; + else maploopcnt = 0UL; + } + mapnamesbuf[0U] = 0; + } + if (maploopcnt<5UL || mapnamesbuf[0U]==0) { + aprsstr_Append(mapnamesbuf, 4096ul, wfn, wfn_len); + /* store 1 line if looping */ + } + lb = aprsstr_Length(mapnamesbuf, 4096ul); + if (lb>0UL && (wfn[0UL]==0 || lb+80UL>=4096UL)) { + /* namebuffer full or flush */ + /*WrInt(maploopcnt, 10); WrInt(mapdelay, 10); + WrInt(realtime-lastmapreq, 10); WrInt(realtime, 15); + WrInt(lastmapreq, 15); WrStrLn(" delay"); */ + if (lastmapreq+mapdelay+squaredelay(maploopcnt)<=aprsdecode_realtime) { + if (mapnamesdone==2U) { + /* looping mapload */ + if (maploopcnt>=4UL) { + useri_textautosize(0L, 0L, 5UL, 10UL, 'e', "get no map from do\ +wnloader", 27ul); + } + if (maploopcnt<8UL) ++maploopcnt; + } + fd = osi_OpenWrite("gettiles", 9ul); + if (osic_FdValid(fd)) { + osi_WrBin(fd, (char *)mapnamesbuf, 4096u/1u, lb); + osic_Close(fd); + if (aprsdecode_verb) { + osi_WrStr("try:", 5ul); + osic_WrINT32(maploopcnt, 1UL); + osi_WrStrLn(" written gettiles:", 19ul); + osi_WrStr(mapnamesbuf, 4096ul); + } + lastmapreq = aprsdecode_realtime; + mapdelay = 0UL; + if (maploadstart+10ULaprsdecode_realtime) { + maploadstart = 0UL; /* if clock jumped back */ + } + } + else osi_WrStrLn("cannot write gettiles", 22ul); + } + else if (lastmapreq>aprsdecode_realtime) { + lastmapreq = aprsdecode_realtime; /* systime gone backward */ + } + mapnamesdone = 1U; + } + X2C_PFREE(wfn); +} /* end reqmap() */ + + +static void zoommap(float fzoom, maptool_pIMAGE map) +{ + int32_t yim; + int32_t yi; + int32_t mum; + int32_t mul; + int32_t bb; + int32_t gg; + int32_t rr; + int32_t y00; + int32_t y; + int32_t x; + float r; + uint32_t tr; + struct maptool_PIX * anonym; + struct maptool_PIX * anonym0; + struct maptool_PIX * anonym1; + struct maptool_PIX * anonym2; + struct maptool_PIX * anonym3; + struct maptool_PIX * anonym4; + int32_t tmp; + int32_t tmp0; + y00 = (int32_t)((map->Len0-1)+1UL)-(int32_t) + X2C_TRUNCI(X2C_DIVR((float)((map->Len0-1)+1UL),fzoom), + X2C_min_longint,X2C_max_longint); + for (x = (int32_t)(map->Len1-1); x>=0L; x--) { + r = X2C_DIVR((float)x,fzoom); + tr = aprsdecode_trunc(r); + mul = (int32_t)X2C_TRUNCI(256.0f*(r-(float)tr),X2C_min_longint, + X2C_max_longint); + mum = 256L-mul; + tmp = y00; + y = (int32_t)(map->Len0-1); + if (y>=tmp) for (;; y--) { + { /* with */ + struct maptool_PIX * anonym = &map->Adr[(tr+1UL)*map->Len0+y]; + rr = (int32_t)anonym->r*mul; + gg = (int32_t)anonym->g*mul; + bb = (int32_t)anonym->b*mul; + } + { /* with */ + struct maptool_PIX * anonym0 = &map->Adr[(tr)*map->Len0+y]; + rr += (int32_t)anonym0->r*mum; + gg += (int32_t)anonym0->g*mum; + bb += (int32_t)anonym0->b*mum; + } + { /* with */ + struct maptool_PIX * anonym1 = &map->Adr[(x)*map->Len0+y]; + anonym1->r = (uint16_t)(rr/256L); + anonym1->g = (uint16_t)(gg/256L); + anonym1->b = (uint16_t)(bb/256L); + } + if (y==tmp) break; + } /* end for */ + } /* end for */ + tmp = (int32_t)(map->Len0-1); + y = 0L; + if (y<=tmp) for (;; y++) { + r = X2C_DIVR((float)((int32_t)(map->Len0-1)-y),fzoom); + /* yi:=VAL(INTEGER,HIGH(map^[0]))-VAL(INTEGER, r); */ + /* tr:=TRUNC(r); */ + tr = aprsdecode_trunc(r); + yi = (int32_t)((map->Len0-1)-tr); + mul = (int32_t)X2C_TRUNCI(256.0f*(r-(float)tr),X2C_min_longint, + X2C_max_longint); + mum = 256L-mul; + if (yi>0L) yim = yi-1L; + else yim = 0L; + tmp0 = (int32_t)(map->Len1-1); + x = 0L; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym2 = &map->Adr[(x)*map->Len0+yim]; + rr = (int32_t)anonym2->r*mul; + gg = (int32_t)anonym2->g*mul; + bb = (int32_t)anonym2->b*mul; + } + { /* with */ + struct maptool_PIX * anonym3 = &map->Adr[(x)*map->Len0+yi]; + rr += (int32_t)anonym3->r*mum; + gg += (int32_t)anonym3->g*mum; + bb += (int32_t)anonym3->b*mum; + } + { /* with */ + struct maptool_PIX * anonym4 = &map->Adr[(x)*map->Len0+y]; + anonym4->r = (uint16_t)(rr/256L); + anonym4->g = (uint16_t)(gg/256L); + anonym4->b = (uint16_t)(bb/256L); + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ +} /* end zoommap() */ + + +static uint16_t col(int32_t c) +{ + c += aprsdecode_lums.maplumcorr; + if (c<0L) c = 0L; + return (uint16_t)(((uint32_t)c*(uint32_t)aprsdecode_lums.map)/256UL) + ; +/* + RETURN (c)*VAL(CARDINAL,lums.map) DIV 256; +*/ +} /* end col() */ + + +static char loadtile(maptool_pIMAGE map, char * done, + char dryrun, const char h[], uint32_t h_len, + const char wfn[], uint32_t wfn_len, int32_t dx, + int32_t dy, uint32_t doubx, uint32_t douby) +{ + int32_t iy; + int32_t ix; + int32_t yy; + int32_t xx; + int32_t y; + int32_t x; + struct maptool_PIX * anonym; + struct maptool_PIX * anonym0; + /* IF add THEN */ + int32_t tmp; + int32_t tmp0; + if (dryrun) { + if (decodetile(h, h_len, 0, 0L, 0L, 0L)) return 1; + else { + *done = 0; + return 0; + } + } + if (map==0) return 0; + if (aprsdecode_verb) { + osi_WrStr("open>", 6ul); + osi_WrStr(h, h_len); + osi_WrStrLn("<", 2ul); + } + if (!decodetile(h, h_len, (pPNGBUF)pngbuf, 256L, 256L, + 768L) || useri_reloadmap) { + if (wfn[0]) { + if ((useri_configon(useri_fGETMAPS) || maptool_mappack.run) + || useri_reloadmap) reqmap(wfn, wfn_len, !useri_reloadmap); + *done = 0; + } + tmp = (dy+256L)-1L; + y = dy; + if (y<=tmp) for (;; y++) { + tmp0 = (dx+256L)-1L; + x = dx; + if (x<=tmp0) for (;; x++) { + if (((x>=0L && x<(int32_t)((map->Len1-1)+1UL)) && y>=0L) + && y<(int32_t)((map->Len0-1)+1UL)) { + { /* with */ + struct maptool_PIX * anonym = &map->Adr[(x)*map->Len0+y]; + anonym->r = 100U; + anonym->g = 120U; + anonym->b = 100U; + } + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ + return 0; + } + if (doubx>0UL) { + /* use half zoom tile and double size */ + if (douby==1UL) { + yy = 0L; + y = 255L; + iy = -1L; + } + else { + yy = 128L; + y = 0L; + iy = 1L; + } + do { + if (doubx==1UL) { + xx = 0L; + x = 255L; + ix = -1L; + } + else { + xx = 128L; + x = 0L; + ix = 1L; + } + do { + pngbuf[y][x] = pngbuf[yy+y/2L][xx+x/2L]; + x += ix; + } while (!(x<0L || x>255L)); + y += iy; + } while (!(y<0L || y>255L)); + } + for (y = 0L; y<=255L; y++) { + yy = (255L-y)+dy; + for (x = 0L; x<=255L; x++) { + xx = x+dx; + if (((xx>=0L && xx<(int32_t)((map->Len1-1)+1UL)) && yy>=0L) + && yy<(int32_t)((map->Len0-1)+1UL)) { + { /* with */ + struct maptool_PIX * anonym0 = &map->Adr[(xx)*map->Len0+yy]; + /* INC(r, col(pngbuf[y]^[x].r8)); */ + /* INC(g, col(pngbuf[y]^[x].g8)); */ + /* INC(b, col(pngbuf[y]^[x].b8)); */ + /* ELSE */ + anonym0->r = col((int32_t)pngbuf[y][x].r8); + anonym0->g = col((int32_t)pngbuf[y][x].g8); + anonym0->b = col((int32_t)pngbuf[y][x].b8); + } + } + } /* end for */ + } /* end for */ + /* END; */ + return 1; +} /* end loadtile() */ + + +extern void maptool_loadmap(maptool_pIMAGE map, int32_t tx, int32_t ty, + int32_t zoom, float fzoom, float shftx, + float shfty, char * done, char * blown, + char blow, char dryrun) +{ + int32_t yh; + int32_t xh; + int32_t dy; + int32_t dx; + int32_t maxtil; + int32_t y; + int32_t x; + char wfn[4096]; + char fnn[4096]; + char ok0; + int32_t tmp; + int32_t tmp0; + *done = 1; + *blown = 0; + /* FILL(map, 0C, SIZE(PIX)*xsize*ysize); */ + maxtil = (int32_t)(aprsdecode_trunc(expzoom(zoom))-1UL); + yh = (int32_t)X2C_TRUNCI(X2C_DIVR((float)(map->Len0-1),fzoom)+shfty, + X2C_min_longint,X2C_max_longint)/256L; + xh = (int32_t)X2C_TRUNCI(X2C_DIVR((float)(map->Len1-1),fzoom)+shftx, + X2C_min_longint,X2C_max_longint)/256L; + /* IF ((tx+1>=maxtil) OR (ty+1>=maxtil)) & NOT dryrun THEN clr(map) END; + */ + /* FOR y:=0 TO VAL(INTEGER, FLOAT(HIGH(map^[0]))/fzoom+shfty) DIV TILESIZE DO */ + /* FOR x:=0 TO VAL(INTEGER, + FLOAT(HIGH(map^))/fzoom+shftx) DIV TILESIZE DO */ + if ((tx+xh>maxtil || ty+yh>maxtil) && !dryrun) maptool_clr(map); + tmp = yh; + y = 0L; + if (y<=tmp) for (;; y++) { + tmp0 = xh; + x = 0L; + if (x<=tmp0) for (;; x++) { + if (tx+x<=maxtil && ty+y<=maxtil) { + mapname(tx+x, ty+y, zoom, fnn, 4096ul, wfn, 4096ul); + dx = x*256L-(int32_t)X2C_TRUNCI(shftx,X2C_min_longint, + X2C_max_longint); + dy = (((int32_t)((map->Len0-1)+1UL)-256L)-y*256L)+(int32_t) + X2C_TRUNCI(shfty,X2C_min_longint,X2C_max_longint); + if (((!loadtile(map, done, dryrun, fnn, 4096ul, wfn, 4096ul, dx, + dy, 0UL, 0UL) && zoom>4L) && !dryrun) && blow) { + mapname((tx+x)/2L, (ty+y)/2L, zoom-1L, fnn, 4096ul, wfn, + 4096ul); + ok0 = loadtile(map, done, dryrun, fnn, 4096ul, "", 1ul, dx, + dy, (uint32_t)((tx+x&1L)+1L), (uint32_t)((ty+y&1L)+1L)); + if (ok0) *blown = 1; + } + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ + if (!dryrun) { + if (fzoom>1.0f) zoommap(fzoom, map); + if (mapnamesbuf[0U]) reqmap("", 1ul, !useri_reloadmap); + else osi_Erase("gettiles", 9ul, &ok0); + } + useri_reloadmap = 0; +} /* end loadmap() */ + + +extern char maptool_IsMapLoaded(void) +{ + return !aprsdecode_maploadpid.runs || !osi_Exists("gettiles", 9ul); +} /* end IsMapLoaded() */ + + +static void margin(int32_t * ty1, int32_t * tx1, int32_t * ty0, + int32_t * tx0, int32_t * z) +{ + int32_t maxtil; + float py; + float px; + struct maptool__D0 * anonym; + { /* with */ + struct maptool__D0 * anonym = &maptool_mappack; + maptool_mercator(anonym->leftup.long0, anonym->leftup.lat, *z, tx0, + ty0, &px, &py); + maptool_mercator(anonym->rightdown.long0, anonym->rightdown.lat, *z, + tx1, ty1, &px, &py); + maxtil = (int32_t)(aprsdecode_trunc(expzoom(*z))-1UL); + if (*tx0>maxtil) *tx0 = maxtil; + if (*tx1>maxtil) *tx1 = maxtil; + if (*ty0>maxtil) *ty0 = maxtil; + if (*ty1>maxtil) *ty1 = maxtil; + } +} /* end margin() */ + + +static char inc(int32_t * x, int32_t * y, int32_t * z) +{ + int32_t ty1; + int32_t ty0; + int32_t tx1; + int32_t tx0; + if (*z==0L) { + *z = 1L; + margin(&ty1, &tx1, &ty0, &tx0, z); + *x = tx0; + *y = ty0; + } + else { + margin(&ty1, &tx1, &ty0, &tx0, z); + ++*x; + if (*x>tx1) { + *x = tx0; + ++*y; + if (*y>ty1) { + ++*z; + if (*z>maptool_mappack.tozoom) return 0; + margin(&ty1, &tx1, &ty0, &tx0, z); + *x = tx0; + *y = ty0; + } + } + } + return 1; +} /* end inc() */ + + +static char checktile(char fn[], uint32_t fn_len) +{ + char checktile_ret; + X2C_PCOPY((void **)&fn,fn_len); + checktile_ret = decodetile(fn, fn_len, (pPNGBUF)pngbuf, 256L, 256L, 768L); + + X2C_PFREE(fn); + return checktile_ret; +} /* end checktile() */ + +#define maptool_MAXREQ 10 + +#define maptool_MAXRETRYS 10 + + +extern void maptool_MapPackageJob(char dryrun) +{ + int32_t z; + int32_t y; + int32_t x; + char rfn[4096]; + char fn[4096]; + char s1[100]; + char s[100]; + uint32_t mapc; + uint32_t rcnt; + uint32_t startt; + char done; + struct maptool__D0 * anonym; + { /* with */ + struct maptool__D0 * anonym = &maptool_mappack; + if (dryrun) { + mapc = 0UL; + do { + ++mapc; + } while (inc(&anonym->tx, &anonym->ty, &anonym->zoom)); + anonym->zoom = 0L; /* reinit counters */ + startt = osic_time(); + aprsdecode_click.chkmaps = 1; + do { + if (anonym->zoom>0L) { + /* zoom 0 is init */ + mapname(anonym->tx, anonym->ty, anonym->zoom, fn, 4096ul, rfn, + 4096ul); + if (!decodetile(fn, 4096ul, 0, 0L, 0L, 0L)) ++anonym->needcnt; + /* IF needcnt>MAXLOOKUP THEN overflow:=TRUE END; + (* to long calculation time *) */ + ++anonym->mapscnt; + } + done = !inc(&anonym->tx, &anonym->ty, &anonym->zoom); + if (done || (anonym->mapscnt&15UL)==15UL) { + strncpy(s,"Checked Maps:",100u); + aprsstr_IntToStr((int32_t)anonym->mapscnt, 0UL, s1, 100ul); + aprsstr_Append(s, 100ul, s1, 100ul); + aprsstr_Append(s, 100ul, " missing:", 11ul); + aprsstr_IntToStr((int32_t)anonym->needcnt, 0UL, s1, 100ul); + aprsstr_Append(s, 100ul, s1, 100ul); + progress(startt, s, 100ul, (100UL*anonym->mapscnt)/mapc, + done); + } + } while (!(done || !aprsdecode_click.chkmaps)); + if (!aprsdecode_click.chkmaps) maptool_mappack.needcnt = 0UL; + return; + } + if (!anonym->run) return; + if (anonym->delay+1ULretrys*anonym->retrys) { + ++anonym->delay; /* increasing delay */ + return; + } + anonym->delay = 0UL; + if (maptool_IsMapLoaded()) { + /* check what have */ + /*WrStrLn("gettiles deleted"); */ + for (;;) { + if (anonym->zoom>0L) { + /* zoom 0 is init */ + mapname(anonym->tx, anonym->ty, anonym->zoom, fn, 4096ul, rfn, + 4096ul); + if (!checktile(fn, 4096ul)) { + if (anonym->retrys<10UL) break; + ++anonym->givups; + } + ++anonym->donecnt; + anonym->retrys = 0UL; + } + if (!inc(&anonym->tx, &anonym->ty, &anonym->zoom)) { + anonym->run = 0; + useri_downloadprogress(); /* say end of job */ + return; + } + } + /* all done */ + useri_downloadprogress(); + rcnt = 0UL; + x = anonym->tx; + y = anonym->ty; + z = anonym->zoom; + do { + mapname(x, y, z, fn, 4096ul, rfn, 4096ul); + if (!checktile(fn, 4096ul)) { + reqmap(rfn, 4096ul, 0); + ++rcnt; + } + } while (!(!inc(&x, &y, &z) || rcnt>=10UL)); + /* last map */ + reqmap("", 1ul, 0); /* flush request buffer */ + if (anonym->retrys>0UL) ++anonym->retrysum; + ++anonym->retrys; + } + } +} /* end MapPackageJob() */ + + +extern void maptool_StartMapPackage(struct aprspos_POSITION lu, + struct aprspos_POSITION rd, int32_t tillzoom, + char dryrun) +{ + struct maptool__D0 * anonym; + memset((char *) &maptool_mappack,(char)0, + sizeof(struct maptool__D0)); + { /* with */ + struct maptool__D0 * anonym = &maptool_mappack; + anonym->leftup = lu; + anonym->rightdown = rd; + anonym->tozoom = tillzoom; + anonym->run = !dryrun; + } + if (dryrun) maptool_MapPackageJob(1); +} /* end StartMapPackage() */ + +typedef struct PIX8 * pROWS1; + + +static void loadsym(char h[], uint32_t h_len) +{ + uint32_t y; + uint32_t x; + pROWS1 rows[16]; + int32_t res; + int32_t maxxbyte; + int32_t maxy; + int32_t maxx; + char bu[16][9216]; + struct PIX8 * anonym; + X2C_PCOPY((void **)&h,h_len); + for (y = 0UL; y<=15UL; y++) { + rows[y] = (pROWS1) &bu[y][0U]; + } /* end for */ + maxx = 3072L; + maxy = 16L; + maxxbyte = maxx*3L; + res = readpng(h, (char * *)rows, &maxx, &maxy, &maxxbyte); + if (res<0L) { + osi_WrStr(h, h_len); + osi_WrStrLn(" file read error ", 18ul); + osic_WrINT32((uint32_t)res, 1UL); + osi_WrStrLn("", 1ul); + goto label; + } + memset((char *)symbols,(char)0,sizeof(struct PIX8 [3072][17])); + for (y = 0UL; y<=15UL; y++) { + for (x = 0UL; x<=3071UL; x++) { + { /* with */ + struct PIX8 * anonym = &symbols[x][15UL-y]; + anonym->r8 = rows[y][x].r8; + anonym->g8 = rows[y][x].g8; + anonym->b8 = rows[y][x].b8; + } + } /* end for */ + } /* end for */ + label:; + X2C_PFREE(h); +} /* end loadsym() */ + + +static float sinc(float x, uint32_t w) +/* sin(x)/x with hann windown */ +{ + float win; + if ((float)fabs(x)<0.001f) return 1.0f; + win = X2C_DIVR(3.1415926535f*x,(float)w); + x = x*3.1415926535f; + return X2C_DIVR((X2C_DIVR(osic_sin(x),x))*osic_sin(win),win); +} /* end sinc() */ + +#define maptool_MAXY 24 +/* font image max y size */ + +#define maptool_MAXX 600 +/* font image max x size */ + +#define maptool_CHARX 6 +/* chars x size pixel */ + +#define maptool_MINWIDTH 3 + +#define maptool_GARBAGE 500 +/* sum of pixels outside y font image */ + +#define maptool_FIRLEN 3 + +typedef char * pROWS; + + +extern void maptool_loadfont(void) +{ + uint32_t higth; + uint32_t i; + uint32_t fonty; + uint32_t y1; + uint32_t y00; + uint32_t xshift; + uint32_t y; + uint32_t x; + uint32_t c; + uint16_t m; + int32_t res; + int32_t maxxbyte; + int32_t maxy; + int32_t maxx; + pROWS rows[24]; + char bu[24][600]; + uint32_t xhist[6]; + uint32_t yhist[24]; + float fir[31]; + float yr; + float sum; + uint32_t nin; + char fn[1025]; + struct _1 * anonym; + uint32_t tmp; + uint32_t tmp0; + higth = (uint32_t)useri_conf2int(useri_fFONTSIZE, 0UL, 7L, 18L, 10L); + memset((char *)font,(char)0,sizeof(struct _1 [97])); + for (y = 0UL; y<=23UL; y++) { + rows[y] = (pROWS) &bu[y][0U]; + } /* end for */ + maxx = 600L; + maxy = 24L; + maxxbyte = maxx; + strncpy(fn,"font.png",1025u); + res = readpng(fn, (char * *)rows, &maxx, &maxy, &maxxbyte); + if ((((res<0L || maxx<1L) || maxx>600L) || maxy<1L) || maxy>24L) { + osic_WrINT32((uint32_t)res, 1UL); + osi_WrStrLn(" fontfile read error", 21ul); + aprsdecode_lums.fontysize = higth+3UL; + return; + } + for (x = 0UL; x<=5UL; x++) { + xhist[x] = 0UL; + } /* end for */ + for (y = 0UL; y<=23UL; y++) { + yhist[y] = 0UL; + } /* end for */ + tmp = (uint32_t)(maxx-1L); + x = 0UL; + if (x<=tmp) for (;; x++) { + /* make column histogram to find char position in font file */ + tmp0 = (uint32_t)(maxy-1L); + y = 0UL; + if (y<=tmp0) for (;; y++) { + xhist[x%6UL] += (uint32_t)(uint8_t)rows[y][x]; + yhist[y] += (uint32_t)(uint8_t)rows[y][x]; + if (y==tmp0) break; + } /* end for */ + if (x==tmp) break; + } /* end for */ + c = X2C_max_longcard; + for (x = 0UL; x<=5UL; x++) { + if (xhist[x]500UL) { + if (y00==0UL) y00 = y; + y1 = y; + } + } /* end for */ + if (y1MAXFONTY THEN + WrStrLn(" font too high"); + fonty:=MAXFONTY; + END; + */ + nin = (y1-y00)+1UL; + /*WrInt(y0, 10); WrInt(y1, 10); WrLn; */ + fonty = higth+3UL; + for (y = 0UL; y<=30UL; y++) { + fir[y] = 0.0f; + } /* end for */ + for (x = 0UL; x<=581UL; x++) { + tmp = nin-1UL; + y = 0UL; + if (y<=tmp) for (;; y++) { + fir[y+3UL] = (float)(uint32_t)(uint8_t)rows[y00+y][x+xshift]; + if (y==tmp) break; + } /* end for */ + /*FOR y:=0 TO HIGH(fir) DO WrInt(trunc(fir[y]), 8); END; WrLn; */ + tmp = higth-1UL; + y = 0UL; + if (y<=tmp) for (;; y++) { + if (higth!=nin) { + yr = X2C_DIVR((float)(y*nin),(float)higth); + sum = 0.0f; + for (i = 1UL; i<=6UL; i++) { + sum = sum+sinc(((float)i-3.0f)-(yr-(float) + aprsdecode_trunc(yr)), 3UL)*fir[i+aprsdecode_trunc(yr)]; + } /* end for */ + } + else sum = fir[y+3UL]; + if (sum<=0.0f) c = 0UL; + else if (sum>255.9f) c = 255UL; + else c = aprsdecode_trunc(sum); + font[x/6UL].char0[(fonty-y)-3UL][x%6UL] = (uint8_t)c; + if (y==tmp) break; + } /* end for */ + } /* end for */ + /* + FOR y:=0 TO fonty-3 DO + FOR x:=0 TO CHARS*CHARX-1 DO + WITH font[x DIV CHARX] DO char[fonty-y-3][x MOD 6]:=ORD(rows[y0+y] + ^[x+xshift]) END; + END; + END; + */ + aprsdecode_lums.fontysize = fonty; + for (c = 0UL; c<=96UL; c++) { + { /* with */ + struct _1 * anonym = &font[c]; + anonym->width = 3U; + tmp = fonty-3UL; + y = 0UL; + if (y<=tmp) for (;; y++) { + for (x = 0UL; x<=7UL; x++) { + if (anonym->char0[y][x]>=90U) { + /* 128 */ + if (c) { + m = X2C_LSH(0x1FU,16,(int32_t)x-1L)&0xFEU; + anonym->mask[y] = anonym->mask[y]|m; + if (y+1UL<=20UL) { + anonym->mask[y+1UL] = anonym->mask[y+1UL]|m; + } + if (y+2UL<=20UL) { + anonym->mask[y+2UL] = anonym->mask[y+2UL]|m; + } + } + if (x>(uint32_t)anonym->width) { + anonym->width = (uint8_t)x; + } + } + } /* end for */ + if (y==tmp) break; + } /* end for */ + } + } /* end for */ +} /* end loadfont() */ + +#define maptool_BMPHLEN 54 + + +static void numh(char h[256], uint32_t n, uint32_t pos, + uint32_t size) +{ + uint32_t i; + uint32_t tmp; + tmp = size-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + h[pos+i] = (char)(n&255UL); + n = n/256UL; + if (i==tmp) break; + } /* end for */ +} /* end numh() */ + + +static void wr(int32_t fd, uint32_t * len, char b[32768], + uint16_t c) +{ + if (c<=1023U) b[*len] = gammatab[c]; + else b[*len] = '\377'; + ++*len; + if (*len>32767UL) { + osi_WrBin(fd, (char *)b, 32768u/1u, *len); + *len = 0UL; + } +} /* end wr() */ + + +static uint8_t pngc(uint16_t c) +{ + if (c<=1023U) return gammatab[c]; + else return 255U; + return 0; +} /* end pngc() */ + + +extern int32_t maptool_saveppm(char fn[], uint32_t fn_len, + maptool_pIMAGE image, int32_t xsize, int32_t ysize) +{ + int32_t fd; + char h[256]; + int32_t y; + int32_t x; + char b[32768]; + uint32_t len; + struct PNGPIXMAP pngimg; + int32_t ret; + struct maptool_PIX * anonym; + struct maptool_PIX * anonym0; + struct PNGPIXEL * anonym1; + struct maptool_PIX * anonym2; + int32_t tmp; + int32_t tmp0; + int32_t maptool_saveppm_ret; + X2C_PCOPY((void **)&fn,fn_len); + aprsstr_cleanfilename(fn, fn_len); + fd = osi_OpenWrite(fn, fn_len); + if (!osic_FdValid(fd)) { + /* WrStr(fn); WrStrLn(" not writeable"); */ + maptool_saveppm_ret = -1L; + goto label; + } + len = aprsstr_Length(fn, fn_len); /* check fn if ppm or bmp */ + if ((((len>=4UL && fn[len-4UL]=='.') && X2C_CAP(fn[len-3UL])=='B') + && X2C_CAP(fn[len-2UL])=='M') && X2C_CAP(fn[len-1UL])=='P') { + /* make BMP */ + memset((char *)h,(char)0,256UL); + h[0U] = 'B'; + h[1U] = 'M'; + numh(h, (uint32_t)(((xsize*3L+4L)/4L)*4L*ysize+54L), 2UL, 4UL); + /* file len pad lines to x4 byte */ + numh(h, 54UL, 10UL, 4UL); /* headerlen */ + numh(h, 40UL, 14UL, 4UL); /* DWORD biSize */ + numh(h, (uint32_t)xsize, 18UL, 4UL); /* LONG biWidth */ + numh(h, (uint32_t)ysize, 22UL, 4UL); /* LONG biHeight */ + numh(h, 1UL, 26UL, 2UL); /* WORD biPlanes */ + numh(h, 24UL, 28UL, 2UL); /* WORD biBitCount */ + numh(h, 0UL, 30UL, 4UL); /* DWORD biCompression */ + osi_WrBin(fd, (char *)h, 256u/1u, 54UL); + len = 0UL; + tmp = ysize-1L; + y = 0L; + if (y<=tmp) for (;; y++) { + tmp0 = xsize-1L; + x = 0L; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym = &image->Adr[(x)*image->Len0+y]; + wr(fd, &len, b, anonym->b); + wr(fd, &len, b, anonym->g); + wr(fd, &len, b, anonym->r); + } + if (x==tmp0) break; + } /* end for */ + while (len&3UL) wr(fd, &len, b, 0U); + if (y==tmp) break; + } /* end for */ + if (len>0UL) osi_WrBin(fd, (char *)b, 32768u/1u, len); + osic_Close(fd); + ret = 0L; + } + else if ((((len>=4UL && fn[len-4UL]=='.') && X2C_CAP(fn[len-3UL])=='P') + && X2C_CAP(fn[len-2UL])=='N') && X2C_CAP(fn[len-1UL])=='G') { + /* make PNG */ + ret = -1L; + osic_Close(fd); + osic_alloc((char * *) &pngimg.image, + (uint32_t)(xsize*ysize*3L)); + if (pngimg.image) { + tmp = ysize-1L; + y = 0L; + if (y<=tmp) for (;; y++) { + tmp0 = xsize-1L; + x = 0L; + if (x<=tmp0) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym0 = &image->Adr[(x) + *image->Len0+((ysize-1L)-y)]; + { /* with */ + struct PNGPIXEL * anonym1 = &pngimg.image[x+y*xsize]; + anonym1->red = pngc(anonym0->r); + anonym1->green = pngc(anonym0->g); + anonym1->blue = pngc(anonym0->b); + } + } + if (x==tmp0) break; + } /* end for */ + if (y==tmp) break; + } /* end for */ + pngimg.width = (uint32_t)xsize; + pngimg.height = (uint32_t)ysize; + ret = writepng(fn, &pngimg); + osic_free((char * *) &pngimg.image, + (uint32_t)(xsize*ysize*3L)); + } + else osi_WrStrLn("png write out of memory", 24ul); + } + else { + /* ppm header */ + strncpy(h,"P6\012",256u); + osi_WrBin(fd, (char *)h, 256u/1u, aprsstr_Length(h, 256ul)); + aprsstr_IntToStr(xsize, 1UL, h, 256ul); + osi_WrBin(fd, (char *)h, 256u/1u, aprsstr_Length(h, 256ul)); + strncpy(h," ",256u); + osi_WrBin(fd, (char *)h, 256u/1u, aprsstr_Length(h, 256ul)); + aprsstr_IntToStr(ysize, 1UL, h, 256ul); + osi_WrBin(fd, (char *)h, 256u/1u, aprsstr_Length(h, 256ul)); + strncpy(h,"\012255\012",256u); + osi_WrBin(fd, (char *)h, 256u/1u, aprsstr_Length(h, 256ul)); + len = 0UL; + for (y = ysize-1L; y>=0L; y--) { + tmp = xsize-1L; + x = 0L; + if (x<=tmp) for (;; x++) { + { /* with */ + struct maptool_PIX * anonym2 = &image->Adr[(x)*image->Len0+y]; + + wr(fd, &len, b, anonym2->r); + wr(fd, &len, b, anonym2->g); + wr(fd, &len, b, anonym2->b); + } + if (x==tmp) break; + } /* end for */ + } /* end for */ + if (len>0UL) osi_WrBin(fd, (char *)b, 32768u/1u, len); + osic_Close(fd); + ret = 0L; + } + maptool_saveppm_ret = ret; + label:; + X2C_PFREE(fn); + return maptool_saveppm_ret; +} /* end saveppm() */ + + +static void allocpngbuf(void) +{ + uint32_t i; + for (i = 0UL; i<=255UL; i++) { + osic_alloc((char **) &pngbuf[i], sizeof(ROWS0)); + useri_debugmem.req = sizeof(pROWS0); + useri_debugmem.screens += useri_debugmem.req; + if (pngbuf[i]==0) { + osi_WrStrLn("pngbuf out of memory", 21ul); + useri_wrheap(); + X2C_ABORT(); + } + } /* end for */ +} /* end allocpngbuf() */ + + +static char getch(char b[4096], int32_t fd, int32_t * len, + int32_t * p) +{ + if (*p>=*len) { + *len = osi_RdBin(fd, (char *)b, 4096u/1u, 4096UL); + if (*len<=0L) return 0; + *p = 0L; + } + ++*p; + return b[*p-1L]; +} /* end getch() */ + + +static int32_t getword(int32_t * p, int32_t * len, int32_t fd, + char b[4096], char s[], uint32_t s_len) +{ + uint32_t i; + i = 0UL; + for (;;) { + s[i] = getch(b, fd, len, p); + if (s[i]==0) return -1L; + if (s[i]=='\012') { + s[i] = 0; + return 0L; + } + if (s[i]==',') { + s[i] = 0; + return 1L; + } + if (i=' ') ++i; + } + return 0; +} /* end getword() */ + + +extern void maptool_rdmountains(char fn[], uint32_t fn_len, + char add) +/* import csv file with mountain name, pos, altitude */ +{ + int32_t r; + int32_t len; + int32_t p; + int32_t fd; + aprsdecode_pMOUNTAIN pm; + struct aprspos_POSITION pos; + float alt; + char b[4096]; + char s[1024]; + char name[100]; + char long0[100]; + char lat[100]; + char com[100]; + X2C_PCOPY((void **)&fn,fn_len); + if (!add) { + /* delete data */ + while (aprsdecode_mountains) { + pm = aprsdecode_mountains; + aprsdecode_mountains = pm->next; + osic_free((char * *) &pm, sizeof(struct aprsdecode_MOUNTAIN)); + useri_debugmem.srtm -= sizeof(struct aprsdecode_MOUNTAIN); + } + } + b[0U] = 0; + useri_confstr(useri_fOSMDIR, s, 1024ul); + aprsstr_Append(b, 4096ul, s, 1024ul); + aprsstr_Append(b, 4096ul, "/", 2ul); + aprsstr_Append(b, 4096ul, fn, fn_len); + fd = osi_OpenRead(b, 4096ul); + if (!osic_FdValid(fd)) goto label; + p = 0L; + len = 0L; + for (;;) { + r = getword(&p, &len, fd, b, com, 100ul); + if (r>0L) { + r = getword(&p, &len, fd, b, name, 100ul); + if (r>0L) { + r = getword(&p, &len, fd, b, s, 1024ul); + if (r>0L) { + r = getword(&p, &len, fd, b, lat, 100ul); + if (r>0L) { + r = getword(&p, &len, fd, b, long0, 100ul); + if (r>0L) { + r = getword(&p, &len, fd, b, s, 1024ul); + if (r<0L || !aprsstr_StrToFix(&alt, s, 1024ul)) { + alt = 0.0f; + } + while (r>0L) r = getword(&p, &len, fd, b, s, 1024ul); + } + } + } + } + } + if (r<0L) break; + if ((((com[0U]!='#' && name[0U]) && aprsstr_StrToFix(&pos.lat, lat, + 100ul)) && aprsstr_StrToFix(&pos.long0, long0, + 100ul)) && aprspos_posvalid(pos)) { + osic_alloc((char * *) &pm, sizeof(struct aprsdecode_MOUNTAIN)); + if (pm==0) break; + useri_debugmem.srtm += sizeof(struct aprsdecode_MOUNTAIN); + aprsstr_Assign(pm->name, 32ul, name, 100ul); + pm->pos.lat = pos.lat*1.7453292519444E-2f; + pm->pos.long0 = pos.long0*1.7453292519444E-2f; + if (alt<0.0f || alt>9999.0f) alt = 0.0f; + pm->alt = (short)aprsdecode_trunc(alt); + pm->next = aprsdecode_mountains; + aprsdecode_mountains = pm; + } + } + /*WrInt(pm^.alt, 10); WrStrLn(pm^.name); */ + osic_Close(fd); + label:; + X2C_PFREE(fn); +} /* end rdmountains() */ + + +extern void maptool_BEGIN(void) +{ + static int maptool_init = 0; + if (maptool_init) return; + maptool_init = 1; + if (sizeof(FN)!=1024) X2C_ASSERT(0); + aprstext_BEGIN(); + useri_BEGIN(); + xosi_BEGIN(); + osi_BEGIN(); + aprspos_BEGIN(); + aprsstr_BEGIN(); + aprsdecode_BEGIN(); + aprsdecode_maploadpid.runs = 0; + maploadstart = 0UL; + loadsym("symbols.png", 12ul); + /* loadfont; */ + makegammatab(); + allocpngbuf(); + mapnamesbuf[0U] = 0; + mapnamesdone = 0U; + maploopcnt = 0UL; + lastmapreq = 0UL; + mapdelay = 0UL; + lastpoinum = 0UL; + osic_alloc((char * *) &srtmmiss, 1UL); + /* make empty tile for fast nofile hint */ + initsrtm(); +} + diff --git a/src/maptool.h b/src/maptool.h new file mode 100644 index 0000000..19e5644 --- /dev/null +++ b/src/maptool.h @@ -0,0 +1,262 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef maptool_H_ +#define maptool_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef aprsdecode_H_ +#include "aprsdecode.h" +#endif + +/* aprs tracks on osm map by oe5dxl */ +#define maptool_WHITELEVEL 1024 + +#define maptool_TILESIZE 256 + +#define maptool_MAXLAT 1.484 + +#define maptool_MINZOOM 1 + +#define maptool_MAXZOOM 18 + +#define maptool_CHARWIDTH 6 + +#define maptool_MAXCHAR 129 +/* highest font chars */ + +#define maptool_SYMSIZE 16 + +struct maptool_PIX; + + +struct maptool_PIX { + uint16_t r; + uint16_t g; + uint16_t b; +}; + + +struct maptool_IMAGELINE { + struct maptool_PIX * Adr; + size_t Len0; +}; + + +struct maptool_IMAGE { + struct maptool_PIX * Adr; + size_t Len0; + size_t Size1; + size_t Len1; +}; + +typedef struct maptool_IMAGE * maptool_pIMAGE; + +struct maptool_PANOWIN; + + +struct maptool_PANOWIN { + char isicon; + char empty; + char hover; + char on; + char flatscreen; + struct aprspos_POSITION eye; + struct aprspos_POSITION horizon; + int32_t eyealt; + float angle; + float elevation; + float yzoom; + uint32_t actx; + int32_t hx; /* mouse pos on panwin and fullwin */ + int32_t hy; + int32_t mx; + int32_t my; + int32_t ximg; + int32_t yimg; + maptool_pIMAGE image; +}; + +extern int32_t maptool_xsize; + +extern int32_t maptool_ysize; + +extern float maptool_shiftx; + +extern float maptool_shifty; + +struct maptool__D0; + + +struct maptool__D0 { + struct aprspos_POSITION leftup; + struct aprspos_POSITION rightdown; + int32_t tozoom; + uint32_t retrys; + uint32_t givups; + uint32_t mapscnt; + uint32_t needcnt; + uint32_t donecnt; + uint32_t delay; + uint32_t retrysum; + int32_t zoom; + int32_t tx; + int32_t ty; + char run; +}; + +extern struct maptool__D0 maptool_mappack; + +extern void maptool_Colset(struct aprsdecode_COLTYP *, char); + +extern void maptool_waypoint(maptool_pIMAGE, float, float, float, + int32_t, int32_t, int32_t); + +extern void maptool_vector(maptool_pIMAGE, float, float, float, + float, int32_t, int32_t, int32_t, uint32_t, + float); + +extern void maptool_drawchar(maptool_pIMAGE, char, float, float, + int32_t *, uint32_t, uint32_t, + struct aprsdecode_COLTYP, char); + +extern void maptool_drawstr(maptool_pIMAGE, char [], uint32_t, + float, float, uint32_t, uint32_t, + struct aprsdecode_COLTYP, signed char *, uint32_t, + char, char); + +extern void maptool_drawstri(maptool_pIMAGE, char [], uint32_t, + int32_t, int32_t, uint32_t, uint32_t, + struct aprsdecode_COLTYP, char, char); + +extern void maptool_drawsym(maptool_pIMAGE, char, char, char, + float, float, uint32_t); + +extern void maptool_drawarrow(maptool_pIMAGE, float, float, float, + float, uint32_t, uint32_t, struct aprsdecode_COLTYP); + +extern void maptool_shine(maptool_pIMAGE, int32_t); + +extern void maptool_loadmap(maptool_pIMAGE, int32_t, int32_t, int32_t, + float, float, float, char *, char *, + char, char); + +extern char maptool_IsMapLoaded(void); + +extern void maptool_addmap(maptool_pIMAGE, maptool_pIMAGE); + +extern void maptool_mercator(float, float, int32_t, int32_t *, + int32_t *, float *, float *); + +extern int32_t maptool_mapxy(struct aprspos_POSITION, float *, + float *); + +extern void maptool_xytodeg(float, float, struct aprspos_POSITION *); + +extern int32_t maptool_saveppm(char [], uint32_t, maptool_pIMAGE, + int32_t, int32_t); + +extern void maptool_area(maptool_pIMAGE, int32_t, int32_t, int32_t, + int32_t, struct aprsdecode_COLTYP, char); + +extern void maptool_postoloc(char [], uint32_t, + struct aprspos_POSITION); + +extern void maptool_loctopos(struct aprspos_POSITION *, char [], + uint32_t); + +extern void maptool_shiftmap(int32_t, int32_t, int32_t, float, + struct aprspos_POSITION *); + +extern void maptool_center(int32_t, int32_t, float, + struct aprspos_POSITION, struct aprspos_POSITION *); + +extern void maptool_limpos(struct aprspos_POSITION *); + +extern void maptool_makebw(maptool_pIMAGE); + +extern float maptool_realzoom(int32_t, float); + +extern void maptool_setmark(maptool_pIMAGE, struct aprspos_POSITION, + char); + +extern void maptool_cc(maptool_pIMAGE, uint32_t, uint32_t); + +extern void maptool_ruler(maptool_pIMAGE); + +extern void maptool_clr(maptool_pIMAGE); + +extern void maptool_xytoloc(struct aprspos_POSITION, char [], + uint32_t); + +extern void maptool_POIname(struct aprspos_POSITION *, char [], + uint32_t); + +extern void maptool_POIfind(struct aprspos_POSITION *, char [], + uint32_t); + +extern uint32_t maptool_charwidth0(char); + +extern char maptool_vistime(uint32_t); + +extern void maptool_StartMapPackage(struct aprspos_POSITION, + struct aprspos_POSITION, int32_t, char); + +extern void maptool_MapPackageJob(char); + +extern void maptool_loadfont(void); + +extern void maptool_startmapdelay(void); + +extern void maptool_pullmap(int32_t, int32_t, char); + +extern int32_t maptool_geoprofile(maptool_pIMAGE, struct aprspos_POSITION, + struct aprspos_POSITION, float, char, int32_t, + int32_t, float *, float *, float *, float *, + float *); + +extern float maptool_getsrtm(struct aprspos_POSITION, uint32_t, + float *); + +extern void maptool_Radiorange(maptool_pIMAGE, struct aprspos_POSITION, + int32_t, int32_t, uint32_t, uint32_t, uint32_t, + char *); + +extern void maptool_Panorama(maptool_pIMAGE, struct maptool_PANOWIN, + char *); + +extern char maptool_SimpleRelief(maptool_pIMAGE); + +extern void maptool_findpanopos(struct maptool_PANOWIN, + struct aprspos_POSITION *, float *, int32_t *); + +extern void maptool_closesrtmfile(void); + +extern void maptool_rdmountains(char [], uint32_t, char); + +extern void maptool_drawareasym(maptool_pIMAGE, struct aprspos_POSITION, + struct aprsdecode_AREASYMB, uint32_t); + +extern void maptool_drawpoligon(maptool_pIMAGE, struct aprspos_POSITION, + struct aprsdecode_MULTILINE, char, char, uint32_t); + +extern void maptool_drawpoliobj(maptool_pIMAGE); + +extern char maptool_findmultiline(struct aprspos_POSITION, + struct aprspos_POSITION *); + + +extern void maptool_BEGIN(void); + + +#endif /* maptool_H_ */ diff --git a/src/mlib.h b/src/mlib.h new file mode 100644 index 0000000..8a945c7 --- /dev/null +++ b/src/mlib.h @@ -0,0 +1,337 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef mlib_H_ +#define mlib_H_ +#include "X2C.h" + +typedef unsigned char cc_t; + +typedef unsigned long speed_t; + +typedef unsigned long tcflag_t; + +struct termios; + + +struct termios { + unsigned long c_iflag; + unsigned long c_oflag; + unsigned long c_cflag; + unsigned long c_lflag; + unsigned char c_line; + unsigned char c_cc[32]; + unsigned long c_ispeed; + unsigned long c_ospeed; +}; + +typedef char * tExecArg[256]; + +#define NCCS 19 + +#define VINTR 0 + +#define VQUIT 1 + +#define VERASE 2 + +#define VKILL 3 + +#define VEOF 4 + +#define VTIME 5 + +#define VMIN 6 + +#define VSTART 8 + +#define VSTOP 9 + +#define VSUSP 10 + +#define VEOL 11 + +#define IGNLCR 384 + +#define B0 0 + +#define B50 1 + +#define B75 2 + +#define B110 3 + +#define B134 4 + +#define B150 5 + +#define B200 6 + +#define B300 7 + +#define B600 8 + +#define B1200 9 + +#define B1800 10 + +#define B2400 11 + +#define B4800 12 + +#define B9600 13 + +#define B19200 14 + +#define B38400 15 + +#define B57600 4097 + +#define B115200 4098 + +#define B230400 4099 + +#define B460800 4100 + +#define B500000 4101 + +#define B576000 4102 + +#define B921600 4103 + +#define B1000000 4104 + +#define B1152000 4105 + +#define B1500000 4106 + +#define B2000000 4107 + +#define B2500000 4108 + +#define B3000000 4109 + +#define B3500000 4110 + +#define B4000000 4111 + +#define CSIZE 48 + +#define CS5 0 + +#define CS6 16 + +#define CS7 32 + +#define CS8 48 + +#define CSTOPB 64 + +#define CREAD 128 + +#define PARENB 256 + +#define PARODD 512 + +#define HUPCL 1024 + +#define CLOCAL 2048 + +#define ISIG 1 + +#define ICANON 2 + +#define ECHO 8 + +#define ECHOE 16 + +#define ECHOK 32 + +#define ECHONL 64 + +#define NOFLASH 128 + +#define TOSTOP 256 + +#define IEXTEN 32768 + +#define TIOCNOTTY 0x5422 + +#define TIOCSCTTY 0x540E + +#define IGNBRK 1 + +#define BRKINT 2 + +#define IGNPAR 4 + +#define PARMRK 8 + +#define INPCK 16 + +#define ISTRIP 32 + +#define INLCR 64 + +#define IGNCR 128 + +#define ICRNL 256 + +#define IUCLC 512 + +#define IXON 1024 + +#define IXANY 2048 + +#define IXOFF 4096 + +#define IMAXBEL 8192 + +#define OPOST 1 + +#define OLCUC 2 + +#define ONLCR 4 + +#define OCRNL 8 + +#define ONOCR 16 + +#define ONLRET 32 + +#define OFILL 64 + +#define OFDEL 128 + +#define NLDLY 256 + +#define NL0 0 + +#define NL1 256 + +#define CRDLY 1536 + +#define CR0 0 + +#define CR1 512 + +#define CR2 1024 + +#define CR3 1536 + +#define TABDLY 6144 + +#define TAB0 0 + +#define TAB1 2048 + +#define TAB2 4096 + +#define TAB3 6144 + +#define XTABS 6144 + +#define BSDLY 8192 + +#define BS0 0 + +#define BS1 8192 + +#define VTDLY 16384 + +#define VT0 0 + +#define VT1 16384 + +#define FFDLY 32768 + +#define FF0 0 + +#define FF1 32768 + +#define CRTSCTS 0x080000000 + +#define TCOOFF 0 + +#define TCOON 1 + +#define TCIOFF 2 + +#define TCION 3 + +#define TCIFLUSH 0 + +#define TCOFLUSH 1 + +#define TCIOFLUSH 2 + +#define TCSANOW 0 + +#define TCSADRAIN 1 + +#define TCSAFLUSH 2 + +#define TIOCMBIS 0x5416 + +#define TIOCMBIC 0x5417 + +#define TIOCMSET 0x5418 + +#define TIOCMGET 0x5415 + +#define TIOCMIWAIT 0x545C + +#define TIOCM_LE 0x1 + +#define TIOCM_DTR 0x2 + +#define TIOCM_RTS 0x4 + +#define TIOCM_ST 0x8 + +#define TIOCM_SR 0x10 + +#define TIOCM_CTS 0x20 + +#define TIOCM_CAR 0x40 + +#define TIOCM_RNG 0x80 + +#define TIOCM_DSR 0x100 + +#define TIOCM_CD 64 + +#define TIOCM_RI 128 + +#define TIOCM_OUT1 0x2000 + +#define TIOCM_OUT2 0x4000 + +extern unsigned long cfgetispeed(struct termios *); + +extern unsigned long cfgetospeed(struct termios *); + +extern long cfsetispeed(struct termios *, unsigned long); + +extern long cfsetospeed(struct termios *, unsigned long); + +extern long tcdrain(long); + +extern long tcflow(long, long); + +extern long tcflush(long, long); + +extern long tcgetattr(long, struct termios *); + +extern long tcdsendbreak(long, long); + +extern long tcsetattr(long, long, struct termios *); + +extern long ioctl(long, long, X2C_ADDRESS); + + +#endif /* mlib_H_ */ diff --git a/src/navigation.c b/src/navigation.c new file mode 100644 index 0000000..54ece23 --- /dev/null +++ b/src/navigation.c @@ -0,0 +1,329 @@ +/** +\file navigation.c +\brief GNSS core 'c' function library: navigation functions. +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-23 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#include +#include "gnss_error.h" +#include "constants.h" +#include "geodesy.h" +#include "navigation.h" + +void NAVIGATION_ComputeDerivativesOf_Range_WithRespectTo_XYZ( + const double x, // User X coordinate WGS84 ECEF [m] + const double y, // User Y coordinate WGS84 ECEF [m] + const double z, // User Z coordinate WGS84 ECEF [m] + const double satX, // Satellite X coordinate WGS84 ECEF [m] + const double satY, // Satellite Y coordinate WGS84 ECEF [m] + const double satZ, // Satellite Z coordinate WGS84 ECEF [m] + double* dPdx, // Derivative of P wrt X [] + double* dPdy, // Derivative of P wrt Y [] + double* dPdz, // Derivative of P wrt Z [] + double* range ) // computed user to satellite range [m] +{ + double dx; + double dy; + double dz; + + dx = satX - x; + dy = satY - y; + dz = satZ - z; + + *range = sqrt( dx*dx + dy*dy + dz*dz ); + + // dPdx = d/dx( sqrt( (x_s-x)^2 + (y_s-y)^2 + (z_s-z)^2 ) = -dx/range + *dPdx = -dx / (*range); + *dPdy = -dy / (*range); + *dPdz = -dz / (*range); +} + + + + +void NAVIGATION_ComputeDerivativesOf_Range_WithRespectToLatitudeLongitudeHeight( + const double latitude, // User geodetic latitude [rad] + const double longitude, // User geodetic longtiude [rad] + const double height, // User geodetic height [m] + const double satX, // Satellite X coordinate WGS84 ECEF [m] + const double satY, // Satellite Y coordinate WGS84 ECEF [m] + const double satZ, // Satellite Z coordinate WGS84 ECEF [m] + double* dlat, // d(P)/d(lat) but not in units of [m/rad], [m/m] + double* dlon, // d(P)/d(lon) but not in units of [m/rad], [m/m] + double* dhgt, // d(P)/d(hgt) [m/m] + double* range ) // computed user to satellite range [m] +{ + double sinlat; + double coslat; + double sinlon; + double coslon; + double dx; + double dy; + double dz; + double x; // User X position WGS84 ECEF [m] + double y; // User Y position WGS84 ECEF [m] + double z; // User Z position WGS84 ECEF [m] + + sinlat = sin(latitude); + coslat = cos(latitude); + sinlon = sin(longitude); + coslon = cos(longitude); + + GEODESY_ConvertGeodeticCurvilinearToEarthFixedCartesianCoordinates( + GEODESY_REFERENCE_ELLIPSE_WGS84, + latitude, + longitude, + height, + &x, + &y, + &z ); + + dx = satX - x; + dy = satY - y; + dz = satZ - z; + + // d/dx(P) = d/dx( sqrt( (x_s-x)^2 + (y_s-y)^2 + (z_s-z)^2 ) = -dx/range + // likewise for d/dy, d/dz + dx *= -1.0; + dy *= -1.0; + dz *= -1.0; + + *range = sqrt( dx*dx + dy*dy + dz*dz ); + + /* + GEODESY_ComputePrimeVerticalRadiusOfCurvature( GEODESY_REFERENCE_ELLIPSE_WGS84, latitude, &N ); + GEODESY_ComputeMeridianRadiusOfCurvature( GEODESY_REFERENCE_ELLIPSE_WGS84, latitude, &M ); + + The derivatives of range with respect to lat and lon in [rad/m] + lead to numeric instabilities in matrix inversion. Values in [m/rad] are huge! + *dlat = (M + hgt) * ( -dx*sinlat*coslon - dy*sinlat*sinlon + dz*coslat ) / (*range); + *dlon = (N + hgt) * ( -dx*coslat*sinlon + dy*coslat*coslon ) / (*range); + to scale dlat into a change in [m/m] + *dlat /= (M + hgt) + to scale dlon into a change in [m/m] + *dlon /= (N + hgt)*coslat + + This is effectively the same as rotating the derivatives with repect to xyz to the local frame + This method requires a good approximation for the initial position when using this parametrization. + */ + + *dlat = ( -dx*sinlat*coslon - dy*sinlat*sinlon + dz*coslat ) / (*range); + *dlon = ( -dx*sinlon + dy*coslon ) / (*range); + *dhgt = ( dx*coslat*coslon + dy*coslat*sinlon + dz*sinlat ) / (*range); +} + + + + + + + +int NAVIGATION_PerformClosedFormPositionSolution_FromPseuodrangeMeasurements( + double p1, //!< 1st raw pseudorange measurement [m] + double p2, //!< 2nd raw pseudorange measurement [m] + double p3, //!< 3rd raw pseudorange measurement [m] + double p4, //!< 4th raw pseudorange measurement [m] + double prc_satclk1, //!< 1st satellite clock corrections for psuedoranges [m] + double prc_satclk2, //!< 2nd satellite clock corrections for psuedoranges [m] + double prc_satclk3, //!< 3rd satellite clock corrections for psuedoranges [m] + double prc_satclk4, //!< 4th satellite clock corrections for psuedoranges [m] + double x1, //!< 1st satellite X coordinates, WGS84 ECEF [m] + double x2, //!< 2nd satellite X coordinates, WGS84 ECEF [m] + double x3, //!< 3rd satellite X coordinates, WGS84 ECEF [m] + double x4, //!< 4th satellite X coordinates, WGS84 ECEF [m] + double y1, //!< 1st satellite Y coordinates, WGS84 ECEF [m] + double y2, //!< 2nd satellite Y coordinates, WGS84 ECEF [m] + double y3, //!< 3rd satellite Y coordinates, WGS84 ECEF [m] + double y4, //!< 4th satellite Y coordinates, WGS84 ECEF [m] + double z1, //!< 1st satellite Z coordinates, WGS84 ECEF [m] + double z2, //!< 2nd satellite Z coordinates, WGS84 ECEF [m] + double z3, //!< 3rd satellite Z coordinates, WGS84 ECEF [m] + double z4, //!< 4th satellite Z coordinates, WGS84 ECEF [m] + double* latitude, //!< The computed geodetic latitude [rad] + double* longitude, //!< The computed geodetic longitude [rad] + double* height, //!< The computed geodetic height [m] + double* rx_clock_bias //!< The computed receiver clock bias [m] + ) +{ + // difference values + double x12, x13, x14; // 'xij' = 'xi' - 'xj' [m] + double y12, y13, y14; + double z12, z13, z14; + double p21, p31, p41; // 'pij' = 'pi' - 'pj' [m] + + double k1, k2, k3; // coefficients + double c1, c2, c3; + double f1, f2, f3; + double m1, m2, m3; + + double d1; // clock bias, solution 1 [m] + double d2; // clock bias, solution 2 [m] + double detA; // determinant of A + double tmp1; + double tmp2; + double tmp3; + + double A[3][3]; + double D[3][3]; // D is A^-1 * detA + + typedef struct + { + double x; + double y; + double z; + } struct_SOLN; + + struct_SOLN s1; + struct_SOLN s2; + + // apply the satellite clock corrections + p1 = p1 + prc_satclk1; + p2 = p2 + prc_satclk2; + p3 = p3 + prc_satclk3; + p4 = p4 + prc_satclk4; + + x12 = x1 - x2; + x13 = x1 - x3; + x14 = x1 - x4; + + y12 = y1 - y2; + y13 = y1 - y3; + y14 = y1 - y4; + + z12 = z1 - z2; + z13 = z1 - z3; + z14 = z1 - z4; + + p21 = p2 - p1; + p31 = p3 - p1; + p41 = p4 - p1; + + k1 = x12*x12 + y12*y12 + z12*z12 - p21*p21; + k2 = x13*x13 + y13*y13 + z13*z13 - p31*p31; + k3 = x14*x14 + y14*y14 + z14*z14 - p41*p41; + + A[0][0] = 2.0*x12; + A[1][0] = 2.0*x13; + A[2][0] = 2.0*x14; + + A[0][1] = 2.0*y12; + A[1][1] = 2.0*y13; + A[2][1] = 2.0*y14; + + A[0][2] = 2.0*z12; + A[1][2] = 2.0*z13; + A[2][2] = 2.0*z14; + + tmp1 = A[1][1]*A[2][2] - A[2][1]*A[1][2]; + tmp2 = A[1][0]*A[2][2] - A[2][0]*A[1][2]; + tmp3 = A[1][0]*A[2][1] - A[2][0]*A[1][1]; + + detA = A[0][0]*tmp1 - A[0][1]*tmp2 + A[0][2]*tmp3; + if(detA==0) return FALSE; + + D[0][0] = tmp1; + D[1][0] = -tmp2; + D[2][0] = tmp3; + + D[0][1] = -A[0][1]*A[2][2] + A[2][1]*A[0][2]; + D[1][1] = A[0][0]*A[2][2] - A[2][0]*A[0][2]; + D[2][1] = -A[0][0]*A[2][1] + A[2][0]*A[0][1]; + + D[0][2] = A[0][1]*A[1][2] - A[1][1]*A[0][2]; + D[1][2] = -A[0][0]*A[1][2] + A[1][0]*A[0][2]; + D[2][2] = A[0][0]*A[1][1] - A[1][0]*A[0][1]; + + c1 = (D[0][0]*p21 + D[0][1]*p31 + D[0][2]*p41) * 2.0 / detA; + c2 = (D[1][0]*p21 + D[1][1]*p31 + D[1][2]*p41) * 2.0 / detA; + c3 = (D[2][0]*p21 + D[2][1]*p31 + D[2][2]*p41) * 2.0 / detA; + + f1 = (D[0][0]*k1 + D[0][1]*k2 + D[0][2]*k3) / detA; + f2 = (D[1][0]*k1 + D[1][1]*k2 + D[1][2]*k3) / detA; + f3 = (D[2][0]*k1 + D[2][1]*k2 + D[2][2]*k3) / detA; + + m1 = c1*c1 + c2*c2 + c3*c3 - 1.0; + m2 = -2.0*( c1*f1 + c2*f2 + c3*f3 ); + m3 = f1*f1 + f2*f2 + f3*f3; + + tmp1 = m2*m2 - 4.0*m1*m3; + if( tmp1 < 0 ) + { + // not good, there is no solution +// GNSS_ERROR_MSG( "There is no solution." ); + return FALSE; + } + + d1 = ( -m2 + sqrt( tmp1 ) ) * 0.5 / m1; + d2 = ( -m2 - sqrt( tmp1 ) ) * 0.5 / m1; + + // two solutions + s1.x = c1*d1 - f1 + x1; + s1.y = c2*d1 - f2 + y1; + s1.z = c3*d1 - f3 + z1; + + s2.x = c1*d2 - f1 + x1; + s2.y = c2*d2 - f2 + y1; + s2.z = c3*d2 - f3 + z1; + + tmp1 = sqrt( s1.x*s1.x + s1.y*s1.y + s1.z*s1.z ); + tmp2 = sqrt( s2.x*s2.x + s2.y*s2.y + s2.z*s2.z ); + + // choose the correct solution based + // on whichever solutino is closest to + // the Earth's surface + tmp1 = fabs( tmp1 - 6371000.0 ); + tmp2 = fabs( tmp2 - 6371000.0 ); + + if( tmp2 < tmp1 ) + { + s1 = s2; + d1 = d2; + } + + *rx_clock_bias = d1; + + GEODESY_ConvertEarthFixedCartesianToGeodeticCurvilinearCoordinates( + GEODESY_REFERENCE_ELLIPSE_WGS84, + s1.x, s1.y, s1.z, + latitude, longitude, height ); + + if( *height < -1500.0 || *height > 50000.0 ) + { + // height is out of the likely range for terrestrial users +// GNSS_ERROR_MSG( "The height is out of the likely range for terrestrial users." ); + return FALSE; + } + + return TRUE; +} + diff --git a/src/navigation.h b/src/navigation.h new file mode 100644 index 0000000..af0e99f --- /dev/null +++ b/src/navigation.h @@ -0,0 +1,140 @@ +/** +\file navigation.h +\brief GNSS core 'c' function library: navigation functions. +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-23 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_NAVIGATION_H_ +#define _C_NAVIGATION_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/// \brief Computes the derivative of the pseudorange with respect +/// to X, Y, Z. Also computes the user to satellite range for +/// convenience. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-23 +/// \since 2005-08-23 +/// +void NAVIGATION_ComputeDerivativesOf_Range_WithRespectTo_XYZ( + const double x, //!< User X coordinate WGS84 ECEF [m] + const double y, //!< User Y coordinate WGS84 ECEF [m] + const double z, //!< User Z coordinate WGS84 ECEF [m] + const double satX, //!< Satellite X coordinate WGS84 ECEF [m] + const double satY, //!< Satellite Y coordinate WGS84 ECEF [m] + const double satZ, //!< Satellite Z coordinate WGS84 ECEF [m] + double* dPdx, //!< Derivative of P wrt X [] + double* dPdy, //!< Derivative of P wrt Y [] + double* dPdz, //!< Derivative of P wrt Z [] + double* range //!< computed user to satellite range [m] + ); + + +/// \brief Computes the derivative of the pseudorange with respect +/// to latitude, longitude, and height/ Also computes the user +/// to satellite range for convenience. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-23 +/// \since 2005-08-23 +/// +void NAVIGATION_ComputeDerivativesOf_Range_WithRespectToLatitudeLongitudeHeight( + const double latitude, //!< User geodetic latitude [rad] + const double longitude, //!< User geodetic longtiude [rad] + const double height, //!< User geodetic height [m] + const double satX, //!< Satellite X coordinate WGS84 ECEF [m] + const double satY, //!< Satellite Y coordinate WGS84 ECEF [m] + const double satZ, //!< Satellite Z coordinate WGS84 ECEF [m] + double* dlat, //!< d(P)/d(lat) but not in units of [m/rad], [m/m] + double* dlon, //!< d(P)/d(lon) but not in units of [m/rad], [m/m] + double* dhgt, //!< d(P)/d(hgt) [m/m] + double* range //!< computed user to satellite range [m] + ); + + + + +/// \brief Compute a closed form position solution using four +/// raw pseudoranges. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2005-08-23 +/// \since 2005-08-23 +/// +/// \return TRUE(1) if successful, FALSE(0) otherwise. +/// +/// \remarks +/// (1) The satellite clock corrections in meters are required for each pseudorange \n +/// (2) This function was written for easy portability into Matlab +/// +/// \b REFERENCES \n +/// [1] Mezentsev, O. and J. Collin (2004). A Closed Form Solution Of Non-Linear GPS +/// Pseudorange Equations. White paper proof - not published. +/// +int NAVIGATION_PerformClosedFormPositionSolution_FromPseuodrangeMeasurements( + double p1, //!< 1st raw pseudorange measurement [m] + double p2, //!< 2nd raw pseudorange measurement [m] + double p3, //!< 3rd raw pseudorange measurement [m] + double p4, //!< 4th raw pseudorange measurement [m] + double prc_satclk1, //!< 1st satellite clock corrections for psuedoranges [m] + double prc_satclk2, //!< 2nd satellite clock corrections for psuedoranges [m] + double prc_satclk3, //!< 3rd satellite clock corrections for psuedoranges [m] + double prc_satclk4, //!< 4th satellite clock corrections for psuedoranges [m] + double x1, //!< 1st satellite X coordinates, WGS84 ECEF [m] + double x2, //!< 2nd satellite X coordinates, WGS84 ECEF [m] + double x3, //!< 3rd satellite X coordinates, WGS84 ECEF [m] + double x4, //!< 4th satellite X coordinates, WGS84 ECEF [m] + double y1, //!< 1st satellite Y coordinates, WGS84 ECEF [m] + double y2, //!< 2nd satellite Y coordinates, WGS84 ECEF [m] + double y3, //!< 3rd satellite Y coordinates, WGS84 ECEF [m] + double y4, //!< 4th satellite Y coordinates, WGS84 ECEF [m] + double z1, //!< 1st satellite Z coordinates, WGS84 ECEF [m] + double z2, //!< 2nd satellite Z coordinates, WGS84 ECEF [m] + double z3, //!< 3rd satellite Z coordinates, WGS84 ECEF [m] + double z4, //!< 4th satellite Z coordinates, WGS84 ECEF [m] + double* latitude, //!< The computed geodetic latitude [rad] + double* longitude, //!< The computed geodetic longitude [rad] + double* height, //!< The computed geodetic height [m] + double* rx_clock_bias //!< The computed receiver clock bias [m] + ); + +#ifdef __cplusplus +} +#endif + + +#endif // _C_NAVIGATION_H_ diff --git a/src/osi.c b/src/osi.c new file mode 100644 index 0000000..987cafc --- /dev/null +++ b/src/osi.c @@ -0,0 +1,190 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef osi_H_ +#include "osi.h" +#endif +#define osi_C_ +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef tcp_H_ +#include "tcp.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif + +/* os interface linux/win32 */ + +static void h(uint32_t n) +{ + char tmp; + if (n<10UL) osi_WrStr((char *)(tmp = (char)(n+48UL),&tmp), 1u/1u); + else osi_WrStr((char *)(tmp = (char)(n+55UL),&tmp), 1u/1u); +} /* end h() */ + + +extern void osi_WrHex(uint32_t n, uint32_t f) +{ + h(n/16UL&15UL); + h(n&15UL); + while (f>=3UL) { + osi_WrStr(" ", 2ul); + --f; + } +} /* end WrHex() */ + + +extern int32_t osi_realint(float x) +{ + if (x>=2.E+9f) return 2000000000L; + if (x<=(-2.E+9f)) return -2000000000L; + return (int32_t)X2C_TRUNCI(x,X2C_min_longint,X2C_max_longint); +} /* end realint() */ + + +extern uint32_t osi_realcard(float x) +{ + if (x>=4.E+9f) return 0x0EE6B2800UL; + if (x<=0.0f) return 0UL; + return (uint32_t)X2C_TRUNCC(x,0UL,X2C_max_longcard); +} /* end realcard() */ + + +extern int32_t osi_OpenAppendLong(char fn[], uint32_t fn_len) +{ + return osic_OpenAppendLong(fn, fn_len); +} /* end OpenAppendLong() */ + + +extern int32_t osi_OpenAppend(char fn[], uint32_t fn_len) +{ + return osic_OpenAppend(fn, fn_len); +} /* end OpenAppend() */ + + +extern int32_t osi_OpenWrite(char fn[], uint32_t fn_len) +{ + return osic_OpenWrite(fn, fn_len); +} /* end OpenWrite() */ + + +extern int32_t osi_OpenReadLong(char fn[], uint32_t fn_len) +{ + return osic_OpenReadLong(fn, fn_len); +} /* end OpenReadLong() */ + + +extern int32_t osi_OpenRead(char fn[], uint32_t fn_len) +{ + return osic_OpenRead(fn, fn_len); +} /* end OpenRead() */ + + +extern int32_t osi_OpenRW(char fn[], uint32_t fn_len) +{ + return osic_OpenRW(fn, fn_len); +} /* end OpenRW() */ + + +extern int32_t osi_OpenNONBLOCK(char fn[], uint32_t fn_len) +{ + return osic_OpenNONBLOCK(fn, fn_len); +} /* end OpenNONBLOCK() */ + + +extern void osi_NextArg(char s[], uint32_t s_len) +{ + osic_NextArg(s, s_len); +} /* end NextArg() */ + + +extern int32_t osi_RdBin(int32_t fd, char buf[], uint32_t buf_len, + uint32_t size) +{ + return osic_RdBin(fd, buf, buf_len, size); +} /* end RdBin() */ + + +extern void osi_WrBin(int32_t fd, char buf[], uint32_t buf_len, + uint32_t size) +{ + osic_WrBin(fd, buf, buf_len, size); +} /* end WrBin() */ + + +extern void osi_Rename(char fname[], uint32_t fname_len, + char newname[], uint32_t newname_len) +{ + osic_Rename(fname, fname_len, newname, newname_len); +} /* end Rename() */ + + +extern void osi_Werr(char text[], uint32_t text_len) +{ + osic_WerrStr(text, text_len); +} /* end Werr() */ + + +extern void osi_WerrLn(char text[], uint32_t text_len) +{ + osic_WerrStrLn(text, text_len); +} /* end WerrLn() */ + + +extern void osi_WrStrLn(char s[], uint32_t s_len) +{ + osic_WrStrLn(s, s_len); +} /* end WrStrLn() */ + + +extern void osi_WrStr(char s[], uint32_t s_len) +{ + osic_WrStr(s, s_len); +} /* end WrStr() */ + + +extern void osi_Erase(char fn[], uint32_t fn_len, char * done) +{ + osic_Remove(fn, fn_len, done); +} /* end Erase() */ + + +extern char osi_Exists(char fn[], uint32_t fn_len) +{ + return osic_Exists(fn, fn_len); +} /* end Exists() */ + + +extern int32_t osi_getptsname(int32_t fd, char * s, + uint32_t size) +{ + return osic_getptsname(fd, s, size); +} /* end getptsname() */ + +typedef char * pSTR; + + +extern int32_t osi_symblink(char * fname, char * newname) +{ + return osic_symblink((pSTR)fname, (pSTR)newname); +} /* end symblink() */ + + +extern void osi_BEGIN(void) +{ + static int osi_init = 0; + if (osi_init) return; + osi_init = 1; +} + diff --git a/src/osi.h b/src/osi.h new file mode 100644 index 0000000..31f53ea --- /dev/null +++ b/src/osi.h @@ -0,0 +1,164 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef osi_H_ +#define osi_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif +#ifndef tcp_H_ +#include "tcp.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef mlib_H_ +#include "mlib.h" +#endif +#include + +/* os interface */ +typedef int32_t osi_File; + +typedef int32_t osi_SOCKET; + +#define osi_pi 3.1415926535898 + +#define osi_DIRSEP "/" + +#define osi_DIRSEP2 "/" + +#define osi_InvalidFd (-1) + +#define osi_ln osic_ln + +#define osi_sin osic_sin + +#define osi_cos osic_cos + +#define osi_tan osic_tan + +#define osi_arctan osic_arctan + +#define osi_arccos osic_arccos + +#define osi_exp osic_exp + +#define osi_power osic_power + +#define osi_sqrt osic_sqrt + +#define osi_floor osic_floor + +#define osi_Close osic_Close + +#define osi_WrFixed osic_WrFixed + +#define osi_Seek osic_Seek + +#define osi_Seekcur osic_Seekcur + +#define osi_WrLn osic_WrLn + +#define osi_FdValid osic_FdValid + +#define osi_CloseSock osic_CloseSock + +#define osi_ALLOCATE osic_alloc + +#define osi_DEALLOCATE osic_free + +#define osi_time osic_time + +#define osi_Size osic_Size + +#define osi_grantpts osic_grantpts + +#define osi_unlockpts osic_unlockpts + +#define osi_Random osic_Random + +#define osi_WrCard osic_WrUINT32 + +#define osi_WrInt osic_WrINT32 + +#define osi_Flush osic_flush + +#define osi_usleep usleep + +#define osi_readsock readsock + +#define osi_sendsock sendsock + +#define osi_connectto connectto + +#define osi_getunack getunack + +#define osi_stoptxrx stoptxrx + +#define osi_openudp openudp + +#define osi_bindudp bindudp + +#define osi_socknonblock socknonblock + +#define osi_udpreceive udpreceive + +#define osi_udpsend udpsend + +extern int32_t osi_OpenAppendLong(char [], uint32_t); + +extern int32_t osi_OpenAppend(char [], uint32_t); + +extern int32_t osi_OpenWrite(char [], uint32_t); + +extern int32_t osi_OpenReadLong(char [], uint32_t); + +extern int32_t osi_OpenRead(char [], uint32_t); + +extern int32_t osi_OpenRW(char [], uint32_t); + +extern int32_t osi_OpenNONBLOCK(char [], uint32_t); + +extern void osi_Rename(char [], uint32_t, char [], uint32_t); + +extern void osi_WerrLn(char [], uint32_t); + +extern int32_t osi_RdBin(int32_t, char [], uint32_t, uint32_t); + +extern void osi_WrBin(int32_t, char [], uint32_t, uint32_t); + +extern void osi_Werr(char [], uint32_t); + +extern void osi_WrHex(uint32_t, uint32_t); +/*PROCEDURE IsFifo(fd:File):BOOLEAN;*/ + +extern void osi_NextArg(char [], uint32_t); + +extern void osi_WrStr(char [], uint32_t); + +extern void osi_Erase(char [], uint32_t, char *); + +extern char osi_Exists(char [], uint32_t); + +extern int32_t osi_getptsname(int32_t, char *, uint32_t); + +extern int32_t osi_symblink(char *, char *); + +extern void osi_WrStrLn(char [], uint32_t); + +extern int32_t osi_realint(float); + +extern uint32_t osi_realcard(float); + + +extern void osi_BEGIN(void); + + +#endif /* osi_H_ */ diff --git a/src/osic.c b/src/osic.c new file mode 100644 index 0000000..4609b8e --- /dev/null +++ b/src/osic.c @@ -0,0 +1,555 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Hannes Schmelzer + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#define _LARGEFILE64_SOURCE +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "osic.h" + +#undef DEBUG +#ifdef DEBUG +# define DBG(...) printf(__VA_ARGS__) +#else +# define DBG(...) do { } while (0) +#endif + +#define FNLENCHECK 1 + +/* Does not exist - and is not necessary - on MacOS */ +#ifndef O_LARGEFILE +# define O_LARGEFILE 0 +#endif + +static int osic_argc, argc_delivered; +static char **osic_argv; + +void osic_flush(void) +{ + fflush(stdout); + fflush(stderr); +} + +void osic_WrLn(void) +{ + fprintf(stdout, "\n"); + fflush(stdout); +} + +void osic_WerrLn(void) +{ + fprintf(stderr, "\n"); + fflush(stderr); +} + +void osic_WrStr(char s[], uint32_t s_len) +{ + size_t len; + + len = strnlen(s, s_len); + fprintf(stdout, "%.*s", len, s); +} + +void osic_WrStrLn(char s[], uint32_t s_len) +{ + size_t len; + + len = strnlen(s, s_len); + fprintf(stdout, "%.*s", len, s); + osic_WrLn(); +} + +void osic_WerrStr(char s[], uint32_t s_len) +{ + size_t len; + + len = strnlen(s, s_len); + fprintf(stderr, "%.*s", len, s); +} + +void osic_WerrStrLn(char s[], uint32_t s_len) +{ + size_t len; + + len = strnlen(s, s_len); + fprintf(stderr, "%.*s", len, s); + osic_WrLn(); +} + +void osic_WrUINT32(uint32_t x, uint32_t witdh) +{ + fprintf(stdout, "%*d", (int)witdh, x); +} + +void osic_WrINT32(int32_t x, uint32_t witdh) +{ + fprintf(stdout, "%*d", (int)witdh, x); +} + +void osic_WrFixed(float x, int32_t place, uint32_t witdh) +{ + fprintf(stdout, "%*.*f", (int)witdh, (int)place, x); +} + +void osic_WrHex(uint32_t n, uint32_t f) +{ + fprintf(stdout, "%*X", (int)f, (uint32_t)n); + fflush(stdout); +} + +int osic_getptsname(int fd, char *name, int len) +{ +#ifndef MACOS + return ptsname_r(fd, name, len); +#else + { + /* MacOS does not have ptsname_r, emulate it with ptsname */ + if (name == NULL) + return -EINVAL; + char *n = ptsname(fd); + if (n == NULL) + return -ENOTTY; + if (len < strlen(n)) + return -ERANGE; + strncpy(name, n, len); + + return 0; + } +#endif +} + +int osic_grantpts(int fd) +{ + return grantpt(fd); +} + +int osic_unlockpts(int fd) +{ + return unlockpt(fd); +} + +int32_t osic_OpenAppendLong(char fn[], uint32_t fn_len) +{ + if (FNLENCHECK && strnlen(fn, fn_len) > fn_len) + return -1; + return open(fn, O_WRONLY | O_APPEND | O_LARGEFILE); +} + +int32_t osic_OpenAppend(char fn[], uint32_t fn_len) +{ + if (FNLENCHECK && strnlen(fn, fn_len) > fn_len) + return -1; + return open(fn, O_WRONLY | O_APPEND); +} + +int32_t osic_OpenWrite(char fn[], uint32_t fn_len) +{ + if (FNLENCHECK && strnlen(fn, fn_len) > fn_len) + return -1; + return creat(fn, 0664); +} + +int32_t osic_OpenReadLong(char fn[], uint32_t fn_len) +{ + if (FNLENCHECK && strnlen(fn, fn_len) > fn_len) + return -1; + return open(fn, O_RDONLY | O_LARGEFILE); +} + +int32_t osic_OpenRead(char fn[], uint32_t fn_len) +{ + if (FNLENCHECK && strnlen(fn, fn_len) > fn_len) + return -1; + return open(fn, O_RDONLY); +} + +int32_t osic_OpenRW(char fn[], uint32_t fn_len) +{ + if (FNLENCHECK && strnlen(fn, fn_len) > fn_len) + return -1; + return open(fn, O_RDWR); +} + +int32_t osic_OpenNONBLOCK(char fn[], uint32_t fn_len) +{ + if (FNLENCHECK && strnlen(fn, fn_len) > fn_len) + return -1; + return open(fn, O_RDWR | O_NONBLOCK); +} + +char osic_FdValid(int32_t fd) +{ + return (fd >= 0); +} + +void osic_Close(int32_t fd) +{ + close(fd); +} + +void osic_CloseSock(int32_t fd) +{ + close(fd); +} + +int32_t osic_RdBin(int32_t fd, + char buf[], uint32_t buf_len, + uint32_t size) +{ + if (size > (buf_len-1) + 1) + size = (buf_len-1)+1; + return read(fd, (char *)buf, size); +} + +void osic_WrBin(int32_t fd, char buf[], + uint32_t buf_len, + uint32_t size) +{ + int rc; + if (size > (buf_len-1)+1) + size = (buf_len-1)+1; + rc = write(fd, (char *)buf, size); + (void)rc; +} + +void osic_Rename(char fname[], uint32_t fname_len, + char newname[], uint32_t newname_len) +{ + if (FNLENCHECK && strnlen(fname, fname_len) >= fname_len) + return; + if (FNLENCHECK && strnlen(newname, newname_len) >= newname_len) + return; + rename(fname, newname); +} + +int osic_Size(int fd) +{ + struct stat st = { }; + + fstat(fd, &st); + return st.st_size; +} + +void osic_Seek(int32_t fd, uint32_t pos) +{ + lseek(fd, (int32_t)pos, SEEK_SET); +} + +void osic_Seekcur(int32_t fd, int32_t rel) +{ +#ifndef MACOS + if (lseek64(fd, rel, (uint32_t)SEEK_CUR) < 0) + lseek(fd, 0, SEEK_SET); +#else + /* MacOS has no lseek64 */ + if (lseek(fd, rel, (uint32_t)SEEK_CUR) < 0) + lseek(fd, 0, SEEK_SET); +#endif +} + +void osic_Remove(char fname[], uint32_t fname_len, char *done) +{ + int rc; + + rc = remove(fname); + if (rc == 0) + *done = 1; + else + *done = 0; +} + +char osic_Exists(char fname[], uint32_t fname_len) +{ + if (access(fname, F_OK) != -1) + return 1; + return 0; +} + +int osic_symblink(char *existing, char *newname) +{ + return symlink(existing, newname); +} + +void osic_NextArg(char s[], uint32_t s_len) +{ + if (argc_delivered >= osic_argc-1) { + s[0] = 0; + return; + } + strncpy(s, osic_argv[argc_delivered+1], s_len); + argc_delivered++; +} + +void osic_Fill(char *buf, uint32_t len, char byte) +{ + memset(buf, byte, len); +} + +double osic_Random(void) +{ + return (rand() / (double)RAND_MAX); +} + +void X2C_BEGIN(int *argc, char *argv[], + int gc_auto, int32_t gc_threshold, int32_t heap_limit) +{ + if (osic_argc != 0) + return; + osic_argc = *argc; + osic_argv = argv; +} + +void X2C_PCOPY(void **ppcpy, size_t size) +{ + void *pnew; + + pnew = malloc(size); + if (pnew == NULL) + return; + memcpy(pnew, *ppcpy, size); + *ppcpy = pnew; +} + +int32_t X2C_TRUNCI(double x, int32_t min0, int32_t max0) +{ + int32_t i; + + if (x < (double)min0 || x > (double)max0) + assert(0); + i = (int32_t)x; + if (x > 0.0) { + if ((double)i > x) + --i; + } else if ((double)i < x) { + ++i; + } + return i; +} + +uint32_t X2C_TRUNCC(double x, uint32_t min0, uint32_t max0) +{ + uint32_t i; + + if (x < (double)min0) + i = (uint32_t)min0; + if (x > (double)max0) + i = (uint32_t)max0; + + i = (uint32_t)x; + if ((double)i > x) + --i; + return i; +} + +float osic_cos(float x) +{ + return cos(x); +} + +float osic_ln(float x) +{ + if (x <= 0.0) + assert(0); + return log(x); +} + +float osic_sqrt(float x) +{ + if (x < 0.0) + assert(0); + return sqrt(x); +} + +float osic_sin(float x) +{ + return sin(x); +} +float osic_arctan(float x) +{ + return atan(x); +} + +float osic_tan(float x) +{ + return tan(x); +} + +float osic_exp(float x) +{ + return exp(x); +} + +float osic_power(float base, float exponent) +{ + if (base <= 0.0) + assert(0); + return pow(base, exponent); +} + +float osic_arccos(float x) +{ + return acos(x); +} + +float osic_floor(float x) +{ + return floorf(x); +} + +void osic_alloc(X2C_ADDRESS *p, uint32_t size) +{ + void *pmem; + + pmem = malloc(size); + if (pmem == NULL) + return; + *p = pmem; +} + +void osic_free(X2C_ADDRESS *a, uint32_t size) +{ + assert(*a); + free(*a); +} + +uint32_t osic_time(void) +{ + return time(NULL); +} + +uint32_t X2C_LSH(uint32_t a, int32_t length, int32_t n) +{ + uint32_t m; + + m = 0; + m = (length == 32) ? 0xFFFFFFFFl : (1 << length) - 1; + if (n > 0) { + if (n >= (int32_t)length) + return 0; + return (a << n) & m; + } + + if (n <= (int32_t)-length) + return 0; + return (a >> -n) & m; +} + +char X2C_IN(uint32_t i, uint32_t bits, uint32_t set) +{ + if (i < bits) + return (((1 << (int)i) & set) != 0); + return 0; +} + +char X2C_INL(uint32_t i, uint32_t bits, uint32_t *set) +{ + if (i < bits) + return (set[(int)i / X2C_LSET_SIZE] & (1 << ((int)i % X2C_LSET_SIZE))) != 0; + return 0; +} + +void X2C_INCL(uint32_t *set, uint32_t i, uint32_t bits) +{ + if (i >= bits) + assert(0); + set[(int)i / X2C_LSET_SIZE] |= 1L << ((int)i % X2C_LSET_SIZE); +} + +void X2C_EXCL(uint32_t *set, uint32_t i, uint32_t bits) +{ + if (i >= bits) + assert(0); + set[(int)i / X2C_LSET_SIZE] &= ~(1L << ((int)i % X2C_LSET_SIZE)); +} + +uint32_t *X2C_COMPLEMENT(uint32_t *res, uint32_t *a, uint32_t length) +{ + uint32_t *pres = res; + while (length--) + *res++ = ~(*a++); + + return pres; +} + +struct xrMM_Dynarr { + char *a; + size_t n[15]; +}; + +size_t xrMM_DynarrDescSize(size_t i) +{ + return (sizeof(char *) + i * sizeof(size_t) * 2); +} + +void X2C_InitDesc(struct xrMM_Dynarr *d, size_t *size, size_t lens[], size_t dims) +{ + uint32_t i; + uint32_t tmp; + + d->n[(dims - 1) * 2] = lens[0]; + tmp = dims - 1; + i = 1; + if (i <= tmp) { + for (;; i++) { + *size = *size * lens[dims-i]; + d->n[i * 2 - 1] = *size; + d->n[(dims - i) * 2 - 2] = lens[i]; + if (i == tmp) + break; + } + } + *size = *size*lens[0]; +} + +void X2C_DYNALLOCATE(char **a, size_t size, size_t lens[], size_t dims) +{ + struct xrMM_Dynarr *desc; + + *a = 0; + desc = malloc(xrMM_DynarrDescSize(dims)); + if (desc) { + X2C_InitDesc(desc, &size, lens, dims); + desc->a = malloc(size); + if (desc->a == 0) { + free(desc); + } else { + DBG("%s: %p (%d bytes) with child %p (%d bytes)\n", + __func__, desc, xrMM_DynarrDescSize(dims), + desc->a, size); + *a = (char *)desc; + } + } +} + +void X2C_DYNDEALLOCATE(char **a) +{ + struct xrMM_Dynarr *d; + + if (*a) { + d = (struct xrMM_Dynarr *)*a; + DBG("%s: have %p with child %p\n", __func__, d, d->a); + free(d->a); + free(d); + } +} + +void *osic_chkptr(void *p) +{ + assert(p); + return p; +} diff --git a/src/osic.h b/src/osic.h new file mode 100644 index 0000000..b41a191 --- /dev/null +++ b/src/osic.h @@ -0,0 +1,147 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Hannes Schmelzer + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef __OSIC_H__ +#define __OSIC_H__ + +#include +#include "X2C.h" + +void osic_flush(void); + +void osic_WrLn(void); + +void osic_WerrLn(void); + +void osic_WrStr(char s[], uint32_t s_len); + +void osic_WrStrLn(char s[], uint32_t s_len); + +void osic_WerrStr(char s[], uint32_t s_len); + +void osic_WerrStrLn(char s[], uint32_t s_len); + +void osic_WrUINT32(uint32_t x, uint32_t witdh); + +void osic_WrINT32(int32_t x, uint32_t witdh); + +void osic_WrFixed(float x, int32_t place, uint32_t witdh); + +void osic_WrHex(uint32_t n, uint32_t f); + +int osic_getptsname(int fd, char *name, int len); + +int osic_grantpts(int fd); + +int osic_unlockpts(int fd); + +int32_t osic_OpenAppendLong(char fn[], uint32_t fn_len); + +int32_t osic_OpenAppend(char fn[], uint32_t fn_len); + +int32_t osic_OpenWrite(char fn[], uint32_t fn_len); + +int32_t osic_OpenReadLong(char fn[], uint32_t fn_len); + +int32_t osic_OpenRead(char fn[], uint32_t fn_len); + +int32_t osic_OpenRW(char fn[], uint32_t fn_len); + +int32_t osic_OpenNONBLOCK(char fn[], uint32_t fn_len); + +char osic_FdValid(int32_t fd); + +void osic_Close(int32_t fd); + +void osic_CloseSock(int32_t fd); + +int32_t osic_RdBin(int32_t fd, + char buf[], uint32_t buf_len, + uint32_t size); + +void osic_WrBin(int32_t fd, char buf[], + uint32_t buf_len, + uint32_t size); + +void osic_Rename(char fname[], uint32_t fname_len, + char newname[], uint32_t newname_len); + +int osic_Size(int fd); + +void osic_Seek(int32_t fd, uint32_t pos); + +void osic_Seekcur(int32_t fd, int32_t rel); + +void osic_Remove(char fname[], uint32_t fname_len, char *done); + +char osic_Exists(char fname[], uint32_t fname_len); + +int osic_symblink(char *existing, char *newname); + +void osic_NextArg(char s[], uint32_t s_len); + +void osic_Fill(char *buf, uint32_t len, char byte); + +double osic_Random(void); + +void X2C_BEGIN(int *argc, char *argv[], + int gc_auto, int32_t gc_threshold, int32_t heap_limit); + +void X2C_PCOPY(void **ppcpy, size_t size); + +int32_t X2C_TRUNCI(double x, int32_t min0, int32_t max0); + +uint32_t X2C_TRUNCC(double x, uint32_t min0, uint32_t max0); + +float osic_cos(float x); + +float osic_ln(float x); + +float osic_sqrt(float x); + +float osic_sin(float x); + +float osic_arctan(float x); + +float osic_tan(float x); + +float osic_exp(float x); + +float osic_power(float base, float exponent); + +float osic_arccos(float x); + +float osic_floor(float x); + +void osic_alloc(X2C_ADDRESS *p, uint32_t size); + +void osic_free(X2C_ADDRESS *a, uint32_t size); + +uint32_t osic_time(void); + +uint32_t X2C_LSH(uint32_t a, int32_t length, int32_t n); + +char X2C_IN(uint32_t i, uint32_t bits, uint32_t set); + +char X2C_INL(uint32_t i, uint32_t bits, uint32_t *set); + +void X2C_INCL(uint32_t *set, uint32_t i, uint32_t bits); + +void X2C_EXCL(uint32_t *set, uint32_t i, uint32_t bits); + +uint32_t *X2C_COMPLEMENT(uint32_t *res, uint32_t *a, uint32_t length); + +void X2C_DYNALLOCATE(char **a, size_t size, size_t lens[], size_t dims); + +void X2C_DYNDEALLOCATE(char **a); + +void *osic_chkptr(void *p); + +#endif /* __OSIC_H__ */ diff --git a/src/pngread.c b/src/pngread.c new file mode 100644 index 0000000..4ecf5f8 --- /dev/null +++ b/src/pngread.c @@ -0,0 +1,128 @@ + +#include +#include + +int32_t readpng(char *fn, png_bytep *row_pointers, int32_t *maxx, int32_t *maxy, int32_t *maxxbyte) /* file is already open */ +{ + png_structp png_ptr; + png_infop info_ptr; + png_uint_32 width, height; + int bit_depth, color_type, interlace_type, xsize, ysize, xbyte; + + FILE *fp = fopen(fn, "rb"); + if (!fp) + return -4; + + /* Create and initialize the png_struct with the desired error handler + * functions. If you want to use the default stderr and longjump method, + * you can supply NULL for the last three parameters. We also supply the + * the compiler header file version, so that we know if the application + * was compiled with a compatible version of the library. REQUIRED + */ + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + + if (png_ptr == NULL) + { + + fclose(fp); + return -1; + } + + /* Allocate/initialize the memory for image information. REQUIRED. */ + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) + { + fclose(fp); + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); + return -1; + } + + /* Set error handling if you are using the setjmp/longjmp method (this is + * the normal method of doing things with libpng). REQUIRED unless you + * set up your own error handlers in the png_create_read_struct() earlier. + */ + + if (setjmp(png_jmpbuf(png_ptr))) + { + // Free all of the memory associated with the png_ptr and info_ptr + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fp); + // If we get here, we had a problem reading the file + return -1; + } + + /* Set up the input control if you are using standard C streams */ + png_init_io(png_ptr, fp); + + /* The call to png_read_info() gives us all of the information from the + * PNG file before the first IDAT (image data chunk). REQUIRED + */ + png_read_info(png_ptr, info_ptr); + + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, + &interlace_type, NULL, NULL); + + /* tell libpng to strip 16 bit/color files down to 8 bits/color */ + png_set_strip_16(png_ptr); + + /* strip alpha bytes from the input data without combining with th + * background (not recommended) */ + png_set_strip_alpha(png_ptr); + + /* extract multiple pixels with bit depths of 1, 2, and 4 from a single + * byte into separate bytes (useful for paletted and grayscale images). + */ + png_set_packing(png_ptr); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand(png_ptr); + + /* expand paletted colors into true RGB triplets */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_expand(png_ptr); + + /* optional call to gamma correct and add the background to the palette + * and update info structure. REQUIRED if you are expecting libpng to + * update the palette for you (ie you selected such a transform above). + */ + png_read_update_info(png_ptr, info_ptr); + + xbyte = png_get_rowbytes(png_ptr, info_ptr); + xsize = png_get_image_width(png_ptr, info_ptr); + ysize = png_get_image_height(png_ptr, info_ptr); + + if (ysize > *maxy || xsize > *maxx || xbyte > *maxxbyte) + { + *maxx = xsize; + *maxy = ysize; + *maxxbyte = xbyte; + + /* Free all of the memory associated with the png_ptr and info_ptr */ + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fp); + /* If we get here, we had a problem reading the file */ + return -2; + } + + *maxx = xsize; + *maxy = ysize; + *maxxbyte = xbyte; + + /* Now it's time to read the image.*/ + png_read_image(png_ptr, row_pointers); + + + /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ + png_read_end(png_ptr, info_ptr); + + /* clean up after the read, and free any memory allocated - REQUIRED */ + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + + /* close the file */ + fclose(fp); + + return 0; +} diff --git a/src/pngread.h b/src/pngread.h new file mode 100644 index 0000000..a8af72a --- /dev/null +++ b/src/pngread.h @@ -0,0 +1,15 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef pngread_H_ +#define pngread_H_ +#include "X2C.h" + +extern int32_t readpng(char [], X2C_ADDRESS [], int32_t *, int32_t *, int32_t *); + + +#endif /* pngread_H_ */ diff --git a/src/pngwrite.c b/src/pngwrite.c new file mode 100644 index 0000000..a93a6c7 --- /dev/null +++ b/src/pngwrite.c @@ -0,0 +1,126 @@ +#include +/* +#include +#include +#include +*/ + +typedef struct { + char red; + char green; + char blue; +} pixel_t; + +/* A picture. */ + +typedef struct { + pixel_t *pixels; + size_t width; + size_t height; +} bitmap_t; + +/* Given "bitmap", this returns the pixel of bitmap at the point + ("x", "y"). */ + +static pixel_t * pixel_at (bitmap_t * bitmap, int x, int y) +{ + return bitmap->pixels + bitmap->width * y + x; +} + +/* Write "bitmap" to a PNG file specified by "path"; returns 0 on + success, non-zero on error. */ + +int writepng(const char *path, bitmap_t *bitmap) +{ + FILE * fp; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + size_t x, y; + png_byte ** row_pointers = NULL; + /* "status" contains the return value of this function. At first + it is set to a value which means 'failure'. When the routine + has finished its work, it is set to a value which means + 'success'. */ + int status = -1; + /* The following number is set by trial and error only. I cannot + see where it it is documented in the libpng manual. + */ + int pixel_size = 3; + int depth = 8; + + fp = fopen (path, "wb"); + if (! fp) { + goto fopen_failed; + } + + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (png_ptr == NULL) { + goto png_create_write_struct_failed; + } + + info_ptr = png_create_info_struct (png_ptr); + if (info_ptr == NULL) { + goto png_create_info_struct_failed; + } + + /* Set up error handling. */ + + if (setjmp (png_jmpbuf (png_ptr))) { + goto png_failure; + } + + /* Set image attributes. */ + + png_set_IHDR (png_ptr, + info_ptr, + bitmap->width, + bitmap->height, + depth, + PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + + /* Initialize rows of PNG. */ + + row_pointers = png_malloc (png_ptr, bitmap->height * sizeof (png_byte *)); + for (y = 0; y < bitmap->height; ++y) { + png_byte *row = + png_malloc (png_ptr, sizeof (char) * bitmap->width * pixel_size); + row_pointers[y] = row; + for (x = 0; x < bitmap->width; ++x) { + pixel_t * pixel = pixel_at (bitmap, x, y); + *row++ = pixel->red; + *row++ = pixel->green; + *row++ = pixel->blue; + } + } + + /* Write the image data to "fp". */ + + png_init_io (png_ptr, fp); + png_set_rows (png_ptr, info_ptr, row_pointers); + png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); + + /* The routine has successfully written the file, so we set + "status" to a value which indicates success. */ + + status = 0; + + for (y = 0; y < bitmap->height; y++) { + png_free (png_ptr, row_pointers[y]); + } + png_free (png_ptr, row_pointers); + + png_failure: + png_create_info_struct_failed: + png_destroy_write_struct (&png_ptr, &info_ptr); + + png_create_write_struct_failed: + fclose (fp); + + fopen_failed: + return status; + +} + diff --git a/src/pngwrite.h b/src/pngwrite.h new file mode 100644 index 0000000..503aaff --- /dev/null +++ b/src/pngwrite.h @@ -0,0 +1,41 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef pngwrite_H_ +#define pngwrite_H_ +#include "X2C.h" + +struct PNGPIXEL; + + +struct PNGPIXEL { + unsigned char red; + unsigned char green; + unsigned char blue; +}; + +typedef struct PNGPIXEL * pIMAGE; + + +struct pngwrite__D0 { + struct PNGPIXEL * Adr; + size_t Len0; +}; + +struct PNGPIXMAP; + + +struct PNGPIXMAP { + pIMAGE image; + unsigned long width; + unsigned long height; +}; + +extern long writepng(char [], struct PNGPIXMAP *); + + +#endif /* pngwrite_H_ */ diff --git a/src/radio.c b/src/radio.c new file mode 100644 index 0000000..8a50e20 --- /dev/null +++ b/src/radio.c @@ -0,0 +1,398 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define radio_C_ +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef sdr_H_ +#include "sdr.h" +#endif + +/* fm stereo radio with rtl_tcp iq by OE5DXL */ +struct STICKPARM; + + +struct STICKPARM { + uint32_t val; + char ok0; +}; + +#define radio_OFFSET 100 +/* khz from center frequency to avoid adc dc error area */ + +#define radio_DEEMPHASIS 0.05 +/* check value ... */ + +static int32_t fd; + +static uint32_t sndw; + +static short sndbuf[1024]; + +static struct sdr_RX rxx; + +static sdr_pRX prx[17]; + +static short sampx[64]; + +static char url[1001]; + +static char port[1001]; + +static char soundfn[1001]; + +static char mono; + +static char verb; + +static char isstereo; + +static uint32_t afc; + +static uint32_t tune; + +static struct STICKPARM stickparm[256]; + + +static void Usage(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr(" usage: ", 9ul); + osi_WrStrLn(text, text_len); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Usage() */ + + +static void fix(const char s[], uint32_t s_len, uint32_t * p, + float * x, char * ok0) +{ + float m; + m = 1.0f; + *ok0 = 0; + *x = 0.0f; + while ((uint8_t)s[*p]>='0' && (uint8_t)s[*p]<='9' || s[*p]=='.') { + if (s[*p]=='.') m = 0.1f; + else if (m==1.0f) { + *x = *x*10.0f+(float)((uint32_t)(uint8_t)s[*p]-48UL); + } + else { + *x = *x+(float)((uint32_t)(uint8_t)s[*p]-48UL)*m; + m = m*0.1f; + } + *ok0 = 1; + ++*p; + } +} /* end fix() */ + + +static void Parms(void) +{ + char s[1001]; + float fr; + uint32_t n; + uint32_t m; + int32_t ni; + char ok0; + mono = 0; + verb = 0; + afc = 50UL; + strncpy(url,"127.0.0.1",1001u); + strncpy(port,"1234",1001u); + soundfn[0] = 0; + tune = 100000000UL; + for (;;) { + osi_NextArg(s, 1001ul); + if (s[0U]==0) break; + if ((s[0U]=='-' && s[1U]) && s[2U]==0) { + if (s[1U]=='m') mono = 1; + else if (s[1U]=='s') osi_NextArg(soundfn, 1001ul); + else if (s[1U]=='t') { + osi_NextArg(s, 1001ul); /* url */ + n = 0UL; + while ((n<1000UL && s[n]) && s[n]!=':') { + if (n<1000UL) url[n] = s[n]; + ++n; + } + if (n>1000UL) n = 1000UL; + url[n] = 0; + if (s[n]==':') { + m = 0UL; + ++n; + while ((n<1000UL && s[n]) && m<1000UL) { + port[m] = s[n]; + ++n; + ++m; + } + if (m>1000UL) m = 1000UL; + port[m] = 0; + } + } + else if (s[1U]=='f') { + /* MHz */ + osi_NextArg(s, 1001ul); + n = 0UL; + fix(s, 1001ul, &n, &fr, &ok0); + if (ok0) { + if (fr>2000.0f && fr<=4.294967295E+9f) { + tune = (uint32_t)X2C_TRUNCC(fr+0.5f,0UL, + X2C_max_longcard); + } + else if (fr>1.0f && fr<=4294.0f) { + tune = (uint32_t)X2C_TRUNCC(fr*1.E+6f+0.5f,0UL, + X2C_max_longcard); + } + else Usage(" -f or -f ", 21ul); + } + else Usage(" -f or -f ", 21ul); + } + else if (s[1U]=='p') { + osi_NextArg(s, 1001ul); + if (aprsstr_StrToCard(s, 1001ul, &m) && m<256UL) { + osi_NextArg(s, 1001ul); + if (aprsstr_StrToInt(s, 1001ul, &ni)) { + stickparm[m].val = (uint32_t)ni; /* stick parameter */ + stickparm[m].ok0 = 1; + } + else Usage(" -p ", 18ul); + } + else Usage(" -p ", 18ul); + } + else if (s[1U]=='a') { + /* afc */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &afc) || afc>200UL) { + Usage(" -a ", 10ul); + } + } + else if (s[1U]=='v') verb = 1; + else if (s[1U]=='h') { + osi_WrStrLn("Stereo UKW Radio from rtl:tcp (8 bit IQ via tcpip to\ + 2 channel 16 bit pcm file/pipe ", 85ul); + osi_WrStrLn(" -a max afc (50) or 0 for off", + 48ul); + osi_WrStrLn(" -f tune to MHz or Hz", 34ul); + osi_WrStrLn(" -h help", 21ul); + osi_WrStrLn(" -p send rtl_tcp parameter, ppm, tuner\ +gain ...", 61ul); + osi_WrStrLn(" -s 16bit 48kHz signed 2 channel so\ +und stream/pipe", 68ul); + osi_WrStrLn(" -t connect rtl:tcp server (127.0.0.1:12\ +34)", 56ul); + osi_WrStrLn(" -v show rssi (dB) and afc (khz)", + 45ul); + osi_WrStrLn("example: radio -f 101.2 -s /tmp/sound.pcm -t 192.168\ +.1.1:1234 -p 5 72 -p 8 1 -v", 80ul); + X2C_ABORT(); + } + else Usage("-h", 3ul); + } + else Usage("-h", 3ul); + } +} /* end Parms() */ + + +static void showrssi(void) +{ + char ss[31]; + char s[31]; + if (isstereo) strncpy(s,"S ",31u); + else strncpy(s,"M ",31u); + aprsstr_FixToStr(osic_ln((rxx.rssit[0]+1.0f)*3.0517578125E-5f)*4.342944819f,2UL, ss, 31ul); + aprsstr_Append(s, 31ul, ss, 31ul); + aprsstr_Append(s, 31ul, "dB ", 4ul); + aprsstr_IntToStr(rxx.afckhz, 0UL, ss, 31ul); + aprsstr_Append(s, 31ul, ss, 31ul); + aprsstr_Append(s, 31ul, " \015", 7ul); + osi_Werr(s, 31ul); +} /* end showrssi() */ + +static float uc19; + +static float il19; + +static float uc20; + +static float il20; + +static float um20; + +static float sqv; + +#define radio_F19 0.3741 +/* 19khz with 192khz sampelrate */ + +#define radio_LRLEVEL 1.633E-3 +/* check value ... */ + +#define radio_STEREOSQUELCH 1.37172 + + +static void stereo(float ui, float * left0, float * right0) +{ + float uq; + uc19 = uc19+(ui-uc19)*0.001f+il19; /* 19khz resonant filter */ + il19 = il19-uc19*0.3741f; + uc20 = uc20*0.999f+il20; /* 19khz resonant filter */ + if (uc19>=0.0f) uc20 = uc20+1.633E-3f; + else uc20 = uc20-1.633E-3f; + il20 = il20-uc20*0.3741f; + sqv = sqv+((float)fabs(uc20)-sqv)*0.0001f; /* level of pilot tone */ + if (sqv>1.37172f) { + uq = uc20*uc20; /* make 38khz sine + dc out of 19khz*/ + um20 = um20+(uq-um20)*0.01f; /* get dc */ + uq = (uq-um20)*ui; /* subtract dc and mix left-right signal with 38khz */ + isstereo = 1; + } + else { + uq = 0.0f; /* mono */ + isstereo = 0; + } + *left0 = ui-uq; /* mono - (left - right) */ + *right0 = ui+uq; /* mono + (left - right) */ +} /* end stereo() */ + + +static short lim(float v) +{ + if (v>=32767.0f) return 32767; + else if (v<(-3.2767E+4f)) return -32767; + else return (short)X2C_TRUNCI(v,-32768,32767); + return 0; +} /* end lim() */ + +static int32_t sp; + +static int32_t sn; + +static uint32_t pc; + +static float left; + +static float right; + +static uint32_t tshow; + +static char recon; + +static float lp; + +static float u11; + +static float u21; + +static float il1; + +static float u12; + +static float u22; + +static float il2; + +static float deem1; + +static float deem2; + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + int32_t tmp; + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + sdr_BEGIN(); + aprsstr_BEGIN(); + osi_BEGIN(); + memset((char *) &rxx,(char)0,sizeof(struct sdr_RX)); + prx[0U] = &rxx; + prx[1U] = 0; + memset((char *)stickparm,(char)0,sizeof(struct STICKPARM [256])); + Parms(); + { /* with */ + struct sdr_RX * anonym = &rxx; + anonym->df = 100UL; + anonym->maxafc = (int32_t)afc; + anonym->width = 192000UL; + anonym->modulation = 'f'; + anonym->samples = (sdr_pAUDIOSAMPLE)sampx; + } + if (sdr_startsdr(url, 1001ul, port, 1001ul, 2048000UL, 192000UL, 1)) { + sdr_setparm(1UL, tune-100000UL); + for (pc = 0UL; pc<=255UL; pc++) { + if (stickparm[pc].ok0) sdr_setparm(pc, stickparm[pc].val); + } /* end for */ + lp = 0.14f; + sndw = 0UL; + fd = osi_OpenWrite(soundfn, 1001ul); + if (fd>=0L) { + recon = 1; + for (;;) { + sn = sdr_getsdr(64UL, prx, 17ul); + if (sn<0L) { + osi_WerrLn("connection lost", 16ul); + recon = 1; + } + else { + tmp = sn-1L; + sp = 0L; + if (sp<=tmp) for (;; sp++) { + left = (float)X2C_CHKNIL(sdr_pAUDIOSAMPLE, + rxx.samples)[sp]; + if (mono) right = left; + else stereo(left, &left, &right); + u11 = u11+((left-u11)-il1)*lp; /* lowpass 14khz */ + u21 = u21+(il1-u21)*lp; + il1 = il1+(u11-u21)*lp*2.0f; + u12 = u12+((right-u12)-il2)*lp; + u22 = u22+(il2-u22)*lp; + il2 = il2+(u12-u22)*lp*2.0f; + deem1 = deem1+(u21-deem1)*0.05f; /* deemphasis */ + deem2 = deem2+(u22-deem2)*0.05f; + if ((sp&3L)==3L) { + /* 192 > 48khz samperate */ + sndbuf[sndw] = lim(deem1*2.0f); + ++sndw; + sndbuf[sndw] = lim(deem2*2.0f); + ++sndw; + if (sndw>1023UL) { + osi_WrBin(fd, (char *)sndbuf, 2048u/1u, sndw*2UL); + sndw = 0UL; + if (tshow>20UL) { + recon = 0; + /*WrFixed(sqv, 2,1); WrStr(" "); */ + if (verb) showrssi(); + tshow = 0UL; + } + else ++tshow; + } + } + if (sp==tmp) break; + } /* end for */ + } + } + } + osi_WrStr(soundfn, 1001ul); + osi_WrStrLn(" sound file open error", 23ul); + osi_WrStrLn("connection lost", 16ul); + } + else osi_WrStrLn("not connected", 14ul); + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/rinex.c b/src/rinex.c new file mode 100644 index 0000000..a0cbfba --- /dev/null +++ b/src/rinex.c @@ -0,0 +1,4071 @@ +/** +\file rinex.c +\brief GNSS core 'c' function library: RINEX VERSION 2.11 related functions. +\author Glenn D. MacGougan (GDM) +\date 2007-12-03 +\since 2007-12-02 + +\b REFERENCES \n +- http://www.aiub-download.unibe.ch/rinex/rinex211.txt + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ +#include +#include +#include +#include +#include +#include "rinex.h" +#include "gnss_error.h" +#include "time_conversion.h" +#include "constants.h" + +#define RINEX_HEADER_SIZE (32768) //!< The maximum size of a RINEX header buffer [bytes]. +#define RINEX_LINEBUF_SIZE (8192) //!< The maximum size of a string used in RINEX decoding [bytes]. +#define RINEX_MAX_NR_SATS (64) //!< The maximum array size for "struct_RINEX_satellite RINEX_sat[RINEX_MAX_NR_SATS]". +#define RINEX_MAX_NR_OBS (64) //!< The maximum array size for "struct_RINEX_obs RINEX_obs[RINEX_MAX_NR_OBS]". + + + +static const double RINEX_MIN_URA[16] = {0.00, 2.40, 3.40, 4.85, 6.85, 9.65, 13.65, 24.00, 48.00, 96.00, 192.00, 384.00, 768.00, 1536.00, 3072.00, 6144.00}; +static const double RINEX_MAX_URA[16] = {2.40, 3.40, 4.85, 6.85, 9.65, 13.65, 24.00, 48.00, 96.00, 192.0, 384.00, 768.00, 1536.00, 3072.00, 6144.00, 1.0e100}; + + + +/// A container for a single RINEX data observation. +typedef struct +{ + unsigned char loss_of_lock_indicator; //!< The loss of lock indicator (0-7). + unsigned char signal_strength; //!< The sign strength (1-9). + double value; //!< The data value of the observation. + RINEX_enumObservationType type; //!< The type of observation. + GNSS_enumSystem system; //!< The GNSS system. + unsigned short id; //!< The satellite id. + BOOL isValid; //!< A boolean indicating if this observation is valid (The value could be zero or blank). +} struct_RINEX_obs; + +/// A container for a single RINEX satellite descriptor. +typedef struct +{ + RINEX_enumSatelliteSystemType type; + unsigned short id; +} struct_RINEX_satellite; + + +/// A static function to trim the whitespace from the left and right of a C string. +static BOOL RINEX_trim_left_right( + char* str, //!< (input/output) The input C string. + unsigned max_length, //!< (input) The maximum length of the input string. + unsigned *str_length //!< (output) The length of the string after trimming the whitespace. + ); + +/// A static function to get the header lines indicated by the record descriptor. +static BOOL RINEX_get_header_lines( + const char* header, //!< (input) The full RINEX header buffer. + const unsigned header_size, //!< (input) The size of the valid data in the RINEX header buffer. + const char* record_desciptor, //!< (input) The record descriptor. e.g. "RINEX VERSION / TYPE" + char* lines_buffer, //!< (output) The output buffer. + const unsigned max_lines_buffer, //!< (input) The maximum size of the output buffer. + unsigned* nr_lines //!< (output) The number of lines read that correspond to the record descriptor. + ); + +/// A static function to erase a substring from a string. +static BOOL RINEX_erase( + char *erase_me, //!< (input) Erase this string from the input string. + char* str //!< (input/output) The input C string. + ); + +/// A static function to decode the "# / TYPES OF OBSERV" part of the RINEX OBS header. +static BOOL RINEX_GetObservationTypes( + const char* header_buffer, //!< (input) The full RINEX header buffer. + const unsigned header_buffer_size, //!< (input) The size of the valid data in the RINEX header buffer. + RINEX_structDecodedHeader* header //!< (input/output) The container for decoded header information. + ); + + +/// \brief A static function to interpret special records +/// (embedded Header records within the observation data). +/// This function is called when the epoch flag is greater than 1. +static BOOL RINEX_DealWithSpecialRecords( + FILE* fid, //!< (input) An open (not NULL) file pointer to the RINEX data. + RINEX_structDecodedHeader* RINEX_header, //!< (input/output) The decoded RINEX header information. The wavelength markers can change as data is decoded. + BOOL *wasEndOfFileReached, //!< Has the end of the file been reached (output). + unsigned *filePosition, //!< The file position for the start of the message found (output). + const unsigned nr_special_records //!< The number of special records. + ); + +/// \brief Decode the next observation set for one satellite from the file. +static BOOL RINEX_GetNextObserationSetForOneSatellite( + FILE* fid, //!< (input) An open (not NULL) file pointer to the RINEX data. + RINEX_structDecodedHeader* RINEX_header, //!< (input/output) The decoded RINEX header information. The wavelength markers can change as data is decoded. + BOOL *wasEndOfFileReached, //!< (input/output) Has the end of the file been reached. + unsigned *filePosition, //!< (input/output) The file position for the start of the message found (output). + struct_RINEX_obs* RINEX_obs, //!< (input/output) A pointer to the array of RINEX observations. + const unsigned RINEX_max_nr_obs, //!< (input) The maximum size of the RINEX_obs array. + unsigned *RINEX_nr_obs, //!< (output) The number of valid obs in the RINEX_obs array. + const RINEX_enumSatelliteSystemType sattype, //!< (input) The satellite type. + const unsigned short id //!< (input) The satellite id. + ); + +/// \brief A static function to replace float values exponents denoted with 'D' with 'E'. +static BOOL RINEX_ReplaceDwithE( char *str, const unsigned length ); + + +/** +\brief A static function to convert URA in meters to the URA index. +\author Glenn D. MacGougan + +\n REFERENCES \n +- GPS ICD 200C, p83. section 20.3.3.3.1.3 +*/ +static BOOL RINEX_ConvertURA_meters_to_URA_index( + double ura_m, //!< The user range accuracy [m]. + unsigned char *ura //!< The user range accuracy index. + ); + + + +/** +\brief Convert RINEX signal strength to Carrier to Noise Density Ratio (CNo). +The conversion from RINEX signal strength to Carrier to Noise Density Ratio (CNo) +is ad-hoc. We will use the NovAtel OEM4 definition for CNo (dB-Hz). Nominally, +NovAtel maintains phase lock above 28 dB-Hz and a reasonable maximum signal strength +occurs at about 50 dB-Hz. We'll map linearly using 5 to 9 signals strength mapping to +28 to 50 dB-Hz. (50-28)/(9-5) = (y-28)/(x-5) where x is known, solve for y. +y = 5.5x+0.5. + +\author Glenn D. MacGougan +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +static BOOL RINEX_ConvertSignalStrengthToUsableCNo( + float *cno, //!< (input/output) The carrier to noise density ratio (dB-Hz) + const unsigned char signal_strength + ); + + + +BOOL RINEX_trim_left_right( + char* str, //!< (input) The input C string. + unsigned max_length, //!< (input) The maximum length of the input string. + unsigned *str_length //!< (output) The length of the string after trimming the whitespace. + ) +{ + int i = 0; + int j = 0; + int start = 0; + size_t length = 0; + if( str == NULL ) + { + GNSS_ERROR_MSG( "if( str == NULL )" ); + return FALSE; + } + if( str_length == NULL ) + { + GNSS_ERROR_MSG( "if( str_length == NULL )" ); + return FALSE; + } + + // Remove leading whitesapce + length = strlen( str ); + if( length > max_length ) + { + GNSS_ERROR_MSG( "if( length > max_length )" ); + return FALSE; + } + if( length == 0 ) + { + GNSS_ERROR_MSG( "if( length == 0 )" ); + return TRUE; + } + + for( i = 0; i < (int)length; i++ ) + { + if( isspace(str[i]) ) + continue; + else + break; + } + start = i; + i = 0; + for( j = start; j < (int)length; j++ ) + { + str[i] = str[j]; + i++; + } + str[i] = '\0'; + + // Remove trailing whitespace. + length = strlen( str ); + for( i = (int)(length-1); i > 0; i-- ) + { + if( isspace(str[i]) ) + { + str[i] = '\0'; + } + else + { + break; + } + } + + length = strlen( str ); + *str_length = (unsigned)length; + + return TRUE; +} + + +BOOL RINEX_get_header_lines( + const char* header_buffer, //!< (input) The full RINEX header buffer. + const unsigned header_size, //!< (input) The size of the valid data in the RINEX header buffer. + const char* record_desciptor, //!< (input) The record descriptor. e.g. "RINEX VERSION / TYPE" + char* lines_buffer, //!< (output) The output buffer. + const unsigned max_lines_buffer, //!< (input) The maximum size of the output buffer. + unsigned* nr_lines //!< (output) The number of lines read that correspond to the record descriptor. + ) +{ + char *pch = NULL; + char *strptr = NULL; + unsigned i = 0; + int j = 0; + int record_descriptor_index = 0; + int scount = 0; + unsigned nr_valid_header_lines = 0; + size_t length_record_desciptor = 0; + + typedef struct + { + char str[128]; // RINEX header strings should be 80 chars. + size_t length; + } struct_header_line_token; + + struct_header_line_token token[256]; + char buffer[RINEX_HEADER_SIZE]; + + if( header_buffer == NULL ) + { + GNSS_ERROR_MSG( "if( header_buffer == NULL )" ); + return FALSE; + } + if( header_size == 0 ) + { + GNSS_ERROR_MSG( "if( header_size == 0 )" ); + return FALSE; + } + if( record_desciptor == NULL ) + { + GNSS_ERROR_MSG( "if( record_desciptor == NULL )" ); + return FALSE; + } + if( lines_buffer == NULL ) + { + GNSS_ERROR_MSG( "if( lines_buffer == NULL )" ); + return FALSE; + } + if( nr_lines == NULL ) + { + GNSS_ERROR_MSG( "if( nr_lines == NULL )" ); + return FALSE; + } + + if( header_size+1 > RINEX_HEADER_SIZE ) + { + GNSS_ERROR_MSG( "if( header_size+1 > RINEX_HEADER_SIZE )" ); + return FALSE; + } + + memcpy( buffer, header_buffer, header_size ); + buffer[header_size] = '\0'; + + *nr_lines = 0; + + length_record_desciptor = strlen( record_desciptor ); + if( length_record_desciptor == 0 ) + { + GNSS_ERROR_MSG( "if( length_record_desciptor == 0 )" ); + return FALSE; + } + + strptr = strstr( header_buffer, record_desciptor ); + if( strptr == NULL ) + { + return TRUE; // No line found with this descriptor at all. + } + + // Tokenize the copied input buffer. + pch = strtok( buffer,"\r\n"); + while( pch != NULL ) + { + strptr = strstr( pch, record_desciptor ); + if( strptr != NULL ) + { + token[i].length = strlen( pch ); + if( token[i].length < 128 ) + { + strcpy( token[i].str, pch ); + i++; + } + } + pch = strtok (NULL, "\r\n"); + } + nr_valid_header_lines = i; + + if( nr_valid_header_lines == 0 ) + { + GNSS_ERROR_MSG( "if( nr_valid_header_lines == 0 )" ); + return FALSE; + } + + // Search the tokenized strings (lines) for the record descriptor. + for( i = 0; i < nr_valid_header_lines; i++ ) + { + strptr = strstr( token[i].str, record_desciptor ); + if( strptr != NULL ) + { + // check where it was found in the line. + record_descriptor_index = (int)(strptr - token[i].str); + + if( record_descriptor_index != 60 ) + { + // record decriptor must be at columns 61-80 + // either extra/missing space(s) or the record descriptor is + // present within a COMMENT line. + + if( strcmp( record_desciptor, "COMMENT" ) == 0 ) + { + // possible COMMENT repeated on same line. + // ok to decode this line for this record descriptor + } + else + { + // Check if within a comment line. + strptr = strstr( token[i].str, "COMMENT" ); + if( strptr != NULL ) + { + j = (int)(strptr - token[i].str); + if( j == 60 ) + { + // This is a comment line. + continue; + } + else + { + // strange record, ignore + continue; + } + } + else + { + // This is likely a few missing or extra spaces. + if( record_descriptor_index > 55 && record_descriptor_index < 65 ) + { + // OK to decode this line for this record descriptor. + } + else + { + // too many extra spaces + continue; + } + } + } + } + + // Add this line to the lines_buffer. + if( (scount + token[i].length + 1) >= max_lines_buffer ) + { + GNSS_ERROR_MSG( "if( (scount + token[i].length + 1) >= max_lines_buffer )" ); + return FALSE; + } + + scount += sprintf( lines_buffer+scount, "%s\n", token[i].str ); + *nr_lines += 1; + } + } + return TRUE; +} + + +BOOL RINEX_erase( + char *erase_me, //!< (input) Erase this string from the input string. + char* str //!< (input/output) The input C string. + ) +{ + int i = 0; + int j = 0; + char *strptr = NULL; + size_t len = 0; + size_t len_erase_me = 0; + + if( erase_me == NULL ) + { + GNSS_ERROR_MSG( "if( erase_me == NULL )" ); + return FALSE; + } + if( str == NULL ) + { + GNSS_ERROR_MSG( "if( str == NULL )" ); + return FALSE; + } + + len_erase_me = strlen( erase_me ); + if( len_erase_me == 0 ) + return TRUE; + + len = strlen(str); + if( len == 0 ) + return TRUE; + + if( len_erase_me > len ) + return TRUE; + + strptr = strstr( str, erase_me ); + + while( strptr != NULL ) + { + j = (int)(strptr - str); // start of the string to be erased + i = j + (int)len_erase_me; // end of the string to be erased + + for( ; i < (int)len; i++ ) + { + str[j] = str[i]; + if( str[j] == '\0' ) + break; + j++; + } + str[j] = '\0'; + len = strlen(str); + + strptr = strstr( str, erase_me ); + } + return TRUE; +} + + +// static +BOOL RINEX_GetObservationTypes( + const char* header_buffer, //!< (input) The full RINEX header buffer. + const unsigned header_buffer_size, //!< (input) The size of the valid data in the RINEX header buffer. + RINEX_structDecodedHeader* header //!< (input/output) The container for decoded header information. + ) +{ + char lines_buffer[RINEX_LINEBUF_SIZE]; + unsigned nr_lines = 0; + BOOL result; + char *pch = NULL; + unsigned count = 0; + char token[128]; + unsigned len=0; + BOOL isFirst = TRUE; + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "# / TYPES OF OBSERV", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + // strip the record description from the string + result = RINEX_erase( "# / TYPES OF OBSERV", lines_buffer ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_erase returned FALSE." ); + return FALSE; + } + + // Determine the number of observation types. + if( sscanf( lines_buffer, "%u", &(header->nr_obs_types) ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + + // Clean up the string a little. + result = RINEX_trim_left_right( lines_buffer, RINEX_LINEBUF_SIZE, &len ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_trim_left_right returned FALSE." ); + return FALSE; + } + + // Tokenize the string. + pch = strtok( lines_buffer, " \t\r\n\f" ); + while( pch != NULL && count < header->nr_obs_types ) + { + if( !isFirst ) + { + strcpy( token, pch ); + result = RINEX_trim_left_right( token, 128, &len ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_trim_left_right returned FALSE." ); + return FALSE; + } + if( strlen(token) > 0 ) + { + if( strcmp( token, "L1" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_L1; + else if( strcmp( token, "L2" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_L2; + else if( strcmp( token, "C1" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_C1; + else if( strcmp( token, "P1" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_P1; + else if( strcmp( token, "P2" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_P2; + else if( strcmp( token, "D1" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_D1; + else if( strcmp( token, "D2" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_D2; + else if( strcmp( token, "T1" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_T1; + else if( strcmp( token, "T2" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_T2; + else if( strcmp( token, "S1" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_S1; + else if( strcmp( token, "S2" ) == 0 ) + header->obs_types[count] = RINEX_OBS_TYPE_S2; + else + header->obs_types[count] = RINEX_OBS_TYPE_UNKNOWN; + + count++; + } + } + pch = strtok (NULL, " ,.-"); + isFirst = FALSE; + } + + if( count != header->nr_obs_types ) + { + GNSS_ERROR_MSG( "if( count != header->nr_obs_types )" ); + return FALSE; + } + + return TRUE; +} + + +BOOL RINEX_DealWithSpecialRecords( + FILE* fid, //!< (input) An open (not NULL) file pointer to the RINEX data. + RINEX_structDecodedHeader* RINEX_header, //!< (input/output) The decoded RINEX header information. The wavelength markers can change as data is decoded. + BOOL *wasEndOfFileReached, //!< Has the end of the file been reached (output). + unsigned *filePosition, //!< The file position for the start of the message found (output). + const unsigned nr_special_records //!< The number of special records. + ) +{ + char line_buffer[RINEX_LINEBUF_SIZE]; + BOOL result = FALSE; + size_t length = 0; + unsigned i = 0; + + if( fid == NULL ) + { + GNSS_ERROR_MSG( "if( fid == NULL )" ); + return FALSE; + } + if( RINEX_header == NULL ) + { + GNSS_ERROR_MSG( "if( RINEX_header == NULL )" ); + return FALSE; + } + if( wasEndOfFileReached == NULL ) + { + GNSS_ERROR_MSG( "if( wasEndOfFileReached == NULL )" ); + return FALSE; + } + if( filePosition == NULL ) + { + GNSS_ERROR_MSG( "if( filePosition == NULL )" ); + return FALSE; + } + + // check nothing to do. + if( nr_special_records == 0 ) + return TRUE; + + for( i = 0; i < nr_special_records; i++ ) + { + + if( fgets( line_buffer, RINEX_LINEBUF_SIZE, fid ) == NULL ) + { + if( feof(fid) ) + { + *wasEndOfFileReached = TRUE; + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + } + *filePosition = ftell(fid); + + if( strstr(line_buffer, "COMMENT") != NULL ) + { + // This line is a comment. Ignore and continue. + } + else if( strstr(line_buffer, "WAVELENGTH FACT L1/2") != NULL ) + { + // The wavelength factors have changed for some satellites. + + // GDM todo deal with these changes + } + else if( strstr(line_buffer, "MARKER NAME") != NULL ) + { + // The marker name has changed. + result = RINEX_erase("MARKER NAME", line_buffer); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_erase returned FALSE." ); + return FALSE; + } + result = RINEX_trim_left_right(line_buffer, RINEX_LINEBUF_SIZE, (unsigned *)&length ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_trim_left_right returned FALSE." ); + return FALSE; + } + if( length < 64 ) + { + strcpy(RINEX_header->marker_name, line_buffer); + } + else + { + GNSS_ERROR_MSG( "length > 64" ); + return FALSE; + } + } + else if( strstr(line_buffer, "MARKER NUMBER") != NULL ) + { + // ignore for now + } + else if( strstr(line_buffer, "ANTENNA: DELTA H/E/N") != NULL ) + { + if( sscanf( line_buffer, "%lf %lf %lf", + &(RINEX_header->antenna_delta_h), + &(RINEX_header->antenna_ecc_e), + &(RINEX_header->antenna_ecc_n) ) != 3 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + } + else if( strstr(line_buffer, "APPROX POSITION XYZ") != NULL ) + { + if( sscanf( line_buffer, "%lf %lf %lf", + &(RINEX_header->x), + &(RINEX_header->y), + &(RINEX_header->z) ) != 3 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + } + else + { + // The rest not handled yet. + } + } + return TRUE; +} + + +//static +BOOL RINEX_GetNextObserationSetForOneSatellite( + FILE* fid, //!< (input) An open (not NULL) file pointer to the RINEX data. + RINEX_structDecodedHeader* RINEX_header, //!< (input/output) The decoded RINEX header information. The wavelength markers can change as data is decoded. + BOOL *wasEndOfFileReached, //!< (input/output) Has the end of the file been reached. + unsigned *filePosition, //!< (input/output) The file position for the start of the message found (output). + struct_RINEX_obs* RINEX_obs, //!< (input/output) A pointer to the array of RINEX observations. + const unsigned RINEX_max_nr_obs, //!< (input) The maximum size of the RINEX_obs array. + unsigned *RINEX_nr_obs, //!< (output) The number of valid obs in the RINEX_obs array. + const RINEX_enumSatelliteSystemType sattype, //!< (input) The satellite type. + const unsigned short id //!< (input) The satellite id. + ) +{ + unsigned i = 0; + char line_buffer[RINEX_LINEBUF_SIZE]; + unsigned count = 0; + char str_a[15]; + char str_b[15]; + char str_c[15]; + char str_d[15]; + char str_e[15]; + + memset( str_a, 0, 15 ); + memset( str_b, 0, 15 ); + memset( str_c, 0, 15 ); + memset( str_d, 0, 15 ); + memset( str_e, 0, 15 ); + + // Check input + if( fid == NULL ) + { + GNSS_ERROR_MSG( "if( fid == NULL )" ); + return FALSE; + } + if( RINEX_header == NULL ) + { + GNSS_ERROR_MSG( "if( RINEX_header == NULL )" ); + return FALSE; + } + if( wasEndOfFileReached == NULL ) + { + GNSS_ERROR_MSG( "if( wasEndOfFileReached == NULL )" ); + return FALSE; + } + if( filePosition == NULL ) + { + GNSS_ERROR_MSG( "if( filePosition == NULL )" ); + return FALSE; + } + if( RINEX_obs == NULL ) + { + GNSS_ERROR_MSG( "if( RINEX_obs == NULL )" ); + return FALSE; + } + if( RINEX_max_nr_obs == 0 ) + { + GNSS_ERROR_MSG( "if( RINEX_max_nr_obs == 0 )" ); + return FALSE; + } + if( RINEX_nr_obs == NULL ) + { + GNSS_ERROR_MSG( "if( RINEX_nr_obs == NULL )" ); + return FALSE; + } + if( RINEX_header->nr_obs_types >= RINEX_max_nr_obs ) + { + GNSS_ERROR_MSG( "if( RINEX_header->nr_obs_types >= RINEX_max_nr_obs )" ); + return FALSE; + } + + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + *wasEndOfFileReached = TRUE; + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + } + *filePosition = ftell(fid); + + // Set the default values to zero. + memset( RINEX_obs, 0, sizeof(struct_RINEX_obs)*RINEX_header->nr_obs_types ); + + switch( RINEX_header->nr_obs_types ) + { + case 1: + { + count = sscanf( line_buffer, "%14c%c%c", + str_a, + &RINEX_obs[0].loss_of_lock_indicator, + &RINEX_obs[0].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[0].value) ); + break; + } + case 2: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[0].loss_of_lock_indicator, + &RINEX_obs[0].signal_strength, + str_b, + &RINEX_obs[1].loss_of_lock_indicator, + &RINEX_obs[1].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[0].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[1].value) ); + break; + } + case 3: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[0].loss_of_lock_indicator, + &RINEX_obs[0].signal_strength, + str_b, + &RINEX_obs[1].loss_of_lock_indicator, + &RINEX_obs[1].signal_strength, + str_c, + &RINEX_obs[2].loss_of_lock_indicator, + &RINEX_obs[2].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[0].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[1].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[2].value) ); + break; + } + case 4: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[0].loss_of_lock_indicator, + &RINEX_obs[0].signal_strength, + str_b, + &RINEX_obs[1].loss_of_lock_indicator, + &RINEX_obs[1].signal_strength, + str_c, + &RINEX_obs[2].loss_of_lock_indicator, + &RINEX_obs[2].signal_strength, + str_d, + &RINEX_obs[3].loss_of_lock_indicator, + &RINEX_obs[3].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[0].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[1].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[2].value) ); + sscanf( str_d ,"%lf", &(RINEX_obs[3].value) ); + break; + } + case 5: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[0].loss_of_lock_indicator, + &RINEX_obs[0].signal_strength, + str_b, + &RINEX_obs[1].loss_of_lock_indicator, + &RINEX_obs[1].signal_strength, + str_c, + &RINEX_obs[2].loss_of_lock_indicator, + &RINEX_obs[2].signal_strength, + str_d, + &RINEX_obs[3].loss_of_lock_indicator, + &RINEX_obs[3].signal_strength, + str_e, + &RINEX_obs[4].loss_of_lock_indicator, + &RINEX_obs[4].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[0].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[1].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[2].value) ); + sscanf( str_d ,"%lf", &(RINEX_obs[3].value) ); + sscanf( str_e ,"%lf", &(RINEX_obs[4].value) ); + break; + } + case 6: + case 7: + case 8: + case 9: + case 10: // intentional fall thru. + { + + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[0].loss_of_lock_indicator, + &RINEX_obs[0].signal_strength, + str_b, + &RINEX_obs[1].loss_of_lock_indicator, + &RINEX_obs[1].signal_strength, + str_c, + &RINEX_obs[2].loss_of_lock_indicator, + &RINEX_obs[2].signal_strength, + str_d, + &RINEX_obs[3].loss_of_lock_indicator, + &RINEX_obs[3].signal_strength, + str_e, + &RINEX_obs[4].loss_of_lock_indicator, + &RINEX_obs[4].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[0].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[1].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[2].value) ); + sscanf( str_d ,"%lf", &(RINEX_obs[3].value) ); + sscanf( str_e ,"%lf", &(RINEX_obs[4].value) ); + + memset( str_a, 0, 15 ); + memset( str_b, 0, 15 ); + memset( str_c, 0, 15 ); + memset( str_d, 0, 15 ); + memset( str_e, 0, 15 ); + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + *wasEndOfFileReached = TRUE; + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + } + + switch( RINEX_header->nr_obs_types-5 ) + { + case 1: + { + count = sscanf( line_buffer, "%14c%c%c", + str_a, + &RINEX_obs[5].loss_of_lock_indicator, + &RINEX_obs[5].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[5].value) ); + break; + } + case 2: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[5].loss_of_lock_indicator, + &RINEX_obs[5].signal_strength, + str_b, + &RINEX_obs[6].loss_of_lock_indicator, + &RINEX_obs[6].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[5].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[6].value) ); + break; + } + case 3: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[5].loss_of_lock_indicator, + &RINEX_obs[5].signal_strength, + str_b, + &RINEX_obs[6].loss_of_lock_indicator, + &RINEX_obs[6].signal_strength, + str_c, + &RINEX_obs[7].loss_of_lock_indicator, + &RINEX_obs[7].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[5].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[6].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[7].value) ); + break; + } + case 4: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[5].loss_of_lock_indicator, + &RINEX_obs[5].signal_strength, + str_b, + &RINEX_obs[6].loss_of_lock_indicator, + &RINEX_obs[6].signal_strength, + str_c, + &RINEX_obs[7].loss_of_lock_indicator, + &RINEX_obs[7].signal_strength, + str_d, + &RINEX_obs[8].loss_of_lock_indicator, + &RINEX_obs[8].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[5].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[6].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[7].value) ); + sscanf( str_d ,"%lf", &(RINEX_obs[8].value) ); + break; + } + case 5: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[5].loss_of_lock_indicator, + &RINEX_obs[5].signal_strength, + str_b, + &RINEX_obs[6].loss_of_lock_indicator, + &RINEX_obs[6].signal_strength, + str_c, + &RINEX_obs[7].loss_of_lock_indicator, + &RINEX_obs[7].signal_strength, + str_d, + &RINEX_obs[8].loss_of_lock_indicator, + &RINEX_obs[8].signal_strength, + str_e, + &RINEX_obs[9].loss_of_lock_indicator, + &RINEX_obs[9].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[5].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[6].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[7].value) ); + sscanf( str_d ,"%lf", &(RINEX_obs[8].value) ); + sscanf( str_e ,"%lf", &(RINEX_obs[9].value) ); + break; + } + default: + { + GNSS_ERROR_MSG( "unexpected default case" ); + return FALSE; + break; + } + } + break; + } + case 11: + { + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[0].loss_of_lock_indicator, + &RINEX_obs[0].signal_strength, + str_b, + &RINEX_obs[1].loss_of_lock_indicator, + &RINEX_obs[1].signal_strength, + str_c, + &RINEX_obs[2].loss_of_lock_indicator, + &RINEX_obs[2].signal_strength, + str_d, + &RINEX_obs[3].loss_of_lock_indicator, + &RINEX_obs[3].signal_strength, + str_e, + &RINEX_obs[4].loss_of_lock_indicator, + &RINEX_obs[4].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[0].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[1].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[2].value) ); + sscanf( str_d ,"%lf", &(RINEX_obs[3].value) ); + sscanf( str_e ,"%lf", &(RINEX_obs[4].value) ); + + memset( str_a, 0, 15 ); + memset( str_b, 0, 15 ); + memset( str_c, 0, 15 ); + memset( str_d, 0, 15 ); + memset( str_e, 0, 15 ); + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + *wasEndOfFileReached = TRUE; + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + } + + count = sscanf( line_buffer, "%14c%c%c%14c%c%c%14c%c%c%14c%c%c%14c%c%c", + str_a, + &RINEX_obs[5].loss_of_lock_indicator, + &RINEX_obs[5].signal_strength, + str_b, + &RINEX_obs[6].loss_of_lock_indicator, + &RINEX_obs[6].signal_strength, + str_c, + &RINEX_obs[7].loss_of_lock_indicator, + &RINEX_obs[7].signal_strength, + str_d, + &RINEX_obs[8].loss_of_lock_indicator, + &RINEX_obs[8].signal_strength, + str_e, + &RINEX_obs[9].loss_of_lock_indicator, + &RINEX_obs[9].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[5].value) ); + sscanf( str_b, "%lf", &(RINEX_obs[6].value) ); + sscanf( str_c, "%lf", &(RINEX_obs[7].value) ); + sscanf( str_d ,"%lf", &(RINEX_obs[8].value) ); + sscanf( str_e ,"%lf", &(RINEX_obs[9].value) ); + + memset( str_a, 0, 15 ); + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + *wasEndOfFileReached = TRUE; + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + } + + count = sscanf( line_buffer, "%14c%c%c", + str_a, + &RINEX_obs[10].loss_of_lock_indicator, + &RINEX_obs[10].signal_strength + ); + sscanf( str_a, "%lf", &(RINEX_obs[10].value) ); + break; + } + default: + { + GNSS_ERROR_MSG( "unexpected default case" ); + return FALSE; + break; + } + } + + for( i = 0; i < RINEX_header->nr_obs_types; i++ ) + { + // Zero values denote invalid observations. + if( RINEX_obs[i].value == 0 ) + { + RINEX_obs[i].isValid = FALSE; + } + else + { + RINEX_obs[i].isValid = TRUE; + } + + switch( RINEX_obs[i].loss_of_lock_indicator ) + { + case '0': RINEX_obs[i].loss_of_lock_indicator = 0; break; + case '1': RINEX_obs[i].loss_of_lock_indicator = 1; break; + case '2': RINEX_obs[i].loss_of_lock_indicator = 2; break; + case '3': RINEX_obs[i].loss_of_lock_indicator = 3; break; + case '4': RINEX_obs[i].loss_of_lock_indicator = 4; break; + case '5': RINEX_obs[i].loss_of_lock_indicator = 5; break; + case '6': RINEX_obs[i].loss_of_lock_indicator = 6; break; + case '7': RINEX_obs[i].loss_of_lock_indicator = 7; break; + default: RINEX_obs[i].loss_of_lock_indicator = 0; break; + } + + switch( RINEX_obs[i].signal_strength ) + { + case '0': RINEX_obs[i].signal_strength = 0; break; + case '1': RINEX_obs[i].signal_strength = 1; break; + case '2': RINEX_obs[i].signal_strength = 2; break; + case '3': RINEX_obs[i].signal_strength = 3; break; + case '4': RINEX_obs[i].signal_strength = 4; break; + case '5': RINEX_obs[i].signal_strength = 5; break; + case '6': RINEX_obs[i].signal_strength = 6; break; + case '7': RINEX_obs[i].signal_strength = 7; break; + case '8': RINEX_obs[i].signal_strength = 8; break; + case '9': RINEX_obs[i].signal_strength = 9; break; + default: RINEX_obs[i].signal_strength = 0; break; + } + + RINEX_obs[i].type = RINEX_header->obs_types[i]; + + switch( sattype ) + { + case RINEX_SATELLITE_SYSTEM_GPS: + { + RINEX_obs[i].system = GNSS_GPS; + RINEX_obs[i].id = id; + break; + } + case RINEX_SATELLITE_SYSTEM_GLO: + { + RINEX_obs[i].system = GNSS_GLONASS; + RINEX_obs[i].id = id; // GLONASS slot number. + break; + } + case RINEX_SATELLITE_SYSTEM_GEO: + { + RINEX_obs[i].system = GNSS_WAAS; + RINEX_obs[i].id = id + 100; + break; + } + case RINEX_SATELLITE_SYSTEM_NSS: + { + continue; break; // Not supported. Ignore the data from this source. Continue to outer for loop. + } + default: + { + continue; break; // Not supported. Ignore the data from this source. Continue to outer for loop. + } + } + } + + *RINEX_nr_obs = RINEX_header->nr_obs_types; + + return TRUE; +} + + +BOOL RINEX_ConvertSignalStrengthToUsableCNo( + float *cno, //!< (input/output) The carrier to noise density ratio (dB-Hz) + const unsigned char signal_strength //!< (input) The RINEX signal strength indicator (0-9). + ) +{ + if( cno == NULL ) + { + GNSS_ERROR_MSG( "if( cno == NULL )" ); + return FALSE; + } + + if( signal_strength > 0 && signal_strength < 10 ) + { + *cno = 5.5f*signal_strength + 0.5f; + } + return TRUE; +} + + +BOOL RINEX_GetHeader( + const char* filepath, //!< Path to the RINEX file. + char* buffer, //!< (input/output) A character buffer in which to place the RINEX header. + const unsigned buffer_max_size, //!< (input) The maximum size of the buffer [bytes]. This value should be large enough to hold the entire header, (8192 to 16384). + unsigned *buffer_size, //!< (output) The length of the header data placed in the buffer [bytes]. + double *version, //!< (output) The RINEX version number. e.g. 1.0, 2.0, 2.2, 3.0, etc. + RINEX_enumFileType *file_type //!< (output) The RINEX file type. + ) +{ + FILE* fid = NULL; // A file pointer for the RINEX file. + char line_buffer[1024]; // A container for one line of the header. + char *strptr = NULL; // A pointer to a string. + BOOL end_of_header_found = FALSE; // A boolean to indicate if the end of header was found. + char type_char; + + size_t line_length = 0; // The length of one line. + unsigned scount = 0; // A counter/index used to compose the header buffer. + + fid = fopen( filepath, "r" ); + if( fid == NULL ) + { + GNSS_ERROR_MSG( "if( fid == NULL )" ); + return FALSE; + } + + // The first line of the file must be the RINEX VERSION / TYPE + if( fgets( line_buffer, 1024, fid ) == NULL ) + { + GNSS_ERROR_MSG( "fgets failed" ); + fclose(fid); + return FALSE; + } + strptr = strstr( line_buffer, "RINEX VERSION / TYPE" ); + if( strptr == NULL ) + { + GNSS_ERROR_MSG( "strstr failed." ); + fclose(fid); + return FALSE; + } + + // Add the first line to the buffer + line_length = strlen( line_buffer ); + if( scount+line_length >= buffer_max_size ) + { + GNSS_ERROR_MSG( "if( scount+line_length >= buffer_max_size )" ); + fclose(fid); + return FALSE; + } + scount += sprintf( buffer+scount, "%s", line_buffer ); + + // Extract the RINEX version and type. + if( sscanf( line_buffer, "%lf %c", version, &type_char ) != 2 ) + { + GNSS_ERROR_MSG( "sscanf failed" ); + fclose(fid); + return FALSE; + } + *file_type = (RINEX_enumFileType)type_char; + + do + { + if( fgets( line_buffer, 1024, fid ) == NULL ) + break; + + if( strstr( line_buffer, "END OF HEADER" ) != NULL ) + { + end_of_header_found = TRUE; + } + + // Add the line of the buffer. + line_length = strlen( line_buffer ); + if( scount+line_length >= buffer_max_size ) + { + GNSS_ERROR_MSG( "if( scount+line_length >= buffer_max_size )" ); + fclose(fid); + return FALSE; + } + scount += sprintf( buffer+scount, "%s", line_buffer ); + + }while( !end_of_header_found ); + + if( end_of_header_found ) + { + *buffer_size = scount; + fclose(fid); + return TRUE; + } + else + { + GNSS_ERROR_MSG( "End of RINEX header not found." ); + fclose(fid); + return FALSE; + } +} + + + +BOOL RINEX_DecodeHeader_ObservationFile( + const char* header_buffer, //!< (input) The character buffer containing the RINEX header. + const unsigned header_buffer_size, //!< (input) The size of the character buffer containing the RINEX header [bytes]. Not the maximum size, the size of the valid data in the buffer. + RINEX_structDecodedHeader* header //!< (output) The decoded header data. + ) +{ + BOOL result = FALSE; + char lines_buffer[RINEX_LINEBUF_SIZE]; + unsigned nr_lines = 0; + char rinex_type_char = 0; + char time_system_str[128]; + unsigned len = 0; + int itmp[5]; + + if( header_buffer == NULL ) + { + GNSS_ERROR_MSG( "if( header_buffer == NULL )" ); + return FALSE; + } + if( header_buffer_size == 0 ) + { + GNSS_ERROR_MSG( "if( header_buffer_size == 0 )" ); + return FALSE; + } + if( header == NULL ) + { + GNSS_ERROR_MSG( "if( header == NULL )" ); + return FALSE; + } + + memset( header, 0, sizeof(RINEX_structDecodedHeader) ); + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "RINEX VERSION / TYPE", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines != 1 ) + { + GNSS_ERROR_MSG( "if( nr_lines != 1 )" ); + return FALSE; + } + if( sscanf( lines_buffer, "%lf %c", &(header->version), &rinex_type_char ) != 2 ) + { + GNSS_ERROR_MSG( "sscanf failed" ); + return FALSE; + } + header->type = (RINEX_enumFileType)rinex_type_char; + + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "MARKER NAME", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines != 1 ) + { + GNSS_ERROR_MSG( "if( nr_lines != 1 )" ); + return FALSE; + } + result = RINEX_erase("MARKER NAME", lines_buffer); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_erase returned FALSE." ); + return FALSE; + } + result = RINEX_trim_left_right(lines_buffer, RINEX_LINEBUF_SIZE, &len ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_trim_left_right returned FALSE" ); + return FALSE; + } + if( len < 64 ) + { + strcpy(header->marker_name, lines_buffer); + } + else + { + GNSS_ERROR_MSG( "if( len < 64 )" ); + return FALSE; + } + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "APPROX POSITION XYZ", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines" ); + return FALSE; + } + if( nr_lines == 1 ) + { + if( sscanf( lines_buffer, "%lf %lf %lf", &(header->x), &(header->y), &(header->z) ) != 3 ) + { + GNSS_ERROR_MSG( "sscanf failed" ); + return FALSE; + } + } + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "ANTENNA: DELTA H/E/N", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines != 1 ) + { + GNSS_ERROR_MSG( "if( nr_lines != 1 )" ); + return FALSE; + } + if( sscanf( lines_buffer, "%lf %lf %lf", &(header->antenna_delta_h), &(header->antenna_ecc_e), &(header->antenna_ecc_n) ) != 3 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "WAVELENGTH FACT L1/2", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines == 1 ) + { + // Only default values specified. + if( sscanf( lines_buffer, "%d %d", (int *)&(header->default_wavefactor_L1), (int *)&(header->default_wavefactor_L2) ) != 2 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + } + else + { + // First read the default values specified. + if( sscanf( lines_buffer, "%d %d", (int *)&(header->default_wavefactor_L1), (int *)&(header->default_wavefactor_L2) ) != 2 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + + //GDM_TODO deal with multiline WAVELENTH FACT L1/2 + } + + result = RINEX_GetObservationTypes( header_buffer, header_buffer_size, header ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_GetObservationTypes returned FALSE." ); + return FALSE; + } + + + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "INTERVAL", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines == 1 ) + { + if( sscanf( lines_buffer, "%lf", &(header->interval) ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + if( header->interval <= 0 ) + header->interval = -1; // Set to unknown value. + } + else + { + header->interval = -1; // Set to unknown value. + } + + + + result = RINEX_get_header_lines( + header_buffer, + header_buffer_size, + "TIME OF FIRST OBS", + lines_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + + if( sscanf( lines_buffer, "%d %d %d %d %d %f %s", + &(itmp[0]), + &(itmp[1]), + &(itmp[2]), + &(itmp[3]), + &(itmp[4]), + &(header->time_of_first_obs.seconds), + time_system_str ) != 7 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + header->time_of_first_obs.year = (unsigned short)itmp[0]; + header->time_of_first_obs.month = (unsigned char)itmp[1]; + header->time_of_first_obs.day = (unsigned char)itmp[2]; + header->time_of_first_obs.hour = (unsigned char)itmp[3]; + header->time_of_first_obs.minute = (unsigned char)itmp[4]; + + + result = RINEX_trim_left_right( time_system_str, 128, &len ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_trim_left_right returned FALSE." ); + return FALSE; + } + if( strcmp( time_system_str, "TIME") == 0 ) // no string present, defaults to GPS + header->time_of_first_obs.time_system = RINEX_TIME_SYSTEM_GPS; + else if( strcmp( time_system_str, "GPS" ) == 0 ) + header->time_of_first_obs.time_system = RINEX_TIME_SYSTEM_GPS; + else if( strcmp( time_system_str, "GLO" ) == 0 ) + header->time_of_first_obs.time_system = RINEX_TIME_SYSTEM_GLO; + else + header->time_of_first_obs.time_system = RINEX_TIME_SYSTEM_UNKNOWN; + + return TRUE; +} + + + + +BOOL RINEX_GetNextObservationSet( + FILE* fid, //!< (input) An open (not NULL) file pointer to the RINEX data. + RINEX_structDecodedHeader* RINEX_header, //!< (input/output) The decoded RINEX header information. The wavelength markers can change as data is decoded. + BOOL *wasEndOfFileReached, //!< Has the end of the file been reached (output). + BOOL *wasObservationFound, //!< Was a valid observation found (output). + unsigned *filePosition, //!< The file position for the start of the message found (output). + GNSS_structMeasurement* obsArray, //!< A pointer to a user provided array of GNSS_structMeasurement (input/output). + const unsigned char maxNrObs, //!< The maximum number of elements in the array provided (input). + unsigned *nrObs, //!< The number of valid elements set in the array (output). + unsigned short* rx_gps_week, //!< The receiver GPS week (0-1024+) [weeks]. + double* rx_gps_tow //!< The receiver GPS time of week (0-603799.99999) [s]. + ) +{ + char line_buffer[RINEX_LINEBUF_SIZE]; // A character buffer to hold a line from the RINEX file. + size_t length = 0; // A string length. + RINEX_TIME epoch; // The RINEX time. + RINEX_enumEpochFlag epoch_flag; // A RINEX epoch flag. + char *pch = NULL; // A string pointer used in tokenizing a C string. + unsigned count = 0; // A counter. + int itmp = 0; // A temporary integer. + int i = 0; // A counter. + int j = 0; // A counter. + int obsArray_index = 0; // A counter. + char numstr[64]; // A string to hold a number. + char tmpstr[128]; // A temporary string. + BOOL isL1data_present = FALSE; + BOOL isL2data_present = FALSE; + BOOL overwriteCNoL1 = TRUE; + BOOL overwriteCNoL2 = TRUE; + BOOL isEpochValidToDecode = FALSE; + BOOL isContinuationLinePresent = FALSE; + int nr_special_records = 0; + + double tow = 0; // A time of week (0-604399.99999) [s]. + unsigned short week = 0; // The GPS week (0-1024+) [weeks]. + + RINEX_enumSatelliteSystemType next_sat_type = RINEX_SATELLITE_SYSTEM_UNKNOWN; + + + typedef struct + { + char str[128]; + size_t length; + BOOL isValid; + } struct_token; + struct_token token[64]; // An array of string tokens. + unsigned nr_tokens = 0; // The number of valid tokens. + + struct_RINEX_satellite RINEX_sat[RINEX_MAX_NR_SATS]; + unsigned RINEX_sat_index = 0; // The index into RINEX_sat. + unsigned RINEX_nr_satellites = 0; // The number of valid values in the RINEX_sat array. + + struct_RINEX_obs RINEX_obs[RINEX_MAX_NR_OBS]; + unsigned RINEX_obs_index = 0; // The index into RINEX_obs. + unsigned RINEX_nr_obs = 0; // The number of valid obs in RINEX_obs array. + + BOOL result; + + numstr[0] = '\0'; + numstr[1] = '\0'; + numstr[2] = '\0'; + numstr[3] = '\0'; + + // Check the input. + if( fid == NULL ) + { + GNSS_ERROR_MSG( "if( fid == NULL )" ); + return FALSE; + } + if( wasEndOfFileReached == NULL ) + { + GNSS_ERROR_MSG( "if( wasEndOfFileReached == NULL )" ); + return FALSE; + } + if( wasObservationFound == NULL ) + { + GNSS_ERROR_MSG( "if( wasObservationFound == NULL )" ); + return FALSE; + } + if( filePosition == NULL ) + { + GNSS_ERROR_MSG( "if( filePosition == NULL )" ); + return FALSE; + } + if( obsArray == NULL ) + { + GNSS_ERROR_MSG( "if( obsArray == NULL )" ); + return FALSE; + } + if( nrObs == NULL ) + { + GNSS_ERROR_MSG( "if( nrObs == NULL )" ); + return FALSE; + } + if( RINEX_header->type != RINEX_FILE_TYPE_OBS ) + { + GNSS_ERROR_MSG( "if( RINEX_header->type != RINEX_FILE_TYPE_OBS )" ); + return FALSE; + } + + *wasObservationFound = FALSE; + *wasEndOfFileReached = FALSE; + + // Set the token array to zero. + memset( token, 0, sizeof(struct_token)*RINEX_MAX_NR_SATS ); + + // Set the RINEX_obs array to zero. + memset( RINEX_obs, 0, sizeof(struct_RINEX_obs)*RINEX_MAX_NR_OBS ); + + // The epoch's tme system type is the same as the header's time of first RINEX_obs. + epoch.time_system = RINEX_header->time_of_first_obs.time_system; + + if( epoch.time_system != RINEX_TIME_SYSTEM_GPS ) + { + // Not supported for now! + GNSS_ERROR_MSG( "if( epoch.time_system != RINEX_TIME_SYSTEM_GPS ) - NOT SUPPORTED YET." ); + return FALSE; + } + + // Read in the RINEX epoch, epoch flag, and satellite ids string. + do + { + do // advance over empty lines if any + { + if( fgets( line_buffer, RINEX_LINEBUF_SIZE, fid ) == NULL ) + { + if( feof(fid) ) + { + *wasEndOfFileReached = TRUE; + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + } + result = RINEX_trim_left_right( line_buffer, RINEX_LINEBUF_SIZE, (unsigned *)&length ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_trim_left_right returned FALSE." ); + return FALSE; + } + }while( length == 0 ); + + if( length == 0 ) + { + GNSS_ERROR_MSG( "if( length == 0 )" ); + return FALSE; + } + + // To make life easier later: + // Search and replace "G ", "R ", "T ", "S " with + // "G_", "R_", "T_", "S_" + // These are the satellite ids. + for( i = 0; i < (int)(length-1); i++ ) + { + if( line_buffer[i] == 'G' || line_buffer[i] == 'R' || line_buffer[i] == 'T' || line_buffer[i] == 'S' ) + { + if( line_buffer[i+1] == ' ' ) + { + line_buffer[i+1] = '_'; + } + } + } + + // Tokenize the input line buffer. + pch = strtok( line_buffer, " \t\r\n\f" ); + nr_tokens = 0; + while( pch != NULL && count < 64 ) + { + token[nr_tokens].length = strlen(pch); + if( token[nr_tokens].length < 128 ) + { + strcpy( token[nr_tokens].str, pch ); + token[nr_tokens].isValid = TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected." ); + return FALSE; + } + + pch = strtok( NULL, " \t\r\n\f" ); + nr_tokens++; + } + if( nr_tokens >= 64 ) + { + GNSS_ERROR_MSG( "if( nr_tokens >= 64 )" ); + return FALSE; + } + + // For events without significant epoch the epoch fields can be left blank. + // Thus, there are a few cases: + // (a) No epoch information, 2 integers (an event flag and the nr_special_records to follow 0-999). + // (b) All the epoch information + (a) (year month day hour minute seconds epoch_flag nr_special_records) + // (c) All the epoch information, epoch flag, number of satellites, the satellite list, and optionally the rx clock offset. + if( nr_tokens == 2 ) + { + // This can only indicate a epoch flag with a number of special records to follow. + // Read in the epoch flag and the number of special records to follow. + if( sscanf( token[0].str, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + epoch_flag = (RINEX_enumEpochFlag)itmp; + + if( sscanf( token[1].str, "%d", &nr_special_records ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + + // Deal with special records if any + result = RINEX_DealWithSpecialRecords( + fid, + RINEX_header, + wasEndOfFileReached, + filePosition, + nr_special_records + ); + + continue; + } + else + { + // The number of tokens must now contain + // year month day hour minute seconds epoch_flag --other stuff--, + // --other stuff-- depending on the epoch flag + if( nr_tokens < 8 ) + { + GNSS_ERROR_MSG( "if( nr_tokens < 8 )" ); + return FALSE; + } + + // Exract the epoch information from the tokenized line buffer. + i = 0; + if( sscanf( token[i].str, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + epoch.year = (unsigned short)itmp; + i++; + if( sscanf( token[i].str, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + epoch.month = (unsigned char)itmp; + i++; + if( sscanf( token[i].str, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + epoch.day = (unsigned char)itmp; + i++; + if( sscanf( token[i].str, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + epoch.hour = (unsigned char)itmp; + i++; + if( sscanf( token[i].str, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + epoch.minute = (unsigned char)itmp; + i++; + if( sscanf( token[i].str, "%f", &(epoch.seconds) ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + i++; + if( sscanf( token[i].str, "%d", &(itmp) ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + i++; + epoch_flag = (RINEX_enumEpochFlag)itmp; + + if( epoch_flag == 6 ) + { + isEpochValidToDecode = TRUE; + // Cycle slip correction observations to follow. + // This is dealt with later below. + } + else if( epoch_flag > 1 ) + { + if( sscanf( token[i].str, "%d", &nr_special_records ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + + // Deal with special records if any + result = RINEX_DealWithSpecialRecords( + fid, + RINEX_header, + wasEndOfFileReached, + filePosition, + nr_special_records + ); + continue; + } + else + { + isEpochValidToDecode = TRUE; + } + } + + }while( !isEpochValidToDecode ); + + if( token[7].length == 0 ) + { + GNSS_ERROR_MSG( "if( token[7].length == 0 )" ); + return FALSE; + } + + // Some RINEX data has a clock offset term following the number of satellites and there id's + // Sometimes, this value is part of the eighth token + j = 0; + for( i = 0; i < (int)token[7].length; i++ ) + { + if( token[7].str[i] == '-' || token[7].str[i] == '+' ) + { + // ignore the rest of the token string + tmpstr[j] = '\0'; + j++; + break; + } + if( j < 128 ) + { + tmpstr[j] = token[7].str[i]; + j++; + } + } + if( j < 128 ) + { + tmpstr[j] = '\0'; + j++; + } + strcpy( token[7].str, tmpstr ); + token[7].length = strlen( token[7].str ); + + // The eighth token contains the number of satellites and there id's + j = 0; + for( i = 0; i < (int)token[7].length; i++ ) + { + // Satellite can be denoted by the following letters (RINEX_v_ 2.1) + // 'G': GPS + // 'R': GLONASS + // 'S': Geostationary signal payload + // 'T': NNSS Transit + // + // e.g. string here is 5G_8G12G13R_8S20 means 5 satellite observations, + // with GPS PRN's 8, 12, 14, GLONASS id 7, and SBAS id 20 (by the way: making up the id's here). + if( token[7].str[i] == '_' ) + { + continue; + } + if( token[7].str[i] == '-' || token[7].str[i] == '+' || token[7].str[i] == '.' || token[7].str[i] == 'E' || token[7].str[i] == 'e' ) + { + // Any float numbers should not be present on this line. + // unless the clock offset is output (e.g. Trimble R8 receivers) + GNSS_ERROR_MSG( "float numbers should not be present on this line." ); + break; + //return FALSE; + } + + if( isdigit( token[7].str[i] ) ) + { + numstr[j] = token[7].str[i]; + j++; + } + else + { + if( token[7].str[i] != RINEX_SATELLITE_SYSTEM_GPS && + token[7].str[i] != RINEX_SATELLITE_SYSTEM_GLO && + token[7].str[i] != RINEX_SATELLITE_SYSTEM_GEO && + token[7].str[i] != RINEX_SATELLITE_SYSTEM_NSS ) + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + + numstr[j] = '\0'; + j = 0; + // A number always precedes a non-number here. Decode the number. + if( sscanf( numstr, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + if( count == 0 ) + { + // This is the number of observations + RINEX_nr_satellites = itmp; + if( RINEX_nr_satellites > 12 ) + { + // A continuation line will be used! + isContinuationLinePresent = TRUE; + } + + if( RINEX_nr_satellites >= 64 ) + { + GNSS_ERROR_MSG( "if( RINEX_nr_satellites >= 64 )" ); + return FALSE; // a very unlikely error condition. + } + } + else + { + // This is a satellite id of type (current value of) next_sat_type. + RINEX_sat[count-1].id = (unsigned short)itmp; + RINEX_sat[count-1].type = next_sat_type; + } + count++; + if( count > RINEX_nr_satellites+1 ) + { + GNSS_ERROR_MSG( "if( count > RINEX_nr_satellites+1 )" ); + return FALSE; // a very unlikely error condition. + } + next_sat_type = (RINEX_enumSatelliteSystemType)token[7].str[i]; + } + } + if( count == 0 ) + { + GNSS_ERROR_MSG( "if( count == 0 )" ); + return FALSE; + } + + // The last satellite id must still be interpreted. + numstr[j] = '\0'; + j = 0; + if( sscanf( numstr, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed" ); + return FALSE; + } + RINEX_sat[count-1].id = (unsigned short)itmp; + RINEX_sat[count-1].type = next_sat_type; + count++; + + if( count > RINEX_nr_satellites+1 ) + { + // Error in number of satellite ids read compared to RINEX_nr_obs. + GNSS_ERROR_MSG( "if( count > RINEX_nr_satellites+1 )" ); + return FALSE; + } + + // Deal with the possibility of continuation lines. + if( count != RINEX_nr_satellites+1 ) + { + if( RINEX_nr_satellites <= 12 ) + { + GNSS_ERROR_MSG( "if( RINEX_nr_satellites <= 12 )" ); + return FALSE; + } + else + { + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + *wasEndOfFileReached = TRUE; + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + } + + length = strlen(line_buffer); + if( length == 0 ) + { + GNSS_ERROR_MSG( "if( length == 0 )" ); + return FALSE; + } + + if( RINEX_trim_left_right( line_buffer, RINEX_LINEBUF_SIZE, (unsigned *)&length ) == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_trim_left_right returned FALSE." ); + return FALSE; + } + + for( i = 0; i < (int)length; i++ ) + { + if( isspace(line_buffer[i]) ) + { + continue; + } + if( line_buffer[i] == '-' || line_buffer[i] == '+' || line_buffer[i] == '.' || line_buffer[i] == 'E' || line_buffer[i] == 'e' ) + { + // Any float numbers should not be present on this line. + GNSS_ERROR_MSG( "float numbers should not be present on this line." ); + return FALSE; + } + + if( !isdigit( line_buffer[i] ) ) // In this case the satellite system type letter is first. + { + if( line_buffer[i] != RINEX_SATELLITE_SYSTEM_GPS && + line_buffer[i] != RINEX_SATELLITE_SYSTEM_GLO && + line_buffer[i] != RINEX_SATELLITE_SYSTEM_GEO && + line_buffer[i] != RINEX_SATELLITE_SYSTEM_NSS && + line_buffer[i] != RINEX_SATELLITE_SYSTEM_MIXED ) + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + + if( j != 0 ) + { + numstr[j] = '\0'; + j = 0; + if( sscanf( numstr, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + RINEX_sat[count-1].id = (unsigned short)itmp; + RINEX_sat[count-1].type = next_sat_type; + + count++; + if( count > RINEX_nr_satellites+1 ) + { + GNSS_ERROR_MSG( "if( count > RINEX_nr_satellites+1 )" ); + return FALSE; // a very unlikely error condition. + } + } + next_sat_type = (RINEX_enumSatelliteSystemType)line_buffer[i]; + } + else + { + numstr[j] = line_buffer[i]; + j++; + } + } + } + // The last satellite id must still be interpreted. + numstr[j] = '\0'; + j = 0; + if( sscanf( numstr, "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + RINEX_sat[count-1].id = (unsigned short)itmp; + RINEX_sat[count-1].type = next_sat_type; + count++; + + if( count != RINEX_nr_satellites+1 ) + { + GNSS_ERROR_MSG( "if( count != RINEX_nr_satellites+1 )" ); + return FALSE; + } + } + + if( RINEX_header->nr_obs_types >= 64 ) + { + GNSS_ERROR_MSG( "if( RINEX_header->nr_obs_types >= 64 )" ); + return FALSE; // A very unlikely condition. + } + + + + // TIME: The time of the measurement is the receiver time of the received signals. + // It is identical for the phase and range measurements and is identical for + // all satellites observed at that epoch. It is expressed in GPS time (not + // Universal Time). + // + // It is stored in UTC style (year, month, day, etc) BUT is receiver time. + + if( epoch.year >= 80 && epoch.year < 2000 ) + { + epoch.year += 1900; + } + else if( epoch.year >= 0 && epoch.year < 79 ) + { + epoch.year += 2000; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + TIMECONV_GetGPSTimeFromRinexTime( + epoch.year, + epoch.month, + epoch.day, + epoch.hour, + epoch.minute, + epoch.seconds, + &week, + &tow + ); + + // Set the receiver time values. + *rx_gps_week = week; + *rx_gps_tow = tow; + + + obsArray_index = 0; + for( RINEX_sat_index = 0; RINEX_sat_index < (int)RINEX_nr_satellites; RINEX_sat_index++ ) + { + isL1data_present = FALSE; + isL2data_present = FALSE; + overwriteCNoL1 = TRUE; + overwriteCNoL2 = TRUE; + + // Set measurement data default to 0. + memset( &(obsArray[obsArray_index]), 0, sizeof(GNSS_structMeasurement) ); + + result = RINEX_GetNextObserationSetForOneSatellite( + fid, + RINEX_header, + wasEndOfFileReached, + filePosition, + RINEX_obs, + RINEX_MAX_NR_OBS, + &RINEX_nr_obs, + RINEX_sat[RINEX_sat_index].type, + RINEX_sat[RINEX_sat_index].id + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_GetNextObserationSetForOneSatellite returned FALSE." ); + return FALSE; + } + + if( epoch_flag == 6 ) + { + // Cycle slip style observations are present. + + // GDM - ignore for now. + continue; + } + + // Set the time. + obsArray[obsArray_index].tow = tow; + obsArray[obsArray_index].week = week; + + // The channel index is simply the order of the data in this case. + obsArray[obsArray_index].channel = (unsigned short)obsArray_index; + + obsArray[obsArray_index].id = RINEX_sat[RINEX_sat_index].id; + + // Set default validity flags. + obsArray[obsArray_index].flags.isEphemerisValid = 0; // not yet known + obsArray[obsArray_index].flags.isAlmanacValid = 0; // not yet known + obsArray[obsArray_index].flags.isAboveElevationMask = 0; // not yet known + obsArray[obsArray_index].flags.isAboveCNoMask = 0; // not yet known + obsArray[obsArray_index].flags.isAboveLockTimeMask = 0; // not yet known + obsArray[obsArray_index].flags.isNotUserRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNotPsrRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNotAdrRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNotDopplerRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNoCycleSlipDetected = 1; // assume no slip + obsArray[obsArray_index].flags.isPsrUsedInSolution = 0; // not yet known + obsArray[obsArray_index].flags.isDopplerUsedInSolution = 0; // not yet known + obsArray[obsArray_index].flags.isAdrUsedInSolution = 0; // not yet known + obsArray[obsArray_index].flags.useTropoCorrection = 1; // default to yes + obsArray[obsArray_index].flags.useBroadcastIonoCorrection = 1; // default to yes + + + + // The GNSS observation array is channel based. + // We must look for matching observation sets to place within the channel based container. + // e.g. L1, P1, C1, D1 and S1 + // first look for L1, P1, C1, D1 and S1 + + // Deal with S1 measurements first, so that if present, the RINEX signal strength values + // are not interpretted. + for( RINEX_obs_index = 0; RINEX_obs_index < RINEX_nr_obs; RINEX_obs_index++ ) + { + if( RINEX_obs[RINEX_obs_index].type == RINEX_OBS_TYPE_S1 && RINEX_obs[RINEX_obs_index].isValid ) + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL1; + + overwriteCNoL1 = FALSE; + + // GDM_TODO - A receiver dependant look up table is needed here to convert to + // Carrier to noise density ratio values in dB-Hz. + obsArray[obsArray_index].cno = (float)RINEX_obs[RINEX_obs_index].value; // [receiver dependant!] + + isL1data_present = TRUE; + } + } + + for( RINEX_obs_index = 0; RINEX_obs_index < RINEX_nr_obs; RINEX_obs_index++ ) + { + if( !RINEX_obs[RINEX_obs_index].isValid ) + continue; + + switch(RINEX_obs[RINEX_obs_index].type) + { + case RINEX_OBS_TYPE_L1: + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL1; + + obsArray[obsArray_index].adr = RINEX_obs[RINEX_obs_index].value; // cycles + + // Set the validity flags + obsArray[obsArray_index].flags.isActive = TRUE; + obsArray[obsArray_index].flags.isCodeLocked = TRUE; + obsArray[obsArray_index].flags.isPhaseLocked = TRUE; + obsArray[obsArray_index].flags.isParityValid = TRUE; // Assume valid. No half cycle slips (invalid parity changes to valid partiy causes 1/2 cycle jump). + obsArray[obsArray_index].flags.isAdrValid = TRUE; + obsArray[obsArray_index].flags.isAutoAssigned = TRUE; // Assumed. + obsArray[obsArray_index].flags.isNoCycleSlipDetected = TRUE; + + isL1data_present = TRUE; + + // Loss of lock indicator really pertains to the phase only. + switch( RINEX_obs[RINEX_obs_index].loss_of_lock_indicator ) + { + case 0: + { + // OK + break; + } + case 1: // Loss lock between previous and current observation: cycle clip possible. + { + // Assume cycle slip took place. + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + break; + } + case 2: + { + // Opposite wavelength factor to the + // one defined for the satellite by a + // previous WAVELENGTH FACT L1/2 line. + // Valid for the current epoch only. + // GDM_TODO parity failure here? + break; + } + case 3: + { + // both 2 and 1 + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + // GDM_TODO + break; + } + case 5: + { + // both 4 and 1 + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + // Intentional fall thru. + } + case 4: + { + // Observation under Antispoofing (may suffer from increased noise). + // GDM_TODO + break; + } + case 6: + { + // both 4 and 2 + // GDM_TODO + break; + } + case 7: + { + // both 4, 2 and 1 + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + // GDM_TODO + break; + } + default: + { + // could be 'blank' or whitespace like '\r' or '\n' + // ignore + break; + } + } + + if( overwriteCNoL1 ) + { + result = RINEX_ConvertSignalStrengthToUsableCNo( &(obsArray[obsArray_index].cno), RINEX_obs[RINEX_obs_index].signal_strength ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ConvertSignalStrengthToUsableCNo returned FALSE." ); + return FALSE; + } + } + + break; + } + case RINEX_OBS_TYPE_C1: + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL1; + obsArray[obsArray_index].codeType = GNSS_CACode; + + obsArray[obsArray_index].psr = RINEX_obs[RINEX_obs_index].value; // m + + // The observation time convention is 'transmit' time. + obsArray[obsArray_index].tow = tow - obsArray[obsArray_index].psr/LIGHTSPEED; + + // Set the validity flags + obsArray[obsArray_index].flags.isActive = TRUE; + obsArray[obsArray_index].flags.isCodeLocked = TRUE; + obsArray[obsArray_index].flags.isPsrValid = TRUE; + obsArray[obsArray_index].flags.isAutoAssigned = TRUE; // Assumed. + isL1data_present = TRUE; + + if( overwriteCNoL1 ) + { + result = RINEX_ConvertSignalStrengthToUsableCNo( &(obsArray[obsArray_index].cno), RINEX_obs[RINEX_obs_index].signal_strength ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ConvertSignalStrengthToUsableCNo returned FALSE." ); + return FALSE; + } + } + + break; + } + case RINEX_OBS_TYPE_P1: + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL1; + obsArray[obsArray_index].codeType = GNSS_PCode; + + obsArray[obsArray_index].psr = RINEX_obs[RINEX_obs_index].value; // m + + + // The observation time convention is 'tranmsit' time. + obsArray[obsArray_index].tow = tow - obsArray[obsArray_index].psr/LIGHTSPEED; + + // Set the validity flags + obsArray[obsArray_index].flags.isActive = TRUE; + obsArray[obsArray_index].flags.isCodeLocked = TRUE; + obsArray[obsArray_index].flags.isPsrValid = TRUE; + obsArray[obsArray_index].flags.isAutoAssigned = TRUE; // Assumed. + isL1data_present = TRUE; + + if( overwriteCNoL1 ) + { + result = RINEX_ConvertSignalStrengthToUsableCNo( &(obsArray[obsArray_index].cno), RINEX_obs[RINEX_obs_index].signal_strength ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ConvertSignalStrengthToUsableCNo returned FALSE." ); + return FALSE; + } + } + + break; + } + case RINEX_OBS_TYPE_D1: + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL1; + obsArray[obsArray_index].doppler = (float)RINEX_obs[RINEX_obs_index].value; // m + + // Trimble R8 receiver data when converted to RINEX have epochs of invalid doppler + // where the value output is 0.0. To compensate for this all value of exactly zero + // are deemed invalid doppler. + + // Set the validity flags + if( obsArray[obsArray_index].doppler == 0.0 ) + { + obsArray[obsArray_index].flags.isDopplerValid = FALSE; + } + else + { + obsArray[obsArray_index].flags.isDopplerValid = TRUE; + isL1data_present = TRUE; + } + break; + } + default: + { + break; + } + } + } + if( isL1data_present ) + { + // Check if no information about cno is present for L1. + if( obsArray[obsArray_index].cno == 0.0 ) + { + obsArray[obsArray_index].cno = 32; // A nominally low but useable value [dB-Hz]. + } + + obsArray_index++; + if( obsArray_index >= maxNrObs ) + { + GNSS_ERROR_MSG( "if( obsArray_index >= maxNrObs )" ); + return FALSE; + } + + // Set measurement data default to 0. + memset( &(obsArray[obsArray_index]), 0, sizeof(GNSS_structMeasurement) ); + + // Set the time. + obsArray[obsArray_index].tow = tow; + obsArray[obsArray_index].week = week; + + obsArray[obsArray_index].id = RINEX_sat[RINEX_sat_index].id; + + // The channel index is simply the order of the data in this case. + obsArray[obsArray_index].channel = (unsigned short)obsArray_index; + + // Set default validity flags. + obsArray[obsArray_index].flags.isEphemerisValid = 0; // not yet known + obsArray[obsArray_index].flags.isAlmanacValid = 0; // not yet known + obsArray[obsArray_index].flags.isAboveElevationMask = 0; // not yet known + obsArray[obsArray_index].flags.isAboveCNoMask = 0; // not yet known + obsArray[obsArray_index].flags.isAboveLockTimeMask = 0; // not yet known + obsArray[obsArray_index].flags.isNotUserRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNotPsrRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNotAdrRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNotDopplerRejected = 1; // assume not rejected + obsArray[obsArray_index].flags.isNoCycleSlipDetected = 1; // assume no slip + obsArray[obsArray_index].flags.isPsrUsedInSolution = 0; // not yet known + obsArray[obsArray_index].flags.isDopplerUsedInSolution = 0; // not yet known + obsArray[obsArray_index].flags.isAdrUsedInSolution = 0; // not yet known + obsArray[obsArray_index].flags.useTropoCorrection = 1; // default to yes + obsArray[obsArray_index].flags.useBroadcastIonoCorrection = 1; // default to yes + } + + + // Deal with S2 measurements first, so that if present, the RINEX signal strength values + // are not interpretted. + for( RINEX_obs_index = 0; RINEX_obs_index < RINEX_nr_obs; RINEX_obs_index++ ) + { + if( RINEX_obs[RINEX_obs_index].type == RINEX_OBS_TYPE_S2 && RINEX_obs[RINEX_obs_index].isValid ) + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL2; + obsArray[obsArray_index].id = RINEX_obs[RINEX_obs_index].id; + + overwriteCNoL2 = FALSE; + + // GDM_TODO - A receiver dependant look up table is needed here to convert to + // Carrier to noise density ratio values in dB-Hz. + obsArray[obsArray_index].cno = (float)RINEX_obs[RINEX_obs_index].value; // [receiver dependant!] + + isL2data_present = TRUE; + } + } + + + // Look for L2, P2, D2 and S2 + for( RINEX_obs_index = 0; RINEX_obs_index < RINEX_nr_obs; RINEX_obs_index++ ) + { + if( !RINEX_obs[RINEX_obs_index].isValid ) + continue; + + switch(RINEX_obs[RINEX_obs_index].type) + { + case RINEX_OBS_TYPE_L2: + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL2; + obsArray[obsArray_index].adr = RINEX_obs[RINEX_obs_index].value; // cycles + + // Set the validity flags + obsArray[obsArray_index].flags.isActive = TRUE; + obsArray[obsArray_index].flags.isCodeLocked = TRUE; + obsArray[obsArray_index].flags.isPhaseLocked = TRUE; + obsArray[obsArray_index].flags.isParityValid = TRUE; // Assume valid. No half cycle slips (invalid parity changes to valid partiy causes 1/2 cycle jump). + obsArray[obsArray_index].flags.isAdrValid = TRUE; + obsArray[obsArray_index].flags.isAutoAssigned = TRUE; // Assumed. + obsArray[obsArray_index].flags.isNoCycleSlipDetected = TRUE; + isL2data_present = TRUE; + + // Loss of lock indicator really pertains to the phase only. + switch( RINEX_obs[RINEX_obs_index].loss_of_lock_indicator ) + { + case 0: + { + break; // OK + } + case 1: // Loss lock between previous and current observation: cycle clip possible. + { + // Assume cycle slip took place. + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + break; + } + case 2: + { + // Opposite wavelength factor to the + // one defined for the satellite by a + // previous WAVELENGTH FACT L1/2 line. + // Valid for the current epoch only. + // GDM_TODO parity failure here? + break; + } + case 3: + { + // both 2 and 1 + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + // GDM_TODO + break; + } + case 5: + { + // both 4 and 1 + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + // Intentional fall thru. + } + case 4: + { + // Observation under Antispoofing (may suffer from increased noise). + // GDM_TODO + break; + } + case 6: + { + // both 4 and 2 + // GDM_TODO + break; + } + case 7: + { + // both 4, 2 and 1 + obsArray[obsArray_index].flags.isNoCycleSlipDetected = FALSE; + // GDM_TODO + break; + } + default: + { + // could be 'blank' or whitespace like '\r' or '\n' + // ignore + break; + } + } + + if( overwriteCNoL2 ) + { + result = RINEX_ConvertSignalStrengthToUsableCNo( &(obsArray[obsArray_index].cno), RINEX_obs[RINEX_obs_index].signal_strength ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ConvertSignalStrengthToUsableCNo returned FALSE." ); + return FALSE; + } + } + + break; + } + case RINEX_OBS_TYPE_P2: + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL2; + obsArray[obsArray_index].codeType = GNSS_PCode; + + obsArray[obsArray_index].psr = RINEX_obs[RINEX_obs_index].value; // m + + // The observation time convention is 'tranmsit' time. + obsArray[obsArray_index].tow = tow - obsArray[obsArray_index].psr/LIGHTSPEED; + + // Set the validity flags + obsArray[obsArray_index].flags.isActive = TRUE; + obsArray[obsArray_index].flags.isCodeLocked = TRUE; + obsArray[obsArray_index].flags.isPsrValid = TRUE; + obsArray[obsArray_index].flags.isAutoAssigned = TRUE; // Assumed. + isL2data_present = TRUE; + + if( overwriteCNoL2 ) + { + result = RINEX_ConvertSignalStrengthToUsableCNo( &(obsArray[obsArray_index].cno), RINEX_obs[RINEX_obs_index].signal_strength ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ConvertSignalStrengthToUsableCNo returned FALSE." ); + return FALSE; + } + } + + break; + } + case RINEX_OBS_TYPE_D2: + { + obsArray[obsArray_index].system = RINEX_obs[RINEX_obs_index].system; + obsArray[obsArray_index].freqType = GNSS_GPSL2; + obsArray[obsArray_index].doppler = (float)RINEX_obs[RINEX_obs_index].value; // m + + // Trimble R8 receiver data when converted to RINEX have epochs of invalid doppler + // where the value output is 0.0. To compensate for this all value of exactly zero + // are deemed invalid doppler. + + // Set the validity flags + if( obsArray[obsArray_index].doppler == 0.0 ) + { + obsArray[obsArray_index].flags.isDopplerValid = FALSE; + } + else + { + obsArray[obsArray_index].flags.isDopplerValid = TRUE; + isL2data_present = TRUE; + } + break; + } + default: + { + break; + } + } + } + + if( isL2data_present ) + { + // Check if no information about cno is present for L2. + if( obsArray[obsArray_index].cno == 0.0 ) + { + obsArray[obsArray_index].cno = 32; // A nominally low but useable value [dB-Hz]. + } + + obsArray_index++; + if( obsArray_index >= maxNrObs ) + { + GNSS_ERROR_MSG( "if( obsArray_index >= maxNrObs )" ); + return FALSE; + } + } + + // Note that T1 and T2 measurements are not supported. + } + + *nrObs = obsArray_index; + *wasObservationFound = TRUE; + + return TRUE; +} + + +BOOL RINEX_DecodeGPSNavigationFile( + const char *filepath, //!< (input) The file path to the GPS Navigation message file. + GNSS_structKlobuchar *iono_model, //!< (input/output) A pointer to the ionospheric parameters struct. + GPS_structEphemeris *ephemeris_array, //!< (input/output) A pointer to the GPS ephemeris array. + const unsigned int max_length_ephemeris_array, //!< (input) The maximum size of the GPS ephemeris array. + unsigned int *length_ephemeris_array //!< (input/output) The length of the GPS ephemeris array after decoding. The number of valid items. + ) +{ + char RINEX_header[RINEX_HEADER_SIZE]; + unsigned RINEX_header_length = 0; + double version = 0.0; + RINEX_enumFileType file_type = RINEX_FILE_TYPE_UNKNOWN; + char line_buffer[RINEX_LINEBUF_SIZE]; + unsigned nr_lines = 0; + BOOL result; + FILE* fid = NULL; + GPS_structEphemeris eph; // A single ephemeris record. + RINEX_TIME epoch; + unsigned i = 0; + unsigned count = 0; + double tow = 0; + int itmp = 0; + int itmp2 = 0; + double dtmp = 0.0; + unsigned short week = 0; + unsigned ephemeris_array_index = 0; + size_t length = 0; + + char station_name[5]; + unsigned short dayofyear = 0; + unsigned char file_sequence_nr = 0; + unsigned short year = 0; + + double header_A0; // DELTA-UTC: A0,A1,T,W + double header_A1; // DELTA-UTC: A0,A1,T,W + int header_week; // DELTA-UTC: A0,A1,T,W + int header_tow; // DELTA-UTC: A0,A1,T,W + + char str[10][20]; // A 2D array of strings of length 20; + + memset( &eph, 0, sizeof(GPS_structEphemeris) ); + + epoch.time_system = RINEX_TIME_SYSTEM_GPS; + + if( filepath == NULL ) + { + GNSS_ERROR_MSG( "if( filepath == NULL )" ); + return FALSE; + } + if( iono_model == NULL ) + { + GNSS_ERROR_MSG( "if( iono_model == NULL )" ); + return FALSE; + } + if( ephemeris_array == NULL ) + { + GNSS_ERROR_MSG( "if( ephemeris_array == NULL )" ); + return FALSE; + } + if( length_ephemeris_array == NULL ) + { + GNSS_ERROR_MSG( "if( length_ephemeris_array == NULL )" ); + return FALSE; + } + if( max_length_ephemeris_array == 0 ) + { + GNSS_ERROR_MSG( "if( max_length_ephemeris_array == 0 )" ); + return FALSE; + } + + iono_model->isValid = FALSE; + + result = RINEX_GetHeader( + filepath, + RINEX_header, + RINEX_HEADER_SIZE, + &RINEX_header_length, + &version, + &file_type + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_GetHeader returned FALSE." ); + return FALSE; + } + + if( file_type != RINEX_FILE_TYPE_GPS_NAV ) + { + GNSS_ERROR_MSG( "if( file_type != RINEX_FILE_TYPE_GPS_NAV )" ); + return FALSE; + } + + if( fabs( version - 2.1 ) < 1e-06 || + fabs( version - 2.0 ) < 1e-06 || + fabs( version - 2.11 ) < 1e-06 || + fabs( version - 2.12 ) < 1e-06 ) + { + // this version is valid for decoding + } + else + { + GNSS_ERROR_MSG( "RINEX version not supported." ); + return FALSE; + } + + result = RINEX_get_header_lines( + RINEX_header, + RINEX_header_length, + "ION ALPHA", + line_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines == 1 ) + { + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + return FALSE; + } + + if( sscanf( line_buffer, "%lf %lf %lf %lf", + &(iono_model->alpha0), + &(iono_model->alpha1), + &(iono_model->alpha2), + &(iono_model->alpha3) ) != 4 ) + { + GNSS_ERROR_MSG( "sscanf returned FALSE." ); + return FALSE; // bad header? + } + result = RINEX_get_header_lines( + RINEX_header, + RINEX_header_length, + "ION BETA", + line_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines != 1 ) + { + GNSS_ERROR_MSG( "if( nr_lines != 1 )" ); + return FALSE; // weird header + } + + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + return FALSE; + } + + if( sscanf( line_buffer, "%lf %lf %lf %lf", + &(iono_model->beta0), + &(iono_model->beta1), + &(iono_model->beta2), + &(iono_model->beta3) ) != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; // bad header? + } + + result = RINEX_get_header_lines( + RINEX_header, + RINEX_header_length, + "DELTA-UTC: A0,A1,T,W", + line_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines == 1 ) + { + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + return FALSE; + } + + if( sscanf( line_buffer, "%lf %lf %d %d", + &header_A0, + &header_A1, + &header_tow, + &header_week ) == 4 ) + { + iono_model->week = (unsigned short) header_week; + iono_model->tow = header_tow; + iono_model->isValid = TRUE; + } + } + + if( iono_model->isValid == FALSE ) + { + // Decode the year and day of year from the file name. + result = RINEX_DecodeFileName( filepath, station_name, &dayofyear, &file_sequence_nr, &year, &file_type ); + if( result == TRUE ) + { + result = TIMECONV_GetGPSTimeFromYearAndDayOfYear( + year, + dayofyear, + &(iono_model->week), + &dtmp + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetGPSTimeFromYearAndDayOfYear returned FALSE." ); + return FALSE; + } + iono_model->tow = (unsigned)dtmp; + iono_model->isValid = TRUE; + } + else + { + // Get the Iono model time from the first ephemeris record in the file if there is one. + iono_model->isValid = FALSE; + } + } + } + + fid = fopen( filepath, "r" ); + if( fid == NULL ) + { + GNSS_ERROR_MSG( "if( fid == NULL )" ); + return FALSE; + } + + do + { + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + fclose(fid); + return TRUE; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + fclose(fid); + return FALSE; + } + } + } + while( strstr( line_buffer, "END OF HEADER" ) == NULL ); + + + while( !feof(fid) && !ferror(fid) && ephemeris_array_index < max_length_ephemeris_array ) + { + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + fclose(fid); + return FALSE; + } + } + // Check that this line is now empty. + length = strlen(line_buffer); + for( i = 0; i < length; i++ ) + { + if( isalnum(line_buffer[i]) ) + break; + } + if( i == length ) + continue; // This string is empty. + + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)length ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%2c%*c%2c%*c%2c%*c%2c%*c%2c%*c%2c%5c%19c%19c%19c", + str[0], + str[1], + str[2], + str[3], + str[4], + str[5], + str[6], + str[7], + str[8], + str[9] + ); + + if( count != 10 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; // bad record + } + + i = 0; + if( sscanf( str[i], "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.prn = (unsigned short)itmp; + i++; + if( sscanf( str[i], "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + epoch.year = (unsigned short)itmp; + i++; + if( sscanf( str[i], "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + epoch.month = (unsigned char)itmp; + i++; + if( sscanf( str[i], "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + epoch.day = (unsigned char)itmp; + i++; + if( sscanf( str[i], "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + epoch.hour = (unsigned char)itmp; + i++; + if( sscanf( str[i], "%d", &itmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + epoch.minute = (unsigned char)itmp; + i++; + if( sscanf( str[i], "%f", &epoch.seconds ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.af0 ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.af1 ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.af2 ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + + if( epoch.year >= 80 && epoch.year < 2000 ) + { + epoch.year += 1900; + } + else if( epoch.year >= 0 && epoch.year < 79 ) + { + epoch.year += 2000; + } + else + { + GNSS_ERROR_MSG( "unexpected." ); + fclose(fid); + return FALSE; + } + result = TIMECONV_GetGPSTimeFromRinexTime( + epoch.year, + epoch.month, + epoch.day, + epoch.hour, + epoch.minute, + epoch.seconds, + &week, + &tow + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetGPSTimeFromRinexTime returned FALSE." ); + fclose(fid); + return FALSE; + } + eph.toc = (unsigned)tow; + + + // ------------------- + // BROADCAST ORBIT - 1 + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected." ); + fclose(fid); + return FALSE; + } + } + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%*3c%19c%19c%19c%19c", + str[0], + str[1], + str[2], + str[3] + ); + if( count != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + + i = 0; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.iode = (unsigned char)dtmp; + i++; + if( sscanf( str[i], "%lf", &eph.crs ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.delta_n ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.m0 ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + + // ------------------- + // BROADCAST ORBIT - 2 + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected." ); + fclose(fid); + return FALSE; + } + } + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%*3c%19c%19c%19c%19c", + str[0], + str[1], + str[2], + str[3] + ); + if( count != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + + i = 0; + if( sscanf( str[i], "%lf", &eph.cuc ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.ecc ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.cus ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.sqrta ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + + + // ------------------- + // BROADCAST ORBIT - 3 + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected." ); + fclose(fid); + return FALSE; + } + } + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%*3c%19c%19c%19c%19c", + str[0], + str[1], + str[2], + str[3] + ); + if( count != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + + i = 0; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.toe = (unsigned)dtmp; + i++; + if( sscanf( str[i], "%lf", &eph.cic ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.omega0 ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.cis ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + + + // ------------------- + // BROADCAST ORBIT - 4 + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected." ); + fclose(fid); + return FALSE; + } + } + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%*3c%19c%19c%19c%19c", + str[0], + str[1], + str[2], + str[3] + ); + if( count != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + + i = 0; + if( sscanf( str[i], "%lf", &eph.i0 ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.crc ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.w ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &eph.omegadot ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + + + // ------------------- + // BROADCAST ORBIT - 5 + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected." ); + fclose(fid); + return FALSE; + } + } + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%*3c%19c%19c%19c%19c", + str[0], + str[1], + str[2], + str[3] + ); + if( count != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + + i = 0; + if( sscanf( str[i], "%lf", &eph.idot ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.code_on_L2 = (unsigned char)dtmp; + i++; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.week = (unsigned short)dtmp; + i++; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.L2_P_data_flag = (unsigned char)dtmp; + i++; + + // ------------------- + // BROADCAST ORBIT - 6 + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + fclose(fid); + return FALSE; + } + } + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%*3c%19c%19c%19c%19c", + str[0], + str[1], + str[2], + str[3] + ); + if( count != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + + i = 0; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + // This ura is in meters and the GPS_ephemeris is a ura index. Convert it. + result = RINEX_ConvertURA_meters_to_URA_index( dtmp, &eph.ura ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ConvertURA_meters_to_URA_index returned FALSE." ); + fclose(fid); + return FALSE; + } + + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.health = (unsigned char)dtmp; + i++; + if( sscanf( str[i], "%lf", &eph.tgd ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + i++; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + fclose(fid); + return FALSE; + } + eph.iodc = (unsigned short)dtmp; + i++; + + // ------------------- + // BROADCAST ORBIT - 7 + + // Get the next line from the file. + if( fgets(line_buffer, RINEX_LINEBUF_SIZE, fid) == NULL ) + { + if( feof(fid) ) + { + break; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + fclose(fid); + return FALSE; + } + } + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + fclose(fid); + return FALSE; + } + + memset( str, 0, sizeof(char)*10*20 ); + count = sscanf( line_buffer, "%*3c%19c%19c", + str[0], + str[1] + ); + if( count != 2 ) + { + GNSS_ERROR_MSG( "sscanf returned FALSE." ); + fclose(fid); + return FALSE; + } + + i = 0; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf returned FALSE." ); + fclose(fid); + return FALSE; + } + + eph.tow = (unsigned)dtmp; + itmp = (int)eph.tow; + itmp2 = (int)eph.toe; + if( (itmp-itmp2) < -4*SECONDS_IN_DAY ) + { + eph.tow_week = eph.week+1; + } + else + { + eph.tow_week = eph.week; + } +/* + i++; + if( sscanf( str[i], "%lf", &dtmp ) != 1 ) + { + GNSS_ERROR_MSG( "sscanf returned FALSE." ); + fclose(fid); + return FALSE; + } + itmp = (int)dtmp; + if( itmp <= 4 ) + eph.fit_interval_flag = 0; + else + eph.fit_interval_flag = 1; +*/ + ephemeris_array[ephemeris_array_index] = eph; + ephemeris_array_index++; + + if( ephemeris_array_index == 0 && iono_model->isValid == FALSE ) + { + // Get the model time from the first ephemeris data for the iono model. + iono_model->week = eph.week; + iono_model->tow = eph.toe; + iono_model->isValid = TRUE; + } + } + + *length_ephemeris_array = ephemeris_array_index; + fclose(fid); + return TRUE; +} + + +// static +BOOL RINEX_ReplaceDwithE( char *str, const unsigned length ) +{ + unsigned i = 0; + if( str == NULL ) + { + GNSS_ERROR_MSG( "if( str == NULL )" ); + return FALSE; + } + if( length == 0 ) + { + GNSS_ERROR_MSG( "if( length == 0 )" ); + return FALSE; + } + + for( i = 0; i < length; i++ ) + { + if( str[i] == 'D' || str[i] == 'd' ) + str[i] = 'E'; + } + return TRUE; +} + +// static +BOOL RINEX_ConvertURA_meters_to_URA_index( + double ura_m, //!< The user range accuracy [m]. + unsigned char *ura //!< The user range accuracy index. + ) +{ + unsigned char i = 0; + + if( ura == FALSE ) + { + GNSS_ERROR_MSG( "if( ura == FALSE )" ); + return FALSE; + } + + *ura = 15; // by default. + + for( i = 0; i < 16; i++ ) + { + if( ura_m >= RINEX_MIN_URA[i] && ura_m < RINEX_MAX_URA[i] ) + { + *ura = i; + break; + } + } + + return TRUE; +} + + +BOOL RINEX_DecodeFileName( + const char *filepath, //!< (input) A full filepath. + char *station_name, //!< (output) A 5 character C string. char station_name[5]. In which to place the 4-character station name designator. This must be at least 5 characters. + unsigned short *dayofyear, //!< (output) The day of year. + unsigned char *file_sequence_nr, //!< (output) file sequence number within day. 0: file contains all the existing data of the current day. + unsigned short *year, //!< (output) The full year. e.g. 1999, 2001. + RINEX_enumFileType *filetype //!< (output) The RINEX file type. + ) +{ + char str[RINEX_LINEBUF_SIZE]; + char filename[RINEX_LINEBUF_SIZE]; + size_t length = 0; + char *pch = NULL; + char filetype_char = 0; + unsigned count = 0; + int itmp[3]; + + // Check input. + if( filepath == NULL ) + { + GNSS_ERROR_MSG( "if( filepath == NULL )" ); + return FALSE; + } + if( station_name == NULL ) + { + GNSS_ERROR_MSG( "if( station_name == NULL )" ); + return FALSE; + } + if( dayofyear == NULL ) + { + GNSS_ERROR_MSG( "if( dayofyear == NULL )" ); + return FALSE; + } + if( file_sequence_nr == NULL ) + { + GNSS_ERROR_MSG( "if( file_sequence_nr == NULL )" ); + return FALSE; + } + if( year == NULL ) + { + GNSS_ERROR_MSG( "if( year == NULL )" ); + return FALSE; + } + if( filetype == NULL ) + { + GNSS_ERROR_MSG( "if( filetype == NULL )" ); + return FALSE; + } + + station_name[0] = station_name[1] = station_name[2] = station_name[3] = station_name[4] = '\0'; + + length = strlen( filepath ); + if( length >= RINEX_LINEBUF_SIZE ) + { + GNSS_ERROR_MSG( "if( length >= RINEX_LINEBUF_SIZE )" ); + return FALSE; + } + + // Copy the file path. + strcpy( str, filepath ); + + // Tokenize the string copy. + pch = strtok( str,"\\/" ); + while (pch != NULL) + { + strcpy( filename, pch ); + pch = strtok( NULL, "\\/" ); + } + + length = strlen( filename ); + if( length != 12 ) + { + GNSS_ERROR_MSG( "if( length != 12 )" ); + return FALSE; + } + + // Decode the filename. + count = sscanf( filename, "%4c%3d%1d%*c%2d%c", + station_name, + &(itmp[0]), + &(itmp[1]), + &(itmp[2]), + &filetype_char + ); + if( count != 5 ) + { + GNSS_ERROR_MSG( "sscanf failed." ); + return FALSE; + } + + filetype_char = (char)toupper(filetype_char); + + *dayofyear = (unsigned short)itmp[0]; + *file_sequence_nr = (unsigned char)itmp[1]; + *year = (unsigned short)itmp[2]; + + + if( *year >= 80 && *year < 2000 ) + { + *year += 1900; + } + else if( *year >= 0 && *year < 79 ) + { + *year += 2000; + } + else + { + GNSS_ERROR_MSG( "unexpected" ); + return FALSE; + } + + *filetype = (RINEX_enumFileType)filetype_char; + + switch( *filetype ) + { + case RINEX_FILE_TYPE_OBS: + case RINEX_FILE_TYPE_GPS_NAV: + case RINEX_FILE_TYPE_MET: + case RINEX_FILE_TYPE_GLO_NAV: + case RINEX_FILE_TYPE_GEO_NAV: + case RINEX_FILE_TYPE_GAL_NAV: + case RINEX_FILE_TYPE_MIXED_NAV: + case RINEX_FILE_TYPE_SBAS: + case RINEX_FILE_TYPE_CLK: + case RINEX_FILE_TYPE_SUMMARY: + { + return TRUE; + } + default: + { + GNSS_ERROR_MSG( "unexpected default case" ); + return FALSE; + } + } +} + + +BOOL RINEX_GetKlobucharIonoParametersFromNavFile( + const char *filepath, //!< (input) The file path to the GPS Navigation message file. + GNSS_structKlobuchar *iono_model //!< (input/output) A pointer to the ionospheric parameters struct. + ) +{ + char RINEX_header[RINEX_HEADER_SIZE]; + unsigned RINEX_header_length = 0; + double version = 0.0; + RINEX_enumFileType file_type = RINEX_FILE_TYPE_UNKNOWN; + char line_buffer[RINEX_LINEBUF_SIZE]; + unsigned nr_lines = 0; + BOOL result; + double dtmp = 0.0; + + char station_name[5]; + unsigned short dayofyear = 0; + unsigned char file_sequence_nr = 0; + unsigned short year = 0; + + double header_A0; // DELTA-UTC: A0,A1,T,W + double header_A1; // DELTA-UTC: A0,A1,T,W + int header_week; // DELTA-UTC: A0,A1,T,W + int header_tow; // DELTA-UTC: A0,A1,T,W + + memset( iono_model, 0, sizeof(GNSS_structKlobuchar) ); + + if( filepath == NULL ) + { + GNSS_ERROR_MSG( "if( filepath == NULL )" ); + return FALSE; + } + if( iono_model == NULL ) + { + GNSS_ERROR_MSG( "if( iono_model == NULL )" ); + return FALSE; + } + + + result = RINEX_GetHeader( + filepath, + RINEX_header, + RINEX_HEADER_SIZE, + &RINEX_header_length, + &version, + &file_type + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_GetHeader returned FALSE." ); + return FALSE; + } + + if( file_type != RINEX_FILE_TYPE_GPS_NAV ) + { + GNSS_ERROR_MSG( "if( file_type != RINEX_FILE_TYPE_GPS_NAV )" ); + return FALSE; + } + + result = RINEX_get_header_lines( + RINEX_header, + RINEX_header_length, + "ION ALPHA", + line_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines == 1 ) + { + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + return FALSE; + } + + if( sscanf( line_buffer, "%lf %lf %lf %lf", + &(iono_model->alpha0), + &(iono_model->alpha1), + &(iono_model->alpha2), + &(iono_model->alpha3) ) != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed" ); + return FALSE; // bad header? + } + result = RINEX_get_header_lines( + RINEX_header, + RINEX_header_length, + "ION BETA", + line_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines != 1 ) + { + GNSS_ERROR_MSG( "if( nr_lines != 1 )" ); + return FALSE; // weird header + } + + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + return FALSE; + } + + if( sscanf( line_buffer, "%lf %lf %lf %lf", + &(iono_model->beta0), + &(iono_model->beta1), + &(iono_model->beta2), + &(iono_model->beta3) ) != 4 ) + { + GNSS_ERROR_MSG( "sscanf failed" ); + return FALSE; // bad header? + } + + result = RINEX_get_header_lines( + RINEX_header, + RINEX_header_length, + "DELTA-UTC: A0,A1,T,W", + line_buffer, + RINEX_LINEBUF_SIZE, + &nr_lines + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_get_header_lines returned FALSE." ); + return FALSE; + } + if( nr_lines == 1 ) + { + result = RINEX_ReplaceDwithE( line_buffer, (unsigned)strlen(line_buffer) ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "RINEX_ReplaceDwithE returned FALSE." ); + return FALSE; + } + + if( sscanf( line_buffer, "%lf %lf %d %d", + &header_A0, + &header_A1, + &header_tow, + &header_week ) == 4 ) + { + iono_model->week = (unsigned short) header_week; + iono_model->tow = header_tow; + iono_model->isValid = TRUE; + } + } + + if( iono_model->isValid == FALSE ) + { + // Decode the year and day of year from the file name. + result = RINEX_DecodeFileName( filepath, station_name, &dayofyear, &file_sequence_nr, &year, &file_type ); + if( result == TRUE ) + { + result = TIMECONV_GetGPSTimeFromYearAndDayOfYear( + year, + dayofyear, + &(iono_model->week), + &dtmp + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetGPSTimeFromYearAndDayOfYear returned FALSE." ); + return FALSE; + } + iono_model->tow = (unsigned)dtmp; + iono_model->isValid = TRUE; + } + else + { + // Get the Iono model time from the first ephemeris record in the file if there is one. + iono_model->isValid = FALSE; + } + } + } + + return TRUE; +} + diff --git a/src/rinex.h b/src/rinex.h new file mode 100644 index 0000000..bf9240d --- /dev/null +++ b/src/rinex.h @@ -0,0 +1,397 @@ +/** +\file rinex.h +\brief GNSS core 'c' function library: RINEX VERSION 2.11 related functions. +\author Glenn D. MacGougan (GDM) +\date 2007-12-02 +\since 2007-12-02 + +\b REFERENCES \n +- - http://www.aiub-download.unibe.ch/rinex/rinex211.txt + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _RINEX_H_ +#define _RINEX_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include "basictypes.h" +#include "gnss_types.h" +#include "gps.h" + + +/** +\brief NOT USED - A container for RINEX observation file header data. +Each parameter is the string (multiline is some cases) of columns +1-60 that corresponds to a record descriptor from columns 61-80. +*/ +typedef struct +{ + char version_type[64]; //!< RINEX VERSION / TYPE - File type: O for Observation Data - Satellite System: G: GPS, R: GLONASS, E: Galileo, S: SBAS payload, M: Mixed. + char pgm_run_by_date[64]; //!< Name of program creating current file - Name of agency creating current file - Date and time of file creation, Format: yyyymmdd hhmmss zone, zone: 3-4 char. code for time zone. UTC recommended! LCL if local time with unknown local time system code. + char comments[1024]; //!< (Optional-multiline) Comment line(s). Enough space for 16 lines of comments. + char marker_name[64]; //!< Name of antenna marker. + char marker_nr[64]; //!< (Optional) Number of antenna marker . + char marker_type[64]; //!< Type of the marker: GEODETIC : Earth-fixed, high-precision monumentation, NON_GEODETIC : Earth-fixed, low-precision monumentation, NON_PHYSICAL : Generated from network processing, SPACEBORNE : Orbiting space vehicle, AIRBORNE : Aircraft, balloon, etc. WATER_CRAFT : Mobile water craft, GROUND_CRAFT : Mobile terrestrial vehicle, FIXED_BUOY : "Fixed" on water surface, FLOATING_BUOY: Floating on water surface, FLOATING_ICE : Floating ice sheet, etc., GLACIER : "Fixed" on a glacier, BALLISTIC : Rockets, shells, etc, ANIMAL : Animal carrying a receiver, HUMAN : Human being, Record required except for GEODETIC and NON_GEODETIC marker types. Users may define other project-dependent keywords. + char observer_agency[64]; //!< Name of observer / agency. + char receiver_nr_type_version[64]; //!< Receiver number, type, and version (Version: e.g. Internal Software Version). + char antenna_nr_type[64]; //!< Antenna number and type. + char approx_position_xyz[64]; //!< Geocentric approximate marker position (Units: Meters, System: ITRS recommended) Optional for moving platforms. + char antenna_delta_h_e_n[64]; //!< Antenna height: Height of the antenna reference point (ARP) above the marker - Horizontal eccentricity of ARP relative to the marker (east/north). All units in meters. + char antenna_delta_xyz[64]; //!< (Optional) Position of antenna reference point for antenna on vehicle (m). XYZ vector in body-fixed coord. system. + char antenna_phasecenter[64]; //!< (Optional) Average phase center position w/r to antenna reference point (m) - satellite system (g/r/e/s), - observation code - north/east/up (fixed station) or x/y/z in body-fixed system (vehicle). + char antenna_b_sight_xyz[64]; //!< (Optional) Direction of the “vertical” antenna axis towards the gnss satellites. Antenna on vehicle: unit vector in body-fixed coord. system tilted antenna on fixed station: unit vector in n/e/up left-handed system. + char antenna_zerodir_azi[64]; //!< (Optional) Azimuth of the zero-direction of a fixed antenna (degrees, from north). + char antenna_zerodir_xyz[64]; //!< (Optional) Zero-direction of antenna antenna on vehicle: Unit vector in body-fixed coord. system tilted antenna on fixed station: Unit vector in n/e/up left-handed system. + char center_of_mass_xyz[64]; //!< (Optional) Current center of mass (x,y,z, meters) of vehicle in body-fixed coordinate system. Same system as used for attitude. + char system_nrobs_obstypes[64]; //!< Satellite system - Number of observation types - List of observation types. Varies with RINEX version. + char signal_strength_unit[64]; //!< (Optional) The Unit of the signal strengt observables Snn (if present) DBHZ : s/n given in dB-Hz. + char interval[64]; //!< (Optional) Observation interval in seconds. + char time_of_first_obs[64]; //!< The time of first observation record (4-digit-year, month,day,hour,min,sec)- Time system: GPS=GPS time system, GLO=UTC time system, GAL=Galileo System Time. Compulsory in mixed GPS/GLONASS files, Defaults: GPS for pure GPS files, GLO for pure GLONASS files, GAL for pure Galileo files. + char time_of_last_obs[64]; //!< (Optional) The time of last observation record (4-digit-year, month,day,hour,min,sec)- time system: same value as in time_of_first_obs record. + char rcv_clock_offs_appl[64]; //!< (Optional) Epoch, code, and phase are corrected by applying the realtime-derived receiver clock offset: 1=yes, 0=no; default: 0=no. Record required if clock offsets are reported in the EPOCH/SAT records. + char sys_dcbs_applied[64]; //!< (Optional) Satellite system (G/R/E/S) - Program name used to apply differential code bias corrections - Source of corrections (URL). Repeat for each satellite system. No corrections applied: Blank fields or record not present. + char sys_pcvs_applied[64]; //!< (Optional) Satellite system (G/R/E/S) - Program name used to apply phase center variation corrections - Source of corrections (URL). Repeat for each satellite system. No corrections applied: Blank fields or record not present. + char sys_scale_factor[512]; //!< (Optional-multiline) Satellite system (G/R/E/S) - Factor to divide stored observations with before use (1,10,100,1000) - Number of observation types involved. 0 or blank: All observation types - List of observation types. Use continuation line(s) for more than 12 observation types. Repeat record if different factors are applied to different observation types. A value of 1 is assumed if record is missing. + char leap_seconds[64]; //!< (Optional) Number of leap seconds since 6-Jan-1980. Recommended for mixed GPS/GLONASS files. + char nr_satellites[64]; //!< (Optional) Number of satellites, for which observations are stored in the file. + char prn_nr_of_obs[1024]; //!< (Optional-multiline) Satellite numbers, number of observations for each observation type indicated in the SYS / # / OBS TYPES record. If more than 9 observation types: Use continuation line(s). This record is (these records are) repeated for each satellite present in the data file. + +} RINEX_structRawHeader; + + + +/// RINEX VERSION 2.11: An enumeration for RINEX file types. +typedef enum +{ + RINEX_FILE_TYPE_OBS = 'O', //!< 'O' - Observation file. + RINEX_FILE_TYPE_GPS_NAV = 'N', //!< 'N' - GPS navigation file. + RINEX_FILE_TYPE_MET = 'M', //!< 'M' - Meteorological data file. + RINEX_FILE_TYPE_GLO_NAV = 'G', //!< 'G' - GLONASS navigation file. + RINEX_FILE_TYPE_GEO_NAV = 'H', //!< 'H' - Geostationary Navigation nile. + RINEX_FILE_TYPE_GAL_NAV = 'L', //!< 'L' - Galileo navigation message file. + RINEX_FILE_TYPE_MIXED_NAV = 'P', //!< 'P' - Mixed GNSS navigation message file. + RINEX_FILE_TYPE_SBAS = 'B', //!< 'B' - SBAS broadcast data file (separate documentation). + RINEX_FILE_TYPE_CLK = 'C', //!< 'C' - Clock file (separate documentation). + RINEX_FILE_TYPE_SUMMARY = 'S', //!< 'S' - Summary file (used e.g., by IGS, not a standard!). + RINEX_FILE_TYPE_UNKNOWN + +} RINEX_enumFileType; + +/// RINEX VERSION 2.11: An enumeration for the letter denoting the GPS satellite system. Used when determining which satellite observations are present. +typedef enum +{ + RINEX_SATELLITE_SYSTEM_GPS = 'G', //!< 'G' GPS satellite. + RINEX_SATELLITE_SYSTEM_GLO = 'R', //!< 'R' GLONASS satellite. + RINEX_SATELLITE_SYSTEM_GEO = 'S', //!< 'S' Geostationary satellite (SBAS). + RINEX_SATELLITE_SYSTEM_GAL = 'E', //!< 'E' Galileo satellite + RINEX_SATELLITE_SYSTEM_NSS = 'T', //!< 'T' NNSS Transit. + RINEX_SATELLITE_SYSTEM_MIXED = 'M', //!< 'M' Mixed. + RINEX_SATELLITE_SYSTEM_UNKNOWN + +} RINEX_enumSatelliteSystemType; + +/// RINEX VERSION 2.11: An enumeration for the various types of obsevations allowed. +typedef enum +{ + RINEX_OBS_TYPE_L1, //!< Phase on L1 [cycles]. + RINEX_OBS_TYPE_L2, //!< Phase on L2 [cycles]. + RINEX_OBS_TYPE_L5, //!< Phase on L5 [cycles]. + RINEX_OBS_TYPE_L6, //!< Phase on L6 [cycles]. + RINEX_OBS_TYPE_L7, //!< Phase on L7 [cycles]. + RINEX_OBS_TYPE_L8, //!< Phase on L8 [cycles]. + RINEX_OBS_TYPE_C1, //!< Pseudorange using Civil code on L1 [m]. + RINEX_OBS_TYPE_C2, //!< Pseudorange using Civil code on L2 [m]. + RINEX_OBS_TYPE_C5, //!< Pseudorange using Civil code on L5 [m]. + RINEX_OBS_TYPE_C6, //!< Pseudorange using Civil code on L6 [m]. + RINEX_OBS_TYPE_C7, //!< Pseudorange using Civil code on L7 [m]. + RINEX_OBS_TYPE_C8, //!< Pseudorange using Civil code on L8 [m]. + RINEX_OBS_TYPE_P1, //!< Pseudorange using P-Code on L1 [m]. + RINEX_OBS_TYPE_P2, //!< Pseudorange using P-Code on L2 [m]. + RINEX_OBS_TYPE_P5, //!< Pseudorange using P-Code on L5 [m]. + RINEX_OBS_TYPE_P6, //!< Pseudorange using P-Code on L6 [m]. + RINEX_OBS_TYPE_P7, //!< Pseudorange using P-Code on L7 [m]. + RINEX_OBS_TYPE_P8, //!< Pseudorange using P-Code on L8 [m]. + RINEX_OBS_TYPE_D1, //!< Doppler frequency on L1 [Hz]. + RINEX_OBS_TYPE_D2, //!< Doppler frequency on L2 [Hz]. + RINEX_OBS_TYPE_D5, //!< Doppler frequency on L5 [Hz]. + RINEX_OBS_TYPE_D6, //!< Doppler frequency on L6 [Hz]. + RINEX_OBS_TYPE_D7, //!< Doppler frequency on L7 [Hz]. + RINEX_OBS_TYPE_D8, //!< Doppler frequency on L8 [Hz]. + RINEX_OBS_TYPE_T1, //!< Transit Integrated Doppler on 150 (T1) [cycles]. + RINEX_OBS_TYPE_T2, //!< Transit Integrated Doppler on 400 MHz (T2) [cycles]. + RINEX_OBS_TYPE_S1, //!< Raw signal strengths or SNR values as given by the receiver for the L1 phase observations [receiver-dependent]. + RINEX_OBS_TYPE_S2, //!< Raw signal strengths or SNR values as given by the receiver for the L2 phase observations [receiver-dependent]. + RINEX_OBS_TYPE_S5, //!< Raw signal strengths or SNR values as given by the receiver for the L1 phase observations [receiver-dependent]. + RINEX_OBS_TYPE_S6, //!< Raw signal strengths or SNR values as given by the receiver for the L2 phase observations [receiver-dependent]. + RINEX_OBS_TYPE_S7, //!< Raw signal strengths or SNR values as given by the receiver for the L1 phase observations [receiver-dependent]. + RINEX_OBS_TYPE_S8, //!< Raw signal strengths or SNR values as given by the receiver for the L2 phase observations [receiver-dependent]. + + RINEX_OBS_TYPE_UNKNOWN + +} RINEX_enumObservationType; + +/// RINEX VERSION 2.11: An enumeration for wavelength factors. +typedef enum +{ + RINEX_WAVELENTH_FACTOR_SINGLE_FREQ = 0, + RINEX_WAVELENTH_FACTOR_FULL_AMB = 1, + RINEX_WAVELENTH_FACTOR_HALF_CYCLE = 2, + RINEX_WAVELENTH_FACTOR_UNKOWN + +} RINEX_enumWavelenthFactorL1_L2; + +/// RINEX VERSION 2.11: An enumeration for the GNSS time system. +typedef enum +{ + RINEX_TIME_SYSTEM_GPS = 0, //!< GPS time system. + RINEX_TIME_SYSTEM_GLO = 1, //!< GLONASS time system. + RINEX_TIME_SYSTEM_GAL = 1, //!< GALILEO time system. + RINEX_TIME_SYSTEM_UNKNOWN + +} RINEX_enumTimeSystem; + + +/// RINEX VERSION 2.11: A container for a RINEX time. +typedef struct +{ + unsigned short year; + unsigned char month; + unsigned char day; + unsigned char hour; + unsigned char minute; + float seconds; + RINEX_enumTimeSystem time_system; + +} RINEX_TIME; + + +/// RINEX VERSION 2.11: An enumeration for the epoch flag. +typedef enum +{ + RINEX_EPOCH_FLAG_OK = 0, //!< OK + RINEX_EPOCH_FLAG_PWR_FAIL = 1, //!< power failure between previous and current epoch. + RINEX_EPOCH_FLAG_MOVING_ANT = 2, //!< start moving antenna. + RINEX_EPOCH_FLAG_NEW_SITE = 3, //!< new site occupation (end of kinem. data) (at least MARKER NAME record follows) + RINEX_EPOCH_FLAG_HEADER_FOLLOWS = 4, //!< header information follows + RINEX_EPOCH_FLAG_EXTERNAL_EVENT = 5, //!< external event (epoch is significant, same time frame as observation time tags). + RINEX_EPOCH_FLAG_CYCLE_SLIP = 6, //!< cycle slip records follow to optionally report detected and repaired cycle slips (same format as OBSERVATIONS records; slip instead of observation; LLI and signal strength blank or zero) + RINEX_EPOCH_FLAG_EVENT + +} RINEX_enumEpochFlag; + + +/// RINEX VERSION 2.11: A container required information from a decode RINEX header. +typedef struct +{ + double version; //!< RINEX version. + RINEX_enumFileType type; //!< RINEX file type. + char marker_name[64]; //!< The site marker name. + double x; //!< Geocentric approximate marker position (Units: Meters, System: ITRS recommended) Optional for moving platforms. + double y; //!< Geocentric approximate marker position (Units: Meters, System: ITRS recommended) Optional for moving platforms. + double z; //!< Geocentric approximate marker position (Units: Meters, System: ITRS recommended) Optional for moving platforms. + double antenna_delta_h; //!< Antenna height: Height of the antenna reference point (ARP) above the marker + double antenna_ecc_e; //!< Horizontal eccentricity of ARP relative to the marker (east). All units in meters. + double antenna_ecc_n; //!< Horizontal eccentricity of ARP relative to the marker (north). All units in meters. + unsigned nr_obs_types; //!< The number of valid observation types. + RINEX_enumObservationType obs_types[12]; //!< The observation types. + + RINEX_enumWavelenthFactorL1_L2 default_wavefactor_L1; //!< The default wavelenth factor for L1. + RINEX_enumWavelenthFactorL1_L2 default_wavefactor_L2; //!< The default wavelenth factor for L2. + + char wavelength_factors[1024]; //!< A string containing any satellite specific wavelength factors. + + double interval; //!< The interval between observatons. -1 if not present. + RINEX_TIME time_of_first_obs; //!< The time of the first observation record. + +} RINEX_structDecodedHeader; + + + + + +/** +\brief RINEX VERSION 2.11: Get the RINEX header, as a buffer, + from the specified file path. Determine the RINEX version and file type. + +\author Glenn D. MacGougan +\date 2007-12-03 +\since 2007-12-03 + +remarks +- The "RINEX VERSION / TYPE" record must be the first record in a file. + +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL RINEX_GetHeader( + const char* filepath, //!< Path to the RINEX file. + char* buffer, //!< (input/output) A character buffer in which to place the RINEX header. + const unsigned buffer_max_size, //!< (input) The maximum size of the buffer [bytes]. This value should be large enough to hold the entire header, (8192 to 16384). + unsigned *buffer_size, //!< (output) The length of the header data placed in the buffer [bytes]. + double *version, //!< (output) The RINEX version number. e.g. 1.0, 2.0, 2.2, 3.0, etc. + RINEX_enumFileType *file_type //!< (output) The RINEX file type. + ); + + + +/** +\brief RINEX VERSION 2.11: Decode the parts of the RINEX Observation + file header that are essential to + +\author Glenn D. MacGougan +\date 2007-12-03 +\since 2007-12-03 + +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL RINEX_DecodeHeader_ObservationFile( + const char* header_buffer, //!< (input) The character buffer containing the RINEX header. + const unsigned header_buffer_size, //!< (input) The size of the character buffer containing the RINEX header [bytes]. Not the maximum size, the size of the valid data in the buffer. + RINEX_structDecodedHeader* header //!< (output) The decoded header data. + ); + + +/** +\brief RINEX VERSION 2.11: Decode the next set of observations + from the RINEX Observation file. Deal with any header + information changes that arise from special records. + +\author Glenn D. MacGougan +\date 2007-12-06 +\since 2007-12-03 + +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL RINEX_GetNextObservationSet( + FILE* fid, //!< (input) An open (not NULL) file pointer to the RINEX data. + RINEX_structDecodedHeader* RINEX_header, //!< (input/output) The decoded RINEX header information. The wavelength markers can change as data is decoded. + BOOL *wasEndOfFileReached, //!< Has the end of the file been reached (output). + BOOL *wasObservationFound, //!< Was a valid observation found (output). + unsigned *filePosition, //!< The file position for the start of the message found (output). + GNSS_structMeasurement* obsArray, //!< A pointer to a user provided array of GNSS_structMeasurement (input/output). + const unsigned char maxNrObs, //!< The maximum number of elements in the array provided (input). + unsigned *nrObs, //!< The number of valid elements set in the array (output). + unsigned short* rx_gps_week, //!< The receiver GPS week (0-1024+) [weeks]. + double* rx_gps_tow //!< The receiver GPS time of week (0-603799.99999) [s]. + ); + + + +/** +\brief RINEX VERSION 2.11: Completely decode a RINEX GPS + Navigation file into an array of GPS ephemeris structs. + +\author Glenn D. MacGougan +\date 2007-12-06 +\since 2007-12-06 + +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL RINEX_DecodeGPSNavigationFile( + const char *filepath, //!< (input) The file path to the GPS Navigation message file. + GNSS_structKlobuchar *iono_model, //!< (input/output) A pointer to the ionospheric parameters struct. + GPS_structEphemeris *ephemeris_array, //!< (input/output) A pointer to the GPS ephemeris array. + const unsigned int max_length_ephemeris_array, //!< (input) The maximum size of the GPS ephemeris array. + unsigned int *length_ephemeris_array //!< (input/output) The length of the GPS ephemeris array after decoding. The number of valid items. + ); + + +/** +\brief RINEX VERSION 2.11: Decode a RINEX file name. + +\author Glenn D. MacGougan +\date 2007-12-06 +\since 2007-12-06 + +\code +char *filepath = "c:\\data\\CGIM3280.07N"; +char station_name[5]; +unsigned short dayofyear = 0; +unsigned char file_sequence_nr = 0; +unsigned short year = 0; +RINEX_enumFileType filetype = RINEX_FILE_TYPE_UNKNOWN; +BOOL result = FALSE; + +result = RINEX_DecodeFileName( filepath, station_name, &dayofyear, &file_sequence_nr, &year, &filetype ); +// The results are +// station_name == CGIM +// dayofyear == 328 +// file_sequence_nr == 0 +// year == 2007 +// filetype == RINEX_FILE_TYPE_OBS +\endcode + +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL RINEX_DecodeFileName( + const char *filepath, //!< (input) A full filepath. + char *station_name, //!< (output) A 5 character C string. char station_name[5]. In which to place the 4-character station name designator. This must be at least 5 characters. + unsigned short *dayofyear, //!< (output) The day of year. + unsigned char *file_sequence_nr, //!< (output) file sequence number within day. 0: file contains all the existing data of the current day. + unsigned short *year, //!< (output) The full year. e.g. 1999, 2001. + RINEX_enumFileType *filetype //!< (output) The RINEX file type. + ); + + + +/** +\brief RINEX VERSION 2.11: Decode the ionospheric parameters + from a RINEX GPS Navigation file. + +\author Glenn D. MacGougan +\date 2007-12-07 +\since 2007-12-07 + +\code +char *filepath = "c:\\data\\brdc3400.07n"; +GNSS_structKlobuchar iono; +BOOL result; + +result = RINEX_GetKlobucharIonoParametersFromNavFile( filepath, &iono ); +\endcode + +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL RINEX_GetKlobucharIonoParametersFromNavFile( + const char *filepath, //!< (input) The file path to the GPS Navigation message file. + GNSS_structKlobuchar *iono_model //!< (input/output) A pointer to the ionospheric parameters struct. + ); + + + +#ifdef __cplusplus +} +#endif + + +#endif // _RINEX_H_ + diff --git a/src/rsc.c b/src/rsc.c new file mode 100644 index 0000000..42c60d2 --- /dev/null +++ b/src/rsc.c @@ -0,0 +1,34 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#define N 255 +#define R 24 +#define K (N-R) + +void *init_rs_char(int symsize,int gfpoly,int fcr,int prim,int nroots,int pad); +int decode_rs_char(void *arg, + unsigned char *data, int *eras_pos, int no_eras); + +void *rs; + +void initrsc() +{ +rs = init_rs_char( 8, 0x11d, 0, 1, R, 0); +} + + +int decodersc(unsigned char *data, int *eras_pos, int no_eras) +{ + return decode_rs_char(rs, data, eras_pos, no_eras); +} diff --git a/src/rsc.h b/src/rsc.h new file mode 100644 index 0000000..ad65a63 --- /dev/null +++ b/src/rsc.h @@ -0,0 +1,18 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef rsc_H_ +#define rsc_H_ +#include "X2C.h" + + +extern void initrsc(void); + +extern long decodersc(char [], unsigned long [], long); + + +#endif /* rsc_H_ */ diff --git a/src/rsc_decode.c b/src/rsc_decode.c new file mode 100644 index 0000000..2392941 --- /dev/null +++ b/src/rsc_decode.c @@ -0,0 +1,436 @@ +/* + * Copyright 2016 Hannes Schmelzer, OE5HPM + * doing several cleanups and architecture changes, no functional change yet + * + * General purpose Reed-Solomon decoder for 8-bit symbols or less + * Copyright 2003 Phil Karn, KA9Q + * May be used under the terms of the GNU Lesser General Public License (LGPL) + * + * The guts of the Reed-Solomon decoder, meant to be #included + * into a function body with the following typedefs, macros and variables supplied + * according to the code parameters: + + * data_t - a typedef for the data symbol + * data_t data[] - array of rs->nn data and parity symbols to be corrected in place + * retval - an integer lvalue into which the decoder's return code is written + * NROOTS - the number of roots in the RS code generator polynomial, + * which is the same as the number of parity symbols in a block. + Integer variable or literal. + * rs->nn - the total number of symbols in a RS block. Integer variable or literal. + * rs->pad - the number of pad symbols in a block. Integer variable or literal. + * rs->alpha_to - The address of an array of rs->nn elements to convert Galois field + * elements in index (log) form to polynomial form. Read only. + * rs->index_of - The address of an array of rs->nn elements to convert Galois field + * elements in polynomial form to index (log) form. Read only. + * MODNN - a function to reduce its argument modulo rs->nn. May be inline or a macro. + * rs->fcr - An integer literal or variable specifying the first consecutive root of the + * Reed-Solomon generator polynomial. Integer variable or literal. + * rs->prim - The primitive root of the generator poly. Integer variable or literal. + * DEBUG - If set to 1 or more, do various internal consistency checking. Leave this + * undefined for production code + + * The memset(), memmove(), and memcpy() functions are used. The appropriate header + * file declaring these functions (usually ) must be included by the calling + * program. + */ +#include +#include +#include + +struct rs { + unsigned int magic; /* struct magic */ + int mm; /* Bits per symbol */ + int nn; /* Symbols per block (= (1<= rs->nn) { + x -= rs->nn; + x = (x >> rs->mm) + (x & rs->nn); + } + return x; +} + +#define MODNN(x) modnn(rs, x) +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define MAGIC 0xABCD6722 + +void free_rs_char(void *arg) +{ + struct rs *rs = (struct rs *)arg; + + if (rs == NULL) + return; + if (rs->magic != MAGIC) + return; + + if (rs->alpha_to != NULL) + free(rs->alpha_to); + if (rs->index_of != NULL) + free(rs->index_of); + if (rs->genpoly != NULL) + free(rs->genpoly); + free(rs); +} + +/* Initialize a Reed-Solomon codec + * symsize = symbol size, bits + * gfpoly = Field generator polynomial coefficients + * fcr = first root of RS code generator polynomial, index form + * prim = primitive element to generate polynomial roots + * nroots = RS code generator polynomial degree (number of roots) + * pad = padding bytes at front of shortened block + */ +void *init_rs_char(int symsize, int gfpoly, int fcr, int prim, + int nroots, int pad) +{ + struct rs *rs; + + int i, j, sr,root,iprim; + + /* Check parameter ranges */ + if (symsize < 0 || symsize > 8*sizeof(unsigned char)) + return NULL; + if (fcr < 0 || fcr >= (1<= (1<= (1<= ((1<magic = MAGIC; + + rs->mm = symsize; + rs->nn = (1<pad = pad; + + rs->alpha_to = (unsigned char *)malloc(sizeof(unsigned char)*(rs->nn+1)); + if (rs->alpha_to == NULL) { + free(rs); + return NULL; + } + rs->index_of = (unsigned char *)malloc(sizeof(unsigned char)*(rs->nn+1)); + if (rs->index_of == NULL) { + free(rs->alpha_to); + free(rs); + return NULL; + } + + /* Generate Galois field lookup tables */ + rs->index_of[0] = rs->nn; /* log(zero) = -inf */ + rs->alpha_to[rs->nn] = 0; /* alpha**-inf = 0 */ + sr = 1; + for (i = 0; i < rs->nn; i++) { + rs->index_of[sr] = i; + rs->alpha_to[i] = sr; + sr <<= 1; + if (sr & (1<nn; + } + if (sr != 1) { + /* field generator polynomial is not primitive! */ + free(rs->alpha_to); + free(rs->index_of); + free(rs); + return NULL; + } + + /* Form RS code generator polynomial from its roots */ + rs->genpoly = (unsigned char *)malloc(sizeof(unsigned char)*(nroots+1)); + if(rs->genpoly == NULL) { + free(rs->alpha_to); + free(rs->index_of); + free(rs); + return NULL; + } + rs->fcr = fcr; + rs->prim = prim; + rs->nroots = nroots; + + /* Find prim-th root of 1, used in decoding */ + for (iprim = 1; (iprim % prim) != 0; iprim += rs->nn) + ; + rs->iprim = iprim / prim; + + rs->genpoly[0] = 1; + for (i = 0, root = fcr*prim; i < nroots; i++, root += prim) { + rs->genpoly[i+1] = 1; + + /* Multiply rs->genpoly[] by @**(root + x) */ + for (j = i; j > 0; j--) { + if (rs->genpoly[j] != 0) + rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)]; + else + rs->genpoly[j] = rs->genpoly[j-1]; + } + /* rs->genpoly[0] can never be zero */ + rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)]; + } + /* convert rs->genpoly[] to index form for quicker encoding */ + for (i = 0; i <= nroots; i++) + rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; + + return rs; +} + +int decode_rs_char(void *arg, + unsigned char *data, int *eras_pos, int no_eras) +{ + struct rs *rs = (struct rs *)arg; + + if (rs == NULL) + return -1; + if (rs->magic != MAGIC) + return -1; + + int retval; + int deg_lambda, el, deg_omega; + int i, j, r,k; + + unsigned char u,q,tmp,num1,num2,den,discr_r; + unsigned char lambda[rs->nroots+1], s[rs->nroots]; /* Err+Eras Locator poly + * and syndrome poly */ + unsigned char b[rs->nroots+1], t[rs->nroots+1], omega[rs->nroots+1]; + unsigned char root[rs->nroots], reg[rs->nroots+1], loc[rs->nroots]; + int syn_error, count; + + /* form the syndromes; i.e., evaluate data(x) at roots of g(x) */ + for (i = 0; i < rs->nroots; i++) + s[i] = data[0]; + + for (j = 1; j < rs->nn-rs->pad; j++) { + for(i=0;inroots;i++) { + if(s[i] == 0) { + s[i] = data[j]; + } else { + s[i] = data[j] ^ rs->alpha_to[MODNN(rs->index_of[s[i]] + (rs->fcr+i)*rs->prim)]; + } + } + } + + /* Convert syndromes to index form, checking for nonzero condition */ + syn_error = 0; + for (i = 0; i < rs->nroots; i++) { + syn_error |= s[i]; + s[i] = rs->index_of[s[i]]; + } + + if (!syn_error) { + /* if syndrome is zero, data[] is a codeword and there are no + * errors to correct. So return data[] unmodified + */ + count = 0; + goto finish; + } + memset(&lambda[1], 0, rs->nroots*sizeof(lambda[0])); + lambda[0] = 1; + + if (no_eras > 0) { + /* Init lambda to be the erasure locator polynomial */ + lambda[1] = rs->alpha_to[MODNN(rs->prim*(rs->nn-1-eras_pos[0]))]; + for (i = 1; i < no_eras; i++) { + u = MODNN(rs->prim*(rs->nn-1-eras_pos[i])); + for (j = i+1; j > 0; j--) { + tmp = rs->index_of[lambda[j - 1]]; + if(tmp != rs->nn) + lambda[j] ^= rs->alpha_to[MODNN(u + tmp)]; + } + } + + #if DEBUG >= 1 + /* Test code that verifies the erasure locator polynomial just constructed + Needed only for decoder debugging. */ + + /* find roots of the erasure location polynomial */ + for(i=1;i<=no_eras;i++) + reg[i] = rs->index_of[lambda[i]]; + + count = 0; + for (i = 1,k=rs->iprim-1; i <= rs->nn; i++,k = MODNN(k+rs->iprim)) { + q = 1; + for (j = 1; j <= no_eras; j++) + if (reg[j] != rs->nn) { + reg[j] = MODNN(reg[j] + j); + q ^= rs->alpha_to[reg[j]]; + } + if (q != 0) + continue; + /* store root and error location number indices */ + root[count] = i; + loc[count] = k; + count++; + } + if (count != no_eras) { + printf("count = %d no_eras = %d\n lambda(x) is WRONG\n",count,no_eras); + count = -1; + goto finish; + } + #if DEBUG >= 2 + printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); + for (i = 0; i < count; i++) + printf("%d ", loc[i]); + printf("\n"); + #endif + #endif + } + for (i = 0; i < rs->nroots+1; i++) + b[i] = rs->index_of[lambda[i]]; + + /* + * Begin Berlekamp-Massey algorithm to determine error+erasure + * locator polynomial + */ + r = no_eras; + el = no_eras; + while (++r <= rs->nroots) { /* r is the step number */ + /* Compute discrepancy at the r-th step in poly-form */ + discr_r = 0; + for (i = 0; i < r; i++) { + if ((lambda[i] != 0) && (s[r-i-1] != rs->nn)) { + discr_r ^= rs->alpha_to[MODNN(rs->index_of[lambda[i]] + s[r-i-1])]; + } + } + discr_r = rs->index_of[discr_r]; /* Index form */ + if (discr_r == rs->nn) { + /* 2 lines below: B(x) <-- x*B(x) */ + memmove(&b[1],b,rs->nroots*sizeof(b[0])); + b[0] = rs->nn; + } else { + /* 7 lines below: T(x) <-- lambda(x) - discr_r*x*b(x) */ + t[0] = lambda[0]; + for (i = 0 ; i < rs->nroots; i++) { + if(b[i] != rs->nn) + t[i+1] = lambda[i+1] ^ rs->alpha_to[MODNN(discr_r + b[i])]; + else + t[i+1] = lambda[i+1]; + } + if (2 * el <= r + no_eras - 1) { + el = r + no_eras - el; + /* + * 2 lines below: B(x) <-- inv(discr_r) * + * lambda(x) + */ + for (i = 0; i <= rs->nroots; i++) + b[i] = (lambda[i] == 0) ? rs->nn : MODNN(rs->index_of[lambda[i]] - discr_r + rs->nn); + } else { + /* 2 lines below: B(x) <-- x*B(x) */ + memmove(&b[1],b,rs->nroots*sizeof(b[0])); + b[0] = rs->nn; + } + memcpy(lambda,t,(rs->nroots+1)*sizeof(t[0])); + } + } + + /* Convert lambda to index form and compute deg(lambda(x)) */ + deg_lambda = 0; + for (i = 0;i < rs->nroots+1; i++){ + lambda[i] = rs->index_of[lambda[i]]; + if(lambda[i] != rs->nn) + deg_lambda = i; + } + /* Find roots of the error+erasure locator polynomial by Chien search */ + memcpy(®[1], &lambda[1], rs->nroots*sizeof(reg[0])); + count = 0; /* Number of roots of lambda(x) */ + for (i = 1,k=rs->iprim-1; i <= rs->nn; i++,k = MODNN(k+rs->iprim)) { + q = 1; /* lambda[0] is always 0 */ + for (j = deg_lambda; j > 0; j--) { + if (reg[j] != rs->nn) { + reg[j] = MODNN(reg[j] + j); + q ^= rs->alpha_to[reg[j]]; + } + } + if (q != 0) + continue; /* Not a root */ + /* store root (index-form) and error location number */ + #if DEBUG>=2 + printf("count %d root %d loc %d\n",count,i,k); + #endif + root[count] = i; + loc[count] = k; + /* If we've already found max possible roots, + * abort the search to save time + */ + if(++count == deg_lambda) + break; + } + if (deg_lambda != count) { + /* + * deg(lambda) unequal to number of roots => uncorrectable + * error detected + */ + count = -1; + goto finish; + } + /* + * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo + * x**rs->nroots). in index form. Also find deg(omega). + */ + deg_omega = deg_lambda-1; + for (i = 0; i <= deg_omega;i++) { + tmp = 0; + for (j = i; j >= 0; j--) { + if ((s[i - j] != rs->nn) && (lambda[j] != rs->nn)) + tmp ^= rs->alpha_to[MODNN(s[i - j] + lambda[j])]; + } + omega[i] = rs->index_of[tmp]; + } + /* + * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = + * inv(X(l))**(rs->fcr-1) and den = lambda_pr(inv(X(l))) all in poly-form + */ + for (j = count-1; j >=0; j--) { + num1 = 0; + for (i = deg_omega; i >= 0; i--) { + if (omega[i] != rs->nn) + num1 ^= rs->alpha_to[MODNN(omega[i] + i * root[j])]; + } + num2 = rs->alpha_to[MODNN(root[j] * (rs->fcr - 1) + rs->nn)]; + den = 0; + + /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ + for (i = MIN(deg_lambda, rs->nroots-1) & ~1; i >= 0; i -=2) { + if(lambda[i+1] != rs->nn) + den ^= rs->alpha_to[MODNN(lambda[i+1] + i * root[j])]; + } + #if DEBUG >= 1 + if (den == 0) { + printf("\n ERROR: denominator = 0\n"); + count = -1; + goto finish; + } + #endif + /* Apply error to data */ + if (num1 != 0 && loc[j] >= rs->pad) { + data[loc[j]-rs->pad] ^= rs->alpha_to[MODNN(rs->index_of[num1] + rs->index_of[num2] + rs->nn - rs->index_of[den])]; + } + } + finish: + if(eras_pos != NULL) { + for (i = 0; i < count; i++) + eras_pos[i] = loc[i]; + } + retval = count; + + return retval; +} diff --git a/src/sdr.c b/src/sdr.c new file mode 100644 index 0000000..248f706 --- /dev/null +++ b/src/sdr.c @@ -0,0 +1,1018 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * Modified by SP9SKP + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef sdr_H_ +#include "sdr.h" +#endif +#define sdr_C_ +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef tcp_H_ +#include "tcp.h" +#endif +#ifndef tcpb_H_ +#include "tcpb.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#include + + + + + + +/* rtl_tcp iq fm demodulator by OE5DXL */ +#define sdr_IQBUF 65536 + +#define sdr_DDSMAXLEN 2048 + +#define sdr_AFCSPEED 400000000 +/* slower afc reaction */ + +#define sdr_AFCRECENTER 1024 +/* pull afc to middle */ + +#define sdr_SSBDDSSIZE 2048 + +#define sdr_SSBDDSSIZE4 512 + +struct Complex; + + +struct Complex { + float Re; + float Im; +}; + +static int32_t fd; + +static uint32_t audiohz; + +static uint32_t rtlhz; + +static char reconnect; + +static uint8_t iqbuf[65536]; + +static short DDS[2048]; + +static float DDSR[2048]; + +static char url[1001]; + +static char port[11]; + +static uint32_t sampsum; + +static uint32_t sampsize; + +static uint32_t reduce; + +static uint32_t ddslen; + +static uint32_t ddslen4; + +static float SSBDDS[2048]; + + +static void initdds(uint32_t size) +{ + uint32_t i; + float d; + uint32_t tmp; + if (size>2047UL) size = 2048UL; + d = X2C_DIVR(6.2831853071796f,(float)size); + tmp = size-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + DDSR[i] = 32767.5f*osic_sin((float)i*d); + DDS[i] = (short)(int32_t)X2C_TRUNCI(DDSR[i],X2C_min_longint, + X2C_max_longint); + if (i==tmp) break; + } /* end for */ + ddslen = (uint32_t)(size-1UL); + ddslen4 = size/4UL; +} /* end initdds() */ + + +static void initssbdds(float dds[], uint32_t dds_len) +{ + uint32_t i; + float d; + uint32_t tmp; + d = X2C_DIVR(6.2831853071796f,(float)((dds_len-1)+1UL)); + tmp = dds_len-1; + i = 0UL; + if (i<=tmp) for (;; i++) { + dds[i] = osic_sin((float)i*d); + if (i==tmp) break; + } /* end for */ +} /* end initssbdds() */ + +#define sdr_FG (-9) + + +static void iir512(sdr_pRX rx, uint32_t a, uint32_t b) +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + int32_t i3; + int32_t i2; + int32_t i1; + int32_t r3; + int32_t r2; + int32_t r1; + int32_t ddsi; + int32_t ddsr; + int32_t xi; + int32_t xr; + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->uc1; + r2 = anonym->uc2; + r3 = anonym->il; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->uc1; + i2 = anonym0->uc2; + i3 = anonym0->il; + } + ph = rx->phase; + dfc = rx->df+(uint32_t)rx->afckhz; + i = a; + do { + xr = (int32_t)iqbuf[i]-127L; + ++i; + xi = (int32_t)iqbuf[i]-127L; + ++i; + ddsr = (int32_t)DDS[ph]; /* mix osz sin */ + ddsi = (int32_t)DDS[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 += ((xr*ddsr-xi*ddsi)-r1)-r3>>9; /* mixer + lowpass i */ + r2 += r3-r2>>9; + r3 += r1-r2>>8; + i1 += ((xr*ddsi+xi*ddsr)-i1)-i3>>9; /* mixer + lowpass q */ + i2 += i3-i2>>9; + i3 += i1-i2>>8; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->uc1 = r1; + anonym1->uc2 = r2; + anonym1->il = r3; + anonym1->ucr2 = (float)r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->uc1 = i1; + anonym2->uc2 = i2; + anonym2->il = i3; + anonym2->ucr2 = (float)i2; + } + rx->phase = ph; +} /* end iir512() */ + +#define sdr_FG0 (-8) + + +static void iir256(sdr_pRX rx, uint32_t a, uint32_t b) +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + int32_t i3; + int32_t i2; + int32_t i1; + int32_t r3; + int32_t r2; + int32_t r1; + int32_t ddsi; + int32_t ddsr; + int32_t xi; + int32_t xr; + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->uc1; + r2 = anonym->uc2; + r3 = anonym->il; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->uc1; + i2 = anonym0->uc2; + i3 = anonym0->il; + } + ph = rx->phase; + dfc = rx->df+(uint32_t)rx->afckhz; + i = a; + do { + xr = (int32_t)iqbuf[i]-127L; + ++i; + xi = (int32_t)iqbuf[i]-127L; + ++i; + ddsr = (int32_t)DDS[ph]; /* mix osz sin */ + ddsi = (int32_t)DDS[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 += ((xr*ddsr-xi*ddsi)-r1)-r3>>8; /* mixer + lowpass i */ + r2 += r3-r2>>8; + r3 += r1-r2>>7; + i1 += ((xr*ddsi+xi*ddsr)-i1)-i3>>8; /* mixer + lowpass q */ + i2 += i3-i2>>8; + i3 += i1-i2>>7; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->uc1 = r1; + anonym1->uc2 = r2; + anonym1->il = r3; + anonym1->ucr2 = (float)r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->uc1 = i1; + anonym2->uc2 = i2; + anonym2->il = i3; + anonym2->ucr2 = (float)i2; + } + rx->phase = ph; +} /* end iir256() */ + +#define sdr_FG1 (-7) + + +static void iir128(sdr_pRX rx, uint32_t a, uint32_t b) +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + int32_t i3; + int32_t i2; + int32_t i1; + int32_t r3; + int32_t r2; + int32_t r1; + int32_t ddsi; + int32_t ddsr; + int32_t xi; + int32_t xr; + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->uc1; + r2 = anonym->uc2; + r3 = anonym->il; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->uc1; + i2 = anonym0->uc2; + i3 = anonym0->il; + } + ph = rx->phase; + dfc = rx->df +(uint32_t)rx->afckhz; + i = a; + do { + xr = (int32_t)iqbuf[i]-127L; + ++i; + xi = (int32_t)iqbuf[i]-127L; + ++i; + ddsr = (int32_t)DDS[ph]; /* mix osz sin */ + ddsi = (int32_t)DDS[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 += ((xr*ddsr-xi*ddsi)-r1)-r3>>7; /* mixer + lowpass i */ + r2 += r3-r2>>7; + r3 += r1-r2>>6; + i1 += ((xr*ddsi+xi*ddsr)-i1)-i3>>7; /* mixer + lowpass q */ + i2 += i3-i2>>7; + i3 += i1-i2>>6; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->uc1 = r1; + anonym1->uc2 = r2; + anonym1->il = r3; + anonym1->ucr2 = (float)r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->uc1 = i1; + anonym2->uc2 = i2; + anonym2->il = i3; + anonym2->ucr2 = (float)i2; + } + rx->phase = ph; +} /* end iir128() */ + +#define sdr_FG2 (-6) + + +static void iir64(sdr_pRX rx, uint32_t a, uint32_t b) +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + int32_t i3; + int32_t i2; + int32_t i1; + int32_t r3; + int32_t r2; + int32_t r1; + int32_t ddsi; + int32_t ddsr; + int32_t xi; + int32_t xr; + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->uc1; + r2 = anonym->uc2; + r3 = anonym->il; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->uc1; + i2 = anonym0->uc2; + i3 = anonym0->il; + } + ph = rx->phase; + dfc = rx->df+(uint32_t)rx->afckhz; + i = a; + do { + xr = (int32_t)iqbuf[i]-127L; + ++i; + xi = (int32_t)iqbuf[i]-127L; + ++i; + ddsr = (int32_t)DDS[ph]; /* mix osz sin */ + ddsi = (int32_t)DDS[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 += ((xr*ddsr-xi*ddsi)-r1)-r3>>6; /* mixer + lowpass i */ + r2 += r3-r2>>6; + r3 += r1-r2>>5; + i1 += ((xr*ddsi+xi*ddsr)-i1)-i3>>6; /* mixer + lowpass q */ + i2 += i3-i2>>6; + i3 += i1-i2>>5; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->uc1 = r1; + anonym1->uc2 = r2; + anonym1->il = r3; + anonym1->ucr2 = (float)r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->uc1 = i1; + anonym2->uc2 = i2; + anonym2->il = i3; + anonym2->ucr2 = (float)i2; + } + rx->phase = ph; +} /* end iir64() */ + +#define sdr_FG3 (-5) + + +static void iir32(sdr_pRX rx, uint32_t a, uint32_t b) +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + int32_t i3; + int32_t i2; + int32_t i1; + int32_t r3; + int32_t r2; + int32_t r1; + int32_t ddsi; + int32_t ddsr; + int32_t xi; + int32_t xr; + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->uc1; + r2 = anonym->uc2; + r3 = anonym->il; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->uc1; + i2 = anonym0->uc2; + i3 = anonym0->il; + } + ph = rx->phase; + dfc = rx->df+(uint32_t)rx->afckhz; + i = a; + do { + xr = (int32_t)iqbuf[i]-127L; + ++i; + xi = (int32_t)iqbuf[i]-127L; + ++i; + ddsr = (int32_t)DDS[ph]; /* mix osz sin */ + ddsi = (int32_t)DDS[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 += ((xr*ddsr-xi*ddsi)-r1)-r3>>5; /* mixer + lowpass i */ + r2 += r3-r2>>5; + r3 += r1-r2>>4; + i1 += ((xr*ddsi+xi*ddsr)-i1)-i3>>5; /* mixer + lowpass q */ + i2 += i3-i2>>5; + i3 += i1-i2>>4; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->uc1 = r1; + anonym1->uc2 = r2; + anonym1->il = r3; + anonym1->ucr2 = (float)r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->uc1 = i1; + anonym2->uc2 = i2; + anonym2->il = i3; + anonym2->ucr2 = (float)i2; + } + rx->phase = ph; +} /* end iir32() */ + +#define sdr_FG4 (-4) + + +static void iir16(sdr_pRX rx, uint32_t a, uint32_t b) +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + int32_t i3; + int32_t i2; + int32_t i1; + int32_t r3; + int32_t r2; + int32_t r1; + int32_t ddsi; + int32_t ddsr; + int32_t xi; + int32_t xr; + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->uc1; + r2 = anonym->uc2; + r3 = anonym->il; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->uc1; + i2 = anonym0->uc2; + i3 = anonym0->il; + } + ph = rx->phase; + dfc = rx->df+(uint32_t)rx->afckhz; + i = a; + do { + xr = (int32_t)iqbuf[i]-127L; + ++i; + xi = (int32_t)iqbuf[i]-127L; + ++i; + ddsr = (int32_t)DDS[ph]; /* mix osz sin */ + ddsi = (int32_t)DDS[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 += ((xr*ddsr-xi*ddsi)-r1)-r3>>4; /* mixer + lowpass i */ + r2 += r3-r2>>4; + r3 += r1-r2>>3; + i1 += ((xr*ddsi+xi*ddsr)-i1)-i3>>4; /* mixer + lowpass q */ + i2 += i3-i2>>4; + i3 += i1-i2>>3; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->uc1 = r1; + anonym1->uc2 = r2; + anonym1->il = r3; + anonym1->ucr2 = (float)r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->uc1 = i1; + anonym2->uc2 = i2; + anonym2->il = i3; + anonym2->ucr2 = (float)i2; + } + rx->phase = ph; +} /* end iir16() */ + +#define sdr_FG5 (-3) + + +static void iir8(sdr_pRX rx, uint32_t a, uint32_t b) +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + int32_t i3; + int32_t i2; + int32_t i1; + int32_t r3; + int32_t r2; + int32_t r1; + int32_t ddsi; + int32_t ddsr; + int32_t xi; + int32_t xr; + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->uc1; + r2 = anonym->uc2; + r3 = anonym->il; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->uc1; + i2 = anonym0->uc2; + i3 = anonym0->il; + } + ph = rx->phase; + dfc = (uint32_t)((uint32_t)(rx->df+(uint32_t)rx->afckhz)&ddslen); + i = a; + do { + xr = (int32_t)iqbuf[i]-127L; + ++i; + xi = (int32_t)iqbuf[i]-127L; + ++i; + ddsr = (int32_t)DDS[ph]; /* mix osz sin */ + ddsi = (int32_t)DDS[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 += ((xr*ddsr-xi*ddsi)-r1)-r3>>3; /* mixer + lowpass i */ + r2 += r3-r2>>3; + r3 += r1-r2>>2; + i1 += ((xr*ddsi+xi*ddsr)-i1)-i3>>3; /* mixer + lowpass q */ + i2 += i3-i2>>3; + i3 += i1-i2>>2; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->uc1 = r1; + anonym1->uc2 = r2; + anonym1->il = r3; + anonym1->ucr2 = (float)r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->uc1 = i1; + anonym2->uc2 = i2; + anonym2->il = i3; + anonym2->ucr2 = (float)i2; + } + rx->phase = ph; +} /* end iir8() */ + +#define sdr_FG6 128 + + +static void iirvar(sdr_pRX rx, uint32_t a, uint32_t b, float bw) +/* variable bandwidth */ +{ + uint32_t dfc; + uint32_t ph; + uint32_t i; + float ddsi; + float ddsr; + float bw2; + float i3; + float i2; + float i1; + float r3; + float r2; + float r1; + float xi; + float xr; + /*WrFixed(bw, 5,1);WrStrLn(""); */ + struct sdr_TAP * anonym; + struct sdr_TAP * anonym0; + struct sdr_TAP * anonym1; + struct sdr_TAP * anonym2; + { /* with */ + struct sdr_TAP * anonym = &rx->tapre; + r1 = anonym->ucr1; + r2 = anonym->ucr2; + r3 = anonym->ilr; + } + { /* with */ + struct sdr_TAP * anonym0 = &rx->tapim; + i1 = anonym0->ucr1; + i2 = anonym0->ucr2; + i3 = anonym0->ilr; + } + ph = rx->phase; + dfc = rx->df+(uint32_t)rx->afckhz; + i = a; + bw2 = bw*2.0f; + do { + xr = (float)iqbuf[i]-127.5f; + ++i; + xi = (float)iqbuf[i]-127.5f; + ++i; + ddsr = DDSR[ph]; /* mix osz sin */ + ddsi = DDSR[(uint32_t)((uint32_t)(ph+ddslen4)&ddslen)]; + /* mix osz cos */ + ph = (uint32_t)((uint32_t)(ph+dfc)&ddslen); /* drive mix osz */ + r1 = r1+(((xr*ddsr-xi*ddsi)-r1)-r3)*bw; /* mixer + lowpass i */ + r2 = r2+(r3-r2)*bw; + r3 = r3+(r1-r2)*bw2; + i1 = i1+(((xr*ddsi+xi*ddsr)-i1)-i3)*bw; /* mixer + lowpass q */ + i2 = i2+(i3-i2)*bw; + i3 = i3+(i1-i2)*bw2; + } while (i<=b); + { /* with */ + struct sdr_TAP * anonym1 = &rx->tapre; + anonym1->ucr1 = r1; + anonym1->ucr2 = r2; + anonym1->ilr = r3; + anonym1->ucr2 = r2; + } + { /* with */ + struct sdr_TAP * anonym2 = &rx->tapim; + anonym2->ucr1 = i1; + anonym2->ucr2 = i2; + anonym2->ilr = i3; + anonym2->ucr2 = i2; + } + rx->phase = ph; +} /* end iirvar() */ + +/* +PROCEDURE genfirtab(VAR t:ARRAY OF REAL; fg:REAL); +VAR i,f,h:CARDINAL; + f1, e:REAL; +BEGIN + h:=(HIGH(t)+1) DIV 2; + FOR i:=0 TO h-1 DO t[h+i]:=0.5 END; + + f1:=fg*FLOAT(h); + FOR f:=1 TO TRUNC(f1)+1 DO + e:=1.0; + IF f=TRUNC(f1)+1 THEN e:=f1-FLOAT(TRUNC(f1)) END; + FOR i:=0 TO h-1 DO t[i+h]:=t[i+h]+e*cos(pi*FLOAT(i*f)/FLOAT(h)) END; + END; + FOR i:=0 TO h-1 DO + e:=0.54+0.46*cos(pi*(FLOAT(i)/FLOAT(h))); + t[i+h]:=t[i+h]*e END; (* hamming window *) + FOR i:=0 TO h-1 DO t[h-i-1]:=t[i+h] END; +--FOR i:=0 TO HIGH(t) DO WrFixed(t[i], 2,0); WrStr(" ") END; WrStrLn(""); +END genfirtab; + + + +PROCEDURE fir(rx:pRX; VAR u:Complex); +VAR i,j:CARDINAL; +BEGIN + WITH rx^ DO + i:=ifp; + ifre[i]:=u.Re; + ifim[i]:=u.Im; + u.Re:=0.0; + u.Im:=0.0; + FOR j:=0 TO HIGH(iftab) DO + i:=(i+1) MOD (HIGH(iftab)+1); + u.Re:=u.Re + ifre[i]*iftab[j]; + u.Im:=u.Im + ifim[i]*iftab[j]; + END; + ifp:=(i+1) MOD (HIGH(iftab)+1); + END; +END fir; +*/ + +static void ssbiir(struct sdr_SSBTAP * tap, float fg, float fgq, + float * u) +{ + struct sdr_SSBTAP * anonym; + { /* with */ + struct sdr_SSBTAP * anonym = tap; + anonym->uc1 = (anonym->uc1+(*u-anonym->uc1)*fg)-anonym->il; + anonym->uc2 = (anonym->uc2+anonym->il)-anonym->il2; + anonym->uc3 = (anonym->uc3+anonym->il2)-anonym->uc3*fg; + anonym->il = anonym->il+(anonym->uc1-anonym->uc2)*fgq; + anonym->il2 = anonym->il2+(anonym->uc2-anonym->uc3)*fgq; + *u = anonym->uc3; + } +} /* end ssbiir() */ + + +static void rotvector(struct Complex * v, float rr, float ri) +{ + float t; + t = v->Re*rr-v->Im*ri; + v->Im = v->Re*ri+v->Im*rr; + v->Re = t; +} /* end rotvector() */ + + +static short getsamp(sdr_pRX rx, char notfirst) +{ + struct Complex abs0; + struct Complex u; + float af; + float w; + float l; + float lev; + u.Re = rx->tapre.ucr2; + u.Im = rx->tapim.ucr2; + /* fine shift rest of full 1khz */ + if (rx->fine>0UL) { + rx->fracphase = (uint32_t)((uint32_t)(rx->fracphase+rx->fine) &0x7FFUL); + rotvector(&u, SSBDDS[rx->fracphase], SSBDDS[(uint32_t)((uint32_t)(rx->fracphase+512UL) &0x7FFUL)]); + } + /* fine shift rest of full 1khz */ + /* additional IF fir */ + if (rx->modulation=='s') { + /* ssb */ + /* additional IF fir */ + ssbiir(&rx->ssbre, rx->ssbfg, rx->ssbfgq, &u.Re); + ssbiir(&rx->ssbim, rx->ssbfg, rx->ssbfgq, &u.Im); + /* additional IF fir */ + /* rssi */ + lev = 1.0f+u.Re*u.Re+u.Im*u.Im; + l = lev-rx->rssit[0]; + if (l>=0.0f) l = l*0.1f; + else l = l*rx->agcspeed; + rx->rssit[0] = rx->rssit[0]+l; + /* rssi */ + /* ssb */ + rx->bfophase = (uint32_t)((uint32_t)(rx->bfophase+rx->bfo)&0x7FFUL) + ; + af = X2C_DIVR((u.Re*SSBDDS[rx->bfophase]-u.Im*SSBDDS[(uint32_t) + ((uint32_t)(rx->bfophase+512UL)&0x7FFUL)])*25000.0f, + osic_sqrt(rx->rssit[0])); + } + else { + /* ssb */ + /* AM FM */ + /* rssi */ + lev = 1.0f+u.Re*u.Re+u.Im*u.Im; + l = lev-rx->rssit[0]; + rx->rssit[0] = rx->rssit[0]+l*0.001f; + /* rssi */ + /* complex to phase */ + abs0.Re = (float)fabs(u.Re); + abs0.Im = (float)fabs(u.Im); + if (abs0.Im>abs0.Re) { + if (abs0.Im>0.0f) w = X2C_DIVR(abs0.Re,abs0.Im); + else w = 0.0f; + w = 1.5707963267949f-(w*1.055f-w*w*0.267f); /* arctan */ + } + else { + if (abs0.Re>0.0f) w = X2C_DIVR(abs0.Im,abs0.Re); + else w = 0.0f; + w = w*1.055f-w*w*0.267f; + } + if (u.Re<0.0f) w = 3.1415926535898f-w; + if (u.Im<0.0f) w = -w; + /* complex to phase */ + /* phase highpass make FM */ + af = w-rx->w1; + rx->w1 = w; + if (af>3.1415926535898f) af = af-6.2831853071796f; + if (af<(-3.1415926535898f)) af = af+6.2831853071796f; + /* phase highpass make FM */ + if (rx->modulation=='a') { + /* am squelch */ + if (rx->squelch) { + if (notfirst) rx->sqsum = rx->sqsum+(float)fabs(rx->a1-af); + rx->a1 = af; + } + /* am squelch */ + /* am demod */ + lev = osic_sqrt(lev); /* amplitude */ + af = lev-rx->lastlev; /* - median aplitude */ + rx->lastlev = rx->lastlev+af*0.001f; + af = (X2C_DIVR(af,rx->lastlev))*32000.0f; /* agc */ + } + else { + /* am demod */ + /* fm squelch */ + if (rx->squelch) { + if (notfirst) { + rx->sqsum = rx->sqsum+X2C_DIVR((float)fabs(rx->lastlev-lev),rx->lastlev+lev); + } + rx->lastlev = lev; + } + /* fm squelch */ + af = af*7.9577471545948E+3f; + } + } + if (af>32000.0f) af = 32000.0f; + else if (af<(-3.2E+4f)) af = (-3.2E+4f); + return (short)X2C_TRUNCI(af,-32768,32767); +} /* end getsamp() */ + +#define sdr_FINESTEP 1024 + + +extern int32_t sdr_getsdr(uint32_t samps, sdr_pRX rx[],uint32_t rx_len) +{ + uint32_t wssb; + uint32_t ws; + uint32_t bs; + uint32_t as; + uint32_t b; + uint32_t a; + uint32_t r; + uint32_t s; + int32_t u; + struct sdr_RX * anonym; + struct sdr_RX * anonym0; + uint32_t tmp; + if (reconnect && fd<0L) { + usleep(1000000UL); + fd = connecttob(url, port); + } + if (fd>=0L) { + sampsum = sampsum&1023UL; /* partial sample reminder of last block */ + if (samps*(sampsize+1UL)>32768UL) samps = 32768UL/(sampsize+1UL); + if (readsockb(fd, (char *)iqbuf, + (int32_t)(((samps*reduce+sampsum)/1024UL)*2UL))<0L) { + /* connect lost */ + osic_Close(fd); + fd = -1L; + return -1L; + } + a = sampsum; /* continue from last partial step */ + tmp = samps-1UL; + s = 0UL; + if (s<=tmp) for (;; s++) { + r = 0UL; + b = a+reduce; + as = (a/1024UL)*2UL; + bs = (b/1024UL)*2UL-2UL; + while (rx[r]) { + { /* with */ + struct sdr_RX * anonym = rx[r]; + ws = anonym->width; + if (anonym->modulation=='s') { + wssb = (anonym->width*5UL)/4UL; + ws = 3000UL; + while (wsssbfg = X2C_DIVR((float)anonym->width,(float)audiohz); + anonym->ssbfgq = anonym->ssbfg*anonym->ssbfg*2.0f; + anonym->bfo = ((uint32_t)labs(anonym->maxafc)*2048UL)/audiohz; + if (anonym->maxafc>0L) anonym->bfo = 2048UL-anonym->bfo; + /*WrInt(bfo, 0);WrStrLn(" bfo"); */ + anonym->fine = (anonym->dffrac*2048UL)/audiohz; + if (anonym->agc>0UL) { + anonym->agcspeed = X2C_DIVR(0.2f,(float)anonym->agc); + } + else anonym->agcspeed = 0.00025f; + } + else { + anonym->fine = 0UL; + anonym->agcspeed = 0.001f; + } + if (rtlhz<2048000UL) ws = ws*2UL; + if (ws==3000UL) iir512(rx[r], as, bs); + else if (ws==6000UL) iir256(rx[r], as, bs); + else if (ws==12000UL) iir128(rx[r], as, bs); + else if (ws==24000UL) iir64(rx[r], as, bs); + else if (ws==48000UL) iir32(rx[r], as, bs); + else if (ws==96000UL) iir16(rx[r], as, bs); + else if (ws==192000UL) iir8(rx[r], as, bs); + else iirvar(rx[r], as, bs, (float)ws*6.7934782608696E-7f); + u = (int32_t)getsamp(rx[r], s>0UL)+anonym->shiftf; //+/-AFC w Hz +// printf("\r\nSH:%i\r\n",anonym->shiftf); + anonym->samples[s] = (short)u; + anonym->median = anonym->median+u; /* afc */ + } + ++r; + } + a = b; + if (s==tmp) break; + } /* end for */ + sampsum = a; + /*AFC */ + r = 0UL; + while (rx[r]) { + { /* with */ + struct sdr_RX * anonym0 = rx[r]; + if (anonym0->modulation=='f' && anonym0->maxafc>0L) { + anonym0->median = anonym0->median-(anonym0->afckhz*(int32_t)samps*1024L)/anonym0->maxafc; /* weak pull to middle */ + if (anonym0->median>400000000L) { + if (anonym0->afckhzmaxafc) { + ++anonym0->afckhz; + } + anonym0->median = 0L; + } + else if (anonym0->median<-400000000L) { + if (anonym0->afckhz>-anonym0->maxafc) --anonym0->afckhz; + anonym0->median = 0L; + } + } + } + ++r; + } + /*AFC */ + return (int32_t)samps; + } + else return -1L; + return 0; +} /* end getsdr() */ + + +extern void sdr_setparm(uint32_t num, uint32_t value) +{ + int32_t res; + char tbuf[5]; + tbuf[0U] = (char)num; + tbuf[1U] = (char)(value/16777216UL); + tbuf[2U] = (char)(value/65536UL&255UL); + tbuf[3U] = (char)(value/256UL&255UL); + tbuf[4U] = (char)(value&255UL); + res = sendsock(fd, tbuf, 5L); +} /* end setparm() */ + + +extern char sdr_startsdr(char ip[], uint32_t ip_len, + char tport[], uint32_t tport_len, uint32_t inhz, + uint32_t outhz, char reconn) +{ + aprsstr_Assign(url, 1001ul, ip, ip_len); + aprsstr_Assign(port, 11ul, tport, tport_len); + reconnect = reconn; + if (inhz>0UL) rtlhz = inhz; + if (rtlhz!=1024000UL && (rtlhz<2048000UL || rtlhz>2500000UL)) return 0; + if (outhz>0UL) audiohz = outhz; + reduce = (1024UL*rtlhz+audiohz/2UL)/audiohz; /* sample reduction * 1024 */ + sampsize = reduce/1024UL; /* input samples per output sample, trunc */ + if (fd<0L) fd = connecttob(url, port); + if (fd>=0L) { + sdr_setparm(2UL, rtlhz); + if (inhz>=2048000UL) initdds(2048UL); + else initdds(1024UL); + initssbdds(SSBDDS, 2048ul); + } + return fd>=0L; +} /* end startsdr() */ + + +extern void sdr_BEGIN(void) +{ + static int sdr_init = 0; + if (sdr_init) return; + sdr_init = 1; + if (sizeof(sdr_AUDIOSAMPLE)!=131072) X2C_ASSERT(0); + aprsstr_BEGIN(); + osi_BEGIN(); + fd = -1L; + reconnect = 0; + rtlhz = 2048000UL; + audiohz = 16000UL; +} + diff --git a/src/sdr.h b/src/sdr.h new file mode 100644 index 0000000..4d661f9 --- /dev/null +++ b/src/sdr.h @@ -0,0 +1,101 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * Modified by SP9SKP + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef sdr_H_ +#define sdr_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif + +#define sdr_ZFIRSIZE 256 + +#define sdr_mSSB "s" + +#define sdr_mFM "f" + +#define sdr_mAM "a" + +typedef short sdr_AUDIOSAMPLE[65536]; + +typedef short * sdr_pAUDIOSAMPLE; + +struct sdr_TAP; + + +struct sdr_TAP { + int32_t uc1; + int32_t uc2; + int32_t il; + float ucr1; + float ucr2; + float ilr; +}; + +struct sdr_SSBTAP; + + +struct sdr_SSBTAP { + float uc1; + float uc2; + float uc3; + float il; + float il2; +}; + +struct sdr_RX; + + +struct sdr_RX { + int32_t shiftf; + uint32_t df; + uint32_t dffrac; + uint32_t width; + uint32_t agc; + uint32_t idx; + int32_t maxafc; + char squelch; + char modulation; + sdr_pAUDIOSAMPLE samples; + uint32_t phase; + uint32_t bfo; + uint32_t fine; + struct sdr_TAP tapre; + struct sdr_TAP tapim; + int32_t median; + int32_t afckhz; + float w1; + float lastlev; + float rssit[16]; + unsigned char rssitf[16]; + float sqsum; + float a1; + uint32_t fracphase; + uint32_t bfophase; + struct sdr_SSBTAP ssbre; + struct sdr_SSBTAP ssbim; + float ssbfgq; + float ssbfg; + float agcspeed; +}; + +typedef struct sdr_RX * sdr_pRX; + +extern int32_t sdr_getsdr(uint32_t, sdr_pRX [], uint32_t); + +extern void sdr_setparm(uint32_t, uint32_t); + +extern char sdr_startsdr(char [], uint32_t, char [], + uint32_t, uint32_t, uint32_t, char); + + +extern void sdr_BEGIN(void); + + +#endif /* sdr_H_ */ diff --git a/src/sdrtest.c b/src/sdrtest.c new file mode 100644 index 0000000..fc11737 --- /dev/null +++ b/src/sdrtest.c @@ -0,0 +1,1186 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * Modified by SP9SKP + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define sdrtest_C_ +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef sdr_H_ +#include "sdr.h" +#endif +#include +/* test rtl_tcp iq fm demodulator by OE5DXL */ +#define sdrtest_MAXCHANNELS 64 + +#define sdrtest_DEFAULTPOWERSAVE 0 + +#define sdrtest_SAMPSIZE 32 +/* samples per sdr call */ + +#define sdrtest_TUNESTEP 1000 +/* minimal tuning step */ + +#define sdrtest_TUNEBAND 200000 +/* step to minimize freq jumps from inexact pll */ + +#define sdrtest_DEFAULTMAXWAKE 2000 +/* ms stay awake after squelch close */ + +struct FREQTAB; + + +struct FREQTAB { + /* khz, */ + uint32_t hz; + uint32_t width; + uint32_t agc; + int32_t afc; + int32_t shiftf; + char modulation; +}; + +struct STICKPARM; + + +struct STICKPARM { + uint32_t val; + char ok0; + char changed; +}; + +struct SQUELCH; + + +struct SQUELCH { + float lev; + float lp; + float u1; + float u2; + float il; + float medmed; + float mutlev; + int32_t sqsave; + int32_t wakeness; + int32_t pcmc; + uint32_t nexttick; + uint32_t waterp; + uint32_t waterdat[16]; +}; + +static int32_t fd; + +static uint32_t sndw; + +static uint32_t freqc; + +static uint32_t midfreq; + +static uint32_t lastmidfreq; + +static uint32_t downsamp; + +static uint32_t mixto; + +static uint32_t powersave; + +static short sndbuf[1024],sndbufft[1024]; + +static uint8_t sndbuf8[1024]; + +static struct sdr_RX rxx[64]; + +static sdr_pRX prx[65]; + +static short sampx[64][32]; + +static struct STICKPARM stickparm[256]; + +static struct SQUELCH squelchs[65]; + +static uint32_t iqrate; + +static uint32_t samphz; + +static uint32_t maxrx; + +static uint32_t maxwake; + +static char url[1001]; + +static char port[1001]; + +static char soundfn[1001]; + +static char parmfn[1001]; + +static char verb; + +static char reconn; + +static char pcm8; + +static char nosquelch; + +static double offset; + +static int wtfno; + +time_t oldMTime; + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + + +static void card(const char s[], uint32_t s_len, uint32_t * p, + uint32_t * n, char * ok0) +{ + *ok0 = 0; + *n = 0UL; + while ((uint8_t)s[*p]>='0' && (uint8_t)s[*p]<='9') { + *n = ( *n*10UL+(uint32_t)(uint8_t)s[*p])-48UL; + *ok0 = 1; + ++*p; + } +} /* end card() */ + +static void cardi(const char s[], uint32_t s_len, uint32_t * p, int32_t * n, char * ok0) +{ + *ok0 = 0; + *n = 0UL; + int32_t mn=1; + if(s[*p]=='-'){ + mn=-1; + ++*p; + } + while ((uint8_t)s[*p]>='0' && (uint8_t)s[*p]<='9') { + *n = ( *n*10UL+(int32_t)(uint8_t)s[*p])-48UL; + *ok0 = 1; + ++*p; + } + *n*=mn; +} /* end card() */ + + + +static void int0(const char s[], uint32_t s_len, uint32_t * p, + int32_t * n, char * ok0) +{ + char sgn; + uint32_t c; + if (s[*p]=='-') { + sgn = 1; + ++*p; + } + else sgn = 0; + card(s, s_len, p, &c, ok0); + if (sgn) *n = -(int32_t)c; + else *n = (int32_t)c; +} /* end int() */ + + +static void fix(const char s[], uint32_t s_len, uint32_t * p, + double * x, char * ok0) +{ + double m; + char sgn; + if (s[*p]=='-') { + sgn = 1; + ++*p; + } + else sgn = 0; + m = 1.0; + *ok0 = 0; + *x = 0.0; + while ((uint8_t)s[*p]>='0' && (uint8_t)s[*p]<='9' || s[*p]=='.') { + if (s[*p]=='.') m = 0.1; + else if (m==1.0) { + *x = *x*10.0+(double)((uint32_t)(uint8_t)s[*p]-48UL); + } + else { + *x = *x+(double)((uint32_t)(uint8_t)s[*p]-48UL)*m; + m = m*0.1; + } + *ok0 = 1; + ++*p; + } + if (sgn) *x = -*x; +} /* end fix() */ + + +static void Parms(void) +{ + char s[1001]; + uint32_t n; + uint32_t m; + int32_t ni; + char ok0; + reconn = 0; + verb = 0; + pcm8 = 0; + downsamp = 0UL; + mixto = 0UL; + strncpy(url,"127.0.0.1",1001u); + strncpy(port,"1234",1001u); + soundfn[0] = 0; + iqrate = 2048000UL; + samphz = 16000UL; + offset = 0.0; + strncpy(parmfn,"sdrcfg.txt",1001u); + powersave = 0UL; + maxrx = 63UL; + nosquelch = 0; + /* watermark:=FALSE; */ + maxwake = 2000UL; + for (;;) { + osi_NextArg(s, 1001ul); + if (s[0U]==0) break; + if ((s[0U]=='-' && s[1U]) && s[2U]==0) { + if (s[1U]=='s') { + osi_NextArg(soundfn, 1001ul); + pcm8 = 0; + } + else if (s[1U]=='S') { + osi_NextArg(soundfn, 1001ul); + pcm8 = 1; + } + else if (s[1U]=='c') osi_NextArg(parmfn, 1001ul); + else if (s[1U]=='o') { + /* offset */ + osi_NextArg(s, 1001ul); + n = 0UL; + fix(s, 1001ul, &n, &offset, &ok0); + if (!ok0) Error(" -o ", 10ul); + } + else if (s[1U]=='d') { + /* sampelrate to output divide */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &downsamp) || downsamp<1UL) { + Error(" -p ", 12ul); + } + --downsamp; + } + else if (s[1U]=='m') { + /* downmix to */ + osi_NextArg(s, 1001ul); + if ((!aprsstr_StrToCard(s, 1001ul, + &mixto) || mixto<1UL) || mixto>2UL) { + Error(" -m <1..2>", 11ul); + } + } + else if (s[1U]=='a') { + /* maximal active rx */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &maxrx)) { + Error(" -a ", 13ul); + } + } + else if (s[1U]=='t') { + osi_NextArg(s, 1001ul); /* url */ + n = 0UL; + while ((n<1000UL && s[n]) && s[n]!=':') { + if (n<1000UL) url[n] = s[n]; + ++n; + } + if (n>1000UL) n = 1000UL; + url[n] = 0; + if (s[n]==':') { + m = 0UL; + ++n; + while ((n<1000UL && s[n]) && m<1000UL) { + port[m] = s[n]; + ++n; + ++m; + } + if (m>1000UL) m = 1000UL; + port[m] = 0; + } + } + else if (s[1U]=='r') { + /* sampelrate */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &samphz) || samphz>192000UL) { + Error(" -r ", 9ul); + } + } + else if (s[1U]=='i') { + /* iq sampelrate */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, + &iqrate) || iqrate!=1024000UL && (iqrate<2048000UL || iqrate>2500000UL) + ) Error(" -i 2048000 or 1024000", 28ul); + } + else if (s[1U]=='v') verb = 1; + else if (s[1U]=='k') reconn = 1; + else if (s[1U]=='w') { + /* maximum wake time */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &maxwake)) { + Error(" -w ", 9ul); + } + } + else if (s[1U]=='z') { + /* powersave time */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &powersave)) { + Error(" -z ", 9ul); + } + nosquelch = 0; + } + else if (s[1U]=='Z') { + /* powersave time */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &powersave)) { + Error(" -Z ", 9ul); + } + nosquelch = 1; + } + else if (s[1U]=='n') { + /* powersave time */ + osi_NextArg(s, 1001ul); + if (!aprsstr_StrToCard(s, 1001ul, &wtfno)) { + Error(" -n ", 9ul); + } + nosquelch = 0; + } + else { + if (s[1U]=='h') { + osi_WrStrLn("", 1ul); + osi_WrStrLn("AM/FM/SSB Multirx from rtl_tcp (8 bit IQ via tcpip) to audio channel(s) 8/16 bit PCM", 85ul); + osi_WrStrLn(" -a maximum active rx to limit cpu load, if number is reached,", 80ul); + osi_WrStrLn(" no more inactive rx will listen to become active", 71ul); + osi_WrStrLn(" -c read channels config from file (sdrcfg.txt)", 65ul); + osi_WrStrLn(" -d downsample output (1)", + 43ul); + osi_WrStrLn(" -h help", 26ul); + osi_WrStrLn(" -i input sampelrate kHz 1024000 or 2048000..2500000 (2048000)", 80ul); + osi_WrStrLn(" if >2048000, AM/FM-IF-width will increase proportional", 77ul); + osi_WrStrLn(" -k keep connection", 37ul); + osi_WrStrLn(" -m mix up/down all rx channels to 1 or 2 audiochannels (mono/stereo)", 87ul); + osi_WrStrLn(" for 2 channels the rx audios will be arranged from left to right", 87ul); + osi_WrStrLn(" -o offset for entered frequencies if Converters are used", 75ul); + osi_WrStrLn(" -p send rtl_tcp parameter, ppm, tunergain ...", 64ul); + osi_WrStrLn(" -r output sampelrate Hz for all channels 8000..192000 (16000)", 80ul); + osi_WrStrLn(" -s 16bit signed n-channel sound stream/pipe", 62ul); + osi_WrStrLn(" -S 8bit unsigned n-channel sound stream/pipe", 63ul); + osi_WrStrLn(" -t connect rtl_tcp server (127.0.0.1:1234)", 61ul); + osi_WrStrLn(" -v show rssi (dB) and afc (khz)", 50ul); + osi_WrStrLn(" -w max stay awake (use CPU) time after squelch close (2000)", 78ul); + osi_WrStrLn(" -z sleep time (no cpu) for inactive rx if squelch closed (-z 100)", 84ul); + osi_WrStrLn(" -Z same but fast open with no audio quieting for sending", 75ul); + osi_WrStrLn(" to decoders and not human ears", 53ul); + osi_WrStrLn(" -n save waterfall to /tmp/wtf.bin", 60ul); + osi_WrStrLn("example: -m 1 -d 2 -S /dev/dsp -t 127.0.0.1:1234 -p 5 72 -p 8 1 -v", 67ul); + osi_WrStrLn("", 1ul); + osi_WrStrLn("config file: (re-read every some seconds and may be modified any time)", 71ul); + osi_WrStrLn(" # comment", 12ul); + osi_WrStrLn(" p rtl_tcp parameter like \'p 5 50\' ppm, \'p 8 1\' autogain on", 76ul); + osi_WrStrLn(" f FM Demodulator", 72ul); + osi_WrStrLn(" a 0 AM Demodulator", 72ul); + osi_WrStrLn(" u 0 USB Demodulator", 73ul); + osi_WrStrLn(" l same for LSB", 17ul); + osi_WrStrLn(" AFC-range in +-kHz, offset to AFC +- in Hz, Squelch 0 off, 100 open, 70 may do", 83ul); + osi_WrStrLn(" audio lowpass in % Nyquist frequ. of output sampelrate, 0 is off", 69ul); + osi_WrStrLn(" IF-width 3000 6000 12000 24000 48000 96000 192000Hz for low CPU usage", 74ul); + osi_WrStrLn(" (192000 only with >=2048khz iq-rate), (4th order IIR)", 58ul); + osi_WrStrLn(" (SSB 8th order IF-IIR), OTHER values with MORE CPU-load (12000 default)", 76ul); + osi_WrStrLn("", 1ul); + osi_WrStrLn(" example:", 11ul); + osi_WrStrLn(" p 5 50", 11ul); + osi_WrStrLn(" p 8 1", 10ul); + osi_WrStrLn(" f 438.825 5 -5000 75 70 (afc, offset to afc in Hz, squelch, audio lowpass, 12khz IF)", 100ul); + osi_WrStrLn(" f 439.275 0 0 0 80 20000 (20khz IF, uses more CPU)", 65ul); + osi_WrStrLn(" u 439.5001 -700 0 0 600 (USB with 600Hz CW-Filter at 800Hz", 69ul); + osi_WrStrLn("", 1ul); + osi_WrStrLn(" will generate 3 channel 16bit PCM stream (up to 64 channels with -z or -Z)", 77ul); + osi_WrStrLn(" use max. 95% of -i span. Rtl-stick will be tuned to center of the span", 73ul); + osi_WrStrLn(" rx in center of band will be +-10khz relocated to avoid ADC-DC offset pseudo", 79ul); + osi_WrStrLn(" carriers, SSB-only will be relocated 10..210khz to avoid inexact tuning steps", 80ul); + osi_WrStrLn("", 1ul); + osi_WrStrLn(" f 100.1 0 0 15 96000 (WFM with \"-r 192000 -d 4\" for 1 channnel 48khz", 82ul); + osi_WrStrLn("", 1ul); + X2C_ABORT(); + } + if (s[1U]=='p') { + osi_NextArg(s, 1001ul); + if (aprsstr_StrToCard(s, 1001ul, &m) && m<256UL) { + osi_NextArg(s, 1001ul); + if (aprsstr_StrToInt(s, 1001ul, &ni)) { + stickparm[m].val = (uint32_t)ni; /* stick parameter */ + stickparm[m].ok0 = 1; + stickparm[m].changed = 1; + } + else Error(" -p ", 18ul); + } + else { + Error(" -p ", 18ul); + } + } + else Error("-h", 3ul); + } + } + else Error("-h", 3ul); + } + powersave = (powersave*samphz)/32000UL; + maxwake = (maxwake*samphz)/32000UL; +} /* end Parms() */ + + +static void setparms(char all) +{ + uint32_t i; + char nl; + char s[31]; + nl = 1; + for (i = 0UL; i<=255UL; i++) { + if (stickparm[i].ok0 && (all || stickparm[i].changed)) { + sdr_setparm(i, stickparm[i].val); + if (verb) { + if (nl) { + osi_WerrLn("", 1ul); + nl = 0; + } + osi_Werr("parm:", 6ul); + aprsstr_IntToStr((int32_t)i, 0UL, s, 31ul); + osi_Werr(s, 31ul); + osi_Werr(" ", 2ul); + aprsstr_IntToStr((int32_t)stickparm[i].val, 0UL, s, 31ul); + osi_WerrLn(s, 31ul); + } + } + stickparm[i].changed = 0; + } /* end for */ +} /* end setparms() */ + + +static void setstickparm(uint32_t cmd, uint32_t value) +{ + if (!stickparm[cmd].ok0 || stickparm[cmd].val!=value) { + stickparm[cmd].val = value; + stickparm[cmd].changed = 1; + } + stickparm[cmd].ok0 = 1; +} /* end setstickparm() */ + +#define sdrtest_OFFSET 10000 + + +static void centerfreq(const struct FREQTAB freq[], uint32_t freq_len) +{ + uint32_t max0; + uint32_t min0; + uint32_t i; + int32_t nomid; + char ssb; + double rem; + double fhz; + double khz; + midfreq = 0UL; + i = 0UL; + max0 = 0UL; + min0 = X2C_max_longcard; + while (imax0) max0 = freq[i].hz; + if (freq[i].hz=min0) { + if (max0-min0>=iqrate){ + osi_WerrLn("freq span > iq-sampelrate", 26ul); + exit(0); + } + midfreq = (max0+min0)/2UL; + nomid = X2C_max_longint; + i = 0UL; + ssb = 0; + while (i10000L) nomid = 0L; + else if (nomid<0L) nomid = 10000L+nomid; + else nomid -= 10000L; + midfreq += (uint32_t)nomid; + if (ssb && max0-min0<200000UL) { + midfreq = (midfreq/200000UL)*200000UL+10000UL; + } + else midfreq = (midfreq/1000UL)*1000UL; + i = 0UL; + while (i2048000UL) khz = X2C_DIVL(2.048E+6,(double)iqrate); + fhz = (double)((int32_t)freq[i].hz-(int32_t)midfreq)*khz; + rxx[i].df = (uint32_t)((int32_t)X2C_TRUNCI(fhz,X2C_min_longint,X2C_max_longint)/1000L); + rem = fhz-(double)(((int32_t)X2C_TRUNCI(fhz,X2C_min_longint,X2C_max_longint)/1000L)*1000L); + rxx[i].dffrac = (uint32_t)X2C_TRUNCC(X2C_DIVL(rem,khz)+0.5,0UL, X2C_max_longcard); + /* rxx[i].df:=(freq[i].hz DIV 1000 - midfreq DIV 1000); */ + /* rxx[i].dffrac:=(freq[i].hz-rxx[i].df*1000) MOD 1000; */ + /*WrInt(nomid, 15);WrInt(midfreq, 15);WrInt(freq[i].hz, 15); + WrInt(rxx[i].df, 15); WrInt(rxx[i].dffrac, 15); + WrStrLn("n m h d fr"); */ + rxx[i].maxafc = freq[i].afc; + rxx[i].squelch = squelchs[i].lev!=0.0f; + rxx[i].width = freq[i].width; + rxx[i].agc = freq[i].agc; + rxx[i].modulation = freq[i].modulation; + rxx[i].shiftf=freq[i].shiftf; + + ++i; + } + prx[i] = 0; + } + if (midfreq<20000000UL) osi_WerrLn("no valid frequency", 19ul); + else if (midfreq!=lastmidfreq) { + setstickparm(1UL, midfreq); + /*WrStr("set ");WrInt(midfreq, 0); WrStrLn("kHz"); */ + lastmidfreq = midfreq; + } +} /* end centerfreq() */ + + +static void skip(const char s[], uint32_t s_len, uint32_t * p) +{ + while (s[*p] && s[*p]==' ') ++*p; +} /* end skip() */ + + +// send freq table +static void updateChanT(){ + + int i; + char tmp[15],tmp1[25]; + + sndbufft[0]=0; + strcat(sndbufft,"9 S K P "); + + while (prx[i]) { + sprintf(tmp,"%02i%06li",i+1,midfreq/1000+rxx[i].df); + tmp1[0]=tmp[0]; + tmp1[1]='0'; + tmp1[2]=tmp[1]; + tmp1[3]='0'; + tmp1[4]=tmp[2]; + tmp1[5]='0'; + tmp1[6]=tmp[3]; + tmp1[7]='0'; + tmp1[8]=tmp[4]; + tmp1[9]='0'; + tmp1[10]=tmp[5]; + tmp1[11]='0'; + tmp1[12]=tmp[6]; + tmp1[13]='0'; + tmp1[14]=tmp[7]; + tmp1[15]='0'; + tmp1[16]=tmp[8]; + tmp1[17]='0'; + tmp1[18]=0; + +// printf(sndbufft);printf("\n"); + strcat(sndbufft,tmp1); + ++i; + } + + osi_WrBin(fd, (char *)sndbufft, 1024u/1u, 1024); + osi_WrBin(fd, (char *)sndbufft, 1024u/1u, 1024); + osi_WrBin(fd, (char *)sndbufft, 1024u/1u, 1024); + osi_WrBin(fd, (char *)sndbufft, 1024u/1u, 1024); + +} + + +int file_is_modified(const char *path) { + struct stat file_stat; + float ret; + int err = stat(path, &file_stat); + + ret= file_stat.st_mtime > oldMTime; + oldMTime = file_stat.st_mtime; + return (int)ret; +} + + +static void rdconfig(void) +{ + int32_t len; + int32_t fd0; + uint32_t sq; + uint32_t wid; + uint32_t lpp; + uint32_t p; + uint32_t lino; + uint32_t n; + uint32_t i; + int32_t ssbsh; + int32_t m; + float sqcor; + double x; + char ok0; + char b[10001]; + char li[256]; + struct FREQTAB freq[64]; + char mo; + fd0 = osi_OpenRead(parmfn, 1001ul); + if (fd0>=0L) { + len = osi_RdBin(fd0, (char *)b, 10001u/1u, 10001UL); + if ((len>0L && len<10000L) && (uint8_t)b[len-1L]>=' ') b[len-1L] = 0; + p = 0UL; + lino = 1UL; + freqc = 0UL; + i = 0UL; + while ((int32_t)p=' ') { + if (i<255UL) { + li[i] = b[p]; + ++i; + } + } + else if (i>0UL) { + li[i] = 0; + i = 0UL; + skip(li, 256ul, &i); + mo = X2C_CAP(li[i]); + if (mo=='P') { + ++i; + skip(li, 256ul, &i); + card(li, 256ul, &i, &n, &ok0); + if (n>255UL || !ok0) { + osi_WerrLn("wrong parameter number", 23ul); + } + else { + skip(li, 256ul, &i); + int0(li, 256ul, &i, &m, &ok0); + if (!ok0) osi_WerrLn("wrong value", 12ul); + else setstickparm(n, (uint32_t)m); + } + i = 0UL; + } + else if (((mo=='F' || mo=='A') || mo=='U') || mo=='L') { + if (mo=='A') freq[freqc].modulation = 'a'; + else if (mo=='F') freq[freqc].modulation = 'f'; + else if (mo=='U') freq[freqc].modulation = 's'; + else if (mo=='L') freq[freqc].modulation = 's'; + else freq[freqc].modulation = 'f'; + ++i; + skip(li, 256ul, &i); + fix(li, 256ul, &i, &x, &ok0); + if (!ok0) osi_WerrLn("wrong MHz", 10ul); + skip(li, 256ul, &i); + int0(li, 256ul, &i, &m, &ok0); + if (!ok0) m = 0L; + ssbsh = 0L; + if (mo=='U') { + m += 1500L; + ssbsh = m; + } + else if (mo=='L') { + m -= 1500L; + ssbsh = m; + } + skip(li, 256ul, &i); + cardi(li, 256ul, &i, &n, &ok0); + if (!ok0) { + n=0; + } + + skip(li, 256ul, &i); + card(li, 256ul, &i, &sq, &ok0); + if (!ok0) sq = 0UL; + if (sq>200UL) sq = 200UL; + skip(li, 256ul, &i); + card(li, 256ul, &i, &lpp, &ok0); + if (!ok0) lpp = 0UL; + if (freq[freqc].modulation!='s' && lpp>100UL) lpp = 100UL; + skip(li, 256ul, &i); + card(li, 256ul, &i, &wid, &ok0); + if (!ok0) { + if (freq[freqc].modulation=='s') wid = 2800UL; + else if (freq[freqc].modulation=='a') wid = 6000UL; + else wid = 12000UL; + } + if (wid>1000000UL) wid = 1000000UL; + + + if (freqc>63UL) osi_WerrLn("freq table full", 16ul); + else { + x = x+offset; + if (x<=0.0 || x>=2.147483E+6) { + osi_WerrLn("freq out of range", 18ul); + x = 0.0; + } + x = x*1.E+6+(double)ssbsh; + + freq[freqc].hz = (uint32_t)X2C_TRUNCC(x+0.5,0UL, X2C_max_longcard); + freq[freqc].afc = m; + freq[freqc].shiftf = n; + freq[freqc].width = wid; + freq[freqc].agc = lpp; + + printf ("%u AFC:%u, SH:%i, WI:%u\r\n",freq[freqc].hz,freq[freqc].afc,freq[freqc].shiftf,freq[freqc].width); + + sqcor=32+(192000/(samphz/1.14)-13.68); + + squelchs[freqc].lev = X2C_DIVR((float)sq*sqcor,200.0f); + if (freq[freqc].modulation=='s') squelchs[freqc].lp = 0.0f; + else squelchs[freqc].lp = X2C_DIVR((float)lpp,200.0f); + ++freqc; + } + i = 0UL; + } + else if (mo=='#' || (uint8_t)mo<=' ') i = 0UL; + else osi_WerrLn("unkown command", 15ul); + ++lino; + } + ++p; + } + osic_Close(fd0); + + } + else Error("config file not readable", 25ul); + centerfreq(freq, 64ul); + +} /* end rdconfig() */ + + +static void showrssi(void) +{ + int wfall[] = {238,17,18,19,20,21,27,33,39,28,34,40,46,118,154,190,226,208,214,202,198,197,196}; + unsigned char k,j, i; + int lvl; + float lvlf; + char s[31],tmp[10]; + char fname[30],line[100]; + FILE* stream; + + + i = 0UL; + osi_Werr("\e[1;1H\e[2J",10ul); + + sprintf(tmp,"Param[1]: %i\n",stickparm[1].val); + osi_Werr(tmp,strlen(tmp)+1); + sprintf(tmp,"Param[5]: %i\n",stickparm[5].val); + osi_Werr(tmp,strlen(tmp)+1); + sprintf(tmp,"Param[8]: %i\n\n",stickparm[8].val); + osi_Werr(tmp,strlen(tmp)+1); + + + if(wtfno>0){ + sprintf(fname,"/tmp/sdr%d.bin",wtfno); + stream = fopen(fname, "w"); + + sprintf(line,"1;%i\n",stickparm[1].val); + fputs(line,stream); + sprintf(line,"5;%i\n",stickparm[5].val); + fputs(line,stream); + sprintf(line,"8;%i\n",stickparm[8].val); + fputs(line,stream); + + } + + + printf("Ch.|Freq kHz| RSSI |Shift kHz\n"); + printf("-------------------------------------------------\n"); + + while (prx[i]) { + j = prx[i]->idx; + sprintf(tmp,"%02i | %li | ",j+1,midfreq/1000+rxx[j].df); + osi_Werr(tmp,strlen(tmp)+1); + lvlf=osic_ln((rxx[j].rssit[0]+1.0f)*3.0517578125E-5f)*4.342944819f; + aprsstr_FixToStr(lvlf, 2UL, s, 31ul); + + osi_Werr(s, 31ul); + if (squelchs[j].sqsave<=0L) osi_Werr("db", 3ul); + else osi_Werr("dB", 3ul); + + + if(wtfno>0){ + + for(k=15;k>0;k--){ + rxx[j].rssitf[k]=rxx[j].rssitf[k-1]; + } + rxx[j].rssitf[0]=lvlf; + + sprintf(line,"%02i;%li;%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\r\n",j+1,midfreq/1000+rxx[j].df, + (unsigned char)rxx[j].rssitf[0], + (unsigned char)rxx[j].rssitf[1], + (unsigned char)rxx[j].rssitf[2], + (unsigned char)rxx[j].rssitf[3], + (unsigned char)rxx[j].rssitf[4], + (unsigned char)rxx[j].rssitf[5], + (unsigned char)rxx[j].rssitf[6], + (unsigned char)rxx[j].rssitf[7], + (unsigned char)rxx[j].rssitf[8], + (unsigned char)rxx[j].rssitf[9], + (unsigned char)rxx[j].rssitf[10], + (unsigned char)rxx[j].rssitf[11], + (unsigned char)rxx[j].rssitf[12], + (unsigned char)rxx[j].rssitf[13], + (unsigned char)rxx[j].rssitf[14], + (unsigned char)rxx[j].rssitf[15]); + fputs(line,stream); + } + + lvl=(int)((lvlf-25)/2)-1; + if(lvl>22) lvl=22; + if(lvl<0) lvl=0; + + sprintf(tmp," \e[48;5;%im \e[48;5;0m",wfall[lvl]); + osi_Werr(tmp,strlen(tmp)); + + for(k=1;k<16;k++){ + if(rxx[j].rssit[k]>22) rxx[j].rssit[k]=22; + if(rxx[j].rssit[k]<0) rxx[j].rssit[k]=0; + sprintf(tmp,"\e[48;5;%im \e[48;5;0m",wfall[(int)rxx[j].rssit[k]]); + osi_Werr(tmp,strlen(tmp)); + } + for(k=15;k>0;k--){ + rxx[j].rssit[k]=rxx[j].rssit[k-1]; + } + rxx[j].rssit[1]=(float)lvl; + + /* + IF NOT nosquelch & rxx[j].squelch THEN + Werr(" "); FixToStr(squelchs[j].medmed*(1.0/SAMPSIZE), 3, s); + Werr(s); + END; + */ + if (rxx[j].modulation=='f') { + osi_Werr(" | ", 4ul); + aprsstr_IntToStr(rxx[j].afckhz, 0UL, s, 31ul); + osi_Werr(s, 31ul); + osi_Werr(" \n", 2ul); + } + /*Werr(" "); IntToStr(squelchs[j].wakeness, 0, s); Werr(s); Werr(" "); + */ + ++i; + } + osi_Werr(" \015", 6ul); + osic_flush(); + if(wtfno>0) fclose(stream); +} /* end showrssi() */ + +static int32_t sp; + +static int32_t sn; + +static uint32_t rp; + +static uint32_t actch; + +static uint32_t ticker; + +static uint32_t ix; + +static uint32_t tshow; + +static uint32_t dsamp; + +static char recon; + +static int32_t pcm; + +static int32_t mixleft; + +static int32_t mixright; + +static int32_t levdiv2; + + +static void sendaudio(int32_t pcm0, char pcm80, uint32_t ch) +{ + if (pcm0>32767L) pcm0 = 32767L; + else if (pcm0<-32767L) pcm0 = -32767L; + if (pcm80) sndbuf8[sndw] = (uint8_t)((uint32_t)(pcm0+32768L)/256UL); + else { + /* code data in watermark */ + /* + IF watermark THEN + pcm:=CAST(INTEGER, CAST(SET32, pcm)*SET32{2..15} + ); (* use bit 1 *) + WITH squelchs[ch] DO + IF waterp>0 THEN (* data to send *) + wb:=waterdat[waterp] + IF wb*SET32{0}<>SET32{} + ) THEN INC(pcm, 2) END; (* send a 1 *) + wb:=SHIFT(wb, -1); + waterdat[waterp]:=wb; + IF wb=SET32{0}) THEN DEC(waterp) END; (* next 9 bit word *) + END; + END; + ELSE + */ + pcm0 = (int32_t)((uint32_t)pcm0&0xFFFEUL); + /* + END; + */ + if (ch==0UL) ++pcm0; + /* code data in watermark */ + sndbuf[sndw] = (short)pcm0; + } + ++sndw; + if (sndw>1023UL) { + if (pcm80) osi_WrBin(fd, (char *)sndbuf8, 1024u/1u, sndw); + else osi_WrBin(fd, (char *)sndbuf, 2048u/1u, sndw*2UL); + sndw = 0UL; + } +} /* end sendaudio() */ + + +static void userio(void) +{ + if (file_is_modified(parmfn)){ + rdconfig(); + setparms(recon); + updateChanT(); + } + recon = 0; + if (verb) showrssi(); + +} /* end userio() */ + + +static void schedule(void) +{ + uint32_t j; + uint32_t i; + i = 0UL; + j = 0UL; + while (j0L && (int32_t)(ticker-squelchs[j].nexttick) + >=0L) { + /* rx run */ + squelchs[j].nexttick = ticker; + prx[i] = &rxx[j]; + ++i; + } + ++j; + } + prx[i] = 0; +} /* end schedule() */ + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + int32_t tmp; + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + sdr_BEGIN(); + aprsstr_BEGIN(); + osi_BEGIN(); + midfreq = 0UL; + lastmidfreq = 0UL; + tshow = 0UL; + levdiv2 = 256L; + memset((char *)rxx,(char)0,sizeof(struct sdr_RX [64])); + memset((char *)stickparm,(char)0,sizeof(struct STICKPARM [256])); + memset((char *)squelchs,(char)0,sizeof(struct SQUELCH [65])); + Parms(); + oldMTime=0; + actch = 0UL; + ticker = 0UL; + prx[0U] = 0; + for (freqc = 0UL; freqc<=63UL; freqc++) { + rxx[freqc].samples = (sdr_pAUDIOSAMPLE)sampx[freqc]; + rxx[freqc].idx = freqc; + } /* end for */ + if (sdr_startsdr(url, 1001ul, port, 1001ul, iqrate, samphz, reconn)) { + rdconfig(); + updateChanT(); +// file_is_modified(parmfn); + sndw = 0UL; + fd = osi_OpenWrite(soundfn, 1001ul); + if (fd>=0L) { + recon = 1; + rdconfig(); + updateChanT(); + + for (;;) { + if (tshow==0UL) { + userio(); + tshow = samphz/32UL; + } + else --tshow; + schedule(); + sn = sdr_getsdr(32UL, prx, 65ul); + if (sn<0L) { + if (verb) { + if (sn==-2L) { + osi_WerrLn("impossible sampelrate conversion", 33ul); + } + else osi_WerrLn("connection lost", 16ul); + } + recon = 1; + if (!reconn) break; + } + else { + rp = 0UL; + while (prx[rp]) { + ix = prx[rp]->idx; + { /* with */ + struct SQUELCH * anonym = &squelchs[ix]; + if (anonym->lev==0.0f || prx[rp]->modulation=='s') { + squelchs[ix].mutlev = 1.0f; + } + else { + if (anonym->levsqsave>0L) { + --anonym->sqsave; + } + else { + if (anonym->wakeness<(int32_t)powersave) { + ++anonym->wakeness; + } + anonym->nexttick = ticker+(uint32_t) anonym->wakeness; + } + } + else { + /* squelch open */ + if (anonym->sqsave<(int32_t)maxwake) { + ++anonym->sqsave; + } + if (anonym->wakeness>-100L) { + --anonym->wakeness; + } + } + if (nosquelch || rxx[ix].modulation=='s') { + anonym->mutlev = 1.0f; + } + else { + anonym->medmed = anonym->medmed+(rxx[ix].sqsum-anonym->medmed)*0.1f; + anonym->mutlev = (anonym->lev-anonym->medmed)*0.3125f; + if (anonym->mutlev<0.0f) { + anonym->mutlev = 0.0f; + } + else if (anonym->mutlev>1.0f) { + anonym->mutlev = 1.0f; + } + } + } + } + rxx[ix].sqsum = 0.0f; + ++rp; + } + tmp = sn-1L; + sp = 0L; + if (sp<=tmp) for (;; sp++) { + rp = 0UL; + while (prx[rp]) { + ix = prx[rp]->idx; + { /* with */ + struct SQUELCH * anonym0 = &squelchs[ix]; + anonym0->pcmc = (int32_t)rxx[ix].samples[sp]; + if (!nosquelch) { + anonym0->pcmc = (int32_t)(short)X2C_TRUNCI((float)anonym0->pcmc*anonym0->mutlev,-32768,32767); + } + /* lowpass */ + if (anonym0->lp!=0.0f) { + anonym0->u1 = anonym0->u1+(((float)(anonym0->pcmc*2L)-anonym0->u1)-anonym0->il)*anonym0->lp; + anonym0->u2 = anonym0->u2+(anonym0->il-anonym0->u2)*anonym0->lp; + anonym0->il = anonym0->il+(anonym0->u1-anonym0->u2)*anonym0->lp*2.0f; + anonym0->pcmc = (int32_t)X2C_TRUNCI(anonym0->u2, X2C_min_longint,X2C_max_longint); + } + } + /* lowpass */ + ++rp; + } + if (dsamp==0UL) { + rp = 0UL; + while (rp>8, pcm8, rp); + if (mixto==2UL) { + sendaudio(mixright*levdiv2>>8, pcm8, rp); + } + if (labs(mixleft)>32767L || labs(mixright) >32767L) { + if (levdiv2>20L) { + --levdiv2; + } + } + else if (levdiv2<256L) { + ++levdiv2; + } + mixleft = 0L; + mixright = 0L; + } + } + ++rp; + } + } + if (dsamp==0UL) dsamp = downsamp; + else --dsamp; + if (sp==tmp) break; + } /* end for */ + } + ++ticker; + } + } + else { + osi_Werr(soundfn, 1001ul); + osi_WerrLn(" sound file open error", 23ul); + } + if (verb) osi_WerrLn("connection lost", 16ul); + } + else osi_WerrLn("not connected", 14ul); + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/sem.c b/src/sem.c new file mode 100644 index 0000000..6ca48de --- /dev/null +++ b/src/sem.c @@ -0,0 +1,283 @@ +/** +\file sem.c +\brief GNSS core 'c' function library: SEM format almanacs. +\author Glenn D. MacGougan (GDM) +\date 2006-11-10 +\since 2005-08-14 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#include +#include +#include "gnss_error.h" +#include "sem.h" +#include "constants.h" + +#ifndef WIN32 +#define _CRT_SECURE_NO_DEPRECATE +#endif + + +BOOL SEM_ReadAlmanacDataFromFile( + const char* semFilePath, //!< path to the input SEM ASCII file + SEM_structAlmanac* alm, //!< pointer to an array of SEM almanac structs + unsigned char max_to_read, //!< length of the array + unsigned char* number_read //!< number of almanac items read + ) +{ + FILE* in; // the input file pointer + int n; // counter to indicate the number of items read by sscanf + unsigned char i; // counter + unsigned utmp; // tmp used in fscanf input + unsigned number_of_records; // number of records in file + unsigned week; // gps week [week] + unsigned toa; // time of almanac applicability [s] + double dtmp; // tmp used in fscanf input + char description[128]; // file descriptor + + // initialize + *number_read = 0; + + // check stupid error + if( max_to_read < 1 ) + { + GNSS_ERROR_MSG( "if( max_to_read < 1 )" ); + return FALSE; + } + +#ifndef _CRT_SECURE_NO_DEPRECATE + if( fopen_s( &in, semFilePath, "r" ) != 0 ) + { + char msg[128]; + sprintf( msg, "Unable to open %s.", semFilePath ); + GNSS_ERROR_MSG( msg ); + return FALSE; + } + if( !in ) + { + char msg[128]; + sprintf( msg, "Unable to open %s.", semFilePath ); + GNSS_ERROR_MSG( msg ); + return FALSE; + } + + n = fscanf_s( in, "%u", &number_of_records ); if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + if( number_of_records < 1 ) + { + GNSS_ERROR_MSG( "if( number_of_records < 1 )" ); + return FALSE; + } + + n = fscanf_s( in, "%s", description ); + if(n != 1) + { + GNSS_ERROR_MSG( "fscanf failed." ); + return FALSE; + } + n = fscanf_s( in, "%u", &week ); + if(n != 1) + { + GNSS_ERROR_MSG( "fscanf failed." ); + return FALSE; + } + n = fscanf_s( in, "%u", &toa ); + if(n != 1) + { + GNSS_ERROR_MSG( "fscanf failed." ); + return FALSE; + } + + for( i = 0; i < number_of_records && i < max_to_read; i++ ) + { + alm[i].week = (unsigned short) week; + alm[i].toa = toa; + n = fscanf_s( in, "%u", &utmp ); if(n != 1){break;} alm[i].prn = (unsigned short)utmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + n = fscanf_s( in, "%u", &utmp ); if(n != 1){break;} alm[i].svn = (unsigned short)utmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + n = fscanf_s( in, "%u", &utmp ); if(n != 1){break;} alm[i].ura = (unsigned char)utmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].ecc = dtmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].i0 = dtmp*PI; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} // convert to radians + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].omegadot = dtmp*PI; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} // convert to radians + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].sqrta = dtmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].omega0 = dtmp*PI; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} // convert to radians + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].w = dtmp*PI; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} // convert to radians + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].m0 = dtmp*PI; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} // convert to radians + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].af0 = dtmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + n = fscanf_s( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].af1 = dtmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + + n = fscanf_s( in, "%u", &utmp ); if(n != 1){break;} alm[i].health = (unsigned char)utmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + n = fscanf_s( in, "%u", &utmp ); if(n != 1){break;} alm[i].config_code = (unsigned char)utmp; if(n != 1){GNSS_ERROR_MSG( "fscanf failed." );return FALSE;} + + *number_read = (unsigned char)(i+1); + } + + fclose(in); +#else + in = fopen( semFilePath, "r" ); + if( !in ) + { + char msg[128]; + sprintf( msg, "Unable to open %s.", semFilePath ); + GNSS_ERROR_MSG( msg ); + return FALSE; + } + + n = fscanf( in, "%u", &number_of_records ); if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + if( number_of_records < 1 ) + { + GNSS_ERROR_MSG( "if( number_of_records < 1 )" ); + return FALSE; + } + + n = fscanf( in, "%127s", description ); if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%u", &week ); if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%u", &toa ); if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + + + for( i = 0; i < number_of_records && i < max_to_read; i++ ) + { + alm[i].week = (unsigned short) week; + alm[i].toa = toa; + n = fscanf( in, "%u", &utmp ); if(n != 1){break;} alm[i].prn = (unsigned short)utmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%u", &utmp ); if(n != 1){break;} alm[i].svn = (unsigned short)utmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%u", &utmp ); if(n != 1){break;} alm[i].ura = (unsigned char)utmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].ecc = dtmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].i0 = dtmp*PI; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} // convert to radians + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].omegadot = dtmp*PI; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} // convert to radians + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].sqrta = dtmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].omega0 = dtmp*PI; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} // convert to radians + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].w = dtmp*PI; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} // convert to radians + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].m0 = dtmp*PI; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} // convert to radians + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].af0 = dtmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%lf", &dtmp ); if(n != 1){break;} alm[i].af1 = dtmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + + n = fscanf( in, "%u", &utmp ); if(n != 1){break;} alm[i].health = (unsigned char)utmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + n = fscanf( in, "%u", &utmp ); if(n != 1){break;} alm[i].config_code = (unsigned char)utmp; if(n != 1){GNSS_ERROR_MSG("fscanf failed.");return FALSE;} + + *number_read = (unsigned char)(i+1); + } + + fclose(in); +#endif + + return TRUE; +} + + +BOOL SEM_WriteAlmanacDataToFile( + const char* semFilePath, //!< path to the output SEM ASCII file + SEM_structAlmanac* alm, //!< pointer to an array of SEM almanac structs + unsigned char number_to_write //!< length of the array + ) +{ + char buffer[1024]; + unsigned char i; + + FILE* out; + +#ifndef _CRT_SECURE_NO_DEPRECATE + if( fopen_s( &out, semFilePath, "w") != 0 ) + { + char msg[128]; + sprintf( msg, "Unable to open %s.", semFilePath ); + GNSS_ERROR_MSG( msg ); + return FALSE; + } + if( !out ) + { + char msg[128]; + sprintf( msg, "Unable to open %s.", semFilePath ); + GNSS_ERROR_MSG( msg ); + return FALSE; + } +#else + out = fopen(semFilePath, "w"); + if( !out ) + { + char msg[128]; + sprintf( msg, "Unable to open %s.", semFilePath ); + GNSS_ERROR_MSG( msg ); + return FALSE; + } +#endif + + fprintf( out, "%d %s\n", number_to_write, "CURRENT.ALM" ); + fprintf( out, "%d %d\n\n", alm[0].week, alm[0].toa ); + + for( i = 0; i < number_to_write; i++ ) + { + SEM_WriteSingleAlmanacElementToBuffer( alm[i], buffer, 1024 ); + fprintf( out, "%s", buffer ); + } + + fclose(out); + return TRUE; +} + + +BOOL SEM_WriteSingleAlmanacElementToBuffer( + SEM_structAlmanac alm, //!< SEM almanac struct + char* buffer, //!< buffer to write the SEM struct information + unsigned short bufferSize //!< size of the buffer, must be greater than 1024 bytes + ) +{ + int scount = 0; + +#ifndef _CRT_SECURE_NO_DEPRECATE + int dcount = 0; + if( bufferSize < 1024 ) + { +// sprintf_s( buffer, bufferSize, "" ); + GNSS_ERROR_MSG( "if( bufferSize < 1024 )" ); + return FALSE; + } + dcount = sprintf_s( buffer+scount, bufferSize-scount, "%d\n%d\n%d\n", alm.prn, alm.svn, alm.ura ); if( dcount < 0 ){ GNSS_ERROR_MSG("sprintf failed.");return FALSE; }else{ scount += dcount; } + dcount = sprintf_s( buffer+scount, bufferSize-scount, "%-23.14g %23.14g %23.14g\n", alm.ecc, alm.i0/PI, alm.omegadot/PI ); if( dcount < 0 ){ GNSS_ERROR_MSG("sprintf failed.");return FALSE; }else{ scount += dcount; } + dcount = sprintf_s( buffer+scount, bufferSize-scount, "%-23.14g %23.14g %23.14g\n", alm.sqrta, alm.omega0/PI, alm.w/PI ); if( dcount < 0 ){ GNSS_ERROR_MSG("sprintf failed.");return FALSE; }else{ scount += dcount; } + dcount = sprintf_s( buffer+scount, bufferSize-scount, "%-23.14g %23.14g %23.14g\n", alm.m0/PI, alm.af0, alm.af1 ); if( dcount < 0 ){ GNSS_ERROR_MSG("sprintf failed.");return FALSE; }else{ scount += dcount; } + dcount = sprintf_s( buffer+scount, bufferSize-scount, "%d\n%d\n\n", alm.health, alm.config_code ); if( dcount < 0 ){ GNSS_ERROR_MSG("sprintf failed.");return FALSE; }else{ scount += dcount; } +#else + if( bufferSize < 1024 ) + { +// sprintf( buffer, "" ); + GNSS_ERROR_MSG( "if( bufferSize < 1024 )" ); + return FALSE; + } + scount += sprintf( buffer+scount, "%d\n%d\n%d\n", alm.prn, alm.svn, alm.ura ); + scount += sprintf( buffer+scount, "%-23.14g %23.14g %23.14g\n", alm.ecc, alm.i0/PI, alm.omegadot/PI ); + scount += sprintf( buffer+scount, "%-23.14g %23.14g %23.14g\n", alm.sqrta, alm.omega0/PI, alm.w/PI ); + scount += sprintf( buffer+scount, "%-23.14g %23.14g %23.14g\n", alm.m0/PI, alm.af0, alm.af1 ); + scount += sprintf( buffer+scount, "%d\n%d\n\n", alm.health, alm.config_code ); +#endif + + return TRUE; +} + diff --git a/src/sem.h b/src/sem.h new file mode 100644 index 0000000..e5c185d --- /dev/null +++ b/src/sem.h @@ -0,0 +1,139 @@ +/** +\file sem.h +\brief GNSS core 'c' function library: SEM format almanacs. +\author Glenn D. MacGougan (GDM) +\date 2006-11-10 +\since 2005-08-14 + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_SEM_H_ +#define _C_SEM_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "basictypes.h" + + +/// \brief A limited set of satellite orbit parameters that is used to +/// calculate GPS satellite positions and velocities. In the +/// ephemeris structure below, the parameters for computing +/// satellite clock corrections are also included. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2006-11-10 +/// \since 2005-08-15 +/// +/// \remarks +/// (1) Struct packaging: compatible with 4 and 8 byte packing \n +/// (2) The af0 and af1 parameters are typically from low precision sources like the true broadcast +/// GPS almanacs. The af0 and af1 parameters are preferred from ephemeris download as they have +/// higher precision. \n +/// +/// \b REFERENCES \n +/// [1] http://www.navcen.uscg.gov/gps/almanacs.htm +/// +typedef struct +{ + unsigned toa; //!< almanac time of applicability (reference time) [s] + unsigned short week; //!< 10 bit gps week 0-1023 (user must account for week rollover) [week] + unsigned short prn; //!< GPS prn number [] + unsigned short reserved; //!< reserved + unsigned short svn; //!< Satellite vehicle number [] + unsigned char ura; //!< User Range Accuracy lookup code, [0-15], see p. 83 GPSICD200C, 0 is excellent, 15 is use at own risk + unsigned char health; //!< 0=healthy, unhealthy otherwise [], subframe 4 and 5, page 25 six-bit health code + unsigned char config_code; //!< configuration code [], if >=9 Anti-Spoofing is on + + // this inicator is not part of the SEM standard but is added by the user if known + unsigned char is_af0_af1_high_precision; //!< indicates precision of af0 and af1 [1=high precision,0=low precision] (22&16 bits, ephemeris source) vs (11&11 bits, almanac source), 0 is typical for most SEM sources + + double ecc; //!< eccentricity [] + double i0; //!< orbital inclination at reference time [rad] + double omegadot; //!< rate of right ascension [rad/s] + double sqrta; //!< square root of the semi-major axis [m^(1/2)] + double omega0; //!< longitude of ascending node of orbit plane at weekly epoch [rad] + double w; //!< argument of perigee [rad] + double m0; //!< mean anomaly at reference time [rad] + double af0; //!< polynomial clock correction coefficient (clock bias) [s], Note: parameters from ephemeris preferred vs almanac (22 vs 11 bits) + double af1; //!< polynomial clock correction coefficient (clock drift) [s/s], Note: parameters from ephemeris preferred vs almanac (16 vs 11 bits) + +} SEM_structAlmanac; + + +/// Load an array of SEM format almanac structs from the ASCII file path specified. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2006-11-10 +/// \since 2005-08-14 +/// \return TRUE(1) if successful, FALSE(0) otherwise +/// +BOOL SEM_ReadAlmanacDataFromFile( + const char* semFilePath, //!< path to the input SEM ASCII file + SEM_structAlmanac* alm, //!< pointer to an array of SEM almanac structs + unsigned char max_to_read, //!< length of the array + unsigned char* number_read //!< number of almanac items read + ); + + +/// Write an array of SEM format almanac structs to the ASCII file path specified. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2006-11-10 +/// \since 2005-08-15 +/// \return TRUE(1) if successful, FALSE(0) otherwise +/// +BOOL SEM_WriteAlmanacDataToFile( + const char* semFilePath, //!< path to the output SEM ASCII file + SEM_structAlmanac* alm, //!< pointer to an array of SEM almanac structs + unsigned char number_to_write //!< length of the array + ); + + +/// Print a SEM format almanac struct to buffer supplied. +/// +/// \author Glenn D. MacGougan (GDM) +/// \date 2006-11-10 +/// \since 2005-08-15 +/// \return TRUE(1) if successful, FALSE(0) otherwise +/// +BOOL SEM_WriteSingleAlmanacElementToBuffer( + SEM_structAlmanac alm, //!< SEM almanac struct + char* buffer, //!< buffer to write the SEM struct information + unsigned short bufferSize //!< size of the buffer, must be greater than 1024 bytes + ); + +#ifdef __cplusplus +} +#endif + + +#endif // _C_SEM_H_ diff --git a/src/sondeaprs.c b/src/sondeaprs.c new file mode 100644 index 0000000..219ed9b --- /dev/null +++ b/src/sondeaprs.c @@ -0,0 +1,1294 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef sondeaprs_H_ +#include "sondeaprs.h" +#endif +#define sondeaprs_C_ +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef udp_H_ +#include "udp.h" +#endif + +char sondeaprs_via[100]; +char sondeaprs_destcall[100]; +char sondeaprs_objname[100]; +char sondeaprs_commentfn[1025]; +char sondeaprs_sym[2]; +uint32_t sondeaprs_beacontime; +uint32_t sondeaprs_lowaltbeacontime; +uint32_t sondeaprs_lowalt; +uint32_t sondeaprs_toport; +uint32_t sondeaprs_ipnum; +char sondeaprs_verb; +char sondeaprs_verb2; +char sondeaprs_nofilter; +int32_t sondeaprs_comptyp; +int32_t sondeaprs_micessid; +int32_t sondeaprs_udpsock; +char sondeaprs_anyip; +char sondeaprs_sendmon; +char sondeaprs_dao; +/* encode demodulated sonde to aprs axudp by OE5DXL */ +/*FROM TimeConv IMPORT time; */ +/*FROM RealMath IMPORT ln; */ +/*FROM Storage IMPORT ALLOCATE; */ +#define sondeaprs_CR "\015" + +#define sondeaprs_LF "\012" + +#define sondeaprs_KNOTS 1.851984 + +#define sondeaprs_FEET 3.2808398950131 + +#define sondeaprs_LINESBUF 60 +/* seconds pos history */ + +#define sondeaprs_PI 3.1415926535898 + +#define sondeaprs_DAYSEC 86400 + +#define sondeaprs_RAD 1.7453292519943E-2 + +#define sondeaprs_MAXHRMS 50.0 +/* not send if gps h pos spreads more meters */ + +#define sondeaprs_MAXVRMS 500.0 +/* not send if gps v pos spreads more meters */ + +#define sondeaprs_MAXAGE 86400 +/* context lifetime */ + +enum ERRS {sondeaprs_ePRES, sondeaprs_eTEMP, sondeaprs_eHYG, + sondeaprs_eSPEED, sondeaprs_eDIR, sondeaprs_eLAT, + sondeaprs_eLONG, sondeaprs_eALT, sondeaprs_eMISS, + sondeaprs_eRMS}; + + +struct DATLINE; + + +struct DATLINE { + double hpa; + double temp; + double hyg; + double alt; + double speed; + double dir; + double lat; + double long0; + /*- climb, */ + double clb; + uint32_t time0; + uint32_t uptime; +}; + +struct POSITION; + + +struct POSITION { + double long0; + double lat; +}; + +typedef struct DATLINE DATS[60]; + +struct CONTEXT; + +typedef struct CONTEXT * pCONTEXT; + + +struct CONTEXT { + pCONTEXT next; + char name[12]; + DATS dat; + double speedsum; + uint32_t speedcnt; + uint32_t lastused; + uint32_t lastbeacon; + uint32_t commentline; +}; + +/*CRCL, CRCH: ARRAY[0..255] OF SET8;*/ +static pCONTEXT contexts; +/* dat :ARRAY[0..LINESBUF-1] OF DATLINE; */ + +/* speedsum:LONGREAL; */ +/* speedcnt:CARDINAL; */ +static uint16_t chk; + +/* systime, lastbeacon:TIME; */ +/* commentline:CARDINAL; */ + +static uint32_t truncc(double r) +{ + if (r<=0.0) return 0UL; + else if (r>=2.E+9) return 2000000000UL; + else return (uint32_t)X2C_TRUNCC(r,0UL,X2C_max_longcard); + return 0; +} /* end truncc() */ + + +extern int32_t sondeaprs_GetIp(char h[], uint32_t h_len, + uint32_t * p, uint32_t * ip, uint32_t * port) +{ + uint32_t n; + uint32_t i; + char ok0; + int32_t sondeaprs_GetIp_ret; + X2C_PCOPY((void **)&h,h_len); + *p = 0UL; + h[h_len-1] = 0; + *ip = 0UL; + for (i = 0UL; i<=4UL; i++) { + n = 0UL; + ok0 = 0; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + ok0 = 1; + n = (n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + if (!ok0) { + sondeaprs_GetIp_ret = -1L; + goto label; + } + if (i<3UL) { + if (h[*p]!='.' || n>255UL) { + sondeaprs_GetIp_ret = -1L; + goto label; + } + *ip = *ip*256UL+n; + } + else if (i==3UL) { + *ip = *ip*256UL+n; + if (h[*p]!=':' || n>255UL) { + sondeaprs_GetIp_ret = -1L; + goto label; + } + } + else if (n>65535UL) { + sondeaprs_GetIp_ret = -1L; + goto label; + } + *port = n; + ++*p; + } /* end for */ + sondeaprs_GetIp_ret = 0L; + label:; + X2C_PFREE(h); + return sondeaprs_GetIp_ret; +} /* end GetIp() */ + + +static void comment0(char buf[], uint32_t buf_len, uint32_t uptime, + uint32_t sats, double hrms, uint32_t * linec) +{ + int32_t len; + int32_t lc; + int32_t eol; + int32_t bol; + int32_t i; + int32_t f; + char fb[32768]; + char h[100]; + buf[0UL] = 0; + len = 0L; + if (sondeaprs_commentfn[0UL]) { + f = osi_OpenRead(sondeaprs_commentfn, 1025ul); + if (f>=0L) { + len = osi_RdBin(f, (char *)fb, 32768u/1u, 32767UL); + osic_Close(f); + while (len>0L && (uint8_t)fb[len-1L]<=' ') --len; + if (len>0L && len<32767L) { + fb[len] = '\012'; + ++len; + } + do { + lc = (int32_t)*linec; + eol = 0L; + for (;;) { + bol = eol; + while (eol=len) { + bol = eol; + if (*linec) { + lc = 1L; + *linec = 0UL; + } + break; + } + if (fb[bol]!='#') { + if (lc==0L) { + ++*linec; + break; + } + --lc; + } + ++eol; + } + } while (lc); + if (eol+2L>=bol && fb[bol]=='%') { + if (fb[bol+1L]=='u') { + /* insert uptime */ + if (uptime>0UL) { + strncpy(fb," powerup h:m:s ",32768u); + aprsstr_TimeToStr(uptime, h, 100ul); + aprsstr_Append(fb, 32768ul, h, 100ul); + } + else fb[0] = 0; + } + else if (fb[bol+1L]=='v') { + /* insert version */ + strncpy(fb," sondemod(c) 2.0",32768u); + } + else if (fb[bol+1L]=='s') { + /* insert sat count */ + if (sats>0UL) { + strncpy(fb," Sats ",32768u); + aprsstr_IntToStr((int32_t)sats, 1UL, h, 100ul); + aprsstr_Append(fb, 32768ul, h, 100ul); + } + else fb[0] = 0; + } + else if (fb[bol+1L]=='r') { + /* hrms +3m from tropomodel */ + if (sats>4UL) { + strncpy(fb," hdil=",32768u); + aprsstr_FixToStr((float)(hrms+3.0), 2UL, h, 100ul); + aprsstr_Append(fb, 32768ul, h, 100ul); + aprsstr_Append(fb, 32768ul, "m", 2ul); + } + else fb[0] = 0; + } + else fb[0] = 0; + bol = 0L; + eol = (int32_t)aprsstr_Length(fb, 32768ul); + } + i = 0L; + while (bol", 2ul); + aprsstr_Append(b, 201ul, destcall, destcall_len); + if (micessid>0UL) { + aprsstr_Append(b, 201ul, "-", 2ul); + aprsstr_Append(b, 201ul, (char *)(tmp = (char)(micessid+48UL), + &tmp), 1u/1u); + } + if (via[0UL]) { + aprsstr_Append(b, 201ul, ",", 2ul); + aprsstr_Append(b, 201ul, via, via_len); + } + if (comp0==0UL) { + /* uncompressed */ + aprsstr_Append(b, 201ul, ":;", 3ul); + aprsstr_Assign(h, 201ul, obj, obj_len); + aprsstr_Append(h, 201ul, " ", 10ul); + h[9U] = 0; + aprsstr_Append(b, 201ul, h, 201ul); + aprsstr_Append(b, 201ul, "*", 2ul); + aprsstr_DateToStr(time0, ds, 201ul); + ds[0U] = ds[11U]; + ds[1U] = ds[12U]; + ds[2U] = ds[14U]; + ds[3U] = ds[15U]; + ds[4U] = ds[17U]; + ds[5U] = ds[18U]; + ds[6U] = 0; + aprsstr_Append(b, 201ul, ds, 201ul); + aprsstr_Append(b, 201ul, "h", 2ul); + i = aprsstr_Length(b, 201ul); + a = fabs(lat); + n = osi_realcard((float)a); + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + n = osi_realcard((float)((a-(double)(float)n)*6000.0)); + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = '.'; + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + if (lat>=0.0) b[i] = 'N'; + else b[i] = 'S'; + ++i; + b[i] = sym[0UL]; + ++i; + a = fabs(long0); + n = osi_realcard((float)a); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + n = osi_realcard((float)((a-(double)(float)n)*6000.0)); + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = '.'; + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + if (lat>=0.0) b[i] = 'E'; + else b[i] = 'W'; + ++i; + b[i] = sym[1UL]; + ++i; + if (speed>0.5) { + n = osi_realcard((float)(course+1.5)); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + b[i] = '/'; + ++i; + n = osi_realcard((float)(speed*5.3996146834962E-1+0.5)); + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + if (alt>0.5) { + b[i] = '/'; + ++i; + b[i] = 'A'; + ++i; + b[i] = '='; + ++i; + n = osi_realcard((float)fabs(alt*3.2808398950131+0.5)); + if (alt>=0.0) b[i] = num(n/100000UL); + else b[i] = '-'; + ++i; + b[i] = num(n/10000UL); + ++i; + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + } + else if (comp0==1UL) { + /* compressed */ + aprsstr_Append(b, 201ul, ":!", 3ul); + i = aprsstr_Length(b, 201ul); + b[i] = sym[0UL]; + ++i; + if (lat<90.0) n = osi_realcard((float)((90.0-lat)*3.80926E+5)); + else n = 0UL; + b[i] = (char)(33UL+n/753571UL); + ++i; + b[i] = (char)(33UL+(n/8281UL)%91UL); + ++i; + b[i] = (char)(33UL+(n/91UL)%91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + if (long0>(-180.0)) { + n = osi_realcard((float)((180.0+long0)*1.90463E+5)); + } + else n = 0UL; + b[i] = (char)(33UL+n/753571UL); + ++i; + b[i] = (char)(33UL+(n/8281UL)%91UL); + ++i; + b[i] = (char)(33UL+(n/91UL)%91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + b[i] = sym[1UL]; + ++i; + if (speed>0.5) { + b[i] = (char)(33UL+osi_realcard((float)course)/4UL); + ++i; + b[i] = (char)(33UL+osi_realcard(osic_ln((float) + (speed*5.3996146834962E-1+1.0))*1.29935872129E+1f)); + ++i; + b[i] = '_'; + ++i; + } + else if (alt>0.5) { + if (alt*3.2808398950131>1.0) { + n = osi_realcard(osic_ln((float)(alt*3.2808398950131))*500.5f) + ; + } + else n = 0UL; + if (n>=8281UL) n = 8280UL; + b[i] = (char)(33UL+n/91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + b[i] = 'W'; + ++i; + } + else { + b[i] = ' '; + ++i; + b[i] = ' '; + ++i; + b[i] = '_'; + ++i; + } + if (speed>0.5) { + b[i] = '/'; + ++i; + b[i] = 'A'; + ++i; + b[i] = '='; + ++i; + n = osi_realcard((float)(alt*3.2808398950131+0.5)); + if (alt>=0.0) b[i] = num(n/10000UL); + else b[i] = '-'; + ++i; + b[i] = num(n/10000UL); + ++i; + b[i] = num(n/1000UL); + ++i; + b[i] = num(n/100UL); + ++i; + b[i] = num(n/10UL); + ++i; + b[i] = num(n); + ++i; + } + } + else if (comp0==2UL) { + /* mic-e */ + aprsstr_Append(b, 201ul, ":`", 3ul); + i = micdest; + nl = osi_realcard((float)fabs(long0)); + n = osi_realcard((float)fabs(lat)); + b[i] = (char)(80UL+n/10UL); + ++i; + b[i] = (char)(80UL+n%10UL); + ++i; + n = osi_realcard((float)((fabs(lat)-(double)(float)n) + *6000.0)); + b[i] = (char)(80UL+n/1000UL); + ++i; + b[i] = (char)(48UL+32UL*(uint32_t)(lat>=0.0)+(n/100UL)%10UL); + ++i; + b[i] = (char)(48UL+32UL*(uint32_t)(nl<10UL || nl>=100UL)+(n/10UL) + %10UL); + ++i; + b[i] = (char)(48UL+32UL*(uint32_t)(long0<0.0)+n%10UL); + i = aprsstr_Length(b, 201ul); + if (nl<10UL) b[i] = (char)(nl+118UL); + else if (nl>=100UL) { + if (nl<110UL) b[i] = (char)(nl+8UL); + else b[i] = (char)(nl-72UL); + } + else b[i] = (char)(nl+28UL); + ++i; + nl = osi_realcard((float)((fabs(long0)-(double)(float)nl) + *6000.0)); /* long min*100 */ + n = nl/100UL; + if (n<10UL) n += 60UL; + b[i] = (char)(n+28UL); + ++i; + b[i] = (char)(nl%100UL+28UL); + ++i; + n = osi_realcard((float)(speed*5.3996146834962E-1+0.5)); + b[i] = (char)(n/10UL+28UL); + ++i; + nl = osi_realcard((float)course); + b[i] = (char)(32UL+(n%10UL)*10UL+nl/100UL); + ++i; + b[i] = (char)(28UL+nl%100UL); + ++i; + b[i] = sym[1UL]; + ++i; + b[i] = sym[0UL]; + ++i; + if (alt>0.5) { + if (alt>(-1.E+4)) n = osi_realcard((float)(alt+10000.5)); + else n = 0UL; + b[i] = (char)(33UL+(n/8281UL)%91UL); + ++i; + b[i] = (char)(33UL+(n/91UL)%91UL); + ++i; + b[i] = (char)(33UL+n%91UL); + ++i; + b[i] = '}'; + ++i; + } + } + if (dao) { + b[i] = '!'; + ++i; + b[i] = 'w'; + ++i; + b[i] = (char)(33UL+dao91(lat)); + ++i; + b[i] = (char)(33UL+dao91(long0)); + ++i; + b[i] = '!'; + ++i; + } + b[i] = 0; + aprsstr_Append(b, 201ul, comm, comm_len); + comment0(h, 201ul, uptime, goodsats, hrms, commentcnt); + aprsstr_Append(b, 201ul, h, 201ul); + /* Append(b, CR+LF); */ + if (aprsstr_Length(mycall, mycall_len)>=3UL) { + if (!sondeaprs_sendmon) { + aprsstr_mon2raw(b, 201ul, raw, 361ul, &rp); + if (rp>0L) sendudp(raw, 361ul, rp); + } + else sendudp(b, 201ul, (int32_t)(aprsstr_Length(b, 201ul)+1UL)); + } + if (sondeaprs_verb) osi_WrStrLn(b, 201ul); + X2C_PFREE(mycall); + X2C_PFREE(destcall); + X2C_PFREE(via); + X2C_PFREE(sym); + X2C_PFREE(obj); + X2C_PFREE(comm); +} /* end sendaprs() */ + +#define sondeaprs_Z 48 + + +static void degtostr(double d, char lat, char form, + char s[], uint32_t s_len) +{ + uint32_t i; + uint32_t n; + if (s_len-1<11UL) { + s[0UL] = 0; + return; + } + if (form=='2') i = 7UL; + else if (form=='3') i = 8UL; + else i = 9UL; + if (d<0.0) { + d = -d; + if (lat) s[i] = 'S'; + else s[i+1UL] = 'W'; + } + else if (lat) s[i] = 'N'; + else s[i+1UL] = 'E'; + if (form=='2') { + /* DDMM.MMNDDMM.MME */ + n = osi_realcard((float)(d*3.4377467707849E+5+0.5)); + s[0UL] = (char)((n/600000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/6000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else if (form=='3') { + /* DDMM.MMMNDDMM.MMME */ + n = osi_realcard((float)(d*3.4377467707849E+6+0.5)); + s[0UL] = (char)((n/6000000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/600000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else { + /* DDMMSS */ + n = osi_realcard((float)(d*2.062648062471E+5+0.5)); + s[0UL] = (char)((n/360000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/36000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/3600UL)%10UL+48UL); + ++i; + s[i] = 'o'; + ++i; + s[i] = (char)((n/600UL)%6UL+48UL); + ++i; + s[i] = (char)((n/60UL)%10UL+48UL); + ++i; + s[i] = '\''; + ++i; + s[i] = (char)((n/10UL)%6UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + s[i] = '\"'; + ++i; + } + ++i; + s[i] = 0; +} /* end degtostr() */ + + +static void postostr(struct POSITION pos, char form, char s[], + uint32_t s_len) +{ + char h[32]; + degtostr(pos.lat, 1, form, s, s_len); + aprsstr_Append(s, s_len, "/", 2ul); + degtostr(pos.long0, 0, form, h, 32ul); + aprsstr_Append(s, s_len, h, 32ul); +} /* end postostr() */ + +#define sondeaprs_RAD0 1.7453292519943E-2 + + +static void WrDeg(double la, double lo) +{ + char s[31]; + struct POSITION pos; + pos.lat = la*1.7453292519943E-2; + pos.long0 = lo*1.7453292519943E-2; + postostr(pos, '2', s, 31ul); + osi_WrStr(s, 31ul); +} /* end WrDeg() */ + + +static void show(struct DATLINE d) +{ + char s[31]; + osic_WrFixed((float)d.hpa, 1L, 6UL); + osi_WrStr("hPa ", 5ul); + if (d.temp<100.0) { + osic_WrFixed((float)d.temp, 1L, 5UL); + osi_WrStr("C ", 3ul); + } + osic_WrINT32(osi_realcard((float)d.hyg), 2UL); + osi_WrStr("% ", 3ul); + osic_WrINT32(osi_realcard((float)(d.speed*3.6)), 3UL); + osi_WrStr("km/h ", 6ul); + osic_WrINT32(osi_realcard((float)d.dir), 3UL); + osi_WrStr("dir ", 5ul); + WrDeg(d.lat, d.long0); + osi_WrStr(" ", 2ul); + /*WrFixed(d.gpsalt, 1, 8); WrStr("m "); */ + if (d.alt>=(-2.E+4) && d.alt>=1.E+5) { + osic_WrINT32((uint32_t)osi_realint((float)d.alt), 1UL); + osi_WrStr("m ", 3ul); + } + osic_WrFixed((float)d.clb, 1L, 5UL); + osi_WrStr("m/s ", 5ul); + aprsstr_TimeToStr(d.time0, s, 31ul); + osi_WrStr(s, 31ul); +} /* end show() */ + + +static char Checkval(const double a[], uint32_t a_len, + const uint32_t t[], uint32_t t_len, double err, + double min0, double max0, + double unitspers) +{ + uint32_t i; + double y; + double m; + double k; + uint32_t tmp; + tmp = a_len-1; + i = 0UL; + if (i<=tmp) for (;; i++) { + if (a[i]max0) return 0; + /* >=1 value out of range */ + if (i>0UL && t[i]t[0UL]) { + y = X2C_DIVL(a[i]-a[0UL],(double)(float)(t[i]-t[0UL])); + if (fabs(y)>unitspers) return 0; + k = k+y; /* median slope */ + } + if (i==tmp) break; + } /* end for */ + k = X2C_DIVL(k,(double)(float)(a_len-1)); + m = 0.0; + tmp = a_len-1; + i = 1UL; + if (i<=tmp) for (;; i++) { + if (t[i]>t[0UL]) { + y = fabs((a[i]-a[0UL])-(double)(float)(t[i]-t[0UL])*k); + if (y>m) m = y; + } + if (i==tmp) break; + } /* end for */ + /* k:=ABS(k); */ + /* IF k0) & (ta<>(d[i].time+1) MOD (3600*24)) THEN INCL(e, eMISS) END; + ta:=d[i].time; + END; + */ + if (((d[0U].time0+86400UL)-d[n].time0)%86400UL>20UL) *e |= 0x100U; +} /* end Checkvals() */ + + +static void shift(DATS d) +{ + uint32_t i; + for (i = 59UL; i>=1UL; i--) { + d[i] = d[i-1UL]; + } /* end for */ +} /* end shift() */ + + +static pCONTEXT findcontext(char n[], uint32_t n_len, uint32_t t) +{ + pCONTEXT p; + pCONTEXT c; + pCONTEXT findcontext_ret; + X2C_PCOPY((void **)&n,n_len); + c = contexts; + while (c && !aprsstr_StrCmp(X2C_CHKNIL(pCONTEXT,c)->name, 12ul, n, + n_len)) c = X2C_CHKNIL(pCONTEXT,c)->next; + if (c==0) { + c = contexts; + while (c && X2C_CHKNIL(pCONTEXT,c)->lastused+86400UL>t) { + c = X2C_CHKNIL(pCONTEXT,c)->next; + } + if (c==0) { + osic_alloc((char * *) &c, sizeof(struct CONTEXT)); + memset((char *)c,(char)0,sizeof(struct CONTEXT)); + c->next = contexts; + contexts = c; + } + else { + /* reuse old context */ + p = X2C_CHKNIL(pCONTEXT,c)->next; + memset((char *)c,(char)0,sizeof(struct CONTEXT)); + c->next = p; + } + aprsstr_Assign(c->name, 12ul, n, n_len); + } + if (c) X2C_CHKNIL(pCONTEXT,c)->lastused = t; + findcontext_ret = c; + X2C_PFREE(n); + return findcontext_ret; +} /* end findcontext() */ + +/* +PROCEDURE highresstr(hrstr:ARRAY OF CHAR; dat-:DATS; bt:TIME); +CONST STEP=2; + DEGUNIT=PI2/360.0/100000.0; (* 1/100000 deg = 1.1111m*) + +TYPE VEC=ARRAY[0..LINESBUF-1] OF RECORD lat, long, alt:REAL; time:TIME END; + +VAR i,n:CARDINAL; + vec:VEC; + t:TIME; +BEGIN + hrstr[0]:=0C; + t:=dat[0].time; + IF (bt<=STEP) OR (tHIGH(dat)) OR (t+bt + +extern void sondeaprs_senddata(double lat, double long0, + double alt, double speed, double dir, + double clb, double hp, double hyg, + double temp, double ozon, double otemp, + double pumpmA, double pumpv, double mhz, + double hrms, double vrms, uint32_t sattime, + uint32_t uptime, char objname[], + uint32_t objname_len, uint32_t almanachage, + uint32_t goodsats, char usercall[], + uint32_t usercall_len, uint32_t calperc, + uint32_t burstKill, uint32_t swVersion, char force,char typstr[], uint32_t typstr_len, double bat) +{ + uint8_t e; + pCONTEXT ct; + char h[251]; + char s[251]; + uint32_t systime; + uint32_t bt; + unsigned long version; + unsigned long subversionMajor; + unsigned long subversionMinor; + + struct CONTEXT * anonym; + X2C_PCOPY((void **)&objname,objname_len); + if (aprsstr_Length(usercall, usercall_len)<3UL) { + osi_WrStrLn("no tx without ", 23ul); + goto label; + } + if (aprsstr_Length(objname, objname_len)<3UL) { + osi_WrStrLn("no tx witout ", 26ul); + goto label; + } + systime = osic_time(); + ct = findcontext(objname, objname_len, systime); + if (ct) { + { /* with */ +// printf("FC SEND APRS\r\n"); + struct CONTEXT * anonym = X2C_CHKNIL(pCONTEXT,ct); + shift(anonym->dat); + anonym->speedsum = anonym->speedsum+speed; + ++anonym->speedcnt; + anonym->dat[0U].hpa = hp; + anonym->dat[0U].temp = temp; + anonym->dat[0U].hyg = hyg; + anonym->dat[0U].alt = alt; + anonym->dat[0U].speed = X2C_DIVL(anonym->speedsum, + (double)anonym->speedcnt); + anonym->dat[0U].dir = dir; + anonym->dat[0U].lat = X2C_DIVL(lat,1.7453292519943E-2); + anonym->dat[0U].long0 = X2C_DIVL(long0,1.7453292519943E-2); + /* dat[0].time:=(sattime+DAYSEC-GPSTIMECORR) MOD DAYSEC; */ + anonym->dat[0U].time0 = sattime%86400UL; + anonym->dat[0U].uptime = sattime%86400UL; + anonym->dat[0U].clb = clb; + /* climb(dat); */ + Checkvals(anonym->dat, &chk); + if (hrms>50.0 || vrms>500.0) chk |= 0x200U; + if (sondeaprs_verb) { + osi_WrStrLn("", 1ul); + show(anonym->dat[0U]); + if (almanachage) { + osi_WrStr(" AlmAge ", 9ul); + osic_WrFixed((float)(X2C_DIVL((double)almanachage, + 3600.0)), 1L, 3UL); + osi_WrStrLn("h ", 3ul); + } + else osi_WrStrLn("", 1ul); + for (e = sondeaprs_ePRES;; e++) { + if (X2C_IN((int32_t)e,10,chk)) { + switch ((unsigned)e) { + case sondeaprs_eSPEED: + /* ePRES : WrStr("p"); */ + /* |eTEMP : WrStr("t"); */ + /* |eHYG : WrStr("h"); */ + osi_WrStr("v", 2ul); + break; + case sondeaprs_eDIR: + osi_WrStr("d", 2ul); + break; + case sondeaprs_eLAT: + osi_WrStr("y", 2ul); + break; + case sondeaprs_eLONG: + osi_WrStr("x", 2ul); + break; + case sondeaprs_eALT: + osi_WrStr("a", 2ul); + break; + case sondeaprs_eMISS: + osi_WrStr("s", 2ul); + break; + case sondeaprs_eRMS: /*WrFixed(vrms, 1,5); WrStr(" "); + WrFixed(hrms, 1,5);*/ + osi_WrStr("r", 2ul); + break; + } /* end switch */ + } + if (e==sondeaprs_eRMS) break; + } /* end for */ + } + if (clb<0.0 && anonym->dat[0U].alt<(double)sondeaprs_lowalt) { + bt = sondeaprs_lowaltbeacontime; + } + else bt = sondeaprs_beacontime; +// printf("TEST:%i,%u,%u,%u,%u \r\n",bt,anonym->lastbeacon,systime,sondeaprs_nofilter,chk&0x3E0U); + if ((bt>0UL && anonym->lastbeacon+bt<=systime)&& (sondeaprs_nofilter || (chk&0x3E0U)==0U)) { +// printf("SEND APRS\r\n"); + strncpy(s,"Clb=",251u); + aprsstr_FixToStr((float)clb, 2UL, h, 251ul); /*dat[0].climb*/ + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "m/s", 4ul); + if ((0x1U & chk)==0 && anonym->dat[0U].hpa>=1.0) { + aprsstr_Append(s, 251ul, " p=", 4ul); + aprsstr_FixToStr((float)anonym->dat[0U].hpa, 2UL, h, + 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "hPa", 4ul); + } + if ((0x2U & chk)==0) { + aprsstr_Append(s, 251ul, " t=", 4ul); + aprsstr_FixToStr((float)anonym->dat[0U].temp, 2UL, h, + 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "C", 2ul); + } + if (hyg>=0.5 && (0x4U & chk)==0) { + aprsstr_Append(s, 251ul, " h=", 4ul); + aprsstr_IntToStr((int32_t)truncc(anonym->dat[0U].hyg+0.5), + 1UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "%", 2ul); + } + if (ozon>0.1) { + aprsstr_Append(s, 251ul, " o3=", 5ul); + aprsstr_FixToStr((float)ozon, 2UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "mPa ti=", 8ul); + aprsstr_FixToStr((float)otemp, 2UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "C", 2ul); + if (pumpmA>0.1) { + aprsstr_Append(s, 251ul, " Pump=", 7ul); + aprsstr_IntToStr((int32_t)truncc(pumpmA), 1UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "mA", 3ul); + } + if (pumpv>0.1) { + aprsstr_Append(s, 251ul, " ", 2ul); + aprsstr_FixToStr((float)pumpv, 2UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "V", 2ul); + } + } + /* + IF (dewp>-100.0) & (dewp<100.0) THEN + Append(s, " dp="); + FixToStr(dewp, 2, h); Append(s, h); + Append(s, "C"); + END; + */ + if (calperc>0UL && calperc<100UL) { + aprsstr_Append(s, 251ul, " calibration ", 14ul); + aprsstr_IntToStr((int32_t)calperc, 1UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "%", 2ul); + } + if (mhz>0.0) { + aprsstr_Append(s, 251ul, " ", 2ul); + aprsstr_FixToStr((float)mhz, 3UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "MHz", 4ul); + } + if (typstr[0UL]) { + aprsstr_Append(s, 251ul, " Type=", 7ul); + aprsstr_Append(s, 251ul, typstr, typstr_len); + } + if (bat>0.1) { + aprsstr_Append(s, 251ul, " Vbat=", 7ul); + aprsstr_FixToStr((float)bat, 2UL, h, 251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, "V", 2ul); + } + /* appended by SQ7BR */ + if (burstKill==1UL || burstKill==2UL) { + aprsstr_Append(s, 251ul, " BK=", 5ul); + if (burstKill==1UL) aprsstr_Append(s, 251ul, "Off", 4ul); + else aprsstr_Append(s, 251ul, "On", 3ul); + } + //SKP + if (swVersion>0ul) { + version=X2C_DIVL(swVersion , 10000); + subversionMajor=X2C_DIVL((swVersion-(version*10000)) , 100); + subversionMinor=swVersion-(version*10000)-(subversionMajor*100); + + aprsstr_Append(s, 251ul, " SV=", 5ul); + if (version<10){ + aprsstr_Append(s, 251ul, "0", 2ul); + aprsstr_IntToStr(version,1ul,h,251ul); + } else + aprsstr_IntToStr(version,2ul,h,251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, ".", 2ul); + + if (subversionMajor<10){ + aprsstr_Append(s, 251ul, "0", 2ul); + aprsstr_IntToStr(subversionMajor,1ul,h,251ul); + } else + aprsstr_IntToStr(subversionMajor,2ul,h,251ul); + aprsstr_Append(s, 251ul, h, 251ul); + aprsstr_Append(s, 251ul, ".", 2ul); + + if (subversionMinor<10){ + aprsstr_Append(s, 251ul, "0", 2ul); + aprsstr_IntToStr(subversionMinor,1ul,h,251ul); + } else + aprsstr_IntToStr(subversionMinor,2ul,h,251ul); + aprsstr_Append(s, 251ul, h, 251ul); + } + + /* appended by SQ7BR */ + if (force) aprsstr_Append(s, 251ul, " Unchecked-Data", 16ul); + sendaprs(0UL, 0UL, sondeaprs_dao, anonym->dat[0U].time0, uptime, + usercall, usercall_len, sondeaprs_destcall, 100ul, + sondeaprs_via, 100ul, sondeaprs_sym, 2ul, objname, + objname_len, anonym->dat[0U].lat, anonym->dat[0U].long0, + anonym->dat[0U].alt, + (double)(float)(truncc(anonym->dat[0U].dir)%360UL), + anonym->dat[0U].speed*3.6, goodsats, hrms, s, 251ul, + &anonym->commentline); + anonym->lastbeacon = systime; + anonym->speedcnt = 0UL; + anonym->speedsum = 0.0; + } + } + } + label:; + X2C_PFREE(objname); +} /* end senddata() */ + + +extern void sondeaprs_BEGIN(void) +{ + static int sondeaprs_init = 0; + if (sondeaprs_init) return; + sondeaprs_init = 1; + osi_BEGIN(); + aprsstr_BEGIN(); + contexts = 0; + sondeaprs_udpsock = -1L; + sondeaprs_commentfn[0UL] = 0; + strncpy(sondeaprs_destcall,"APLWS2",100u); + sondeaprs_via[0UL] = 0; + strncpy(sondeaprs_sym,"/O",2u); + sondeaprs_objname[0UL] = 0; + sondeaprs_beacontime = 30UL; + sondeaprs_lowaltbeacontime = 0UL; + sondeaprs_lowalt = 1000UL; + sondeaprs_nofilter = 0; +/* FILL(ADR(dat), 0C, SIZE(dat)); */ +/* lastbeacon:=0; */ +/* commentline:=0; */ +/* speedcnt:=0; */ +/* speedsum:=0.0; */ +} + diff --git a/src/sondeaprs.h b/src/sondeaprs.h new file mode 100644 index 0000000..55c583d --- /dev/null +++ b/src/sondeaprs.h @@ -0,0 +1,73 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#ifndef sondeaprs_H_ +#define sondeaprs_H_ +#ifndef X2C_H_ +#include "X2C.h" +#endif + +typedef uint32_t sondeaprs_TIME; + +#define sondeaprs_VERSION "sondemod(c) 2.0" + +extern void sondeaprs_senddata(double, double, double, + double, double, double, double, + double, double, double, double, + double, double, double, double, + double, uint32_t, uint32_t, char [], + uint32_t, uint32_t, uint32_t, char [], uint32_t, + uint32_t, uint32_t, uint32_t, char, char [],uint32_t, double); + +extern int32_t sondeaprs_GetIp(char [], uint32_t, uint32_t *, + uint32_t *, uint32_t *); + +extern char sondeaprs_via[100]; + +extern char sondeaprs_destcall[100]; + +extern char sondeaprs_objname[100]; + +extern char sondeaprs_commentfn[1025]; + +extern char sondeaprs_sym[2]; + +extern uint32_t sondeaprs_beacontime; + +extern uint32_t sondeaprs_lowaltbeacontime; + +extern uint32_t sondeaprs_lowalt; + +extern uint32_t sondeaprs_toport; + +extern uint32_t sondeaprs_ipnum; + +extern char sondeaprs_verb; + +extern char sondeaprs_verb2; + +extern char sondeaprs_nofilter; + +extern int32_t sondeaprs_comptyp; + +extern int32_t sondeaprs_micessid; + +extern int32_t sondeaprs_udpsock; + +extern char sondeaprs_anyip; + +extern char sondeaprs_sendmon; + +extern char sondeaprs_dao; + + +extern void sondeaprs_BEGIN(void); + + +#endif /* sondeaprs_H_ */ diff --git a/src/sondemod.c b/src/sondemod.c new file mode 100644 index 0000000..7c0eb87 --- /dev/null +++ b/src/sondemod.c @@ -0,0 +1,3833 @@ +/* + * spDXL toolchain + * + * Copyright (C) Christian Rabler + * Modified by SP9SKP, SQ2DK + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define sondemod_C_ +#ifndef soundctl_H_ +#include "soundctl.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#include +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef gpspos_H_ +#include "gpspos.h" +#endif +#ifndef sondeaprs_H_ +#include "sondeaprs.h" +#endif + +/* decode RS92, RS41, SRS-C34 and DFM06 Radiosonde by OE5DXL */ +/*FROM rsc IMPORT initrsc, decodersc; */ +#define sondemod_CONTEXTLIFE 3600 +/* seconds till forget context after last heared */ + +#define sondemod_DAYSEC 86400 + +#define sondemod_GPSTIMECORR 18 + +#define sondemod_ADCBUFLEN 4096 + +#define sondemod_BAUDSAMP 65536 + +#define sondemod_PLLSHIFT 1024 + +#define sondemod_AFIRLEN 512 + +#define sondemod_AOVERSAMP 16 +/*16*/ + +#define sondemod_ASYNBITS 10 + +static char sondemod_CALIBFRAME = 'e'; + +static char sondemod_GPSFRAME = 'g'; + +static char sondemod_AUXILLARY = 'h'; + +static char sondemod_DATAFRAME = 'i'; + +static char sondemod_EMPTYAUX = '\003'; + +#define sondemod_PI 3.1415926535898 + +#define sondemod_RAD 1.7453292519943E-2 + +#define sondemod_EARTH 6370.0 + +#define sondemod_MYLAT 8.4214719496019E-1 +/* only for show sat elevations if no pos decode */ + +#define sondemod_MYLONG 2.2755602787502E-1 + +#define sondemod_NEWALMAGE 30 +/* every s reread almanach */ + +#define sondemod_FASTALM 4 +/* reread almanach if old */ + +char save2csv; + +typedef char FILENAME[1024]; + +typedef char OBJNAME[9]; + +typedef char CALLSSID[11]; + +enum CHANNELS {sondemod_LEFT, sondemod_RIGHT}; + + +struct CHAN; + + +struct CHAN { + uint32_t rxbyte; + uint32_t rxbitc; + uint32_t rxp; + char rxbuf[520]; +}; + +struct CONTEXTR9; + + +struct CONTEXTR9 { + char calibdata[512]; + uint32_t calibok; + char mesok; + char posok; + char framesent; + double lat; + double long0; + double heig; + double speed; + double dir; + double climb; + double lastlat; + double laslong; + double lastalt; + double lastspeed; + double lastdir; + double lastclb; + float hrmsc; + float vrmsc; + double hp; + double hyg; + double temp; + double ozontemp; + double ozon; + uint32_t goodsats; + uint32_t timems; + uint32_t framenum; +//skp + unsigned char aux; + +}; + +struct CONTEXTC34; + +typedef struct CONTEXTC34 * pCONTEXTC34; + + +struct CONTEXTC34 { + pCONTEXTC34 next; + OBJNAME name; + double clmb; + double lat; + double lon; + double lat1; + double lon1; + double latv1; + double lonv1; + double alt; + double vlon; + double vlat; + double speed; + double dir; + double temp; + uint32_t lastsent; + uint32_t gpstime; + uint32_t tgpstime; + uint32_t tlat; + uint32_t tlon; + uint32_t tlat1; + uint32_t tlon1; + uint32_t tlatv1; + uint32_t tlonv1; + uint32_t talt; + uint32_t tspeed; + uint32_t tdir; + uint32_t ttemp; + uint32_t tused; + +}; + +struct CONTEXTDFM6; + +typedef struct CONTEXTDFM6 * pCONTEXTDFM6; + + +struct CONTEXTDFM6 { + pCONTEXTDFM6 next; + OBJNAME name; + double clmb; + double lat; + double lon; + double lat1; + double lon1; + double alt; + double speed; + double dir; + uint32_t gpstime; + uint32_t lastsent; + uint32_t tlat; + uint32_t tlon; + uint32_t tlat1; + uint32_t tlon1; + uint32_t talt; + uint32_t tspeed; + uint32_t tdir; + uint32_t actrt; + uint32_t tused; + char d9; + char posok; + uint32_t poserr; /* count down after position jump */ + char framesent; + unsigned char aux; + float mhz0; + +}; + +struct CONTEXTR4; + +typedef struct CONTEXTR4 * pCONTEXTR4; +typedef struct CONTEXTR4 * pCONTEXTR5; + + +struct CONTEXTR4 { + pCONTEXTR4 next; + OBJNAME name; + char posok; + char framesent; + float mhz0; + uint32_t gpssecond; + uint32_t framenum; + uint32_t tused; + double hp; + uint32_t ozonInstType; + uint32_t ozonInstNum; + double ozonTemp; + double ozonuA; + double ozonBatVolt; + double ozonPumpMA; + double ozonExtVolt; + uint32_t burstKill; +//skp + unsigned char aux; + unsigned long swVersion; + unsigned long hwvwersion; + char serialNumber[6]; + unsigned long killTimer; + double ozonval; +}; + +struct CONTEXTM10; + +typedef struct CONTEXTM10 * pCONTEXTM10; + + +struct CONTEXTM10 { + pCONTEXTM10 next; + OBJNAME name; + char posok; + char framesent; + float mhz0; + uint32_t gpssecond; + uint32_t framenum; + uint32_t tused; +}; + + +struct CONTEXTPS; + +typedef struct CONTEXTPS * pCONTEXTPS; + +struct CONTEXTPS { + pCONTEXTPS next; + OBJNAME name; + char posok; + char framesent; + float mhz0; + uint32_t gpssecond; + uint32_t framenum; + uint32_t tused; + uint32_t lastframe; + +}; + + +static OBJNAME pilname; // <-added for pilot sonde + +static FILENAME semfile; + +static FILENAME yumafile; + +static FILENAME rinexfile; + +static uint32_t sendquick; /* 0 send if full calibrated, 1 with mhz, 2 always */ + +static uint32_t almread; + +/* time last almanach read */ +static uint32_t almrequest; + +/* seconds rinex age to request new */ +static uint32_t almage; + +static uint32_t systime; + +static FILENAME soundfn; + +static struct CHAN chan[2]; + +static gpspos_SATS lastsat; + +static float coeff[256]; + +static float mhz; + +static OBJNAME objname; + +static int32_t rxsock; + +static uint32_t maxalmage; + +static uint32_t lastip; + +static uint32_t lastport; + +static char mycall[100]; + +static struct CONTEXTR9 contextr9; + +static pCONTEXTC34 pcontextc; + +static pCONTEXTDFM6 pcontextdfm6; + +static pCONTEXTR4 pcontextr4; +static pCONTEXTPS pcontextps; + +static pCONTEXTM10 pcontextm10; + +// SKP + +static char dbAddr[100]; +static char dbPass[20]; +time_t oldMTime; + +#include +#include +#include +#include + +#include +//#include //For errno - the error number +#include //hostent +#include + +int h2ip(char * hostname , char* ip) +{ + struct hostent *he; + struct in_addr **addr_list; + int i; + + if ( (he = gethostbyname( hostname ) ) == NULL) + { + return 1; + } + + addr_list = (struct in_addr **) he->h_addr_list; + + for(i = 0; addr_list[i] != NULL; i++) + { + //Return the first one; + strcpy(ip , inet_ntoa(*addr_list[i]) ); + return 0; + } + + return 1; +} + +const char* getfield(char* line, int num) +{ + const char* tok; + for (tok = strtok(line, ";"); + tok && *tok; + tok = strtok(NULL, ";\n")) + { + if (!--num) + return tok; + } + return NULL; +} + +int save_tmp(char *name,double lat, double lon, double alt,double speed, double climb, double dir,float frq) +{ + + + FILE* stream = fopen("/tmp/sonde.csv", "r"); + char tab[30][200],str[200]; + char line[200]; + char cnt=0,rep=0,i ; + + sprintf(str,"%s;%0.5f;%0.5f;%0.0f;%0.2f;%0.2f;%0.0f;%0.3f\n",name,lat,lon,alt,speed,climb,dir,frq); + + if(stream!=NULL){ + while (fgets(line, 200, stream) && cnt 0) { + if (length > 512) { + MD5_Update(&c, str, 512); + } else { + MD5_Update(&c, str, length); + } + length -= 512; + str += 512; + } + + MD5_Final(digest, &c); + for (n = 0; n < 16; ++n) { + snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]); + } + + return out; +} + +size_t write_data( void *buffer, size_t size, size_t nmemb, void *userp ) +{ + return size * nmemb; +} + +unsigned int passAprs(char *pas){ + + unsigned int hash = 0x73e2; + char i = 0,endc=0; + char len = strlen(pas); + + while((pas[i]!='-')&&(i4)||(cp>3)){ + + if(dp<4){ //jesli nie ma mojego hasla + sprintf(str,"%u",passAprs(mycall)); //generujemy auto z znaku delikwenta + strcpy(Pass,str); + } + strcpy(Pass,dbPass); + str[0]=0; + + curl = curl_easy_init(); + if ( curl ){ + curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data ); + curl_easy_setopt( curl, CURLOPT_URL, dbAddr ); + + sprintf( PostFields, "d=%s;%lf;%lf;%5.1lf;%u;%3.1f;%3.0f;%3.1f;%4.1f;%4.1f;%u;%i;%i;%i;%7.3f;%s", + name,dlat,dlon,alt,frameno,speed,dir,climb,press,ozon,swv,bk,typ,aux,frq,mycall); + //wylicznie hasha + strcpy(ToHash,PostFields+2); + strcat(ToHash,Pass); + char *hash = str2md5(ToHash, strlen(ToHash)); + + //dopisanie hasha + strcat(PostFields,";"); + strcat(PostFields,hash); + //printf(PostFields);printf("\n"); + curl_easy_setopt( curl, CURLOPT_POSTFIELDS, PostFields ); + + // Perform the request, res will get the return code + res = curl_easy_perform( curl ); + + // Check for errors + if ( res == CURLE_OK ) { printf( "Uploaded data\n"); } + else { printf( "curl_easy_perform() failed: %s\n", curl_easy_strerror( res ) ); } + + // always cleanup + curl_easy_cleanup( curl ); + } +} +} + +//-SKP + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + + +static float pow0(float x, uint32_t y) +{ + float z; + z = x; + while (y>1UL) { + z = z*x; + --y; + } + return z; +} /* end pow() */ + + +static double atan20(double x, double y) +{ + double w; + if (fabs(x)>fabs(y)) { + w = (double)osic_arctan((float)(X2C_DIVL(y,x))); + if (x<0.0) { + if (y>0.0) w = 3.1415926535898+w; + else w = w-3.1415926535898; + } + } + else if (y!=0.0) { + w = (double)(1.5707963267949f-osic_arctan((float)(X2C_DIVL(x, + y)))); + if (y<0.0) w = w-3.1415926535898; + } + else w = 0.0; + return w; +} /* end atan2() */ + + +static char GetNum(const char h[], uint32_t h_len, char eot, + uint32_t * p, uint32_t * n) +{ + *n = 0UL; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + return h[*p]==eot; +} /* end GetNum() */ + + +static void Parms(void) +{ + char err; + char lowbeacon; + FILENAME h; + uint32_t cnum; + uint32_t i; + mycall[0U] = 0; + semfile[0] = 0; + yumafile[0] = 0; + rinexfile[0] = 0; + pilname[0] = 0; // <- added for pilot sonde + err = 0; + rxsock = -1L; + sondeaprs_dao = 0; + lowbeacon = 0; + maxalmage = 21600UL; + almrequest = 14400UL; + sondeaprs_verb = 0; + sondeaprs_verb2 = 0; + save2csv = 0; + sendquick = 1UL; + for (;;) { + osi_NextArg(h, 1024ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + if (h[1U]=='d') sondeaprs_dao = 1; + else if (h[1U]=='F') sondeaprs_nofilter = 1; + else if (h[1U]=='o') { + osi_NextArg(soundfn, 1024ul); + if (aprsstr_StrToCard(soundfn, 1024ul, &cnum)) { + /* listen on UDP instead of soundcard */ + soundfn[0] = 0; + rxsock = openudp(); + if (rxsock<0L) Error("cannot open rx udp socket", 26ul); + if (bindudp(rxsock, cnum)<0L) { + Error("cannot bind inport", 19ul); + } + } + } + else if (h[1U]=='T') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + maxalmage = cnum*60UL; + } + else if (h[1U]=='R') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + almrequest = cnum*60UL; + } + else if (h[1U]=='p') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + sendquick = cnum; + } + else if (h[1U]=='t') osi_NextArg(sondeaprs_commentfn, 1025ul); + else if (h[1U]=='m' || h[1U]=='r') { + sondeaprs_sendmon = h[1U]!='r'; + osi_NextArg(h, 1024ul); + i = 0UL; + if (sondeaprs_GetIp(h, 1024ul, &i, &sondeaprs_ipnum, + &sondeaprs_toport)<0L) { + Error("-m or -r ip:port number", 24ul); + } + sondeaprs_udpsock = openudp(); + if (sondeaprs_udpsock<0L) Error("cannot open udp socket", 23ul); + } + else if (h[1U]=='w') { + osi_NextArg(sondeaprs_via, 100ul); + if ((uint8_t)sondeaprs_via[0UL]<=' ') { + Error("-m vias like RELAY,WIDE1-1", 27ul); + } + } + else if (h[1U]=='b') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &sondeaprs_beacontime)) { + Error("-b ", 7ul); + } + } + else if (h[1U]=='B') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &sondeaprs_lowaltbeacontime)) { + Error("-B ", 7ul); + } + lowbeacon = 1; + } + else if (h[1U]=='A') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &sondeaprs_lowalt)) { + Error("-A ", 7ul); + } + } + else if (h[1U]=='I') { + osi_NextArg(mycall, 100ul); + if ((uint8_t)mycall[0U]<' ') { + Error("-I ", 12ul); + } + } + else if (h[1U]=='s') { + osi_NextArg(semfile, 1024ul); + if ((uint8_t)semfile[0U]<' ') Error("-s ", 14ul); + } + else if (h[1U]=='x') { + osi_NextArg(rinexfile, 1024ul); + if ((uint8_t)rinexfile[0U]<' ') Error("-x ", 14ul); + } + else if (h[1U]=='y') { + osi_NextArg(yumafile, 1024ul); + if ((uint8_t)yumafile[0U]<' ') Error("-y ", 14ul); + } + // skp + else if (h[1U]=='K') { + osi_NextArg(dbPass, 20ul); + if ((unsigned char)dbPass[0U]<' ') { + Error("-K ", 23ul); + } + } + else if (h[1U]=='e') { + osi_NextArg(h, 1024ul); + i = 0UL; + if (!GetNum(h, 1024ul, 0, &i, &save2csv)) { + Error("-e ", 7ul); + } + } + else if (h[1U]=='v') sondeaprs_verb = 1; + else if (h[1U]=='V') { + sondeaprs_verb = 1; + sondeaprs_verb2 = 1; + } + else { + if (h[1U]=='h') { + osi_WrStr("sondemod(c) 2.0", 16ul); + osi_WrStrLn(" multichannel decoder RS92, RS41, SRS-C34 Radiosondes", 54ul); + osi_WrStrLn(" -A at lower altitude use -B beacon time (meter) -A 1000", 69ul); + osi_WrStrLn(" -B low altitude send intervall -B 10", 50ul); + osi_WrStrLn(" -b high altitude minimum send intervall -b 20", 59ul); + osi_WrStrLn(" -d dao extension for 20cm APRS resolution instead of 18m", 70ul); + osi_WrStrLn(" -F trackfilter off, DO NOT USE THIS SENDING TO THE WORLD!", 71ul); + osi_WrStrLn(" -h help", 21ul); + osi_WrStrLn(" -I Sender of Object Callsign -I OE0AAA if not sent by \'sondeudp\'", 78ul); + osi_WrStrLn(" -o receive demodulated data via UDP port from \'sondeudp -u ...\'", 77ul); + osi_WrStrLn(" -p 0 send if weather data ready, 1 if MHz known, 2 send immediatly (1)", 84ul); + osi_WrStrLn(" -R request new rinex almanach after minutes if receiving gps (-R 240)", 83ul); + osi_WrStrLn(" use somewhat like \'getalmd\'-script to download", 63ul); + osi_WrStrLn(" -r : send AXUDP -r 127.0.0.1:9001 use udpgate4 or aprsmap as receiver", 81ul); + osi_WrStrLn(" -s gps almanach sem format (DO NOT USE, not exact)", 64ul); + osi_WrStrLn(" -T stop sending data after almanach age (-T 360)", 62ul); + osi_WrStrLn(" -t append comment lines from this file", 52ul); + osi_WrStrLn(" -n name for pilot sonde object", 45ul); + osi_WrStrLn(" -V more verbous", 29ul); + osi_WrStrLn(" -v verbous", 24ul); + osi_WrStrLn(" -x gps almanach rinexnavigation format (prefered)", 63ul); + osi_WrStrLn(" -y gps almanach yuma format (DO NOT USE, not exact)", 65ul); + osi_WrStrLn(" -K password for SP9SKP database", 45ul); + osi_WrStrLn(" -e write last radiosonde data to /tmp/sonde.csv", 66ul); + osi_WrStrLn("example: sondemod -o 18000 -x almanach.txt -d -A 1500 -B 10 -I OE0AAA -r 127.0.0.1:9001", 88ul); + X2C_ABORT(); + } + err = 1; + } + } + else err = 1; + if (err) break; + } + if (err) { + osi_WrStr(">", 2ul); + osi_WrStr(h, 1024ul); + osi_WrStrLn("< use -h", 9ul); + X2C_ABORT(); + } + if (!lowbeacon) sondeaprs_lowaltbeacontime = sondeaprs_beacontime; +} /* end Parms() */ + +/* WrStr(" "); WrHex(n DIV 01000000H MOD 256, 2); + WrHex(n DIV 010000H MOD 256, 2); + WrHex(n DIV 0100H MOD 256, 2); WrHex(n MOD 256, 2); */ +#define sondemod_Z 48 + + +static void degtostr(float d, char lat, char form, + char s[], uint32_t s_len) +{ + uint32_t i; + uint32_t n; + if (s_len-1<11UL) { + s[0UL] = 0; + return; + } + if (form=='2') i = 7UL; + else if (form=='3') i = 8UL; + else i = 9UL; + if (d<0.0f) { + d = -d; + if (lat) s[i] = 'S'; + else s[i+1UL] = 'W'; + } + else if (lat) s[i] = 'N'; + else s[i+1UL] = 'E'; + if (form=='2') { + /* DDMM.MMNDDMM.MME */ + n = osi_realcard(d*3.4377467707849E+5f+0.5f); + s[0UL] = (char)((n/600000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/6000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else if (form=='3') { + /* DDMM.MMMNDDMM.MMME */ + n = osi_realcard(d*3.4377467707849E+6f+0.5f); + s[0UL] = (char)((n/6000000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/600000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/60000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10000UL)%6UL+48UL); + ++i; + s[i] = (char)((n/1000UL)%10UL+48UL); + ++i; + s[i] = '.'; + ++i; + s[i] = (char)((n/100UL)%10UL+48UL); + ++i; + s[i] = (char)((n/10UL)%10UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + } + else { + /* DDMMSS */ + n = osi_realcard(d*2.062648062471E+5f+0.5f); + s[0UL] = (char)((n/360000UL)%10UL+48UL); + i = (uint32_t)!lat; + s[i] = (char)((n/36000UL)%10UL+48UL); + ++i; + s[i] = (char)((n/3600UL)%10UL+48UL); + ++i; + s[i] = 'd'; + ++i; + s[i] = (char)((n/600UL)%6UL+48UL); + ++i; + s[i] = (char)((n/60UL)%10UL+48UL); + ++i; + s[i] = '\''; + ++i; + s[i] = (char)((n/10UL)%6UL+48UL); + ++i; + s[i] = (char)(n%10UL+48UL); + ++i; + s[i] = '\"'; + ++i; + } + ++i; + s[i] = 0; +} /* end degtostr() */ + + +static void initcontext(struct CONTEXTR9 * cont) +{ + memset((char *)cont,(char)0,sizeof(struct CONTEXTR9)); + cont->lastlat = 8.4214719496019E-1; + cont->laslong = 2.2755602787502E-1; +} /* end initcontext() */ + + +static void dogps(const char sf[], uint32_t sf_len, + struct CONTEXTR9 * cont, uint32_t * timems, + uint32_t * gpstime) +{ + uint32_t i; + gpspos_SATS sats; + int32_t res; + int32_t d1; + int32_t d; + char h[100]; + struct CONTEXTR9 * anonym; + cont->lat = 0.0; + cont->long0 = 0.0; + cont->heig = 0.0; + cont->speed = 0.0; + cont->dir = 0.0; + /*WrStrLn("gps:"); */ + /*FOR i:=0 TO 121 DO WrHex(ORD(sf[i]), 3) END; WrStrLn(""); */ + *timems = (uint32_t)(uint8_t)sf[0UL]+(uint32_t)(uint8_t) + sf[1UL]*256UL+(uint32_t)(uint8_t) + sf[2UL]*65536UL+(uint32_t)(uint8_t)sf[3UL]*16777216UL; + if (sondeaprs_verb2) { + aprsstr_TimeToStr(( *timems/1000UL)%86400UL, h, 100ul); + osi_WrStr("time ms day: ", 14ul); + osi_WrStr(h, 100ul); + osic_WrINT32( *timems%1000UL, 4UL); + osic_WrINT32( *timems/86400000UL, 2UL); + osi_WrStrLn("", 1ul); + } + /* WrInt(ORD(sf[4]), 4); WrInt(ORD(sf[5]), 4); WrStrLn(""); */ + /* FILL(ADR(sats), 0C, SIZE(sats)); */ + for (i = 0UL; i<=3UL; i++) { + sats[i*3UL].prn = (uint32_t)(uint8_t)sf[i*2UL+6UL]&31UL; + sats[i*3UL+1UL].prn = (uint32_t)(uint8_t) + sf[i*2UL+6UL]/32UL+(uint32_t)(uint8_t) + sf[i*2UL+7UL]*8UL&31UL; + sats[i*3UL+2UL].prn = (uint32_t)(uint8_t)sf[i*2UL+7UL]/4UL&31UL; + } /* end for */ + if (sondeaprs_verb2) { + osi_WrStr("prn:", 5ul); + for (i = 0UL; i<=11UL; i++) { + osic_WrINT32(sats[i].prn, 3UL); + } /* end for */ + osi_WrStrLn("", 1ul); + osi_WrStr("sig: ", 6ul); + for (i = 0UL; i<=11UL; i++) { + osi_WrHex((uint32_t)(uint8_t)sf[i+14UL], 3UL); + } /* end for */ + osi_WrStrLn("", 1ul); + osi_WrStrLn("rang:", 6ul); + } + for (i = 0UL; i<=11UL; i++) { + if (sats[i].prn>0UL) { + sats[i].rang = (int32_t)((uint32_t)(uint8_t) + sf[i*8UL+26UL]+(uint32_t)(uint8_t) + sf[i*8UL+27UL]*256UL+(uint32_t)(uint8_t) + sf[i*8UL+28UL]*65536UL+(uint32_t)(uint8_t) + sf[i*8UL+29UL]*16777216UL); + sats[i].rang1 = (int32_t)((uint32_t)(uint8_t) + sf[i*8UL+30UL]+(uint32_t)(uint8_t) + sf[i*8UL+31UL]*256UL+(uint32_t)(uint8_t) + sf[i*8UL+32UL]*65536UL); + sats[i].rang1 = sats[i].rang1&8388607L; + sats[i].rang3 = (int32_t)(signed char)(uint8_t)sf[i*8UL+33UL]; + d = sats[i].rang-lastsat[i].rang; + d1 = sats[i].rang1-lastsat[i].rang1; + if (sondeaprs_verb2) { + osic_WrINT32(sats[i].prn, 3UL); + osic_WrINT32((uint32_t)sats[i].rang, 12UL); + osic_WrINT32((uint32_t)sats[i].rang1, 12UL); + osic_WrINT32((uint32_t)sats[i].rang3, 5UL); + osic_WrINT32((uint32_t)d, 12UL); + osic_WrINT32((uint32_t)(d-lastsat[i].lastd), 12UL); + osi_WrStrLn("", 1ul); + } + sats[i].lastd = d; + sats[i].lastd1 = d1; + } + } /* end for */ + memcpy(lastsat,sats,sizeof(gpspos_SATS)); + { /* with */ + struct CONTEXTR9 * anonym = cont; + systime = osic_time(); + if (almread>systime) almread = 0UL; + if (almread+60UL>systime) { + *gpstime = systime; + res = gpspos_getposit(anonym->timems, gpstime, sats, + anonym->lastlat, anonym->laslong, anonym->lastalt, + &anonym->lat, &anonym->long0, &anonym->heig, &anonym->speed, + &anonym->dir, &anonym->climb, &anonym->hrmsc, &anonym->vrmsc, + &anonym->goodsats); + } + else res = -2L; + if (res>=0L) { + anonym->lastlat = anonym->lat; + anonym->laslong = anonym->long0; + anonym->lastalt = anonym->heig; + anonym->lastspeed = anonym->speed; + anonym->lastdir = anonym->dir; + anonym->lastclb = anonym->climb; + } + else *gpstime = 0UL; + } + if (sondeaprs_verb && res>=0L) { + degtostr((float)cont->lat, 1, '3', h, 100ul); + osi_WrStr(h, 100ul); + osi_WrStr(" ", 2ul); + degtostr((float)cont->long0, 0, '3', h, 100ul); + osi_WrStr(h, 100ul); + /* WrStr("pos: "); WrFixed(lat/RAD, 5, 12); + WrFixed(long/RAD, 5, 12); */ + osic_WrFixed((float)cont->heig, 0L, 10UL); + osi_WrStr("m ", 3ul); + osic_WrFixed((float)(cont->speed*3.6), 1L, 6UL); + osi_WrStr("km/h ", 6ul); + osic_WrFixed((float)cont->dir, 0L, 5UL); + osi_WrStr("deg ", 5ul); + osic_WrFixed((float)cont->climb, 1L, 7UL); + osi_WrStr("m/s", 4ul); + osi_WrStr(" h/vrms:", 9ul); + osic_WrFixed(cont->hrmsc, 1L, 0UL); + osi_WrStr(" ", 2ul); + osic_WrFixed(cont->vrmsc, 1L, 0UL); + osi_WrStrLn("", 1ul); + } +} /* end dogps() */ + + +static void decodecalib(const char cd[], uint32_t cd_len) +{ + uint32_t n; + uint32_t i; + uint32_t cr; + uint32_t tmp; + memset((char *)coeff,(char)0,sizeof(float [256])); + i = 64UL; + for (tmp = 88UL;;) { + n = (uint32_t)(uint8_t)cd[i]; + cr = (uint32_t)(uint8_t)cd[i+1UL]+(uint32_t)(uint8_t) + cd[i+2UL]*256UL+(uint32_t)(uint8_t) + cd[i+3UL]*65536UL+(uint32_t)(uint8_t) + cd[i+4UL]*16777216UL; + coeff[n] = *X2C_CAST(&cr,uint32_t,float,float *); + if (!tmp) break; + --tmp; + i += 5UL; + } /* end for */ +} /* end decodecalib() */ + + +static float coef(float ref, float u, float c) +{ + float x; + float v; + v = X2C_DIVR(ref,u); + x = 1.0f-v*(1.0f-c); + if (x!=0.0f) return X2C_DIVR(v,x); + return 0.0f; +} /* end coef() */ + + +static float extr(uint32_t hi, uint32_t lo, uint32_t u, + uint32_t idx) +{ + float f; + float x; + float v; + uint32_t i; + uint32_t tmp; + if (hi<=lo || u<=lo) return 0.0f; + v = coef((float)(hi-lo), (float)(u-lo), coeff[idx+7UL]); + x = 0.0f; + f = 1.0f; + tmp = idx+5UL; + i = idx; + if (i<=tmp) for (;; i++) { + /* sum(x^n * k[n] */ + x = x+coeff[i]*f; + f = f*v; + if (i==tmp) break; + } /* end for */ + return x; +} /* end extr() */ + + +static void domes(const char md[], uint32_t md_len, double * hp, + double * hyg, double * temp) +{ + uint32_t i; + int32_t m[8]; + float d5; + float d4; + float d3; + float p; + float hr2; + float hr1; + for (i = 0UL; i<=7UL; i++) { + m[i] = (int32_t)((uint32_t)(uint8_t)md[i*3UL]+(uint32_t) + (uint8_t)md[i*3UL+1UL]*256UL+(uint32_t)(uint8_t) + md[i*3UL+2UL]*65536UL); + } /* end for */ + /* hygro 1 */ + /* IF verb THEN WrStr(" ") END; */ + hr1 = extr((uint32_t)m[3U], (uint32_t)m[7U], (uint32_t)m[1U], 40UL); + hr2 = extr((uint32_t)m[3U], (uint32_t)m[7U], (uint32_t)m[2U], 50UL); + if (hr2>hr1) hr1 = hr2; + if (hr1<2.0f) hr1 = 0.0f; + else if (hr1>100.0f) hr1 = 100.0f; + *hyg = (double)hr1; + /* temp */ + *temp = (double)extr((uint32_t)m[3U], (uint32_t)m[7U], + (uint32_t)m[0U], 30UL); + /* baro */ + d3 = (float)(m[3U]-m[7U]); + d4 = (float)(m[4U]-m[7U]); + d5 = (float)(m[5U]-m[7U]); + p = extr((uint32_t)m[3U], (uint32_t)m[7U], (uint32_t)m[5U], + 10UL)+coeff[60U]*extr((uint32_t)m[3U], (uint32_t)m[7U], + (uint32_t)m[4U], 20UL)+X2C_DIVR(coeff[61U]*coeff[20U]*d3, + d5)+X2C_DIVR(coeff[61U]*coeff[21U]*coef(d3, d4, + coeff[27U])*d3,d5)+X2C_DIVR(coeff[61U]*coeff[22U]*pow0(coef(d3, + d4, coeff[27U]), 2UL)*d3, + d5)+X2C_DIVR(coeff[61U]*coeff[23U]*pow0(coef(d3, d4, + coeff[27U]), 3UL)*d3, + d5)+X2C_DIVR(coeff[62U]*coeff[20U]*d3*d3, + d5*d5)+X2C_DIVR(coeff[62U]*coeff[21U]*coef(d3, d4, + coeff[27U])*d3*d3, + d5*d5)+X2C_DIVR(coeff[62U]*coeff[22U]*pow0(coef(d3, d4, + coeff[27U]), 2UL)*d3*d3, + d5*d5)+X2C_DIVR(coeff[62U]*coeff[23U]*pow0(coef(d3, d4, + coeff[27U]), 3UL)*d3*d3, + d5*d5)+X2C_DIVR(coeff[63U]*coeff[20U]*pow0(d3, 3UL),pow0(d5, + 3UL))+X2C_DIVR(coeff[63U]*coeff[21U]*coef(d3, d4, + coeff[27U])*pow0(d3, 3UL),pow0(d5, + 3UL))+X2C_DIVR(coeff[63U]*coeff[22U]*pow0(coef(d3, d4, + coeff[27U]), 2UL)*pow0(d3, 3UL),pow0(d5, + 3UL))+X2C_DIVR(coeff[63U]*coeff[23U]*pow0(coef(d3, d4, + coeff[27U]), 3UL)*pow0(d3, 3UL),pow0(d5, 3UL)); + /* + + coeff[70]*pow(coeff[20],2) + + coeff[70]*pow(coeff[21],2)*pow(coef(d3, d4, coeff[27]),2) + + coeff[70]*pow(coeff[22],2)*pow(coef(d3, d4, coeff[27]),4) + + coeff[70]*pow(coeff[23],2)*pow(coef(d3, d4, coeff[27]),6) + + + coeff[71]*pow(coeff[20],2)*d3/d5 + + coeff[71]*pow(coeff[21],2)*pow(coef(d3, d4, coeff[27]),2)*d3/d5 + + coeff[71]*pow(coeff[22],2)*pow(coef(d3, d4, coeff[27]),4)*d3/d5 + + coeff[71]*pow(coeff[23],2)*pow(coef(d3, d4, coeff[27]),6)*d3/d5 + + + coeff[72]*pow(coeff[20],2)*pow(d3,2)/pow(d5,2) + + coeff[72]*pow(coeff[21],2)*pow(coef(d3, d4, coeff[27]),2)*pow(d3, + 2)/pow(d5,2) + + coeff[72]*pow(coeff[22],2)*pow(coef(d3, d4, coeff[27]),4)*pow(d3, + 2)/pow(d5,2) + + coeff[72]*pow(coeff[23],2)*pow(coef(d3, d4, coeff[27]),6)*pow(d3, + 2)/pow(d5,2) + + + coeff[73]*pow(coeff[20],2)*pow(d3,3)/pow(d5,3) + + coeff[73]*pow(coeff[21],2)*pow(coef(d3, d4, coeff[27]),2)*pow(d3, + 3)/pow(d5,3) + + coeff[73]*pow(coeff[22],2)*pow(coef(d3, d4, coeff[27]),4)*pow(d3, + 3)/pow(d5,3) + + coeff[73]*pow(coeff[23],2)*pow(coef(d3, d4, coeff[27]),6)*pow(d3, + 3)/pow(d5,3) + + + coeff[80]*pow(coeff[20],3) + + coeff[80]*pow(coeff[21],3)*pow(coef(d3, d4, coeff[27]),3) + + coeff[80]*pow(coeff[22],3)*pow(coef(d3, d4, coeff[27]),6) + + coeff[80]*pow(coeff[23],3)*pow(coef(d3, d4, coeff[27]),9) + + + coeff[81]*pow(coeff[20],3)*d3/d5 + + coeff[81]*pow(coeff[21],3)*pow(coef(d3, d4, coeff[27]),3)*d3/d5 + + coeff[81]*pow(coeff[22],3)*pow(coef(d3, d4, coeff[27]),6)*d3/d5 + + coeff[81]*pow(coeff[23],3)*pow(coef(d3, d4, coeff[27]),9)*d3/d5 + + + coeff[82]*pow(coeff[20],3)*pow(d3,2)/pow(d5,2) + + coeff[82]*pow(coeff[21],3)*pow(coef(d3, d4, coeff[27]),3)*pow(d3, + 2)/pow(d5,2) + + coeff[82]*pow(coeff[22],3)*pow(coef(d3, d4, coeff[27]),6)*pow(d3, + 2)/pow(d5,2) + + coeff[82]*pow(coeff[23],3)*pow(coef(d3, d4, coeff[27]),9)*pow(d3, + 2)/pow(d5,2) + */ + *hp = (double)p; + /* + x10:=c[10] + .... + x20:=c[20] + c[21]*v(m4) + c[22]*v(m4)^2 ... + x60:=-c[60]*x20 + 10*c[61]*x20 - 100*c[62]*x20 + 1000*c[63]*x20 + x70:=c[70]*x20^2 - 10*c[71]*x20^2 + 100*c[72]*x20^2 - 1000*c[72]*x20^2 + x80:=-c[80]*x20^3 + 10*c[81]*x20^3 - 100*c[82]*x20^3 + p:=x10 + x20 + x60 + x70 + x80 + */ + if (sondeaprs_verb) { + osi_WrStr("mes:", 5ul); + if (sondeaprs_verb2) { + for (i = 0UL; i<=7UL; i++) { + osic_WrINT32((uint32_t)m[i], 7UL); + osi_WrStr(" ", 2ul); + } /* end for */ + osi_WrStrLn("", 1ul); + } + osic_WrFixed((float)*temp, 3L, 7UL); + osi_WrStr(" ", 2ul); + osic_WrFixed(hr1, 3L, 7UL); + /*WrStr(" ");WrFixed(hr2, 3,7); */ + osi_WrStr(" ", 2ul); + osic_WrFixed(p, 2L, 8UL); + } +/*WrStr(" ");WrFixed(x2, 2,8); */ +/*WrStrLn(""); */ +} /* end domes() */ + +static float sondemod_P[13] = {1000.0f,150.0f,100.0f,70.0f,60.0f,50.0f, + 40.0f,30.0f,20.0f,15.0f,10.0f,8.0f,0.0f}; + +static float sondemod_C[13] = {1.0f,1.0f,1.01f,1.022f,1.025f,1.035f, + 1.047f,1.065f,1.092f,1.12f,1.17f,1.206f,1.3f}; + +static float _cnst0[13] = {1.0f,1.0f,1.01f,1.022f,1.025f,1.035f,1.047f, + 1.065f,1.092f,1.12f,1.17f,1.206f,1.3f}; +static float _cnst[13] = {1000.0f,150.0f,100.0f,70.0f,60.0f,50.0f,40.0f, + 30.0f,20.0f,15.0f,10.0f,8.0f,0.0f}; + +static double getOzoneCorr(double p) +/* From from ftp://ftp.cpc.ncep.noaa.gov/ndacc/meta/sonde/cv_payerne_snd.txt */ +{ + uint32_t i; + i = 12UL; + while (i>0UL && (double)_cnst[i]'9') && ((uint8_t)fn[i]<'A' || (uint8_t)fn[i]>'Z')) { + fn[0UL] = 0; + goto label; + } + ++i; + } + + + aprsstr_Assign(fn, fn_len, "/tmp/", 6); + aprsstr_Append(fn, fn_len, obj, obj_len); + aprsstr_Append(fn, fn_len, ".cal", 5ul); + label:; + X2C_PFREE(obj); +} /* end calibfn() */ + + +static void readcontext(struct CONTEXTR9 * cont, char objname0[], + uint32_t objname_len) +{ + char fn[1024]; + int32_t fd; + X2C_PCOPY((void **)&objname0,objname_len); + initcontext(cont); + calibfn(objname0, objname_len, fn, 1024ul); + fd = osi_OpenRead(fn, 1024ul); + if (fd>=0L) { + if (osi_RdBin(fd, (char *)cont, sizeof(struct CONTEXTR9)/1u, + sizeof(struct CONTEXTR9))!=(int32_t) + sizeof(struct CONTEXTR9)) initcontext(cont); + osic_Close(fd); + } + X2C_PFREE(objname0); +} /* end readcontext() */ + + +static void wrcontext(struct CONTEXTR9 * cont, char objname0[], + uint32_t objname_len) +{ + char fn[1024]; + int32_t fd; + X2C_PCOPY((void **)&objname0,objname_len); + calibfn(objname0, objname_len, fn, 1024ul); + if (fn[0U]) { + fd = osi_OpenWrite(fn, 1024ul); + if (fd>=0L) { + osi_WrBin(fd, (char *)cont, sizeof(struct CONTEXTR9)/1u, + sizeof(struct CONTEXTR9)); + osic_Close(fd); + } + } + X2C_PFREE(objname0); +} /* end wrcontext() */ + + +static void docalib(const char sf[], uint32_t sf_len, + char objname0[], uint32_t objname_len, + struct CONTEXTR9 * cont, float * mhz0, + uint32_t * frameno) +{ + uint32_t idx; + uint32_t j; + uint32_t i; + char new0; + *mhz0 = 0.0f; + new0 = 0; + i = 0UL; + for (j = 2UL; j<=11UL; j++) { + /* object name */ + /* IF (1 IN cont.calibok) & (sf[j]<>cont.calibdata[j+20]) + THEN cont.calibok:=SET32{} END; */ + if (i<=objname_len-1 && (uint8_t)sf[j]>' ') { + if (objname0[i]!=sf[j]) new0 = 1; + objname0[i] = sf[j]; + ++i; + } + } /* end for */ + if (i<=objname_len-1) objname0[i] = 0; + if (new0) readcontext(cont, objname0, objname_len); + *frameno = (uint32_t)(uint8_t)sf[0UL]+(uint32_t)(uint8_t) + sf[1UL]*256UL; + if (sondeaprs_verb) { + if (new0) osi_WrStr("new ", 5ul); + osic_WrINT32(*frameno, 1UL); /* frame no */ + osi_WrStr(" ", 2ul); + osi_WrStr(objname0, objname_len); /*WrStr(" bat:"); + WrHex(ORD(sf[12]), 2);*/ + } + idx = (uint32_t)(uint8_t)sf[15UL]; + if (idx<32UL) { + j = idx*16UL; + for (i = 16UL; i<=31UL; i++) { + if (j<=511UL) { + /* IF (idx IN cont.calibok) & (cont.calibdata[j]<>sf[i]) + THEN cont.calibok:=SET32{} END; */ + cont->calibdata[j] = sf[i]; + } + ++j; + } /* end for */ + if (!X2C_IN(idx,32,cont->calibok)) { + /* got more new info */ + cont->calibok |= (1UL<calibok)) { + *mhz0 = (float)(400000UL+((uint32_t)(uint8_t) + cont->calibdata[2U]+(uint32_t)(uint8_t) + cont->calibdata[3U]*256UL)*10UL)*0.001f; + if (sondeaprs_verb) { + osi_WrStr(" ", 2ul); + osic_WrFixed(*mhz0, 2L, 6UL); + osi_WrStr("MHz ", 5ul); + } + } + if (sondeaprs_verb) { + osi_WrStr(" calib: ", 9ul); + for (i = 0UL; i<=31UL; i++) { + if (i==idx) osi_WrStr("!", 2ul); + else if (X2C_IN(i,32,cont->calibok)) osi_WrStr("+", 2ul); + else osi_WrStr("-", 2ul); + } /* end for */ + } + if (cont->calibok==0xFFFFFFFFUL) { + /* calibration ready now */ + decodecalib(cont->calibdata, 512ul); + } + } +} /* end docalib() */ + + +static uint32_t calperc(uint32_t cs) +{ + uint32_t n; + uint32_t i; + n = 0UL; + for (i = 0UL; i<=31UL; i++) { + if (X2C_IN(i,32,cs)) ++n; + } /* end for */ + return (n*100UL)/32UL; +} /* end calperc() */ + + +static void WrRinexfn(uint32_t t) +{ + char fn[31]; + uint32_t y; + uint32_t d; + int32_t f; + /*DateToStr(t, fn); WrStrLn(fn); */ + d = 25568UL+t/86400UL; + y = (d*4UL)/1461UL; + d = 1UL+((d*4UL)%1461UL)/4UL; + strncpy(fn,"brdc0000.00n",31u); + fn[4U] = (char)(d/100UL+48UL); + fn[5U] = (char)((d/10UL)%10UL+48UL); + fn[6U] = (char)(d%10UL+48UL); + fn[9U] = (char)((y/10UL)%10UL+48UL); + fn[10U] = (char)(y%10UL+48UL); + if (sondeaprs_verb) osi_WrStrLn(fn, 31ul); + f = osi_OpenWrite("getalmanach", 12ul); + if (f>=0L) { + osi_WrBin(f, (char *)fn, 31u/1u, aprsstr_Length(fn, 31ul)); + osic_Close(f); + } + else osi_WrStrLn("can not write getalmanach file", 31ul); +} /* end WrRinexfn() */ + + +static void getcall(const char b[], uint32_t b_len, char call[], + uint32_t call_len) +{ + uint32_t c; + uint32_t n; + uint32_t i; + char tmp; + call[0UL] = 0; + n = (uint32_t)(uint8_t)b[0UL]*16777216UL+(uint32_t)(uint8_t) + b[1UL]*65536UL+(uint32_t)(uint8_t) + b[2UL]*256UL+(uint32_t)(uint8_t)b[3UL]; + if (n>0UL && (uint32_t)(uint8_t)b[4UL]<=15UL) { + for (i = 5UL;; i--) { + c = n%37UL; + if (c==0UL) call[i] = 0; + else if (c<27UL) call[i] = (char)((c+65UL)-1UL); + else call[i] = (char)((c+48UL)-27UL); + n = n/37UL; + if (i==0UL) break; + } /* end for */ + call[6UL] = 0; + c = (uint32_t)(uint8_t)b[4UL]; + if (c>0UL) { + aprsstr_Append(call, call_len, "-", 2ul); + if (c>=10UL) { + aprsstr_Append(call, call_len, "1", 2ul); + c = c%10UL; + } + aprsstr_Append(call, call_len, + (char *)(tmp = (char)(c+48UL),&tmp), 1u/1u); + } + } +/*WrStr("usercall:");WrStrLn(call); */ +} /* end getcall() */ + +static uint16_t sondemod_POLYNOM = 0x1021U; + + +static void decodeframe(uint8_t m, uint32_t ip, uint32_t fromport) +{ + uint32_t gpstime; + uint32_t frameno; + uint32_t len; + uint32_t ic; + uint32_t p; + uint32_t j; + uint32_t i; + uint32_t almanachage; + uint16_t crc; + char typ; + char sf[256]; + char bb[256]; + char b[256]; + char crdone; + char calok; + CALLSSID usercall; + struct CONTEXTR9 * anonym; + struct CONTEXTR9 * anonym0; + struct CONTEXTR9 * anonym1; + uint32_t tmp; + //SKP + contextr9.aux=0; + FILE * ftoold; + + /* + -- reedsolomon is done by sondeudp + FOR i:=0 TO HIGH(b) DO b[i]:=0C END; + FOR i:=0 TO 240-6-24-1 DO b[(255-24-1)-i]:=chan[m].rxbuf[i+6] END; + FOR i:=0 TO 24-1 DO b[(255-1)-i]:=chan[m].rxbuf[i+(240-24)] END; + -- WrStrLn(" ecco: "); + -- FOR i:=216 TO 239 DO WrHex(ORD(chan[m].rxbuf[i]), 4) END; WrStrLn(""); + WrStrLn(""); + --bb:=b; + res:=decodersc(b, eraspos, 0); + IF res>0 THEN + FOR i:=0 TO 240-6-24-1 DO chan[m].rxbuf[i+6]:=b[(255-24-1)-i] END; + FOR i:=0 TO 24-1 DO chan[m].rxbuf[i+(240-24)]:=b[(255-1)-i] END; + IF verb THEN WrInt(res, 1); WrStr(" bytes corrected "); END; + END; + */ + /* + WrInt(res, 1); WrStrLn("=rs"); + FOR i:=0 TO 254 DO + IF b[i]<>bb[i] THEN + WrInt(i, 4); WrStr(":");WrHex(ORD(bb[i]), 2); WrStr("-"); + WrHex(ORD(b[i]), 2); + END; + END; + WrStrLn(" diffs"); + */ + for (i = 0UL; i<=255UL; i++) { + b[i] = chan[m].rxbuf[i]; + } /* end for */ + calok = 0; + getcall(b, 256ul, usercall, 11ul); + if (usercall[0U]==0) aprsstr_Assign(usercall, 11ul, mycall, 100ul); + if (sondeaprs_verb && fromport>0UL) { + osi_WrStr("UDP:", 5ul); + aprsstr_ipv4tostr(ip, bb, 256ul); + osi_WrStr(bb, 256ul); + osi_WrStr(":", 2ul); + osic_WrINT32(fromport, 1UL); + if (usercall[0U]) { + osi_WrStr(" (", 3ul); + osi_WrStr(usercall, 11ul); + osi_WrStr(")", 2ul); + } + osi_WrStrLn("", 1ul); + } + p = 6UL; + crdone = 1; + contextr9.posok = 0; + contextr9.ozontemp = 0.0; + contextr9.ozon = 0.0; + mhz = 0.0f; + for (;;) { + typ = b[p]; + if (typ=='e') { + if (sondeaprs_verb) { + osi_WrStr("cal ", 6ul); + crdone = 0; + } + } + else if (typ=='g') { + if (sondeaprs_verb) { + osi_WrStr("gps ", 6ul); + crdone = 0; + } + } + else if (typ=='h') { + if (b[p+2UL]!='\003' && sondeaprs_verb) { + osi_WrStr("aux ", 5ul); + crdone = 0; + } + } + else if (typ=='i') { + if (sondeaprs_verb) { + osi_WrStr("data ", 6ul); + crdone = 0; + } + } + else if (typ=='\377') break; + else { + osi_WrStr("R92 end ", 9ul); + if (sondeaprs_verb) { + osi_WrHex((uint32_t)(uint8_t)typ, 4UL); + crdone = 0; + } + break; + } + ++p; + len = (uint32_t)(uint8_t)b[p]*2UL+2UL; /* +crc */ + if (len>=240UL) { + if (sondeaprs_verb) { + osi_WrStr("RS92 Frame too long ", 21ul); + osic_WrINT32(len, 1UL); + crdone = 0; + } + break; + } + ++p; + j = 0UL; + /*WrInt(len 3);WrStrLn("=len"); */ + crc = 0xFFFFU; + while (j240UL) { + osi_WrStr("eof", 4ul); /* error */ + crdone = 0; + goto loop_exit; + } + } + crdone = 0; + if ((char)crc!=sf[len-2UL] || (char)X2C_LSH(crc,16, + -8)!=sf[len-1UL]) { + if (sondeaprs_verb) osi_WrStrLn("********* crc error", 20ul); + } + else { + if (typ=='e') { + docalib(sf, 256ul, objname, 9ul, &contextr9, &mhz, &frameno); + if (frameno>contextr9.framenum) { + /* new frame number */ + contextr9.mesok = 0; + contextr9.posok = 0; + contextr9.framesent = 0; + calok = 1; + contextr9.framenum = frameno; + } + else if (contextr9.framenum==frameno && !contextr9.framesent) { + calok = 1; + } + else if (framenocalibok==0xFFFFFFFFUL) { + domes(sf, 256ul, &anonym->hp, &anonym->hyg, &anonym->temp); + anonym->mesok = 1; + } + } + } + else if (typ=='g') { + if (calok) { + { /* with */ + struct CONTEXTR9 * anonym0 = &contextr9; + dogps(sf, 256ul, &contextr9, &anonym0->timems, &gpstime); + if (almread+30UL<=systime) { + if (gpspos_readalmanach(semfile, 1024ul, yumafile, + 1024ul, rinexfile, 1024ul, anonym0->timems/1000UL, &almage, + sondeaprs_verb)) { + if (almread+60UL<=systime) { + dogps(sf, 256ul, &contextr9, &anonym0->timems,&gpstime); + } + almread = systime; + } + else { + ftoold=fopen("/tmp/toold", "ab+"); + if(ftoold) fclose(ftoold); + almread = 0UL; + almage = 0UL; + osi_WrStrLn("almanach read error", 20ul); + } + if (rinexfile[0U] + && (almage==0UL || gpstime>almage && gpstime-almage>almrequest) + ) { + /* request a new almanach */ + if (gpstime==0UL) WrRinexfn(systime); + else WrRinexfn(gpstime); + } + crdone = 0; + } + if (gpstime>0UL && gpstime>=almage) { + almanachage = gpstime-almage; + } + else { + almanachage = 0UL; + } + if (almage+maxalmage>gpstime) anonym0->posok = 1; + else if (almanachage>0UL) { + fopen("/tmp/toold", "ab+"); + osic_WrINT32(almanachage/60UL, 10UL); + osi_WrStrLn(" Min (almanach too old)", 24ul); + if (almread+4UL<=systime) { + almread = systime-30UL; + /* look often for new almanach */ + } + } + } + crdone = 1; + } + } + else if (typ=='h') { + if (sf[0U]!='\003') { + contextr9.aux=1; + if (sondeaprs_verb2) { + tmp = len-1UL; + j = 0UL; + if (j<=tmp) for (;; j++) { + osi_WrHex((uint32_t)(uint8_t)sf[j], 3UL); + if (j==tmp) break; + } /* end for */ + osi_WrStrLn("", 1ul); + crdone = 1; + } + if (sf[0U]==0) { + doozon(sf, 256ul, contextr9.hp, &contextr9.ozontemp, + &contextr9.ozon); + crdone = 1; + } + } + } + else if (sondeaprs_verb2) { + tmp = len-1UL; + j = 0UL; + if (j<=tmp) for (;; j++) { + osi_WrHex((uint32_t)(uint8_t)sf[j], 3UL); + if (j==tmp) break; + } /* end for */ + crdone = 0; + } + if (sondeaprs_verb && !crdone) { + osi_WrStrLn("", 1ul); + crdone = 1; + } + } + } + loop_exit:; +/* if (((((contextr9.posok && calok) && almread+60UL>systime) + && (((sendquick==2UL || sondeaprs_nofilter) + || contextr9.calibok==0xFFFFFFFFUL) + || (contextr9.calibok&0x1UL)!=0UL && sendquick==1UL)) + && contextr9.lat!=0.0) && contextr9.long0!=0.0) { +*/ + + if (contextr9.posok && contextr9.lat!=0.0 && contextr9.long0!=0.0 && contextr9.heig==0.0 && contextr9.dir==0.0) { + fopen("/tmp/toold", "ab+"); + } + + if (contextr9.posok && contextr9.lat!=0.0 && contextr9.long0!=0.0) { + + + { /* with */ + struct CONTEXTR9 * anonym1 = &contextr9; + if (!anonym1->mesok || anonym1->calibok!=0xFFFFFFFFUL) { + anonym1->hp = 0.0; + anonym1->hyg = 0.0; + anonym1->temp = (double)X2C_max_real; + } + sondeaprs_senddata(anonym1->lat, anonym1->long0, anonym1->heig, + anonym1->speed, anonym1->dir, anonym1->climb, anonym1->hp, + anonym1->hyg, anonym1->temp, anonym1->ozon, + anonym1->ozontemp, 0.0, 0.0, (double)mhz, + (double)anonym1->hrmsc, (double)anonym1->vrmsc, + (anonym1->timems/1000UL+86382UL)%86400UL, frameno, objname, + 9ul, almanachage, anonym1->goodsats, usercall, 11ul, + calperc(anonym1->calibok), 0UL,0.0, sondeaprs_nofilter,"RS92",5,0); + anonym1->framesent = 1; + //SKP + saveMysql( objname,frameno,anonym1->lat,anonym1->long0,anonym1->heig,anonym1->speed,anonym1->dir,anonym1->climb,9,2,0,anonym1->ozon,anonym1->aux,anonym1->hp,(double)mhz); + + } + crdone = 1; + } + if (sondeaprs_verb) { + if (!crdone) osi_WrStrLn("", 1ul); + osi_WrStrLn("------------", 13ul); + } +} /* end decodeframe() */ + +/*------------------------------ C34 C50 */ + +static double latlong(uint32_t val, char c50) +{ + double hf; + double hr; + hr = (double)(float)(val%0x080000000UL); + if (c50) hr = X2C_DIVL(hr,1.E+7); + else hr = X2C_DIVL(hr,1.E+6); + hf = (double)(float)(uint32_t)X2C_TRUNCC(hr,0UL, + X2C_max_longcard); + hr = hf+X2C_DIVL(hr-hf,0.6); + if (val>=0x080000000UL) hr = -hr; + return hr; +} /* end latlong() */ + +#define sondemod_MAXEXTEND 3.0 +/* limit extrapolation range */ + +#define sondemod_MAXTIMESPAN 10 + +#define sondemod_MAXRANGE 4.7123889803847E-4 +/* max jump in rad */ + + +static double extrapolate(double yold, double y, + uint32_t told, uint32_t t, uint32_t systime0, + char * good) +{ + double maxex; + double maxr; + double dy; + double k; + uint32_t maxt; + maxr = 4.7123889803847E-4; + maxt = 10UL; + maxex = 3.0; + if (sondeaprs_nofilter) { + maxr = 1.8849555921539E-3; + maxt = 40UL; + maxex = 12.0; + } + *good = 1; + if (t>=systime0) return y; + /* point is just in time */ + if (toldmaxex || told+maxtmaxr) *good = 0; + return yold+dy*k; + } + *good = 0; + return y; +} /* end extrapolate() */ + + +static double dist(double a, double b) +{ + double d; + d = a-b; + if (d>3.1415926535898) d = d-6.2831853071796; + else if (d<(-3.1415926535898)) d = d+6.2831853071796; + return d; +} /* end dist() */ + +#define sondemod_MINTV 8 +/* min seconds for speed out of positions */ + +#define sondemod_VLIM 2.6164311878598E-5 +/* max speed */ + + +static void decodec34(const char rxb[], uint32_t rxb_len, + uint32_t ip, uint32_t fromport) +{ + OBJNAME nam; + char cb[10]; + char s[1001]; + CALLSSID usercall; + uint32_t val; + uint32_t sum2; + uint32_t sum1; + uint32_t j; + uint32_t i; + double ve; + double exlat; + double exlon; + double hr; + pCONTEXTC34 pc0; + pCONTEXTC34 pc1; + pCONTEXTC34 pc; + double stemp; + char c50; + char latok; + char lonok; + char posok; + char tmp[10]; + double frq; + struct CONTEXTC34 * anonym; + struct CONTEXTC34 * anonym0; + struct CONTEXTC34 * anonym1; + struct CONTEXTC34 * anonym2; + if (rxb[0UL]!='S' || rxb[1UL]!='C') return; + /* no srsc34 frame */ + c50 = rxb[2UL]=='5'; /* is a sc50 */ + + tmp[0]=rxb[22]; + tmp[1]=rxb[23]; + tmp[2]=rxb[24]; + tmp[3]='.'; + tmp[4]=rxb[25]; + tmp[5]=rxb[26]; + tmp[6]=rxb[27]; + tmp[7]=0; + frq=atof(tmp); + + + i = 0UL; + do { + nam[i] = rxb[i]; + ++i; + } while (i<=8UL); + if (nam[0U]==0) return; + /* wait for id */ + ++i; + j = 0UL; + do { + cb[j] = rxb[i]; + ++i; + ++j; + } while (j<=4UL); + getcall(cb, 10ul, usercall, 11ul); + if (usercall[0U]==0) aprsstr_Assign(usercall, 11ul, mycall, 100ul); + j = 0UL; + do { + cb[j] = rxb[i]; + ++i; + ++j; + } while (j<=9UL); + sum1 = 0UL; + sum2 = 65791UL; + for (i = 0UL; i<=4UL; i++) { + sum1 += (uint32_t)(uint8_t)cb[i]; + sum2 -= (uint32_t)(uint8_t)cb[i]*(5UL-i); + } /* end for */ + sum1 = sum1&255UL; + sum2 = sum2&255UL; + if (sum1!=(uint32_t)(uint8_t)cb[5U] || sum2!=(uint32_t)(uint8_t) + cb[6U]) return; + /* chesum error */ + if (sondeaprs_verb && fromport>0UL) { + osi_WrStr("UDP:", 5ul); + aprsstr_ipv4tostr(ip, s, 1001ul); + osi_WrStr(s, 1001ul); + osi_WrStr(":", 2ul); + osic_WrINT32(fromport, 1UL); + if (usercall[0U]) { + osi_WrStr(" (", 3ul); + osi_WrStr(usercall, 11ul); + osi_WrStr(")", 2ul); + } + osi_WrStr(" ", 2ul); + } + osi_WrStr(nam, 9ul); + osi_WrStr(" ", 2ul); + pc = pcontextc; + pc0 = 0; + for (;;) { + if (pc==0) break; + pc1 = X2C_CHKNIL(pCONTEXTC34,pc)->next; + if (pc->tused+3600ULnext = pc1; + osic_free((char * *) &pc, sizeof(struct CONTEXTC34)); + } + else { + if (aprsstr_StrCmp(nam, 9ul, pc->name, 9ul)) break; + pc0 = pc; + } + pc = pc1; + } + if (pc==0) { + osic_alloc((char * *) &pc, sizeof(struct CONTEXTC34)); + if (pc==0) Error("allocate context out im memory", 31ul); + memset((char *)pc,(char)0,sizeof(struct CONTEXTC34)); + pc->next = pcontextc; + pcontextc = pc; + aprsstr_Assign(pc->name, 9ul, nam, 9ul); + if (sondeaprs_verb) osi_WrStrLn("is new ", 8ul); + } + X2C_CHKNIL(pCONTEXTC34,pc)->tused = systime; + val = (uint32_t)(uint8_t)cb[4U]+(uint32_t)(uint8_t) + cb[3U]*256UL+(uint32_t)(uint8_t) + cb[2U]*65536UL+(uint32_t)(uint8_t)cb[1U]*16777216UL; + hr = (double)*X2C_CAST(&val,uint32_t,float,float *); + posok = 0; + if (c50) { + switch ((unsigned)cb[0U]) { + case '\003': + if (hr<99.9 && hr>(-99.9)) { + if (sondeaprs_verb) { + osi_WrStr("temp ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("oC", 3ul); + } + pc->temp = hr; + pc->ttemp = systime; + } + break; + case '\024': + if (sondeaprs_verb) { + osi_WrStr("date", 5ul); + aprsstr_IntToStr((int32_t)(val%1000000UL+1000000UL), 1UL, s, + 1001ul); + s[0U] = ' '; + osi_WrStr(s, 1001ul); + } + break; + case '\025': + pc->gpstime = (val/10000UL)*3600UL+((val%10000UL)/100UL) + *60UL+val%100UL; + pc->tgpstime = systime; + if (sondeaprs_verb) { + aprsstr_TimeToStr(pc->gpstime, s, 1001ul); + osi_WrStr("time ", 6ul); + osi_WrStr(s, 1001ul); + } + break; + case '\026': + hr = latlong(val, c50); + if (hr<89.9 && hr>(-89.9)) { + if (sondeaprs_verb) { + osi_WrStr("lat ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + if (pc->tlat!=systime) { + { /* with */ + struct CONTEXTC34 * anonym = pc; + anonym->lat1 = anonym->lat; + anonym->tlat1 = anonym->tlat; + anonym->lat = hr*1.7453292519943E-2; + anonym->tlat = systime; + if (anonym->tlattlatv1) { + anonym->tlatv1 = anonym->tlat; + /* repair back jumped time */ + } + if (anonym->tlat>anonym->tlatv1+8UL) { + /* south-north speed */ + ve = X2C_DIVL(dist(anonym->lat, anonym->latv1), + (double)(anonym->tlat-anonym->tlatv1)); + /*WrStr(" ");WrFixed(ve*(EARTH*1000), 1, 9); + WrStr("VTn"); */ + if (fabs(ve)<=2.6164311878598E-5) { + anonym->vlat = anonym->vlat+(ve-anonym->vlat)*0.5; + } + anonym->latv1 = anonym->lat; + anonym->tlatv1 = anonym->tlat; + } + } + posok = 1; + } + } + break; + case '\027': + hr = latlong(val, c50); + if (hr<180.0 && hr>(-180.0)) { + if (sondeaprs_verb) { + osi_WrStr("long ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + if (pc->tlon!=systime) { + { /* with */ + struct CONTEXTC34 * anonym0 = pc; + anonym0->lon1 = anonym0->lon; + /* save 2 values for extrapolating */ + anonym0->tlon1 = anonym0->tlon; + anonym0->lon = hr*1.7453292519943E-2; + anonym0->tlon = systime; + if (anonym0->tlontlonv1) { + anonym0->tlonv1 = anonym0->tlon; + /* repair back jumped time */ + } + if (anonym0->tlat>0UL && anonym0->tlon>anonym0->tlonv1+8UL) + { + /* east-west speed */ + ve = X2C_DIVL(dist(anonym0->lon, + anonym0->lonv1)*(double)osic_cos((float) + anonym0->lat),(double)(anonym0->tlon-anonym0->tlonv1)); + /*WrStr(" ");WrFixed(ve*(EARTH*1000), 1, 9); + WrStr("VTe"); */ + if (fabs(ve)<=2.6164311878598E-5) { + anonym0->vlon = anonym0->vlon+(ve-anonym0->vlon)*0.5; + } + anonym0->lonv1 = anonym0->lon; + anonym0->tlonv1 = anonym0->tlon; + } + } + posok = 1; + } + } + break; + case '\030': + hr = (double)((float)val*0.1f); + if (hr<50000.0) { + if (sondeaprs_verb) { + osi_WrStr("alti ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("m", 2ul); + } + if (pc->taltclmb = pc->clmb+(X2C_DIVL(hr-pc->alt, + (double)(float)(systime-pc->talt))-pc->clmb)*0.25; + } + pc->alt = hr; + pc->talt = systime; + } + break; + default:; + if (sondeaprs_verb) { + osi_WrHex((uint32_t)(uint8_t)cb[0U], 0UL); + osi_WrStr(" ", 2ul); + osi_WrHex((uint32_t)(uint8_t)cb[1U], 0UL); + osi_WrHex((uint32_t)(uint8_t)cb[2U], 0UL); + osi_WrHex((uint32_t)(uint8_t)cb[3U], 0UL); + osi_WrHex((uint32_t)(uint8_t)cb[4U], 0UL); + osic_WrFixed((float)hr, 2L, 10UL); + } + break; + } /* end switch */ + { /* with */ + struct CONTEXTC34 * anonym1 = pc; + anonym1->tspeed = systime; + anonym1->tdir = systime; + anonym1->speed = (double)(osic_sqrt((float) + (anonym1->vlon*anonym1->vlon+anonym1->vlat*anonym1->vlat)) + *6.37E+6f); /* speed out of moved distance km/h */ + anonym1->dir = atan20(anonym1->vlat, anonym1->vlon); + if (anonym1->dir<0.0) anonym1->dir = anonym1->dir+6.2831853071796; + anonym1->dir = anonym1->dir*5.7295779513082E+1; + } + } + else { + /*WrStrLn(""); WrStr("vlat,vlon spd, dir:"); + WrFixed(vlat*(EARTH*3600), 1,7); */ + /*WrFixed(vlon*(EARTH*3600), 1,7); WrFixed(speed*3.6, 1,8); + WrFixed(dir, 1,9) ; WrFixed(alt, 1,9); */ + /* SC34 */ + switch ((unsigned)cb[0U]) { + case '\003': + if (hr<99.9 && hr>(-99.9)) { + if (sondeaprs_verb) { + osi_WrStr("temp ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("oC", 3ul); + } + pc->temp = hr; + pc->ttemp = systime; + } + break; + case '\024': + /* + |CHR(07H): IF (hr<99.9) & (hr>-99.9) THEN + IF verb THEN WrStr("dewp "); WrFixed(hr, 1, 0); + WrStr("oC"); END; + pc^.dewp:=hr; + pc^.tdewp:=systime; + END; + */ + if (sondeaprs_verb) { + osi_WrStr("date", 5ul); + aprsstr_IntToStr((int32_t)(val%1000000UL+1000000UL), 1UL, s, + 1001ul); + s[0U] = ' '; + osi_WrStr(s, 1001ul); + } + break; + case '\025': + pc->gpstime = (val/10000UL)*3600UL+((val%10000UL)/100UL) + *60UL+val%100UL; + pc->tgpstime = systime; + if (sondeaprs_verb) { + aprsstr_TimeToStr(pc->gpstime, s, 1001ul); + osi_WrStr("time ", 6ul); + osi_WrStr(s, 1001ul); + } + break; + case '\026': + hr = latlong(val, c50); + if (hr<89.9 && hr>(-89.9)) { + if (sondeaprs_verb) { + osi_WrStr("lati ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + if (pc->tlat!=systime) { + pc->lat1 = pc->lat; + pc->tlat1 = pc->tlat; + pc->lat = hr*1.7453292519943E-2; + pc->tlat = systime; + posok = 1; + } + } + break; + case '\027': + hr = latlong(val, c50); + if (hr<180.0 && hr>(-180.0)) { + if (sondeaprs_verb) { + osi_WrStr("long ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + if (pc->tlon!=systime) { + pc->lon1 = pc->lon; /* save 2 values for extrapolating */ + pc->tlon1 = pc->tlon; + pc->lon = hr*1.7453292519943E-2; + pc->tlon = systime; + posok = 1; + } + } + break; + case '\030': + hr = (double)((float)val*0.1f); + if (hr<50000.0) { + if (sondeaprs_verb) { + osi_WrStr("alti ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("m", 2ul); + } + if (pc->taltclmb = pc->clmb+(X2C_DIVL(hr-pc->alt, + (double)(float)(systime-pc->talt))-pc->clmb)*0.25; + } + pc->alt = hr; + pc->talt = systime; + } + break; + case '\031': + hr = (double)((float)val*1.851984E-1f); + /*1.609*/ /*1.852*/ /* guess knots or miles */ + if (hr>=0.0 && hr<1000.0) { + if (sondeaprs_verb) { + osi_WrStr("wind ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("km/h", 5ul); + } + pc->speed = hr*2.7777777777778E-1; + pc->tspeed = systime; + } + break; + case '\032': + hr = (double)((float)val*0.1f); + if (hr>=0.0 && hr<=360.0) { + if (sondeaprs_verb) { + osi_WrStr("wdir ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("deg", 4ul); + } + pc->dir = hr; + pc->tdir = systime; + } + break; + default:; + if (sondeaprs_verb) { + osi_WrHex((uint32_t)(uint8_t)cb[0U], 0UL); + osi_WrStr(" ", 2ul); + osi_WrHex((uint32_t)(uint8_t)cb[1U], 0UL); + osi_WrHex((uint32_t)(uint8_t)cb[2U], 0UL); + osi_WrHex((uint32_t)(uint8_t)cb[3U], 0UL); + osi_WrHex((uint32_t)(uint8_t)cb[4U], 0UL); + osic_WrFixed((float)hr, 2L, 10UL); + } + break; + } /* end switch */ + } + { /* with */ + struct CONTEXTC34 * anonym2 = pc; +/* if (posok && (sondeaprs_nofilter || (((((anonym2->lastsent!=systime && anonym2->tlon+8UL>systime) + && anonym2->tlat+8UL>systime) && anonym2->talt+20UL>systime) + && anonym2->tspeed+120UL>systime) + && anonym2->tdir+120UL>systime) + && anonym2->tgpstime+120UL>systime)) { +*/ + if (posok){ + if (anonym2->ttemp+30UL>systime) stemp = anonym2->temp; + else stemp = (double)X2C_max_real; + exlon = extrapolate(anonym2->lon1, anonym2->lon, anonym2->tlon1, + anonym2->tlon, systime, &lonok); + exlat = extrapolate(anonym2->lat1, anonym2->lat, anonym2->tlat1, + anonym2->tlat, systime, &latok); + /* + IF lonok THEN WrStrLn("--good ") ELSE WrStrLn("--bad ") END; + WrInt(systime-tlon1, 10); WrInt(systime-tlon, 10); + WrFixed(lon1/RAD, 5,0); WrStr(" ");WrFixed(lon/RAD, 5,0); + WrStr(" "); + WrFixed(exlon/RAD, 5,0); WrStrLn("t1 t x1 x xext"); + */ + if (lonok && latok) { + sondeaprs_senddata(exlat, exlon, anonym2->alt, anonym2->speed, + anonym2->dir, anonym2->clmb, 0.0, 0.0, stemp, 0.0, 0.0, 0.0, + 0.0, frq, 0.0, 0.0, + ((systime-anonym2->tgpstime)+anonym2->gpstime)%86400UL, 0UL, + anonym2->name, 9ul, 0UL, 0UL, usercall, 11ul, 0UL, 0UL, 0.0, + sondeaprs_nofilter,"C34",4,0); + anonym2->lastsent = systime; + //SKP + saveMysql(anonym2->name,0,exlat,exlon,anonym2->alt,anonym2->speed,anonym2->dir,anonym2->clmb,3,2,0,0.0,0,0,frq); + } + } + } + if (sondeaprs_verb) osi_WrStrLn("", 1ul); +} /* end decodec34() */ + +/*------------------------------ DFM06 */ + +static uint32_t bits2val(const char b[], uint32_t b_len, + uint32_t from, uint32_t len) +{ + uint32_t n; + n = 0UL; + while (len>0UL) { + n = n*2UL+(uint32_t)b[from]; + ++from; + --len; + } + return n; +} /* end bits2val() */ + +#define sondemod_DIST 10 +/*km*/ + + +static void jumpcheck(float p1, float p2, uint32_t * cnt) +{ + if (p2!=0.0f && (float)fabs(p1-p2)>1.5707963267949E-3f) *cnt = 30UL; + else if (*cnt>0UL) --*cnt; +} /* end jumpcheck() */ + + +static void checkdf69(float long0, char * df9) +{ + *df9 = long0<30.0f; /* if long<30 it is df6 lat else is df9 long */ +} /* end checkdf69() */ + +static uint32_t sondemod_MON[13] = {0UL,0UL,31UL,59UL,90UL,120UL,151UL, + 181UL,212UL,243UL,273UL,304UL,334UL}; + + +static void decodesub(const char b[], uint32_t b_len, + pCONTEXTDFM6 pc, uint32_t subnum) +{ + uint32_t u; + uint32_t v; + int32_t vi; + double vr; + switch (bits2val(b, b_len, 48UL, 4UL)) { + case 0UL: + if (X2C_CHKNIL(pCONTEXTDFM6,pc)->d9) { + /* dfm09 speed */ + u = bits2val(b, b_len, 32UL, 16UL); + vr = (double)u*0.01; + if (vr<999.0) { + pc->speed = vr; + pc->tspeed = systime; + } + if (sondeaprs_verb) { + osi_WrStr(" ", 2ul); + osic_WrFixed((float)u*0.036f, 1L, 0UL); + osi_WrStr("km/h", 5ul); + } + } + break; + case 1UL: + if (X2C_CHKNIL(pCONTEXTDFM6,pc)->d9) { + /* dfm09 lat, dir */ + vi = (int32_t)bits2val(b, b_len, 0UL, 32UL); + u = bits2val(b, b_len, 32UL, 16UL); + vr = (double)vi*1.E-7; + if (vr<89.9 && vr>(-89.9)) { + pc->lat1 = pc->lat; + pc->tlat1 = pc->tlat; + pc->lat = vr*1.7453292519943E-2; + pc->tlat = systime; + pc->posok = 1; + jumpcheck((float)pc->lat, (float)pc->lat1, &pc->poserr); + } + vr = (double)u*0.01; + if (vr<=360.0) { + pc->dir = vr; + pc->tdir = systime; + } + if (sondeaprs_verb) { + osi_WrStr(" Lat: ", 7ul); + osic_WrFixed((float)(X2C_DIVL(pc->lat,1.7453292519943E-2)), + 5L, 0UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)u*0.01f, 1L, 0UL); + osi_WrStr(" deg", 5ul); + } + } + break; + case 2UL: + vi = (int32_t)bits2val(b, b_len, 0UL, 32UL); + vr = (double)vi*1.E-7; + checkdf69((float)vr, &X2C_CHKNIL(pCONTEXTDFM6,pc)->d9); + /* test if dfm6 or dfm9 */ + if (pc->d9) { + /* dfm09 long clb */ + if (vr<180.0 && vr>(-180.0)) { + pc->lon1 = pc->lon; /* save 2 values for extrapolating */ + pc->tlon1 = pc->tlon; + pc->lon = vr*1.7453292519943E-2; + pc->tlon = systime; + pc->posok = 1; + jumpcheck((float)pc->lon, (float)pc->lon1, &pc->poserr); + } + vi = (int32_t)bits2val(b, b_len, 32UL, 16UL); + if (vi>=32768L) vi -= 65536L; + vr = (double)vi*0.01; + if (vr<50.0 && vr>(-500.0)) pc->clmb = vr; + if (sondeaprs_verb) { + osi_WrStr(" Long:", 7ul); + osic_WrFixed((float)(X2C_DIVL(pc->lon,1.7453292519943E-2)), + 5L, 0UL); + osic_WrFixed((float)pc->clmb, 1L, 0UL); + osi_WrStr(" m/s", 5ul); + } + } + else { + /* dfm06 lat speed */ + u = bits2val(b, b_len, 32UL, 16UL); + if (vr<89.9 && vr>(-89.9)) { + pc->lat1 = pc->lat; + pc->tlat1 = pc->tlat; + pc->lat = vr*1.7453292519943E-2; + pc->tlat = systime; + pc->posok = 1; + jumpcheck((float)pc->lat, (float)pc->lat1, &pc->poserr); + } + vr = (double)u*0.01; + if (vr<999.0) { + pc->speed = vr; + pc->tspeed = systime; + } + if (sondeaprs_verb) { + osi_WrStr(" Lat: ", 7ul); + osic_WrFixed((float)(X2C_DIVL(pc->lat,1.7453292519943E-2)), + 5L, 0UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)u*0.036f, 1L, 0UL); + osi_WrStr("km/h", 5ul); + } + } + break; + case 3UL: /* dfm09 alt */ + if (X2C_CHKNIL(pCONTEXTDFM6,pc)->d9) { + v = bits2val(b, b_len, 0UL, 32UL); + vr = (double)v*0.01; + if (vr<50000.0) { + pc->alt = vr; + pc->talt = systime; + } + if (sondeaprs_verb) { + osi_WrStr(" alti:", 7ul); + osic_WrFixed((float)pc->alt, 1L, 0UL); + osi_WrStr("m ", 3ul); + } + } + else { + /* dfm06 long, dir */ + vi = (int32_t)bits2val(b, b_len, 0UL, 32UL); + u = bits2val(b, b_len, 32UL, 16UL); + vr = (double)vi*1.E-7; + if (vr<180.0 && vr>(-180.0)) { + pc->lon1 = pc->lon; /* save 2 values for extrapolating */ + pc->tlon1 = pc->tlon; + pc->lon = vr*1.7453292519943E-2; + pc->tlon = systime; + pc->posok = 1; + jumpcheck((float)pc->lon, (float)pc->lon1, &pc->poserr); + } + vr = (double)u*0.01; + if (vr<=360.0) { + pc->dir = vr; + pc->tdir = systime; + } + if (sondeaprs_verb) { + osi_WrStr(" Long:", 7ul); + osic_WrFixed((float)(X2C_DIVL(pc->lon,1.7453292519943E-2)), + 5L, 0UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)u*0.01f, 1L, 0UL); + osi_WrStr(" deg", 5ul); + } + } + break; + case 4UL: + if (X2C_CHKNIL(pCONTEXTDFM6,pc)->d9) { + } + else { + /* dfm06 alt, speed */ + v = bits2val(b, b_len, 0UL, 32UL); + vi = (int32_t)bits2val(b, b_len, 32UL, 16UL); + vr = (double)v*0.01; + if (vr<50000.0) { + pc->alt = vr; + pc->talt = systime; + } + if (vi>=32768L) vi -= 65536L; + vr = (double)vi*0.01; + if (vr<50.0 && vr>(-500.0)) pc->clmb = vr; + if (sondeaprs_verb) { + osi_WrStr(" alti:", 7ul); + osic_WrFixed((float)pc->alt, 1L, 0UL); + osi_WrStr("m ", 3ul); + osic_WrFixed((float)pc->clmb, 1L, 0UL); + osi_WrStr(" m/s", 5ul); + } + } + break; + } /* end switch */ +} /* end decodesub() */ + + +static void decodedfm6(const char rxb[], uint32_t rxb_len, uint32_t ip, uint32_t fromport) +{ + uint32_t rt; + pCONTEXTDFM6 pc0; + pCONTEXTDFM6 pc1; + pCONTEXTDFM6 pc; + char cb[10]; + char s[1001]; + CALLSSID usercall; + double frq; + char tmp[20]; + uint32_t gpstime; + + double lat,lon,alt,vH,vV,Dir,T,T1,Vcc; + int yr,mon,day,hr,min,sec; + unsigned int frno,i,j,ok=0; + char id[20]; + char typ[10]; + int typm=6; + + if ((rxb[0UL]!='D')||((rxb[1UL]=='6') && rxb[1UL]!='9')) return; + + if(rxb[1UL]=='9') typm=7; + + sprintf(typ,"DFM0%c",rxb[1UL]); + tmp[0]=rxb[0]; tmp[1]=rxb[1]; tmp[2]=rxb[2]; tmp[3]=rxb[3]; tmp[4]=rxb[4]; tmp[5]=rxb[5]; tmp[6]=rxb[6]; + tmp[7]=rxb[7]; tmp[8]=rxb[8]; tmp[9]=rxb[9]; tmp[10]=0; + strcpy(id,tmp); + + tmp[0]=rxb[10]; tmp[1]=rxb[11]; tmp[2]=rxb[12]; tmp[3]=rxb[13]; tmp[4]=0; + frno=atoi(tmp); + + tmp[0]=rxb[14]; tmp[1]=rxb[15]; tmp[2]='.'; tmp[3]=rxb[16]; tmp[4]=rxb[17]; tmp[5]=rxb[18]; + tmp[6]=rxb[19]; tmp[7]=rxb[20]; tmp[8]=rxb[21]; tmp[9]=0; + lat=atof(tmp)*1.7453292519943E-2; + + tmp[0]=rxb[22]; tmp[1]=rxb[23]; tmp[2]=rxb[24]; tmp[3]='.'; tmp[4]=rxb[25]; tmp[5]=rxb[26]; + tmp[6]=rxb[27]; tmp[7]=rxb[28]; tmp[8]=rxb[29]; tmp[9]=rxb[30]; tmp[10]=0; + lon=atof(tmp)*1.7453292519943E-2; + + tmp[0]=rxb[31]; tmp[1]=rxb[32]; tmp[2]=rxb[33]; tmp[3]=rxb[34]; tmp[4]=rxb[35]; tmp[5]=0; + alt=atoi(tmp); + + tmp[0]=rxb[36]; tmp[1]=rxb[37]; tmp[2]=rxb[38]; tmp[3]='.'; tmp[4]=rxb[39]; tmp[5]=rxb[40]; tmp[6]=0; + vH=atof(tmp); + + tmp[0]=rxb[41]; tmp[1]=rxb[42]; tmp[2]=rxb[43]; tmp[3]='.'; tmp[4]=rxb[44]; tmp[5]=0; + Dir=atof(tmp); + + tmp[0]=rxb[45]; tmp[1]=rxb[46]; tmp[2]=rxb[47]; tmp[3]='.'; tmp[4]=rxb[48]; tmp[5]=rxb[49]; tmp[6]=0; + vV=atof(tmp); + + tmp[0]=rxb[50]; tmp[1]=rxb[51]; tmp[2]=rxb[52]; tmp[3]='.'; tmp[4]=rxb[53]; tmp[5]=rxb[54]; tmp[6]=rxb[55]; tmp[7]=0; + frq=(double)atof(tmp); + + tmp[0]=rxb[56]; tmp[1]=rxb[57]; tmp[2]=rxb[58]; tmp[3]=rxb[59]; tmp[4]=0; + T= atoi(tmp)/10.0-273.0; + + tmp[0]=rxb[60]; tmp[1]=rxb[61]; tmp[2]=rxb[62]; tmp[3]=rxb[63]; tmp[4]=0; + Vcc= atoi(tmp)/100.0; + + tmp[0]=rxb[64]; tmp[1]=rxb[65]; tmp[2]=rxb[66]; tmp[3]=rxb[67]; tmp[4]=rxb[68]; tmp[5]=0; + T1= atoi(tmp)/100.0-273.0; + + tmp[0]=rxb[74]; tmp[1]=rxb[75]; tmp[2]=rxb[76]; tmp[3]=rxb[77]; tmp[4]=0; + yr= atoi(tmp); + + tmp[0]=rxb[78]; tmp[1]=rxb[79]; tmp[2]=0; + mon= atoi(tmp); + + tmp[0]=rxb[80]; tmp[1]=rxb[81]; tmp[2]=0; + day= atoi(tmp); + + tmp[0]=rxb[82]; tmp[1]=rxb[83]; tmp[2]=0; + hr= atoi(tmp); + + tmp[0]=rxb[84]; tmp[1]=rxb[85]; tmp[2]=0; + min= atoi(tmp); + + tmp[0]=rxb[86]; tmp[1]=rxb[87]; tmp[2]=0; + sec= atoi(tmp); + + + printf("%s[%i][%04i-%02i-%02i %02i:%02i:%02i]: La:%f, Lo:%f, Alt:%5.0f vH:%5.2f vV:%5.2f D:%3.1f T:%4.2f T1:%4.2f Vcc:%4.2f %6.3fMHz\r\n",id,frno,yr,mon,day,hr,min,sec,lat,lon,alt,vH,vV,Dir,T,T1,Vcc,frq); + + + getcall(cb, 10ul, usercall, 11ul); + if (usercall[0U]==0) aprsstr_Assign(usercall, 11ul, mycall, 100ul); + rt = 0UL; + for (j = 0UL; j<=3UL; j++) { + rt = rt*256UL+(uint32_t)(uint8_t)rxb[i]; + ++i; + } + + pc = pcontextdfm6; + pc0 = 0; + for (;;) { + if (pc==0) break; + pc1 = X2C_CHKNIL(pCONTEXTDFM6,pc)->next; + if (pc->tused+3600ULnext = pc1; + osic_free((char * *) &pc, sizeof(struct CONTEXTDFM6)); + } + else { + if (aprsstr_StrCmp(id+2, 9ul, pc->name, 9ul)) break; + pc0 = pc; + } + pc = pc1; + } + if (pc==0) { + osic_alloc((char * *) &pc, sizeof(struct CONTEXTDFM6)); + if (pc==0) Error("allocate context out im memory", 31ul); + memset((char *)pc,(char)0,sizeof(struct CONTEXTDFM6)); + pc->next = pcontextdfm6; + pcontextdfm6 = pc; + aprsstr_Assign(pc->name, 9ul, id+2, 9ul); + if (sondeaprs_verb) osi_WrStrLn("is new ", 8ul); + } + gpstime=sec+min*60+hr*3600+86382UL; + if(gpstime>pc->gpstime){ + + pc->gpstime=gpstime; + ok=1; + } + pc->tused = systime; + pc->posok = 1; + +/* + sondeaprs_senddata(anonym1->lat, anonym1->long0, anonym1->heig, + anonym1->speed, anonym1->dir, anonym1->climb, anonym1->hp, + anonym1->hyg, anonym1->temp, anonym1->ozon, + anonym1->ozontemp, 0.0, 0.0, (double)mhz, + (double)anonym1->hrmsc, (double)anonym1->vrmsc, + (anonym1->timems/1000UL+86382UL)%86400UL, frameno, objname, + 9ul, almanachage, anonym1->goodsats, usercall, 11ul, + calperc(anonym1->calibok), 0UL,0.0, sondeaprs_nofilter); +*/ + + + { struct CONTEXTDFM6 * anonym = X2C_CHKNIL(pCONTEXTDFM6,pc); + + + + if(lat>0 && lon>0 && alt>=0 && ok>0){ + sondeaprs_senddata(lat, lon, alt, vH, Dir, + vV, 0.0, 0.0, T, 0.0, + 0.0, 0.0, 0,frq+0.001, 0.0, + 0.0, + gpstime, frno, + id+2, 9ul, + 0UL, 0, usercall, 11ul, 0UL, + 0UL, 0.0, sondeaprs_nofilter,typ,5,Vcc ); + + anonym->lastsent = osic_time(); + saveMysql(id+2,0,lat,lon,alt,vH,Dir,vV,typm,2,0,0.0,0,0.0,frq); + } + } + + +} /* end decodedfm6() */ + +/*------------------------------ RS41 */ + +static void WrChChk(char ch) +{ + if ((uint8_t)ch>=' ' && (uint8_t)ch<'\177') { + osi_WrStr((char *) &ch, 1u/1u); + } +} /* end WrChChk() */ + +#define sondemod_EARTHA 6.378137E+6 + +#define sondemod_EARTHB 6.3567523142452E+6 + +#define sondemod_E2 6.6943799901413E-3 + +#define sondemod_EARTHAB 4.2841311513312E+4 + + +static void wgs84r(double x, double y, double z, + double * lat, double * long0, + double * heig) +{ + double sl; + double ct; + double st; + double t; + double rh; + double xh; + double h; + h = x*x+y*y; + if (h>0.0) { + rh = (double)osic_sqrt((float)h); + xh = x+rh; + *long0 = atan20(xh, y)*2.0; + if (*long0>3.1415926535898) *long0 = *long0-6.2831853071796; + t = (double)osic_arctan((float)(X2C_DIVL(z*1.003364089821, + rh))); + st = (double)osic_sin((float)t); + ct = (double)osic_cos((float)t); + *lat = (double)osic_arctan((float) + (X2C_DIVL(z+4.2841311513312E+4*st*st*st, + rh-4.269767270718E+4*ct*ct*ct))); + sl = (double)osic_sin((float)*lat); + *heig = X2C_DIVL(rh,(double)osic_cos((float)*lat))-(double)(X2C_DIVR(6.378137E+6f, + osic_sqrt((float)(1.0-6.6943799901413E-3*sl*sl)))); + } + else { + *lat = 0.0; + *long0 = 0.0; + *heig = 0.0; + } +} /* end wgs84r() */ + + +static int32_t getint32(const char frame[], uint32_t frame_len, + uint32_t p) +{ + uint32_t n; + uint32_t i; + n = 0UL; + for (i = 3UL;; i--) { + n = n*256UL+(uint32_t)(uint8_t)frame[p+i]; + if (i==0UL) break; + } /* end for */ + return (int32_t)n; +} /* end getint32() */ + + +static uint32_t getcard16(const char frame[], uint32_t frame_len, + uint32_t p) +{ + return (uint32_t)(uint8_t)frame[p]+256UL*(uint32_t)(uint8_t) + frame[p+1UL]; +} /* end getcard16() */ + + +static int32_t getint16(const char frame[], uint32_t frame_len, + uint32_t p) +{ + uint32_t n; + n = (uint32_t)(uint8_t)frame[p]+256UL*(uint32_t)(uint8_t) + frame[p+1UL]; + if (n>=32768UL) return (int32_t)(n-65536UL); + return (int32_t)n; +} /* end getint16() */ + + +static uint32_t gethex(const char frame[], uint32_t frame_len, + uint32_t p, uint32_t nibb) +{ + uint32_t c; + uint32_t n; + n = 0UL; + while (nibb>0UL) { + n = n*16UL; + /*WrStr("<<"); WrStr(frame[p]); WrStr(">>"); */ + c = (uint32_t)(uint8_t)frame[p]; + if (c>=48UL && c<=57UL) n += c-48UL; + else if (c>=65UL && c<=70UL) n += c-55UL; + else return 0UL; + ++p; + --nibb; + } + /*WrInt(n,5); */ + return n; +} /* end gethex() */ + + +static void posrs41(const char b[], uint32_t b_len, uint32_t p, + double * lat, double * long0, + double * heig, double * speed, + double * dir, double * clmb) +{ + double vu; + double ve; + double vn; + double vz; + double vy; + double vx; + double z; + double y; + double x; + x = (double)getint32(b, b_len, p)*0.01; + y = (double)getint32(b, b_len, p+4UL)*0.01; + z = (double)getint32(b, b_len, p+8UL)*0.01; + wgs84r(x, y, z, lat, long0, heig); + if (sondeaprs_verb) { + osi_WrStr(" ", 2ul); + osic_WrFixed((float)(X2C_DIVL(*lat,1.7453292519943E-2)), 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)(X2C_DIVL(*long0,1.7453292519943E-2)), 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)*heig, 1L, 1UL); + osi_WrStr("m ", 3ul); + } + if (*heig<(-500.0) || *heig>50000.0) { + *lat = 0.0; + *long0 = 0.0; + *heig = 0.0; + } + /*speed */ + vx = (double)getint16(b, b_len, p+12UL)*0.01; + vy = (double)getint16(b, b_len, p+14UL)*0.01; + vz = (double)getint16(b, b_len, p+16UL)*0.01; + vn = (-(vx*(double)osic_sin((float)*lat)*(double) + osic_cos((float)*long0))-vy*(double) + osic_sin((float)*lat)*(double)osic_sin((float) + *long0))+vz*(double)osic_cos((float)*lat); + ve = -(vx*(double)osic_sin((float)*long0))+vy*(double) + osic_cos((float)*long0); + vu = vx*(double)osic_cos((float)*lat)*(double) + osic_cos((float)*long0)+vy*(double) + osic_cos((float)*lat)*(double)osic_sin((float) + *long0)+vz*(double)osic_sin((float)*lat); + *dir = X2C_DIVL(atan20(vn, ve),1.7453292519943E-2); + if (*dir<0.0) *dir = 360.0+*dir; + *speed = (double)osic_sqrt((float)(vn*vn+ve*ve)); + *clmb = vu; + if (sondeaprs_verb) { + osi_WrStr(" ", 2ul); + osic_WrFixed((float)( *speed*3.6), 2L, 1UL); + osi_WrStr("km/h ", 6ul); + osic_WrFixed((float)*dir, 1L, 1UL); + osi_WrStr("deg ", 5ul); + osic_WrFixed((float)vu, 1L, 1UL); + osi_WrStr("m/s", 4ul); + } +} /* end posrs41() */ + + +static double altToPres(double a) +/* meter to hPa */ +{ + if (a<=0.0) return 1010.0; + else if (a>40000.0) return 0.0; + else if (a>15000.0) { + return (double)(osic_exp((float)(a*(-1.5873015873016E-4) + +0.2629))*1000.0f); + } + else { + return (double)(1010.0f*osic_exp(osic_ln((float) + ((293.0-0.0065*a)*3.4129692832765E-3))*5.26f)); + } + return 0; +} /* end altToPres() */ + + +static double calcOzone(double uA, double temp, + double airpres) +{ + return 4.307E-4*uA*(temp+273.15)*28.57*getOzoneCorr(airpres); +/* + From Mast/Keystone ozonsensor 730-10 datasheet: + 1 uA per 50 umb Ozone (1 uA per 5 mPa) + Airflow 190-230 ml/min (avg. 210 ml/min => 3.5 ml/s => 100 ml in 28, + 57 s + + Default ozone formula from ftp://ftp.cpc.ncep.noaa.gov/ndacc/meta/sonde/cv_payerne_snd.txt + + POZ(nb) = 0.004307 * i * Tp * t * E(p) + => POZ(mPa) = 0.0004307 * i * Tp * t * E(p) + + where: i is the current from the sensor in uA + t is the time in seconds to pump 0.100 liters of air through the pump + E(p) is the pump efficiency correction + Tp is the pump temperature +*/ +} /* end calcOzone() */ + +static uint16_t sondemod_POLYNOM0 = 0x1021U; + +static uint16_t sondemod_burstIndicatorBytes[12] = {2U,262U,276U,391U,306U, + 0U,0U,0U,255U,255U,0U,0U}; + +static uint16_t _cnst1[12] = {2U,262U,276U,391U,306U,0U,0U,0U,255U,255U,0U, + 0U}; + +static void decoders41(const char rxb[], uint32_t rxb_len, + uint32_t ip, uint32_t fromport) +{ + OBJNAME nam; + int32_t res; + char s[1001]; + CALLSSID usercall; + uint32_t frameno; + uint32_t len; + uint32_t p; + uint32_t ic; + uint32_t j; + uint32_t i; + char nameok; + char calok; + uint16_t crc; + char typ; + pCONTEXTR4 pc0; + pCONTEXTR4 pc1; + pCONTEXTR4 pc; + double ozonval; + double climb; + double dir; + double speed; + double heig; + double long0; + double lat; + uint32_t tmp; + calok = 0; + nameok = 0; + nam[0U] = 0; + pc = 0; + lat = 0.0; + long0 = 0.0; + ozonval = 0.0; + + //SKP + char serialNumber[6]; + unsigned long firmwareVersion; + unsigned long version; + unsigned long subversionMajor; + unsigned long subversionMinor; + + + + getcall(rxb, rxb_len, usercall, 11ul); + if (usercall[0U]==0) aprsstr_Assign(usercall, 11ul, mycall, 100ul); + if (sondeaprs_verb && fromport>0UL) { + osi_WrStr("UDP:", 5ul); + aprsstr_ipv4tostr(ip, s, 1001ul); + osi_WrStr(s, 1001ul); + osi_WrStr(":", 2ul); + osic_WrINT32(fromport, 1UL); + if (usercall[0U]) { + osi_WrStr(" (", 3ul); + osi_WrStr(usercall, 11ul); + osi_WrStr(")", 2ul); + } + osi_WrStrLn("", 1ul); + } + p = 57UL; + if (sondeaprs_verb) osi_WrStr("R41 ", 5ul); + for (;;) { + if (p+4UL>=rxb_len-1) break; + typ = rxb[p]; + ++p; + len = (uint32_t)(uint8_t)rxb[p]+2UL; + ++p; + if (p+len>=rxb_len-1) break; + /* + WrStrLn(""); + FOR i:=0 TO len-1 DO WrHex(ORD(rxb[p+i]),3) ; + IF i MOD 16=15 THEN WrStrLn(""); END; END; + WrStrLn(""); + */ + j = 0UL; + crc = 0xFFFFU; + while (j'Z') nameok = 0; + } /* end for */ + nam[8U] = 0; + pc = pcontextr4; + pc0 = 0; + for (;;) { + if (pc==0) break; + pc1 = X2C_CHKNIL(pCONTEXTR4,pc)->next; + if (pc->tused+3600ULnext = pc1; + osic_free((char * *) &pc, sizeof(struct CONTEXTR4)); + } + else { + if (aprsstr_StrCmp(nam, 9ul, pc->name, 9ul)) break; + pc0 = pc; + } + pc = pc1; + } + if (pc==0) { + osic_alloc((char * *) &pc, sizeof(struct CONTEXTR4)); + if (pc==0) Error("allocate context out im memory", 31ul); + memset((char *)pc,(char)0,sizeof(struct CONTEXTR4)); + pc->next = pcontextr4; + pcontextr4 = pc; + aprsstr_Assign(pc->name, 9ul, nam, 9ul); + if (sondeaprs_verb) osi_WrStrLn("is new ", 8ul); + } + frameno = (uint32_t)getint16(rxb, rxb_len, p); + if (frameno>X2C_CHKNIL(pCONTEXTR4,pc)->framenum) { + /* new frame number */ + pc->framesent = 0; + calok = 1; + pc->framenum = frameno; + pc->tused = systime; + } + else if (pc->framenum==frameno && !pc->framesent) calok = 1; + else if (framenoframenum && sondeaprs_verb) { + osi_WrStrLn("", 1ul); + osi_WrStr("got out of order frame number ", 31ul); + osic_WrINT32(frameno, 1UL); + osi_WrStr(" expecting ", 12ul); + osic_WrINT32(pc->framenum, 1UL); + osi_WrStrLn(" ", 1ul); + } + if (rxb[p+23UL]==0) { + pc->mhz0 = (float)(getcard16(rxb, rxb_len, + p+26UL)/64UL+40000UL)*0.01f+0.0005f; + } + + if (rxb[p+23UL]==1UL) { + + for (i = 0UL; i<=4UL; i++) { + serialNumber[i] = rxb[p+24UL+i]; + if ((unsigned char)serialNumber[i]<=' ' || (unsigned char)serialNumber[i]>'Z') { + break; + //nameok = 0; + } + } /* end for */ + serialNumber[i] = 0; + if (nameok) { + aprsstr_Assign(pc->serialNumber, 6ul, serialNumber, 6ul); + } + //firmware wersion + pc->swVersion=(unsigned long)(getcard16(rxb, rxb_len,p+29UL)); + + if (sondeaprs_verb) { + osi_WrStr(", SerNum=", 10ul); + osic_WrStr(pc->serialNumber,6ul); + + version=pc->swVersion / 10000; + subversionMajor=(pc->swVersion-(version*10000)) / 100; + subversionMinor=pc->swVersion-(version*10000)-(subversionMajor*100); + + osi_WrStr(", SwVersion=", 13ul); + if (version<10){ + osi_WrStr("0", 2ul); + osic_WrUINT32(version,1ul); + } else + osic_WrUINT32(version,2ul); + osi_WrStr(".", 2ul); + + if (subversionMajor<10){ + osi_WrStr("0", 2ul); + osic_WrUINT32(subversionMajor,1ul); + } else + osic_WrUINT32(subversionMajor,2ul); + osi_WrStr(".", 2ul); + + if (subversionMinor<10){ + osi_WrStr("0", 2ul); + osic_WrUINT32(subversionMinor,1ul); + } else + osic_WrUINT32(subversionMinor,2ul); + } + } + + if (sondeaprs_verb) { + osi_WrStr(nam, 9ul); + osi_WrStr(" ", 2ul); + osic_WrINT32(pc->framenum, 0UL); + } + /*i:=0;WHILE (i<=11) DO WrHex(ORD(rxb[p+23+i]), 3); INC(i) END; */ + /* appended by SQ7BR BURST KILL CHECK */ + i = 0UL; + while (i<=11UL && (_cnst1[i]>=256U || rxb[p+23UL+i]==(char) + _cnst1[i])) ++i; + if (i>11UL) { + pc->burstKill = ((uint32_t)(uint8_t)rxb[p+35UL]&1UL)+1UL; + if (sondeaprs_verb) { + osi_WrStr(" BK=", 5ul); + osic_WrINT32(pc->burstKill-1UL, 1UL); + } + } + } + else if (typ=='z') { + } + else if (typ=='|') { + /* + // 02 06 14 87 32 00 00 00 FF FF 00 00 01 + int bkSign=0; + for (i = 0UL; i<=11UL; + i++) { // 8 znakow nazwy od pozycji 61(59+2) + do 68(59+2+7) + if ( rxb[p+23UL+i]== burstIndicatorBytes[i] ) bkSign++; + } //for + if (bkSign==12) { + pc->burstKill =(unsigned long) + (rxb[p+23UL+12UL] && 0x01UL)+1UL; + osi_WrStr(" BK=",5ul); + osic_WrINT32(pc->burstKill, 1UL); + osi_WrStrLn("",1ul); + } + */ + /* appended by SQ7BR */ + /* WrStrLn("7A frame"); */ + /* WrStrLn("7C frame"); */ + if (pc) { + X2C_CHKNIL(pCONTEXTR4, + pc)->gpssecond = (uint32_t)((getint32(rxb, rxb_len, + p+2UL)/1000L+86382L)%86400L); /* gps TOW */ + } + } + else if (typ=='}') { + } + else if (typ=='{') { + /* WrStrLn("7D frame"); */ + /* WrStrLn("7B frame"); */ + if (pc) { + posrs41(rxb, rxb_len, p, &lat, &long0, &heig, &speed, &dir, + &climb); + X2C_CHKNIL(pCONTEXTR4,pc)->hp = altToPres(heig); + /* make hPa out of gps alt for ozone */ + } + } + else if (typ=='~') { + /* external device */ + if (len==23UL) { + /* ozon values */ + if (pc) { + /* pc^.ozonInstType:=gethex(rxb, p+1, 2); */ + /* pc^.ozonInstNum:=gethex(rxb, p+3, 2); */ + res = (int32_t)gethex(rxb, rxb_len, p+5UL, 4UL); + if (res>=32768L) { + res = 32768L-res; + } + X2C_CHKNIL(pCONTEXTR4,pc)->ozonTemp = (double)res*0.01; + pc->ozonuA = (double)gethex(rxb, rxb_len, p+9UL, + 5UL)*0.0001; + pc->ozonBatVolt = (double)gethex(rxb, rxb_len, p+14UL, + 2UL)*0.1; + pc->ozonPumpMA = (double)gethex(rxb, rxb_len, p+16UL, + 3UL); + pc->ozonExtVolt = (double)gethex(rxb, rxb_len, p+19UL, + 2UL)*0.1; + ozonval = calcOzone(pc->ozonuA, pc->ozonTemp, pc->hp); + pc->ozonval=ozonval; //SKP + if (sondeaprs_verb) { + osi_WrStr(" OZON:(", 8ul); + osic_WrFixed((float)pc->ozonTemp, 2L, 1UL); + osi_WrStr("oC ", 4ul); + osic_WrFixed((float)pc->ozonuA, 4L, 1UL); + osi_WrStr("uA ", 4ul); + osic_WrFixed((float)ozonval, 3L, 1UL); + osi_WrStr("mPa ", 5ul); + osic_WrFixed((float)pc->ozonBatVolt, 1L, 1UL); + osi_WrStr("BatV ", 6ul); + osic_WrFixed((float)pc->ozonPumpMA, 0L, 1UL); + osi_WrStr("mA ", 4ul); + osic_WrFixed((float)pc->ozonExtVolt, 1L, 1UL); + osi_WrStr("ExtV", 5ul); + osi_WrStr(")", 2ul); + } + } + } + else if (len==24UL) { + /* Ozon id-data */ + if (sondeaprs_verb) { + osi_WrStr(" OZONID:(", 10ul); + tmp = p+12UL; + i = p+5UL; + if (i<=tmp) for (;; i++) { + WrChChk(rxb[i]); + if (i==tmp) break; + } /* end for */ + if (((uint32_t)(uint8_t)rxb[17UL]&1)) { + osi_WrStr(" NotCal", 8ul); + } + osi_WrStr(" V:", 4ul); + osic_WrFixed((float)gethex(rxb, rxb_len, p+18UL, 2UL)*0.1f, + 1L, 1UL); + osi_WrStr(")", 2ul); + } + } + } + else if (typ=='v') { + } + else { + /* WrStrLn("76 frame"); */ + break; + } + if (typ=='v') break; + p += len; + } + if (sondeaprs_verb) osi_WrStrLn("", 1ul); + if ((((pc && nameok) && calok) && lat!=0.0) && long0!=0.0) { + sondeaprs_senddata(lat, long0, heig, speed, dir, + climb, 0.0, 0.0, (double)X2C_max_real, ozonval, + X2C_CHKNIL(pCONTEXTR4,pc)->ozonTemp, X2C_CHKNIL(pCONTEXTR4,pc)->ozonPumpMA, X2C_CHKNIL(pCONTEXTR4,pc)->ozonBatVolt, + (double)X2C_CHKNIL(pCONTEXTR4,pc)->mhz0, 0.0, 0.0, + X2C_CHKNIL(pCONTEXTR4,pc)->gpssecond, frameno, + X2C_CHKNIL(pCONTEXTR4,pc)->name, 9ul, 0UL, 0UL, usercall, + 11ul, 0UL, X2C_CHKNIL(pCONTEXTR4,pc)->burstKill, pc->swVersion, + sondeaprs_nofilter,"RS41",5,0); + pc->framesent = 1; + //SKP + saveMysql( X2C_CHKNIL(pCONTEXTR4,pc)->name,frameno,lat,long0,heig,speed,dir,climb,4,X2C_CHKNIL(pCONTEXTR4,pc)->burstKill,pc->swVersion,pc->ozonval,pc->aux,0.0,(double)X2C_CHKNIL(pCONTEXTR4,pc)->mhz0); + + } +/* IF verb THEN WrStrLn("") END; */ +} /* end decoders41() */ + +/*------------------------------ M10 */ + +static uint16_t crcm10(int32_t from, int32_t len, const char buf[], + uint32_t buf_len) +{ + int32_t i; + uint16_t s; + uint16_t t; + uint16_t b; + uint16_t cs; + int32_t tmp; + cs = 0U; + tmp = (from+len)-1L; + i = from; + if (i<=tmp) for (;; i++) { + /*WrHex(ORD(buf[i]), 3); */ + b = (uint16_t)(uint32_t)(uint8_t)buf[i]; + b = X2C_LSH(b,16,-1)|X2C_LSH(b&0x1U,16,7); + b = b^X2C_LSH(b,16,-2)&0xFFU; + t = cs&0x3FU|X2C_LSH((cs^X2C_LSH(cs,16,-2)^X2C_LSH(cs,16,-4))&0x1U,16, + 6)|X2C_LSH((X2C_LSH(cs,16,-1)^X2C_LSH(cs,16,-3)^X2C_LSH(cs, + 16,-5))&0x1U,16,7); + s = X2C_LSH(cs,16,-7)&0xFFU; + s = (s^X2C_LSH(s,16,-2))&0xFFU; + cs = X2C_LSH(cs&0xFFU,16,8)|b^t^s; + if (i==tmp) break; + } /* end for */ + return (uint16_t)cs; +} /* end crcm10() */ + + +static uint32_t m10card(const char b[], uint32_t b_len, + int32_t pos, int32_t len) +{ + int32_t i; + uint32_t n; + int32_t tmp; + n = 0UL; + tmp = len-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + n = n*256UL+(uint32_t)(uint8_t)b[pos+i]; + if (i==tmp) break; + } /* end for */ + return n; +} /* end m10card() */ + +#define sondemod_FH 16 +/* size of header before payload */ + +static float sondemod_DEGMUL = 8.3819036711397E-8f; + +#define sondemod_VMUL 0.005 + +static void decodem10(const char rxb[], uint32_t rxb_len, uint32_t ip, uint32_t fromport) +{ + uint32_t week; + uint32_t tow; + uint32_t cs; + uint32_t i; + int32_t ci; + double dir; + double v; + double vv; + double vn; + double ve; + double alt; + double lon; + double lat; + uint32_t time0; + char nam[15]; + char s[1001]; + CALLSSID usercall; + uint32_t frameno; + char nameok; + char calok; + pCONTEXTM10 pc0; + pCONTEXTM10 pc1; + pCONTEXTM10 pc; + calok = 0; + nameok = 0; + pc = 0; + lat = 0.0; + lon = 0.0; + double frq; + char tmps[15]; + +// for(i=0;i<123;i++) +// printf("%c",rxb[i]); +// printf("\r\n"); + tmps[0]=rxb[118]; + tmps[1]=rxb[119]; + tmps[2]=rxb[120]; + tmps[3]='.'; + tmps[4]=rxb[121]; + tmps[5]=rxb[122]; + tmps[6]=rxb[123]; + tmps[7]=0; + frq=atof(tmps); + + getcall(rxb, rxb_len, usercall, 11ul); + if (usercall[0U]==0) aprsstr_Assign(usercall, 11ul, mycall, 100ul); + + if (sondeaprs_verb && fromport>0UL) { + osi_WrStr("UDP:", 5ul); + aprsstr_ipv4tostr(ip, s, 1001ul); + osi_WrStr(s, 1001ul); + osi_WrStr(":", 2ul); + osic_WrINT32(fromport, 1UL); + if (usercall[0U]) { + osi_WrStr(" (", 3ul); + osi_WrStr(usercall, 11ul); + osi_WrStr(")", 2ul); + } + osi_WrStrLn("", 1ul); + } + if (sondeaprs_verb) osi_WrStr("M10 ", 5ul); + cs = (uint32_t)crcm10(16L, 100L, rxb, rxb_len); + if (cs==m10card(rxb, rxb_len, 116L, 2L)) { + + /* crc ok */ + nameok = 1; + for (i = 0UL; i<=8UL; i++) { + nam[i] = rxb[7UL+i]; + if ((uint8_t)nam[i]<=' ' || (uint8_t)nam[i]>'Z') nameok = 0; + } /* end for */ + nam[9U] = 0; + pc = pcontextm10; + pc0 = 0; + for (;;) { + if (pc==0) break; + pc1 = X2C_CHKNIL(pCONTEXTM10,pc)->next; + if (pc->tused+3600ULnext = pc1; + osic_free((char * *) &pc, sizeof(struct CONTEXTM10)); + } + else { + if (aprsstr_StrCmp(nam, 10ul, pc->name, 10ul)) break; + pc0 = pc; + } + pc = pc1; + } + if (pc==0) { + osic_alloc((char * *) &pc, sizeof(struct CONTEXTM10)); + if (pc==0) Error("allocate context out im memory", 31ul); + memset((char *)pc,(char)0,sizeof(struct CONTEXTM10)); + pc->next = pcontextm10; + pcontextm10 = pc; + aprsstr_Assign(pc->name, 10ul, nam, 10ul); + if (sondeaprs_verb) osi_WrStrLn("is new ", 8ul); + } + tow = m10card(rxb, rxb_len, 27L, 4L); + week = m10card(rxb, rxb_len, 49L, 2L); + time0 = tow/1000UL+week*604800UL+315964800UL; + frameno = time0; + X2C_CHKNIL(pCONTEXTM10,pc)->gpssecond = time0+86382UL; + if (frameno>pc->framenum) { + /* new frame number */ + pc->framesent = 0; + calok = 1; + pc->framenum = frameno; + pc->tused = systime; + } + else if (pc->framenum==frameno) { + if (!pc->framesent) calok = 1; + } + else if (sondeaprs_verb) { + osi_WrStr(" got old frame ", 16ul); + osic_WrINT32(frameno, 1UL); + osi_WrStr(" expected> ", 12ul); + osic_WrINT32(pc->framenum, 1UL); + osi_WrStr(" ", 2ul); + } + lat = (double)m10card(rxb, rxb_len, 31L, 4L)*8.3819036711397E-8; + lon = (double)m10card(rxb, rxb_len, 35L, 4L)*8.3819036711397E-8; + alt = (double)m10card(rxb, rxb_len, 39L, 4L)*0.001; + ci = (int32_t)m10card(rxb, rxb_len, 21L, 2L); + if (ci>32767L) ci -= 65536L; + ve = (double)ci*0.005; + ci = (int32_t)m10card(rxb, rxb_len, 23L, 2L); + if (ci>32767L) ci -= 65536L; + vn = (double)ci*0.005; + ci = (int32_t)m10card(rxb, rxb_len, 25L, 2L); + if (ci>32767L) ci -= 65536L; + vv = (double)ci*0.005; + v = (double)osic_sqrt((float)(ve*ve+vn*vn)); /* hor speed */ + dir = atan20(vn, ve)*5.7295779513082E+1; + if (dir<0.0) dir = 360.0+dir; + if (sondeaprs_verb) { + osi_WrStr(nam, 10ul); + osi_WrStr(" ", 2ul); + osic_WrINT32(frameno, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)lat, 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)lon, 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)alt, 1L, 1UL); + osi_WrStr("m ", 3ul); + osic_WrFixed((float)(v*3.6), 1L, 1UL); + osi_WrStr("km/h ", 6ul); + osic_WrFixed((float)dir, 0L, 1UL); + osi_WrStr("deg ", 5ul); + osic_WrFixed((float)vv, 1L, 1UL); + osi_WrStr("m/s ", 5ul); + } + } + else if (sondeaprs_verb) osi_WrStr("crc error", 10ul); + if (sondeaprs_verb) osi_WrStrLn("", 1ul); + if ((((pc && nameok) && calok) && lat!=0.0) && lon!=0.0) { + sondeaprs_senddata(lat*1.7453292519943E-2, lon*1.7453292519943E-2, alt, v, dir, vv, 0.0, 0.0, + (double)X2C_max_real, 0.0, 0.0, 0.0, 0.0, frq, 0.0, 0.0, + X2C_CHKNIL(pCONTEXTM10,pc)->gpssecond, pc->framenum, X2C_CHKNIL(pCONTEXTM10,pc)->name, 9ul, 0UL, 0, usercall, + 11ul, 0UL, 0UL,0, sondeaprs_nofilter,"M10",4,0); + + saveMysql( X2C_CHKNIL(pCONTEXTM10,pc)->name,pc->framenum,lat*1.7453292519943E-2,lon*1.7453292519943E-2,alt,v,dir,vv,1,0,0,0,0,0.0,frq); + + + pc->framesent = 1; + } +} /* end decodem10() */ + + + +//----------------------------------------------------------------------------------------------------- +//----------------------------------------------------------------------------------------------------- +//PILOTSONDE +// +//----------------------------------------------------------------------------------------------------- +//----------------------------------------------------------------------------------------------------- + + +static int32_t getint32r(const char frame[], uint32_t frame_len, + uint32_t p) +{ + uint32_t n; + uint32_t i; + n = 0UL; + for (i = 0UL;; i++) { + n = n*256UL+(uint32_t)(uint8_t)frame[p+i]; + if (i==3UL) break; + } /* end for */ + return (int32_t)n; +} /* end getint32r() */ + + +static int32_t getint16r(const char frame[], uint32_t frame_len, + uint32_t p) +{ + uint32_t n; + n = (uint32_t)(uint8_t)frame[p+1UL]+256UL*(uint32_t)(uint8_t) + frame[p]; + if (n>=32768UL) return (int32_t)(n-65536UL); + return (int32_t)n; +} +/* end getint16r() */ + + + + +int dzienRoku(int year, int month, int dayOfMonth) { + int wynik= dayOfMonth + ((month < 3) ? (int)((306 * month - 301) / 10) :(int)((306 * month - 913) / 10) + ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 60 : 59)); +return wynik; +} + +static void decodepils(const char rxb[], uint32_t rxb_len, uint32_t ip, uint32_t fromport) +{ + OBJNAME nam; + int32_t res; + char s[1001]; + //char tmp_name[9]; + CALLSSID usercall; + uint32_t frameno; + uint32_t len; + uint32_t ic; + uint32_t j; + uint32_t i; + uint16_t crc; + char typ; + pCONTEXTPS pc0; + pCONTEXTPS pc1; + pCONTEXTPS pc; + double climb; + double dir; + double speed; + double heig; + double long0; + double lat; + uint32_t tmp; + uint32_t offs; + double phrms; + double pvrms; + uint32_t pgoodsat; + double ve; + double vn; + double vz; + double vy; + double vx; + double vu; + char tmps[10]; + double frq; + int32_t timegp; + int32_t dategp,gpstime; + +// nam[0U] = 0; + pc = 0; + lat = 0.0; + long0 = 0.0; + unsigned char bytes[4]; +// int val; + + getcall(rxb, rxb_len, usercall, 11ul); //decode callsign from table + +/* if (pilname[0UL]!=0UL){ + for (i=0UL; i<8UL; i++){ + tmp_name[i]=(uint8_t)pilname[i]; + } + } +*/ +// if (pilname[0UL]=0UL){ + //assign name to object (no number coded in sonde) - pilotson + + +// if(gpstime-pc->lastframe>300 || pc->name[0]==0){ +// czas=dzienRoku((1900+tm.tm_year),tm.tm_mon+1,tm.tm_mday); + + +// } +// else strcpy(nam,pc-> + + tmps[0]=rxb[55]; + tmps[1]=rxb[56]; + tmps[2]=rxb[57]; + tmps[3]='.'; + tmps[4]=rxb[58]; + tmps[5]=rxb[59]; + tmps[6]=rxb[60]; + tmps[7]=0; + frq=atof(tmps); + +// printf("\n%f\n",frq); + + time_t t = time(NULL); + struct tm tm = *localtime(&t); + int czas=tm.tm_mon + 1 + tm.tm_mday; + + nam[0]='P'; + nam[1]=65+tm.tm_hour; + nam[2]=65+(int)(czas/25); + nam[3]=65+czas%25; + nam[4]=rxb[57]; + nam[5]='4';//rxb[58]; + nam[6]='7';//rxb[59]; + nam[7]='0';//rxb[60]; + nam[8]=0; + + + + gpstime=(int32_t)(86382UL+tm.tm_sec+tm.tm_min*60+tm.tm_hour*3600); + + char str[15]; + + +/* for (i=0UL; i<8UL; i++){ + nam[i]=tmp_name[i]; + } + nam[8U] = 0UL; +*/ + + if (sondeaprs_verb && fromport>0UL) { + osi_WrStr("UDP:", 5ul); + aprsstr_ipv4tostr(ip, s, 1001ul); + osi_WrStr(s, 1001ul); + osi_WrStr(":", 2ul); + osic_WrINT32(fromport, 1UL); + if (usercall[0U]) { + osi_WrStr(" (", 3ul); + osi_WrStr(usercall, 11ul); + osi_WrStr(")", 2ul); + } + osi_WrStr(" ", 2ul); + osi_WrStr(" name=",7UL); + osi_WrStr(pc->name,8UL); + + } + + pc = pcontextps; + pc0 = 0; + + for (;;) { //inicjacja polaczenia chyba + if (pc==0) break; + pc1 = X2C_CHKNIL(pCONTEXTPS,pc)->next; + if (pc->tused+3600ULnext = pc1; + osic_free((char * *) &pc, sizeof(struct CONTEXTPS)); + } + else { + if (aprsstr_StrCmp(nam, 9ul, pc->name, 9ul)) break; + pc0 = pc; + } + pc = pc1; + } + if (pc==0) { + osic_alloc((char * *) &pc, sizeof(struct CONTEXTPS)); + if (pc==0) Error(" allocate context out im memory", 32ul); + memset((char *)pc,(char)0,sizeof(struct CONTEXTPS)); + pc->next = pcontextps; + pcontextps = pc; + aprsstr_Assign(pc->name, 9ul, nam, 9ul); + if (sondeaprs_verb) osi_WrStrLn(" is new ", 9ul); + } + + //now extract data from table + + offs=8UL; //offset - 5 added and 3 preamble bytes - now taken for callsign + lat=(double)getint32r(rxb,rxb_len,offs+3UL)*0.000001; //calculate lat in DD.DDDDDD + long0=(double)getint32r(rxb,rxb_len,offs+7UL)*0.000001; //claculate long in DDD.DDDDDD + heig=(double)getint32r(rxb,rxb_len,offs+11UL)*.01; //height in m + +/* + for (i = 0; i < 4; i++) bytes[i] = rxb[offs+15UL+ i]; + timegp = 0; + for (i = 0; i < 4; i++) timegp |= bytes[i] << (8*(3-i)); + + for (i = 0; i < 4; i++) bytes[i] = rxb[offs+19UL + i]; + dategp = 0; + for (i = 0; i < 4; i++) dategp |= bytes[i] << (8*(3-i)); +*/ +// gpstime=(int32_t)(((timegp%100000)/1000.0)+(timegp%10000000)/100000*60+3600*timegp/10000000)+86382UL; + + +/* + fprintf(stdout, " %02d-%02d-%02d", datum.date/10000, (datum.date%10000)/100, datum.date%100); + //fprintf(stdout, " (%09d)", datum.time); + fprintf(stdout, " %02d:%02d:%06.3f ", datum.time/10000000, (datum.time%10000000)/100000, (datum.time%100000)/1000.0); + + time0 = tow/1000UL+week*604800UL+315964800UL; + frameno = time0; + X2C_CHKNIL(pCONTEXTM10,pc)->gpssecond = time0+86382UL; + + + time=getint32r(rxb,rxb_len,offs+15UL) + date=getint32r(rxb,rxb_len,offs+15UL) +*/ + + if (lat>89.9) {lat=0.0;} //in case lat/lon invalid + if (long0>179.0) {long0=0.0;} + + if (heig<(-500.0) || heig>50000.0) { //make sure that wrong altitude eliminates all + lat = 0.0; + long0 = 0.0; + heig = 0.0; } + + lat=lat*1.7453292519943E-2; + long0=long0*1.7453292519943E-2; + + pgoodsat=(uint32_t)rxb[offs+1UL]; //sats used +// phrms=(double)getint16r(rxb,rxb_len,offs+30UL)*0.01; //hrms/vrms - quality bytes +// pvrms=(double)getint16r(rxb,rxb_len,offs+32UL)*0.01; + phrms=0.0; //ignore previous + pvrms=0.0; + + + /*speed */ + vx = (double)getint16r(rxb, rxb_len, offs+15UL)*(0.01); //get N/S, E/W, and climb speed data + vy = (double)getint16r(rxb, rxb_len, offs+17UL)*(0.01); //somehow it rather should be + + vz = (double)getint16r(rxb, rxb_len, offs+19UL)*(0.01); //but it makes more sense with - + + //somple procedure for speed and dir: + + speed = (double)osic_sqrt((float)(vx*vx+vy*vy)); // m/s? + dir = atan2(vx, vy) * X2C_DIVL(180.0, 3.141592654); + if (dir<0.0) dir = 360.0+dir; + + climb = vz; //climb speed + if (sondeaprs_verb) { + osi_WrStr("lat=", 5ul); + osic_WrFixed((float)(lat/1.7453292519943E-2), 4UL, 6UL); + osi_WrStr(" long=", 6ul); + osic_WrFixed((float)long0/1.7453292519943E-2, 4UL, 7UL); + osi_WrStr(" alt=", 6ul); + osic_WrFixed((float)heig, 2UL, 7UL); + osi_WrStr("m speed=", 9ul); + osic_WrFixed((float)speed, 2UL, 4UL); + osi_WrStr(" dir=", 6ul); + osic_WrFixed((float)dir, 2UL, 4UL); + osi_WrStr(" climb=", 8ul); + osic_WrFixed((float)climb, 2UL, 4UL); + osi_WrStrLn("", 1ul); + } + if ((pc && lat!=0.0) && long0!=0.0) { //if connected and valid lat/long + + sondeaprs_senddata(lat, long0, heig, speed, dir, climb, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, frq, phrms, pvrms, + gpstime, 0.0, pc->name, 9ul, 0UL, pgoodsat, usercall, + 11ul, 0UL, 0UL,0, sondeaprs_nofilter,"PilS",5,0); + + saveMysql( pc->name,0,lat,long0,heig,speed,dir,climb,8,0,0,0,0,0.0,frq); + + pc->framesent = 1; + } +} /* end decodepils() */ + + + +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +//----------------------------------------------------------------------------------------------------- +//PILOTSONDE +// +//----------------------------------------------------------------------------------------------------- +//----------------------------------------------------------------------------------------------------- + + + +static void udprx(void) +{ + uint32_t fromport; + uint32_t ip; + int32_t len; + len = udpreceive(rxsock, chan[sondemod_LEFT].rxbuf, 520L, &fromport, &ip); + systime = osic_time(); + if (len==240L) { + /* + IF verb & ((ip<>lastip) OR (fromport<>lastport)) THEN + ipv4tostr(ip, s); + WrStr(s); WrStr(":"); WrInt(fromport, 1); WrStrLn(""); + lastip:=ip; + lastport:=fromport; + END; + */ + decodeframe(sondemod_LEFT, ip, fromport); + } + else if (len==22L+6L) { + decodec34(chan[sondemod_LEFT].rxbuf, 520ul, ip, fromport); + } + else if (len==88L) { + decodedfm6(chan[sondemod_LEFT].rxbuf, 520ul, ip, fromport); + } + else if (len==520L) { + decoders41(chan[sondemod_LEFT].rxbuf, 520ul, ip, fromport); + } + else if (len==117L+7L) { + decodem10(chan[sondemod_LEFT].rxbuf, 520ul, ip, fromport); + } + else if (len==55L+6L) { + decodepils(chan[sondemod_LEFT].rxbuf, 520ul, ip, fromport); // <-ADDED FOR PilotSonde + } + + else usleep(10000UL); +} /* end udprx() */ + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + char ip[50]; + + if(h2ip("skp.wodzislaw.pl",ip)){ + printf("\r\nCan't resolve DNS address\r\n"); + return 0; + } + sprintf(dbAddr,"http://%s:81/sondy.php",ip); + + + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + if (sizeof(FILENAME)!=1024) X2C_ASSERT(0); + if (sizeof(OBJNAME)!=9) X2C_ASSERT(0); + if (sizeof(CALLSSID)!=11) X2C_ASSERT(0); + sondeaprs_BEGIN(); + gpspos_BEGIN(); + aprsstr_BEGIN(); + osi_BEGIN(); + Parms(); + /* initrsc; */ + initcontext(&contextr9); + pcontextc = 0; + pcontextdfm6 = 0; + pcontextr4 = 0; + pcontextm10 = 0; + pcontextps = 0; + objname[0] = 0; + almread = 0UL; + almage = 0UL; + lastip = 0UL; + lastport = 0UL; + systime = osic_time(); + + /*testalm; */ + for (;;) udprx(); + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/sondeudp.c b/src/sondeudp.c new file mode 100644 index 0000000..122a602 --- /dev/null +++ b/src/sondeudp.c @@ -0,0 +1,4156 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * Modified by SP9SKP, SQ2DK + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define sondeudp_C_ +#ifndef soundctl_H_ +#include "soundctl.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef rsc_H_ +#include "rsc.h" +#endif +#include + +/* demodulate RS92 sonde (2400bit/s manchester) + and SRS-C34 (2400Bd AFSK 2000/3800Hz + and DFM06 (2500bit/s manchester) + and RS41 (4800Bd GFSK) and send as AXUDP by OE5DXL */ +/*FROM fcntl IMPORT creat, open; */ +/*IMPORT reedsolomon; */ +/* link init_rs_char.o decode_rs_char.o */ +/* gcc -o sondeudp Lib.o aprsstr.o filesize.o flush.o osi.o ptty.o rsc.o sondeudp.o soundctl.o symlink.o tcp.o timec.o udp.o init_rs_char.o decode_rs_char.o /usr/local/xds/lib/x86/libts.a /usr/local/xds/lib/x86/libxds.a -lm */ +#define sondeudp_MAXCHAN 64 + +#define sondeudp_CONTEXTLIFE 3600 +/* seconds till forget context after last heared */ + +#define sondeudp_ADCBYTES 2 + +#define sondeudp_MAXLEN 9 +/* data frame size c34 */ + +#define sondeudp_ADCBUFLEN 4096 + +#define sondeudp_BAUDSAMP 65536 + +#define sondeudp_PLLSHIFT 1024 + +#define sondeudp_RAD 1.7453292519943E-2 + +#define sondeudp_DFIRLEN 64 + +#define sondeudp_AFIRLEN 32 + +#define sondeudp_AOVERSAMP 16 +/*16*/ + +#define sondeudp_ASYNBITS 10 + +static char sondeudp_CALIBFRAME = 'e'; + +static char sondeudp_GPSFRAME = 'g'; + +static char sondeudp_UNKNOWN = 'h'; + +static char sondeudp_DATAFRAME = 'i'; + +#define sondeudp_DOVERSAMP 16 + +#define sondeudp_CIDTIMEOUT 3600 +/* s to delete c34 sonde id */ + +#define sondeudp_DFIDTIMEOUT 900 +/* s to delete dfm sonde id */ + +#define sondeudp_FLEN6 264 +/* dfm06 frame len */ + +#define sondeudp_DFMSYN 0x45CF +/* frame sync sequence */ + +#define sondeudp_FLENRS41 520 +/* rs41 frame len */ + +#define sondeudp_FLEN10 101 +/* M10 framelen */ +#define sondeudp_M10SYN 0x649F20. +/* M10 sync */ + + +/* + rs41x 0x86, 0x35, 0xf4, 0x40, 0x93, 0xdf, 0x1a, 0x60 + rs41 0x10, 0xB6, 0xCA, 0x11, 0x22, 0x96, 0x12, 0xF8 +*/ +#define sondeudp_RHEAD41 "000010000110110101010011100010000100010001101001010\ +0100000011111" + +static uint8_t sondeudp_EXOR41[64] = {150U,131U,62U,81U,177U,73U,8U,152U, + 50U,5U,89U,14U,249U,68U,198U,38U,33U,96U,194U,234U,121U,93U, + 109U,161U,84U,105U,71U,12U,220U,232U,92U,241U,247U,118U,130U, + 127U,7U,153U,162U,44U,147U,124U,48U,99U,245U,16U,46U,97U, + 208U,188U,180U,182U,6U,170U,244U,35U,120U,110U,59U,174U,191U, + 123U,76U,193U}; + +typedef char FILENAME[1024]; + +typedef char CNAMESTR[9]; + +typedef float AFIRTAB[512]; + +typedef float DFIRTAB[1024]; + +typedef float DFIR[64]; + +struct UDPTX; + +typedef struct UDPTX * pUDPTX; + +struct UDPTX { + pUDPTX next; + uint32_t ip; + uint32_t destport; + int32_t udpfd; +}; + + +struct R92; + + +struct R92 { + char enabled; + int32_t pllshift; + int32_t baudfine; + int32_t manchestd; + float noise; + float bitlev; + float lastu; + char cbit; + char oldd; + char plld; + char lastmanch; + uint32_t rxbyte; + uint32_t rxbitc; + uint32_t rxp; + uint32_t headerrs; + char rxbuf[256]; + AFIRTAB afirtab; + int32_t asynst[10]; + uint32_t demodbaud; + uint32_t configbaud; +}; + +struct R41; + + +struct R41 { + char enabled; + int32_t pllshift; + int32_t baudfine; + float noise0; + float bitlev0; + float noise; + float bitlev; + char cbit; + char oldd; + char plld; + char rev; + char headok; + float lastu; + uint32_t rxbyte; + uint32_t rxbitc; + uint32_t rxp; + char rxbuf[520]; + AFIRTAB afirtab; + uint32_t demodbaud; + uint32_t configbaud; + uint32_t synp; + char synbuf[64]; + char fixbytes[520]; + uint8_t fixcnt[520]; +}; + +//Added ------------------------------ by SQ2DK +struct PILS; + +struct PILS { + char enabled; + int32_t pllshift; + int32_t baudfine; + float noise0; + float bitlev0; + float noise; + float bitlev; + char cbit; + char oldd; + char plld; + char rev; + char headok; + uint32_t rxbyte; + uint32_t rxbitc; + uint32_t rxp; + float lastu; + char rxbuf[56+6]; //only 55 required + AFIRTAB afirtab; + uint32_t demodbaud; + uint32_t configbaud; + uint32_t synp; + char synbuf[64]; + char fixbytes[56]; //not sure what for + uint8_t fixcnt[56]; +// int16_t configequalizer; +}; +//------------------------------------------------------- + + +struct DFM6; + + +struct DFM6 { + char enabled; + uint32_t lastsent; + uint32_t numcnt; + uint32_t idcnt0; + uint32_t idcnt1; + int32_t pllshift; + int32_t baudfine; + int32_t manchestd; + float noise; + float bitlev; + float lastu; + char polarity; + char cbit; + char oldd; + char plld; + char lastmanch; + char txok; + uint32_t rxp; + char rxbuf[264+6]; + AFIRTAB afirtab; + uint32_t synword; + char cb[56]; + char ch[56]; + char db1[104]; + char db2[104]; + char dh1[104]; + char dh2[104]; + uint32_t demodbaud; + uint32_t configbaud; + char id[12]; + int frnr; + int sonde_typ; + uint32_t SN6; + uint32_t SN9; + int yr; int mon; int day; + int hr; int min; float sek; + double lat; double lon; double alt; + double newlat; double newlon; double newalt; + double prevlat; double prevlon; double prevalt; + double dir; double horiV; double vertV; + float meas24[5]; + float status[2]; + char newsonde; + +}; + +struct M10; + + +struct M10 { + char enabled; + int32_t pllshift; + int32_t baudfine; + int32_t manchestd; + float bitlev; + float noise; + float lastu; + char cbit; + char oldd; + char plld; + char lastmanch; + char txok; + uint32_t rxb; + uint32_t rxp; + char rxbuf[101]; + AFIRTAB afirtab; + uint32_t synword; + uint32_t demodbaud; + uint32_t configbaud; +}; + + +struct SCID; + + +struct SCID { + CNAMESTR id; + CNAMESTR idcheck; + uint32_t idtime; + uint32_t idcnt; +}; + +struct C34; + + +struct C34 { + char enabled; + struct SCID id34; + struct SCID id50; + uint32_t idtime; + uint32_t idcnt; + int32_t pllshift; + int32_t baudfine; + int32_t leveldcd; + float sqmed[2]; + float afskhighpass; + float freq; + float left; + float tcnt; + float afskmidfreq; + float afmid; + float noise; + float bitlev; + char cbit; + char oldd; + char plld; + char c50; + uint32_t rxbyte; + uint32_t rxbytec; + uint32_t rxbitc; + uint32_t rxp; + char rxbuf[9+6]; + AFIRTAB afirtab; + int32_t asynst[10]; + DFIRTAB dfirtab; + DFIR dfir; + uint32_t dfin; + uint32_t confignyquist; + uint32_t configafskshift; + uint32_t configafskmid; + uint32_t demodbaud; + uint32_t configbaud; + uint32_t txbaud; + uint32_t dcdclock; + float hipasscap; + uint32_t tused; +}; + +struct CHAN; + + +struct CHAN { + int32_t adcmax; + int32_t adcmin; + int32_t adcdc; + float afir[32]; + int32_t configequalizer; + pUDPTX udptx; + uint32_t squelch; + uint32_t mycallc; + char myssid; + struct R92 r92; + struct R41 r41; + struct DFM6 dfm6; + struct C34 c34; + struct PILS pils; //added for pilot sonde SQ2DK + struct M10 m10; + + char nr; + char freq[10]; + +}; + +static int32_t soundfd; + +static int32_t debfd; + +static char abortonsounderr; + +static char verb; + +static char verb2; + +static uint32_t dfmidchg; + +static uint32_t getst; + +static uint32_t afin; +static uint32_t afinR41; +static uint32_t afinPS; + +static uint32_t soundbufs; + +static uint32_t adcrate; + +static uint32_t adcbuflen; + +static uint32_t adcbufrd; + +static uint32_t adcbufsamps; + +static uint32_t fragmentsize; + +static FILENAME soundfn; + +static struct CHAN chan[64]; + +static uint32_t adcbufsampx; + +static uint32_t maxchannels; + +static uint32_t cfgchannels; + +static short adcbuf[4096]; + +static uint32_t dfmnametyp; + +static uint16_t CRCTAB[256]; + +static double pils_poklat; + +static double pils_poklon; + +static double pils_pokalt; + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + + +static void Hamming(float f[], uint32_t f_len) +{ + uint32_t i; + uint32_t tmp; + tmp = f_len-1; + i = 0UL; + if (i<=tmp) for (;; i++) { + f[i] = f[i]*(0.54f+0.46f*osic_cos(3.1415926535898f*(X2C_DIVR((float) + i,(float)(1UL+(f_len-1)))))); + if (i==tmp) break; + } /* end for */ +} /* end Hamming() */ + + +static void initdfir(DFIRTAB dfirtab, uint32_t fg) +{ + uint32_t f; + uint32_t i; + float t[512]; + float e; + float f1; + uint32_t tmp; + for (i = 0UL; i<=511UL; i++) { + t[i] = 0.5f; + } /* end for */ + f1 = X2C_DIVR((float)(fg*64UL),(float)adcrate); + tmp = (uint32_t)X2C_TRUNCC(f1,0UL,X2C_max_longcard)+1UL; + f = 1UL; + if (f<=tmp) for (;; f++) { + e = 1.0f; + if (f==(uint32_t)X2C_TRUNCC(f1,0UL,X2C_max_longcard)+1UL) { + e = f1-(float)(uint32_t)X2C_TRUNCC(f1,0UL,X2C_max_longcard); + } + for (i = 0UL; i<=511UL; i++) { + t[i] = t[i]+e*osic_cos(X2C_DIVR(3.1415926535898f*(float)(i*f),512.0f)); + } /* end for */ + if (f==tmp) break; + } /* end for */ + Hamming(t, 512ul); + for (i = 0UL; i<=511UL; i++) { + t[i] = t[i]*(0.54f+0.46f*osic_cos(3.1415926535898f*(X2C_DIVR((float)i,512.0f)))); + } /* end for */ + for (i = 0UL; i<=511UL; i++) { + dfirtab[511UL+i] = t[i]; + dfirtab[511UL-i] = t[i]; + } /* end for */ +} /* end initdfir() */ + + +static void initafir(AFIRTAB atab, uint32_t F0, uint32_t F1, + float eq) +{ + uint32_t f; + uint32_t i; + float t[256]; + float f10; + float f00; + float e; + uint32_t tmp; + f00 = X2C_DIVR((float)(F0*32UL),(float)adcrate); + f10 = X2C_DIVR((float)(F1*32UL),(float)adcrate); + for (i = 0UL; i<=255UL; i++) { + t[i] = 0.0f; + } /* end for */ + tmp = (uint32_t)X2C_TRUNCC(f10,0UL,X2C_max_longcard)+1UL; + f = (uint32_t)X2C_TRUNCC(f00,0UL,X2C_max_longcard); + if (f<=tmp) for (;; f++) { + e = 1.0f+eq*((X2C_DIVR((float)f,X2C_DIVR((float)((F0+F1)*32UL), + (float)adcrate)))*2.0f-1.0f); + /* + e:=1.0 + eq*(FLOAT(f)/FLOAT((F0+F1)*AFIRLEN DIV adcrate)*2.0-1.0); + */ + if (e<0.0f) e = 0.0f; + if (f==(uint32_t)X2C_TRUNCC(f00,0UL,X2C_max_longcard)) { + e = e*(1.0f-(f00-(float)(uint32_t)X2C_TRUNCC(f00,0UL, + X2C_max_longcard))); + } + if (f==(uint32_t)X2C_TRUNCC(f10,0UL,X2C_max_longcard)+1UL) { + e = e*(f10-(float)(uint32_t)X2C_TRUNCC(f10,0UL, + X2C_max_longcard)); + } + /* + IF eq<>0 THEN IO.WrFixed(e,2,2);IO.WrLn; END; + */ + if (f==0UL) { + for (i = 0UL; i<=255UL; i++) { + t[i] = t[i]+e*0.5f; + } /* end for */ + } + else { + for (i = 0UL; i<=255UL; i++) { + t[i] = t[i]+e*osic_cos(X2C_DIVR(3.1415926535898f*(float)(i*f), + 256.0f)); + } /* end for */ + } + if (f==tmp) break; + } /* end for */ + Hamming(t, 256ul); + for (i = 0UL; i<=255UL; i++) { + atab[255UL+i] = t[i]; + atab[255UL-i] = t[i]; + } /* end for */ + if (F0>0UL) { + /* make dc level zero */ + e = 0.0f; + for (i = 0UL; i<=511UL; i++) { + e = e+atab[i]; + } /* end for */ + e = X2C_DIVR(e,512.0f); + for (i = 0UL; i<=511UL; i++) { + atab[i] = atab[i]-e; + } /* end for */ + } +/* +IO.WrLn; +FOR i:=0 TO HIGH(atab) DO IO.WrFixed(atab[i], 2,8) END; +IO.WrLn; +*/ +/* +IF eq<>0.0 THEN +debfd:=FIO.Create("/tmp/ta.raw"); +FOR i:=0 TO HIGH(atab) DO f:=VAL(INTEGER, atab[i]*1000.0); + FIO.WrBin(debfd,f,2) END; +FIO.Close(debfd); +END; +*/ +} /* end initafir() */ + + +static void OpenSound(void) +{ + int32_t s; + int32_t i; + soundfd = osi_OpenRW(soundfn, 1024ul); + if (soundfd>=0L) { + if (maxchannels<2UL) { + i = samplesize(soundfd, 16UL); /* 8, 16 */ + i = channels(soundfd, maxchannels+1UL); /* 1, 2 */ + i = setfragment(soundfd, fragmentsize); /* 2^bufsize * 65536*bufs*/ + if (i) { + osi_WrStr("sound setfragment returns ", 27ul); + osic_WrINT32((uint32_t)i, 1UL); + osic_WrLn(); + } + i = sampelrate(soundfd, adcrate); /* 8000..48000 */ + s = (int32_t)getsampelrate(soundfd); + if (s!=(int32_t)adcrate) { + osi_WrStr("sound device returns ", 22ul); + osic_WrINT32((uint32_t)s, 1UL); + osi_WrStrLn("Hz!", 4ul); + } + } + } + else if (abortonsounderr) { + osi_WrStr(soundfn, 1024ul); + Error(" open", 6ul); + } +} /* end OpenSound() */ + + +static char packcall(char cs[], uint32_t cs_len, + uint32_t * cc, char * ssid) +{ + uint32_t s; + uint32_t j; + uint32_t i; + char c; + char packcall_ret; + X2C_PCOPY((void **)&cs,cs_len); + cs[cs_len-1] = 0; + *cc = 0UL; + s = 0UL; + i = 0UL; + for (j = 0UL; j<=5UL; j++) { + *cc = *cc*37UL; + c = cs[i]; + if ((uint8_t)c>='A' && (uint8_t)c<='Z') { + *cc += ((uint32_t)(uint8_t)c-65UL)+1UL; + ++i; + } + else if ((uint8_t)c>='0' && (uint8_t)c<='9') { + *cc += ((uint32_t)(uint8_t)c-48UL)+27UL; + ++i; + } + else if (c && c!='-') { + packcall_ret = 0; + goto label; + } + } /* end for */ + if (cs[i]=='-') { + /* ssid */ + ++i; + c = cs[i]; + if ((uint8_t)c>='0' && (uint8_t)c<='9') { + s += (uint32_t)(uint8_t)c-48UL; + ++i; + c = cs[i]; + if ((uint8_t)c>='0' && (uint8_t)c<='9') { + s = (s*10UL+(uint32_t)(uint8_t)c)-48UL; + } + } + if (s>15UL) { + packcall_ret = 0; + goto label; + } + } + else if (cs[i]) { + packcall_ret = 0; + goto label; + } + *ssid = (char)s; + packcall_ret = *cc>0UL; + label:; + X2C_PFREE(cs); + return packcall_ret; +} /* end packcall() */ + + +static int32_t GetIp(char h[], uint32_t h_len, uint32_t * ip, + uint32_t * port) +{ + uint32_t p; + uint32_t n; + uint32_t i; + char ok0; + int32_t GetIp_ret; + X2C_PCOPY((void **)&h,h_len); + p = 0UL; + h[h_len-1] = 0; + *ip = 0UL; + for (i = 0UL; i<=4UL; i++) { + n = 0UL; + ok0 = 0; + while ((uint8_t)h[p]>='0' && (uint8_t)h[p]<='9') { + ok0 = 1; + n = (n*10UL+(uint32_t)(uint8_t)h[p])-48UL; + ++p; + } + if (!ok0) { + GetIp_ret = -1L; + goto label; + } + if (i<3UL) { + if (h[p]!='.' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + *ip = *ip*256UL+n; + } + else if (i==3UL) { + *ip = *ip*256UL+n; + if (h[p]!=':' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + } + else if (n>65535UL) { + GetIp_ret = -1L; + goto label; + } + *port = n; + ++p; + } /* end for */ + GetIp_ret = openudp(); + label:; + X2C_PFREE(h); + return GetIp_ret; +} /* end GetIp() */ + + +static void Config(void) +{ + uint32_t c; + uint32_t i; + struct R92 * anonym; + struct R41 * anonym0; + struct DFM6 * anonym1; + struct C34 * anonym2; + struct PILS * anonym5; + struct M10 * anonym6; + + for (c = 0UL; c<=63UL; c++) { + { /* with */ + struct R92 * anonym = &chan[c].r92; + anonym->configbaud = 4800UL; + anonym->demodbaud = (2UL*anonym->configbaud*65536UL)/adcrate; + initafir(anonym->afirtab, 0UL, 2800UL,X2C_DIVR((float)chan[c].configequalizer,100.0f)); + anonym->baudfine = 0L; + anonym->noise = 0.0f; + anonym->bitlev = 0.0f; + anonym->cbit = 0; + anonym->rxp = 0UL; + anonym->rxbitc = 0UL; + anonym->manchestd = 0L; + anonym->lastmanch = 0; + anonym->rxbyte = 0UL; + for (i = 0UL; i<=9UL; i++) { + anonym->asynst[i] = 0L; + } /* end for */ + } + { /* with */ + struct R41 * anonym0 = &chan[c].r41; + anonym0->configbaud = 4800UL; + anonym0->demodbaud = (2UL*anonym0->configbaud*65536UL)/adcrate; + initafir(anonym0->afirtab, 0UL, 2800UL, X2C_DIVR((float)chan[c].configequalizer,100.0f)); + anonym0->baudfine = 0L; + anonym0->noise = 0.0f; + anonym0->bitlev = 0.0f; + anonym0->cbit = 0; + anonym0->rxp = 0UL; + anonym0->rxbitc = 0UL; + anonym0->rxbyte = 0UL; + anonym0->synp = 0UL; + } + { // with + struct PILS * anonym5 = &chan[c].pils; + anonym5->configbaud = 4800UL; + anonym5->demodbaud = (2UL*anonym5->configbaud*65536UL)/adcrate; + initafir(anonym5->afirtab, 0UL, 2200UL, X2C_DIVR((float)(chan[c].configequalizer),100.0f)); + anonym5->baudfine = 0L; + anonym5->noise = 0.0f; + anonym5->bitlev = 0.0f; + anonym5->cbit = 0; + anonym5->rxp = 0UL; + anonym5->rxbitc = 0UL; + anonym5->rxbyte = 0UL; + anonym5->synp = 0UL; + } + + + { /* with */ + struct DFM6 * anonym1 = &chan[c].dfm6; + anonym1->configbaud = 2500UL; + anonym1->demodbaud = (2UL*anonym1->configbaud*65536UL)/adcrate; + initafir(anonym1->afirtab, 0UL, 1900UL, X2C_DIVR((float)chan[c].configequalizer,100.0f)); + anonym1->baudfine = 0L; + anonym1->noise = 0.0f; + anonym1->bitlev = 0.0f; + anonym1->cbit = 0; + anonym1->rxp = 264UL; /* out of fram, wait for sync */ + anonym1->manchestd = 0L; + anonym1->polarity = 0; + anonym1->numcnt = 0UL; + anonym1->txok = 0; + anonym1->newsonde=1; + } + + { /* with */ + struct M10 * anonym6 = &chan[c].m10; + anonym6->configbaud = 9600UL; + anonym6->demodbaud = (2UL*anonym6->configbaud*65536UL)/adcrate; + initafir(anonym6->afirtab, 0UL, 5200UL, X2C_DIVR((float)chan[c].configequalizer,100.0f)); //5200 + anonym6->baudfine = 0L; + anonym6->noise = 0.0f; + anonym6->bitlev = 0.0f; + anonym6->cbit = 0; + anonym6->rxp = 101UL; /* out of fram, wait for sync */ + anonym6->manchestd = 0L; + anonym6->txok = 0; + } + + { /* with */ + struct C34 * anonym2 = &chan[c].c34; + anonym2->txbaud = (anonym2->configbaud*65536UL)/adcrate; + anonym2->demodbaud = anonym2->txbaud*2UL; + anonym2->afskmidfreq = X2C_DIVR((float)anonym2->configafskmid*2.0f,(float)adcrate); + initafir(anonym2->afirtab, + (anonym2->configafskmid-anonym2->configafskshift/2UL)-anonym2->configbaud/4UL, anonym2->configafskmid+anonym2->configafskshift/2UL+anonym2->configbaud/4UL, X2C_DIVR((float)chan[c].configequalizer,100.0f)); + initdfir(anonym2->dfirtab,(anonym2->configbaud*anonym2->confignyquist)/100UL); + anonym2->baudfine = 0L; + anonym2->left = 0.0f; + anonym2->tcnt = 0.0f; + anonym2->freq = 0.0f; + anonym2->dfin = 0UL; + anonym2->cbit = 0; + anonym2->rxp = 0UL; + anonym2->rxbitc = 0UL; + } + } /* end for */ +} /* end Config() */ + + +static void Parms(void) +{ + char err; + FILENAME mixfn; + FILENAME h1; + FILENAME h; + uint32_t ch; + uint32_t cnum; + int32_t inum; + uint32_t channel; + pUDPTX utx; + char chanset; + char mycall[11]; + uint32_t myc; + char mys; + struct R92 * anonym; + struct R41 * anonym0; + struct DFM6 * anonym1; + struct C34 * anonym2; + struct CHAN * anonym3; + /* set only 1 chan */ + struct CHAN * anonym4; + struct PILS * anonym5; + struct M10 * anonym6; + err = 0; + abortonsounderr = 0; + adcrate = 22050UL; + adcbuflen = 1024UL; + fragmentsize = 11UL; + maxchannels = 0UL; + cfgchannels = 1UL; /* fix 1 channel */ + debfd = -1L; + chanset = 0; + dfmnametyp = 0UL; + dfmidchg = 2UL; /* minutes no tx if dfm name change */ + for (channel = 0UL; channel<=63UL; channel++) { + { /* with */ + struct R92 * anonym = &chan[channel].r92; + anonym->enabled = 1; + anonym->pllshift = 1024L; + } + { /* with */ + struct R41 * anonym0 = &chan[channel].r41; + anonym0->enabled = 1; + anonym0->pllshift = 1024L; + } + //------pilot sonde + { // with + struct PILS * anonym5 = &chan[channel].pils; + anonym5->enabled = 1; + anonym5->pllshift = 1024L; + } + //---pilot sonde^ + { /* with */ + struct DFM6 * anonym1 = &chan[channel].dfm6; + anonym1->enabled = 1; + anonym1->pllshift = 1024L; + anonym1->idcnt0 = 0UL; + anonym1->idcnt1 = 0UL; + } + { /* with */ + struct C34 * anonym2 = &chan[channel].c34; + anonym2->enabled = 1; + anonym2->pllshift = 4096L; + anonym2->confignyquist = 65UL; + anonym2->afskhighpass = 0.0f; + anonym2->configbaud = 2400UL; + anonym2->configafskshift = 1800UL; + anonym2->configafskmid = 3800UL; + anonym2->id34.id[0] = 0; + anonym2->id34.idcheck[0] = 0; + anonym2->id34.idtime = 0UL; + anonym2->id34.idcnt = 0UL; + anonym2->id50.id[0] = 0; + anonym2->id50.idcheck[0] = 0; + anonym2->id50.idtime = 0UL; + anonym2->id50.idcnt = 0UL; + } + { /* with */ + struct M10 * anonym6 = &chan[channel].m10; + anonym6->enabled = 1; + anonym6->pllshift = 4096L; + } + + { /* with */ + struct CHAN * anonym3 = &chan[channel]; + anonym3->configequalizer = 0L; + anonym3->udptx = 0; + anonym3->mycallc = 0UL; + } + + } /* end for */ + channel = 0UL; + X2C_COPY("/dev/dsp",9ul,soundfn,1024u); + X2C_COPY("/dev/mixer",11ul,mixfn,1024u); + for (;;) { + osi_NextArg(h, 1024ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + if (h[1U]=='a') abortonsounderr = 1; + else if (h[1U]=='3') { + if (chanset) { + /* set only 1 chan */ + chan[channel].c34.enabled = 0; + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + chan[ch].c34.enabled = 0; + } /* end for */ + } + } + else if (h[1U]=='9') { + if (chanset) { + /* set only 1 chan */ + chan[channel].r92.enabled = 0; + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + chan[ch].r92.enabled = 0; + } /* end for */ + } + } + else if (h[1U]=='4') { + if (chanset) { + /* set only 1 chan */ + chan[channel].r41.enabled = 0; + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + chan[ch].r41.enabled = 0; + } /* end for */ + } + } + else if (h[1U]=='6') { + if (chanset) { + /* set only 1 chan */ + chan[channel].dfm6.enabled = 0; + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + chan[ch].dfm6.enabled = 0; + } /* end for */ + } + } + else if (h[1U]=='1') { + if (chanset) { + /* set only 1 chan */ + chan[channel].m10.enabled = 0; + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + chan[ch].m10.enabled = 0; + } /* end for */ + } + } + + //---------------pilot sonde + else if (h[1U]=='8') { + if (chanset) { + /* set only 1 chan */ + chan[channel].pils.enabled = 0; + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + chan[ch].pils.enabled = 0; + } /* end for */ + } + } + + //---------------pilot sonde^ + + else if (h[1U]=='N') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &dfmnametyp)) err = 1; + dfmnametyp += 512UL; + } + else if (h[1U]=='n') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &dfmnametyp)) err = 1; + dfmnametyp += 256UL; + } + else if (h[1U]=='c') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>=63UL) Error("maxchannels 0..max", 19ul); + cfgchannels = cnum; + if (cfgchannels>0UL) maxchannels = cfgchannels-1UL; + } + else if (h[1U]=='C') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>1UL) Error("channel 0 to max", 17ul); + channel = cnum; + chanset = 1; + } + else if (h[1U]=='D') { + osi_NextArg(h1, 1024ul); + debfd = osi_OpenWrite(h1, 1024ul); + } + else if (h[1U]=='e') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToInt(h, 1024ul, &inum)) err = 1; + if (labs(inum)>999L) Error("equalizer -999..999", 20ul); + chan[channel].configequalizer = inum; + } + else if (h[1U]=='f') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum<8000UL || cnum>96000UL) { + Error("sampelrate 8000..96000", 23ul); + } + adcrate = cnum; + } + else if (h[1U]=='F') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + chan[channel].c34.configafskmid = cnum; + } + else if (h[1U]=='G') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &dfmidchg)) err = 1; + } + else if (h[1U]=='l') { + osi_NextArg(h, 1024ul); + if (!aprsstr_StrToCard(h, 1024ul, &cnum)) err = 1; + if (cnum>=16UL && cnum<=4096UL) adcbuflen = cnum; + else Error("sound buffer out of range", 26ul); + } + else if (h[1U]=='o') osi_NextArg(soundfn, 1024ul); + else if (h[1U]=='I') { + osi_NextArg(mycall, 11ul); + if (!packcall(mycall, 11ul, &myc, &mys)) { + Error("-I illegall Callsign + ssid", 28ul); + } + if (chanset) { + { /* with */ + struct CHAN * anonym4 = &chan[channel]; + anonym4->mycallc = myc; + anonym4->myssid = mys; + } + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + chan[ch].mycallc = myc; + chan[ch].myssid = mys; + } /* end for */ + } + } + else if (h[1U]=='u') { + osi_NextArg(h, 1024ul); + osic_alloc((char * *) &utx, sizeof(struct UDPTX)); + if (utx==0) Error("udp socket out of memory", 25ul); + utx->udpfd = GetIp(h, 1024ul, &utx->ip, &utx->destport); + if (utx->udpfd<0L) Error("cannot open udp socket", 23ul); + if (chanset) { + /* set only 1 chan */ + utx->next = chan[channel].udptx; + chan[channel].udptx = utx; + } + else { + /* use before -C set both */ + for (ch = 0UL; ch<=63UL; ch++) { + utx->next = chan[ch].udptx; + chan[ch].udptx = utx; + } /* end for */ + } + } + else if (h[1U]=='v') verb = 1; + else if (h[1U]=='V') { + verb = 1; + verb2 = 1; + } + else { + if (h[1U]=='h') { + osi_WrStrLn("oss Mono/Stereo up to 64 Channel RS92, RS41, C34, C50 Sonde Demodulator to raw Frames", 86ul); + osi_WrStrLn("sent via UDP to \'sondemod\' decoder, more demodulators may send to same decoder", 79ul); + osi_WrStrLn("Stereo used for 2 Rx for 2 Sondes or 1 Sonde with Antenna-Diversity", 68ul); + osi_WrStrLn(" -1 disable M10 decoding (use -C before to select 1 channel)", 73ul); + osi_WrStrLn(" -3 disable SRSC34/50 decoding (use -C before to select 1 channel)", 79ul); + osi_WrStrLn(" -4 disable RS41 decoding (use -C before to select 1 channel)", 74ul); + osi_WrStrLn(" -6 disable DFM06 decoding (use -C before to select 1 channel)", 75ul); + osi_WrStrLn(" -8 disable PILOTSONDE decoding (use -C before to select 1 channel)", 74ul); + osi_WrStrLn(" -9 disable RS92 decoding (use -C before to select 1 channel)", 74ul); + osi_WrStrLn(" -a abort on sounddevice error else retry to open (USB audio...)", 77ul); + osi_WrStrLn(" -c maxchannels, 0 for automatic channel number recognition", 72ul); + osi_WrStrLn(" -C channel parameters follow (repeat for each channel)", 68ul); + osi_WrStrLn(" -D write raw soundcard input data to file or pipe", 63ul); + osi_WrStrLn(" for debug or chaining demodulators (equalizer diversity)", 73ul); + osi_WrStrLn(" -e demod equalizer (0) 100=6db/oct highpass (-999..999)", 69ul); + osi_WrStrLn(" -C before -e sets channel number", 53ul); + osi_WrStrLn(" -f adcrate (22050) (8000..96000)", 46ul); + osi_WrStrLn(" -G no tx if DFMxx Name changes (2)", 48ul); + osi_WrStrLn(" -h help", 21ul); + osi_WrStrLn(" -I mycall + ssid (use -C before to select 1 channel)", 66ul); + osi_WrStrLn(" -l adcbuflen (256)", 32ul); + osi_WrStrLn(" -N 0..255 generate DFM-ID from serial no. in first frame (see -v)", 79ul); + osi_WrStrLn(" enter first byte in decimal \"AC00070\" -N 172", 61ul); + osi_WrStrLn(" -n same as -N but try old methode too", 51ul); + osi_WrStrLn(" -o oss devicename (/dev/dsp) or raw/wav audio file or pipe /dev/stdin", 83ul); + osi_WrStrLn(" -u send rx data in udp (to sondemod), -C before sets", 77ul); + osi_WrStrLn(" channel number, maybe repeated for more destinations", 69ul); + osi_WrStrLn(" -V very verbous, with some hex dumps", 50ul); + osi_WrStrLn(" -v verbous, (CRC-checked Sondename)", 49ul); + osi_WrStrLn("example: sondeudp -f 16000 -o /dev/dsp -c 2 -C 0 -e 50 -u 127.0.0.1:4000", 73ul); + X2C_ABORT(); + } + err = 1; + } + } + else err = 1; + if (err) break; + } + if (err) { + osi_WrStr(">", 2ul); + osi_WrStr(h, 1024ul); + osi_WrStrLn("< use -h", 9ul); + X2C_ABORT(); + } + if (adcbuflen*(maxchannels+1UL)>4096UL) { + adcbuflen = 4096UL/(maxchannels+1UL); + } + Config(); + OpenSound(); +} /* end Parms() */ + + +static void sendudp(char data[], uint32_t data_len, int32_t len, + uint32_t ip, uint32_t destport, int32_t udpfd) +{ + int32_t i; + X2C_PCOPY((void **)&data,data_len); + i = udpsend(udpfd, data, len, destport, ip); + X2C_PFREE(data); +} /* end sendudp() */ + + +static void WrdB(int32_t volt) +{ + if (volt>0L) { + osic_WrFixed(osic_ln((float)volt)*8.685889638f-96.4f, 1L, 6UL); + osi_WrStr("dB", 3ul); + } +} /* end WrdB() */ + + +static void WrQ(float lev, float noise) +{ + if (lev>0.0f) { + noise = X2C_DIVR(noise*200.0f,lev); + if (noise>100.0f) noise = 100.0f; + else if (noise<=0.0f) noise = 0.0f; + osic_WrINT32((uint32_t)(100L-(int32_t)X2C_TRUNCI(noise, + X2C_min_longint,X2C_max_longint)), 3UL); + osi_WrStr("%", 2ul); + } +} /* end WrQ() */ + + +static void WrQuali(float q) +{ + if (q>0.0f) { + q = 100.5f-q*200.0f; + if (q<0.0f) q = 0.0f; + osi_WrStr(" q:", 4ul); + osic_WrINT32((uint32_t)osi_realint(q), 2UL); + } +} /* end WrQuali() */ + + +static void Wrtune(int32_t volt, int32_t max0) +{ + int32_t u; + if (max0>0L && max0>labs(volt)) { + u = (volt*100L)/max0; + if (labs(u)>0L) { + osi_WrStr(" f:", 4ul); + osic_WrINT32((uint32_t)u, 2UL); + } + else osi_WrStr(" ", 6ul); + } +} /* end Wrtune() */ + + +static float noiselevel1(float bitlev, float noise) +/* 0.0 perfect, ~0.25 noise only*/ +{ + if (bitlev==0.0f) return 0.0f; + else return X2C_DIVR(noise,bitlev); + return 0; +} /* end noiselevel() */ + + + +static float noiselevel(uint32_t channel) +/* 0.0 perfect, ~0.25 noise only*/ +{ + struct C34 * anonym; + { /* with */ + struct C34 * anonym = &chan[channel].c34; + if (anonym->sqmed[1]==anonym->sqmed[0]) return 0.0f; + else { + return X2C_DIVR(anonym->noise,(float)fabs(anonym->sqmed[1]-anonym->sqmed[0])); + } + } + return 0; +} /* end noiselevel() */ + +// Fir(afin, +// (uint32_t)((anonym->baudfine&65535L)/4096L), +// 16UL, +// chan[m].afir, +// 32ul, +// anonym->afirtab, +// 512ul); +static float Fir(uint32_t in, uint32_t sub, uint32_t step, float fir[], uint32_t fir_len, float firtab[], uint32_t firtab_len) +{ + float s; + uint32_t i; + s = 0.0f; + i = sub; + uint32_t dfl=fir_len-1; + uint32_t dftl=firtab_len-1; + + do { + s = s+fir[in]*firtab[i]; + ++in; + if (in>dfl) in = 0UL; + i += step; + } while (i<=dftl); + return s; +} /* end Fir() */ + + + +static void alludp(pUDPTX utx, uint32_t len, char buf[], uint32_t buf_len) +{ + X2C_PCOPY((void **)&buf,buf_len); + while (utx) { + if (utx->udpfd>=0L) { + sendudp(buf, buf_len, (int32_t)len, utx->ip, utx->destport, + utx->udpfd); + } + utx = utx->next; + } + X2C_PFREE(buf); +} /* end alludp() */ + + +static int32_t reedsolomon92(char buf[], uint32_t buf_len) +{ + uint32_t i; + int32_t res; + char b[256]; + uint32_t eraspos[24]; + for (i = 0UL; i<=255UL; i++) { + b[i] = 0; + } /* end for */ + for (i = 0UL; i<=209UL; i++) { + b[230UL-i] = buf[i+6UL]; + } /* end for */ + for (i = 0UL; i<=23UL; i++) { + b[254UL-i] = buf[i+216UL]; + } /* end for */ + res = decodersc(b, eraspos, 0L); + if (res>0L && res<=12L) { + for (i = 0UL; i<=209UL; i++) { + buf[i+6UL] = b[230UL-i]; + } /* end for */ + for (i = 0UL; i<=23UL; i++) { + buf[i+216UL] = b[254UL-i]; + } /* end for */ + } + return res; +} /* end reedsolomon92() */ + + +static char crcrs(const char frame[], uint32_t frame_len, + int32_t from, int32_t to) +{ + uint16_t crc; + int32_t i; + int32_t tmp; + crc = 0xFFFFU; + tmp = to-3L; + i = from; + if (i<=tmp) for (;; i++) { + crc = X2C_LSH(crc,16,-8)^CRCTAB[(uint32_t)((crc^(uint16_t)(uint8_t)frame[i])&0xFFU)]; + if (i==tmp) break; + } /* end for */ + return frame[to-1L]==(char)crc && frame[to-2L]==(char)X2C_LSH(crc, + 16,-8); +} /* end crcrs() */ + +static uint16_t sondeudp_POLYNOM = 0x1021U; + + +static void decodeframe92(uint32_t m) +{ + uint32_t len; + uint32_t p; + uint32_t j; + int32_t corr; + struct CHAN * anonym; + corr = reedsolomon92(chan[m].r92.rxbuf, 256ul); + { /* with */ + struct CHAN * anonym = &chan[m]; + if (anonym->mycallc>0UL) { + chan[m].r92.rxbuf[0U] = (char)(anonym->mycallc/16777216UL); + chan[m].r92.rxbuf[1U] = (char)(anonym->mycallc/65536UL&255UL); + chan[m].r92.rxbuf[2U] = (char)(anonym->mycallc/256UL&255UL); + chan[m].r92.rxbuf[3U] = (char)(anonym->mycallc&255UL); + chan[m].r92.rxbuf[4U] = anonym->myssid; + } + alludp(anonym->udptx, 240UL, chan[m].r92.rxbuf, 256ul); + } + if (verb) { + p = 6UL; + if (chan[m].r92.rxbuf[6U]=='e') { + ++p; + len = (uint32_t)(uint8_t)chan[m].r92.rxbuf[7U]*2UL+2UL; + /* +crc */ + ++p; + if (maxchannels>0UL) { + osic_WrINT32(m+1UL, 1UL); + osi_WrStr(":", 2ul); + } + osi_WrStr("R92 ", 5ul); + if (8UL+len>240UL || !crcrs(chan[m].r92.rxbuf, 256ul, 8L, + (int32_t)(8UL+len))) osi_WrStr("---- crc err ", 15ul); + else { + j = 4UL; + while ((uint8_t)chan[m].r92.rxbuf[8UL+j]>=' ') { + osi_WrStr((char *) &chan[m].r92.rxbuf[8UL+j], 1u/1u); + ++j; + } + osi_WrStr(" ", 2ul); + osic_WrINT32((uint32_t)(uint8_t) + chan[m].r92.rxbuf[8U]+(uint32_t)(uint8_t) + chan[m].r92.rxbuf[9U]*256UL, 4UL); + } + /* IF m>0 THEN WrStr(" ") END; */ + WrdB(chan[m].adcmax); + WrQ(chan[m].r92.bitlev, chan[m].r92.noise); + if (corr<0L) osi_WrStr(" -R", 4ul); + else if (corr>0L && corr<=12L) { + osi_WrStr(" +", 3ul); + osic_WrINT32((uint32_t)corr, 1UL); + osi_WrStr("R", 2ul); + } + Wrtune(chan[m].adcdc, chan[m].adcmax); + osi_WrStrLn("", 1ul); + } + } +} /* end decodeframe92() */ + + +static double latlong(uint32_t val, char c50) +{ + double hf; + double hr; + hr = (double)(val%0x080000000UL); + if (c50) hr = X2C_DIVL(hr,1.E+7); + else hr = X2C_DIVL(hr,1.E+6); + hf = (double)(uint32_t)X2C_TRUNCC(hr,0UL,X2C_max_longcard); + hr = hf+X2C_DIVL(hr-hf,0.6); + if (val>=0x080000000UL) hr = -hr; + return hr; +} /* end latlong() */ + + +static char hex(uint32_t n) +{ + n = n&15UL; + if (n<10UL) return (char)(n+48UL); + else return (char)(n+55UL); + return 0; +} /* end hex() */ + +/*------------------------------ RS41 */ + +static void sendrs41(uint32_t m) +{ + struct CHAN * anonym; + { /* with */ + struct CHAN * anonym = &chan[m]; + if (anonym->mycallc>0UL) { + chan[m].r41.rxbuf[0U] = (char)(anonym->mycallc/16777216UL); + chan[m].r41.rxbuf[1U] = (char)(anonym->mycallc/65536UL&255UL); + chan[m].r41.rxbuf[2U] = (char)(anonym->mycallc/256UL&255UL); + chan[m].r41.rxbuf[3U] = (char)(anonym->mycallc&255UL); + chan[m].r41.rxbuf[4U] = anonym->myssid; + chan[m].r41.rxbuf[5U] = 0; + chan[m].r41.rxbuf[6U] = 0; + } + alludp(anonym->udptx, 520UL, chan[m].r41.rxbuf, 520ul); + } +} /* end sendrs41() */ + + +static double atang2(double x, double y) +{ + double w; + if (fabs(x)>fabs(y)) { + w = (double)osic_arctan((float)(X2C_DIVL(y,x))); + if (x<0.0) { + if (y>0.0) w = 3.1415926535898+w; + else w = w-3.1415926535898; + } + } + else if (y!=0.0) { + w = (double)(1.5707963267949f-osic_arctan((float)(X2C_DIVL(x, + y)))); + if (y<0.0) w = w-3.1415926535898; + } + else w = 0.0; + return w; +} /* end atang2() */ + +#define sondeudp_EARTHA 6.378137E+6 + +#define sondeudp_EARTHB 6.3567523142452E+6 + +#define sondeudp_E2 6.6943799901413E-3 + +#define sondeudp_EARTHAB 4.2841311513312E+4 + + +static void wgs84r(double x, double y, double z, + double * lat, double * long0, + double * heig) +{ + double sl; + double ct; + double st; + double t; + double rh; + double xh; + double h; + h = x*x+y*y; + if (h>0.0) { + rh = (double)osic_sqrt((float)h); + xh = x+rh; + *long0 = atang2(xh, y)*2.0; + if (*long0>3.1415926535898) *long0 = *long0-6.2831853071796; + t = (double)osic_arctan((float)(X2C_DIVL(z*1.003364089821, + rh))); + st = (double)osic_sin((float)t); + ct = (double)osic_cos((float)t); + *lat = (double)osic_arctan((float) + (X2C_DIVL(z+4.2841311513312E+4*st*st*st, + rh-4.269767270718E+4*ct*ct*ct))); + sl = (double)osic_sin((float)*lat); + *heig = X2C_DIVL(rh,(double)osic_cos((float)*lat))-(double)(X2C_DIVR(6.378137E+6f, + osic_sqrt((float)(1.0-6.6943799901413E-3*sl*sl)))); + } + else { + *lat = 0.0; + *long0 = 0.0; + *heig = 0.0; + } +/* lat:=atan(z/(rh*(1.0 - E2))); */ +/* heig:=sqrt(h + z*z) - EARTHA; */ +} /* end wgs84r() */ + + +static int32_t getint32(const char frame[], uint32_t frame_len, + uint32_t p) +{ + uint32_t n; + uint32_t i; + n = 0UL; + for (i = 3UL;; i--) { + n = n*256UL+(uint32_t)(uint8_t)frame[p+i]; + if (i==0UL) break; + } /* end for */ + return (int32_t)n; +} /* end getint32() */ + + +static uint32_t getcard16(const char frame[], uint32_t frame_len, + uint32_t p) +{ + return (uint32_t)(uint8_t)frame[p]+256UL*(uint32_t)(uint8_t) + frame[p+1UL]; +} /* end getcard16() */ + + +static int32_t getint16(const char frame[], uint32_t frame_len, + uint32_t p) +{ + uint32_t n; + n = (uint32_t)(uint8_t)frame[p]+256UL*(uint32_t)(uint8_t) + frame[p+1UL]; + if (n>=32768UL) return (int32_t)(n-65536UL); + return (int32_t)n; +} /* end getint16() */ + + +/*---------------------- M10 */ + +static uint16_t crcm10(int32_t len, const char buf[], + uint32_t buf_len) +{ + int32_t i; + uint16_t s; + uint16_t t; + uint16_t b; + uint16_t cs; + int32_t tmp; + cs = 0U; + tmp = len-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + b = (uint16_t)(uint32_t)(uint8_t)buf[i]; + b = X2C_LSH(b,16,-1)|X2C_LSH(b&0x1U,16,7); + b = b^X2C_LSH(b,16,-2)&0xFFU; + t = cs&0x3FU|X2C_LSH((cs^X2C_LSH(cs,16,-2)^X2C_LSH(cs,16,-4))&0x1U,16, + 6)|X2C_LSH((X2C_LSH(cs,16,-1)^X2C_LSH(cs,16,-3)^X2C_LSH(cs, + 16,-5))&0x1U,16,7); + s = X2C_LSH(cs,16,-7)&0xFFU; + s = (s^X2C_LSH(s,16,-2))&0xFFU; + cs = X2C_LSH(cs&0xFFU,16,8)|b^t^s; + if (i==tmp) break; + } /* end for */ + return (uint16_t)cs; +} /* end crcm10() */ + + +static uint32_t m10card(const char b[], uint32_t b_len, + int32_t pos, int32_t len) +{ + int32_t i; + uint32_t n; + int32_t tmp; + n = 0UL; + tmp = len-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + n = n*256UL+(uint32_t)(uint8_t)b[pos+i]; + if (i==tmp) break; + } /* end for */ + return n; +} /* end m10card() */ + +typedef uint32_t SET256[8]; + +static float sondeudp_DEGMUL = 8.3819036711397E-8f; + +#define sondeudp_VMUL 0.005 + +static SET256 sondeudp_HSET = {0x03FFFFF0UL,0x00000003UL,0x00000000UL, + 0x00000018UL,0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL}; /* not hexlist known bytes */ + +static SET256 _cnst1 = {0x03FFFFF0UL,0x00000003UL,0x00000000UL,0x00000018UL, + 0x00000000UL,0x00000000UL,0x00000000UL,0x00000000UL}; + +static void WrChan(int32_t c) +{ + if (maxchannels>0UL) { + osic_WrINT32((uint32_t)(c+1L), 1UL); + osi_WrStr(":", 2ul); + } +} /* end WrChan() */ + + + +static void decodeframe10(uint32_t m) +{ + uint32_t week; + uint32_t tow; + uint32_t cs; + uint32_t i; + int32_t ci; + double dir; + double v; + double vv; + double vn; + double ve; + double alt; + double lon; + double lat; + uint32_t time0; + uint32_t id; + char ids[201]; + char s[201+6]; + struct M10 * anonym; + struct CHAN * anonym0; /* call if set */ + { /* with */ + struct M10 * anonym = &chan[m].m10; + cs = (uint32_t)crcm10(99L, anonym->rxbuf, 101ul); + if (cs==m10card(anonym->rxbuf, 101ul, 99L, 2L)) { + /* crc ok */ + tow = m10card(anonym->rxbuf, 101ul, 10L, 4L); + week = m10card(anonym->rxbuf, 101ul, 32L, 2L); + time0 = tow/1000UL+week*604800UL+315964800UL; + if (verb2) { + osi_WrStr(" ", 2ul); + aprsstr_DateToStr(time0, s, 201ul); + osi_WrStr(s, 201ul); + osi_WrStr(" ", 2ul); + } + lat = (double)m10card(anonym->rxbuf, 101ul, 14L, + 4L)*8.3819036711397E-8; + lon = (double)m10card(anonym->rxbuf, 101ul, 18L, + 4L)*8.3819036711397E-8; + alt = (double)m10card(anonym->rxbuf, 101ul, 22L, 4L)*0.001; + ci = (int32_t)m10card(anonym->rxbuf, 101ul, 4L, 2L); + if (ci>32767L) ci -= 65536L; + ve = (double)ci*0.005; + ci = (int32_t)m10card(anonym->rxbuf, 101ul, 6L, 2L); + if (ci>32767L) ci -= 65536L; + vn = (double)ci*0.005; + ci = (int32_t)m10card(anonym->rxbuf, 101ul, 8L, 2L); + if (ci>32767L) ci -= 65536L; + vv = (double)ci*0.005; + v = (double)osic_sqrt((float)(ve*ve+vn*vn)); + /* hor speed */ + dir = atang2(vn, ve)*5.7295779513082E+1; + if (dir<0.0) dir = 360.0+dir; + + + int i,j,k,l; + unsigned int byte; + unsigned char sn_bytes[5]; + char SN[12]; + + for (i = 0; i < 11; i++) SN[i] = ' '; SN[11] = '\0'; + + for (i = 0; i < 5; i++) { + byte = anonym->rxbuf[0x5d + i]; + sn_bytes[i] = byte; + } + + byte = sn_bytes[2]; + sprintf(SN, "%1X%02u", (byte>>4)&0xF, byte&0xF); + j=atoi(SN); + k=(int)(j/25); + l=j-k*25; + byte = sn_bytes[3] | (sn_bytes[4]<<8); + sprintf(SN+3, "%1X%1u%04u", sn_bytes[0]&0xF, (byte>>13)&0x7, byte&0x1FFF); + sprintf(ids,SN); + + ids[9U] = 0; + /* get ID */ + if (verb) { + WrChan((int32_t)m); + osi_WrStr("M10 ", 5ul); + osi_WrStr(ids, 201ul); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)lat, 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)lon, 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)alt, 1L, 1UL); + osi_WrStr("m ", 3ul); + osic_WrFixed((float)(v*3.6), 1L, 1UL); + osi_WrStr("km/h ", 6ul); + osic_WrFixed((float)dir, 0L, 1UL); + osi_WrStr("deg ", 5ul); + osic_WrFixed((float)vv, 1L, 1UL); + osi_WrStr("m/s ", 5ul); + } + /* build tx frame */ + for (i = 0UL; i<=9UL; i++) { + s[i+7UL] = ids[i]; + } /* end for */ + { /* with */ + struct CHAN * anonym0 = &chan[m]; + s[0U] = (char)(anonym0->mycallc/16777216UL); + s[1U] = (char)(anonym0->mycallc/65536UL&255UL); + s[2U] = (char)(anonym0->mycallc/256UL&255UL); + s[3U] = (char)(anonym0->mycallc&255UL); + if (anonym0->mycallc>0UL) s[4U] = anonym0->myssid; + else s[4U] = '\020'; + s[5U] = 0; + s[6U] = 0; + } + for (i = 0UL; i<=100UL; i++) { + s[i+17UL] = anonym->rxbuf[i]; /* payload */ + } /* end for */ + + + s[118U] = chan[m].freq[0]; + s[119U] = chan[m].freq[1]; + s[120U] = chan[m].freq[2]; + s[121U] = chan[m].freq[3]; + s[122U] = chan[m].freq[4]; + s[123U] = chan[m].freq[5]; + + + alludp(chan[m].udptx, 117UL+7, s, 201ul); + } + else if (verb) { + /*build tx frame */ + WrChan((int32_t)m); + osi_WrStr("M10 crc error", 14ul); + } + if (verb) { + WrdB(chan[m].adcmax-chan[m].adcmin); + WrQuali(noiselevel1(anonym->bitlev, anonym->noise)); + Wrtune(chan[m].adcmax+chan[m].adcmin, chan[m].adcmax-chan[m].adcmin); + } + if (verb2) { + for (i = 0UL; i<=23UL; i++) { + if (i%10UL==0UL) osi_WrStrLn("", 1ul); + osic_WrINT32(m10card(anonym->rxbuf, 101ul, + (int32_t)(48UL+i*2UL), 2L), 6UL); + osi_WrStr(" ", 2ul); + } /* end for */ + for (i = 0UL; i<=100UL; i++) { + if (i%24UL==0UL) osi_WrStrLn("", 1ul); + if (X2C_INL(i,256,_cnst1)) osi_WrStr(" . ", 4ul); + else osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[i], 3UL); + } /* end for */ + } + if (verb) osi_WrStrLn("", 1ul); + } +} /* end decodeframe10() */ + + +static void demodbyte10(uint32_t m, char d) +{ + struct M10 * anonym; + { /* with */ + struct M10 * anonym = &chan[m].m10; + /*WrInt(ORD(d),1); Flush(); */ + anonym->synword = anonym->synword*2UL+(uint32_t)d; + if (anonym->rxp>=101UL) { + if ((anonym->synword&16777215UL)==6594336UL) { + anonym->rxp = 3UL; + anonym->rxb = 0UL; + anonym->rxbuf[0U] = 'd'; + anonym->rxbuf[1U] = '\237'; + anonym->rxbuf[2U] = ' '; + } + } + else { + /*WrStr(" -syn- "); */ + ++anonym->rxb; + if (anonym->rxb>=8UL) { + anonym->rxbuf[anonym->rxp] = (char)(anonym->synword&255UL); + anonym->rxb = 0UL; + ++anonym->rxp; + if (anonym->rxp==101UL) decodeframe10(m); + } + } + } +} /* end demodbyte10() */ +static void demodbit10(uint32_t m, float u, float u0) +{ + char bit; + char d; + float ua; + struct M10 * anonym; + /*IF manchestd>20000 THEN */ + /*WrInt(VAL(INTEGER, u), 8); Flush; */ + d = u>=0.0f; + { /* with */ + struct M10 * anonym = &chan[m].m10; + /*WrInt(manchestd DIV 256, 1); WrStr("("); WrInt(ORD(lastmanch),1); + WrInt(ORD(d),1);WrStr(")"); Flush(); */ + /*WrInt(ORD(lastmanch<>d),1); Flush(); */ + /*END; */ + if (anonym->lastmanch==d) { + anonym->manchestd += (32767L-anonym->manchestd)/16L; + } + bit = d!=anonym->lastmanch; + if (anonym->manchestd>0L) { + demodbyte10(m, bit); + /*quality*/ + ua = (float)fabs(u)-anonym->bitlev; + anonym->bitlev = anonym->bitlev+ua*0.02f; + anonym->noise = anonym->noise+((float)fabs(ua)-anonym->noise) + *0.05f; + } + /*quality*/ + anonym->lastmanch = d; + anonym->manchestd = -anonym->manchestd; + } +} /* end demodbit10() */ + + +static void demod10(float u, uint32_t m) +{ + char d; + struct M10 * anonym; + /* + IF debfd>=0 THEN + ui:=VAL(INTEGER, u*0.002); + WrBin(debfd, ui, 2); + END; + */ + { /* with */ + struct M10 * anonym = &chan[m].m10; + d = u>=0.0f; + if (anonym->cbit) { + demodbit10(m, u, anonym->lastu); + if (d!=anonym->oldd) { + if (d==anonym->plld) anonym->baudfine += anonym->pllshift; + else anonym->baudfine -= anonym->pllshift; + anonym->oldd = d; + } + anonym->lastu = u; + } + else anonym->plld = d; + anonym->cbit = !anonym->cbit; + } +} /* end demod10() */ + +static void Fsk10(uint32_t m) +{ + float ff; + int32_t lim; + struct M10 * anonym; + { /* with */ + struct M10 * anonym = &chan[m].m10; + lim = (int32_t)anonym->demodbaud; + for (;;) { + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + ff = Fir(afin, (uint32_t)((anonym->baudfine&65535L)/4096L), + 16UL, chan[m].afir, 32ul, anonym->afirtab, 512ul); + demod10(ff, m); + } + anonym->baudfine += lim; + lim = 0L; + if (anonym->baudfine<131072L) break; + } + } +} /* end Fsk10() */ + +/*---------------------- M10 */ + + + + +//----------------------------------------------------------------------------------------------------- +//PILOTSONDE +//----------------------------------------------------------------------------------------------------- + +static void sendpils(uint32_t m) +{ + uint32_t i; + struct CHAN * anonym; + + { /* with */ + struct CHAN * anonym = &chan[m]; + if (anonym->mycallc>0UL) { + chan[m].pils.rxbuf[0U] = (char)(anonym->mycallc/16777216UL); + chan[m].pils.rxbuf[1U] = (char)(anonym->mycallc/65536UL&255UL); + chan[m].pils.rxbuf[2U] = (char)(anonym->mycallc/256UL&255UL); + chan[m].pils.rxbuf[3U] = (char)(anonym->mycallc&255UL); + chan[m].pils.rxbuf[4U] = anonym->myssid; + chan[m].pils.rxbuf[5U] = 0; + chan[m].pils.rxbuf[6U] = 0; + + chan[m].pils.rxbuf[55U] = chan[m].freq[0];; + chan[m].pils.rxbuf[56U] = chan[m].freq[1];; + chan[m].pils.rxbuf[57U] = chan[m].freq[2];; + chan[m].pils.rxbuf[58U] = chan[m].freq[3];; + chan[m].pils.rxbuf[59U] = chan[m].freq[4];; + chan[m].pils.rxbuf[60U] = chan[m].freq[5];; + } + alludp(chan[m].udptx, 55UL+6UL, chan[m].pils.rxbuf, 66ul); + ///osi_WrStrLn("sending UDP data...",19UL); + } +} /* end sendpils() */ + +static int32_t getint32r(const char frame[], uint32_t frame_len, uint32_t p) +{ + uint32_t n; + uint32_t i; + n = 0UL; + for (i = 0UL;; i++) { + n = n*256UL+(uint32_t)(uint8_t)frame[p+i]; + if (i==3UL) break; + } /* end for */ + return (int32_t)n; +} /* end getint32() */ + + +static int32_t getint16r(const char frame[], uint32_t frame_len, uint32_t p) +{ + uint32_t n; + n = (uint32_t)(uint8_t)frame[p+1UL]+256UL*(uint32_t)(uint8_t) + frame[p]; + if (n>=32768UL) return (int32_t)(n-65536UL); + return (int32_t)n; +} /* end getint16() */ + + +/* -------------------------------------------------------------------------- */ +//taken from https://github.com/rs1729/RS/blob/master/m10/pilotsonde/m12.c + +int crc16poly = 0xA001; + +unsigned int crc16rev(unsigned char bytes[], int len) { + unsigned int rem = 0xFFFF; // init value: crc(0xAAAAAA;init:0xFFFF)=0x3FAF + int i, j; + for (i = 0; i < len; i++) { + rem = rem ^ bytes[i]; + for (j = 0; j < 8; j++) { + if (rem & 0x0001) { + rem = (rem >> 1) ^ crc16poly; + } + else { + rem = (rem >> 1); + } + rem &= 0xFFFF; + } + } + return rem; +} + +/* -------------------------------------------------------------------------- */ + + +static void demodbytepilot(uint32_t m, char d) +{ + // -- - Modyfikacja na Pilot sonde == + uint32_t j; + uint32_t i; + uint32_t revc; + uint32_t normc; + uint32_t cz_1; + unsigned int crc = 0x0000; + + uint16_t offs; + double lat; + double long0; + double heig; + + + struct PILS * anonym; + + { /* with */ + + //Look for pilot sonde header + + struct PILS * anonym = &chan[m].pils; + if (anonym->rxp==0UL) { + anonym->synbuf[anonym->synp] = d; + i = anonym->synp; + ++anonym->synp; + if (anonym->synp>39UL) anonym->synp = 0UL; + j = 30UL; //30 bytes in header (3*10) + normc = 0UL; + revc = 0UL; + do { + --j; + if (("001010101100101010110100000001"[j]=='1')==anonym->synbuf[i]) ++normc; + else ++revc; + if (i==0UL) i = 29UL; + else --i; + } while (!(j==0UL || normc>2UL && revc>2UL)); + anonym->headok = normc==0UL || revc==0UL; + anonym->rev = normcrxbuf[0UL]=0xAA; //fill in first 3 bytes )as we lost it for header + anonym->rxbuf[1UL]=0xAA; //recovery of first bytes for crc calcs + anonym->rxbuf[2UL]=0xAA; + anonym->rxbuf[3UL]=0x01; + anonym->rxp = 4UL; + } + anonym->rxbitc = 0UL; + } + else { + //ignore first and last bytes (stop and start) and save remaining bites in reverse order to byte. + if ((anonym->rxbitc > 0UL) && (anonym->rxbitc < 9UL)) { + anonym->rxbyte = (anonym->rxbyte>>1UL)+128UL*(uint32_t)(d!=anonym->rev);} + ++anonym->rxbitc; //increase bit number + + if (anonym->rxbitc>=10UL) { // when 10 bits (1+8+1) received + anonym->rxbuf[anonym->rxp] = (anonym->rxbyte); //save received byte to buffer + ++anonym->rxp; // increase byte number + if (anonym->rxp>=50UL) { // if full sentence received + crc = (anonym->rxbuf[48UL]<<8UL) | anonym->rxbuf[49UL]; + if (verb) { + if (maxchannels>0UL) { + osic_WrINT32(m+1UL, 1UL); + osi_WrStr(":", 2ul); //if more than one channel print channel No. + } + osi_WrStr("PS ",4UL); + } + + if (verb) { //information on signal quality + WrdB(chan[m].adcmax); + WrQ(anonym->bitlev0, anonym->noise0); + Wrtune(chan[m].adcdc, chan[m].adcmax); +// osi_WrStrLn("",0UL); + } + anonym->rxp = 0UL; + + + offs=6UL; //offset - for first position + lat=(double)getint32r(anonym->rxbuf,55UL,offs)*0.000001; + long0=(double)getint32r(anonym->rxbuf,55UL,offs+4UL)*0.000001; + heig=(double)getint32r(anonym->rxbuf,55UL,offs+8UL)*.01; + + if (crc == crc16rev(anonym->rxbuf, 48UL)) { + for (cz_1 = 49UL; cz_1>1UL; cz_1--) {anonym->rxbuf[cz_1+5UL] = anonym->rxbuf[cz_1];} //move cells by 5 up + + pils_poklat=lat; + pils_poklon=long0; + pils_pokalt=heig; + //if (verb) osi_WrStr(" CRC [OK+] ",12UL); + if (verb) { //if more verbous print lat/long/h + osi_WrStrLn("",0UL); + osi_WrStr(" Lat=",5ul); + osic_WrFixed((float)(lat), 5L, 1UL); + osi_WrStr(" Long=", 6ul); + osic_WrFixed((float)(long0), 5L, 1UL); + osi_WrStr(" height=", 9ul); + osic_WrFixed((float)heig, 1L, 1UL); + osi_WrStrLn("m ", 3ul); + } + + sendpils(m); //send data to udp port - our job here is done. + } //crc ok + else { + if (verb) osi_WrStrLn(" parity error",14UL); + //if position not too far from last good one.... + if ((fabs(pils_poklat-lat)<0.1f) && (fabs(pils_poklon-long0)<0.1f) && (abs(pils_pokalt-heig)<500)) { + if (verb) { + osi_WrStr(" !Lat=",6ul); + osic_WrFixed((float)(lat), 5L, 1UL); + osi_WrStr(" !Long=", 7ul); + osic_WrFixed((float)(long0), 5L, 1UL); + osi_WrStr(" !height=", 10ul); + osic_WrFixed((float)heig, 1L, 1UL); + osi_WrStrLn("m ", 3ul); + } + + /* for (cz_1 = 15UL; cz_1<50; cz_1++) {anonym->rxbuf[cz_1]=0UL;} //fill in not relevant data with 0 + crc=crc16rev(anonym->rxbuf, 48UL); //calculate new checksum + anonym->rxbuf[49UL]=(crc&255UL); + anonym->rxbuf[48UL]=(crc>>8UL);*/ + for (cz_1 = 49UL; cz_1>1UL; cz_1--) {anonym->rxbuf[cz_1+5UL] = anonym->rxbuf[cz_1];} //move cells by 5 up + sendpils(m); //send data to sondemod + } + } + } + + if (anonym->rxp==48UL) { + anonym->bitlev0 = anonym->bitlev; + /* save quality before end of shortst frame */ + anonym->noise0 = anonym->noise; + } + anonym->rxbitc = 0UL; + } + } + } +} /* end demodbytepilot() */ + +static void demodbitpilot(uint32_t m, float u) +{ + char d; + float ua; + struct PILS * anonym; + d = u>=0.0f; + { /* with */ + struct PILS * anonym = &chan[m].pils; + demodbytepilot(m, d); + /*quality*/ + ua = (float)fabs(u)-anonym->bitlev; + anonym->bitlev = anonym->bitlev+ua*0.005f; + anonym->noise = anonym->noise+((float)fabs(ua)-anonym->noise)*0.02f; + } +/*quality*/ +} /* end demodbit41() */ + + +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +//----------------------------------------------------------------------------------------------------- +//PILOTSONDE +// +//----------------------------------------------------------------------------------------------------- +//----------------------------------------------------------------------------------------------------- + + +static void posrs41(const char b[], uint32_t b_len, uint32_t p) +{ + double dir; + double vu; + double ve; + double vn; + double vz; + double vy; + double vx; + double heig; + double long0; + double lat; + double z; + double y; + double x; + x = (double)getint32(b, b_len, p)*0.01; + y = (double)getint32(b, b_len, p+4UL)*0.01; + z = (double)getint32(b, b_len, p+8UL)*0.01; + wgs84r(x, y, z, &lat, &long0, &heig); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)(X2C_DIVL(lat,1.7453292519943E-2)), 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)(X2C_DIVL(long0,1.7453292519943E-2)), 5L, 1UL); + osi_WrStr(" ", 2ul); + osic_WrFixed((float)heig, 0L, 1UL); + osi_WrStr("m ", 3ul); + /*speed */ + vx = (double)getint16(b, b_len, p+12UL)*0.01; + vy = (double)getint16(b, b_len, p+14UL)*0.01; + vz = (double)getint16(b, b_len, p+16UL)*0.01; + vn = (-(vx*(double)osic_sin((float)lat)*(double) + osic_cos((float)long0))-vy*(double) + osic_sin((float)lat)*(double)osic_sin((float) + long0))+vz*(double)osic_cos((float)lat); + ve = -(vx*(double)osic_sin((float)long0))+vy*(double) + osic_cos((float)long0); + vu = vx*(double)osic_cos((float)lat)*(double) + osic_cos((float)long0)+vy*(double) + osic_cos((float)lat)*(double)osic_sin((float) + long0)+vz*(double)osic_sin((float)lat); + dir = X2C_DIVL(atang2(vn, ve),1.7453292519943E-2); + if (dir<0.0) dir = 360.0+dir; + osi_WrStr(" ", 2ul); + osic_WrFixed(osic_sqrt((float)(vn*vn+ve*ve))*3.6f, 1L, 1UL); + osi_WrStr("km/h ", 6ul); + osic_WrFixed((float)dir, 0L, 1UL); + osi_WrStr("deg ", 5ul); + osic_WrFixed((float)vu, 1L, 1UL); + osi_WrStr("m/s", 4ul); +} /* end posrs41() */ + + +static int32_t reedsolomon41(char buf[], uint32_t buf_len, + uint32_t len2) +{ + uint32_t i; + int32_t res1; + /*tb1, */ + int32_t res; + char b1[256]; + char b[256]; + uint32_t eraspos[24]; + uint32_t tmp; + for (i = 0UL; i<=255UL; i++) { + b[i] = 0; + b1[i] = 0; + } /* end for */ + tmp = len2; + i = 0UL; + if (i<=tmp) for (;; i++) { + b[230UL-i] = buf[i*2UL+56UL]; + b1[230UL-i] = buf[i*2UL+57UL]; + if (i==tmp) break; + } /* end for */ + for (i = 0UL; i<=23UL; i++) { + b[254UL-i] = buf[i+8UL]; + b1[254UL-i] = buf[i+32UL]; + } /* end for */ + /*tb1:=b; */ + res = decodersc(b, eraspos, 0L); + /*FOR i:=0 TO HIGH(b) DO */ + /*IF tb1[i]<>b[i] THEN WrHex(ORD(tb1[i]),4);WrHex(ORD(b[i]),4); + WrInt(i, 4); WrStr("=pos "); END; */ + /*END; */ + /*tb1:=b1; */ + res1 = decodersc(b1, eraspos, 0L); + /*FOR i:=0 TO HIGH(b) DO */ + /*IF tb1[i]<>b1[i] THEN WrHex(ORD(tb1[i]),4);WrHex(ORD(b1[i]),4); + WrInt(i, 4); WrStr("=pos1 "); END; */ + /*END; */ + if (res>0L && res<=12L) { + tmp = len2; + i = 0UL; + if (i<=tmp) for (;; i++) { + buf[i*2UL+56UL] = b[230UL-i]; + if (i==tmp) break; + } /* end for */ + for (i = 0UL; i<=23UL; i++) { + buf[i+8UL] = b[254UL-i]; + } /* end for */ + } + if (res1>0L && res1<=12L) { + tmp = len2; + i = 0UL; + if (i<=tmp) for (;; i++) { + buf[i*2UL+57UL] = b1[230UL-i]; + if (i==tmp) break; + } /* end for */ + for (i = 0UL; i<=23UL; i++) { + buf[i+32UL] = b1[254UL-i]; + } /* end for */ + } + if (res<0L || res1<0L) return -1L; + else return res+res1; + return 0; +} /* end reedsolomon41() */ + +static uint16_t sondeudp_POLYNOM0 = 0x1021U; + + +static void decode41(uint32_t m) +{ + uint32_t try0; + uint32_t posok; + uint32_t nameok; + uint32_t len; + uint32_t p; + uint32_t i; + char ch; + char typ; + char aux; + char allok; + int32_t repl; + int32_t corr; + struct R41 * anonym; + uint32_t tmp; + { /* with */ + struct R41 * anonym = &chan[m].r41; + try0 = 0UL; + do { + allok = 1; + nameok = 0UL; + posok = 0UL; + corr = 0L; + repl = 0L; + if (try0>0UL) { + if (try0>1UL) { + for (i = 0UL; i<=519UL; i++) { + if (anonym->fixcnt[i]>=10U) { + /* replace stable bytes */ + anonym->rxbuf[i] = anonym->fixbytes[i]; + ++repl; + } + } /* end for */ + } + corr = reedsolomon41(anonym->rxbuf, 520ul, 131UL); + /* try short frame */ + if (corr<0L) { + corr = reedsolomon41(anonym->rxbuf, 520ul, 230UL); + /* may bo long frame */ + } + } + p = 57UL; + aux = 0; + for (;;) { + if (p+4UL>=519UL) break; + typ = anonym->rxbuf[p]; + ++p; + len = (uint32_t)(uint8_t)anonym->rxbuf[p]+2UL; + ++p; + if (p+len>=519UL) break; + /* + WrStrLn(""); + FOR i:=0 TO len+1 DO WrHex(ORD(rxbuf[p+i-2]),3) ; + IF i MOD 16=15 THEN WrStrLn(""); END; END; + WrStrLn(""); + */ + if (!crcrs(anonym->rxbuf, 520ul, (int32_t)p, + (int32_t)(p+len))) { + /* crc error */ + allok = 0; + break; + } + if (verb2) { + osi_WrStrLn("", 1ul); + osi_WrStrLn("", 1ul); + osi_WrStr("start ID length data... crc [", 30ul); + osi_WrHex((p-2UL)/256UL, 0UL); + osi_WrHex(p-2UL, 3UL); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[p-2UL], 3UL); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[p-1UL], 0UL); + osi_WrStrLn("]", 2ul); + tmp = len-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[p+i], 3UL); + if ((i&15UL)==15UL) osi_WrStrLn("", 1ul); + if (i==tmp) break; + } /* end for */ + osi_WrStrLn("", 1ul); + osi_WrStrLn("", 1ul); + } + tmp = (p+len)-1UL; + i = p-2UL; + if (i<=tmp) for (;; i++) { + /* update fixbyte statistics */ + if (anonym->fixbytes[i]==anonym->rxbuf[i]) { + if (anonym->fixcnt[i]<255U) ++anonym->fixcnt[i]; + } + else { + anonym->fixbytes[i] = anonym->rxbuf[i]; + anonym->fixcnt[i] = 0U; + } + if (i==tmp) break; + } /* end for */ + if (typ=='y') nameok = p; + else if (typ=='{') { + /* ELSIF typ=CHR(7AH) THEN */ + /* WrStrLn("7A frame"); */ + /* ELSIF typ=CHR(7CH) THEN */ + /* WrStrLn("7C frame"); */ + /*WrInt(getint32(rxbuf, p+2) DIV 1000 MOD 86400 , 10); + WrStr("=gpstime "); */ + /* ELSIF typ=CHR(7DH) THEN */ + /* WrStrLn("7D frame"); */ + posok = p; + } + else if (typ=='~') aux = 1; + /* ELSIF typ=CHR(76H) THEN */ + /* WrStrLn("76 frame"); */ + /* ELSE EXIT END; */ + /* WrInt(getint16(rxbuf, 3BH), 0); */ + /* WrStr(" ");WrHex(ORD(typ), 0);WrStr(" "); + WrHex(p DIV 256, 0);WrHex(p, 0); */ + /* WrStr(" "); */ + if (typ=='v') break; + p += len; + } + ++try0; + } while (!(allok || try0>2UL)); + if (verb && nameok>0UL) { + if (maxchannels>0UL) { + osic_WrINT32(m+1UL, 1UL); + osi_WrStr(":", 2ul); + } + osi_WrStr("R41 ", 5ul); + for (i = 0UL; i<=7UL; i++) { + ch = anonym->rxbuf[nameok+2UL+i]; + if ((uint8_t)ch>' ' && (uint8_t)ch<'\177') { + osi_WrStr((char *) &ch, 1u/1u); + } + } /* end for */ + osi_WrStr(" ", 2ul); + osic_WrINT32((uint32_t)getint16(anonym->rxbuf, 520ul, nameok), + 1UL); + if (posok>0UL) posrs41(anonym->rxbuf, 520ul, posok); + if (anonym->rxbuf[nameok+23UL]==0) { + osi_WrStr(" ", 2ul); + osic_WrFixed((float)(getcard16(anonym->rxbuf, 520ul, + nameok+26UL)/64UL+40000UL)*0.01f, 2L, 1UL); + osi_WrStr("MHz", 4ul); + } + if (aux) osi_WrStr(" +Aux", 6ul); + if (!((allok || posok>0UL) || aux)) { + osi_WrStr(" ---- crc err ", 16ul); + } + WrdB(chan[m].adcmax); + WrQ(anonym->bitlev0, anonym->noise0); + /*WrStrLn(""); */ + /*FOR i:=0 TO HIGH(rxbuf) DO WrHex(ORD(rxbuf[i]),3) ; + IF i MOD 16=15 THEN WrStrLn(""); END; END; */ + if (repl>0L) { + osi_WrStr(" x", 3ul); + osic_WrINT32((uint32_t)repl, 1UL); + } + if (corr<0L) osi_WrStr(" -R", 4ul); + else if (corr>0L) { + osi_WrStr(" +", 3ul); + osic_WrINT32((uint32_t)corr, 1UL); + osi_WrStr("R", 2ul); + } + Wrtune(chan[m].adcdc, chan[m].adcmax); + osi_WrStrLn("", 1ul); + } + } + if (nameok>0UL) sendrs41(m); +} /* end decode41() */ + +#define sondeudp_MAXHEADERR 4 + +static uint8_t _cnst[64] = {150U,131U,62U,81U,177U,73U,8U,152U,50U,5U,89U, + 14U,249U,68U,198U,38U,33U,96U,194U,234U,121U,93U,109U,161U, + 84U,105U,71U,12U,220U,232U,92U,241U,247U,118U,130U,127U,7U, + 153U,162U,44U,147U,124U,48U,99U,245U,16U,46U,97U,208U,188U, + 180U,182U,6U,170U,244U,35U,120U,110U,59U,174U,191U,123U,76U, + 193U}; + +static void demodbyte41(uint32_t m, char d) +{ + uint32_t j; + uint32_t i; + uint32_t revc; + uint32_t normc; + /*WrStr(CHR(ORD(d)+48)); */ + struct R41 * anonym; + { /* with */ + struct R41 * anonym = &chan[m].r41; + if (anonym->rxp==0UL) { + anonym->synbuf[anonym->synp] = d; + i = anonym->synp; + ++anonym->synp; + if (anonym->synp>63UL) anonym->synp = 0UL; + j = 56UL; + normc = 0UL; + revc = 0UL; + do { + --j; + if (("0000100001101101010100111000100001000100011010010100100000011111"[j]=='1')==anonym->synbuf[i]) ++normc; + else ++revc; + if (i==0UL) i = 63UL; + else --i; + } while (!(j==24UL || normc>4UL && revc>4UL)); + anonym->headok = normc==0UL || revc==0UL; + anonym->rev = normcrxp = 7UL; + anonym->rxbitc = 0UL; + } + else { + anonym->rxbyte = anonym->rxbyte/2UL+128UL*(uint32_t) + (d!=anonym->rev); + ++anonym->rxbitc; + if (anonym->rxbitc>=8UL) { + anonym->rxbuf[anonym->rxp] = (char)((uint8_t) + anonym->rxbyte^(uint8_t)_cnst[anonym->rxp&63UL]); + ++anonym->rxp; + if (anonym->rxp>=519UL) { + decode41(m); + anonym->rxp = 0UL; + } + if (anonym->rxp==200UL) { + anonym->bitlev0 = anonym->bitlev; + /* save quality before end of shortst frame */ + anonym->noise0 = anonym->noise; + } + anonym->rxbitc = 0UL; + } + } + } +} /* end demodbyte41() */ + + +static void demodbit41(uint32_t m, float u) +{ + char d; + float ua; + struct R41 * anonym; + d = u>=0.0f; + { /* with */ + struct R41 * anonym = &chan[m].r41; + demodbyte41(m, d); + /*quality*/ + ua = (float)fabs(u)-anonym->bitlev; + anonym->bitlev = anonym->bitlev+ua*0.005f; + anonym->noise = anonym->noise+((float)fabs(ua)-anonym->noise)*0.02f; + } +/*quality*/ +} /* end demodbit41() */ + +/*------------------------------ RS92 */ +/* +PROCEDURE stobyte92(m:CARDINAL; b:CHAR); +VAR e:SET8; +BEGIN + WITH chan[m].r92 DO + rxbuf[rxp]:=b; + IF rxp<5 THEN + e:=CAST(SET8, b)/CAST(SET8, 2AH); + WHILE e<>SET8{} DO + IF e*SET8{0}<>SET8{} THEN INC(headerrs) END; + e:=SHIFT(e, -1); + END; + IF headerrs>rxp THEN (* allow 0 bit errors on first byte *) + headerrs:=0; + rxp:=0; + ELSE INC(rxp) END; + ELSE INC(rxp) END; + IF rxp>=240 THEN + headerrs:=0; + rxp:=0; + decodeframe92(m); + END; + END; +END stobyte92; +*/ + +static void stobyte92(uint32_t m, char b) +{ + struct R92 * anonym; + { /* with */ + struct R92 * anonym = &chan[m].r92; + anonym->rxbuf[anonym->rxp] = b; + if (anonym->rxp>=5UL || b=='*') ++anonym->rxp; + else anonym->rxp = 0UL; + if (anonym->rxp>=240UL) { + anonym->rxp = 0UL; + decodeframe92(m); + } + } +} /* end stobyte92() */ + + +static void demodbyte92(uint32_t m, char d) +{ + uint32_t maxi; + uint32_t i; + int32_t max0; + int32_t n; + struct R92 * anonym; + { /* with */ + struct R92 * anonym = &chan[m].r92; + anonym->rxbyte = anonym->rxbyte/2UL+256UL*(uint32_t)d; + max0 = 0L; + maxi = 0UL; + for (i = 0UL; i<=9UL; i++) { + n = anonym->asynst[i]-anonym->asynst[(i+1UL)%10UL]; + if (labs(n)>labs(max0)) { + max0 = n; + maxi = i; + } + } /* end for */ + if (anonym->rxbitc==maxi) { + if (max0<0L) { + anonym->rxbyte = (uint32_t)((uint32_t)anonym->rxbyte^0xFFUL); + } + stobyte92(m, (char)(anonym->rxbyte&255UL)); + } + if (d) { + anonym->asynst[anonym->rxbitc] + += (32767L-anonym->asynst[anonym->rxbitc])/16L; + } + else { + anonym->asynst[anonym->rxbitc] + -= (32767L+anonym->asynst[anonym->rxbitc])/16L; + } + anonym->rxbitc = (anonym->rxbitc+1UL)%10UL; + } +/*FOR i:=0 TO HIGH(asynst) DO WrInt(asynst[i], 8) END; WrStrLn(""); */ +} /* end demodbyte92() */ + + +static void demodbit92(uint32_t m, float u, float u0) +{ + char d; + float ua; + struct R92 * anonym; + d = u>=u0; + { /* with */ + struct R92 * anonym = &chan[m].r92; + if (anonym->lastmanch==u0<0.0f) { + anonym->manchestd += (32767L-anonym->manchestd)/16L; + } + anonym->lastmanch = d; + anonym->manchestd = -anonym->manchestd; + /*WrInt(manchestd,8); */ + if (anonym->manchestd<0L) { + demodbyte92(m, d); + /*WrInt(VAL(INTEGER, u0*0.001), 4); WrStr("/"); + WrInt(VAL(INTEGER, u*0.001), 0); */ + /*quality*/ + ua = (float)fabs(u-u0)-anonym->bitlev; + anonym->bitlev = anonym->bitlev+ua*0.005f; + anonym->noise = anonym->noise+((float)fabs(ua)-anonym->noise)*0.02f; + } + } +/*quality*/ +} /* end demodbit92() */ + + +static void demod92(float u, uint32_t m) +{ + char d; + struct R92 * anonym; + { /* with */ + struct R92 * anonym = &chan[m].r92; + d = u>=0.0f; + if (anonym->cbit) { + if (anonym->enabled) demodbit92(m, u, anonym->lastu); + if (d!=anonym->oldd) { + if (d==anonym->plld) anonym->baudfine += anonym->pllshift; + else anonym->baudfine -= anonym->pllshift; + anonym->oldd = d; + } + anonym->lastu = u; + } + else anonym->plld = d; + anonym->cbit = !anonym->cbit; + } +} /* end demod92() */ + + +static void demod41(float u, uint32_t m) +{ + char d; + struct R41 * anonym; + { /* with */ + struct R41 * anonym = &chan[m].r41; + d = u>=0.0f; + if (anonym->cbit) { + if (chan[m].r41.enabled) demodbit41(m, u); + if (d!=anonym->oldd) { + if (d==anonym->plld) anonym->baudfine += anonym->pllshift; + else anonym->baudfine -= anonym->pllshift; + anonym->oldd = d; + } + anonym->lastu = u; + } + else anonym->plld = d; + anonym->cbit = !anonym->cbit; + } +} /* end demod41() */ + + +static void demodPS(float u, uint32_t m) +{ + char d; + struct PILS * anonym; + { /* with */ + struct PILS * anonym = &chan[m].pils; + d = u>=0.0f; + if (anonym->cbit) { + if (chan[m].pils.enabled) demodbitpilot(m, u); + if (d!=anonym->oldd) { + if (d==anonym->plld) anonym->baudfine += anonym->pllshift; + else anonym->baudfine -= anonym->pllshift; + anonym->oldd = d; + } + anonym->lastu = u; + } + else anonym->plld = d; + anonym->cbit = !anonym->cbit; + } +} /* end demodPS() */ + + + + +static void Fsk(uint32_t m) +{ + float ff; + int32_t lim; + struct R92 * anonym; + { /* with */ + struct R92 * anonym = &chan[m].r92; + lim = (int32_t)anonym->demodbaud; + for (;;) { + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + //static float Fir(uint32_t in, uint32_t sub, uint32_t step, float fir[], uint32_t fir_len, float firtab[], uint32_t firtab_len) + ff = Fir(afin, (uint32_t)((anonym->baudfine&65535L)/4096L),16UL, chan[m].afir, 32ul, anonym->afirtab, 512ul); + demod92(ff, m); + } + anonym->baudfine += lim; + lim = 0L; + if (anonym->baudfine<131072L) break; + } + } +} /* end Fsk() */ + + +static void Fsk41(uint32_t m) +{ + float ff; + int32_t lim; + struct R41 * anonym; + { /* with */ + struct R41 * anonym = &chan[m].r41; + lim = (int32_t)anonym->demodbaud; + for (;;) { + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + ff = Fir(afinR41, (uint32_t)((anonym->baudfine&65535L)/4096L),16UL, chan[m].afir, 32ul, anonym->afirtab, 512ul); + demod41(ff, m); + } + anonym->baudfine += lim; + lim = 0L; + if (anonym->baudfine<131072L) break; + } + } +} /* end Fsk() */ + + + +static void FskPS(uint32_t m) +{ + float ff; + int32_t lim; + struct PILS * anonym; + { /* with */ + struct PILS * anonym = &chan[m].pils; + lim = (int32_t)anonym->demodbaud; + for (;;) { + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + ff = Fir(afinPS, (uint32_t)((anonym->baudfine&65535L)/4096L),16UL, chan[m].afir, 32ul, anonym->afirtab, 512ul); + demodPS(ff, m); + } + anonym->baudfine += lim; + lim = 0L; + if (anonym->baudfine<131072L) break; + } + } +} /* end Fsk() */ + + + +/*------------------------------ DFM06 */ + +static void deinterleave(const char b[], uint32_t b_len, + uint32_t base, uint32_t len, char db[], + uint32_t db_len) +{ + uint32_t j; + uint32_t i; + uint32_t tmp; + for (j = 0UL; j<=7UL; j++) { + tmp = len-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + db[i*8UL+j] = b[base+len*j+i]; + if (i==tmp) break; + } /* end for */ + } /* end for */ +} /* end deinterleave() */ + + +static char hamcorr(char b[], uint32_t b_len, uint32_t d, + uint32_t h) +{ + uint32_t e; + e = (uint32_t)((b[d]==b[d+2UL])!=(b[h]==b[h+2UL]))+2UL*(uint32_t) + ((b[d+1UL]==b[d+2UL])!=(b[h+1UL]==b[h+2UL]))+4UL*(uint32_t) + ((b[d+3UL]==b[h])!=(b[h+1UL]==b[h+2UL])); + /* hamming matrix multiplication */ + if (e>4UL) b[(h+e)-4UL] = !b[(h+e)-4UL]; + else if (e>0UL) b[(d+e)-1UL] = !b[(d+e)-1UL]; + /* IF e<>0 THEN WrStr("<");WrInt(e, 1);WrStr(">") END; */ + e = (uint32_t)b[d]+(uint32_t)b[d+1UL]+(uint32_t) + b[d+2UL]+(uint32_t)b[d+3UL]+(uint32_t)b[h]+(uint32_t) + b[h+1UL]+(uint32_t)b[h+2UL]+(uint32_t)b[h+3UL]; + return !(e&1); +/* 1 bit checksum */ +} /* end hamcorr() */ + + +static char hamming(const char b[], uint32_t b_len, + uint32_t len, char db[], uint32_t db_len) +{ + uint32_t j; + uint32_t i; + uint32_t tmp; + tmp = db_len-1; + i = 0UL; + if (i<=tmp) for (;; i++) { + db[i] = 0; + if (i==tmp) break; + } /* end for */ + tmp = len-1UL; + i = 0UL; + if (i<=tmp) for (;; i++) { + for (j = 0UL; j<=3UL; j++) { + db[i*4UL+j] = b[i*8UL+j]; + } /* end for */ + for (j = 0UL; j<=3UL; j++) { + db[i*4UL+j+len*4UL] = b[i*8UL+j+4UL]; + } /* end for */ + if (!hamcorr(db, db_len, i*4UL, i*4UL+len*4UL)) return 0; + if (i==tmp) break; + } /* end for */ + return 1; +/* +0000 0000 +0001 1110 +0010 1101 +0011 0011 +0100 1011 +0101 0101 +0110 0110 +0111 1000 +1000 0111 +1001 1001 +1010 1010 +1011 0100 +1100 1100 +1101 0010 +1110 0001 +1111 1111 +*/ +} /* end hamming() */ + + +static uint32_t bits2val_org(const char b[], uint32_t b_len, uint32_t from, uint32_t len) +{ + uint32_t n; + n = 0UL; + while (len>0UL) { + n = n*2UL+(uint32_t)b[from]; + ++from; + --len; + } + return n; +} /* end bits2val() */ + +/* +static void wh(uint32_t x) +{ + char tmp; + x = x&15UL; + if (x<10UL) osi_WrStr((char *)(tmp = (char)(x+48UL),&tmp), 1u/1u); + else osi_WrStr((char *)(tmp = (char)(x+55UL),&tmp), 1u/1u); +} +*/ +/* end wh() */ + +#define B 8 // codeword: 8 bit +#define S 4 // davon 4 bit data + +char dat_str[9][13+1]; + +uint8_t H[4][8] = // Parity-Check + {{ 0, 1, 1, 1, 1, 0, 0, 0}, + { 1, 0, 1, 1, 0, 1, 0, 0}, + { 1, 1, 0, 1, 0, 0, 1, 0}, + { 1, 1, 1, 0, 0, 0, 0, 1}}; +uint8_t He[8] = { 0x7, 0xB, 0xD, 0xE, 0x8, 0x4, 0x2, 0x1}; // Spalten von H: + + +uint32_t bits2val(uint8_t *bits, int len) { // big endian + int j; + uint32_t val; + if ((len < 0) || (len > 32)) return -1; + val = 0; + for (j = 0; j < len; j++) { + val |= (bits[j] << (len-1-j)); + } + return val; +} +/* + +void deinterleave(char *str, int L, uint8_t *block) { + int i, j; + for (j = 0; j < B; j++) { // L = 7, 13 + for (i = 0; i < L; i++) { + if (str[L*j+i] >= 0x30 && str[L*j+i] <= 0x31) { + block[B*i+j] = str[L*j+i] - 0x30; // ASCII -> bit + } + } + } +} +*/ +int check(uint8_t code[8]) { + int i, j; // Bei Demodulierung durch Nulldurchgaenge, wenn durch Fehler ausser Takt, + uint32_t synval = 0; // verschieben sich die bits. Fuer Hamming-Decode waere es besser, + uint8_t syndrom[4]; // sync zu Beginn mit Header und dann Takt beibehalten fuer decision. + int ret=0; + + for (i = 0; i < 4; i++) { // S = 4 + syndrom[i] = 0; + for (j = 0; j < 8; j++) { // B = 8 + syndrom[i] ^= H[i][j] & code[j]; + } + } + synval = bits2val(syndrom, 4); + if (synval) { + ret = -1; + for (j = 0; j < 8; j++) { // 1-bit-error + if (synval == He[j]) { // reicht auf databits zu pruefen, d.h. + ret = j+1; // (systematischer Code) He[0..3] + break; + } + } + } + else ret = 0; + if (ret > 0) code[ret-1] ^= 0x1; + + return ret; +} + + +char nib2chr(uint8_t nib) { + char c = '_'; + if (nib < 0x10) { + if (nib < 0xA) c = 0x30 + nib; + else c = 0x41 + nib-0xA; + } + return c; +} + +int dat_out(uint8_t *dat_bits,uint32_t m) { + int i, ret = 0; + static int fr_id; + // int jahr = 0, monat = 0, tag = 0, std = 0, min = 0; + int frnr = 0; + int msek = 0; + double lat = 0, lon = 0, alt = 0; + int nib; + int dvv; // signed/unsigned 16bit + + fr_id = bits2val(dat_bits+48, 4); + + + if (fr_id >= 0 && fr_id <= 8) { + for (i = 0; i < 13; i++) { + nib = bits2val(dat_bits+4*i, 4); + dat_str[fr_id][i] = nib2chr(nib); + } + dat_str[fr_id][13] = '\0'; + } + + if (fr_id == 0) { +// chan[m].dfm6.start = 1; + frnr = bits2val(dat_bits+24, 8); + chan[m].dfm6.frnr = frnr; + } + + if (fr_id == 1) { + // 00..31: ? GPS-Sats in Sicht? + msek = bits2val(dat_bits+32, 16); + chan[m].dfm6.sek = msek/1000.0; + } + + if (fr_id == 2) { + lat = bits2val(dat_bits, 32); + lat=lat/1e7; + chan[m].dfm6.newlat = lat; + dvv = (short)bits2val(dat_bits+32, 16); // (short)? zusammen mit dir sollte unsigned sein + chan[m].dfm6.horiV = dvv/1e2; + } + + if (fr_id == 3) { + lon = bits2val(dat_bits, 32); + lon = lon/1e7; + chan[m].dfm6.newlon = lon; + dvv = bits2val(dat_bits+32, 16) & 0xFFFF; // unsigned + chan[m].dfm6.dir = dvv/1e2; + } + + if (fr_id == 4) { + alt = bits2val(dat_bits, 32); + alt = alt/1e2; + chan[m].dfm6.newalt = alt; + dvv = (short)bits2val(dat_bits+32, 16); // signed + chan[m].dfm6.vertV = dvv/1e2; + } + + if (fr_id == 5) { + } + + if (fr_id == 6) { + } + + if (fr_id == 7) { + } + + if (fr_id == 8) { + chan[m].dfm6.yr = bits2val(dat_bits, 12); + chan[m].dfm6.mon = bits2val(dat_bits+12, 4); + chan[m].dfm6.day = bits2val(dat_bits+16, 5); + chan[m].dfm6.hr = bits2val(dat_bits+21, 5); + chan[m].dfm6.min = bits2val(dat_bits+26, 6); + + if(chan[m].dfm6.newsonde==1){ // gdy nowa, przypisujemy jak leci + chan[m].dfm6.prevlat = chan[m].dfm6.newlat; + chan[m].dfm6.prevlon = chan[m].dfm6.newlon; + chan[m].dfm6.prevalt = chan[m].dfm6.newalt; + chan[m].dfm6.newsonde=0; + ret=-2; // dane niepewne, więc oznaczamy jako bledne (z jednej ramki, nikomu korona nie spadnie a i tak czekamy na symbol sondy) + } + + if(chan[m].dfm6.newalt<1 || chan[m].dfm6.newalt >50000 || // gdy za duży błąd z usrednionych danych + (fabs(chan[m].dfm6.prevlat-chan[m].dfm6.newlat)>0.1)|| + (fabs(chan[m].dfm6.prevlon-chan[m].dfm6.newlon)>0.1)|| + (abs(chan[m].dfm6.prevalt-chan[m].dfm6.newalt)>500)) + ret=-2; // dane bledne + else + ret = fr_id; + + chan[m].dfm6.prevlat = (chan[m].dfm6.newlat + chan[m].dfm6.lat)/2; // usrednianie poprzednich i obecnych danych + chan[m].dfm6.prevlon = (chan[m].dfm6.newlon + chan[m].dfm6.lon)/2; + chan[m].dfm6.prevalt = (chan[m].dfm6.newalt + chan[m].dfm6.alt)/2; + + chan[m].dfm6.lat = chan[m].dfm6.newlat; // odebrane jako aktualne + chan[m].dfm6.lon = chan[m].dfm6.newlon; + chan[m].dfm6.alt = chan[m].dfm6.newalt; + + } + + return ret; +} + +// DFM-06 (NXP8) +float fl20(int d) { // float20 + int val, p; + float f; + p = (d>>16) & 0xF; + val = d & 0xFFFF; + f = val/(float)(1<> 16) & 0xF; + f = m / pow(2,e); + return f; +} +*/ + +// DFM-09 (STM32) +float fl24(int d) { // float24 + int val, p; + float f; + p = (d>>20) & 0xF; + val = d & 0xFFFFF; + f = val/(float)(1< 0 ? + float T = 0; // T/Kelvin + if (R > 0) T = 1/(1/T0 + 1/BB0 * log(R/R0)); + return T - 273.15; // Celsius +// DFM-06: meas20 * 16 = meas24 +// -> (meas24[0]-meas24[3])/meas24[4]=(meas20[0]-meas20[3])/meas20[4] +} + +// temperature approximation +float get_Temp2(float *meas) { // meas[0..4] +// NTC-Thermistor EPCOS B57540G0502 +// R/T No 8402, R25=Ro=5k +// B0/100=3450 +// 1/T = 1/To + 1/B log(r) , r=R/Ro +// GRAW calibration data -80C..+40C on EEPROM ? +// meas0 = g*(R+Rs)+ofs +// meas3 = g*Rs+ofs , Rs: dfm6:10k, dfm9:20k +// meas4 = g*Rf+ofs , Rf=220k + float f = meas[0], + f1 = meas[3], + f2 = meas[4]; + float BB0 = 3260.0; // B/Kelvin, fit -55C..+40C + float T0 = 25 + 273.15; // t0=25C + float R0 = 5.0e3; // R0=R25=5k + float Rf2 = 220e3; // Rf2 = Rf = 220k + float g_o = f2/Rf2; // approx gain + float Rs_o = f1/g_o; // = Rf2 * f1/f2; + float Rf1 = Rs_o; // Rf1 = Rs: dfm6:10k, dfm9:20k + float g = g_o; // gain + float Rb = 0.0; // offset + float R = 0; // thermistor + float T = 0; // T/Kelvin + + if ( 8e3 < Rs_o && Rs_o < 12e3) Rf1 = 10e3; // dfm6 + else if (18e3 < Rs_o && Rs_o < 22e3) Rf1 = 20e3; // dfm9 + g = (f2 - f1) / (Rf2 - Rf1); + Rb = (f1*Rf2-f2*Rf1)/(f2-f1); // ofs/g + + R = (f-f1)/g; // meas[0,3,4] > 0 ? + if (R > 0) T = 1/(1/T0 + 1/BB0 * log(R/R0)); + +// if (option_ptu && option_verbose == 2) { + printf(" (Rso: %.1f , Rb: %.1f)", Rs_o/1e3, Rb/1e3); +// } + + return T - 273.15; +// DFM-06: meas20 * 16 = meas24 +} + + +#define SNbit 0x0100 +int conf_out(uint8_t *conf_bits,uint32_t m) { + int conf_id; + int ret = 0; + int val, hl; + static int chAbit, chA[2]; + uint32_t SN6, SN9; + + conf_id = bits2val(conf_bits, 4); + + //if (conf_id > 6) chan[m].dfm6.SN6 = 0; //// gpx.sonde_typ & 0xF = 9; // SNbit? + + if ((chan[m].dfm6.sonde_typ & 0xFF) < 9 && conf_id == 6) { + SN6 = bits2val(conf_bits+4, 4*6); // DFM-06: Kanal 6 + if ( SN6 == chan[m].dfm6.SN6 ) { // nur Nibble-Werte 0..9 + chan[m].dfm6.sonde_typ = SNbit | 6; + ret = 6; + } + else { + chan[m].dfm6.sonde_typ = 0; + } + chan[m].dfm6.SN6 = SN6; + } + if (conf_id == 0xA) { // 0xACxxxxy + val = bits2val(conf_bits+8, 4*5); + hl = (val & 1) == 0; + chA[hl] = (val >> 4) & 0xFFFF; + chAbit |= 1 << hl; + if (chAbit == 3) { // DFM-09: Kanal A + SN9 = (chA[1] << 16) | chA[0]; + if ( SN9 == chan[m].dfm6.SN9 ) { + chan[m].dfm6.sonde_typ = SNbit | 9; + ret = 9; + } + else { + chan[m].dfm6.sonde_typ = 0; + } + chan[m].dfm6.SN9 = SN9; + chAbit = 0; + } + } + + if (conf_id >= 0 && conf_id <= 4) { + val = bits2val(conf_bits+4, 4*6); + chan[m].dfm6.meas24[conf_id] = fl24(val); + // DFM-09 (STM32): 24bit 0exxxxx + // DFM-06 (NXP8): 20bit 0exxxx0 + // fl20(bits2val(conf_bits+4, 4*5)) + // = fl20(exxxx) + // = fl24(exxxx0)/2^4 + // meas20 * 16 = meas24 + } + + // STM32-status: Bat, MCU-Temp + if ((chan[m].dfm6.sonde_typ & 0xFF) == 9) { // DFM-09 (STM32) + if (conf_id == 0x5) { // voltage + val = bits2val(conf_bits+8, 4*4); + chan[m].dfm6.status[0] = val/1000.0; + } + if (conf_id == 0x6) { // T-intern (STM32) + val = bits2val(conf_bits+8, 4*4); + chan[m].dfm6.status[1] = val/100.0; + } + } + + return ret; +} + +void print_gpx(uint32_t m) { + int i, j; + char typp; + + if (chan[m].dfm6.sonde_typ & SNbit) + { + if ((chan[m].dfm6.sonde_typ & 0xFF) == 6) { + sprintf(chan[m].dfm6.id,"D6%06X", chan[m].dfm6.SN6); + typp='6'; + } + if ((chan[m].dfm6.sonde_typ & 0xFF) == 9) { + sprintf(chan[m].dfm6.id,"D9%06u", chan[m].dfm6.SN9); + typp='9'; + } + chan[m].dfm6.sonde_typ ^= SNbit; + } + + if((chan[m].dfm6.id[0]!='D')||(chan[m].dfm6.id[1]!='6')&&(chan[m].dfm6.id[1]!='9')) + chan[m].dfm6.id[0]=0; + + printf("%d:DFM %s ",m+1,chan[m].dfm6.id+2); + printf("[%3d] ", chan[m].dfm6.frnr); + printf("lat: %.6f ", chan[m].dfm6.lat); + printf("lon: %.6f ", chan[m].dfm6.lon); + printf("alt: %.1f ", chan[m].dfm6.alt); + printf("vH: %5.2f ", chan[m].dfm6.horiV); + printf("D: %5.1f ", chan[m].dfm6.dir); + printf("vV: %5.2f ", chan[m].dfm6.vertV); + float t = get_Temp(chan[m].dfm6.meas24); + if (t > -270.0) printf("T=%.1fC ", t); + if ((chan[m].dfm6.sonde_typ & 0xFF) == 9) { + printf("U: %.2fV ", chan[m].dfm6.status[0]); + printf("Ti: %.2fC ", chan[m].dfm6.status[1]-270.0); + } + printf("\n"); +} + +static char sendDFM(uint32_t m){ + char s[200]; + char tmp[50]; + char ret=0; + s[0]=0; + if (strlen(chan[m].dfm6.id)>5){ + if ((chan[m].dfm6.sonde_typ & 0xFF) == 6) + sprintf(tmp,"D6%08X", chan[m].dfm6.SN6); + if ((chan[m].dfm6.sonde_typ & 0xFF) == 9) + sprintf(tmp,"D9%08u", chan[m].dfm6.SN9); + tmp[10]=0; + strcat(s,tmp); + + sprintf(tmp,"%04d", chan[m].dfm6.frnr); + tmp[4]=0; + strcat(s,tmp); + sprintf(tmp,"%08.0f", chan[m].dfm6.lat*1000000); + tmp[8]=0; + strcat(s,tmp); + sprintf(tmp,"%09.0f", chan[m].dfm6.lon*1000000); + tmp[9]=0; + strcat(s,tmp); + sprintf(tmp,"%05.0f", chan[m].dfm6.alt); + tmp[5]=0; + strcat(s,tmp); + sprintf(tmp,"%05.0f", chan[m].dfm6.horiV*100); + tmp[5]=0; + strcat(s,tmp); + sprintf(tmp,"%04.0f", chan[m].dfm6.dir*10); + tmp[4]=0; + strcat(s,tmp); + sprintf(tmp,"%05.0f", chan[m].dfm6.vertV*100); + tmp[5]=0; + strcat(s,tmp); + + tmp[0] = chan[m].freq[0]; + tmp[1] = chan[m].freq[1]; + tmp[2] = chan[m].freq[2]; + tmp[3] = chan[m].freq[3]; + tmp[4] = chan[m].freq[4]; + tmp[5] = chan[m].freq[5]; + tmp[6] = 0; + strcat(s,tmp); + + float t = get_Temp(chan[m].dfm6.meas24); + if (t > -270.0) sprintf(tmp,"%04.0f", (t+273)*10); + else sprintf(tmp,"0000"); + strcat(s,tmp); + + if ((chan[m].dfm6.sonde_typ & 0xFF) == 9) { + sprintf(tmp,"%04.0f", chan[m].dfm6.status[0]*100); // u + tmp[4]=0; + strcat(s,tmp); + sprintf(tmp,"%05.0f", chan[m].dfm6.status[1]*100); // t + tmp[5]=0; + strcat(s,tmp); + } + else sprintf(tmp,"000000000"); + strcat(s,tmp); + sprintf(tmp,"%4d%02d%02d%02d%02d%02.0f",chan[m].dfm6.yr, chan[m].dfm6.mon, chan[m].dfm6.day, chan[m].dfm6.hr, chan[m].dfm6.min, chan[m].dfm6.sek); + + tmp[16]=0; + strcat(s,tmp); + + alludp(chan[m].udptx, 88, s, 88); + + } + + return ret; +} + +static void decodeframe6(uint32_t m) +{ + uint32_t j; + uint32_t i; + uint32_t rt; + + char ret0,ret1,ret2; + + int frid = -1; + + char s[101+6]; + char tx; + struct DFM6 * anonym; + /* build tx frame */ + struct DFM6 * anonym0; + struct CHAN * anonym1; /* my call if set */ + { /* with */ + struct DFM6 * anonym = &chan[m].dfm6; + deinterleave(anonym->rxbuf, 264ul, 0UL, 7UL, anonym->ch, 56ul); + deinterleave(anonym->rxbuf, 264ul, 56UL, 13UL, anonym->dh1, 104ul); + deinterleave(anonym->rxbuf, 264ul, 160UL, 13UL, anonym->dh2, 104ul); + + ret0=hamming(anonym->dh1, 104ul, 13UL, anonym->db1, 104ul); + ret1=hamming(anonym->dh2, 104ul, 13UL, anonym->db2,104ul); + ret2=hamming(anonym->ch, 56ul, 7UL, anonym->cb, 56ul); + + if((osic_time()-anonym->lastsent)>600){ //gdy za dlugo nie bylo ramki, kasowanie i liczenie od nowa + chan[m].dfm6.newsonde=1; + anonym->lastsent=osic_time(); + chan[m].dfm6.id[0]=0; + } + if(ret2>0) + conf_out(anonym->cb,m); + if(ret0>0){ + frid = dat_out(anonym->db1,m); + if (frid == 8){ + anonym->lastsent=osic_time(); + print_gpx(m); + sendDFM(m); + } + else if(frid==-2){ + printf("ERR:"); + print_gpx(m); + } + } + if(ret1>0){ + frid = dat_out(anonym->db2,m); + if (frid == 8){ + anonym->lastsent=osic_time(); + print_gpx(m); + sendDFM(m); + } + else if(frid==-2){ + printf("ERR:"); + print_gpx(m); + } + + } + + } +} /* end decodeframe6() */ + + +static void demodbyte6(uint32_t m, char d) +{ + /* WrInt(ORD(d),1); */ + struct DFM6 * anonym; + { /* with */ + struct DFM6 * anonym = &chan[m].dfm6; + anonym->synword = anonym->synword*2UL+(uint32_t)d; + if (anonym->rxp>=264UL) { + if ((anonym->synword&65535UL)==17871UL) anonym->rxp = 0UL; + else if ((anonym->synword&65535UL)==47664UL) { + /* inverse start sequence found */ + anonym->polarity = !anonym->polarity; + anonym->rxp = 0UL; + } + } + else { + anonym->rxbuf[anonym->rxp] = d; + ++anonym->rxp; + if (anonym->rxp==264UL) decodeframe6(m); + } + } +} /* end demodbyte6() */ + + +static void demodbit6(uint32_t m, float u, float u0) +{ + char d; + float ua; + struct DFM6 * anonym; + d = u>=u0; + { /* with */ + struct DFM6 * anonym = &chan[m].dfm6; + if (anonym->lastmanch==u0<0.0f) { + anonym->manchestd += (32767L-anonym->manchestd)/16L; + } + anonym->lastmanch = d; + anonym->manchestd = -anonym->manchestd; + /*WrInt(manchestd,8); */ + if (anonym->manchestd<0L) { + /*=polarity*/ + demodbyte6(m, d!=anonym->polarity); + /*quality*/ + ua = (float)fabs(u-u0)-anonym->bitlev; + anonym->bitlev = anonym->bitlev+ua*0.005f; + anonym->noise = anonym->noise+((float)fabs(ua)-anonym->noise)*0.02f; + } + } +/*quality*/ +} /* end demodbit6() */ + + +static void demod6(float u, uint32_t m) +{ + char d; + struct DFM6 * anonym; + /* + IF debfd>=0 THEN + ui:=VAL(INTEGER, u*0.002); + WrBin(debfd, ui, 2); + END; + */ + { /* with */ + struct DFM6 * anonym = &chan[m].dfm6; + d = u>=0.0f; + if (anonym->cbit) { + demodbit6(m, u, anonym->lastu); + if (d!=anonym->oldd) { + if (d==anonym->plld) anonym->baudfine += anonym->pllshift; + else anonym->baudfine -= anonym->pllshift; + anonym->oldd = d; + } + anonym->lastu = u; + } + else anonym->plld = d; + anonym->cbit = !anonym->cbit; + } +} /* end demod6() */ + + +static void Fsk6(uint32_t m) +{ + float ff; + int32_t lim; + struct DFM6 * anonym; + { /* with */ + struct DFM6 * anonym = &chan[m].dfm6; + lim = (int32_t)anonym->demodbaud; + for (;;) { + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + ff = Fir(afin, (uint32_t)((anonym->baudfine&65535L)/4096L),16UL, chan[m].afir, 32ul, anonym->afirtab, 512ul); + demod6(ff, m); + } + anonym->baudfine += lim; + lim = 0L; + if (anonym->baudfine<131072L) break; + } + } +} /* end Fsk6() */ + +/*------------------------------ C34 C50 */ + +static void demodframe34(uint32_t channel) +{ + uint32_t val; + uint32_t sum2; + uint32_t sum1; + uint32_t i; + double hr; + char s[101+6]; + char ok0; + struct C34 * anonym; + struct CHAN * anonym0; /* call if set */ + char tmp; + { /* with */ + struct C34 * anonym = &chan[channel].c34; + sum1 = 0UL; + sum2 = 65791UL; + for (i = 2UL; i<=6UL; i++) { + sum1 += (uint32_t)(uint8_t)anonym->rxbuf[i]; + sum2 -= (uint32_t)(uint8_t)anonym->rxbuf[i]*(7UL-i); + } /* end for */ + sum1 = sum1&255UL; + sum2 = sum2&255UL; + ok0 = sum1==(uint32_t)(uint8_t) + anonym->rxbuf[7U] && sum2==(uint32_t)(uint8_t) + anonym->rxbuf[8U]; + if (anonym->tused+3600ULid34.id[0U] = 0; /* timed out context */ + anonym->id50.id[0U] = 0; + } + if (verb && ok0 || verb2) { + if (maxchannels>0UL) { + osic_WrINT32(channel+1UL, 1UL); + osi_WrStr(":", 2ul); + } + if (anonym->c50) { + osi_WrStr("C50 ", 5ul); + osi_WrStr(anonym->id50.id, 9ul); + } + else { + osi_WrStr("C34 ", 5ul); + osi_WrStr(anonym->id34.id, 9ul); + } + WrdB(chan[channel].adcmax); + WrQuali(noiselevel(channel)); + Wrtune(chan[channel].adcdc, chan[channel].adcmax); + osi_WrStr(" [", 3ul); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[2U], 2UL); + osi_WrStr(" ", 2ul); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[3U], 2UL); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[4U], 2UL); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[5U], 2UL); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[6U], 2UL); + osi_WrStr(" ", 2ul); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[7U], 2UL); + osi_WrHex((uint32_t)(uint8_t)anonym->rxbuf[8U], 2UL); + osi_WrStr("] ", 3ul); + } + if (ok0) { + /* chksum ok */ + val = (uint32_t)(uint8_t)anonym->rxbuf[6U]+(uint32_t) + (uint8_t)anonym->rxbuf[5U]*256UL+(uint32_t)(uint8_t) + anonym->rxbuf[4U]*65536UL+(uint32_t)(uint8_t) + anonym->rxbuf[3U]*16777216UL; + hr = (double)*X2C_CAST(&val,uint32_t,float,float *); + if (anonym->c50) { + if (anonym->id50.idtime+3600ULid50.id[0U] = 0; + anonym->id50.idcheck[0U] = 0; + anonym->id50.idcnt = 0UL; + } + /* remove old id */ + switch ((unsigned)anonym->rxbuf[2U]) { + case '\003': + /* + CHR(02H): hr:=CAST(REAL, CAST(SET32, + val)/SET32{0..31}); + IF verb THEN WrStr("baro "); + WrFixed(hr, 2, 0); WrStr(""); END; + */ + if (hr<99.9 && hr>(-99.9)) { + if (verb) { + osi_WrStr("tmp1 ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("oC", 3ul); + } + } + break; + case '\004': + if (hr<99.9 && hr>(-99.9)) { + if (verb) { + osi_WrStr("tmp2 ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("oC", 3ul); + } + } + break; + case '\005': + if (hr<99.9 && hr>(-99.9)) { + if (verb) { + osi_WrStr("tmp3 ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("oC", 3ul); + } + } + break; + case '\020': + if (hr<=100.0 && hr>=0.0) { + if (verb) { + osi_WrStr("hum ", 5ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("%", 2ul); + } + } + break; + case '\024': + if (verb) { + osi_WrStr("date", 5ul); + aprsstr_IntToStr((int32_t)(val%1000000UL+1000000UL), 1UL, + s, 101ul); + s[0U] = ' '; + osi_WrStr(s, 101ul); + } + break; + case '\025': + if (verb) { + aprsstr_TimeToStr((val/10000UL)*3600UL+((val%10000UL) + /100UL)*60UL+val%100UL, s, 101ul); + osi_WrStr("time ", 6ul); + osi_WrStr(s, 101ul); + } + break; + case '\026': + hr = latlong(val, anonym->c50); + if (hr<89.9 && hr>(-89.9)) { + if (verb) { + osi_WrStr("lat ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + } + break; + case '\027': + hr = latlong(val, anonym->c50); + if (hr<180.0 && hr>(-180.0)) { + if (verb) { + osi_WrStr("long ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + } + break; + case '\030': + hr = (double)((float)val*0.1f); + if (hr<50000.0) { + if (verb) { + osi_WrStr("alti ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("m", 2ul); + } + } + break; + case 'd': /* 66H 67H 68H 89H 6BH seem to be fixed too */ + strncpy(s,"SC50",101u); + s[4U] = hex(val/4096UL&7UL); + s[5U] = hex(val/256UL); + s[6U] = hex(val/16UL); + s[7U] = hex(val); + s[8U] = 0; + s[9U] = 0; + if (verb) { + osi_WrStr("numb ", 6ul); + osi_WrStr((char *) &s[4U], 1u/1u); + osi_WrStr((char *) &s[5U], 1u/1u); + osi_WrStr((char *) &s[6U], 1u/1u); + osi_WrStr((char *) &s[7U], 1u/1u); + osi_WrStr((char *) &s[8U], 1u/1u); + } + /* check name, if changed may be checksum error or 2 sondes on same frequency */ + if (aprsstr_StrCmp(anonym->id50.idcheck, 9ul, s, 101ul)) { + ++anonym->id50.idcnt; /* got same name again */ + } + else { + /* new name so check if wrong */ + aprsstr_Assign(anonym->id50.idcheck, 9ul, s, 101ul); + anonym->idcnt = 1UL; + } + if (anonym->id50.idcnt>2UL || anonym->id50.id[0U]==0) { + /* first name or safe new name */ + memcpy(anonym->id50.id,anonym->id50.idcheck,9u); + anonym->id50.idtime = osic_time(); + } + anonym->tused = osic_time(); + break; + default:; + if (verb2) { + /*WrStr("????");*/ + osic_WrINT32(val, 12UL); + osic_WrINT32(val/65536UL, 7UL); + osic_WrINT32(val&65535UL, 7UL); + osic_WrFixed((float)hr, 2L, 10UL); + osi_WrStr(" ", 2ul); + for (i = 31UL;; i--) { + osi_WrStr((char *)(tmp = (char) + (48UL+(uint32_t)X2C_IN(i,32,(uint32_t)val)),&tmp), + 1u/1u); + if (i==0UL) break; + } /* end for */ + } + break; + } /* end switch */ + } + else { + /* SC34 */ + if (anonym->id34.idtime+3600ULid34.id[0U] = 0; + anonym->id34.idcheck[0U] = 0; + anonym->id34.idcnt = 0UL; + } + /* remove old id */ + switch ((unsigned)anonym->rxbuf[2U]) { + case '\003': + if (hr<99.9 && hr>(-99.9)) { + if (verb) { + osi_WrStr("tmp1 ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("oC", 3ul); + } + } + break; + case '\007': + if (hr<99.9 && hr>(-99.9)) { + if (verb) { + osi_WrStr("dewp ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("oC", 3ul); + } + } + break; + case '\024': + if (verb) { + osi_WrStr("date", 5ul); + aprsstr_IntToStr((int32_t)(val%1000000UL+1000000UL), 1UL, + s, 101ul); + s[0U] = ' '; + osi_WrStr(s, 101ul); + } + break; + case '\025': + if (verb) { + aprsstr_TimeToStr((val/10000UL)*3600UL+((val%10000UL) + /100UL)*60UL+val%100UL, s, 101ul); + osi_WrStr("time ", 6ul); + osi_WrStr(s, 101ul); + } + break; + case '\026': + hr = latlong(val, anonym->c50); + if (hr<89.9 && hr>(-89.9)) { + if (verb) { + osi_WrStr("lati ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + } + break; + case '\027': + hr = latlong(val, anonym->c50); + if (hr<180.0 && hr>(-180.0)) { + if (verb) { + osi_WrStr("long ", 6ul); + osic_WrFixed((float)hr, 5L, 0UL); + } + } + break; + case '\030': + hr = (double)((float)val*0.1f); + if (hr<50000.0) { + if (verb) { + osi_WrStr("alti ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("m", 2ul); + } + } + break; + case '\031': + hr = (double)((float)val*0.1852f); + /*1.609*/ /*1.852*/ /* guess knots or miles */ + if (hr<1000.0) { + if (verb) { + osi_WrStr("wind ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("km/h", 5ul); + } + } + break; + case '\032': + hr = (double)((float)val*0.1f); + if (hr>=0.0 && hr<=360.0) { + if (verb) { + osi_WrStr("wdir ", 6ul); + osic_WrFixed((float)hr, 1L, 0UL); + osi_WrStr("deg", 4ul); + } + } + break; + case 'd': + strncpy(s,"SC34",101u); + /* build a name from seems like serial number */ + s[4U] = hex(val/65536UL); + s[5U] = hex(val/4096UL); + s[6U] = hex(val/256UL); + s[7U] = hex(val/16UL); + s[8U] = hex(val); + s[9U] = 0; + if (verb) { + osi_WrStr("numb ", 6ul); + osi_WrStr((char *) &s[4U], 1u/1u); + osi_WrStr((char *) &s[5U], 1u/1u); + osi_WrStr((char *) &s[6U], 1u/1u); + osi_WrStr((char *) &s[7U], 1u/1u); + osi_WrStr((char *) &s[8U], 1u/1u); + } + /* check name, if changed may be checksum error or 2 sondes on same frequency */ + if (aprsstr_StrCmp(anonym->id34.idcheck, 9ul, s, 101ul)) { + ++anonym->id34.idcnt; /* got same name again */ + } + else { + /* new name so check if wrong */ + aprsstr_Assign(anonym->id34.idcheck, 9ul, s, 101ul); + anonym->idcnt = 1UL; + } + if (anonym->id34.idcnt>3UL || anonym->id34.id[0U]==0) { + /* first name or safe new name */ + memcpy(anonym->id34.id,anonym->id34.idcheck,9u); + anonym->id34.idtime = osic_time(); + } + anonym->tused = osic_time(); + break; + default:; + if (verb2) { + osi_WrStr("????", 5ul); + osic_WrINT32(val, 12UL); + osic_WrFixed((float)hr, 2L, 10UL); + } + break; + } /* end switch */ + } + /* build tx frame */ + if ((anonym->c50 && anonym->id50.id[0U]) + && aprsstr_StrCmp(anonym->id50.idcheck, 9ul, anonym->id50.id, + 9ul) || (!anonym->c50 && anonym->id34.id[0U]) + && aprsstr_StrCmp(anonym->id34.idcheck, 9ul, anonym->id34.id, + 9ul)) { + /* stop sending if ambigous id */ + if (anonym->c50) { + for (i = 0UL; i<=8UL; i++) { + s[i] = anonym->id50.id[i]; + } /* end for */ + } + else { + for (i = 0UL; i<=8UL; i++) { + s[i] = anonym->id34.id[i]; + } /* end for */ + } + s[9U] = 0; + { /* with */ + struct CHAN * anonym0 = &chan[channel]; + s[10U] = (char)(anonym0->mycallc/16777216UL); + s[11U] = (char)(anonym0->mycallc/65536UL&255UL); + s[12U] = (char)(anonym0->mycallc/256UL&255UL); + s[13U] = (char)(anonym0->mycallc&255UL); + if (anonym0->mycallc>0UL) s[14U] = anonym0->myssid; + else s[14U] = '\020'; + } + for (i = 0UL; i<=6UL; i++) { + s[i+15UL] = anonym->rxbuf[i+2UL]; /* payload */ + } /* end for */ + + s[22] = chan[channel].freq[0]; + s[23] = chan[channel].freq[1]; + s[24] = chan[channel].freq[2]; + s[25] = chan[channel].freq[3]; + s[26] = chan[channel].freq[4]; + s[27] = chan[channel].freq[5]; + + + + alludp(chan[channel].udptx, 22UL+6, s, 101ul+6); + } + else if (verb) { + if (anonym->c50) { + if (anonym->id50.id[0U]) { + osi_WrStr(" changing name ", 16ul); + osi_WrStr(anonym->id50.id, 9ul); + osi_WrStr("<->", 4ul); + osi_WrStr(anonym->id50.idcheck, 9ul); + } + } + else if (anonym->id34.id[0U]) { + osi_WrStr(" changing name ", 16ul); + osi_WrStr(anonym->id34.id, 9ul); + osi_WrStr("<->", 4ul); + osi_WrStr(anonym->id34.idcheck, 9ul); + } + } + } + else if (verb2) { + /*build tx frame */ + osi_WrStr("---- chksum ", 13ul); + osi_WrHex(sum1, 2UL); + osi_WrHex(sum2, 2UL); + } + if (verb2 || ok0 && verb) osi_WrStrLn("", 1ul); + } +/* name(9) 0C call(5) playload(7) */ +} /* end demodframe34() */ + + +static void demodbit34(uint32_t channel, char d) +{ + /*IF NOT verb THEN WrInt(ORD(d),1); END; */ + struct C34 * anonym; + d = !d; + { /* with */ + struct C34 * anonym = &chan[channel].c34; + anonym->rxbytec = anonym->rxbytec*2UL+(uint32_t)d; + if ((anonym->rxbytec&268435455UL)==234942462UL) { + /* c34 1110 0000 0000 1110 1111 1111 1110*/ + anonym->c50 = 0; + anonym->rxp = 2UL; + anonym->rxbitc = 0UL; + } + else if ((anonym->rxbytec&2097151UL)==3070UL) { + /*IF NOT verb THEN WrStrLn(""); END; */ + /* c50 0 0000 0000 1011 1111 1110 */ + anonym->c50 = 1; + anonym->rxp = 2UL; + anonym->rxbitc = 0UL; + } + /*IF NOT verb THEN WrStrLn(""); END; */ + if ((anonym->c50 || anonym->rxbitc) || !d) { + if (anonym->rxbitc<=8UL) { + /* databits */ + anonym->rxbyte = (anonym->rxbyte&255UL)/2UL; + if (d) anonym->rxbyte += 128UL; + ++anonym->rxbitc; + } + else if (anonym->rxp>0UL) { + /* byte ready */ + anonym->rxbitc = 0UL; + anonym->rxbuf[anonym->rxp] = (char)anonym->rxbyte; + /*WrHex(rxbyte, 3); */ + ++anonym->rxp; + if (anonym->rxp>8UL) { + /*IF NOT verb THEN WrStr("*"); END; */ + demodframe34(channel); + anonym->rxp = 0UL; + } + } + } + } +} /* end demodbit34() */ + + +static void demod34(float u, uint32_t channel) +{ + char d; + struct C34 * anonym; + d = u>=0.0f; + { /* with */ + struct C34 * anonym = &chan[channel].c34; + if (anonym->cbit) { + demodbit34(channel, d); + if (d!=anonym->oldd) { + if (d==anonym->plld) anonym->baudfine += anonym->pllshift; + else anonym->baudfine -= anonym->pllshift; + anonym->oldd = d; + } + /*squelch*/ + anonym->sqmed[d] = anonym->sqmed[d]+(u-anonym->sqmed[d])*0.05f; + anonym->noise = anonym->noise+((float)fabs(u-anonym->sqmed[d]) + -anonym->noise)*0.05f; + } + else { + /*squelch*/ + anonym->plld = d; + } + anonym->cbit = !anonym->cbit; + } +} /* end demod34() */ + + +static void Afsk(uint32_t channel) +{ + float ff; + float b; + float a; + float d; + float mid; + float right; + struct C34 * anonym; + { /* with */ + struct C34 * anonym = &chan[channel].c34; + right = Fir(afin, 0UL, 16UL, chan[channel].afir, 32ul, anonym->afirtab,512ul); + if (anonym->left<0.0f!=right<0.0f) { + d = X2C_DIVR(anonym->left,anonym->left-right); + a = (float)(uint32_t)X2C_TRUNCC(d*16.0f+0.5f,0UL,X2C_max_longcard); + b = a*0.0625f; + if ((uint32_t)X2C_TRUNCC(a,0UL, + X2C_max_longcard)>0UL && (uint32_t)X2C_TRUNCC(a,0UL,X2C_max_longcard)<16UL) { + mid = Fir(afin, 16UL-(uint32_t)X2C_TRUNCC(a,0UL, X2C_max_longcard), 16UL, chan[channel].afir, 32ul,anonym->afirtab, 512ul); + if (anonym->left<0.0f!=mid<0.0f) { + d = (X2C_DIVR(anonym->left,anonym->left-mid))*b; + } + else d = b+(X2C_DIVR(mid,mid-right))*(1.0f-b); + } + if (anonym->tcnt+d!=0.0f) { + anonym->freq = X2C_DIVR(1.0f,anonym->tcnt+d); + } + anonym->tcnt = 0.0f-d; + } + anonym->tcnt = anonym->tcnt+1.0f; + anonym->left = right; + anonym->dfir[anonym->dfin] = anonym->freq-anonym->afskmidfreq; + anonym->dfin = anonym->dfin+1UL&63UL; + anonym->baudfine += (int32_t)anonym->demodbaud; + if (anonym->baudfine>=65536L) { + anonym->baudfine -= 65536L; + if (anonym->baudfine<65536L) { + /* normal alway true */ + ff = Fir(anonym->dfin, (uint32_t)(16L-anonym->baudfine/4096L), 16UL, anonym->dfir, 64ul, anonym->dfirtab, 1024ul); + demod34(ff, channel); + } + } + } +} /* end Afsk() */ + + +static void getadc(void) +{ + int32_t sl; + int32_t l; + int32_t max0[64]; + int32_t min0[64]; + uint32_t ch; + uint32_t c; + unsigned int i; + struct CHAN * anonym; + uint32_t tmp,pos; + int chno; + char tmps[10]; + char mod=0; + + c = 0UL; + mod=0; + do { + mod=0; + if (adcbufrd>=adcbufsamps) { + adcbufrd = 0UL; + l = osi_RdBin(soundfd, (char *)adcbuf, 8192u/1u, adcbuflen*2UL); + + sprintf(tmps,"%c%c%c%c\n",adcbuf[0],adcbuf[1],adcbuf[2],adcbuf[3]); + + if(tmps[0]=='9' && tmps[1]=='S' && tmps[2]=='K' && tmps[3]=='P'){ //freq table + printf("Update channel table\n"); + pos=4; + mod=1; + chno=0; + while(adcbuf[pos]!=0){ + //chan[chno].nr=(adcbuf[pos]-48)*10+adcbuf[pos+1]-48; + chan[chno].freq[0]=adcbuf[pos+2]; + chan[chno].freq[1]=adcbuf[pos+3]; + chan[chno].freq[2]=adcbuf[pos+4]; + chan[chno].freq[3]=adcbuf[pos+5]; + chan[chno].freq[4]=adcbuf[pos+6]; + chan[chno].freq[5]=adcbuf[pos+7]; + chan[chno].freq[6]=0; + pos+=8; + //printf(chan[chno].freq);printf("\n"); + chno++; + } + }else if(mod==0){ + adcbufsamps = 0UL; + if (l<0L) { + if (abortonsounderr) Error("Sounddevice Failure", 20ul); + else { + osic_Close(soundfd); + usleep(100000UL); + OpenSound(); + return; + } + } + if (l<2L) return; + adcbufsamps = (uint32_t)(l/2L); + if (debfd>=0L) { + osi_WrBin(debfd, (char *)adcbuf, 8192u/1u, adcbufsamps*2UL); + } + tmp = maxchannels; + ch = 0UL; + if (ch<=tmp) for (;; ch++) { + chan[ch].adcdc += (max0[ch]+min0[ch])/2L-chan[ch].adcdc>>4; + chan[ch].adcmax += (max0[ch]-min0[ch])-chan[ch].adcmax>>4; + max0[ch] = -32768L; + min0[ch] = 32767L; + if (ch==tmp) break; + } /* end for */ + adcbufsampx = X2C_max_longcard; + } + } + sl = (int32_t)adcbuf[adcbufrd]; + if (cfgchannels==0UL && (sl&1)) { + //auto channels channel 0 //WrInt(lastc, 1); WrStrLn(" ch1"); + if (adcbufsampx!=X2C_max_longcard) { + ch = (adcbufrd-adcbufsampx)-1UL; + /*WrInt(ch, 1); WrStrLn(" ch"); */ + if (ch<63UL) { + if (verb && maxchannels!=ch && mod==0) { + osi_WrStr("channels changed from ", 23ul); + osic_WrINT32(maxchannels+1UL, 0UL); + osi_WrStr(" to ", 5ul); + osic_WrINT32(ch+1UL, 0UL); + osi_WrStrLn("", 1ul); + } + maxchannels = ch; + } + } + adcbufsampx = adcbufrd; + c = 0UL; + } + sl = (int32_t)((uint32_t)sl&0xFFFFFFFEUL); + if (sl==0L) ++chan[c].squelch; + else chan[c].squelch = 0UL; + sl -= chan[c].adcdc; + ++adcbufrd; + chan[c].afir[afin] = (float)(sl-chan[c].adcdc); + if (sl>max0[c]) max0[c] = sl; + if (slsquelch<64UL) { + /* squelch open */ + if (anonym->r92.enabled) Fsk(c); // || anonym->r41.enabled || anonym->pils.enabled) Fsk(c); + if (anonym->r41.enabled) Fsk41(c); + if (anonym->pils.enabled) FskPS(c); + if (anonym->c34.enabled) Afsk(c); + if (anonym->dfm6.enabled) Fsk6(c); + if (anonym->m10.enabled) Fsk10(c); + } + } + if (c==tmp) break; + } /* end for */ +} /* end getadc() */ + +static uint16_t sondeudp_POLY = 0x1021U; + + +static void Gencrctab(void) +{ + uint16_t j; + uint16_t i; + uint16_t crc; + for (i = 0U; i<=255U; i++) { + crc = (uint16_t)(i*256U); + for (j = 0U; j<=7U; j++) { + if ((0x8000U & crc)) crc = X2C_LSH(crc,16,1)^0x1021U; + else crc = X2C_LSH(crc,16,1); + } /* end for */ + CRCTAB[i] = X2C_LSH(crc,16,-8)|X2C_LSH(crc,16,8); + } /* end for */ +} /* end Gencrctab() */ + + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + if (sizeof(FILENAME)!=1024) X2C_ASSERT(0); + if (sizeof(CNAMESTR)!=9) X2C_ASSERT(0); + aprsstr_BEGIN(); + osi_BEGIN(); + Gencrctab(); + memset((char *)chan,(char)0,sizeof(struct CHAN [64])); + Parms(); + initrsc(); + getst = 0UL; + afin = 0UL; + soundbufs = 0UL; + /* IF verb THEN WrStrLn("Frame ID level-L qual level-R qual") END; + */ + adcbufrd = 0UL; + adcbufsamps = 0UL; + adcbufsampx = X2C_max_longcard; + for (;;) getadc(); + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/soundctl.c b/src/soundctl.c new file mode 100644 index 0000000..9fe0ec6 --- /dev/null +++ b/src/soundctl.c @@ -0,0 +1,121 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef MACOS +#include +#endif +#include + +/* there is actually no sound support on MACOS */ +#ifdef MACOS +int samplesize(int fd, int bits) +{ + return 0; +} + +int channels(int fd, int n) +{ + return 0; +} + +int sampelrate(int fd, int f) +{ + return 0; +} + +int setfragment(int fd, int f) +{ + return 0; +} + +void pcmsync(int fd) +{ + return; +} + +int getoutfilled(int fd) +{ + return 0; +} + +int recnum(void) +{ + return 0; +} + +int getsampelrate(int fd) +{ + return 0; +} + +int getmixer(int fd, int device) +{ + return 0; +} + +void setmixer(int fd, int device, int level) +{ + return; +} +#else +int samplesize(int fd, int bits) +{ +return ioctl(fd, SOUND_PCM_WRITE_BITS, &bits); +} + +int channels(int fd, int n) +{ +return ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &n); +} + +int sampelrate(int fd, int f) +{ +return ioctl(fd, SOUND_PCM_WRITE_RATE, &f); +} + +int setfragment(int fd, int f) +{ +return ioctl(fd, SOUND_PCM_SETFRAGMENT, &f); +} + +void pcmsync(int fd) +{ +ioctl(fd, SOUND_PCM_SYNC, 0); +} + +int getoutfilled(int fd) +{ +int bytes; +ioctl(fd, SNDCTL_DSP_GETODELAY, &bytes); +return bytes; +} + +int getsampelrate(int fd) +{ +int f; +ioctl(fd, SOUND_PCM_READ_RATE, &f); +return f; +} + +int getmixer(int fd, int device) +{ +int level=-1; +ioctl(fd, MIXER_READ(device), &level); +return level; +} + +int recnum() +{ +return SOUND_MIXER_RECSRC; +} + +void setmixer(int fd, int device, int level) +{ +ioctl(fd, MIXER_WRITE(device), &level); +} +#endif diff --git a/src/soundctl.h b/src/soundctl.h new file mode 100644 index 0000000..c484ce9 --- /dev/null +++ b/src/soundctl.h @@ -0,0 +1,33 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef soundctl_H_ +#define soundctl_H_ +#include "X2C.h" + +extern long samplesize(long, unsigned long); + +extern long channels(long, unsigned long); + +extern long sampelrate(long, unsigned long); + +extern long setfragment(long, unsigned long); + +extern void pcmsync(long); + +extern long getoutfilled(long); + +extern unsigned long getsampelrate(long); + +extern unsigned long getmixer(long, long); + +extern void setmixer(long, unsigned long, unsigned long); + +extern unsigned long recnum(void); + + +#endif /* soundctl_H_ */ diff --git a/src/tcp.c b/src/tcp.c new file mode 100644 index 0000000..6164dc6 --- /dev/null +++ b/src/tcp.c @@ -0,0 +1,243 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +//#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MSG_MORE +#define MSG_MORE 0 +#endif +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif +//-------------------- + +int resolv(char *url, int *host) +{ + struct hostent *h; + + h=gethostbyname(url); + if ((h==0) || (h->h_addr_list==0)) return -1; + memcpy(host, *(h->h_addr_list), 4); + return 0; +} + +//-------------------- + +int opentcp() +{ +return socket(PF_INET, SOCK_STREAM, 0); +} + + +int tcpconnect(int fd, int toport, int toip) +{ +//struct sockaddr addr; + +//memset(&addr, 0, sizeof(addr)); +//addr.sa_family = AF_INET; +//addr.sa_port=htons(toport); +//addr.sa_addr.s_addr=htonl(toip); +//return sendto(fd, buf, blen, 0, (struct sockaddr *) &addr, sizeof(addr)); +} + +//-------------------- + +/* +int connectto1(char *url, char *port) +{ + struct gaicb req; + struct addrinfo *rp; + int sockfd; + + memset(&req, 0, sizeof req); + req.ar_name = url; + if (getaddrinfo_a(GAI_WAIT, &req, 1, NULL) != 0) return -1; + +usleep(5000000); + if (gai_error(&req != 0)) return -1; + + for (rp = req.ar_result; rp != NULL; rp = rp->ai_next) { + sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (sockfd<0) continue; + + int flags=fcntl(sockfd, F_GETFL, 0); + if (flags<0) return -1; + + flags|=O_NONBLOCK; + fcntl(sockfd, F_SETFL, flags); + + if (connect(sockfd, rp->ai_addr, rp->ai_addrlen) < 0) break; + + close(sockfd); + } + freeaddrinfo(req.ar_result); + if (rp = NULL) return -1; + + return sockfd; +} +*/ +//-------------------- + + +int connectto(char *url, char *port) +{ + struct addrinfo hints, *res, *rp; + int sockfd; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if (getaddrinfo(url, port, &hints, &res) != 0) return -1; +// if (res == 0) return -1; + for (rp = res; rp != NULL; rp = rp->ai_next) { + sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (sockfd<0) continue; + +//nodelay + int flag_TCP_nodelay = 1; + if ( (setsockopt( sockfd, IPPROTO_TCP, TCP_NODELAY, + (char *)&flag_TCP_nodelay, sizeof(flag_TCP_nodelay))) < 0) return -1; +//nodelay + + int flags=fcntl(sockfd, F_GETFL, 0); + if (flags<0) return -1; + + flags|=O_NONBLOCK; + fcntl(sockfd, F_SETFL, flags); + + if (connect(sockfd, rp->ai_addr, rp->ai_addrlen) < 0) break; + + close(sockfd); + } + freeaddrinfo(res); + if (rp == NULL) + return -1; + + return sockfd; +} + +//-------------------- + +int waitconnect(char *port, int maxconn) +{ +struct addrinfo hints, *res; +int sockfd; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever +// hints.ai_family = AF_INET6; // use IPv6 +// hints.ai_family = AF_INET; // use IPv4 + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; // fill in my IP for me + + getaddrinfo(NULL, port, &hints, &res); + sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (sockfd<0) return -1; + + if (bind(sockfd, res->ai_addr, res->ai_addrlen)<0) {close(sockfd); return -1;} + listen(sockfd, maxconn); + return sockfd; +} + +//--------------------- + +int acceptconnect(int fd, char *addr, int *len) +{ + return accept(fd, (struct sockaddr *)addr, len); +} + +void ipnum2str(const struct sockaddr *sa, char *s, size_t maxlen) +{ + switch(sa->sa_family) { + case AF_INET: + inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), s, maxlen); + break; + + case AF_INET6: + inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), s, maxlen); + break; + + default: + strncpy(s, "Unknown AF", maxlen); + } +} + +//--------------------- + +void ipnumport2str(const struct sockaddr *sa, socklen_t salen, char *ip, size_t maxiplen, char *port, size_t maxportlen) +{ + getnameinfo(sa, salen, ip, maxiplen, port, maxportlen, NI_NUMERICHOST|NI_NUMERICSERV); +} + + +//-------------------- + +int sendmore(int fd, char *buf, int len) +{ + return send(fd, buf, len, MSG_NOSIGNAL | MSG_MORE); +} + +//-------------------- + +int sendsock(int fd, char *buf, int len) +{ + return send(fd, buf, len, MSG_NOSIGNAL); +} + +//-------------------- + +int readsock(int fd, char *buf, int len) +{ + int res=recv(fd, buf, len, MSG_DONTWAIT); + if (res==0) return -1; + if ((res<0) && (errno==EAGAIN)) return 0; + return res; +} + + +//-------------------- + +int getsockipnum(int fd, char *addr, int *len) +{ + return getsockname(fd, (struct sockaddr *)addr, len); +} + +//-------------------- + +int getpeeripnum(int fd, char *addr, int *len) +{ + return getpeername(fd, (struct sockaddr *)addr, len); +} + +//-------------------- + +int getunack(int fd) +{ + int unak=-1; + ioctl(fd, TIOCOUTQ, &unak); + return unak; +} + +//-------------------- + +void stoptxrx(int fd, int how) +// how 0 rx, 1 tx, 2 rxtx +{ + shutdown(fd, how); +} + diff --git a/src/tcp.h b/src/tcp.h new file mode 100644 index 0000000..2eccc01 --- /dev/null +++ b/src/tcp.h @@ -0,0 +1,39 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef tcp_H_ +#define tcp_H_ + +extern long resolv(char [], unsigned long *); + +extern long connectto(char [], char []); + +extern long waitconnect(char [], unsigned long); + +extern long acceptconnect(long, char [], long *); + +extern void ipnum2str(char [], char [], unsigned long); + +extern long sendsock(long, char [], long); + +extern long sendmore(long, char [], long); + +extern long readsock(long, char [], long); + +extern long getsockipnum(long, char [], long *); + +extern long getpeeripnum(long, char [], long *); + +extern void ipnumport2str(char [], unsigned long, char [], unsigned long, + char [], unsigned long); + +extern long getunack(long); + +extern void stoptxrx(long, long); + + +#endif /* tcp_H_ */ diff --git a/src/tcpb.c b/src/tcpb.c new file mode 100644 index 0000000..3bf5ba3 --- /dev/null +++ b/src/tcpb.c @@ -0,0 +1,79 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +//#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//-------------------- + + + + +int connecttob(char *url, char *port) +{ + struct addrinfo hints, *res, *rp; + int sockfd; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if (getaddrinfo(url, port, &hints, &res) != 0) return -1; +// if (res == 0) return -1; + for (rp = res; rp != NULL; rp = rp->ai_next) { + sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (sockfd<0) continue; + +//nodelay + int flag_TCP_nodelay = 1; + if ( (setsockopt( sockfd, IPPROTO_TCP, TCP_NODELAY, + (char *)&flag_TCP_nodelay, sizeof(flag_TCP_nodelay))) < 0) return -1; +//nodelay + int flags=fcntl(sockfd, F_GETFL, 0); + if (flags<0) return -1; + + flags|=O_NONBLOCK; + fcntl(sockfd, F_SETFL, flags); + + if (connect(sockfd, rp->ai_addr, rp->ai_addrlen) < 0) +{ + int flags=fcntl(sockfd, F_GETFL, 0); + if (flags<0) return -1; + + flags&=~O_NONBLOCK; + fcntl(sockfd, F_SETFL, flags); + + break; +} + + close(sockfd); + } + freeaddrinfo(res); + if (rp = NULL) return -1; + + return sockfd; +} + + +int readsockb(int fd, char *buf, int len) +{ + int res=recv(fd, buf, len, MSG_WAITALL); + if (res==0) return -1; + if ((res<0) && (errno==EAGAIN)) return 0; + return res; +} + + diff --git a/src/tcpb.h b/src/tcpb.h new file mode 100644 index 0000000..4a19285 --- /dev/null +++ b/src/tcpb.h @@ -0,0 +1,17 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef tcpb_H_ +#define tcpb_H_ +#include "X2C.h" + +extern long connecttob(char [], char []); + +extern long readsockb(long, char [], long); + + +#endif /* tcpb_H_ */ diff --git a/src/time_conversion.c b/src/time_conversion.c new file mode 100644 index 0000000..d68d40c --- /dev/null +++ b/src/time_conversion.c @@ -0,0 +1,881 @@ +/** +\file time_conversion.c +\brief GNSS core 'c' function library: converting time information. +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-07-30 + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +- http://aa.usno.navy.mil/data/docs/JulianDate.html - Julian Date Converter \n +- http://aa.usno.navy.mil/faq/docs/UT.html \n +- http://wwwmacho.mcmaster.ca/JAVA/JD.html \n +- Raquet, J. F. (2002), GPS Receiver Design Lecture Notes. Geomatics Engineering, + University of Calgary Graduate Course. \n + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain te above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#include +#include +#include // for fmod() +#include "gnss_error.h" +#include "time_conversion.h" +#include "constants.h" + +#ifndef WIN32 + #define _CRT_SECURE_NO_DEPRECATE +#endif + +#ifdef WIN32 + #include +#endif + + +#define TIMECONV_JULIAN_DATE_START_OF_GPS_TIME (2444244.5) // [days] +#define TIMECONV_JULIAN_DATE_START_OF_PC_TIME (2440587.5) // [days] +#define TIMECONV_DAYS_IN_JAN 31 +#define TIMECONV_DAYS_IN_MAR 31 +#define TIMECONV_DAYS_IN_APR 30 +#define TIMECONV_DAYS_IN_MAY 31 +#define TIMECONV_DAYS_IN_JUN 30 +#define TIMECONV_DAYS_IN_JUL 31 +#define TIMECONV_DAYS_IN_AUG 31 +#define TIMECONV_DAYS_IN_SEP 30 +#define TIMECONV_DAYS_IN_OCT 31 +#define TIMECONV_DAYS_IN_NOV 30 +#define TIMECONV_DAYS_IN_DEC 31 + + +// A static function to check if the utc input values are valid. +// \return TRUE if valid, FALSE otherwise. +static BOOL TIMECONV_IsUTCTimeValid( + const unsigned short utc_year, //!< Universal Time Coordinated [year] + const unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + const unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + const unsigned char utc_hour, //!< Universal Time Coordinated [hours] + const unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + const float utc_seconds //!< Universal Time Coordinated [s] + ); + + +BOOL TIMECONV_IsUTCTimeValid( + const unsigned short utc_year, //!< Universal Time Coordinated [year] + const unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + const unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + const unsigned char utc_hour, //!< Universal Time Coordinated [hours] + const unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + const float utc_seconds //!< Universal Time Coordinated [s] + ) +{ + unsigned char daysInMonth; + BOOL result; + if( utc_month == 0 || utc_month > 12 ) + { + GNSS_ERROR_MSG( "if( utc_month == 0 || utc_month > 12 )" ); + return FALSE; + } + result = TIMECONV_GetNumberOfDaysInMonth( utc_year, utc_month, &daysInMonth ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetNumberOfDaysInMonth returned FALSE." ); + return FALSE; + } + if( utc_day == 0 || utc_day > daysInMonth ) + { + GNSS_ERROR_MSG( "if( utc_day == 0 || utc_day > daysInMonth )" ); + return FALSE; + } + if( utc_hour > 23 ) + { + GNSS_ERROR_MSG( "if( utc_hour > 23 )" ); + return FALSE; + } + if( utc_minute > 59 ) + { + GNSS_ERROR_MSG( "if( utc_minute > 59 )" ); + return FALSE; + } + if( utc_seconds > 60 ) + { + GNSS_ERROR_MSG( "if( utc_seconds > 60 )" ); + return FALSE; + } + + return TRUE; +} + + +BOOL TIMECONV_GetSystemTime( + unsigned short* utc_year, //!< Universal Time Coordinated [year] + unsigned char* utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char* utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char* utc_hour, //!< Universal Time Coordinated [hours] + unsigned char* utc_minute, //!< Universal Time Coordinated [minutes] + float* utc_seconds, //!< Universal Time Coordinated [s] + unsigned char* utc_offset, //!< Integer seconds that GPS is ahead of UTC time, always positive [s], obtained from a look up table + double* julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ) +{ + BOOL result; + +#ifdef WIN32 + struct _timeb timebuffer; // found in +#else + struct timeb timebuffer; +#endif + double timebuffer_time_in_days; + double timebuffer_time_in_seconds; + //char *timeline; // for debugging + +#ifndef _CRT_SECURE_NO_DEPRECATE + if( _ftime_s( &timebuffer ) != 0 ) + { + GNSS_ERROR_MSG( "if( _ftime_s( &timebuffer ) != 0 )" ); + return FALSE; + } +#else + +#ifdef WIN32 + _ftime( &timebuffer ); +#else + ftime( &timebuffer ); +#endif + +#endif + //timeline = ctime( & ( timebuffer.time ) ); // for debugging + //printf( "%s\n", timeline ); // for debugging + + timebuffer_time_in_seconds = timebuffer.time + timebuffer.millitm / 1000.0; // [s] with ms resolution + + // timebuffer_time_in_seconds is the time in seconds since midnight (00:00:00), January 1, 1970, + // coordinated universal time (UTC). Julian date for (00:00:00), January 1, 1970 is: 2440587.5 [days] + + // convert timebuffer.time from seconds to days + timebuffer_time_in_days = timebuffer_time_in_seconds/SECONDS_IN_DAY; // days since julian date 2440587.5000000 [days] + + // convert to julian date + *julian_date = TIMECONV_JULIAN_DATE_START_OF_PC_TIME + timebuffer_time_in_days; + + result = TIMECONV_DetermineUTCOffset( *julian_date, utc_offset ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_DetermineUTCOffset returned FALSE." ); + return FALSE; + } + + result = TIMECONV_GetGPSTimeFromJulianDate( + *julian_date, + *utc_offset, + gps_week, + gps_tow ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetGPSTimeFromJulianDate returned FALSE." ); + return FALSE; + } + + result = TIMECONV_GetUTCTimeFromJulianDate( + *julian_date, + utc_year, + utc_month, + utc_day, + utc_hour, + utc_minute, + utc_seconds ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetUTCTimeFromJulianDate" ); + return FALSE; + } + + return TRUE; +} + + +#ifdef WIN32 +BOOL TIMECONV_SetSystemTime( + const unsigned short utc_year, //!< Universal Time Coordinated [year] + const unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + const unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + const unsigned char utc_hour, //!< Universal Time Coordinated [hours] + const unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + const float utc_seconds //!< Universal Time Coordinated [s] + ) +{ + BOOL result; + SYSTEMTIME t; + double julian_date = 0; + unsigned char day_of_week = 0; + + result = TIMECONV_GetJulianDateFromUTCTime( + utc_year, + utc_month, + utc_day, + utc_hour, + utc_minute, + utc_seconds, + &julian_date + ); + if( !result ) + { + GNSS_ERROR_MSG( "TIMECONV_GetJulianDateFromUTCTime returned FALSE."); + return FALSE; + } + + result = TIMECONV_GetDayOfWeekFromJulianDate( julian_date, &day_of_week ); + if( !result ) + { + GNSS_ERROR_MSG( "TIMECONV_GetDayOfWeekFromJulianDate returned FALSE."); + return FALSE; + } + + t.wDayOfWeek = day_of_week; + t.wYear = utc_year; + t.wMonth = utc_month; + t.wDay = utc_day; + t.wHour = utc_hour; + t.wMinute = utc_minute; + t.wSecond = (WORD)(floor(utc_seconds)); + t.wMilliseconds = (WORD)((utc_seconds - t.wSecond)*1000); + + // Set the PC system time. + result = SetSystemTime( &t ); + + return result; +} +#endif + + +BOOL TIMECONV_GetDayOfWeekFromJulianDate( + const double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned char *day_of_week //!< 0-Sunday, 1-Monday, 2-Tuesday, 3-Wednesday, 4-Thursday, 5-Friday, 6-Saturday []. + ) +{ + // "If the Julian date of noon is applied to the entire midnight-to-midnight civil + // day centered on that noon,[5] rounding Julian dates (fractional days) for the + // twelve hours before noon up while rounding those after noon down, then the remainder + // upon division by 7 represents the day of the week, with 0 representing Monday, + // 1 representing Tuesday, and so forth. Now at 17:48, Wednesday December 3 2008 (UTC) + // the nearest noon JDN is 2454804 yielding a remainder of 2." (http://en.wikipedia.org/wiki/Julian_day, 2008-12-03) + int dow = 0; + int jd = 0; + + if( julian_date - floor(julian_date) > 0.5 ) + { + jd = (int)floor(julian_date+0.5); + } + else + { + jd = (int)floor(julian_date); + } + dow = jd%7; // 0 is monday, 1 is tuesday, etc + + switch( dow ) + { + case 0: *day_of_week = 1; break; + case 1: *day_of_week = 2; break; + case 2: *day_of_week = 3; break; + case 3: *day_of_week = 4; break; + case 4: *day_of_week = 5; break; + case 5: *day_of_week = 6; break; + case 6: *day_of_week = 0; break; + default: return FALSE; break; + } + + return TRUE; +} + + +BOOL TIMECONV_GetJulianDateFromGPSTime( + const unsigned short gps_week, //!< GPS week (0-1024+) [week] + const double gps_tow, //!< GPS time of week (0-604800.0) [s] + const unsigned char utc_offset, //!< Integer seconds that GPS is ahead of UTC time, always positive [s] + double* julian_date //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + ) +{ + if( gps_tow < 0.0 || gps_tow > 604800.0 ) + { + GNSS_ERROR_MSG( "if( gps_tow < 0.0 || gps_tow > 604800.0 )" ); + return FALSE; + } + + // GPS time is ahead of UTC time and Julian time by the UTC offset + *julian_date = ((double)gps_week + (gps_tow-(double)utc_offset)/604800.0)*7.0 + TIMECONV_JULIAN_DATE_START_OF_GPS_TIME; + return TRUE; +} + + +BOOL TIMECONV_GetJulianDateFromUTCTime( + const unsigned short utc_year, //!< Universal Time Coordinated [year] + const unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + const unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + const unsigned char utc_hour, //!< Universal Time Coordinated [hours] + const unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + const float utc_seconds, //!< Universal Time Coordinated [s] + double* julian_date //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + ) +{ + double y; // temp for year + double m; // temp for month + BOOL result; + + // Check the input. + result = TIMECONV_IsUTCTimeValid( utc_year, utc_month, utc_day, utc_hour, utc_minute, utc_seconds ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_IsUTCTimeValid returned FALSE." ); + return FALSE; + } + + if( utc_month <= 2 ) + { + y = utc_year - 1; + m = utc_month + 12; + } + else + { + y = utc_year; + m = utc_month; + } + + *julian_date = (int)(365.25*y) + (int)(30.6001*(m+1.0)) + utc_day + utc_hour/24.0 + utc_minute/1440.0 + utc_seconds/86400.0 + 1720981.5; + return TRUE; +} + + + +BOOL TIMECONV_GetGPSTimeFromJulianDate( + const double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + const unsigned char utc_offset, //!< Integer seconds that GPS is ahead of UTC time, always positive [s] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week [s] + ) +{ + // Check the input. + if( julian_date < 0.0 ) + { + GNSS_ERROR_MSG( "if( julian_date < 0.0 )" ); + return FALSE; + } + + *gps_week = (unsigned short)((julian_date - TIMECONV_JULIAN_DATE_START_OF_GPS_TIME)/7.0); // + + *gps_tow = (julian_date - TIMECONV_JULIAN_DATE_START_OF_GPS_TIME)*SECONDS_IN_DAY; // seconds since start of gps time [s] + *gps_tow -= (*gps_week)*SECONDS_IN_WEEK; // seconds into the current week [s] + + // however, GPS time is ahead of utc time by the UTC offset (and thus the Julian date as well) + *gps_tow += utc_offset; + if( *gps_tow > SECONDS_IN_WEEK ) + { + *gps_tow -= SECONDS_IN_WEEK; + *gps_week += 1; + } + return TRUE; +} + + +BOOL TIMECONV_GetUTCTimeFromJulianDate( + const double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned short* utc_year, //!< Universal Time Coordinated [year] + unsigned char* utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char* utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char* utc_hour, //!< Universal Time Coordinated [hours] + unsigned char* utc_minute, //!< Universal Time Coordinated [minutes] + float* utc_seconds //!< Universal Time Coordinated [s] + ) +{ + int a, b, c, d, e; // temporary values + + unsigned short year; + unsigned char month; + unsigned char day; + unsigned char hour; + unsigned char minute; + unsigned char days_in_month = 0; + double td; // temporary double + double seconds; + BOOL result; + + // Check the input. + if( julian_date < 0.0 ) + { + GNSS_ERROR_MSG( "if( julian_date < 0.0 )" ); + return FALSE; + } + + a = (int)(julian_date+0.5); + b = a + 1537; + c = (int)( ((double)b-122.1)/365.25 ); + d = (int)(365.25*c); + e = (int)( ((double)(b-d))/30.6001 ); + + td = b - d - (int)(30.6001*e) + fmod( julian_date+0.5, 1.0 ); // [days] + day = (unsigned char)td; + td -= day; + td *= 24.0; // [hours] + hour = (unsigned char)td; + td -= hour; + td *= 60.0; // [minutes] + minute = (unsigned char)td; + td -= minute; + td *= 60.0; // [s] + seconds = td; + month = (unsigned char)(e - 1 - 12*(int)(e/14)); + year = (unsigned short)(c - 4715 - (int)( (7.0+(double)month) / 10.0 )); + + // check for rollover issues + if( seconds >= 60.0 ) + { + seconds -= 60.0; + minute++; + if( minute >= 60 ) + { + minute -= 60; + hour++; + if( hour >= 24 ) + { + hour -= 24; + day++; + + result = TIMECONV_GetNumberOfDaysInMonth( year, month, &days_in_month ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetNumberOfDaysInMonth returned FALSE." ); + return FALSE; + } + + if( day > days_in_month ) + { + day = 1; + month++; + if( month > 12 ) + { + month = 1; + year++; + } + } + } + } + } + + *utc_year = year; + *utc_month = month; + *utc_day = day; + *utc_hour = hour; + *utc_minute = minute; + *utc_seconds = (float)seconds; + + return TRUE; +} + +BOOL TIMECONV_GetGPSTimeFromUTCTime( + unsigned short utc_year, //!< Universal Time Coordinated [year] + unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char utc_hour, //!< Universal Time Coordinated [hours] + unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + float utc_seconds, //!< Universal Time Coordinated [s] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ) +{ + double julian_date=0.0; + unsigned char utc_offset=0; + BOOL result; + + // Check the input. + result = TIMECONV_IsUTCTimeValid( utc_year, utc_month, utc_day, utc_hour, utc_minute, utc_seconds ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_IsUTCTimeValid returned FALSE." ); + return FALSE; + } + + result = TIMECONV_GetJulianDateFromUTCTime( + utc_year, + utc_month, + utc_day, + utc_hour, + utc_minute, + utc_seconds, + &julian_date ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetJulianDateFromUTCTime returned FALSE." ); + return FALSE; + } + + result = TIMECONV_DetermineUTCOffset( julian_date, &utc_offset ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_DetermineUTCOffset returned FALSE." ); + return FALSE; + } + + result = TIMECONV_GetGPSTimeFromJulianDate( + julian_date, + utc_offset, + gps_week, + gps_tow ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetGPSTimeFromJulianDate returned FALSE." ); + return FALSE; + } + + return TRUE; +} + + + +BOOL TIMECONV_GetGPSTimeFromRinexTime( + unsigned short utc_year, //!< Universal Time Coordinated [year] + unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char utc_hour, //!< Universal Time Coordinated [hours] + unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + float utc_seconds, //!< Universal Time Coordinated [s] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ) +{ + double julian_date=0.0; + unsigned char utc_offset=0; + BOOL result; + + // Check the input. + result = TIMECONV_IsUTCTimeValid( utc_year, utc_month, utc_day, utc_hour, utc_minute, utc_seconds ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_IsUTCTimeValid returned FALSE." ); + return FALSE; + } + + result = TIMECONV_GetJulianDateFromUTCTime( + utc_year, + utc_month, + utc_day, + utc_hour, + utc_minute, + utc_seconds, + &julian_date ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetJulianDateFromUTCTime returned FALSE." ); + return FALSE; + } + + result = TIMECONV_GetGPSTimeFromJulianDate( + julian_date, + utc_offset, + gps_week, + gps_tow ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetGPSTimeFromJulianDate returned FALSE." ); + return FALSE; + } + + return TRUE; +} + + + +BOOL TIMECONV_GetUTCTimeFromGPSTime( + unsigned short gps_week, //!< GPS week (0-1024+) [week] + double gps_tow, //!< GPS time of week (0-604800.0) [s] + unsigned short* utc_year, //!< Universal Time Coordinated [year] + unsigned char* utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char* utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char* utc_hour, //!< Universal Time Coordinated [hours] + unsigned char* utc_minute, //!< Universal Time Coordinated [minutes] + float* utc_seconds //!< Universal Time Coordinated [s] + ) +{ + double julian_date = 0.0; + unsigned char utc_offset = 0; + int i; + BOOL result; + + if( gps_tow < 0.0 || gps_tow > 604800.0 ) + { + GNSS_ERROR_MSG( "if( gps_tow < 0.0 || gps_tow > 604800.0 )" ); + return FALSE; + } + + // iterate to get the right utc offset + for( i = 0; i < 4; i++ ) + { + result = TIMECONV_GetJulianDateFromGPSTime( + gps_week, + gps_tow, + utc_offset, + &julian_date ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetJulianDateFromGPSTime returned FALSE." ); + return FALSE; + } + + result = TIMECONV_DetermineUTCOffset( julian_date, &utc_offset ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_DetermineUTCOffset returned FALSE." ); + return FALSE; + } + } + + result = TIMECONV_GetUTCTimeFromJulianDate( + julian_date, + utc_year, + utc_month, + utc_day, + utc_hour, + utc_minute, + utc_seconds ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetUTCTimeFromJulianDate returned FALSE." ); + return FALSE; + } + + return TRUE; +} + + + +BOOL TIMECONV_DetermineUTCOffset( + double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned char* utc_offset //!< Integer seconds that GPS is ahead of UTC time, always positive [s], obtained from a look up table + ) +{ + if( julian_date < 0.0 ) + { + GNSS_ERROR_MSG( "if( julian_date < 0.0 )" ); + return FALSE; + } + + if( julian_date < 2444786.5000 ) *utc_offset = 0; + else if( julian_date < 2445151.5000 ) *utc_offset = 1; + else if( julian_date < 2445516.5000 ) *utc_offset = 2; + else if( julian_date < 2446247.5000 ) *utc_offset = 3; + else if( julian_date < 2447161.5000 ) *utc_offset = 4; + else if( julian_date < 2447892.5000 ) *utc_offset = 5; + else if( julian_date < 2448257.5000 ) *utc_offset = 6; + else if( julian_date < 2448804.5000 ) *utc_offset = 7; + else if( julian_date < 2449169.5000 ) *utc_offset = 8; + else if( julian_date < 2449534.5000 ) *utc_offset = 9; + else if( julian_date < 2450083.5000 ) *utc_offset = 10; + else if( julian_date < 2450630.5000 ) *utc_offset = 11; + else if( julian_date < 2451179.5000 ) *utc_offset = 12; + else if( julian_date < 2453736.5000 ) *utc_offset = 13; + else *utc_offset = 14; + + return TRUE; +} + + + + +BOOL TIMECONV_GetNumberOfDaysInMonth( + const unsigned short year, //!< Universal Time Coordinated [year] + const unsigned char month, //!< Universal Time Coordinated [1-12 months] + unsigned char* days_in_month //!< Days in the specified month [1-28|29|30|31 days] + ) +{ + BOOL is_a_leapyear; + unsigned char utmp = 0; + + is_a_leapyear = TIMECONV_IsALeapYear( year ); + + switch(month) + { + case 1: utmp = TIMECONV_DAYS_IN_JAN; break; + case 2: if( is_a_leapyear ){ utmp = 29; }else{ utmp = 28; }break; + case 3: utmp = TIMECONV_DAYS_IN_MAR; break; + case 4: utmp = TIMECONV_DAYS_IN_APR; break; + case 5: utmp = TIMECONV_DAYS_IN_MAY; break; + case 6: utmp = TIMECONV_DAYS_IN_JUN; break; + case 7: utmp = TIMECONV_DAYS_IN_JUL; break; + case 8: utmp = TIMECONV_DAYS_IN_AUG; break; + case 9: utmp = TIMECONV_DAYS_IN_SEP; break; + case 10: utmp = TIMECONV_DAYS_IN_OCT; break; + case 11: utmp = TIMECONV_DAYS_IN_NOV; break; + case 12: utmp = TIMECONV_DAYS_IN_DEC; break; + default: + { + GNSS_ERROR_MSG( "unexpected default case." ); + return FALSE; + break; + } + } + + *days_in_month = utmp; + + return TRUE; +} + + + + +BOOL TIMECONV_IsALeapYear( const unsigned short year ) +{ + BOOL is_a_leap_year = FALSE; + + if( (year%4) == 0 ) + { + is_a_leap_year = TRUE; + if( (year%100) == 0 ) + { + if( (year%400) == 0 ) + { + is_a_leap_year = TRUE; + } + else + { + is_a_leap_year = FALSE; + } + } + } + if( is_a_leap_year ) + { + return TRUE; + } + else + { + return FALSE; + } +} + + + + + +BOOL TIMECONV_GetDayOfYear( + const unsigned short utc_year, // Universal Time Coordinated [year] + const unsigned char utc_month, // Universal Time Coordinated [1-12 months] + const unsigned char utc_day, // Universal Time Coordinated [1-31 days] + unsigned short* dayofyear // number of days into the year (1-366) [days] + ) +{ + unsigned char days_in_feb = 0; + BOOL result; + result = TIMECONV_GetNumberOfDaysInMonth( utc_year, 2, &days_in_feb ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetNumberOfDaysInMonth returned FALSE." ); + return FALSE; + } + + switch( utc_month ) + { + case 1: *dayofyear = utc_day; break; + case 2: *dayofyear = (unsigned short)(TIMECONV_DAYS_IN_JAN + utc_day); break; + case 3: *dayofyear = (unsigned short)(TIMECONV_DAYS_IN_JAN + days_in_feb + utc_day); break; + case 4: *dayofyear = (unsigned short)(62 + days_in_feb + utc_day); break; + case 5: *dayofyear = (unsigned short)(92 + days_in_feb + utc_day); break; + case 6: *dayofyear = (unsigned short)(123 + days_in_feb + utc_day); break; + case 7: *dayofyear = (unsigned short)(153 + days_in_feb + utc_day); break; + case 8: *dayofyear = (unsigned short)(184 + days_in_feb + utc_day); break; + case 9: *dayofyear = (unsigned short)(215 + days_in_feb + utc_day); break; + case 10: *dayofyear = (unsigned short)(245 + days_in_feb + utc_day); break; + case 11: *dayofyear = (unsigned short)(276 + days_in_feb + utc_day); break; + case 12: *dayofyear = (unsigned short)(306 + days_in_feb + utc_day); break; + default: + { + GNSS_ERROR_MSG( "unexpected default case." ); + return FALSE; + break; + } + } + + return TRUE; +} + + +BOOL TIMECONV_GetGPSTimeFromYearAndDayOfYear( + const unsigned short year, // The year [year] + const unsigned short dayofyear, // The number of days into the year (1-366) [days] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ) +{ + BOOL result; + double julian_date = 0; + + if( gps_week == NULL ) + { + GNSS_ERROR_MSG( "if( gps_week == NULL )" ); + return FALSE; + } + if( gps_tow == NULL ) + { + GNSS_ERROR_MSG( "if( gps_tow == NULL )" ); + return FALSE; + } + if( dayofyear > 366 ) + { + GNSS_ERROR_MSG( "if( dayofyear > 366 )" ); + return FALSE; + } + + result = TIMECONV_GetJulianDateFromUTCTime( + year, + 1, + 1, + 0, + 0, + 0, + &julian_date + ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetJulianDateFromUTCTime returned FALSE." ); + return FALSE; + } + + julian_date += dayofyear - 1; // at the start of the day so -1. + + result = TIMECONV_GetGPSTimeFromJulianDate( + julian_date, + 0, + gps_week, + gps_tow ); + if( result == FALSE ) + { + GNSS_ERROR_MSG( "TIMECONV_GetGPSTimeFromJulianDate returned FALSE." ); + return FALSE; + } + + return TRUE; +} diff --git a/src/time_conversion.h b/src/time_conversion.h new file mode 100644 index 0000000..8563347 --- /dev/null +++ b/src/time_conversion.h @@ -0,0 +1,414 @@ +/** +\file time_conversion.h +\brief GNSS core 'c' function library: converting time information. +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-07-30 + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +- http://aa.usno.navy.mil/data/docs/JulianDate.html - Julian Date Converter \n +- http://aa.usno.navy.mil/faq/docs/UT.html \n +- http://wwwmacho.mcmaster.ca/JAVA/JD.html \n +- Raquet, J. F. (2002), GPS Receiver Design Lecture Notes. Geomatics Engineering, + University of Calgary Graduate Course. \n + +\b "LICENSE INFORMATION" \n +Copyright (c) 2007, refer to 'author' doxygen tags \n +All rights reserved. \n + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided the following conditions are met: \n + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. \n +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. \n +- The name(s) of the contributor(s) may not be used to endorse or promote + products derived from this software without specific prior written + permission. \n + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ + +#ifndef _C_TIMECONV_H_ +#define _C_TIMECONV_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "basictypes.h" + + +/*************************************************************************************************/ +// preprocessor constant definitions, any related enumerations and descriptors + +#ifndef SECONDS_IN_DAY +#define SECONDS_IN_DAY (86400.0) +#endif + +#ifndef SECONDS_IN_WEEK +#define SECONDS_IN_WEEK (604800.0) +#endif + +/** +\brief Obtains the UTC time, GPS time, and Julian date from PC system time. + +\author Glenn D. MacGougan (GDM) +\date 2006-11-10 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. +\remarks (1) Millisecond time is obtained +*/ +BOOL TIMECONV_GetSystemTime( + unsigned short* utc_year, //!< Universal Time Coordinated [year] + unsigned char* utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char* utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char* utc_hour, //!< Universal Time Coordinated [hours] + unsigned char* utc_minute, //!< Universal Time Coordinated [minutes] + float* utc_seconds, //!< Universal Time Coordinated [s] + unsigned char* utc_offset, //!< Integer seconds that GPS is ahead of UTC time, always positive [s], obtained from a look up table + double* julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ); + + +#ifdef WIN32 +/** +\brief Sets the PC time to the UTC time provided. + +\author Glenn D. MacGougan (GDM) +\date 2008-12-03 +\since 2008-12-03 +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL TIMECONV_SetSystemTime( + const unsigned short utc_year, //!< Universal Time Coordinated [year] + const unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + const unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + const unsigned char utc_hour, //!< Universal Time Coordinated [hours] + const unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + const float utc_seconds //!< Universal Time Coordinated [s] + ); +#endif + + +/** +\brief Computes the day of the week from the Julian date. + +\author Glenn D. MacGougan (GDM) +\date 2008-12-03 +\since 2008-12-03 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +http://en.wikipedia.org/wiki/Julian_day +*/ +BOOL TIMECONV_GetDayOfWeekFromJulianDate( + const double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned char *day_of_week //!< 0-Sunday, 1-Monday, 2-Tuesday, 3-Wednesday, 4-Thursday, 5-Friday, 6-Saturday []. + ); + + +/** +\brief Computes the Julian date from GPS time + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_GetJulianDateFromGPSTime( + const unsigned short gps_week, //!< GPS week (0-1024+) [week] + const double gps_tow, //!< GPS time of week (0-604800.0) [s] + const unsigned char utc_offset, //!< Integer seconds that GPS is ahead of UTC time, always positive [s] + double* julian_date //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + ); + +/** +\brief Computes the Julian date from UTC time + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\remarks +- Verified calculation using http://aa.usno.navy.mil/data/docs/JulianDate.html, + a Julian Date Converter and http://wwwmacho.mcmaster.ca/JAVA/JD.html, + another online converter tool. \n + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and +Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_GetJulianDateFromUTCTime( + const unsigned short utc_year, //!< Universal Time Coordinated [year] + const unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + const unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + const unsigned char utc_hour, //!< Universal Time Coordinated [hours] + const unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + const float utc_seconds, //!< Universal Time Coordinated [s] + double* julian_date //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + ); + + + + +/** +\brief Computes GPS time from the Julian date + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_GetGPSTimeFromJulianDate( + const double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + const unsigned char utc_offset, //!< Integer seconds that GPS is ahead of UTC time, always positive [s] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week [s] + ); + +/** +\brief Computes UTC time from the Julian date + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_GetUTCTimeFromJulianDate( + const double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned short* utc_year, //!< Universal Time Coordinated [year] + unsigned char* utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char* utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char* utc_hour, //!< Universal Time Coordinated [hours] + unsigned char* utc_minute, //!< Universal Time Coordinated [minutes] + float* utc_seconds //!< Universal Time Coordinated [s] + ); + +/** +\brief Computes GPS time from UTC time + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\remarks +(1) The utc offset is determined automatically from a look up table + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_GetGPSTimeFromUTCTime( + unsigned short utc_year, //!< Universal Time Coordinated [year] + unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char utc_hour, //!< Universal Time Coordinated [hours] + unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + float utc_seconds, //!< Universal Time Coordinated [s] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ); + + +/** +\brief Computes GPS time from RINEX time. RINEX time looks like UTC + but it is GPS time in year, month, day, hours, minutes, seconds. + +\author Glenn D. MacGougan (GDM) +\date 2007-12-07 +\since 2007-12-07 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\remarks +- There is no UTC offset to apply +- The RINEX time system must be the GPS Time system to use this function. + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +- RINEX version 2.11, (http://www.aiub-download.unibe.ch/rinex/rinex211.txt) +*/ +BOOL TIMECONV_GetGPSTimeFromRinexTime( + unsigned short utc_year, //!< Universal Time Coordinated [year] + unsigned char utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char utc_hour, //!< Universal Time Coordinated [hours] + unsigned char utc_minute, //!< Universal Time Coordinated [minutes] + float utc_seconds, //!< Universal Time Coordinated [s] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ); + + +/** +\brief Computes UTC time from GPS time + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\remarks +- The utc offset is determined automatically from a look up table + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_GetUTCTimeFromGPSTime( + unsigned short gps_week, //!< GPS week (0-1024+) [week] + double gps_tow, //!< GPS time of week (0-604800.0) [s] + unsigned short* utc_year, //!< Universal Time Coordinated [year] + unsigned char* utc_month, //!< Universal Time Coordinated [1-12 months] + unsigned char* utc_day, //!< Universal Time Coordinated [1-31 days] + unsigned char* utc_hour, //!< Universal Time Coordinated [hours] + unsigned char* utc_minute, //!< Universal Time Coordinated [minutes] + float* utc_seconds //!< Universal Time Coordinated [s] + ); + + + +/** +\brief This function is a look up table to determine the UTC offset from the Julian Date. + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\remarks +- This function must be updated when the next UTC *utc_offset step occurs. Current max is (13). + +\b REFERENCES \n +- Raquet, J. F. (2002), GPS Receiver Design Lecture Notes. Geomatics Engineering, + University of Calgary Graduate Course. \n + +\b "Offset Table" \n +UTCOffset, UTC Date, Julian Date [days] \n +0, Jan 06 1980 00:00:00.0, 2444244.5000 \n +1, Jul 01 1981 00:00:00.0, 2444786.5000 \n +2, Jul 01 1982 00:00:00.0, 2445151.5000 \n +3, Jul 01 1983 00:00:00.0, 2445516.5000 \n +4, Jul 01 1985 00:00:00.0, 2446247.5000 \n +5, Jan 01 1988 00:00:00.0, 2447161.5000 \n +6, Jan 01 1990 00:00:00.0, 2447892.5000 \n +7, Jan 01 1991 00:00:00.0, 2448257.5000 \n +8, Jul 01 1992 00:00:00.0, 2448804.5000 \n +9, Jul 01 1993 00:00:00.0, 2449169.5000 \n +10, Jul 01 1994 00:00:00.0, 2449534.5000 \n +11, Jan 01 1996 00:00:00.0, 2450083.5000 \n +12, Jul 01 1997 00:00:00.0, 2450630.5000 \n +13, Jan 01 1999 00:00:00.0, 2451179.5000 \n +14, Jan 01 2006 00:00:00.0, 2453736.5000 \n +*/ +BOOL TIMECONV_DetermineUTCOffset( + double julian_date, //!< Number of days since noon Universal Time Jan 1, 4713 BCE (Julian calendar) [days] + unsigned char* utc_offset //!< Integer seconds that GPS is ahead of UTC time, always positive [s], obtained from a look up table + ); + +/** +\brief Determines the number of days in a month, given the month and year. + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\b REFERENCES \n +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_GetNumberOfDaysInMonth( + const unsigned short year, //!< Universal Time Coordinated [year] + const unsigned char month, //!< Universal Time Coordinated [1-12 months] + unsigned char* days_in_month //!< Days in the specified month [1-28|29|30|31 days] + ); + + +/** +\brief Determines if the given year is a leap year + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\returns TRUE(1) if the given year is a leap year, FALSE(0) otherwise + +- Hofmann-Wellenhof, B., H. Lichtenegger, and J. Collins (1994). GPS Theory and + Practice, Third, revised edition. Springer-Verlag, Wien New York. pp. 38-42 \n +*/ +BOOL TIMECONV_IsALeapYear( const unsigned short year ); + + +/** +\brief Determines the day of year given the year, month, and day + +\author Glenn D. MacGougan (GDM) +\date 2007-11-29 +\since 2005-08-22 +\return TRUE(1) if successful, FALSE(0) otherwise. + +\remarks +(1) Performed independant comparison with http://www.mbari.org/staff/coletti/doytable.html +*/ +BOOL TIMECONV_GetDayOfYear( + const unsigned short utc_year, // Universal Time Coordinated [year] + const unsigned char utc_month, // Universal Time Coordinated [1-12 months] + const unsigned char utc_day, // Universal Time Coordinated [1-31 days] + unsigned short* dayofyear // number of days into the year (1-366) [days] + ); + + +/** +\brief Determines the GPS time of the start of a day from the day of year and the year. + +\author Glenn D. MacGougan (GDM) +\date 2007-12-07 +\since 2007-12-07 +\return TRUE(1) if successful, FALSE(0) otherwise. +*/ +BOOL TIMECONV_GetGPSTimeFromYearAndDayOfYear( + const unsigned short year, // The year [year] + const unsigned short dayofyear, // The number of days into the year (1-366) [days] + unsigned short* gps_week, //!< GPS week (0-1024+) [week] + double* gps_tow //!< GPS time of week (0-604800.0) [s] + ); + + + +#ifdef __cplusplus +} +#endif + + +#endif // _C_TIMECONV_H_ diff --git a/src/udp.c b/src/udp.c new file mode 100644 index 0000000..ef523af --- /dev/null +++ b/src/udp.c @@ -0,0 +1,82 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include +#include +#include +#include +#include +#include + + +#ifndef O_CLOEXEC +# define O_CLOEXEC 02000000 +#endif + +int openudp() +{ +int fd; +/*return socket(PF_INET, SOCK_DGRAM|O_CLOEXEC, 0);*/ + fd = socket(PF_INET, SOCK_DGRAM, 0); + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + return fd; +} + +int bindudp(int fd, unsigned port) +{ +struct sockaddr_in addr; + +memset(&addr, 0, sizeof(addr)); +addr.sin_family = AF_INET; +addr.sin_port=htons(port); +addr.sin_addr.s_addr=0; /* =inet_addr(ipnum); */ +return bind(fd, (struct sockaddr *)&addr, sizeof(addr)); +} + +int socknonblock(int fd) +{ + int flags=fcntl(fd, F_GETFL, 0); + if (flags<0) return -1; + flags|=O_NONBLOCK; + return fcntl(fd, F_SETFL, flags); +} + + +int udpreceive(int fd, char *buf, int blen, int *fromport, int *fromip) +{ +int adrlen, len; +struct sockaddr_in addr; + +adrlen=sizeof(addr); +len=recvfrom(fd, buf, blen, MSG_DONTWAIT, (struct sockaddr *) &addr, &adrlen); +*fromport=ntohs(addr.sin_port); +*fromip=ntohl(addr.sin_addr.s_addr); +return len; +} + +int udpreceiveblock(int fd, char *buf, int blen, int *fromport, int *fromip) +{ +int adrlen, len; +struct sockaddr_in addr; + +adrlen=sizeof(addr); +len=recvfrom(fd, buf, blen, 0, (struct sockaddr *) &addr, &adrlen); +*fromport=ntohs(addr.sin_port); +*fromip=ntohl(addr.sin_addr.s_addr); +return len; +} + +int udpsend(int fd, char *buf, int blen, int toport, int toip) +{ +struct sockaddr_in addr; + +memset(&addr, 0, sizeof(addr)); +addr.sin_family = AF_INET; +addr.sin_port=htons(toport); +addr.sin_addr.s_addr=htonl(toip); +return sendto(fd, buf, blen, 0, (struct sockaddr *) &addr, sizeof(addr)); +} diff --git a/src/udp.h b/src/udp.h new file mode 100644 index 0000000..4cdc243 --- /dev/null +++ b/src/udp.h @@ -0,0 +1,26 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef udp_H_ +#define udp_H_ + +extern long openudp(void); + +extern long bindudp(long, unsigned long); + +extern long socknonblock(long); + +extern long udpreceive(long, char [], long, unsigned long *, + unsigned long *); + +extern long udpreceiveblock(long, char [], long, unsigned long *, + unsigned long *); + +extern long udpsend(long, char [], long, unsigned long, unsigned long); + + +#endif /* udp_H_ */ diff --git a/src/udpbox.c b/src/udpbox.c new file mode 100644 index 0000000..f7eb1c0 --- /dev/null +++ b/src/udpbox.c @@ -0,0 +1,2429 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define udpbox_C_ +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef Select_H_ +#include "Select.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif + +/* axudp in/out ui/aprs stream splitter, filter, digipeater by OE5DXL */ +/*FROM FdSet IMPORT FdSet, FD_ZERO, FD_SET, FD_ISSET, TimeVal;*/ +/*FROM mlib IMPORT select*/ +/*FROM Storage IMPORT ALLOCATE; */ +/*FROM Lib IMPORT NextArg; */ +/*FROM TimeConv IMPORT time; */ +#define udpbox_CALLLEN 7 + +#define udpbox_HASHSIZE 16384 + +#define udpbox_NOTFIRSTDIGI 3 + +#define udpbox_NOUPLINKCHECK 4 + +#define udpbox_SENDTRACE 5 + +#define udpbox_SENDWIDE 6 + +#define udpbox_DOWNPATHDIGICALL 7 + +#define udpbox_DOWNPATHRELAY 8 + +#define udpbox_DOWNPATHWIDE 9 + +#define udpbox_NOVIADIGICALL 10 + +#define udpbox_NOVIARELAY 11 + +#define udpbox_NOVIATRACE 12 + +#define udpbox_NOVIAWIDEN 13 + +#define udpbox_NOCALLBEFOREWIDE 14 + +#define udpbox_SSIDTOWIDE 15 + +#define udpbox_NULLSSID 16 + +#define udpbox_KILLWIDE 17 + +#define udpbox_VIAGATE 18 + +#define udpbox_RELAYECHO 19 +/* FINGERPRINT=20; */ + +#define udpbox_STDIN 0 + +#define udpbox_STDINIP 0x0FFFFFFFF + +typedef uint32_t SET256[8]; + +typedef char RAWCALL[7]; + +typedef char MONCALL[9]; + +typedef char FILENAME[1024]; + +struct DIGIPARMS; + +typedef struct DIGIPARMS * pDIGIPARMS; + + +struct DIGIPARMS { + RAWCALL digicall; + uint32_t pathcheck; + uint32_t duptime; + uint32_t messagetime; + uint32_t timehash[16384]; +}; + +struct BEACON; + + +struct BEACON { + uint32_t bintervall; + uint32_t piggytime; /* time send beacons earlier if sending some else */ + char piggyback; /* sent something so append beacon immediately */ + FILENAME bfile; + uint32_t btime; + uint32_t bline; +}; + +struct CALLS; + +typedef struct CALLS * pCALLS; + + +struct CALLS { + pCALLS next; + RAWCALL call; +}; + +struct OUTPORT; + +typedef struct OUTPORT * pOUTPORT; + + +struct OUTPORT { + pOUTPORT next; + uint32_t toip; + uint32_t toport; + pCALLS filtercalls; + char echo; + char rawwrite; + char crlfwrite; + char passnoUI; + char axudp2; + char satgate; + SET256 aprspass; + pDIGIPARMS digiparm; + struct BEACON beacon0; + struct aprspos_POSITION mypos; + int32_t maxkm; +}; + +struct INSOCK; + +typedef struct INSOCK * pINSOCK; + + +struct INSOCK { + pINSOCK next; + int32_t fd; + char rawread; + MONCALL rflinkname; + uint32_t fromip; + uint32_t bindport; + pOUTPORT outchain; +}; + +struct MSGHASH; + +typedef struct MSGHASH * pMSGHASH; + +struct _0; + + +struct _0 { + uint32_t sums; + uint32_t ackcnt; + uint32_t acktime; + pINSOCK source; + MONCALL froms; + char acks[6]; +}; + + +struct MSGHASH { + pMSGHASH next; + MONCALL usercall; + FILENAME msgfile; + uint32_t wpos; + struct _0 hash[16]; +}; + +#define udpbox_MAXLEN 338 + +#define udpbox_MINLEN 17 + +static char udpbox_BLANKH = '@'; + +#define udpbox_HBIT 128 + +#define udpbox_ACKMSG "ack" + +static uint32_t udpbox_POLYNOM = 0x8408UL; + +#define udpbox_cFILTPASS "p" + +#define udpbox_cFILTDEL "d" + +#define udpbox_DEFAULTMESSAGETIME 28 +/* block seconds user message frames */ + +#define udpbox_DEFAULTDUPTIME 1740 +/* block seconds invariant payload frames */ + +#define udpbox_CR "\015" + +#define udpbox_LF "\012" + +#define udpbox_SENDACKS 4 + +#define udpbox_OLDMSG 600 +/* s long kill dupe user message */ + +#define udpbox_TOCALL "APNL01" + +#define udpbox_DEFAULTACK "WIDE2-2" + +#define udpbox_cUSERMSG ":" + +#define udpbox_cTELEMETRY "T" + +static char show; + +static pINSOCK insocks; + +static uint32_t showip; + +static uint32_t showport; + +static pMSGHASH msgusers; + +static char ackpath[64]; + +static uint32_t stdinpos; + +static char stdinbuf[256]; + + +static void Err(const char text[], uint32_t text_len) +{ + osi_WrStr("udpbox: ", 9ul); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); +} /* end Err() */ + + +static void Stomsg(pMSGHASH user, const char from[], uint32_t from_len, + const char to[], uint32_t to_len, + const char msg[], uint32_t msg_len, + const char ack[], uint32_t ack_len, pINSOCK fromsock) +{ + uint32_t h; + uint32_t i; + uint32_t t; + int32_t f; + char mb[256]; + struct MSGHASH * anonym; + struct _0 * anonym0; + { /* with */ + struct MSGHASH * anonym = user; + i = 0UL; + while (i<=msg_len-1 && msg[i]) ++i; + t = osic_time(); + h = aprsstr_Hash(msg, msg_len, 0L, (int32_t)i)&16383UL; + i = 0UL; + while (i<=15UL && !(((h==anonym->hash[i].sums && anonym->hash[i] + .acktime+600UL>=t) && aprsstr_StrCmp(ack, ack_len, + anonym->hash[i].acks, 6ul)) && aprsstr_StrCmp(from, from_len, + anonym->hash[i].froms, 9ul))) ++i; + if (i>15UL) { + /* new msg*/ + aprsstr_DateToStr(t, mb, 256ul); + aprsstr_Append(mb, 256ul, " from ", 7ul); + aprsstr_Append(mb, 256ul, from, from_len); + aprsstr_Append(mb, 256ul, " to ", 5ul); + aprsstr_Append(mb, 256ul, to, to_len); + aprsstr_Append(mb, 256ul, " <", 3ul); + aprsstr_Append(mb, 256ul, msg, msg_len); + aprsstr_Append(mb, 256ul, "> (", 4ul); + aprsstr_Append(mb, 256ul, ack, ack_len); + aprsstr_Append(mb, 256ul, ")", 2ul); + if (show) { + osi_WrStr(" <", 3ul); + osi_WrStr(mb, 256ul); + osi_WrStr("> ", 3ul); + } + aprsstr_Append(mb, 256ul, "\012", 2ul); + if (anonym->msgfile[0U]) { + f = osi_OpenAppend(anonym->msgfile, 1024ul); + if (f<0L) f = osi_OpenWrite(anonym->msgfile, 1024ul); + if (f>=0L) { + osi_WrBin(f, (char *)mb, 256u/1u, aprsstr_Length(mb, + 256ul)); + osic_Close(f); + } + } + { /* with */ + struct _0 * anonym0 = &anonym->hash[anonym->wpos]; + anonym0->sums = h; + aprsstr_Assign(anonym0->acks, 6ul, ack, ack_len); + aprsstr_Assign(anonym0->froms, 9ul, from, from_len); + if ((uint8_t)ack[0UL]>' ') { + anonym0->ackcnt = 4UL; + anonym0->acktime = 0UL; + } + anonym0->source = fromsock; + } + ++anonym->wpos; + if (anonym->wpos>15UL) anonym->wpos = 0UL; + } + else { + /* old msg */ + anonym->hash[i].ackcnt = 4UL; + } + } +} /* end Stomsg() */ + +#define udpbox_THIRDPARTY "}" + +#define udpbox_HEADEREND ":" + +#define udpbox_FROMEND ">" + +#define udpbox_USERACK "{" + + +static char Usermsg(const char b[], uint32_t b_len, + int32_t len, int32_t p, pINSOCK fromsock, + char * selfmsg) +{ + int32_t pf; + uint32_t j; + pMSGHASH user; + char to[9]; + char from[9]; + char ack[6]; + char msg[69]; + char ok0; + *selfmsg = 0; + pf = 0L; /* from whom */ + while (b[p]=='}') { + /* remove third party header */ + pf = p+1L; + while (p"); WrStr("<"); WrStr(to); + WrStrLn(">"); */ + user = msgusers; + while (user) { + j = 0UL; + while (j<=8UL && user->usercall[j]==to[j]) ++j; + if (j==9UL) { + /* + j:=0; + IF pf=0 THEN + IF Call2Str(b, from, 7, j) THEN END; + ELSE + WHILE (pfFROMEND) + DO from[j]:=b[pf]; INC(pf); INC(j); END; + END; + WHILE j<=HIGH(from) DO from[j]:=" "; INC(j) END; + + FOR j:=0 TO 8 DO to[j]:=b[p]; INC(p) END; + */ + p += 10L; + j = 0UL; + while ((pnext; + } + } + return 0; +} /* end Usermsg() */ + +static char udpbox_WILDH = 'T'; + + +static char CallFilt(pCALLS calls, const char s[], + uint32_t s_len, int32_t len) +{ + int32_t j; + int32_t i; + pCALLS c; + char b; + char ok0; + i = 0L; + do { + c = calls; + while (c) { + j = 0L; + for (;;) { + if (c->call[j]!='T' && c->call[j]!=s[i+j]) break; + ++j; + if (j>=6L) { + if (c->call[j] && ((uint8_t)(uint8_t)c->call[j]&0x1EU) + !=((uint8_t)(uint8_t)s[i+j]&0x1EU)) break; + return 1; + } + } + c = c->next; + } + i += 7L; + } while (!(i>=len || ((uint32_t)(uint8_t)s[i-1L]&1))); + i += 2L; + if (s[i]=='}') { + ++i; + for (;;) { + if (i>=len) break; + c = calls; + while (c) { + j = 0L; + ok0 = 1; + for (;;) { + b = s[i+j]; + if (((((i+j>=len || b=='*') || b==',') || b=='>') || b==':') + || b=='-') break; + if (j>=6L || c->call[j]!='T' && b!=(char)((uint32_t) + (uint8_t)c->call[j]>>1)) ok0 = 0; + ++j; + } + if (ok0 && (j>=6L || c->call[j]=='@')) return 1; + c = c->next; + } + while (((ipassnoUI) { + if (show) osi_WrStrLn(" pass axudp2", 13ul); + return 1; + } + else return 0; + } + i = 13L; + while (ilen || ((uint8_t)(uint8_t)b[i-2L]&~0x10U)!=0x3U) { + if (show) osi_WrStr(" not UI ", 9ul); + return parm->passnoUI; + } + /* not UI frame */ + /* is UI frame */ + if (Usermsg(b, b_len, len, i, fromsock, &selfmsg)) return 0; + if (parm->filtercalls && CallFilt(parm->filtercalls, b, b_len, len)) { + if (show) osi_WrStrLn(" callfilter match", 18ul); + return 0; + } + if (!X2C_INL((uint8_t)b[i],256, + parm->aprspass) || selfmsg && !X2C_INL((int32_t)84,256, + parm->aprspass)) { + if (show) osi_WrStrLn(" message type filter", 21ul); + return 0; + } + if (parm->maxkm>0L && (b[i]!=':' || b[i+10L]!=':')) { + /* dist filter on and no user message */ + km = DistFilt(parm->mypos, b, b_len, (uint32_t)i, (uint32_t)len); + if (km<0L) { + if (show) osi_WrStrLn(" no pos", 8ul); + return 0; + } + if (show) { + osi_WrStrLn(" ", 2ul); + osic_WrINT32((uint32_t)km, 1UL); + osi_WrStr("km", 3ul); + } + if (km>=parm->maxkm) { + if (show) osi_WrStrLn(" too far", 9ul); + return 0; + } + } + if ((parm->satgate && !((uint32_t)(uint8_t)b[13UL]&1)) && (uint8_t) + b[20UL]<(uint8_t)'\200') { + /* has >=1 vias and first via no h-bit */ + if (show) osi_WrStrLn(" sat gate and direct heard", 27ul); + return 0; + } + return 1; +} /* end Filter() */ + + +static int32_t getstdin(char buf[], uint32_t buf_len) +{ + char c; + while (osi_RdBin(0L, (char *) &c, 1u/1u, 1UL)==1L) { + if (c=='\012') c = 0; + if (stdinpos<255UL) { + stdinbuf[stdinpos] = c; + ++stdinpos; + } + if (c==0) { + aprsstr_Assign(buf, buf_len, stdinbuf, 256ul); + stdinpos = 0UL; + return (int32_t)aprsstr_Length(buf, buf_len); + } + } + return -1L; +} /* end getstdin() */ + + +static int32_t getudp(int32_t fd, char buf[], uint32_t buf_len, + uint32_t fromip, char addcrc) +{ + uint32_t fromport; + uint32_t ip; + char crc2; + char crc1; + int32_t len; + len = udpreceive(fd, buf, (int32_t)(buf_len), &fromport, &ip); + if ((len>2L && len<(int32_t)(buf_len)) && (fromip==0UL || fromip==ip)) { + showip = ip; + showport = fromport; + if (!addcrc) return len; + crc1 = buf[len-2L]; + crc2 = buf[len-1L]; + aprsstr_AppCRC(buf, buf_len, len-2L); + if (crc1==buf[len-2L] && crc2==buf[len-1L]) return len; + if (show) osi_WrStrLn(" raw crc error ", 16ul); + } + /* + IO.WrHex(ORD(crc1)+ORD(crc2)*256, 1); + IO.WrStr("<>"); + IO.WrHex(ORD(buf[len-2])+ORD(buf[len-1])*256, 1); + IO.WrStr(" "); + */ + return -1L; +} /* end getudp() */ + + +static void checkhamnet(char b[], uint32_t b_len, int32_t * len, + const char rflinkname[], uint32_t rflinkname_len, + RAWCALL hamup0) +{ + int32_t j; + int32_t i; + uint32_t s; + int32_t tmp; + if (rflinkname[0UL]==0) return; + hamup0[0U] = 0; + i = 0L; + while (b[i]!='>') { + /* skip fromcall */ + ++i; + if (i>=*len) { + *len = 0L; + return; + } + } + ++i; + j = 0L; + while (j<=(int32_t)(rflinkname_len-1) && rflinkname[j]) { + /* compare rflink name */ + if (b[i]!=rflinkname[j]) { + *len = 0L; + return; + } + ++i; + ++j; + } + if (b[i]==',') { + ++i; + j = 0L; + while (((i<*len && b[i]!='-') && b[i]!=',') && b[i]!=':') { + /* make rawcall of rflink uplink */ + s = (uint32_t)(uint8_t)b[i]*2UL&255UL; + if (s<=64UL) { + *len = 0L; + return; + } + hamup0[j] = (char)s; + ++i; + ++j; + if (j>=7L) { + *len = 0L; + return; + } + } + while (j<6L) { + hamup0[j] = '@'; + ++j; + } + s = 0UL; + if (b[i]=='-') { + ++i; + while ((uint8_t)b[i]>='0' && (uint8_t)b[i]<='9') { + s = (s*10UL+(uint32_t)(uint8_t)b[i])-48UL; + ++i; + } + if (s>15UL) { + *len = 0L; + return; + } + } + hamup0[j] = (char)((s+48UL+64UL)*2UL); /* set H bit */ + } + if (b[i]!=',' && b[i]!=':') { + *len = 0L; + return; + } + while (b[i]!='}') { + /* find end of rflink head */ + ++i; + if (i>=*len) { + *len = 0L; + return; + } + } + ++i; + *len -= i; /* payload len */ + tmp = *len; + j = 0L; + if (j<=tmp) for (;; j++) { + b[j] = b[i]; /* remove rflink head */ + ++i; + if (j==tmp) break; + } /* end for */ +/* DIGICALL>HAMNAME,UPLINKCALL,.... :}payload */ +} /* end checkhamnet() */ + +/* +PROCEDURE MakeDupeTime(s-:ARRAY OF CHAR; p:INTEGER; parm:pDIGIPARMS):TIME; +VAR le,nu:CARDINAL; + i:INTEGER; +BEGIN + le:=0; + nu:=0; + FOR i:=p+3 TO p+5 DO + IF (s[i]>="A") & (s[i]<="Z") THEN INC(le) END; + IF (s[i]>="0") & (s[i]<="9") THEN INC(nu) END; + END; + IF (s[p+2]=cUSERMSG) & (le>0) & (nu>0) & (le+nu=3) + THEN (* looks like a user message *) + RETURN parm^.messagetime + END; + RETURN parm^.duptime +END MakeDupeTime; +*/ + +static char IsCall(const char raw[], uint32_t raw_len, + uint32_t pos, uint32_t div0) +{ + uint32_t i; + uint32_t nu; + uint32_t le; + char c; + uint32_t tmp; + le = 0UL; + nu = 0UL; + tmp = pos+2UL; + i = pos; + if (i<=tmp) for (;; i++) { + c = (char)((uint32_t)(uint8_t)raw[i]/div0); + if ((uint8_t)c>='A' && (uint8_t)c<='Z') ++le; + if ((uint8_t)c>='0' && (uint8_t)c<='9') ++nu; + if (i==tmp) break; + } /* end for */ + return (le>0UL && nu>0UL) && le+nu==3UL; +/* looks like a call */ +} /* end IsCall() */ + + +static char Dup(const char raw[], uint32_t raw_len, + uint32_t pathlen, uint32_t rawlen, uint32_t * sum) +{ + uint32_t i; + uint32_t len; + uint8_t hashh; + uint8_t hashl; + char h[256]; + char ok0; + /* + PROCEDURE hash(c:CHAR); + VAR b:CARD8; + BEGIN + (* + IO.WrStr("<");IO.WrChar(c);IO.WrStr(">"); + *) + IF c<>" " THEN + b:=CAST(CARD8, CAST(SET8, c) / hashl); + hashl:=CRCL[b] / hashh; + hashh:=CRCH[b]; + END; + END hash; + */ + hashl = 0U; + hashh = 0U; + pathlen += 2UL; /* skip frametyp pid */ + if (raw[pathlen]!='}') { + len = 0UL; + ok0 = aprsstr_Call2Str(raw, raw_len, h, 256ul, 7UL, &len); + i = 0UL; + while (i=rawlen) break; + if (raw[pathlen-1UL]==':') { + if (raw[pathlen]=='}') i = pathlen+1UL; + else break; + } + } + while (i='1' && (uint8_t)c<='7') + && (uint8_t)c>=(uint8_t)(char)(48UL+ssid); +} /* end ChkNN() */ + + +static char NeqN(uint32_t ssid, char c, int32_t pos) +{ + return pos<=14L && (ssid+48UL==(uint32_t)(uint8_t) + c/2UL || ssid==0UL && c=='@'); +} /* end NeqN() */ + + +static void setSSID(char * c, uint32_t ssid) +{ + *c = (char)((uint8_t)(uint8_t)*c&~0x1EU|(uint8_t)(ssid*2UL)); +} /* end setSSID() */ + + +static uint32_t getSSID(char c) +{ + return (uint32_t)(uint8_t)c/2UL&15UL; +} /* end getSSID() */ + + +static void killwide(int32_t * startpath, int32_t downpath, char s[], + uint32_t s_len) +{ + int32_t j; + int32_t i; + int32_t tmp; + int32_t tmp0; + tmp = downpath-1L; + i = *startpath; + if (i<=tmp) for (tmp = (uint32_t)(tmp-i)/7L;;) { + if (((s[i]=='\256' && s[i+1L]=='\222') && s[i+2L]=='\210') + && s[i+3L]=='\212') { + tmp0 = *startpath; + j = i-1L; + if (j>=tmp0) for (;; j--) { + s[j+7L] = s[j]; + if (j==tmp0) break; + } /* end for */ + *startpath += 7L; + } + if (!tmp) break; + --tmp; + i += 7L; + } /* end for */ +} /* end killwide() */ + + +static void Digi(char raw[], uint32_t raw_len, char send[], + uint32_t send_len, int32_t inlen0, int32_t * outlen0, + const RAWCALL hamup0, pDIGIPARMS parm, char duponly) +{ + int32_t goodpath; + int32_t downpath; + int32_t actdigi; + int32_t startpath; + int32_t pathlen; + int32_t j; + int32_t i; + uint32_t ssidroute; + uint32_t hash; + uint32_t ssid; + uint32_t tt; + uint32_t t; + char noloop; + char nodigicall; + char ok0; + int32_t tmp; + if ((uint8_t)parm->digicall[0U]<='@') duponly = 1; + *outlen0 = 0L; + inlen0 -= 2L; /* crc bytes */ + pathlen = 13L; + while (pathlen=200C) + <>(raw[13]>=200C)) THEN */ + actdigi = 14L; + noloop = 1; + if ((0x8UL & parm->pathcheck)) { + /* need not be first repeater */ + while (actdigi=(uint8_t) + '\200') { + /* test if own digicall in path */ + ok0 = 0; + for (i = 0L; i<=5L; i++) { + if (raw[i+actdigi]!=parm->digicall[i]) ok0 = 1; + } /* end for */ + if (getSSID(raw[(actdigi+7L)-1L])!=getSSID(parm->digicall[6U])) { + ok0 = 1; + } + if (!ok0) noloop = 0; + actdigi += 7L; + } + } + if (noloop) { + /* not looping thru own digi */ + startpath = actdigi+7L; + nodigicall = 0; + if ((0x80UL & parm->pathcheck)) downpath = pathlen; + /* test for ssid routing*/ + ssid = (uint32_t)(int32_t)(parm->pathcheck&0x7UL); + /* limit ssid routing hopps */ + ssidroute = getSSID(raw[6UL]); /* destination call ssid */ + goodpath = 14L; + while ((goodpath=(uint8_t) + '\200') && IsCall(raw, raw_len, (uint32_t)goodpath, 2UL)) { + goodpath += 7L; /* repeated via callsigns */ + } + if ((((ssidroute>0UL && ssid>0UL) && goodpath==pathlen) + && pathlen<49L) && ((0x8UL & parm->pathcheck) + || goodpath==14L)) { + ok0 = 1; + if (ssidroute>7UL) ssidroute = 1UL; + if (ssidroute>ssid) ssidroute = ssid; + if (ssidroute==1UL || (0x8000UL & parm->pathcheck)==0) { + /* use decrement dest ssid routing */ + setSSID(&raw[6UL], ssidroute-1UL); + /* chain by dec dest ssid */ + ssidroute = 0UL; + } + else { + /* expand to digicall + wideN-N */ + --ssidroute; + setSSID(&raw[6UL], 0UL); /* switch to via routing */ + } + downpath = 0L; /* delete rest of path */ + if (show) osi_WrStr(" via ssid routing ", 19ul); + } + else { + ssidroute = 0UL; + if (goodpath<=14L) goodpath = 0L; + if ((0x10UL & parm->pathcheck)) goodpath = actdigi; + ok0 = pathlen>actdigi && (uint8_t)raw[actdigi+6L]<(uint8_t) + '\200'; /* there are via calls & is not digipeated */ + if (ok0) { + ssid = getSSID(raw[actdigi+6L]); + if ((0x400UL & parm->pathcheck)) ok0 = 0; + else { + for (i = 0L; i<=5L; i++) { + if (raw[i+actdigi]!=parm->digicall[i]) { + ok0 = 0; + } + } /* end for */ + if (ssid!=getSSID(parm->digicall[6U])) ok0 = 0; + } + if (ok0) { + if ((0x80UL & parm->pathcheck)) downpath = pathlen; + if (show) osi_WrStr(" via digicall ", 15ul); + } + else if ((0x800UL & parm->pathcheck)==0) { + ok0 = Cmp(raw, raw_len, (uint32_t)actdigi, "RELAY ", + 7ul); + if (!ok0 && (0x80000UL & parm->pathcheck)) { + ok0 = Cmp(raw, raw_len, (uint32_t)actdigi, "ECHO ", + 7ul); + } + if (ok0) { + if ((0x100UL & parm->pathcheck)) downpath = pathlen; + if (show) osi_WrStr(" via RELAY ", 12ul); + } + } + if (!ok0) { + if ((0x40000UL & parm->pathcheck)) { + ok0 = Cmp(raw, raw_len, (uint32_t)actdigi, "GATE ", + 7ul); + if (ok0) { + if ((0x100UL & parm->pathcheck)) { + downpath = pathlen; + } + if (show) osi_WrStr(" via GATE ", 11ul); + } + } + } + if (!ok0) { + if ((((0x1000UL & parm->pathcheck)==0 && Cmp(raw, raw_len, + (uint32_t)actdigi, "TRACE", 6ul)) && ChkNN(ssid, + raw[actdigi+5L])) && (goodpath==actdigi || NeqN(ssid, + raw[actdigi+5L], actdigi))) { + ok0 = 1; + if (ssid>(uint32_t)((0x10000UL & parm->pathcheck)==0) + && (0x20UL & parm->pathcheck)) { + setSSID(&raw[actdigi+6L], ssid-1UL); + /* dec(N) of WIDEn-N */ + startpath = actdigi; + } + if ((0x100UL & parm->pathcheck)==0) { + downpath = actdigi+7L; + } + } + if (show && ok0) osi_WrStr(" via TRACEn-n ", 15ul); + } + if (!ok0) { + if (((((0x2000UL & parm->pathcheck)==0 && Cmp(raw, raw_len, + (uint32_t)actdigi, "WIDE", + 5ul)) && raw[actdigi+5L]=='@') && ChkNN(ssid, + raw[actdigi+4L])) && (goodpath==actdigi || NeqN(ssid, + raw[actdigi+4L], actdigi))) { + ok0 = 1; + if (raw[actdigi+4L]!='@' && (0x40UL & parm->pathcheck)) { + if ((0x4000UL & parm->pathcheck) + || goodpath!=actdigi && !NeqN(ssid, raw[actdigi+4L], + actdigi)) nodigicall = 1; + if (ssid>(uint32_t)((0x10000UL & parm->pathcheck) + ==0)) { + setSSID(&raw[actdigi+6L], ssid-1UL); + startpath = actdigi; + } + else if (nodigicall) { + raw[actdigi+6L] = '\340'; /* WIDE* */ + } + if (nodigicall) startpath = actdigi; + } + if ((0x200UL & parm->pathcheck)==0) { + downpath = actdigi+7L; + } + } + if (show && ok0) osi_WrStr(" via WIDEn-n ", 14ul); + } + if (show && !ok0) osi_WrStr(" no source path ", 17ul); + } + else if (show) osi_WrStr(" already digipeated ", 21ul); + } + } + else if (show) osi_WrStr(" we have already digipeated ", 29ul); + } + /* ELSIF show THEN WrStr(" fingerprint filtered " ) END; */ + if (duponly || ok0) { + /* + IO.WrLn; IO.WrStr("<<<");IO.WrHex(ORD(raw[pathlen+2]),1); + IO.WrStr(">>> "); + */ + tt = parm->duptime; + if (Dup(raw, raw_len, (uint32_t)pathlen, (uint32_t)inlen0, &hash)) { + tt = parm->messagetime; + } + t = osic_time(); /* time in s */ + if (parm->timehash[hash]+tt<=t) { + /* not a duplicate */ + parm->timehash[hash] = t; + if (duponly) { + /* dupfilter only */ + *outlen0 = inlen0+2L; + tmp = *outlen0-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + send[i] = raw[i]; + if (i==tmp) break; + } /* end for */ + } + else { + /* digipeater */ + i = 0L; + while (idigicall[j]; /* append new via digicall */ + ++i; + } /* end for */ + } + if (ssidroute>0UL) { + send[i] = '\256'; + ++i; + send[i] = '\222'; + ++i; + send[i] = '\210'; + ++i; + send[i] = '\212'; + ++i; + send[i] = (char)((48UL+ssidroute)*2UL); + ++i; + send[i] = '@'; + ++i; + send[i] = (char)((48UL+ssidroute)*2UL); /* no H bit set */ + ++i; + } + if ((0x20000UL & parm->pathcheck)) { + killwide(&startpath, downpath, raw, raw_len); + } + j = startpath; /* append rest of path */ + while (jtimehash[hash], 1UL); + osi_WrStr("s since same payload ", 22ul); + } + } +} /* end Digi() */ + + +static int32_t GetIp(char h[], uint32_t h_len, uint32_t * p, + uint32_t * ip, uint32_t * port) +{ + uint32_t n; + uint32_t i; + char ok0; + int32_t GetIp_ret; + X2C_PCOPY((void **)&h,h_len); + *p = 0UL; + h[h_len-1] = 0; + *ip = 0UL; + for (i = 0UL; i<=4UL; i++) { + n = 0UL; + ok0 = 0; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + ok0 = 1; + n = (n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + if (!ok0) { + GetIp_ret = -1L; + goto label; + } + if (i<3UL) { + if (h[*p]!='.' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + *ip = *ip*256UL+n; + } + else if (i==3UL) { + *ip = *ip*256UL+n; + if (h[*p]!=':' || n>255UL) { + GetIp_ret = -1L; + goto label; + } + } + else if (n>65535UL) { + GetIp_ret = -1L; + goto label; + } + *port = n; + ++*p; + } /* end for */ + GetIp_ret = 0L; + label:; + X2C_PFREE(h); + return GetIp_ret; +} /* end GetIp() */ + + +static int32_t GetSec(char h[], uint32_t h_len, uint32_t * p, + uint32_t * n) +{ + char ok0; + int32_t GetSec_ret; + X2C_PCOPY((void **)&h,h_len); + h[h_len-1] = 0; + *n = 0UL; + ok0 = 0; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + ok0 = 1; + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + if (!ok0) { + GetSec_ret = -1L; + goto label; + } + /* + IO.WrCard(n,10); IO.WrLn; + */ + GetSec_ret = 0L; + label:; + X2C_PFREE(h); + return GetSec_ret; +} /* end GetSec() */ + + +static void MakeRawCall(RAWCALL c, char s[], uint32_t s_len, + uint32_t j) +{ + uint32_t n; + uint32_t i; + X2C_PCOPY((void **)&s,s_len); + i = 0UL; + while (i<6UL) { + if ((s[j] && s[j]!=',') && s[j]!='-') { + c[i] = (char)((uint32_t)(uint8_t)s[j]*2UL); + ++j; + } + else c[i] = '@'; + ++i; + } + n = 0UL; + if (s[j]=='-') { + ++j; + while ((uint8_t)s[j]>='0' && (uint8_t)s[j]<='9') { + n = (n*10UL+(uint32_t)(uint8_t)s[j])-48UL; + ++j; + } + } + if (n>15UL) Err("wrong SSID", 11ul); + if (s[j]=='*') c[6U] = 0; + else c[6U] = (char)(n*2UL+224UL); + X2C_PFREE(s); +} /* end MakeRawCall() */ + + +static void Ackpath(const char h[], uint32_t h_len) +{ + aprsstr_Assign(ackpath, 64ul, ">", 2ul); + aprsstr_Append(ackpath, 64ul, "APNL01", 7ul); + if (h[0UL]) { + aprsstr_Append(ackpath, 64ul, ",", 2ul); + aprsstr_Append(ackpath, 64ul, h, h_len); + } + aprsstr_Append(ackpath, 64ul, "::", 3ul); +} /* end Ackpath() */ + + +static char getfix(float * x, const char s[], uint32_t s_len, + uint32_t * p) +{ + uint32_t i; + char h[256]; + i = 0UL; + while (((uint8_t)s[*p]>' ' && s[*p]!='/') && i<255UL) { + h[i] = s[*p]; + ++i; + ++*p; + } + h[i] = 0; + if (aprsstr_StrToFix(x, h, 256ul)) return 1; + return 0; +} /* end getfix() */ + +static SET256 _cnst0 = {0x00000000UL,0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL,0x00000000UL,0x00000000UL}; +static SET256 _cnst = {0xFFFFFFFFUL,0xFFFFFFFFUL,0xFFFFFFFFUL,0xFFFFFFFFUL, + 0xFFFFFFFFUL,0xFFFFFFFFUL,0xFFFFFFFFUL,0xFFFFFFFFUL}; + +static void parms(void) +{ + char h[4096]; + char actpassui; + char actsat; + char actecho; + char err; + char lasth; + pINSOCK actsock0; + pOUTPORT onext; + pOUTPORT outsock0; + SET256 actpass; + pDIGIPARMS actdigi; + uint32_t nold; + uint32_t n; + uint32_t i; + struct BEACON actbeacon; + pMSGHASH user; + pCALLS callnext; + pCALLS actcall; + float actkm; + struct aprspos_POSITION actpos; + struct INSOCK * anonym; + struct BEACON * anonym0; + struct DIGIPARMS * anonym1; + struct OUTPORT * anonym2; + struct MSGHASH * anonym3; + SET256 tmp; + msgusers = 0; + actsock0 = 0; + actcall = 0; + err = 0; + show = 0; + Ackpath("WIDE2-2", 8ul); + actkm = 0.0f; + actpassui = 0; + actsat = 0; + for (;;) { + osi_NextArg(h, 4096ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + lasth = h[1U]; + if (lasth=='a') { + osi_NextArg(h, 4096ul); + if (h[0U]=='-') h[0U] = 0; + Ackpath(h, 4096ul); + } + else if ((lasth=='R' || lasth=='M') || lasth=='L') { + osi_NextArg(h, 4096ul); + actecho = 0; + memcpy(actpass,_cnst,32u); + actdigi = 0; + actcall = 0; + actkm = 0.0f; + actpassui = 0; + actsat = 0; + actbeacon.bintervall = 0UL; + actbeacon.piggytime = 0UL; + actbeacon.piggyback = 0; + osic_alloc((char * *) &actsock0, sizeof(struct INSOCK)); + if (actsock0==0) Err("out of memory", 14ul); + { /* with */ + struct INSOCK * anonym = actsock0; + anonym->outchain = 0; + anonym->rflinkname[0U] = 0; + if (GetIp(h, 4096ul, &i, &anonym->fromip, + &anonym->bindport)<0L) Err("cannot open udp socket", 23ul); + anonym->fd = openudp(); + anonym->rawread = lasth=='R'; + if (lasth=='L') { + n = 0UL; + if (h[i-1UL]==':') { + for (;;) { + if (i>=4095UL) break; + if (h[i]==0) break; + anonym->rflinkname[n] = h[i]; + ++i; + ++n; + } + } + if (n==0UL) Err("-L ip:port:name", 16ul); + } + if ((anonym->fd>=0L && anonym->fromip!=X2C_max_longcard) + && bindudp(anonym->fd, anonym->bindport)<0L) { + Err("cannot bind inport", 19ul); + } + anonym->next = 0; + } + if (insocks) actsock0->next = insocks; + insocks = actsock0; + } + else if (lasth=='f') { + osi_NextArg(h, 4096ul); + if (actsock0==0) Err("need input -M or -R before -f", 30ul); + memcpy(actpass,_cnst0,32u); + if (h[0U]!='d' && h[0U]!='p') { + Err("-f (p)ass or (d)elete needed", 29ul); + } + i = 1UL; + n = 0UL; + nold = 256UL; + for (;;) { + if (i>=4095UL) break; + if ((uint8_t)h[i]>='0' && (uint8_t)h[i]<='9') { + n = (n*10UL+(uint32_t)(uint8_t)h[i])-48UL; + } + else { + for (;;) { + if (n>0UL && n<256UL) X2C_INCL(actpass,n,256); + if (n<=nold) break; + --n; + } + nold = 256UL; + if (h[i]=='-') nold = n; + else if (h[i]!=',') { + break; + } + n = 0UL; + } + ++i; + } + if (h[0U]=='d') { + memcpy(actpass,X2C_COMPLEMENT(tmp,actpass,8),32u); + /* c translate problem */ + } + } + else if (lasth=='k') { + /* + FOR i:=0 TO MAX(SET256) DO + IF i IN actpass THEN EXCL(actpass, + i) ELSE INCL(actpass, i) END; + END; + */ + osi_NextArg(h, 4096ul); + if (actsock0==0) Err("need input -M or -R before -k", 30ul); + i = 0UL; + if (!getfix(&actpos.lat, h, 4096ul, &i)) { + Err("latitude in deg", 16ul); + } + ++i; + if (h[i-1UL]!='/' || !getfix(&actpos.long0, h, 4096ul, &i)) { + Err("longitude in deg", 17ul); + } + ++i; + if ((h[i-1UL]!='/' || !getfix(&actkm, h, 4096ul, + &i)) || actkm>=2.147483647E+9f) Err("distance in km", 15ul); + } + else if (lasth=='b') { + osi_NextArg(h, 4096ul); + if (actsock0==0) Err("need input -M or -R before -b", 30ul); + { /* with */ + struct BEACON * anonym0 = &actbeacon; + i = 0UL; + if (GetSec(h, 4096ul, &i, &n)>=0L && h[i]==':') { + anonym0->bintervall = n; + anonym0->btime = anonym0->bintervall+osic_time(); + anonym0->bline = 0UL; + ++i; + for (n = 0UL; n<=1023UL; n++) { + if (i<=4095UL) { + anonym0->bfile[n] = h[i]; + ++i; + } + } /* end for */ + } + else Err("beacon format is time:file", 27ul); + } + } + else if (lasth=='d') { + osi_NextArg(h, 4096ul); + if (actsock0==0) Err("need input -M or -R before -d", 30ul); + osic_alloc((char * *) &actdigi, sizeof(struct DIGIPARMS)); + if (actdigi==0) Err("out of memory", 14ul); + { /* with */ + struct DIGIPARMS * anonym1 = actdigi; + MakeRawCall(anonym1->digicall, h, 4096ul, 0UL); + if (anonym1->digicall[0U]==0 || anonym1->digicall[6U]==0) { + Err("wrong digi callsign", 20ul); + } + for (i = 0UL; i<=16383UL; i++) { + anonym1->timehash[i] = 0UL; + } /* end for */ + anonym1->duptime = 1740UL; + anonym1->messagetime = 28UL; + anonym1->pathcheck = 0UL; + } + } + else if (lasth=='e') actecho = 1; + else if (((lasth=='r' || lasth=='m') || lasth=='c') || lasth=='l') { + if (actsock0==0) { + Err("need input -M or -R before -r or -m or -c", 42ul); + } + osi_NextArg(h, 4096ul); + osic_alloc((char * *) &outsock0, sizeof(struct OUTPORT)); + if (outsock0==0) { + Err("out of memory", 14ul); + } + { /* with */ + struct OUTPORT * anonym2 = outsock0; + if (GetIp(h, 4096ul, &i, &anonym2->toip, + &anonym2->toport)<0L) Err("wrong udp:port", 15ul); + memcpy(anonym2->aprspass,actpass,32u); + anonym2->echo = actecho; + anonym2->digiparm = actdigi; + anonym2->axudp2 = lasth=='l'; + anonym2->rawwrite = lasth=='r' || anonym2->axudp2; + anonym2->crlfwrite = lasth=='c'; + anonym2->beacon0 = actbeacon; + actbeacon.bintervall = 0UL; + anonym2->passnoUI = actpassui; + anonym2->satgate = actsat; + anonym2->next = 0; + anonym2->filtercalls = actcall; + anonym2->mypos.lat = actpos.lat*1.7453292519444E-2f; + anonym2->mypos.long0 = actpos.long0*1.7453292519444E-2f; + anonym2->maxkm = (int32_t)(uint32_t)X2C_TRUNCC(actkm,0UL, + X2C_max_longcard); + } + actdigi = 0; + actpassui = 0; + onext = actsock0->outchain; + if (onext==0) actsock0->outchain = outsock0; + else { + while (onext->next) onext = onext->next; + onext->next = outsock0; + } + } + else { + if (lasth=='h') { + osic_WrLn(); + osi_WrStrLn(" -a user message ack path eg. WIDE2-2\ + or - for no path", 67ul); + osi_WrStrLn(" -b : enable beacon every s(econds) pat\ +h and text from ", 72ul); + osi_WrStrLn(" cycles thru lines in file, empty \ +lines = no tx (size max 32kb)", 79ul); + osi_WrStrLn(" \\\\z ddhhmm, \\\\h hhmmss, \\\\:\ +filename: insert file, \\\\[filename]", 79ul); + osi_WrStrLn(" insert file and delete after, \\\\ +\(filename) if exists insert", 76ul); + osi_WrStrLn(" and delete,\\\\\\ is \\\\, \\\\rm\ + delete beacon file", 62ul); + osi_WrStrLn(" file may be modified any time eg.\ + by telemetry program", 71ul); + osi_WrStrLn(" -c : send text monitor udp frame with \ +cr lf", 55ul); + osi_WrStrLn(" -d digipeater enable (and dupe filte\ +r) call", 57ul); + osi_WrStrLn(" -d - dupe filter without data modifica\ +tion", 54ul); + osi_WrStrLn(" -e echo last (filtert) output", + 43ul); + osi_WrStrLn(" -f \'p,...\' pass UI frames \ +with first char (-f p58,110)", 76ul); + osi_WrStrLn(" \'d,...\' pass UI frames \ +with not first char (-f d32,65-79)", 82ul); + osi_WrStrLn(" Messages to itself are treated \ +as Telemetry (-f d84)", 72ul); + osi_WrStrLn(" -h this", 21ul); + osi_WrStrLn(" -k // distance filter, center/radi\ +us -k 48.2/13.5/100", 69ul); + osi_WrStrLn(" -k 0/0/20000 remove all (not user\ + msg) with no position data", 77ul); + osi_WrStrLn(" -L :: read monitor rflink h\ +eader with netname", 68ul); + osi_WrStrLn(" -l : send raw axudp frame and pass thr\ +u axudp2 header", 65ul); + osi_WrStrLn(" -M : read text monitor udp frame", + 44ul); + osi_WrStrLn(" ip=255.255.255.255:0 read text mo\ +nitor from stdin", 66ul); + osi_WrStrLn(" ip=255.255.255.255:1 read text mo\ +nitor from stdin and terminate", 80ul); + osi_WrStrLn(" -m : send text monitor udp frame 0 ter\ +minated", 57ul); + osi_WrStrLn(" -p ,<...> -p 7,8 igate friendly digi relayi\ +ng all direct heared", 70ul); + osi_WrStrLn(" -p 5,6,7,8,9 first hop digi, -p 3\ +,4 (noisy) last hop digi", 74ul); + osi_WrStrLn(" -p 0,1,3,4,5,6,7,8,9,14,16 origin\ +al, noisy, path loosing ...", 77ul); + osi_WrStrLn(" 0..2 limit ssid-routing to (bit0 \ ++ 2*bit1 + 4*bit2)", 68ul); + osi_WrStrLn(" dest-3: dest-2,digicall*, dest-3,\ +call*: dest-2,call,digicall*", 78ul); + osi_WrStrLn(" 3 allow repeatet before (mostly w\ +ith wrong path trace)", 71ul); + osi_WrStrLn(" 4 no uplink check for \'looks lik\ +e direct heared\'", 65ul); + osi_WrStrLn(" (noisy, wrong path trace possib\ +le)", 53ul); + osi_WrStrLn(" 5 resend TRACEn-(N-1), 6 resend W\ +IDEn-(N-1)", 60ul); + osi_WrStrLn(" so frames may be relayed again \ +by loss of downlink trace", 75ul); + osi_WrStrLn(" 7 append remaining digi path afte\ +r via digicall", 64ul); + osi_WrStrLn(" 8 append remaining digi path afte\ +r RELAY/GATE/TRACE", 68ul); + osi_WrStrLn(" 9 append remaining digi path afte\ +r WIDE", 56ul); + osi_WrStrLn(" so frames may be relayed again \ +by loss of downlink trace", 75ul); + osi_WrStrLn(" 10, 11, 12, 13 switch off via dig\ +icall, RELAY, TRACE, WIDE", 75ul); + osi_WrStrLn(" 14 insert not digicall on direct \ +heared before WIDEn-N,", 72ul); + osi_WrStrLn(" as others do, your digi is hid\ +den, and path is shown wrong", 78ul); + osi_WrStrLn(" 15 convert destination ssid routi\ +ng to WIDEn-n", 63ul); + osi_WrStrLn(" 16 send n-0 without repeated flag\ +", 50ul); + osi_WrStrLn(" 17 remove all WIDE from downlink \ +path", 54ul); + osi_WrStrLn(" 18 enable via GATE (use as gate: \ +disable via all other)", 72ul); + osi_WrStrLn(" 19 allow ECHO as alias to RELAY", + 48ul); + osi_WrStrLn(" -P piggyback time sending beacon ear\ +lier if sent anything now", 75ul); + osi_WrStrLn(" -R : read raw axudp frame, 0 ip read f\ +rom all (-R 0.0.0.0:2000)", 75ul); + osi_WrStrLn(" -r : send raw axudp frame", 37ul); + osi_WrStrLn(" -S Satgate, filter out uplink (has v\ +ia with no h-bit", 66ul); + osi_WrStrLn(" -s pass not-UI-frames too (all PR-Fr\ +ames, SABM, RR..)", 67ul); + osi_WrStrLn(" (raw axudp only) and axudp2 modem\ + to layer2 message frames", 75ul); + osi_WrStrLn(" -t , dupe filter time in seconds (all \ +types, user messages)", 71ul); + osi_WrStrLn(" -t 1740,28 29min not same beacon,\ + 28s for retrying user message)", 81ul); + osi_WrStrLn(" -u : global option, receive & ack us\ +ermessages to call store in file", 82ul); + osi_WrStrLn(" repeat -u for more Calls to same \ +or different File", 67ul); + osi_WrStrLn(" -v show frames and analytics on stdo\ +ut", 52ul); + osi_WrStrLn(" -x {,} delete frames with call in a \ +address field, -x TCPIP,UID***-*", 82ul); + osi_WrStrLn("udpbox -v -M 0.0.0.0:9200 -d MYCALL-10 -p 0,1,7 -\ +t 1800,28 -r 192.168.1.24:9400", 80ul); + osic_WrLn(); + X2C_ABORT(); + } + if (lasth=='s') actpassui = 1; + else if (lasth=='S') actsat = 1; + else if (lasth=='t') { + if (actdigi==0) Err("need -d before -t", 18ul); + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetSec(h, 4096ul, &i, &n)>=0L) { + actdigi->duptime = n; + ++i; + if (h[i-1UL]==',' && GetSec(h, 4096ul, &i, &n)>=0L) { + actdigi->messagetime = n; + } + } + } + else if (lasth=='P') { + if (actsock0==0) Err("need input -M or -R before -P", 30ul); + osi_NextArg(h, 4096ul); + i = 0UL; + if (GetSec(h, 4096ul, &i, &n)>=0L) actbeacon.piggytime = n; + } + else if (lasth=='p') { + if (actdigi==0) Err("need -d before -p", 18ul); + osi_NextArg(h, 4096ul); + i = 0UL; + while (GetSec(h, 4096ul, &i, &n)>=0L) { + if (n<31UL) actdigi->pathcheck |= (1UL<wpos = 0UL; + anonym3->msgfile[0U] = 0; + for (i = 0UL; i<=15UL; i++) { + anonym3->hash[i].ackcnt = 0UL; + } /* end for */ + i = 0UL; + n = 0UL; + while ((n<=8UL && h[i]) && h[i]!=':') { + anonym3->usercall[n] = h[i]; + ++n; + ++i; + } + while (n<=8UL) { + anonym3->usercall[n] = ' '; + ++n; + } + if (h[i]) { + ++i; + n = 0UL; + while (n<=1023UL && h[i]) { + anonym3->msgfile[n] = h[i]; + ++n; + ++i; + } + } + anonym3->next = 0; + } + if (msgusers) user->next = msgusers; + msgusers = user; + } + else if (lasth=='v') show = 1; + else if (lasth=='x') { + osi_NextArg(h, 4096ul); + if (actsock0==0) Err("need input -M or -R before -x", 30ul); + i = 0UL; + for (;;) { + osic_alloc((char * *) &callnext, + sizeof(struct CALLS)); + if (callnext==0) Err("out of memory", 14ul); + MakeRawCall(callnext->call, h, 4096ul, i); + callnext->next = actcall; + actcall = callnext; + while (h[i]!=',') { + if (i>=4095UL || (uint8_t)h[i]<=' ') goto loop_exit; + ++i; + } + ++i; + } + loop_exit:; + } + else err = 1; + } + } + else { + /* + h[0]:=0C; + */ + err = 1; + } + if (err) break; + } + if (err) { + osi_WrStr(">", 2ul); + osi_WrStr(h, 4096ul); + osi_WrStrLn("< use -h", 9ul); + X2C_ABORT(); + } +} /* end parms() */ + + +static void showpip(uint32_t ip, uint32_t port) +{ + osic_WrINT32(ip/16777216UL, 1UL); + osi_WrStr(".", 2ul); + osic_WrINT32(ip/65536UL&255UL, 1UL); + osi_WrStr(".", 2ul); + osic_WrINT32(ip/256UL&255UL, 1UL); + osi_WrStr(".", 2ul); + osic_WrINT32(ip&255UL, 1UL); + osi_WrStr(":", 2ul); + osic_WrINT32(port, 1UL); +} /* end showpip() */ + +/* +PROCEDURE showstr(s-:ARRAY OF CHAR); + + PROCEDURE Hex(b:SET8):CHAR; + VAR d:CARDINAL; + BEGIN + d:=CAST(CARDINAL, b*SET8{0..3}); + IF d>9 THEN INC(d, ORD("A")-10-ORD("0")) END; + RETURN CHR(d+ORD("0")) + END Hex; + +VAR i,j:CARDINAL; + h:ARRAY[0..1023] OF CHAR; +BEGIN + i:=0; + j:=0; + WHILE (i<=HIGH(s)) & (s[i]<>0C) & (j", 2ul); + } + else osi_WrStr((char *)(tmp0 = (char)*n,&tmp0), 1u/1u); + if (i%7L==6L) osi_WrStr(",", 2ul); + if (i==tmp) break; + } /* end for */ + osic_WrLn(); + } +} /* end showhex() */ + + +static void cpraw(char in[], uint32_t in_len, char out[], + uint32_t out_len, int32_t * len) +{ + int32_t e; + int32_t n; + int32_t i; + char c; + char h; + int32_t tmp; + e = 0L; + tmp = *len-1L; + i = 0L; + if (i<=tmp) for (;; i++) { + c = in[i]; + out[i] = c; + if (e==0L && ((uint32_t)(uint8_t)c&1)) e = i+1L; + if (i==tmp) break; + } /* end for */ + if (*len==2L) return; + /* crc only, maybe there is a axudp2 head*/ + if (((uint32_t)e%7UL || e<14L) || e>70L) { + showhex(&n, e, in, in_len, len, + " bad raw format, no address end found", 38ul); + *len = 0L; + } + else { + h = 1; + tmp = e-1L; + i = 20L; + if (i<=tmp) for (tmp = (uint32_t)(tmp-i)/7L;;) { + if ((uint32_t)(uint8_t)in[i]>=128UL) { + if (!h) { + showhex(&n, e, in, in_len, len, " bad H bit in raw frame", + 24ul); + *len = 0L; + } + h = 1; + } + else h = 0; + if (!tmp) break; + --tmp; + i += 7L; + } /* end for */ + } +} /* end cpraw() */ + +#define udpbox_MSYM "\\" + +#define udpbox_INSFN ":" +/* insert file and send no beacon if missing */ + +#define udpbox_INSFNEND ":" + +#define udpbox_DELFN "[" +/* insert file, delete and send no beacon if missing */ + +#define udpbox_DELFNEND "]" + +#define udpbox_DELFNN "(" +/* insert file, delete and insert nothing if missing */ + +#define udpbox_DELFNNEND ")" + + +static void beaconmacros(char s[], uint32_t s_len, char * del) +{ + uint32_t i; + int32_t j; + int32_t len; + char ns[256]; + char ds[256]; + char fn[1024]; + int32_t f; + char fnend; + char voidok; + *del = 0; + i = 0UL; + ns[0U] = 0; + while (i=0L) { + len = osi_RdBin(f, (char *)ds, 256u/1u, 255UL); + osic_Close(f); + if (fnend==']' || fnend==')') { + osi_Erase(fn, 1024ul, &voidok); + /* delete insert file after inserting */ + } + j = 0L; + while (((joutchain; + for (;;) { + if (*outsock0==0) { + *len = 0L; + break; + } + { /* with */ + struct BEACON * anonym = &(*outsock0)->beacon0; + t = osic_time(); + if (anonym->piggyback) t += anonym->piggytime; + anonym->piggyback = 0; + if ((anonym->bintervall>0UL && anonym->bfile[0U]) + && anonym->btime<=t) { + anonym->btime += anonym->bintervall; + if (anonym->btime<=t) anonym->btime = t+anonym->bintervall; + f = osi_OpenRead(anonym->bfile, 1024ul); + if (f>=0L) { + *len = osi_RdBin(f, (char *)fb, 32768u/1u, 32767UL); + osic_Close(f); + while (*len>0L && (uint8_t)fb[*len-1L]<=' ') { + --*len; /* remove junk from eof */ + } + if (*len>0L && *len<32767L) { + fb[*len] = '\012'; + ++*len; + } + do { + lc = (int32_t)anonym->bline; + eol = 0L; + for (;;) { + bol = eol; + while (eol<*len && fb[eol]!='\012') ++eol; + if (eol>=*len) { + bol = eol; + if (anonym->bline) { + lc = 1L; + anonym->bline = 0UL; + } + break; + } + if (fb[bol]!='#') { + if (lc==0L) { + ++anonym->bline; + break; + } + --lc; + } + ++eol; + } + } while (lc); + i = 0L; + while (bol0L) { + beaconmacros(fb, 32768ul, &del); + if (del) osi_Erase(anonym->bfile, 1024ul, &ok0); + else aprsstr_mon2raw(fb, 32768ul, buf, buf_len, len); + if (show && *len==0L) { + osic_WrLn(); + if (del) osi_WrStrLn("delete beacon file ", 20ul); + else osi_WrStrLn("bad beacon format ", 19ul); + } + } + break; + } + if (show) osi_WrStrLn("beacon file not found", 22ul); + } + *outsock0 = (*outsock0)->next; + } + } +} /* end beacon() */ + +#define udpbox_ACKTIME 30 + + +static void sendack(char buf[], uint32_t buf_len, int32_t * len, + pINSOCK fromsock) +{ + int32_t m; + uint32_t j; + uint32_t i; + pMSGHASH user; + char fb[256]; + uint32_t t; + struct MSGHASH * anonym; + struct _0 * anonym0; + user = msgusers; + t = osic_time(); + while (user) { + *len = 0L; + { /* with */ + struct MSGHASH * anonym = user; + for (m = 0L; m<=15L; m++) { + { /* with */ + struct _0 * anonym0 = &anonym->hash[m]; + if ((anonym0->ackcnt>0UL && anonym0->acktimesource) { + --anonym0->ackcnt; + anonym0->acktime = t+30UL; + j = 0UL; + i = 0UL; + while (i<=8UL && (uint8_t)anonym->usercall[i]>' ') { + fb[j] = anonym->usercall[i]; + ++j; + ++i; + } + i = 0UL; + while ((uint8_t)ackpath[i]>' ') { + fb[j] = ackpath[i]; + ++j; + ++i; + } + for (i = 0UL; i<=8UL; i++) { + fb[j] = anonym0->froms[i]; + ++j; + } /* end for */ + fb[j] = ':'; + ++j; + i = 0UL; + while ((uint8_t)"ack"[i]>' ') { + fb[j] = "ack"[i]; + ++j; + ++i; + } + /* + IO.WrLn; IO.WrStr(" <"); IO.WrStr(hash[m].acks); + IO.WrStrLn(">"); + */ + i = 0UL; + while ((uint8_t)anonym0->acks[i]>' ') { + fb[j] = anonym0->acks[i]; + ++j; + ++i; + } + fb[j] = 0; + /* + IO.WrLn; IO.WrStr(" <"); IO.WrStr(fb); IO.WrStrLn(">"); + */ + aprsstr_mon2raw(fb, 256ul, buf, buf_len, len); + if (show && *len==0L) { + osi_WrStr(fb, 256ul); + osi_WrStrLn(" message ack path wrong", 24ul); + } + return; + } + } + } /* end for */ + user = anonym->next; + } + } +} /* end sendack() */ + + +static void appudp2(char ob[], uint32_t ob_len, uint32_t * olen, + const char ud[], uint32_t ud_len, const char ib[], + uint32_t ib_len, int32_t len) +/* append axudp2 header */ +{ + int32_t j; + int32_t i; + i = 0L; + j = 0L; + while (ud[i]) { + ob[i] = ud[i]; + ++i; + } + if (i>0L) { + ob[i] = 0; + ++i; + } + len -= 2L; + while (jfromip==X2C_max_longcard) fdsetr(0UL); + while (actsock) { + { /* with */ + struct INSOCK * anonym = actsock; + if (anonym->fd>=0L) fdsetr((uint32_t)anonym->fd); + actsock = anonym->next; + } + } + if (selectr(1UL, 0UL)>=0L) { + actsock = insocks; + while (actsock) { + do { + piggy = 0; + inlen = 0L; + if (actsock->fd>=0L && issetr((uint32_t)actsock->fd)) { + inlen = getudp(actsock->fd, ibuf, 338ul, actsock->fromip, + actsock->rawread); + } + else if (issetr(0UL) && actsock->fromip==X2C_max_longcard) { + inlen = getstdin(ibuf, 338ul); + } + udp2[0U] = 0; + if (inlen>0L && ibuf[0U]=='\001') { + aprsstr_extrudp2(ibuf, 338ul, udp2, 64ul, &inlen); + /* axudp2 */ + } + hamup[0U] = 0; + if (inlen>0L) { + nobeacon = 1; + if (actsock->rawread) { + cpraw(ibuf, 338ul, rawbuf, 338ul, &inlen); + } + else { + if (inlen<=337L) ibuf[inlen] = 0; + checkhamnet(ibuf, 338ul, &inlen, actsock->rflinkname, + 9ul, hamup); + if (inlen>0L) { + aprsstr_mon2raw(ibuf, 338ul, rawbuf, 338ul, &inlen); + if (show && inlen==0L) { + osi_WrStrLn("bad mon format ", 16ul); + } + } + else if (show) { + osi_WrStrLn("no rflink head match", 21ul); + } + } + isbeacon = 0; + } + else { + nobeacon = 0; + beacon(actsock, rawbuf, 338ul, &inlen, &isbeacon); + if (isbeacon==0) sendack(rawbuf, 338ul, &inlen, actsock); + } + if (inlen>=2L) { + if (show && inlen>2L) { + aprsstr_raw2mon(rawbuf, 338ul, mbuf, 512ul, + (uint32_t)(inlen-2L), &monlen, _cnst1); + osic_WrLn(); + showpip(showip, showport); + osi_WrStr("(", 2ul); + osic_WrINT32((uint32_t)inlen, 1UL); + osi_WrStr(")", 2ul); + osi_WrStr(":", 2ul); + if (monlen<=0UL) osi_WrStr("", 19ul); + aprsstr_CtrlHex(mbuf, 512ul); + osi_WrStrLn(mbuf, 512ul); + } + outsock = actsock->outchain; + outlen = 0L; + while (outsock) { + if (show && inlen>2L) { + osi_WrStr(" tx: ", 6ul); + showpip(outsock->toip, outsock->toport); + } + memcpy(workraw,rawbuf,338u); + if (((isbeacon==0 || isbeacon==outsock) + || outsock->echo) && Filter(workraw, 338ul, inlen, outsock, + actsock)) { + if (outsock->digiparm) { + Digi(workraw, 338ul, rawout, 338ul, inlen, + &outlen, hamup, outsock->digiparm, !nobeacon); + if (show && outlen>2L) { + osi_WrStr(" digi", 6ul); + } + } + else if (!outsock->echo) { + memcpy(rawout,workraw,338u); + outlen = inlen; + } + /* else use last filtert */ + if (outlen>0L) { + outsock->beacon0.piggyback = 1; + piggy = 1; + if (outsock->rawwrite) { + if (outsock->axudp2) { + appudp2(mbuf, 512ul, &monlen, udp2, 64ul, + rawout, 338ul, outlen); + res = udpsend(actsock->fd, mbuf, + (int32_t)monlen, outsock->toport, outsock->toip); + } + else { + aprsstr_AppCRC(rawout, 338ul, outlen-2L); + res = udpsend(actsock->fd, rawout, outlen, + outsock->toport, outsock->toip); + } + if (show && outlen>2L) { + osi_WrStrLn(" raw", 5ul); + } + } + else { + aprsstr_raw2mon(rawout, 338ul, mbuf, 512ul, + (uint32_t)(outlen-2L), &monlen, _cnst1); + if (monlen>0UL) { + if (outsock->crlfwrite) { + mbuf[monlen-1UL] = '\015'; + mbuf[monlen] = '\012'; + ++monlen; + } + res = udpsend(actsock->fd, mbuf, + (int32_t)monlen, outsock->toport, outsock->toip); + if (show) { + osi_WrStrLn(" mon", 5ul); + } + } + else if (show) { + osi_WrStrLn(" monerr", 8ul); + } + } + } + else if (show) { + osi_WrStrLn(" no tx", 7ul); + } + } + else if (show && outlen>2L) { + osi_WrStrLn(" deleted", 9ul); + } + outsock = outsock->next; + } + if ((insocks && insocks->fromip==X2C_max_longcard) + && insocks->bindport==1UL) { + goto loop_exit; /* single stdin line mode */ + } + } + } while (piggy); + actsock = actsock->next; + } + } + } + loop_exit:; + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/udpbox.txt b/src/udpbox.txt new file mode 100644 index 0000000..d8763df --- /dev/null +++ b/src/udpbox.txt @@ -0,0 +1,219 @@ +Beispiele: + +die lokalen Stationen nach aussen bringen (-p 0) + also direkt gehoert repeaten und rest vom Pfad weg lassen + macht den geringstmoeglichen laerm + +die lokalen Stationen nach aussen bringen und dort weiter (0,1,2,5,6,7,8,9) + also direkt gehoert repeaten und rest vom Pfad dran lassen + der eigene Digi hoert die Sachen dann mehrfach wieder und ist taub fuers lokale + +Stationen nach lokal bringen (-p 0,3,4) + alles repeaten aber rest vom Pfad weg lassen + macht viel Laerm, waere genial wenn man das auf 70cm umgesetzt machen wurde + +Stationen nach lokal bringen und weiter verteilen (-p 0,1,2,3,4,5,6,7,8,9) + alles repeaten und und rest vom Pfad dran lassen + macht maximalen Laerm + +========================================================================================== +-p 0..2 ergeben, als Bit 0 bis 2 einer Binaerzahl interpretiert, die maximal zulaessige +SSID am Destination "Call". Ansonsten wird die Zahl auf eben diesen Wert limitiert +und dann wie sonst auch um 1 reduziert wieder gesendet. + +-p 15 Setzt das nur mehr von manchen Digis verstandene SSID-Routing in ein entsprechendes +WIDEn-n um. Die kritische 1. Funkstrecke vom Fahrzeug ist dann schon ueberstanden +und der nun um 7 Byte laengere Frame wird meist nur mehr zwischen Feststationen +weitergegeben. + + +udpbox Parameter Input Output +------------------------------------------------------------------------------ +-d OE5DXL-2 OE5DXL>TEST-7:>test +-d OE5DXL-2 -p 0 OE5DXL>TEST-7:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 1 OE5DXL>TEST-7:>test OE5DXL>TEST-1,OE5DXL-2*:>test +-d OE5DXL-2 -p 2 OE5DXL>TEST-7:>test OE5DXL>TEST-3,OE5DXL-2*:>test +-d OE5DXL-2 -p 0,2 OE5DXL>TEST-7:>test OE5DXL>TEST-4,OE5DXL-2*:>test +-d OE5DXL-2 -p 0,1,2 OE5DXL>TEST-7:>test OE5DXL>TEST-6,OE5DXL-2*:>test +-d OE5DXL-2 -p 0,1,2 OE5DXL>TEST-6:>test OE5DXL>TEST-5,OE5DXL-2*:>test +-d OE5DXL-2 -p 0,1,2 OE5DXL>TEST-1:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 0,1,15 OE5DXL>TEST-5:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-2:>test +-d OE5DXL-2 -p 0,1,15 OE5DXL>TEST-4:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-2:>test +-d OE5DXL-2 -p 0,1,15 OE5DXL>TEST-3:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-2:>test +-d OE5DXL-2 -p 0,1,15 OE5DXL>TEST-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE1-1:>test +-d OE5DXL-2 -p 0,1,15 OE5DXL>TEST-1:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 0,1,15 OE5DXL>TEST:>test + +========================================================================================== + +-p 3 repeate auch was schon vorher durch einen digi gelaufen ist + +-d OE5DXL-2 -p 3 OE5DXL>TEST,OE5XBL*,WIDE2-2:>test OE5DXL>TEST,OE5XBL,OE5DXL-2*:>test +-d OE5DXL-2 OE5DXL>TEST,OE5XBL*,WIDE2-2:>test + +========================================================================================== + + +-p 4 repeate auch was bei ueblicher Parameter Einstellung nicht nach "direkt gehoert" + aussieht, also kein * im Pfad und beim 1. WIDE oder TRACE gleiche Ziffern hat + +-d OE5DXL-2 -p 4 OE5DXL>TEST,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 4 OE5DXL>TEST,WIDE2-1:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 OE5DXL>TEST,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 OE5DXL>TEST,WIDE2-1:>test + +========================================================================================== + +-p 5 sende TRACEn-N mit um 1 vermindertem N ansonsten tu es ganz weg + +-d OE5DXL-2 -p 5 OE5DXL>TEST,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 5 OE5DXL>TEST,TRACE2-2:>test OE5DXL>TEST,OE5DXL-2*,TRACE2-1:>test + +========================================================================================== + +-p 6 sende WIDEn-N mit um 1 vermindertem N ansonsten tu es ganz weg + +-d OE5DXL-2 -p 6 OE5DXL>TEST,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-1:>test +-d OE5DXL-2 -p 6 OE5DXL>TEST,TRACE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test + + +========================================================================================== +WIDE und TRACE + +-d OE5DXL-2 -p 5,6 OE5DXL>TEST,TRACE2-2:>test OE5DXL>TEST,OE5DXL-2*,TRACE2-1:>test +-d OE5DXL-2 -p 5,6 OE5DXL>TEST,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-1:>test + + +========================================================================================== + +-p 7 Sende den Rest vom Pfad mit bei via digicall +-p 8 Sende den Rest vom Pfad mit bei via RELAY +-p 9 Sende den Rest vom Pfad mit bei via TRACE oder WIDE + +-d OE5DXL-2 -p 7 OE5DXL>TEST,OE5DXL-2,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-2:>test +-d OE5DXL-2 -p 7 OE5DXL>TEST,RELAY,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 7 OE5DXL>TEST,TRACE1-1,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 7 OE5DXL>TEST,WIDE1-1,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test + +-d OE5DXL-2 -p 8 OE5DXL>TEST,OE5DXL-2,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 8 OE5DXL>TEST,RELAY,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-2:>test +-d OE5DXL-2 -p 8 OE5DXL>TEST,TRACE1-1,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 8 OE5DXL>TEST,WIDE1-1,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test + +-d OE5DXL-2 -p 9 OE5DXL>TEST,OE5DXL-2,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 9 OE5DXL>TEST,RELAY,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 9 OE5DXL>TEST,TRACE1-1,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-2:>test +-d OE5DXL-2 -p 9 OE5DXL>TEST,WIDE1-1,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-2:>test + + +========================================================================================== + +-p 10 via digicall aus +-p 11 via RELAY aus +-p 12 via TRACEn-N aus +-p 13 via WIDEn-N aus + +-d OE5DXL-2 -p 10 OE5DXL>TEST,OE5DXL-2:>test +-d OE5DXL-2 -p 10 OE5DXL>TEST,RELAY:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 10 OE5DXL>TEST,TRACE1-1:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 10 OE5DXL>TEST,WIDE1-1:>test OE5DXL>TEST,OE5DXL-2*:>test + + +-d OE5DXL-2 -p 11 OE5DXL>TEST,OE5DXL-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 11 OE5DXL>TEST,RELAY:>test +-d OE5DXL-2 -p 11 OE5DXL>TEST,TRACE1-1:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 11 OE5DXL>TEST,WIDE1-1:>test OE5DXL>TEST,OE5DXL-2*:>test + + +-d OE5DXL-2 -p 12 OE5DXL>TEST,OE5DXL-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 12 OE5DXL>TEST,RELAY:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 12 OE5DXL>TEST,TRACE1-1:>test +-d OE5DXL-2 -p 12 OE5DXL>TEST,WIDE1-1:>test OE5DXL>TEST,OE5DXL-2*:>test + + +-d OE5DXL-2 -p 13 OE5DXL>TEST,OE5DXL-2:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 13 OE5DXL>TEST,RELAY:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 13 OE5DXL>TEST,TRACE1-1:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 13 OE5DXL>TEST,WIDE1-1:>test + + + +========================================================================================== + +-p 14 tu das eigene digicall NICHT dazu (nicht empfohlen) + +-d OE5DXL-2 -p 5,6 OE5DXL>TEST,WIDE2-2:>test OE5DXL>TEST,OE5DXL-2*,WIDE2-1:>test +-d OE5DXL-2 -p 5,6,14 OE5DXL>TEST,WIDE2-2:>test OE5DXL>TEST,WIDE2-1:>test + + + +========================================================================================== + +-p 16 aus WIDE1-1 wird WIDE1 (also meistens dann noch mal repeatet) + +-d OE5DXL-2 -p 5,6 OE5DXL>TEST,WIDE1-1:>test OE5DXL>TEST,OE5DXL-2*:>test +-d OE5DXL-2 -p 5,6,16 OE5DXL>TEST,WIDE1-1:>test OE5DXL>TEST,OE5DXL-2*,WIDE1:>test + + +========================================================================================== + +-p 17 entferne alle WIDE vom Rest des Pfades + +-p 5,6,7,8,9 OE5DXL>TEST,WIDE1-1,RELAY,WIDE3-3:>test OE5DXL>TEST,OE5DXL-2*,RELAY,WIDE3-3:>test +-p 5,6,7,8,9,17 OE5DXL>TEST,WIDE1-1,RELAY,WIDE3-3:>test OE5DXL>TEST,OE5DXL-2*,RELAY:>test + + +========================================================================================== + +-p 18 repeate via GATE (fuer Crossband von kw auf ukw) + +-p 5,6,7,8,9 OE5DXL>TEST,GATE,WIDE1-1,WIDE3-3:>test +-p 5,6,7,8,9,18 OE5DXL>TEST,GATE,WIDE1-1,WIDE3-3:>test OE5DXL>TEST,OE5DXL-2*,WIDE1-1,WIDE3-3:>test +-p 5,6,7,8,9,17,18 OE5DXL>TEST,GATE,WIDE1-1,WIDE3-3:>test OE5DXL>TEST,OE5DXL-2*:>test + +========================================================================================== + +-p 19 repeate via ECHO (auf kw anstatt RELAY warum auch immer) + +-p 5,6,7,8,9 OE5DXL>TEST,ECHO,WIDE3-3:>test +-p 5,6,7,8,9,19 OE5DXL>TEST,ECHO,WIDE3-3:>test OE5DXL>TEST,OE5DXL-2*,WIDE3-3:>test +-p 5,6,7,8,9,17,19 OE5DXL>TEST,ECHO,WIDE3-3:>test OE5DXL>TEST,OE5DXL-2*:>test + +========================================================================================== + +Filter APRS Frame Types, die werden durch das 1. Datenbyte nach dem Adressfeld bestimmt + +zB. "_" = Wetter + ":" = Message + "$" = GPS + +Siehe APRS101.PDF (Papier)Seite 17 +p positiv Liste, lass nur alles aufgezaehlte durch +d negativ Liste, lass alles durch ausser dem aufgezaehlten + +-f p65-67 OE5DXL>TEST:A OE5DXL>TEST:A + OE5DXL>TEST:B OE5DXL>TEST:B + OE5DXL>TEST:C OE5DXL>TEST:C + OE5DXL>TEST:D + +-f d66-67 OE5DXL>TEST:A OE5DXL>TEST:A + OE5DXL>TEST:B + OE5DXL>TEST:C + OE5DXL>TEST:D OE5DXL>TEST:D + OE5DXL>TEST:E OE5DXL>TEST:E + +-f p65-66,68 OE5DXL>TEST:A OE5DXL>TEST:A + OE5DXL>TEST:B OE5DXL>TEST:B + OE5DXL>TEST:C + OE5DXL>TEST:D OE5DXL>TEST:D + OE5DXL>TEST:E + + +========================================================================================== + +-s zum durchleiten vom pr-frames (sabm disc, daten....) normal geht nur UI durch + +========================================================================================== + + + diff --git a/src/udpflex.c b/src/udpflex.c new file mode 100644 index 0000000..ed13a2e --- /dev/null +++ b/src/udpflex.c @@ -0,0 +1,1224 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define udpflex_C_ +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef mlib_H_ +#include "mlib.h" +#endif +#ifndef tcp_H_ +#include "tcp.h" +#endif +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef Select_H_ +#include "Select.h" +#endif + +/* interface rmnc-flex-kiss <> axudp by oe5dxl */ +#define udpflex_DEFTTY "/dev/ttyS0" + +#define udpflex_SLEEPWINLOOP 20 +/* win poll data loop ms */ + +#define udpflex_SLEEPCONNTCP 2000 +/* wait before new tcp network kiss connect ms */ + +enum MODE {udpflex_KISS, udpflex_FLEXKISS, udpflex_SMACK}; + + +static uint16_t udpflex_POLYNOM[256] = {3975U,7694U,11413U,15644U,18851U, + 22570U,27313U,31544U,33743U,37446U,41181U,45396U,50667U, + 54370U,59129U,63344U,7942U,3727U,15380U,11677U,22818U,18603U, + 31280U,27577U,37710U,33479U,45148U,41429U,54634U,50403U, + 63096U,59377U,11909U,16140U,3479U,7198U,26785U,31016U,19379U, + 23098U,41677U,45892U,33247U,36950U,58601U,62816U,51195U, + 54898U,15876U,12173U,7446U,3231U,30752U,27049U,23346U,19131U, + 45644U,41925U,37214U,32983U,62568U,58849U,55162U,50931U, + 19843U,23562U,28305U,32536U,2983U,6702U,10421U,14652U,49611U, + 53314U,58073U,62288U,34799U,38502U,42237U,46452U,23810U, + 19595U,32272U,28569U,6950U,2735U,14388U,10685U,53578U,49347U, + 62040U,58321U,38766U,34535U,46204U,42485U,27777U,32008U, + 20371U,24090U,10917U,15148U,2487U,6206U,57545U,61760U,50139U, + 53842U,42733U,46948U,34303U,38006U,31744U,28041U,24338U, + 20123U,14884U,11181U,6454U,2239U,61512U,57793U,54106U,49875U, + 46700U,42981U,38270U,34039U,35727U,39430U,43165U,47380U, + 52651U,56354U,61113U,65328U,1991U,5710U,9429U,13660U,16867U, + 20586U,25329U,29560U,39694U,35463U,47132U,43413U,56618U, + 52387U,65080U,61361U,5958U,1743U,13396U,9693U,20834U,16619U, + 29296U,25593U,43661U,47876U,35231U,38934U,60585U,64800U, + 53179U,56882U,9925U,14156U,1495U,5214U,24801U,29032U,17395U, + 21114U,47628U,43909U,39198U,34967U,64552U,60833U,57146U, + 52915U,13892U,10189U,5462U,1247U,28768U,25065U,21362U,17147U, + 51595U,55298U,60057U,64272U,36783U,40486U,44221U,48436U, + 17859U,21578U,26321U,30552U,999U,4718U,8437U,12668U,55562U, + 51331U,64024U,60305U,40750U,36519U,48188U,44469U,21826U, + 17611U,30288U,26585U,4966U,751U,12404U,8701U,59529U,63744U, + 52123U,55826U,44717U,48932U,36287U,39990U,25793U,30024U, + 18387U,22106U,8933U,13164U,503U,4222U,63496U,59777U,56090U, + 51859U,48684U,44965U,40254U,36023U,29760U,26057U,22354U, + 18139U,12900U,9197U,4470U,255U}; + +static uint16_t udpflex_SMACKCRC[256] = {0U,49345U,49537U,320U,49921U,960U, + 640U,49729U,50689U,1728U,1920U,51009U,1280U,50625U,50305U, + 1088U,52225U,3264U,3456U,52545U,3840U,53185U,52865U,3648U, + 2560U,51905U,52097U,2880U,51457U,2496U,2176U,51265U,55297U, + 6336U,6528U,55617U,6912U,56257U,55937U,6720U,7680U,57025U, + 57217U,8000U,56577U,7616U,7296U,56385U,5120U,54465U,54657U, + 5440U,55041U,6080U,5760U,54849U,53761U,4800U,4992U,54081U, + 4352U,53697U,53377U,4160U,61441U,12480U,12672U,61761U,13056U, + 62401U,62081U,12864U,13824U,63169U,63361U,14144U,62721U, + 13760U,13440U,62529U,15360U,64705U,64897U,15680U,65281U, + 16320U,16000U,65089U,64001U,15040U,15232U,64321U,14592U, + 63937U,63617U,14400U,10240U,59585U,59777U,10560U,60161U, + 11200U,10880U,59969U,60929U,11968U,12160U,61249U,11520U, + 60865U,60545U,11328U,58369U,9408U,9600U,58689U,9984U,59329U, + 59009U,9792U,8704U,58049U,58241U,9024U,57601U,8640U,8320U, + 57409U,40961U,24768U,24960U,41281U,25344U,41921U,41601U, + 25152U,26112U,42689U,42881U,26432U,42241U,26048U,25728U, + 42049U,27648U,44225U,44417U,27968U,44801U,28608U,28288U, + 44609U,43521U,27328U,27520U,43841U,26880U,43457U,43137U, + 26688U,30720U,47297U,47489U,31040U,47873U,31680U,31360U, + 47681U,48641U,32448U,32640U,48961U,32000U,48577U,48257U, + 31808U,46081U,29888U,30080U,46401U,30464U,47041U,46721U, + 30272U,29184U,45761U,45953U,29504U,45313U,29120U,28800U, + 45121U,20480U,37057U,37249U,20800U,37633U,21440U,21120U, + 37441U,38401U,22208U,22400U,38721U,21760U,38337U,38017U, + 21568U,39937U,23744U,23936U,40257U,24320U,40897U,40577U, + 24128U,23040U,39617U,39809U,23360U,39169U,22976U,22656U, + 38977U,34817U,18624U,18816U,35137U,19200U,35777U,35457U, + 19008U,19968U,36545U,36737U,20288U,36097U,19904U,19584U, + 35905U,17408U,33985U,34177U,17728U,34561U,18368U,18048U, + 34369U,33281U,17088U,17280U,33601U,16640U,33217U,32897U, + 16448U}; + +#define udpflex_FEND 192 + +#define udpflex_FESC 219 + +#define udpflex_TFEND 220 + +#define udpflex_TFESC 221 + +static char udpflex_FLEXKISSBYTE = ' '; + +static char udpflex_SMACKBYTE = '\200'; + +#define udpflex_ESC "\033" + +#define udpflex_CR "\015" + +#define udpflex_DEFAULTPORT "8001" + +static uint8_t CRCL[256]; + +static uint8_t CRCH[256]; + +static char ifn[701]; + +static char ubuf[701]; + +static char tbuf[701]; + +static char kbuf[701]; + +static char ttynamee[701]; + +static uint32_t inilen; + +static uint32_t kissm; + +static uint32_t baud; + +static uint32_t fend; + +static uint8_t flexmod; + +struct _0; + + +struct _0 { + int32_t sock; + uint32_t ipnum; + uint32_t fromport; + uint32_t toport; + char anyip; +}; + +static struct _0 udpsocks[8]; + +static int32_t tty; + +static struct termios saved; + +static int32_t len; + +static int32_t rp; + +static int32_t upos; + +static int32_t tpos; + +static int32_t i; + +static char c; + +static char auto0; + +static char verb; + +static char hexdump; + +static char kisson; + +static char usbrobust; + +static char direwolf; + +static uint32_t errtime; + +static int32_t tcpfd; + +static char direwolfurl[2048]; + +static char direwolfport[11]; + + +static void Error(char text[], uint32_t text_len) +{ + X2C_PCOPY((void **)&text,text_len); + osi_WrStr("udpflex: ", 10ul); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); + X2C_PFREE(text); +} /* end Error() */ + + +static void initfile(char fn[], uint32_t fn_len) +{ + char b[4001]; + int32_t fd; + int32_t len0; + X2C_PCOPY((void **)&fn,fn_len); + if (fn[0UL]) { + fd = osi_OpenRead(fn, fn_len); + if (fd!=-1L) { + len0 = osi_RdBin(fd, (char *)b, 4001u/1u, 4001UL); + osi_WrBin(tty, (char *)b, 4001u/1u, (uint32_t)len0); + osic_Close(fd); + } + else Error("initfile not found", 19ul); + } + X2C_PFREE(fn); +} /* end initfile() */ + + +static void inittnc(void) +{ + if (fend!=192UL) return; + /* TAPR mode */ + errtime = osic_time(); + initfile(ifn, 701ul); + if (kisson) { + strncpy(tbuf,"\015\033@K\015",701u); + usleep(500000UL); + osi_WrBin(tty, (char *)tbuf, 701u/1u, 5UL); + } + if (inilen>0UL) { + usleep(500000UL); + osi_WrBin(tty, (char *)kbuf, 701u/1u, inilen); + } + if (verb) osi_WrStrLn("send init to tnc", 17ul); +} /* end inittnc() */ + + +static void SetComMode(int32_t fd, uint32_t baud0) +{ + struct termios term; + int32_t res; + uint32_t bd; + struct termios * anonym; + if (baud0==1200UL) bd = 9UL; + else if (baud0==2400UL) bd = 11UL; + else if (baud0==4800UL) bd = 12UL; + else if (baud0==9600UL) bd = 13UL; + else if (baud0==19200UL) bd = 14UL; + else if (baud0==38400UL) bd = 15UL; + else if (baud0==57600UL) bd = 4097UL; + else if (baud0==115200UL) bd = 4098UL; + else if (baud0==230400UL) bd = 4099UL; + else if (baud0==460800UL) bd = 4100UL; + else Error("unknown baudrate", 17ul); + res = tcgetattr(fd, &saved); + res = tcgetattr(fd, &term); + { /* with */ + struct termios * anonym = &term; + anonym->c_lflag = 0UL; + anonym->c_oflag = 0UL; + anonym->c_iflag = 0UL; + /* cfmakeraw(&termios);*/ + anonym->c_cflag = 2224UL+bd; /*+CRTSCTS*/ /*0800018B2H*/ + } + res = tcsetattr(fd, 2L, &term); +} /* end SetComMode() */ + + +static void opentty(void) +{ + for (;;) { + tty = osi_OpenRW(ttynamee, 701ul); + if (tty>=0L) { + SetComMode(tty, baud); + break; + } + if (!usbrobust) Error("tty open", 9ul); + if (verb) osi_WrStrLn("tty open error", 15ul); + usleep(1000000UL); + } +} /* end opentty() */ + + +static void testtty(int32_t len0) +{ + if (len0<=0L) { + osic_Close(tty); + usleep(1000000UL); + opentty(); + } +} /* end testtty() */ + +#define udpflex_ERRWAIT 4 + + +static void kisserr(void) +{ + if (errtime+4UL='0' && (uint8_t)h[*p]<='9') { + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + return h[*p]==eot; +} /* end GetNum() */ + + +static void app(uint32_t c0, char esc) +{ + if (esc) { + if (c0==192UL) { + kbuf[inilen] = '\333'; + ++inilen; + c0 = 220UL; + } + else if (c0==219UL) { + kbuf[inilen] = '\333'; + ++inilen; + c0 = 221UL; + } + } + kbuf[inilen] = (char)c0; + ++inilen; +} /* end app() */ + + +static void urlport(char url[], uint32_t url_len, char port[], + uint32_t port_len, char s[], uint32_t s_len) +{ + int32_t ii; + int32_t i0; + X2C_PCOPY((void **)&s,s_len); + s[s_len-1] = 0; + if (s[0UL]=='[') { + ii = 1L; + while (s[ii] && s[ii]!=']') ++ii; + if (s[ii]!=']' || s[ii+1L]!=':') Error("-g [url]:port", 14ul); + s[ii] = 0; + i0 = 1L; + while (i0<=(int32_t)(s_len-1)) { + s[i0-1L] = s[i0]; + ++i0; + } + } + else ii = aprsstr_InStr(s, s_len, ":", 2ul); + if (ii>=0L) s[ii] = 0; + if (ii==0L) aprsstr_Assign(url, url_len, "127.0.0.1", 10ul); + else aprsstr_Assign(url, url_len, s, s_len); + port[0UL] = 0; + if (ii>=0L) { + /* port number */ + ++ii; + i0 = 0L; + while (ii<=(int32_t)(s_len-1) && i0<(int32_t)(port_len-1)) { + port[i0] = s[ii]; + ++i0; + ++ii; + } + port[i0] = 0; + } + if (port[0UL]==0) aprsstr_Assign(port, port_len, "8001", 5ul); + X2C_PFREE(s); +} /* end urlport() */ + + +static void Parms(void) +{ + char err; + char h[1024]; + uint32_t sockc; + uint32_t val; + uint32_t cmd; + uint32_t i0; + struct _0 * anonym; + err = 0; + sockc = 0UL; + for (;;) { + osi_NextArg(h, 1024ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + if (h[1U]=='c') { + } + else if (h[1U]=='r') { + /* dummy for compatibility */ + flexmod = udpflex_FLEXKISS; /* RMNC crc type */ + } + else if (h[1U]=='s') flexmod = udpflex_SMACK; + else if (h[1U]=='a') { + auto0 = 1; + if (sockc>1UL) Error("-a only with 1 UDP socket, ", 28ul); + } + else if (h[1U]=='A') { + auto0 = 0; + fend = 13UL; + if (sockc>1UL) Error("-A only with 1 UDP socket, ", 28ul); + } + else if (h[1U]=='k') kisson = 1; + else if (h[1U]=='p') { + osi_NextArg(h, 1024ul); + i0 = 0UL; + if (!GetNum(h, 1024ul, ':', &i0, &cmd)) { + Error("-p cmd:value", 13ul); + } + ++i0; + if (!GetNum(h, 1024ul, 0, &i0, &val)) { + Error("-p cmd:value", 13ul); + } + app(192UL, 0); + app(cmd, 1); + app(val, 1); + app(192UL, 0); + } + else if (h[1U]=='U') { + if (auto0 && sockc>0UL) { + Error("-U only 1 UDP with -a Mode", 27ul); + } + osi_NextArg(h, 1024ul); + { /* with */ + struct _0 * anonym = &udpsocks[sockc]; + if (aprsstr_GetIp2(h, 1024ul, &anonym->ipnum, &anonym->toport, + &anonym->fromport, &anonym->anyip)<0L) { + Error("-U wrong ip:port:port number", 29ul); + } + anonym->sock = openudp(); + if (anonym->sock<0L || bindudp(anonym->sock, + anonym->fromport)<0L) { + /* say with port */ + Error("-U cannot open udp socket", 26ul); + } + } + ++sockc; + } + else if (h[1U]=='u') usbrobust = 1; + else if (h[1U]=='t') { + osi_NextArg(h, 1024ul); + i0 = 0UL; + while ((h[i0] && h[i0]!=':') && i0<700UL) { + ttynamee[i0] = h[i0]; + ++i0; + } + ttynamee[i0] = 0; + if (h[i0]) { + ++i0; + if (!GetNum(h, 1024ul, 0, &i0, &baud)) { + Error("need ttydevice:baud", 20ul); + } + } + } + else if (h[1U]=='T') { + osi_NextArg(h, 1024ul); + urlport(direwolfurl, 2048ul, direwolfport, 11ul, h, 1024ul); + direwolf = 1; + } + else if (h[1U]=='v') verb = 1; + else if (h[1U]=='V') { + verb = 1; + hexdump = 1; + } + else { + if (h[1U]=='h') { + osic_WrLn(); + osi_WrStrLn("bidirectional AXUDP <-> KISS/SMACK(tty/com/pipe) \ +or TCP-KISS(dire-wolf) Interface", 82ul); + osic_WrLn(); + osi_WrStrLn(" -A ASCII (TAPR) M\ +ode", 53ul); + osi_WrStrLn(" -a automatic swit\ +ch to KISS/FLEX/SMACK mode", 76ul); + osi_WrStrLn(" (only with 1 P\ +ort)", 54ul); + osi_WrStrLn(" -h this", 40ul); + osi_WrStrLn(" -i send this file\ + to tty to switch on kiss", 75ul); + osi_WrStrLn(" -k tnc2 tf switch\ + on kiss", 58ul); + osi_WrStrLn(" -p : tnc2 parameter\ + 1=txd, 2=p", 61ul); + osi_WrStrLn(" 3=slottime, 25\ +5:13 kiss exit", 64ul); + osi_WrStrLn(" (add 16, 32 ..\ +. to cmd for next Port)", 73ul); + osi_WrStrLn(" -r use rmnc-crc", + 48ul); + osi_WrStrLn(" -s SMACK (crc) on\ +", 50ul); + osi_WrStrLn(" -t : /dev/ttyS0:960\ +0 or Pipe Filename", 68ul); + osi_WrStrLn(" -T [ip]:[port] TCP-KISS -T 12\ +7.0.0.1:8001 (default)", 72ul); + osi_WrStrLn(" local dire-wol\ +f soundmodem -T :", 67ul); + osi_WrStrLn(" -U axudp \"ip:des\ +tport/listenport\" to check ipnum", 81ul); + osi_WrStrLn(" (repeat for mo\ +re Ports)", 59ul); + osi_WrStrLn(" -u retry until (r\ +e)pluged (USB) tty", 68ul); + osi_WrStrLn(" and on kiss er\ +ror reinitialize kiss mode", 76ul); + osi_WrStrLn(" -v verbous error \ +messages", 58ul); + osi_WrStrLn(" -V verbous errors\ + and monitor data to stdout", 77ul); + osic_WrLn(); + X2C_ABORT(); + } + if (h[1U]=='i') osi_NextArg(ifn, 701ul); + else err = 1; + } + } + else { + /* + h[0]:=0C; + */ + err = 1; + } + if (err) break; + } + if (flexmod==udpflex_FLEXKISS && sockc>1UL) { + Error("only 1 UDP with flexnet", 24ul); + } + if (err) { + osi_WrStr(">", 2ul); + osi_WrStr(h, 1024ul); + osi_WrStrLn("< use -h", 9ul); + X2C_ABORT(); + } +} /* end Parms() */ + +#define udpflex_POLINOM 0x8408 + + +static void Gencrctab(void) +{ + uint32_t c0; + uint32_t crc0; + uint32_t i0; + for (c0 = 0UL; c0<=255UL; c0++) { + crc0 = 255UL-c0; + for (i0 = 0UL; i0<=7UL; i0++) { + if ((crc0&1)) crc0 = (uint32_t)((uint32_t)(crc0>>1)^0x8408UL); + else crc0 = crc0>>1; + } /* end for */ + CRCL[c0] = (uint8_t)crc0; + CRCH[c0] = (uint8_t)(255UL-(crc0>>8)); + } /* end for */ +} /* end Gencrctab() */ + + +static uint32_t UDPCRC(const char frame[], uint32_t frame_len, + int32_t size) +{ + uint8_t h; + uint8_t l; + uint8_t b; + int32_t i0; + int32_t tmp; + l = 0U; + h = 0U; + tmp = size-1L; + i0 = 0L; + if (i0<=tmp) for (;; i0++) { + b = (uint8_t)((uint8_t)(uint8_t)frame[i0]^l); + l = CRCL[b]^h; + h = CRCH[b]; + if (i0==tmp) break; + } /* end for */ + return (uint32_t)(uint8_t)(char)l+256UL*(uint32_t)(uint8_t) + (char)h; +} /* end UDPCRC() */ + +static uint16_t _cnst[256] = {3975U,7694U,11413U,15644U,18851U,22570U, + 27313U,31544U,33743U,37446U,41181U,45396U,50667U,54370U, + 59129U,63344U,7942U,3727U,15380U,11677U,22818U,18603U,31280U, + 27577U,37710U,33479U,45148U,41429U,54634U,50403U,63096U, + 59377U,11909U,16140U,3479U,7198U,26785U,31016U,19379U,23098U, + 41677U,45892U,33247U,36950U,58601U,62816U,51195U,54898U, + 15876U,12173U,7446U,3231U,30752U,27049U,23346U,19131U,45644U, + 41925U,37214U,32983U,62568U,58849U,55162U,50931U,19843U, + 23562U,28305U,32536U,2983U,6702U,10421U,14652U,49611U,53314U, + 58073U,62288U,34799U,38502U,42237U,46452U,23810U,19595U, + 32272U,28569U,6950U,2735U,14388U,10685U,53578U,49347U,62040U, + 58321U,38766U,34535U,46204U,42485U,27777U,32008U,20371U, + 24090U,10917U,15148U,2487U,6206U,57545U,61760U,50139U,53842U, + 42733U,46948U,34303U,38006U,31744U,28041U,24338U,20123U, + 14884U,11181U,6454U,2239U,61512U,57793U,54106U,49875U,46700U, + 42981U,38270U,34039U,35727U,39430U,43165U,47380U,52651U, + 56354U,61113U,65328U,1991U,5710U,9429U,13660U,16867U,20586U, + 25329U,29560U,39694U,35463U,47132U,43413U,56618U,52387U, + 65080U,61361U,5958U,1743U,13396U,9693U,20834U,16619U,29296U, + 25593U,43661U,47876U,35231U,38934U,60585U,64800U,53179U, + 56882U,9925U,14156U,1495U,5214U,24801U,29032U,17395U,21114U, + 47628U,43909U,39198U,34967U,64552U,60833U,57146U,52915U, + 13892U,10189U,5462U,1247U,28768U,25065U,21362U,17147U,51595U, + 55298U,60057U,64272U,36783U,40486U,44221U,48436U,17859U, + 21578U,26321U,30552U,999U,4718U,8437U,12668U,55562U,51331U, + 64024U,60305U,40750U,36519U,48188U,44469U,21826U,17611U, + 30288U,26585U,4966U,751U,12404U,8701U,59529U,63744U,52123U, + 55826U,44717U,48932U,36287U,39990U,25793U,30024U,18387U, + 22106U,8933U,13164U,503U,4222U,63496U,59777U,56090U,51859U, + 48684U,44965U,40254U,36023U,29760U,26057U,22354U,18139U, + 12900U,9197U,4470U,255U}; + +static uint32_t flexcrc(const char buf[], uint32_t buf_len, + uint32_t a, uint32_t b) +{ + uint16_t crc0; + crc0 = 0xFFFFU; + while (a<=b) { + crc0 = X2C_LSH(crc0,16,8)^(uint16_t)_cnst[(uint32_t)(X2C_LSH(crc0, + 16,-8)^(uint16_t)(uint32_t)(uint8_t)buf[a])]; + ++a; + } + return (uint32_t)crc0; +} /* end flexcrc() */ + +static uint16_t _cnst0[256] = {0U,49345U,49537U,320U,49921U,960U,640U, + 49729U,50689U,1728U,1920U,51009U,1280U,50625U,50305U,1088U, + 52225U,3264U,3456U,52545U,3840U,53185U,52865U,3648U,2560U, + 51905U,52097U,2880U,51457U,2496U,2176U,51265U,55297U,6336U, + 6528U,55617U,6912U,56257U,55937U,6720U,7680U,57025U,57217U, + 8000U,56577U,7616U,7296U,56385U,5120U,54465U,54657U,5440U, + 55041U,6080U,5760U,54849U,53761U,4800U,4992U,54081U,4352U, + 53697U,53377U,4160U,61441U,12480U,12672U,61761U,13056U, + 62401U,62081U,12864U,13824U,63169U,63361U,14144U,62721U, + 13760U,13440U,62529U,15360U,64705U,64897U,15680U,65281U, + 16320U,16000U,65089U,64001U,15040U,15232U,64321U,14592U, + 63937U,63617U,14400U,10240U,59585U,59777U,10560U,60161U, + 11200U,10880U,59969U,60929U,11968U,12160U,61249U,11520U, + 60865U,60545U,11328U,58369U,9408U,9600U,58689U,9984U,59329U, + 59009U,9792U,8704U,58049U,58241U,9024U,57601U,8640U,8320U, + 57409U,40961U,24768U,24960U,41281U,25344U,41921U,41601U, + 25152U,26112U,42689U,42881U,26432U,42241U,26048U,25728U, + 42049U,27648U,44225U,44417U,27968U,44801U,28608U,28288U, + 44609U,43521U,27328U,27520U,43841U,26880U,43457U,43137U, + 26688U,30720U,47297U,47489U,31040U,47873U,31680U,31360U, + 47681U,48641U,32448U,32640U,48961U,32000U,48577U,48257U, + 31808U,46081U,29888U,30080U,46401U,30464U,47041U,46721U, + 30272U,29184U,45761U,45953U,29504U,45313U,29120U,28800U, + 45121U,20480U,37057U,37249U,20800U,37633U,21440U,21120U, + 37441U,38401U,22208U,22400U,38721U,21760U,38337U,38017U, + 21568U,39937U,23744U,23936U,40257U,24320U,40897U,40577U, + 24128U,23040U,39617U,39809U,23360U,39169U,22976U,22656U, + 38977U,34817U,18624U,18816U,35137U,19200U,35777U,35457U, + 19008U,19968U,36545U,36737U,20288U,36097U,19904U,19584U, + 35905U,17408U,33985U,34177U,17728U,34561U,18368U,18048U, + 34369U,33281U,17088U,17280U,33601U,16640U,33217U,32897U, + 16448U}; + +static uint32_t smackcrc(const char buf[], uint32_t buf_len, + uint32_t a, uint32_t b) +{ + uint16_t crc0; + crc0 = 0U; + while (a<=b) { + /* crc = ((crc >> 8) & 0xff) ^ crc_table[(crc ^ *buf++) & 0xff]; */ + crc0 = X2C_LSH(crc0,16,-8)^(uint16_t)_cnst0[(uint32_t)((crc0^(uint16_t)(uint32_t)(uint8_t)buf[a])&0xFFU)]; + ++a; + } + /*WrHex(CAST(CARDINAL, crc) DIV 256, 3); + WrHex(CAST(CARDINAL, crc) MOD 256, 3); WrStrLn("=crc"); */ + return (uint32_t)(X2C_LSH(crc0,16,-8)|X2C_LSH(crc0&0xFFU,16,8)); +} /* end smackcrc() */ + + +static void sendudp(char buf[], uint32_t buf_len, int32_t len0, + uint32_t port) +{ + int32_t i0; + uint32_t crc0; + struct _0 * anonym; + X2C_PCOPY((void **)&buf,buf_len); + crc0 = UDPCRC(buf, buf_len, len0); + buf[len0] = (char)(crc0&255UL); + buf[len0+1L] = (char)(crc0/256UL); + { /* with */ + struct _0 * anonym = &udpsocks[port]; + i0 = udpsend(anonym->sock, buf, len0+2L, anonym->toport, + anonym->ipnum); + } + X2C_PFREE(buf); +/* +FOR i:=0 TO upos-2 DO IO.WrHex(ORD(buf[i]), 3) END; WrLn; +*/ +} /* end sendudp() */ + + +static int32_t getudp(int32_t fd, char buf[], uint32_t buf_len, + uint32_t inip, char any) +{ + uint32_t fromport; + uint32_t ip; + int32_t len0; + char udp2[100]; + len0 = udpreceive(fd, buf, (int32_t)(buf_len), &fromport, &ip); + if (len0==-1L) return 0L; + if ((len0<=2L || len0>=(int32_t)(buf_len)) || any && inip!=ip) { + return -1L; + } + if ((uint32_t)(uint8_t)buf[len0-2L]+256UL*(uint32_t)(uint8_t) + buf[len0-1L]!=UDPCRC(buf, buf_len, len0-2L)) return -2L; + if (buf[0UL]=='\001') aprsstr_extrudp2(buf, buf_len, udp2, 100ul, &len0); + return len0; +} /* end getudp() */ + + +static void conntcp(int32_t * fd, char url[], uint32_t url_len, + char port[], uint32_t port_len) +{ + int32_t res; + X2C_PCOPY((void **)&url,url_len); + X2C_PCOPY((void **)&port,port_len); + *fd = connectto(url, port); + if ((int32_t)*fd>=0L) res = socknonblock(*fd); + X2C_PFREE(url); + X2C_PFREE(port); +} /* end conntcp() */ + + +static void WCh(char c0) +{ + if (c0!='\015') { + if ((uint8_t)c0<' ' || (uint8_t)c0>='\177') osi_WrStr(".", 2ul); + else osi_WrStr((char *) &c0, 1u/1u); + } +} /* end WCh() */ + + +static void ShowCall(char f[], uint32_t f_len, uint32_t pos) +{ + uint32_t e; + uint32_t i0; + uint32_t tmp; + char tmp0; + e = pos; + tmp = pos+5UL; + i0 = pos; + if (i0<=tmp) for (;; i0++) { + if (f[i0]!='@') e = i0; + if (i0==tmp) break; + } /* end for */ + tmp = e; + i0 = pos; + if (i0<=tmp) for (;; i0++) { + WCh((char)((uint32_t)(uint8_t)f[i0]>>1)); + if (i0==tmp) break; + } /* end for */ + i0 = (uint32_t)(uint8_t)f[pos+6UL]>>1&15UL; + if (i0) { + osi_WrStr("-", 2ul); + if (i0>=10UL) { + osi_WrStr((char *)(tmp0 = (char)(i0/10UL+48UL),&tmp0), + 1u/1u); + } + osi_WrStr((char *)(tmp0 = (char)(i0%10UL+48UL),&tmp0), 1u/1u); + } +} /* end ShowCall() */ + +static uint32_t udpflex_UA = 0x63UL; + +static uint32_t udpflex_DM = 0xFUL; + +static uint32_t udpflex_SABM = 0x2FUL; + +static uint32_t udpflex_DISC = 0x43UL; + +static uint32_t udpflex_FRMR = 0x87UL; + +static uint32_t udpflex_UI = 0x3UL; + +static uint32_t udpflex_RR = 0x1UL; + +static uint32_t udpflex_REJ = 0x9UL; + +static uint32_t udpflex_RNR = 0x5UL; + + +static void Showctl(uint32_t com, uint32_t cmd) +{ + uint32_t cm; + char PF[4]; + char tmp; + osi_WrStr(" ctl ", 6ul); + cm = (uint32_t)cmd&~0x10UL; + if ((cm&0xFUL)==0x1UL) { + osi_WrStr("RR", 3ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + } + else if ((cm&0xFUL)==0x5UL) { + osi_WrStr("RNR", 4ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + } + else if ((cm&0xFUL)==0x9UL) { + osi_WrStr("REJ", 4ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + } + else if ((cm&0x1UL)==0UL) { + osi_WrStr("I", 2ul); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>5)),&tmp), 1u/1u); + osi_WrStr((char *)(tmp = (char)(48UL+(cmd>>1&7UL)),&tmp), + 1u/1u); + } + else if (cm==0x3UL) osi_WrStr("UI", 3ul); + else if (cm==0xFUL) osi_WrStr("DM", 3ul); + else if (cm==0x2FUL) osi_WrStr("SABM", 5ul); + else if (cm==0x43UL) osi_WrStr("DISC", 5ul); + else if (cm==0x63UL) osi_WrStr("UA", 3ul); + else if (cm==0x87UL) osi_WrStr("FRMR", 5ul); + else osi_WrHex(cmd, 1UL); + strncpy(PF,"v^-+",4u); + if (com==0UL || com==3UL) osi_WrStr("v1", 3ul); + else { + osi_WrStr((char *) &PF[(com&1UL)+2UL*(uint32_t) + ((0x10UL & (uint32_t)cmd)!=0)], 1u/1u); + } +} /* end Showctl() */ + + +static void ShowFrame(char f[], uint32_t f_len, uint32_t len0, + char port) +{ + uint32_t i0; + char d; + char v; + osi_WrStr((char *) &port, 1u/1u); + i0 = 0UL; + while (!((uint32_t)(uint8_t)f[i0]&1)) { + ++i0; + if (i0>len0) { + osi_WrStrLn(" no axudp (no address end mark)", 32ul); + return; + } + } + /* no address end mark found */ + if (i0%7UL!=6UL) { + osi_WrStrLn(" no axudp (address field size not modulo 7)", 44ul); + return; + } + /* address end not modulo 7 error */ + osi_WrStr(":fm ", 5ul); + ShowCall(f, f_len, 7UL); + osi_WrStr(" to ", 5ul); + ShowCall(f, f_len, 0UL); + i0 = 14UL; + v = 1; + while (i0+6UL=128UL && (((uint32_t) + (uint8_t)f[i0+6UL]&1) || (uint32_t)(uint8_t) + f[i0+13UL]<128UL)) osi_WrStr("*", 2ul); + i0 += 7UL; + } + Showctl((uint32_t)((0x80U & (uint8_t)(uint8_t)f[6UL])!=0) + +2UL*(uint32_t)((0x80U & (uint8_t)(uint8_t)f[13UL])!=0) + , (uint32_t)(uint8_t)f[i0]); + ++i0; + if (i0=2L) *len0 -= 2L; + X2C_PFREE(t); +} /* end tapr2u() */ + +static uint32_t tncport; + +static uint32_t crc; + +/*testloop:CARDINAL; */ +static aprsstr_GHOSTSET _cnst1 = {0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL}; + +X2C_STACK_LIMIT(100000l) +extern int main(int argc, char **argv) +{ + int32_t tmp; + int32_t tmp0; + X2C_BEGIN(&argc,argv,1,4000000l,8000000l); + osi_BEGIN(); + aprsstr_BEGIN(); + auto0 = 0; + kisson = 0; + verb = 0; + hexdump = 0; + flexmod = udpflex_KISS; + usbrobust = 0; + direwolf = 0; + baud = 9600UL; + ttynamee[0] = 0; + ifn[0] = 0; + tcpfd = -1L; + for (tncport = 0UL; tncport<=7UL; tncport++) { + udpsocks[tncport].sock = -1L; + } /* end for */ + inilen = 0UL; + tty = -1L; + fend = 192UL; + Parms(); + Gencrctab(); + if (ttynamee[0U]) opentty(); + /*IF udpsock<0 THEN Error("udpport open") END; */ + /*WrInt(udpsock, 10); WrStrLn(" sock"); */ + errtime = 0UL; + upos = 0L; + kissm = 0UL; + if (fend!=192UL) kissm = 1UL; + for (;;) { + if (errtime==0UL) inittnc(); + if (direwolf && tcpfd<0L) { + if (verb) { + osi_WrStr("connect ", 9ul); + osi_WrStr(direwolfurl, 2048ul); + osi_WrStr(":", 2ul); + osi_WrStrLn(direwolfport, 11ul); + } + conntcp(&tcpfd, direwolfurl, 2048ul, direwolfport, 11ul); + } + fdclr(); + if (direwolf) { + if (tcpfd>=0L) fdsetr((uint32_t)tcpfd); + } + else if (tty!=-1L) fdsetr((uint32_t)tty); + for (tncport = 0UL; tncport<=7UL; tncport++) { + if (udpsocks[tncport].sock!=-1L) { + fdsetr((uint32_t)udpsocks[tncport].sock); + } + } /* end for */ + if (selectr(0UL, 0UL)>=0L) { + if ((direwolf && tcpfd>=0L) && issetr((uint32_t)tcpfd) + || (!direwolf && tty!=-1L) && issetr((uint32_t)tty)) { + if (direwolf) { + len = readsock(tcpfd, tbuf, 701L); + if (len<0L) { + osic_CloseSock(tcpfd); + tcpfd = -1L; + len = 0L; + usleep(2000000UL); + } + } + else if (tty!=-1L) { + /* disconnected */ + len = osi_RdBin(tty, (char *)tbuf, 701u/1u, 701UL); + } + else len = 0L; + if (!direwolf && usbrobust) testtty(len); + /*WrInt(len, 5); WrLn; */ + tmp = len-1L; + rp = 0L; + if (rp<=tmp) for (;; rp++) { + c = tbuf[rp]; + /*WrStr(c); */ + if (kissm==0UL) { + if (c==(char)fend) { + upos = 0L; + kissm = 1UL; + } + else kisserr(); + } + else if (kissm==1UL) { + if (c==(char)fend) { + if ((upos==0L || flexmod==udpflex_FLEXKISS) + || fend!=192UL) tncport = 0UL; + else tncport = (uint32_t)(uint8_t)ubuf[0U]/16UL&7UL; + if (upos>4L) { + if (auto0) { + if (ubuf[0U]==' ') { + if (verb && flexmod!=udpflex_FLEXKISS) { + osi_WrStrLn("switching to FLEXKISS", 22ul); + } + flexmod = udpflex_FLEXKISS; + } + else if (ubuf[0U]=='\200') { + if (verb && flexmod!=udpflex_SMACK) { + osi_WrStrLn("switching to SMACK", 19ul); + } + flexmod = udpflex_SMACK; + } + else { + if (verb && flexmod) { + osi_WrStrLn("switching to KISS", 18ul); + } + flexmod = udpflex_KISS; + } + } + if ((flexmod==udpflex_KISS || flexmod==udpflex_FLEXKISS && flexcrc(ubuf, + 701ul, 0UL, (uint32_t)(upos-1L))==28784UL) || flexmod==udpflex_SMACK && smackcrc(ubuf, + 701ul, 0UL, (uint32_t)(upos-1L))==0UL) { + if (flexmod>udpflex_KISS) { + upos -= 2L; /* remove crc */ + } + if (fend==192UL) { + /* not TAPR */ + c = ubuf[0U]; + tmp0 = upos-2L; + i = 0L; + if (i<=tmp0) for (;; i++) { + ubuf[i] = ubuf[i+1L]; /* remove port byte */ + if (i==tmp0) break; + } /* end for */ + --upos; + } + else { + tapr2u(ubuf, 701ul, upos, ubuf, 701ul, &upos); + } + if (upos>0L) { + if (hexdump) { + if (fend==192UL) { + /* not TAPR */ + if (flexmod==udpflex_FLEXKISS && c==' ') { + osi_WrStr("FLEX", 5ul); + } + else if ((uint8_t)c>=(uint8_t)'\200') + osi_WrStr("SMACK", 6ul); + else { + osi_WrStr("KISS", 5ul); + } + } + else { + osi_WrStr("TAPR", 5ul); + } + ShowFrame(ubuf, 701ul, (uint32_t)upos, + (char)(tncport+48UL)); + } + sendudp(ubuf, 701ul, upos, tncport); + } + } + else if (verb) { + osi_WrStrLn("serialport-crc error", 21ul); + } + } + /* FOR i:=0 TO upos-1 DO WrHex(ORD(ubuf[i] + ), 3) END; */ + /* WrLn; */ + upos = 0L; + kissm = 1UL; + } + else if (c=='\333' && fend==192UL) kissm = 2UL; + else if (upos<700L) { + ubuf[upos] = c; + ++upos; + } + else kisserr(); + } + else if (kissm==2UL) { + if (c=='\334') c = '\300'; + else if (c=='\335') c = '\333'; + if (upos<700L) { + ubuf[upos] = c; + ++upos; + } + else kisserr(); + kissm = 1UL; + } + if (rp==tmp) break; + } /* end for */ + } + for (tncport = 0UL; tncport<=7UL; tncport++) { + if (udpsocks[tncport].sock!=-1L) { + if (issetr((uint32_t)udpsocks[tncport].sock)) { + { /* with */ + struct _0 * anonym = &udpsocks[tncport]; + len = getudp(anonym->sock, ubuf, 701ul, anonym->ipnum, + anonym->anyip); + } + if (len>=2L && len<698L) { + if (hexdump) { + osi_WrStr("UDP", 4ul); + ShowFrame(ubuf, 701ul, (uint32_t)(len-2L), + (char)(tncport+48UL)); + } + tpos = 0L; + if (fend==192UL) { + /* not TAPR */ + for (i = len; i>=1L; i--) { + ubuf[i] = ubuf[i-1L]; + } /* end for */ + if (flexmod==udpflex_FLEXKISS) ubuf[0U] = ' '; + else if (flexmod==udpflex_SMACK) { + ubuf[0U] = (char)(128UL+16UL*tncport); + } + else ubuf[0U] = (char)(16UL*tncport); + --len; + if (flexmod>udpflex_KISS) { + if (flexmod==udpflex_FLEXKISS) { + crc = flexcrc(ubuf, 701ul, 0UL, + (uint32_t)(len-1L)); + } + else { + crc = smackcrc(ubuf, 701ul, 0UL, + (uint32_t)(len-1L)); + } + ubuf[len+1L] = (char)(crc&255UL); + ubuf[len] = (char)(crc/256UL); + len += 2L; + } + kbuf[0U] = '\300'; + tpos = 1L; + tmp = len-1L; + rp = 0L; + if (rp<=tmp) for (;; rp++) { + c = ubuf[rp]; + if (c=='\300') { + kbuf[tpos] = '\333'; + ++tpos; + c = '\334'; + } + else if (c=='\333') { + kbuf[tpos] = '\333'; + ++tpos; + c = '\335'; + } + kbuf[tpos] = c; + ++tpos; + if (rp==tmp) break; + } /* end for */ + kbuf[tpos] = '\300'; + } + else if (len>2L) { + aprsstr_raw2mon(ubuf, 701ul, kbuf, 701ul, + (uint32_t)(len-2L), &crc, _cnst1); + tpos = (int32_t)aprsstr_Length(kbuf, 701ul); + if (tpos>0L) kbuf[tpos] = '\015'; + } + else tpos = 0L; + if (tpos>0L) { + /* frame valid */ + if (direwolf) { + if ((int32_t)tcpfd>=0L) { + if (sendsock(tcpfd, kbuf, tpos+1L)<0L) { + /* disconnected */ + osic_CloseSock(tcpfd); + tcpfd = -1L; + } + } + } + else if (tty!=-1L) { + osi_WrBin(tty, (char *)kbuf, 701u/1u, + (uint32_t)(tpos+1L)); + } + } + } + else if (verb) { + if (len==-2L) osi_WrStrLn("axudp crc error", 16ul); + else if (len==-1L) { + osi_WrStrLn("axudp from wrong source ip", 27ul); + } + else if (len) osi_WrStrLn("axudp length error", 19ul); + } + } + } + } /* end for */ + } + } + X2C_EXIT(); + return 0; +} + +X2C_MAIN_DEFINITION diff --git a/src/udpgate4.c b/src/udpgate4.c new file mode 100644 index 0000000..a0db796 --- /dev/null +++ b/src/udpgate4.c @@ -0,0 +1,6710 @@ +/* + * dxlAPRS toolchain + * + * Copyright (C) Christian Rabler + * + * SPDX-License-Identifier: GPL-2.0+ + */ + + +#define X2C_int32 +#define X2C_index32 +#ifndef X2C_H_ +#include "X2C.h" +#endif +#define udpgate4_C_ +#ifndef udp_H_ +#include "udp.h" +#endif +#ifndef tcp_H_ +#include "tcp.h" +#endif +#ifndef osi_H_ +#include "osi.h" +#endif +#include +#ifndef Select_H_ +#include "Select.h" +#endif +#ifndef aprspos_H_ +#include "aprspos.h" +#endif +#ifndef aprsstr_H_ +#include "aprsstr.h" +#endif + +/* axudp / tcpip aprs-is gateway and message repeater by OE5DXL */ +/*FROM Storage IMPORT ALLOCATE, DEALLOCATE; */ +/*FROM TimeConv IMPORT time; */ +/* +FROM stat IMPORT fstat, stat_t; +*/ +#define udpgate4_CALLLEN 7 + +#define udpgate4_HASHSIZE 65536 + +#define udpgate4_VERS "udpgate(c) 0.63" + +#define udpgate4_TOCALL "APNL51" + +#define udpgate4_HTTPTIMEOUT 60 + +#define udpgate4_APRSLISTENSOCKS 4 +/* max same time tcp connects */ + +#define udpgate4_WWWLISTENSOCKS 16 +/* max same time www tcp connects */ + +#define udpgate4_UDPSHOWTIME 600 +/* show udp in html */ + +#define udpgate4_GATECONNDELAY 30 + +#define udpgate4_MAXINTERNALDELAY 5 +/* max seconds between udp ports read to not discard data */ + +#define udpgate4_DEFAULTPONGTIME 30 +/* s after last #ping stop datatransfer */ + +typedef char MONCALL[10]; + +typedef char FILENAME[1024]; + +typedef char FRAMEBUF[512]; + +typedef char FILTERST[256]; + +/* + FRAMEBUF=ARRAY[0..256+3+11*10] OF CHAR; +*/ +typedef uint32_t CHSET[4]; + + +struct BEACON { + uint32_t bintervall; + FILENAME bfile; + uint32_t btime; +}; + +struct POSCALL; + + +struct POSCALL { + MONCALL call; + char typ0; + struct aprspos_POSITION pos; +}; + +struct FILTERS; + + +struct FILTERS { + char typ0; + struct aprspos_POSITION base; + struct aprspos_POSITION edge; + float radius; + MONCALL viacalls[8]; + char notvia; + MONCALL entrycalls[8]; + char notentry; + MONCALL prefixes[8]; + char notprefix; + MONCALL destcalls[8]; + char notdestcall; + char typs[13]; + char nottyps; +}; + +typedef char WWWB[1401]; + +struct WWWBUF; + +typedef struct WWWBUF * pWWWBUF; + + +struct WWWBUF { + WWWB buf; + int32_t tlen; + char push; + pWWWBUF next; +}; + +struct QWatch; + + +struct QWatch { + uint32_t lasttb; + int32_t qsize; + int32_t lastqb; + int32_t txbyte[60]; +}; + +struct TCPSOCK; + +typedef struct TCPSOCK * pTCPSOCK; + + +struct TCPSOCK { + pTCPSOCK next; + int32_t fd; + uint32_t beacont; + uint32_t connt; + uint32_t pongtime; + char slowlink; + char valid; + char pingout; /* ping timeout state */ + char service; + uint32_t gatepri; + char ipnum[64]; + char port[6]; + struct POSCALL user; + char vers[21]; + uint32_t wwwst; + uint32_t reload; + char sortby[2]; + struct QWatch qwatch; + uint32_t txframes; + uint32_t txbytes; + uint32_t txbytesh; + uint32_t rxframes; + uint32_t rxbytes; + uint32_t rxbytesh; + uint32_t losttxframes; + uint32_t lostrxframes; + struct FILTERS filters; + FILTERST outfilterst; /* for www show outconn filters */ + int32_t rpos; + int32_t tlen; + FRAMEBUF rbuf; + char tbuf[1024]; + char get[256]; + pWWWBUF txbuf; +}; + +struct UDPSOCK; + +typedef struct UDPSOCK * pUDPSOCK; + +struct _0; + + +struct _0 { + uint32_t uip; + uint32_t uport; + uint32_t rxframes; + uint32_t rxbytes; + uint32_t utime; + uint32_t dtime; +}; + + +struct UDPSOCK { + pUDPSOCK next; + int32_t fd; + aprsstr_GHOSTSET ghosts; + char rawread; + char checkip; + uint32_t ip; + uint32_t bindport; + uint32_t dport; + uint32_t lasttxtime; /* for net to rf bit/s limit */ + uint32_t laststat; + float torfradius; /* radius 0 no gateing */ + uint32_t maxbytes; /* byte/s tx */ + uint32_t lasttxbytes; /* for tx byte/s limit */ + uint32_t txframes; + uint32_t txbytes; + char allpathkey[10]; /* keyword on comment for allpath */ + char portname[10]; + struct _0 stat[16]; +}; + +enum GATEFILT {udpgate4_gUNGATE, udpgate4_gRFONLY, udpgate4_gNOGATE, + udpgate4_gTCPIP, udpgate4_gTCPXX, udpgate4_gQ}; + + +#define udpgate4_MAXHEARD 500 + +#define udpgate4_cUSERMSG ":" + +#define udpgate4_cTHIRDPARTY "}" + +#define udpgate4_ICONDIR "icon" + +#define udpgate4_CALLINKFN "calllink.txt" +/* build an URL for a klicked mh call */ + +#define udpgate4_SERVERLINKFN "serverlink.txt" +/* build an URL for a klicked server ip */ + +#define udpgate4_MHSTEPS 48 + +#define udpgate4_tCELSIUS "C" + +#define udpgate4_tSPEED "S" + +#define udpgate4_UNACKRET 1 + +#define udpgate4_MSGLEN 67 + +typedef char MSGTEXT[68]; + +typedef char ACKTEXT[5]; + +typedef char REPLYACK[2]; + +enum SOURCE {udpgate4_OBSOLET, udpgate4_NET, udpgate4_INDIR, udpgate4_DIR}; + + +struct MESSAGE; + +typedef struct MESSAGE * pMESSAGE; + + +struct MESSAGE { + pMESSAGE next; + uint32_t chkt; + uint32_t txtime; + uint32_t gentime; + uint32_t txport; + uint32_t msg2rf; + uint32_t msg2net; + uint32_t ack2rf; + uint32_t ack2net; + uint32_t retryc; + uint8_t acksrc; + uint8_t src; + char reject; + char acked; + char ackackt; + char queryrep; + MONCALL from; + MONCALL to; + ACKTEXT ack; + REPLYACK replyack; + MSGTEXT text; /* no text is ack */ +}; + +struct HEARD; + +typedef struct HEARD * pHEARD; + + +struct HEARD { + pHEARD next; + uint32_t fromrx; + uint32_t time0; + MONCALL call; + uint32_t cntt; + struct aprspos_POSITION position; + char sym; + char symt; + uint16_t cnt[49]; + char head[41]; + char datatyp; + float data; + double sortval; /* sort value inserted depending on sort by */ + char ungate; /* flag set by user to not igate this direct heard */ + uint16_t txd; + uint8_t quali; + signed char level; +}; + +static uint32_t msgsendtime; + +static uint32_t udpgate4_POLYNOM = 0x8408UL; + +static uint32_t udpgate4_CRCINIT = 0xFFFFUL; + +static uint32_t udpgate4_CRCRESULT = 0x9F0BUL; + +#define udpgate4_CR "\015" + +#define udpgate4_LF "\012" + +#define udpgate4_cUSERMESSAGE ":" + +#define udpgate4_cISGATEWAY "G" + +#define udpgate4_cISSERVER "S" + +#define udpgate4_cISWWW "W" + +#define udpgate4_cTELEMETRY "T" + +static char mhperport; + +/* mh line for same call but different port */ +static char datafilter; + +static char verb; + +/* send no data to user with no filter set */ +static char callsrc; + +static pTCPSOCK tcpsocks; + +static uint32_t showip1; + +static uint32_t showport1; + +static uint32_t systime; + +static uint32_t keeptime; + +static char ungates[6][11]; + +static uint32_t timehash[65536]; + +static uint32_t realtime; + +static uint32_t udpdonetime; + +static uint32_t maxpongtime; + +static uint32_t dupetime; + +static uint32_t uptime; + +static FILENAME rawlogname; + +static FILENAME netbeaconfn; + +static FILENAME logframename; + +static uint32_t lastdnstime; + +static uint32_t gateconndelay; + +static uint32_t netbeaconintervall; + +static uint32_t vcourse; + +static uint32_t vspeed; + +static uint32_t qas; + +static uint32_t qasc; + +static uint32_t maxusers; + +static uint32_t httpcount; + +static char vsym; + +static char vsymt; + +static int32_t valt; + +static int32_t wwwsizelimit; + +static int32_t logframes; + +static MONCALL showid; + +static MONCALL servercall; + +static struct aprspos_POSITION home; /* own position */ + +static char passwd[6]; + +static char serverrangefilter[256]; + +static char actfilter[256]; + +static char wwwdir[1024]; + +static char tcpbindport[6]; + +static char wwwbindport[6]; + +static char nettorfpath[81]; + +static pUDPSOCK udpsocks; + +static uint32_t trygate; + +static int32_t qmaxtime; + +static FILENAME gatesfn; /* filename with gateway table */ + +struct _1; + + +struct _1 { + char url[256]; + char port[6]; + uint32_t resolvtime; + uint32_t connecttime; + FILTERST filterst; +}; + +static struct _1 gateways[21]; + +static MONCALL rfdestcall; + +static MONCALL netdestcall; + +static MONCALL viacall; + +static uint32_t netmhin; + +static uint32_t netmhout; + +static uint32_t msghttpcount; + +static uint32_t mhhttpcount; + +static uint32_t maxmsg; + +static uint32_t maxatonce; + +static uint32_t lastrfsent; + +static uint32_t purgeunack; + +static uint32_t purgemsg; + +static uint32_t purgeacked; + +static uint32_t purgeunacksent; + +static uint32_t rfquiet; + +static uint32_t heardtimevia; + +static uint32_t heardtimew; + +static uint32_t heardtimetcp; + +static uint32_t heardtime; + +static pMESSAGE messages; + +static pHEARD heardvia; + +static pHEARD hearddir; + +static pHEARD heardtcp; + +static char sendnetmsg; + +static MONCALL netmh[100]; + +static uint32_t mhfilelines; + +static FILENAME mhfilename; + +static char udp2[100]; + + +static void spintime(void) +{ + /* make monotonic systime out of jumping realtime */ + uint32_t dt; + uint32_t t; + t = osic_time(); + dt = t-realtime; + realtime = t; + if (dt<60UL) systime += dt; +} /* end spintime() */ + +/* +PROCEDURE Rename(fname,newname: ARRAY OF CHAR); +VAR ok:BOOLEAN; +BEGIN + FileSys.Rename(fname, newname, ok); +END Rename; +*/ + +static void Err(const char text[], uint32_t text_len) +{ + osi_WrStr("udpgate: ", 10ul); + osi_WrStr(text, text_len); + osi_WrStrLn(" error abort", 13ul); + X2C_ABORT(); +} /* end Err() */ + + +static uint32_t Max(uint32_t a, uint32_t b) +{ + if (a>b) return a; + else return b; + return 0; +} /* end Max() */ + + +static uint32_t Min(uint32_t a, uint32_t b) +{ + if (atyp0=='a') { + aprsstr_Assign(s, s_len, "a", 2ul); + app(s, s_len, anonym->base.lat, 1); + app(s, s_len, anonym->base.long0, 1); + app(s, s_len, anonym->edge.lat, 1); + app(s, s_len, anonym->edge.long0, 1); + } + else if (anonym->typ0=='r') { + aprsstr_Assign(s, s_len, "r", 2ul); + app(s, s_len, anonym->base.lat, 1); + app(s, s_len, anonym->base.long0, 1); + app(s, s_len, anonym->radius, 0); + } + else if (anonym->typ0=='m') { + aprsstr_Assign(s, s_len, "m", 2ul); + app(s, s_len, anonym->radius, 0); + } + wrcalls(s, s_len, anonym->viacalls, 8ul, anonym->notvia, 'd'); + wrcalls(s, s_len, anonym->entrycalls, 8ul, anonym->notentry, 'e'); + wrcalls(s, s_len, anonym->prefixes, 8ul, anonym->notprefix, 'p'); + wrcalls(s, s_len, anonym->destcalls, 8ul, anonym->notdestcall, 'u'); + if (anonym->typs[0U]) { + aprsstr_Append(s, s_len, " ", 2ul); + if (anonym->nottyps) aprsstr_Append(s, s_len, "-", 2ul); + aprsstr_Append(s, s_len, "t/", 3ul); + aprsstr_Append(s, s_len, anonym->typs, 13ul); + } + } +} /* end FiltToStr() */ + + +static char Watchclock(uint32_t * t, uint32_t intervall) +{ + uint32_t tn; + if (intervall>0UL || *t==0UL) { + /* send once */ + tn = systime; + if (*t<=tn) { + *t += intervall; + if (*t<=tn) *t = tn+intervall; + return 1; + } + } + return 0; +} /* end Watchclock() */ + +static uint32_t udpgate4_ROOT = 0x73E2UL; + + +static uint32_t call2pass(const char c[], uint32_t c_len) +{ + uint32_t i0; + uint32_t s; + s = 0x73E2UL; + i0 = 0UL; + while ((i0<=c_len-1 && c[i0]) && c[i0]!='-') { + s = s^X2C_LSH((uint32_t)(uint32_t)(uint8_t)X2C_CAP(c[i0]),32, + (int32_t)!(i0&1)*8L); + ++i0; + } + return (uint32_t)(s&0x7FFFUL); +} /* end call2pass() */ + + +static int32_t GetSec(char h[], uint32_t h_len, uint32_t * p, + uint32_t * n) +{ + char ok0; + int32_t GetSec_ret; + X2C_PCOPY((void **)&h,h_len); + h[h_len-1] = 0; + *n = 0UL; + ok0 = 0; + while ((uint8_t)h[*p]>='0' && (uint8_t)h[*p]<='9') { + ok0 = 1; + *n = ( *n*10UL+(uint32_t)(uint8_t)h[*p])-48UL; + ++*p; + } + if (!ok0) { + GetSec_ret = -1L; + goto label; + } + /* + IO.WrCard(n,10); IO.WrLn; + */ + GetSec_ret = 0L; + label:; + X2C_PFREE(h); + return GetSec_ret; +} /* end GetSec() */ + + +static char callok(const char h[], uint32_t h_len) +{ + uint32_t lit; + uint32_t num; + uint32_t i0; + char c; + num = 0UL; + lit = 0UL; + i0 = 0UL; + for (;;) { + c = h[i0]; + if ((uint8_t)c>='0' && (uint8_t)c<='9') ++num; + else if ((uint8_t)c>='A' && (uint8_t)c<='Z') ++lit; + else break; + ++i0; + } + if ((lit<2UL || num==0UL) || num>2UL) return 0; + if (h[i0]=='-') { + ++i0; + if (h[i0]=='1') { + ++i0; + if ((uint8_t)h[i0]>='0' && (uint8_t)h[i0]<='5') ++i0; + } + else { + if ((uint8_t)h[i0]<'1' || (uint8_t)h[i0]>'9') return 0; + ++i0; + } + } + return h[i0]==0; +} /* end callok() */ + + +static void readurlsfile(const char gatesfn0[], uint32_t gatesfn_len) +{ + uint32_t i0; + uint32_t n; + int32_t ii; + int32_t len; + int32_t fd; + FILENAME h; + memset((char *)gateways,(char)0,sizeof(struct _1 [21])); + fd = osi_OpenRead(gatesfn0, gatesfn_len); + if (fd<0L) { + strncpy(h,"-g :file <",1024u); + aprsstr_Append(h, 1024ul, gatesfn0, gatesfn_len); + aprsstr_Append(h, 1024ul, "> not readable", 15ul); + osi_WrStrLn(h, 1024ul); + return; + } + n = 0UL; + do { + i0 = 0UL; + for (;;) { + len = osi_RdBin(fd, (char *) &h[i0], 1u/1u, 1UL); + if (((len<=0L || i0>=1023UL) || h[i0]=='\015') || h[i0]=='\012') { + h[i0] = 0; + break; + } + ++i0; + } + if (h[0U] && h[0U]!='#') { + if (h[0U]=='[') { + ii = 1L; + while (h[ii] && h[ii]!=']') ++ii; + if (h[ii]!=']' || h[ii+1L]!=':') { + osi_WrStrLn("urlfile: [url]:port", 20ul); + } + h[ii] = 0; + i0 = 1UL; + while (i0<=1023UL) { + h[i0-1UL] = h[i0]; + ++i0; + } + } + else ii = aprsstr_InStr(h, 1024ul, ":", 2ul); + if (ii>=0L) h[ii] = 0; + aprsstr_Assign(gateways[n].url, 256ul, h, 1024ul); + if (ii>0L) { + /* port number */ + ++ii; + i0 = 0UL; + while (ii<=1023L) { + h[i0] = h[ii]; + ++i0; + ++ii; + } + } + else osi_WrStrLn("urlfile: [url]:port", 20ul); + ii = aprsstr_InStr(h, 1024ul, "#", 2ul); + if (ii>=0L) h[ii] = 0; + if (h[0U]==0) { + osi_WrStrLn("urlfile: [url]:port#filters", 28ul); + } + aprsstr_Assign(gateways[n].port, 6ul, h, 1024ul); + if (ii>0L) { + /* we have a filter string */ + ++ii; + i0 = 0UL; + while (ii<=1023L) { + if (h[ii]==',') h[ii] = ' '; + h[i0] = h[ii]; + ++i0; + ++ii; + } + aprsstr_Assign(gateways[n].filterst, 256ul, h, 1024ul); + } + ++n; + } + } while (!(len<=0L || n>20UL)); + osic_Close(fd); +} /* end readurlsfile() */ + +static aprsstr_GHOSTSET _cnst = {0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL,0x00000000UL,0x00000000UL, + 0x00000000UL,0x00000000UL}; + +static void parms(void) +{ + char h[4096]; + aprsstr_GHOSTSET ghost; + char err; + char lasth; + uint32_t n; + uint32_t i0; + uint32_t gatecnt; + int32_t len; + int32_t fd; + pUDPSOCK ush; + pUDPSOCK usock; + int32_t ii; + char allkey[10]; + struct UDPSOCK * anonym; + uint32_t tmp; + err = 0; + verb = 0; + datafilter = 0; + gatecnt = 0UL; + memcpy(ghost,_cnst,36u); + keeptime = 0UL; /*600*/ /* default keep connected to gateway time */ + allkey[0U] = 0; + for (;;) { + osi_NextArg(h, 4096ul); + if (h[0U]==0) break; + if ((h[0U]=='-' && h[1U]) && h[2U]==0) { + lasth = h[1U]; + if (lasth=='R' || lasth=='M') { + osi_NextArg(h, 4096ul); + osic_alloc((char * *) &usock, sizeof(struct UDPSOCK)); + if (usock==0) Err("out of memory", 14ul); + memset((char *)usock,(char)0,sizeof(struct UDPSOCK)); + { /* with */ + struct UDPSOCK * anonym = usock; + if (aprsstr_GetIp2(h, 4096ul, &anonym->ip, &anonym->dport, + &anonym->bindport, &anonym->checkip)<0L) { + Err("-R or -M need ip:port:port", 27ul); + } + anonym->fd = openudp(); + anonym->rawread = lasth=='R'; + if (anonym->fd<0L || bindudp(anonym->fd, + anonym->bindport)<0L) { + Err("-R or -M cannot bind udpport", 29ul); + } + len = socknonblock(anonym->fd); + ii = aprsstr_InStr(h, 4096ul, "+", 2ul); + if (ii>0L) { + i0 = (uint32_t)(ii+1L); + if (GetSec(h, 4096ul, &i0, &n)>=0L) { + anonym->maxbytes = n; + ++i0; + if (h[i0-1UL]==':' && GetSec(h, 4096ul, &i0, &n)>=0L) { + anonym->torfradius = (float)n; + } + } + } + ii = aprsstr_InStr(h, 4096ul, "#", 2ul); /* get port name */ + if (ii>0L) { + ++ii; + i0 = 0UL; + while ((i0<=9UL && ii<=4095L) && h[ii]) { + anonym->portname[i0] = h[ii]; + ++i0; + ++ii; + } + } + memcpy(anonym->ghosts,ghost,36u); + aprsstr_Assign(anonym->allpathkey, 10ul, allkey, 10ul); + anonym->next = 0; + } + if (udpsocks==0) udpsocks = usock; + else { + ush = udpsocks; + while (ush->next) ush = ush->next; + ush->next = usock; + } + memcpy(ghost,_cnst,36u); + } + else if (lasth=='c') callsrc = 1; + else if (lasth=='s' || lasth=='S') { + osi_NextArg(h, 4096ul); + aprsstr_Assign(servercall, 10ul, h, 4096ul); + if ((servercall[0U]==0 || servercall[0U]=='-') + || lasth=='s' && !callok(h, 4096ul)) { + Err("-s call-ssid", 13ul); + } + } + else if (lasth=='p') { + osi_NextArg(h, 4096ul); + if ((uint8_t)h[0U]>='0' && (uint8_t)h[0U]<='9') { + i0 = 0UL; + while (i0<=5UL && (uint8_t)h[i0]>=' ') { + passwd[i0] = h[i0]; + ++i0; + } + } + else { + fd = osi_OpenRead(h, 4096ul); + if (fd<0L) Err("-p passcode or passwordfile", 28ul); + len = osi_RdBin(fd, (char *)passwd, 6u/1u, 5UL); + if (len>=0L) passwd[len] = 0; + else Err("-p error with password file", 28ul); + osic_Close(fd); + } + passwd[5U] = 0; + i0 = 0UL; + while ((uint8_t)passwd[i0]>='0' && (uint8_t)passwd[i0]<='9') { + ++i0; + } + if (i0==0UL || passwd[i0]) Err("-p invalid passcode", 20ul); + } + else if (lasth=='m') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L) maxusers = n; + else Err("-m number", 10ul); + } + else if (lasth=='D') { + osi_NextArg(h, 4096ul); + aprsstr_Assign(wwwdir, 1024ul, h, 4096ul); + if (h[0U]==0 || h[0U]=='-') Err("-D directory", 13ul); + i0 = aprsstr_Length(wwwdir, 1024ul); + if (i0>0UL && wwwdir[i0-1UL]!='/') { + aprsstr_Append(wwwdir, 1024ul, "/", 2ul); + } + } + else if (lasth=='d') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L) dupetime = n; + else Err("-d number", 10ul); + if (dupetime<27UL) { + osi_WrStrLn("-d do not set dupefilter less 27s!", 35ul); + } + } + else if (lasth=='e') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L) { + if (n==0UL) n = 1UL; + gateconndelay = n; + } + else Err("-e seconds", 11ul); + } + else if (lasth=='C') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L) heardtimetcp = n*60UL; + else Err("-C minutes", 11ul); + } + else if (lasth=='H') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L) heardtimew = n*60UL; + else Err("-H minutes", 11ul); + } + else if (lasth=='I') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L) heardtimevia = n*60UL; + else Err("-I minutes", 11ul); + } + else if (lasth=='i') { + osi_NextArg(h, 4096ul); + if (h[0U]=='-') h[0U] = 0; + aprsstr_Assign(allkey, 10ul, h, 4096ul); + } + else if (lasth=='L') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L) maxmsg = n; + else Err("-L number", 10ul); + } + else if (lasth=='l') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L && h[i0]==':') { + logframes = (int32_t)n; + ++i0; + for (n = 0UL; n<=1023UL; n++) { + if (i0<=4095UL) { + logframename[n] = h[i0]; + ++i0; + } + } /* end for */ + if ((uint8_t)logframename[0U]<=' ') { + Err("-l loglevel:filename", 21ul); + } + } + else Err("log format is level:file", 25ul); + } + else if (lasth=='r') { + osi_NextArg(rawlogname, 1024ul); + if ((uint8_t)rawlogname[0U]<=' ') { + Err("-r rawlogfilename", 18ul); + } + } + else if (lasth=='F') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L && h[i0]==':') { + mhfilelines = n; + ++i0; + for (n = 0UL; n<=1023UL; n++) { + if (i0<=4095UL) { + mhfilename[n] = h[i0]; + ++i0; + } + } /* end for */ + if ((uint8_t)mhfilename[0U]<=' ') { + Err("-F MHfilename", 14ul); + } + } + else Err("MH File lines:file", 19ul); + } + else if (lasth=='n') { + osi_NextArg(h, 4096ul); + i0 = 0UL; + if (GetSec(h, 4096ul, &i0, &n)>=0L && h[i0]==':') { + netbeaconintervall = n*60UL; + ++i0; + for (n = 0UL; n<=1023UL; n++) { + if (i0<=4095UL) { + netbeaconfn[n] = h[i0]; + ++i0; + } + } /* end for */ + if ((uint8_t)netbeaconfn[0U]<=' ') { + Err("-n netbeacon filename", 22ul); + } + } + else Err("-n netbeacon format is minutes:file", 36ul); + } + else if (lasth=='N') sendnetmsg = 0; + else if (lasth=='t') { + osi_NextArg(h, 4096ul); + aprsstr_Assign(tcpbindport, 6ul, h, 4096ul); + if (h[0U]==0 || h[0U]=='-') Err("-t port", 8ul); + } + else if (lasth=='w') { + osi_NextArg(h, 4096ul); + aprsstr_Assign(wwwbindport, 6ul, h, 4096ul); + if (h[0U]==0 || h[0U]=='-') Err("-w port", 8ul); + } + else if (lasth=='f') { + osi_NextArg(h, 4096ul); + aprsstr_Assign(serverrangefilter, 256ul, h, 4096ul); + if (h[0U]==0 || h[0U]=='-') Err("-f rangefilter", 15ul); + tmp = aprsstr_Length(serverrangefilter, 256ul); + i0 = 0UL; + if (i0<=tmp) for (;; i0++) { + if (serverrangefilter[i0]==',') serverrangefilter[i0] = ' '; + if (i0==tmp) break; + } /* end for */ + } + else if (lasth=='g') { + /* "url port" or "url:port" or "url:port#filter" */ + osi_NextArg(h, 4096ul); + if (h[0U]==0) Err("-g url port", 12ul); + if (h[0U]==':') { + /* get urls later from file */ + for (i0 = 1UL; i0<=4095UL; i0++) { + h[i0-1UL] = h[i0]; + } /* end for */ + h[4095U] = 0; + aprsstr_Assign(gatesfn, 1024ul, h, 4096ul); + } + else { + if (gatecnt>20UL) Err("-g gateway table full", 22ul); + h[4095U] = 0; + if (h[0U]=='[') { + ii = 1L; + while (h[ii] && h[ii]!=']') ++ii; + if (h[ii]!=']' || h[ii+1L]!=':') { + Err("-g [url]:port", 14ul); + } + h[ii] = 0; + i0 = 1UL; + while (i0<=4095UL) { + h[i0-1UL] = h[i0]; + ++i0; + } + } + else ii = aprsstr_InStr(h, 4096ul, ":", 2ul); + if (ii>=0L) h[ii] = 0; + aprsstr_Assign(gateways[gatecnt].url, 256ul, h, 4096ul); + if (ii>0L) { + /* port number */ + ++ii; + i0 = 0UL; + while (ii<=4095L) { + h[i0] = h[ii]; + ++i0; + ++ii; + } + } + else osi_NextArg(h, 4096ul); + h[4095U] = 0; + ii = aprsstr_InStr(h, 4096ul, "#", 2ul); + if (ii>=0L) h[ii] = 0; + if (h[0U]==0) Err("-g url:port", 12ul); + aprsstr_Assign(gateways[gatecnt].port, 6ul, h, 4096ul); + if (ii>0L) { + /* we have a filter string */ + ++ii; + i0 = 0UL; + while (ii<=4095L) { + if (h[ii]==',') h[ii] = ' '; + h[i0] = h[ii]; + ++i0; + ++ii; + } + aprsstr_Assign(gateways[gatecnt].filterst, 256ul, h, + 4096ul); + } + ++gatecnt; + } + } + else { + if (lasth=='h') { + osi_WrStrLn(" -0 send no Data (only Messages and a\ +ck) to User with no Filter", 76ul); + osi_WrStrLn(" -C