aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.hg_archival.txt2
-rw-r--r--Make.rules2
-rw-r--r--README7
-rw-r--r--debian/changelog6
-rw-r--r--lib/libdvbsec/dvbsec_api.c17
-rw-r--r--util/Makefile2
-rw-r--r--util/alevt/COPYRIGHT297
-rw-r--r--util/alevt/ChangeLog535
-rw-r--r--util/alevt/EXPORT.HOWTO84
-rw-r--r--util/alevt/Makefile130
-rw-r--r--util/alevt/README72
-rw-r--r--util/alevt/README.OLD78
-rw-r--r--util/alevt/ReadmeGR28
-rw-r--r--util/alevt/TODO12
-rw-r--r--util/alevt/alevt-cap.153
-rw-r--r--util/alevt/alevt-cap.c280
pre { line-height: 125%; margin: 0; } td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
NEWS
====

--------------------
0.7.3 (2011-12-22)
--------------------
  * Scan window:
    - items are now sorted first by channel (ascending) then by signal
      strength (descending), as before
    - using one line per entry doubled the capacity of the scan window
    - refresh interval is made configurable (via 'Statistics updates')
  * Configuration screen:
    - memorizes the last-changed item to ease longer configuration tasks
  * Fixes:
    - better (cleaner) termination on error
    - fixed clear-line refresh in info screen
    - fixed bug in generator for random link quality (causing negative values)
    - reverted using separate process group (problems when running under sudo)
    - miscellaneous code reordering to decouple functional units

--------------------
0.7.2 (2011-02-25)
--------------------
  * General:
    - support SIGWINCH for resizing (thanks to Koniu)
    - reorganized screen handling to support resizing
    - make geometry checking optional and off by default
    - allow suspending wavemon (CTRL-Z) on most screens
  * Info screen:
    - suppress obvious broadcast address (deriving from prefix)
    - special case for "no interface address assigned"
    - display interface MTU if different from the default value
    - show interface flags and TX queue length if enough space
  * Scan window:
    - set up enable interface if it is down (otherwise no scan)
    - drop support for wireless extensions < 18 (minimum requirement)
    - clean up child scan process on error (avoid garbled screen)
  * Configuration screen:
    - support 'Cisco-style' MAC addresses (dots rather than colons)
  * Fixes:
    - do not report zero bitrates (Info screen, 802.11n interface)
    - remove unused timer in Scan window (data sampling is now
      confined to info/histogram screens)
    - fixed various compiler warnings
    - fixed several problems in and improved the random generator
    - use sigaction() rather than signal()
    - miscellaneous reorganization of the configuration menu code

--------------------
0.7.1 (2010-12-24)
--------------------
  * Scan window:
    - improved and more consistent formatting of entries
    - better responsiveness by running scan operation as child process
  * Security capabilities:
    - display capabilities supported by the driver
    - display current and available key sizes
    - decode relevant IE information
  * check and warn about insufficient permissions (CAP_NET_ADMIN) that
    are required for several wireless operations (e.g. scanning)
  * Bug Fixes:
    - avoid triggering assertion on large screens
    - require minimum version (18) of the wireless extensions
    - better clearing of info screen
    - various cleanups
  * overhaul of manpages

--------------------
0.7.0 (2010-10-18)
--------------------
  * NEW Scan Window: this replaces the old access point screen. It displays
    a sorted list (in descending order of signal quality) of access points
    and other wireless clients within range, periodically refreshed at a
    configurable rate.
  * Access Point screen: finally deprecated this - the SIOCGIWAPLIST
    ioctl itself is deprecated and works only on some older kernels.
  * Info Window: clear screen to erase stale data.
  * Bug Fixes: fixed a compiler warning in string-tolower operation.

--------------------
0.6.11 (2010-06-14)
--------------------
 * Info screen:
   - fixed a bug in the freq/channel display: some drivers, such as ipw2100,
     only return the channel number, requiring to look up the frequency;
   - added a warning to indicate the absence of data from the interface.
 * Histogram screen:
   Tag the grid lines with the corresponding dBm levels:
   - no levels are shown if there is no valid interface data (screen empty);
   - level tags are restricted to the signal level graph only:
     o if both signal and noise level data are valid, there are three graphs
       (signal level, noise level, SNR), which would cause ambiguity,
     o many cards (e.g. ath5k, rt73usb, iwl3945) do not supply noise data,
       so that the histogram screen will then only contain the level graph;
   - since the scale is adjustable, while the grid lines are fixed, the tags
     are dynamically recomputed based on the y position and current scale;
   - the min/max bounds of the scale are also shown.
   Thanks to Sean Muir for this suggestion.
 * Updated manpage regarding access point screen; as soon there is time, the
   outdated and restricted SIOCGIWAPLIST ioctl should be replaced by a scan.

--------------------
0.6.10 (2009-10-25)
--------------------
 * Bug Fixes:
   - fixed installation bug which caused manpages to be installed in /man;
   - fixed mode of installation to support sandbox-builds on Gentoo (Lovelace);
   - improved (automated) linking process, now possible to pass LDFLAGS (Boeck);
   - bail out when no statistics are available, instead of flagging an error.

--------------------
0.6.7 (2009-07-09)
--------------------
 * Screen geometry:
   Reduced the screen size again, to 24x80, since this is a widely used default
   size (thanks to Nelson A. de Oliveira). Removed the "wireless extensions"
   information from the information screen, to reduce the minimum required
   number of lines from 25 to 24. The wireless extension information however
   remains still available, via the "wavemon -d" dump option.

 * Histogram screen improvements:
   - a new revised approach to fix several old bugs and limitations,
   - new code better observes the boundaries and the configured ranges,
   - better visibility, signal/noise are now plotted in bold.

 * Better separation of error messages, into:
   - informational warning messages (outside ncurses mode),
   - fatal errors unrelated to system calls,
   - fatal errors following a system call (with interpretation of errno(3)).

 * Bug Fixes:
   - fixed a bug in the histogram initialisation (producing ghost values);
   - fixed a bug which caused non-ASCII encryption key strings to be garbled;
   - key string length is now checked to avoid spilling over the right border
     into the next line; curtailing long keys in a pretty-printing manner.

--------------------
0.6.6 (2009-06-01)
--------------------
 * Access point screen:
   Overly long access point lists (more than 6 peer access points) are now
   truncated, so as not to overwrite screen borders.

 * Histogram screen:
   The bottom 'key' window used to replicate the configured range values which
   are available also via the configuration screen. This replication has now
   been superseded by a dynamic range-tracking feature:
   - for each of the three ranges (signal level, noise level, SNR), it shows
     the min..max values on the screen or 'unknown' if the driver reports
     values as unknown (e.g. noise levels on iwl3945),
   - these values correspond to the current histogram and are updated
     dynamically, thus complementing the visual display.

 * Bug Fixes:
   - histogram screen no longer tracks values that the driver reports as invalid;
   - fixed off-by-one bug which caused the bottom access-point border to be erased;
   - miscellaneous code clean-ups:
     o unified description of window sizes via header file constants,
     o updated and extended source code documentation.

--------------------
0.6.5 (2009-05-08)
--------------------
 * Several improvements in displaying driver parameters:
   - ESSID: support for indexed ESS identifiers,
   - nickname: no longer present empty/void nicknames,
   - nwid: added support for displaying it (even if is pre-802.11),
   - IP-address: collapse netmask information into shorter CIDR prefix length,
   - mode: preliminary support to display 802.11s mesh mode (2.6.26),
   - retry: new code to display information about MAC-layer retransmissions,
   - frequency: suppress trailing zeroes, unified conversion,
   - channel: now also prints the number of the current channel,
   - encryption keys: added pretty-printing, suppress always-present '0' index,
   - sensitivity: only print if card supports it, now also supports dBm values,
   - tx-power: better support for the various formats (relative | mW | dBm),
   - power management: improved output formatting.

 * Mode-sensitive display:
   - when operating in 'monitor' or 'access point' mode, the 'access point'
     field is not necessary or redundant (in AP mode, it is the same as the
     mac address shown in the network window), hence omitted;
   - when operating in 'master', 'repeater' or 'secondary' mode, the bitrate
     information is also not needed and hence suppressed;
   - wavemon is now able to distinguish auto-configured values (using upper-case
     labels) from manually configured values (using standard lower-case labels).

 * Encryption keys (only with CAP_NET_ADMIN privileges): display of all-ASCII
   keys is now in cleartext, otherwise the hex format is now pretty-printed.

 * Screen Layout: redundancies (repeated interface name) have been removed, the
   whole screen fits again into a 25x80 console window. In addition, wavemon
   tests if the screen size and bails out if the screen is too small for a
   readable layout.

 * Better display of MAC addresses:
   - detects the "not associated" state of a managed client and then
   - displays 'non-associated' state instead of showing zero MAC address,
   - sanity checks on access point addresses (broadcast address is invalid),
   - Ethernet addresses are automatically translated to symbolic names if a
     mapping  exists for the MAC address in /etc/ethers.

 * The Access Point List is now sorted in descending order of signal strength.

 * The LC_NUMERIC locale is honoured: when displaying large numbers (e.g. packet
   counters, numbers are now grouped according to the locale.

 * Bug Fixes:
   - fixed several conditions which caused the window borders to be punctured;
   - fixed a bug in the display of MAC addresses on the access point screen;
   - RTS/CTS threshold suffered from the same problem - also fixed,
   - fixed broken display of frag[mentation] threshold;
   - fixed a bug which caused empty nicknames ("") to be displayed;
   - fixed several smaller bugs, thanks to sparse.

--------------------
0.6 (2009-04-01)
--------------------
 * Update to the latest wireless extension API (number 22),
   As a consequence of updating the wireless extensions, more
   information is now displayed, including
   - excessive TX MAC reassembly retries,
   - missed beacon count
   - display of wireless extension version used by the driver
   - the driver's internal WE version

 * wavemon now uses ioctl to obtain IW statistics and falls back
   to /proc/net/wireless only as a last resort. (It is planned
   to add netlink support in a later release.)

 * Linear scales (-l option) no longer supported, since levels
   are always reported both in log (dBm) and lin (mW).
   (NB: in case of using an old version of ~/.wavemonrc, it is
        necessary to remove the line containing 'linear_scale',
	which is the option that has been removed.)

 * Added sanity checks to the display of level information:
   - noise level is only displayed if valid signal levels exist;
   - some cards set a magic number to mean an invalid noise level - a
     constant has been added to catch such cases;
   - if the noise level (and hence the SNR value) is undefined, spread
     out the  display of quality/signal levels over the info window.

 * Added gui option for smoothing level meters (better readability).

 * Much better and more accurate information in the Access Point List.

 * Bug Fixes:
   - it is finally possible to use the Access Point List as start screen,
   - updated and fixed display of operation modes,
   - selecting the wireless interface now works with multiple interfaces,
   - header inclusion bug fix for Puppy Linux (thanks to Tom Gordon).

 * Updated all components of the autoconf build system:
   - DESTDIR is now supported for building packages
     (thanks to Christoph J. Thompson),
   - now using autoconf to set package version and build date.

 * Reorganised source tree organisation:
   - merged many small (one-line) header files into one,
   - created a 'contrib' directory for contributed scripts,
   - added 'config' directory for autoconf auxiliary scripts
   - reinstated standard GNU autoconf listing of files

--------------------
0.5 (2009-01-17)
--------------------
Update on the build process, new maintainer, git tree
to keep the changes. Fixes in this release include
 * minor bug fixes
 * build fixups and fixes for the build process
 * a stub handler for SIGWINCH (still not fully supported)
 * adding units to the levels (lin/log)
 * tidied up code

--------------------
0.4.0b (2002-12-21)
--------------------
Last release by the original author, Jan Morgenstern.
il/alevt/vt904.out
29
-rw-r--r--util/alevt/vt905.out29
-rw-r--r--util/alevt/vt906.out29
-rw-r--r--util/alevt/vt907.out29
-rw-r--r--util/alevt/vt908.out29
-rw-r--r--util/alevt/vt909.out29
-rw-r--r--util/alevt/vt910.out29
-rw-r--r--util/alevt/vt911.out29
-rw-r--r--util/alevt/vt912.out29
-rw-r--r--util/alevt/vt913.out29
-rw-r--r--util/alevt/vt914.out29
-rw-r--r--util/alevt/vt915.out29
-rw-r--r--util/alevt/vtxt-iso8859-7.bdf5768
-rw-r--r--util/alevt/vtxt-koi8.bdf5906
-rw-r--r--util/alevt/vtxt-latin-1.bdf5906
-rw-r--r--util/alevt/vtxt-latin-2.bdf5906
-rw-r--r--util/alevt/xio.c1156
-rw-r--r--util/alevt/xio.h80
-rw-r--r--util/atsc_epg/Makefile16
-rw-r--r--util/atsc_epg/README12
-rw-r--r--util/atsc_epg/atsc_epg.c1249
-rw-r--r--util/femon/femon.c57
-rw-r--r--util/gotox/Makefile17
-rw-r--r--util/gotox/gotox.c145
-rw-r--r--util/scan/dvb-c/at-Kabel-Braunau26
-rw-r--r--util/scan/dvb-c/at-Kabelsignal38
-rw-r--r--util/scan/dvb-c/at-KarrerNet18
-rw-r--r--util/scan/dvb-c/hu-Digikabel24
-rw-r--r--util/scan/dvb-c/nl-Casema3
-rw-r--r--util/scan/dvb-c/nl-Ziggo14
-rw-r--r--util/scan/dvb-c/nl-Ziggo-Zwolle26
-rw-r--r--util/scan/dvb-c/se-comhem22
-rw-r--r--util/scan/dvb-s/Agila2_C-146.0E60
-rw-r--r--util/scan/dvb-s/Amos-4w114
-rw-r--r--util/scan/dvb-s/Apstar6_C-134.0E15
-rw-r--r--util/scan/dvb-s/AsiaSat2_C-100.5E51
-rw-r--r--util/scan/dvb-s/AsiaSat3S_C-105.5E152
-rw-r--r--util/scan/dvb-s/Asiasat4_C-122.2E27
-rw-r--r--util/scan/dvb-s/Astra-23.5E66
-rw-r--r--util/scan/dvb-s/Atlantic-Bird-1-12.5W46
-rw-r--r--util/scan/dvb-s/Atlantic-Bird-3-5.0W4
-rw-r--r--util/scan/dvb-s/Chinastar1_C-87.5E15
-rw-r--r--util/scan/dvb-s/Insat2E_C-83.0E93
-rw-r--r--util/scan/dvb-s/Insat3A_C-93.5E66
-rw-r--r--util/scan/dvb-s/Insat4A_C-83.0E93
-rw-r--r--util/scan/dvb-s/Insat4B_C-93.5E51
-rw-r--r--util/scan/dvb-s/Intelsat-1002-1.0W17
-rw-r--r--util/scan/dvb-s/Intelsat8_C-166.0E39
-rw-r--r--util/scan/dvb-s/JCSat3A_C-128.0E18
-rw-r--r--util/scan/dvb-s/Measat3_C-91.5E54
-rw-r--r--util/scan/dvb-s/Nilesat101+102-7.0W73
-rw-r--r--util/scan/dvb-s/PalapaC2_C-113.0E39
-rw-r--r--util/scan/dvb-s/ST1_C-80.0E27
-rw-r--r--util/scan/dvb-s/Sirius-5.0E57
-rw-r--r--util/scan/dvb-s/Telecom2-8.0W17
-rw-r--r--util/scan/dvb-s/Telkom1_C-108.0E48
-rw-r--r--util/scan/dvb-s/Telstar-12-15.0W32
-rw-r--r--util/scan/dvb-s/Telstar10_C-76.5E63
-rw-r--r--util/scan/dvb-s/Telstar12-15.0W26
-rw-r--r--util/scan/dvb-s/Telstar18_C-138.0E18
-rw-r--r--util/scan/dvb-s/Thaicom1A_C-120.0E24
-rw-r--r--util/scan/dvb-s/Thaicom2_C-78.5E33
-rw-r--r--util/scan/dvb-s/Thaicom5_C-78.5E69
-rw-r--r--util/scan/dvb-s/Thor-1.0W32
-rw-r--r--util/scan/dvb-s/Vinasat1_C-132.0E12
-rw-r--r--util/scan/dvb-t/au-AdelaideFoothills12
-rw-r--r--util/scan/dvb-t/au-Bendigo41
-rw-r--r--util/scan/dvb-t/au-Devonport19
-rw-r--r--util/scan/dvb-t/au-FraserCoast-Bundaberg12
-rw-r--r--util/scan/dvb-t/au-Goulburn-Rocky_Hill19
-rw-r--r--util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill16
-rw-r--r--util/scan/dvb-t/au-Perth2
-rw-r--r--util/scan/dvb-t/au-SunshineCoast2
-rw-r--r--util/scan/dvb-t/au-Sutherland20
-rw-r--r--util/scan/dvb-t/be-Brussels6
-rw-r--r--util/scan/dvb-t/cz-All41
-rw-r--r--util/scan/dvb-t/cz-Brno10
-rw-r--r--util/scan/dvb-t/cz-Domazlice3
-rw-r--r--util/scan/dvb-t/cz-Klet4
-rw-r--r--util/scan/dvb-t/cz-Ostrava3
-rw-r--r--util/scan/dvb-t/cz-Plzen8
-rw-r--r--util/scan/dvb-t/cz-Praha7
-rw-r--r--util/scan/dvb-t/de-Baden-Wuerttemberg15
-rw-r--r--util/scan/dvb-t/de-Bayern28
-rw-r--r--util/scan/dvb-t/de-Berlin7
-rw-r--r--util/scan/dvb-t/de-Brandenburg4
-rw-r--r--util/scan/dvb-t/de-Bremen4
-rw-r--r--util/scan/dvb-t/de-Hamburg10
-rw-r--r--util/scan/dvb-t/de-Hessen12
-rw-r--r--util/scan/dvb-t/de-Mecklenburg-Vorpommern10
-rw-r--r--util/scan/dvb-t/de-Niedersachsen23
-rw-r--r--util/scan/dvb-t/de-Nordrhein-Westfalen10
-rw-r--r--util/scan/dvb-t/de-Rheinland-Pfalz4
-rw-r--r--util/scan/dvb-t/de-Saarland4
-rw-r--r--util/scan/dvb-t/de-Sachsen5
-rw-r--r--util/scan/dvb-t/de-Sachsen-Anhalt7
-rw-r--r--util/scan/dvb-t/de-Schleswig-Holstein14
-rw-r--r--util/scan/dvb-t/de-Thueringen4
-rw-r--r--util/scan/dvb-t/es-Albacete16
-rw-r--r--util/scan/dvb-t/es-Alfabia1
-rw-r--r--util/scan/dvb-t/es-BaixoMinho16
-rw-r--r--util/scan/dvb-t/es-Collserola16
-rw-r--r--util/scan/dvb-t/es-Granada8
-rw-r--r--util/scan/dvb-t/es-Huesca8
-rw-r--r--util/scan/dvb-t/es-Muros-Noia9
-rw-r--r--util/scan/dvb-t/es-Pamplona9
-rw-r--r--util/scan/dvb-t/es-Santiago_de_Compostela9
-rw-r--r--util/scan/dvb-t/es-Vitoria-Gasteiz8
-rw-r--r--util/scan/dvb-t/fi-Smedsbole13
-rw-r--r--util/scan/dvb-t/fr-Laval12
-rw-r--r--util/scan/dvb-t/fr-Rochefort-sur-mer14
-rw-r--r--util/scan/dvb-t/hr-All24
-rw-r--r--util/scan/dvb-t/hr-Zagreb3
-rw-r--r--util/scan/dvb-t/hu-Budapest8
-rw-r--r--util/scan/dvb-t/hu-Debrecen8
-rw-r--r--util/scan/dvb-t/hu-Gyor8
-rw-r--r--util/scan/dvb-t/hu-Kabhegy8
-rw-r--r--util/scan/dvb-t/hu-Kekes8
-rw-r--r--util/scan/dvb-t/hu-Kiskoros8
-rw-r--r--util/scan/dvb-t/hu-Nagykanizsa-Ujudvar8
-rw-r--r--util/scan/dvb-t/hu-Pecs8
-rw-r--r--util/scan/dvb-t/hu-Szeged8
-rw-r--r--util/scan/dvb-t/hu-Szentes8
-rw-r--r--util/scan/dvb-t/hu-Tokaj8
-rw-r--r--util/scan/dvb-t/hu-Uzd8
-rw-r--r--util/scan/dvb-t/hu-Vasvar-Hegyhatsal8
-rw-r--r--util/scan/dvb-t/it-Montevergine18
-rw-r--r--util/scan/dvb-t/lt-All39
-rw-r--r--util/scan/dvb-t/ro-Bucharest5
-rw-r--r--util/scan/dvb-t/se-Ornskoldsvik_As1
-rw-r--r--util/scan/dvb-t/se-Skelleftea1
-rw-r--r--util/scan/dvb-t/sk-BanskaBystrica3
-rw-r--r--util/scan/dvb-t/sk-Bardejov5
-rw-r--r--util/scan/dvb-t/sk-Bratislava3
-rw-r--r--util/scan/dvb-t/sk-Kosice3
-rw-r--r--util/scan/dvb-t/sk-Michalovce5
-rw-r--r--util/scan/dvb-t/sk-Namestovo5
-rw-r--r--util/scan/dvb-t/sk-Poprad5
-rw-r--r--util/scan/dvb-t/sk-RimavskaSobota5
-rw-r--r--util/scan/dvb-t/sk-Trencin5
-rw-r--r--util/scan/dvb-t/sk-VelkyKrtis5
-rw-r--r--util/scan/dvb-t/sk-Zilina5
-rw-r--r--util/scan/dvb-t/uk-Redruth13
-rw-r--r--util/scan/dvb-t/uk-StocklandHill15
-rw-r--r--util/scan/dvb-t/uk-Storeton15
-rw-r--r--util/scan/dvb-t/uk-WinterHill18
-rw-r--r--util/scan/dvb-t/vn-Hanoi5
-rw-r--r--util/scan/dvb-t/vn-Thaibinh5
-rw-r--r--util/scan/scan.c11
-rw-r--r--util/szap/Makefile2
-rw-r--r--util/szap/azap.c27
-rw-r--r--util/szap/czap.c91
-rw-r--r--util/szap/szap.c97
-rw-r--r--util/szap/tzap.c73
-rw-r--r--util/szap/util.c126
-rw-r--r--util/szap/util.h24
211 files changed, 35938 insertions, 637 deletions
diff --git a/.hg_archival.txt b/.hg_archival.txt
index 64b0306..51d57ab 100644
--- a/.hg_archival.txt
+++ b/.hg_archival.txt
@@ -1,2 +1,2 @@
repo: d9fe7e17226f8e321aa80a015fc8d53f33b265d7
-node: 2d700fe04e4386a32e37f3a1291cacafd375aa60
+node: 7de0663facd92bbb9049aeeda3dcba9601228f30
diff --git a/Make.rules b/Make.rules
index e867c3a..3410d7b 100644
--- a/Make.rules
+++ b/Make.rules
@@ -35,7 +35,7 @@ libdir ?= $(prefix)/lib
sharedir ?= $(prefix)/share
ifneq ($(DESTDIR),)
-DESTDIR = $(DESTDIR)/
+DESTDIR := $(DESTDIR)/
endif
ifeq ($(V),1)
diff --git a/README b/README
index ad29647..0870a66 100644
--- a/README
+++ b/README
@@ -15,6 +15,8 @@ util/dvbnet - Control digital data network interfaces.
util/dvbtraffic - Monitor traffic on a digital device.
util/femon - Monitor the tuning on a digital TV device.
util/zap - *Just* tunes a digital device - really intended for developers.
+util/gotox - Simple Rotor control utility
+util/alevt - Teletext capture and display utility
Hardware Specific Utilities:
util/av7110_loadkeys - Load remote keys into an av7110 based card
@@ -36,5 +38,10 @@ For convenience, dvb-apps contains a copy of the DVB API include
files as they are contained in the linuxtv-dvb-1.? release
and the 2.6.x Linux kernel.
+AleVT is not compiled by the main Makefile, because it depends on external
+libraries which might not be available in your system (see util/alevt/README for
+details). If you have the required libraries, to compile AleVT go to util/alevt/
+and type "make".
+
Johannes Stezenbach <js@convergence.de>
Andrew de Quincey <adq_dvb@lidskialf.net>
diff --git a/debian/changelog b/debian/changelog
index 6441311..fee0277 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+linuxtv-dvb-apps (1.1.1+rev1355-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- Mark Purcell <msp@debian.org> Thu, 25 Feb 2010 21:13:46 +1100
+
linuxtv-dvb-apps (1.1.1+rev1273-1) unstable; urgency=low
* New upstream release
diff --git a/lib/libdvbsec/dvbsec_api.c b/lib/libdvbsec/dvbsec_api.c
index 5f2ae22..62d225e 100644
--- a/lib/libdvbsec/dvbsec_api.c
+++ b/lib/libdvbsec/dvbsec_api.c
@@ -537,19 +537,12 @@ int dvbsec_diseqc_goto_rotator_bearing(struct dvbfe_handle *fe,
}
// generate the command
- if (integer < -256) {
- return -EINVAL;
- } else if (integer < 0) {
- integer = -integer;
- data[3] = 0xf0;
- } else if (integer < 256) {
- data[3] = 0x00;
- } else if (integer < 512) {
- integer -= 256;
- data[3] = 0x10;
- } else {
- return -EINVAL;
+ if (integer < 0.0) {
+ data[3] = 0xD0; // West is a negative angle value
+ } else if (integer >= 0.0) {
+ data[3] = 0xE0; // East is a positive angle value
}
+ integer = abs(integer);
data[3] |= ((integer / 16) & 0x0f);
integer = integer % 16;
data[4] |= ((integer & 0x0f) << 4) | fraction;
diff --git a/util/Makefile b/util/Makefile
index c7a83db..db9e63d 100644
--- a/util/Makefile
+++ b/util/Makefile
@@ -3,6 +3,7 @@
.PHONY: all clean install
all clean install:
+ $(MAKE) -C atsc_epg $@
$(MAKE) -C av7110_loadkeys $@
$(MAKE) -C dib3000-watch $@
$(MAKE) -C dst-utils $@
@@ -15,4 +16,5 @@ all clean install:
$(MAKE) -C szap $@
$(MAKE) -C ttusb_dec_reset $@
$(MAKE) -C gnutv $@
+ $(MAKE) -C gotox $@
$(MAKE) -C zap $@
diff --git a/util/alevt/COPYRIGHT b/util/alevt/COPYRIGHT
new file mode 100644
index 0000000..17930ea
--- /dev/null
+++ b/util/alevt/COPYRIGHT
@@ -0,0 +1,297 @@
+This message applies to all files within the archive:
+
+ Copyright (C) 1998,1999,2000 Edgar Toernig (froese@gmx.de)
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License Version 2 as
+ published by the Free Software Foundation.
+
+ 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.
+
+
+And here's the GNU GPL V2:
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/util/alevt/ChangeLog b/util/alevt/ChangeLog
new file mode 100644
index 0000000..896ddc3
--- /dev/null
+++ b/util/alevt/ChangeLog
@@ -0,0 +1,535 @@
+Thu Feb 11 22:05:00 MET 2010 (1.7.0)
+
+ - redesigned version:
+ - outfile, new starting methods, libzvbi implementation
+ - lots of bug fixes, all patches available in the Internet applied
+ - extensive code cleanup
+
+Mon Dec 3 03:11:07 MET 2007 (1.6.2)
+
+ - compilation fixes for newer gcc
+ - makefile tweaks (man vs share/man, /usr/X11R6 vs /usr, etc)
+ - default device changed to /dev/vbi0
+ - adapt to current v4l2 api
+ - some minor fixes collected during the past years
+
+ This is a build-time update to conform to newer compilers and
+ system environments. If you have a running AleVT there's no
+ reason to update. The only real fix is in the html-exporter
+ which was producing broken html (missing double-quotes).
+
+Thu Jan 23 01:53:10 MET 2003
+
+ - Fixed a bug in contrib/cap-all.c (fdset_init before vbi_open)
+ - Expaned cap-all.c to show how to save in two formats simultaneously.
+
+Tue Aug 20 05:22:16 MEST 2002 (1.6.1)
+
+ - Removed the bttv-warning from the help pages ;-)
+
+Mon Jul 23 18:34:32 MEST 2001
+
+ - Fixed bug in ui.c - found by <pawel@sakowski.eu.org>.
+ - When clicking on page numbers accept sub-page numbers too.
+
+Sat Dec 23 15:12:11 MET 2000
+
+ - Fixed 'double height last line' bug in export.c reported by
+ <Matthias.Kleinmann@urz.uni-heidelberg.de>
+
+Thu Oct 12 02:19:31 MEST 2000
+
+ - The &nbsp; fix was wrong. Removed it.
+
+Wed Oct 11 19:41:38 MEST 2000 (1.6.0)
+
+ - Some documentation tweaks.
+ - Release. Made it 1.6 because of V4l2 API.
+
+Thu Sep 21 21:07:12 MEST 2000
+
+ - Removed old bttv-only decoder. Only the v4l2-based stays.
+ If the device does not support v4l2, default parameters
+ appropriate for the bttv-driver are taken.
+ - Subpage cycling (up/down and 2nd wheel) stays in the current
+ page.
+
+Sat Sep 16 23:52:12 MEST 2000
+
+ - Experimental v4l2 interface added.
+ - Finetune defaults to 1 now. Works best for me. Tell me
+ if you don't like it.
+ - Russian patch still not added :-/
+ - Fixed the bug in xio.c that Ben Smithurst
+ <ben@scientia.demon.co.uk> found.
+ - Added the dual-wheel-mouse patch from Holger Fitzner.
+
+Tue May 30 03:09:24 MEST 2000
+
+ - As Matto Fransen <matto@matto.nl> reported: the ; after &nbsp
+ in exp-html is missing. fixed that.
+
+Tue May 9 20:21:52 MEST 2000
+
+ - Removed the -oldbttv/-newbttv options. If your driver has
+ a buffer size different from that in the current bttv you
+ either have to support the VBISIZE ioctl or change the source.
+ (Tried to implement an autodetect by non-blocking reads but
+ that confuses the driver that much that it no longers gives
+ reasonable data.)
+ - Added a compression option to the png export filter and
+ changed the default compression level to the lib's default.
+ The prev default of 9 was way to slow.
+
+Wed May 3 19:18:55 MEST 2000
+
+ - Added a smaller font. Made out of the neep9 font from
+ the really great jmk-fonts (http://www.pobox.com/~jmknoble).
+
+Sat Apr 29 02:36:41 MEST 2000
+
+ - Fixed SEGV in export.c:adjust.
+ - Fixed a possible buffer overrun in exp-txt.c
+
+Thu Nov 4 21:18:52 MET 1999 (1.5.1)
+
+ - Added os.h. That way alevt compiles right out of the
+ box on all BSD systems (I hope *g*).
+ - Fixed the DST bug in alevt-date.
+ - Put vtwiz.pl in contrib, a perl/tk/set-tv script to
+ launch alevt written by Joern Borgert.
+
+Tue Oct 26 23:55:09 MEST 1999 (1.5.1-pre1)
+
+ - Added timeout option to alevt-cap.
+ - Use install instead of cp in the Makefile.
+ - Added -I/usr/local/include and -L/usr/local/lib
+ in the Makefile.
+ - Changed #ifdef FREEBSD to #ifdef BSD.
+ - exchanged contrib/paul-export.patch with
+ paul.fmt_page.c (a replacement for export.c:fmt_page())
+ and paul.fmt_page.patch (the same in form of a
+ patch file).
+ - Some doc corrections.
+
+Thu Oct 14 02:49:48 MEST 1999
+
+ - Added FREEBSD patches.
+
+Fri Oct 8 23:36:45 MEST 1999 (1.5.0)
+
+ - Updated the documentation.
+
+ So, what's new since 1.4.9 (nearly 4 months ago)?
+ Two major things: full latin-2 support and export
+ filters for alevt-cap and alevt itself.
+
+ For the latin-2 support page enhancement packets
+ have to be decoded and some latin-1 pages may
+ benefit from that, too. Note: if you select
+ latin-2 everything is latin-2, even cut'n paste.
+ (new cmdline option -charset latin-1|2)
+
+ The export filters allow saving pages in different
+ formats. At the moment there's ascii (with and with-
+ out color), html, png, and ppm. The png filter
+ requires libpng. If you don't have it (or don't want
+ png support) just remove the WITH_PNG from the
+ Makefile. To save the currently displayed page just
+ press 's'. See alevt-cap(1) for the format string.
+
+ Preview: 1.5.1 will have the FreeBSD patches and
+ any bug fixes. (But not more *g*).
+
+Fri Oct 8 02:06:35 MEST 1999 (1.5.0-pre4)
+
+ Finally I could get away from my Playstation and
+ work a little bit on alevt *g*
+
+ - Tried to change alevt-date with freebsd patches from
+ Thomas Runge <runge@rostock.zgdv.de>. They do not
+ have the timezone and daylight variables. But I do
+ not have tm_gmtoff. So it's commented out for the
+ moment.
+ - Made font.[ch] so that only one copy of the fonts is
+ in the executable when including export modules
+ (exp-gfx.c uses them). Had to tweak the makefile.
+ - Added 's' for saving pages to files. Prompts for
+ a format string and a filename and saves the
+ currently displayed page.
+ (Formerly, 's' and 'S' were aliases for '/' and '?'
+ (searching))
+ - Found a bug in export.c regarding double height lines.
+ - Added a patch to the contrib dir to pass the URL you
+ click on to netscape.
+
+ The documentation updates are still missing. That's
+ the last thing to do for 1.5.0. But that's so boring...
+
+Fri Aug 20 21:28:18 MEST 1999
+
+ Back from holidays and time for alevt...
+
+ - Added html, png, and ppm export modules from Paul.
+ - Fixed the return status for export_output.
+ - Tweaked the makefile for libpng support.
+ - Added the export howto to the contrib dir.
+ - Added Paul's fmt_page routine to contrib as a patch
+ to export.c
+ - Added "-format help" to list all output formats and
+ its options.
+
+ Still to do: update man page of alevt-cap, add export
+ to alevt, add erc to alevt-cap.
+
+ Oh, btw, alevt is running on FreeBSD with the bt848
+ driver from Roger Hardiman <roger@cs.strath.ac.uk> *g*.
+ I wonder if it's possible to port his driver to linux.
+ Maybe it runs better then bttv... (I still get reports
+ with stuck xawtvs ...)
+
+Mon Jul 19 01:15:50 MEST 1999 (1.5.0-pre3)
+
+ - Added export modules. It's gotten much to complex.
+
+ A lot of things still to do: add other formats [Paul?],
+ add documentation, add format-help, add export to alevt,
+ add erc to alevt-cap, ...
+
+Mon Jul 12 00:09:03 MEST 1999
+
+ - Added an incomplete 20x24 font to the contrib dir.
+
+Tue Jun 29 00:46:03 MEST 1999 (1.5.0-pre2)
+
+ - Added lanugage tables from Radoslaw.
+ - Added new latin-2 font from Radoslaw.
+ - Fixed a bug with hold graphics. There's still one bug
+ on CNN's page 100 (has to do with set-after behaviour of
+ color select in hold graphics mode). The last line of the
+ earth should be blue-blue-green not blue-green-green.
+ AleVT always uses set-at behaviour. Afaik, this combination
+ (hold + set-after) is the only way to see the difference
+ between set-at and set-after. Set-after will blow up the
+ code so I will leave it as it is.
+ - vbi now collects all pkt26 and enhances the page before
+ it is passed on. Seem's to work.
+
+Tue Jun 22 22:13:45 MEST 1999 (1.5.0-pre1)
+
+ - Fixed hamm24. And, it should be fast now *g*
+ - Moved the language conversion parts to lang.c
+ - Added additional lang_chars for use with the latin-2 charset.
+ - Added -charset latin-1/2 option.
+ - Added pkt x/26 decoding. ... and noticed, that these packets
+ are sent between line 0 and 1. FUCK. Now I have to save
+ all x/26 until the page is complete. But not today... :-(
+
+ Things are getting more and more uglier. The right thing
+ to do would be to make a big font with all possible chars
+ (including cyrillic, arabic, smoothed graphics, ...).
+ That would mean to make each char in vtp->data 16 bit.
+ And then add an attribute word for each char so that the
+ enhanced attributes work, too. Searching and cut & paste
+ would be more complicated... but the worst, the pages
+ will be much bigger (4 times larger). Really bad for
+ the cache and god knows for what else...
+ Is it worth all the trouble??? I don't need that!
+
+Tue Jun 15 01:25:40 MEST 1999
+
+ - Changed .specs file again. I previously changed alevt.spec
+ instead of alevt.spec.in :-(
+
+Mon Jun 14 23:45:48 MEST 1999 (1.4.9)
+
+ - Made a very simple capture program (alevt-cap). Just collects
+ the given pages and writes them to disk in ASCII.
+ I will only accept bug reports/fixes, no enhancement requests
+ at the moment *g*
+ (I can't believe it; I even wrote a man page...)
+ - Changed the subpage delimiter on the command line from '/' to '.'
+ The old one ('/') is still accepted. (Reason: alevt-cap uses
+ the page number as part of the filename and a / is inconvenient.
+ And I already wanted to let you enter subpages with the keypad
+ and the '.' would be a nice key for that.)
+ - Tweaked the .specs file... (Btw, alevt-date and alevt-cap should
+ not be installed in the X11 tree.)
+
+Thu Jun 10 22:13:40 MEST 1999
+
+ - moved the hamming decoding and associated table to hamm.c
+ - played with pkt26 to support polish stations. not finished.
+
+Tue Jun 8 21:00:42 MEST 1999
+
+ - Added -[no]bell option. And the 'b' key.
+ - Replaced all xio_bell calls with appropriate status messages.
+
+Sat Jun 5 00:42:19 MEST 1999 (1.4.8)
+
+ - Shit. Just after the release I found a bug. The header line
+ isn't updated as it should :-( (Just affects parallel mode
+ transmission, so no new version, yet.)
+ - Created mailing list. Either go to http://alevt.listbot.com/
+ or write mail to alevt-subscribe@listbot.com.
+ - Added bttv-patch to the contrib dir for those who don't want
+ to wait for bttv-0.6.5.
+
+Fri Jun 4 17:19:41 MEST 1999 (1.4.7)
+
+ - Added autodetection of VBIBUF_SIZE (only with newer bttv, 0.6.5).
+ - Forgot to close vbi_fd in vbi_close :-/
+ - Made ERC on by default. If the page has no errors it
+ costs nothing and if it has you'll turn it on anyway.
+ - Changed parameters of EV_HEADER.
+ - Removed XAWTV_HACKS.
+ - Updated some docu.
+ - Modified the contrib samples to reflect previous API changes.
+
+Fri May 28 20:16:44 MEST 1999
+
+ - Added status messages.
+ - Added EV_TIMER event.
+ - Added channel change detection (only with newer bttv, 0.6.5).
+ Sends EV_RESET event. The XAWTV_HACKS can be removed *phww*.
+ Now the cache is automatically cleared if you switch to a
+ new channel. It even works with a SAT receiver connected to
+ Video-In.
+
+Thu May 27 23:54:32 MEST 1999 (1.4.6 unofficial)
+
+ - Cache reset didn't reset npages and hi_subno.
+ - Added XAWTV_HACKS, that is: alevt scans for a window with
+ the _XAWTV_STATION property and registers for property changes.
+ Result: when switching channels in xawtv, the cache is cleared.
+ (This is just an ugly hack. Xawtv must already be running
+ when alevt is started. If you quit and restart xawtv, it no
+ longer works. There's no method to detect if the monitored
+ xawtv is really the one controlling our /dev/vbi, etc...)
+ Added on request of Paul Ortyl <ortylp@key.net.pl>.
+ - Added error reduction circuit. It's part of the cache.
+ Errors in a new page are replaced by characters/lines from
+ an already cached (older) page. May be toggled by pressing
+ 'e' (editor is now on 'E'). It's not enabled by default
+ because it takes some CPU time. Idea by Paul Ortyl.
+ - TODO: clean up. document new features. add status messages.
+
+Sun May 23 19:13:07 MEST 1999 (1.4.5)
+
+ - New spec file from Karsten Hopp <karsten.hopp@delix.de>
+ - Changed it even further *g*
+ - Fixed a bug with graphics selection of double height lines.
+ - Documented the -oldbttv option in the man page. Now it's in
+ every page. This should finally halve the mails I get.
+ (For the other halve I have to write alevt-capture *g*)
+
+Sat May 8 02:41:21 MEST 1999
+
+ - Ehhh, changed u32 typedef from unsigned long to unsigned int.
+ Same for s32. The Alpha's longs are 64 bits.
+ Thanks to Sdruddin Rejeb <rejeb@dpmail.epfl.ch>.
+ (There's something strange with this in the X libs. They are
+ sometimes very lazy about ints and longs. Someone with an
+ Alpha should check the cut & paste, both, text and graphics
+ selections.)
+
+Thu Apr 29 22:38:37 MEST 1999
+
+ - Updated contrib/t1.c
+ - Added ':' as a subpage delimiter for clicking (2:7 is the same as 2/7)
+
+Mon Apr 19 19:40:09 MEST 1999
+
+ - Switched the scrolling direction of the wheel
+
+Mon Mar 29 01:23:06 MEST 1999 (1.4.4)
+
+ - fixed DST bug in alevt-date
+ - added crude latin-2 support. 'make FONT=latin-2' should be enough.
+ (found the stuff on the website http://www.penguin.cz/~marvin/ of
+ Daniel Smolik <smolikdan@email.cz>. I don't know if he is the one
+ who made the font).
+
+Wed Mar 17 20:53:59 MET 1999
+
+ - added timeout to alevt-date
+
+Fri Feb 19 18:22:53 MET 1999 (1.4.3>
+
+ - Makefile changes.
+
+Fri Jan 29 18:01:27 MET 1999
+
+ - fixed bug in dllist.h. dl_insert_first(h, dl_remove(n)) was only
+ working due to gcc implementation details.
+
+Mon Jan 25 18:33:42 MET 1999 (1.4.2)
+
+ - fixed 'clear cache'. no longer removes the help pages.
+ - made next/prev key/button to skip missing pages.
+ - added support for wheeled mice. (I heard it's really cool *g*)
+ - problem with subpages > 0xff fixed.
+
+Thu Jan 21 17:31:46 MET 1999 (1.4.1)
+
+ - added man pages from Thomas Schoepf <schoepf@usa.net>.
+ - added rpm-spec file from Mario Mikocevic <mozgy@times.hr>.
+ (looks a little bit odd, but I don't know very much about rpms)
+ - minor option fix in alevt-date (people are really using it!?!)
+
+Tue Jan 5 03:50:08 MET 1999 (1.4.0)
+
+ - should be 1.3.10 but that gives problems with the help pages :-(
+ - fixed varargs for alpha
+ - default is now -newbttv (aka -fuckbttv). use -oldbttv for v<0.5.20.
+
+Sat Jan 2 21:40:54 MET 1999
+
+ - small patches to alevt-date (-vbi options and tzset fix)
+ - played with pkt8/30. what a mess. MTV is 25:13 ahead *g*
+
+Wed Dec 30 19:30:14 MET 1998 (1.3.9)
+
+ - slightly modified the pll (may need further tuning)
+
+Wed Dec 30 05:27:26 MET 1998 (1.3.8)
+
+ - added pll (-finetune auto). try -debug for status msgs.
+
+Tue Dec 29 05:15:53 MET 1998 (1.3.7)
+
+ - added finetune option (see README)
+ - you may now type -newbttv instead of -fuckbttv *g*
+
+Mon Dec 28 19:36:32 MET 1998 (1.3.6)
+
+ - Makefile: R5 -> R6 :-(
+ - vbi.c now works without cache.c
+ - added alevt-date (set system time from teletext)
+ - bug in option parsing (error reporting)
+
+Thu Dec 17 19:56:16 MET 1998 (1.3.5)
+
+ - added -L/usr/X11R6/lib in Makefile
+ - put some blurb (in german) in contrib.
+
+Thu Dec 17 05:01:34 MET 1998 (1.3.4)
+
+ - added class hints on (invisible) leader window to make docking
+ in wmaker easier. instant name for leader is "VTLeader" and for
+ the viewing windows "VTPage"
+ - made the icon a little bit smaller
+
+Mon Dec 14 23:05:41 MET 1998 (1.3.3)
+
+ Release 1.3.3
+
+ - added spanish/portuguese charset decoding
+ - added similar looking glyphs for czech
+ - minor changes on the font
+ - middle click on current page number opens new parent window
+ - case dependant search if the pattern begins with a '!'
+ - line editing may be aborted with ^C
+
+Sun Dec 13 17:55:32 MET 1998 (1.3.2)
+
+ - when there were multiple windows of the same page, cycling through
+ the subpages changed all windows. fixed.
+ - hilight the found text (make it the selection).
+ - slightly modified the hilight colors.
+ - default window size set to 41x25 (looks better).
+ - rewrote the editor.
+
+Sun Dec 13 07:03:10 MET 1998 (1.3.1)
+
+ - fixed one command line option
+ - corrected bug in searching
+
+Sat Dec 12 20:27:03 MET 1998 (1.3.0)
+
+ Release 1.3.0
+
+ - searching is now ready (still need a status line for error msgs).
+ - set SIGPIPE to SIG_DFL. some shells (KDE) set it to SIG_IGN and then
+ the timer task won't be killed on exit.
+ - updated the help pages.
+ - I'm frustrated! BTTV_VERSION doesn't work on /dev/vbi. So no
+ autodetection of driver version. Added -fuckbttv option instead.
+
+Fri Dec 11 19:36:03 MET 1998 (1.2.5)
+
+ - reworked national charset (lang) handling. everthing now done in vbi.c.
+ the rest just deals with latin-1.
+ - first version of searching (functional, but dirty. needs more work.)
+
+Thu Dec 10 20:06:27 MET 1998 (1.2.4)
+
+ - new file edline.c (line editor for the menu line. start for searching...)
+ - blinking cursor
+ - added an 48x48 icon from Ulf Rompe
+ - added pasting into the line editor (insert key).
+ - release ownership of XA_PRIMARY when deselecting selection.
+
+Tue Dec 8 21:26:26 MET 1998 (1.2.3)
+
+ - new file ui.c (most user interface stuff from main.c)
+ - rewrote option parsing
+ - allow specification of child windows on command line. now
+ it's possible to regenerate the complete window layout by
+ the commandline (may be of some use for session management).
+ - some spelling fixes in the help pages from Mark Bryars
+
+Mon Dec 7 16:59:28 MET 1998 (1.2.2)
+
+ - reworked hidden handling in xio.c
+
+Sun Dec 6 19:54:10 MET 1998 (1.2.1)
+
+ - class name changed! from Alevt to AleVT.
+ - window/icon title shows current page number
+ - changed the icon to a 64 pixel width one. not nice but ...
+ - added a small mini icon for the title bar. is there a property I can set?
+ - pressing on the CPN puts the page on hold
+ - pressing on the violet * reveals concealed text
+ - added simple menu if no FastText menu is present
+ - allow subpages to be specified on the command line (eg 100/4)
+
+Sat Dec 5 20:59:51 MET 1998 (1.2.0)
+
+ Release 1.2.0
+
+ - finished the help pages.
+ - added command line handling
+ - added user geometry handling in xio.c
+
+Sat Dec 5 02:28:16 MET 1998 (1.1.2)
+
+ - allow magazin 9 (help system)
+ - start box char after a pagenumber selects subpage 1 (hack)
+ - added a crude page editor (just to create the help pages. not for users.)
+ - started with the online help system (sounds great, hehe)
+
+Tue Dec 1 20:19:53 MET 1998 (1.1.1)
+
+ - added concept of parent and child windows. now, the middle mouse
+ button changes the contens of the child window. if there isn't
+ one, it is created.
+ - Middle mouse button on x/y (subpage cycling) selects the previous
+ subpage. (updating the child with subpages is hairy...)
+
+Sun Nov 29 23:34:18 MET 1998 (1.1.0)
+
+ Release 1.1.0
+
+ - removed most of the recovery for single bad lines (does too much harm)
+ - changed handling of parallel mode transmission (untested. unused in .de)
+ - added selection (text & graphic!). try pasting into xpaint :-)
+ - added cache-clear function ('c')
+ - click on x/y selects the next subpage
+ - some minor tweaks
+ - added an icon bitmap.
+
+Wed Nov 24 23:33:34 MET 1998 (1.0.0)
+
+ First Release 1.0.0
diff --git a/util/alevt/EXPORT.HOWTO b/util/alevt/EXPORT.HOWTO
new file mode 100644
index 0000000..b9fba67
--- /dev/null
+++ b/util/alevt/EXPORT.HOWTO
@@ -0,0 +1,84 @@
+HOW TO IMPLEMENT A NEW EXPORT MODULE:
+
+As an example look at exp-txt.c (it implements two modules which
+are pretty similar).
+
+You have to create one exported structure (struct export_module).
+This structure holds the following data:
+
+1. The name of the format (example: "ascii").
+
+2. The default extension to use for building filenames ("txt").
+
+3. A list of module options. It's a 0 terminated array of char
+pointers, one for each option (similar to argv of main).
+If an option string contains a '=', it is an option that
+requires an argument. The part after the '=' is ignored at
+the moment. Later, I want to add help messages that show
+these options strings and then the part after the '=' becomes
+useful.
+If you do not have local options, set this field to 0.
+
+4. The number of bytes for local data in the export structure.
+There you may store data collected during option parsing or
+for whatever you want.
+Don't use global variables for storing this data! With
+alevt-cap you may give:
+
+alevt-cap -format ascii,color 100 -format ascii 100
+
+to save the page in two different formats. Using global
+vars would inhibit this. The data area in struct export
+starts at the 'data' field. You have to cast it to the
+appropriate type (see the D macro in exp-txt.c).
+If you do not need local data, set this field to 0.
+
+5. An open function (or call it constructor). It is called
+when your module is needed and it is passed a struct export
+(the instance). This function may be used to initialize
+the local data in the export struct.
+If all goes well return 0. Else call export_error (see
+below) and return -1.
+If you do not need an open function, set this field to 0.
+
+6. A close function (or call it destructor). It is called
+when your module is no longer needed. If you allocated
+memory in the open func, this is the place to free it.
+If you do not need a close function, set it to 0.
+
+7. An option function. It is called for each module option
+the user has given. It is passed an option number (first
+option in the option-array gives 1, ...) and a char pointer
+to the argument for that option (0 if the option does not
+need an arg). The argument pointer keeps valid until the
+close function is called.
+If all goes well, return 0. Else call export_error and
+return -1.
+If you gave an option list at point 3 you have to specify
+this function. Else set it to 0.
+
+8. An output function. It is called to produce the output.
+It is given the file name to use and a fmt_page pointer.
+The fmt_page contains an interpreted image of the page.
+There are no control chars in it. It uses the character
+set defined by the two fonts.
+These function may be called consecutive for multiple
+pages. Don't expect one output for one open/close.
+Return codes as above... (0: ok, -1: error).
+
+The export_error function: If one of your functions wants to
+report an error, it has to use the export_error function.
+It's a printf like function to set error messages. In alevt-cap
+these messages are printed to stderr, in alevt they will be
+shown in the status line (so don't make them too long).
+
+The last step is to add your export_module structure to the
+list of modules in export.c (at the top).
+Please, make sure that this structure is the only exported
+symbol. All other things should be static.
+
+That's all. A structure describing your module and 4 functions
+(open, close, option, output) to implement it. Shouldn't be too
+complicated.
+
+Ciao, ET.
diff --git a/util/alevt/Makefile b/util/alevt/Makefile
new file mode 100644
index 0000000..2f7c8da
--- /dev/null
+++ b/util/alevt/Makefile
@@ -0,0 +1,130 @@
+VER=1.7.0
+OPT=-O -g -w
+DEFS=-DWITH_PNG
+DEFS+=-DUSE_LIBZVBI
+FONT=vtxt
+MAN_DIR=man
+DESTDIR=
+PREFIX=/usr
+HOSTCC=$(CC)
+CFLAGS=$(OPT) -DVERSION=\"$(VER)\" $(DEFS) -I$(USR_X11R6)/include
+EXPOBJS=export.o exp-txt.o exp-html.o exp-gfx.o font.o
+OBJS=main.o ui.o xio.o fdset.o vbi.o cache.o help.o search.o misc.o hamm.o lang.o $(EXPOBJS)
+TOBJS=alevt-date.o vbi.o fdset.o misc.o hamm.o lang.o
+COBJS=alevt-cap.o vbi.o fdset.o misc.o hamm.o lang.o $(EXPOBJS)
+
+ifneq ($(findstring WITH_PNG,$(DEFS)),)
+EXPLIBS=-lpng -lz -lm
+endif
+
+ifneq ($(findstring USE_LIBZVBI,$(DEFS)),)
+ZVBILIB=-lzvbi -lpthread
+EXPLIBS+=$(ZVBILIB)
+endif
+
+all: alevt alevt-date alevt-cap alevt.1 alevt-date.1 alevt-cap.1
+
+alevt: $(OBJS)
+ $(CC) $(OPT) $(OBJS) -o alevt -L$(PREFIX)/lib -L$(PREFIX)/lib64 -lX11 $(EXPLIBS)
+
+alevt-date: $(TOBJS)
+ $(CC) $(OPT) $(TOBJS) -o alevt-date $(ZVBILIB)
+
+alevt-cap: $(COBJS)
+ $(CC) $(OPT) $(COBJS) -o alevt-cap $(EXPLIBS)
+
+font.o: font1.xbm font2.xbm font3.xbm font4.xbm
+fontsize.h: font1.xbm font2.xbm font3.xbm font4.xbm
+ fgrep -h "#define" font1.xbm font2.xbm font3.xbm font4.xbm >fontsize.h
+
+font1.xbm: bdf2xbm $(FONT)-latin-1.bdf
+ ./bdf2xbm font1 <$(FONT)-latin-1.bdf >font1.xbm
+
+font2.xbm: bdf2xbm $(FONT)-latin-2.bdf
+ ./bdf2xbm font2 <$(FONT)-latin-2.bdf >font2.xbm
+
+font3.xbm: bdf2xbm vtxt-koi8.bdf
+ ./bdf2xbm font3 <vtxt-koi8.bdf >font3.xbm
+
+font4.xbm: bdf2xbm vtxt-iso8859-7.bdf
+ ./bdf2xbm font4 <vtxt-iso8859-7.bdf >font4.xbm
+
+bdf2xbm: bdf2xbm.c
+ $(HOSTCC) bdf2xbm.c -o bdf2xbm
+
+clean:
+ rm -f *.o page*.txt a.out core bdf2xbm font?.xbm fontsize.h
+ rm -f alevt alevt-date alevt-cap
+
+rpm-install: all
+ install -m 0755 alevt ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0755 alevt-date ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0755 alevt-cap ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0644 alevt.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -m 0644 alevt-date.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -m 0644 alevt-cap.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -d 0755 $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
+ install -m 0644 alevt.png $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
+
+install: all
+ install -m 0755 alevt $(DESTDIR)$(PREFIX)/bin
+ install -m 0755 alevt-date $(DESTDIR)$(PREFIX)/bin
+ install -m 0755 alevt-cap $(DESTDIR)$(PREFIX)/bin
+ install -m 0644 alevt.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt-date.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt-cap.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt.png $(DESTDIR)$(PREFIX)/share/pixmaps
+ install -m 0644 alevt.desktop $(DESTDIR)$(PREFIX)/share/applications
+
+uninstall: clean
+ rm -f /usr/bin/alevt /usr/bin/alevt-cap /usr/bin/alevt-date \
+ /usr/share/pixmaps/alevt.png /usr/share/applications/alevt.desktop \
+ /usr/share/man/man1/alevt.1 /usr/share/man/man1/alevt-cap.1 \
+ /usr/share/man/man1/alevt-date.1
+
+depend:
+ makedepend -Y -- $(CFLAGS_none) -- *.c 2>/dev/null
+
+tar-html: alevt.1 alevt-date.1 alevt-cap.1
+ for i in alevt.1 alevt-date.1 alevt-cap.1 ; do \
+ j=`basename $$i .1` ; \
+ j=`basename $$j .1x` ; \
+ nroff -man $$i | { \
+ echo "<HTML><HEAD><TITLE>AleVT</TITLE></HEAD><BODY>" ; \
+ man2html -bare -uelem U -nodepage ; \
+ echo "</B0DY></HTML>" ; \
+ } | sed -e "s,</B> <B>, ,g" -e "s,</U> <U>, ,g" >~/exit/alevt/$$j.html ;\
+ done
+
+tar: tar-html clean
+ sed s/VERSION/$(VER)/g <alevt.lsm.in >~/exit/alevt/alevt-$(VER).lsm
+ sed s/VERSION/$(VER)/g <alevt.spec.in >alevt.spec
+ cd .. ;\
+ ln -s alevt alevt-$(VER) ;\
+ tar vcfz ~/exit/alevt/alevt-$(VER).tar.gz alevt-$(VER)/* ;\
+ rm alevt-$(VER)
+ cat <CHANGELOG >~/exit/alevt/changes
+
+# DO NOT DELETE
+
+alevt-cap.o: vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h export.h
+alevt-date.o: os.h vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h
+cache.o: misc.h dllist.h cache.h vt.h help.h
+exp-gfx.o: lang.h misc.h vt.h export.h font.h fontsize.h
+exp-html.o: lang.h misc.h vt.h export.h
+exp-txt.o: os.h export.h vt.h misc.h
+export.o: vt.h misc.h export.h
+fdset.o: dllist.h misc.h fdset.h
+font.o: font1.xbm font2.xbm font3.xbm font4.xbm
+hamm.o: vt.h misc.h hamm.h
+help.o: vt.h misc.h vt900.out vt901.out vt902.out vt903.out vt904.out vt905.out
+help.o: vt906.out vt907.out vt908.out vt909.out vt910.out vt911.out vt912.out
+lang.o: misc.h vt.h lang.h
+main.o: vt.h misc.h fdset.h dllist.h xio.h vbi.h cache.h lang.h ui.h
+main.o: search.h
+misc.o: misc.h
+search.o: vt.h misc.h cache.h dllist.h search.h
+ui.o: vt.h misc.h xio.h dllist.h vbi.h cache.h lang.h fdset.h
+ui.o: search.h export.h ui.h
+vbi.o: os.h vt.h misc.h vbi.h dllist.h cache.h lang.h fdset.h hamm.h
+xio.o: vt.h misc.h dllist.h xio.h fdset.h lang.h icon.xbm font.h fontsize.h
diff --git a/util/alevt/README b/util/alevt/README
new file mode 100644
index 0000000..83985f0
--- /dev/null
+++ b/util/alevt/README
@@ -0,0 +1,72 @@
+Hi,
+
+this software is not just a program, it's moreover a legend.
+It is THE protagonist of all videotext applications under Linux.
+
+During the past 10 years the video standards, the APIs, the kernel
+have seen lots of changes.
+But unfortunately this program has NOT seen much maintenance.
+The results of that misfit appearance are:
+
+1. lots of forks flying around in the Internet
+2. lots of patches flying around, some good, some disgusting, some out of time
+3. lots of cruft which is completely outdated or obsolete for other reasons
+
+To handle all that in one big effort I decided to redesign the program
+completely, enlarging its capabilities for DVB-S at the same time.
+
+So here are the changes:
+
+1. Erasure of old help pages and rename / reorganize / update the rest
+-> redesign of the online help system / implying alevt-date and alevt-cap
+
+2. Erasure of old outdated integers, functions, parameters:
+
+- bell, big_buf, debug, display, editor, erc, fine_tune, newbttv,
+- oldbttv
+
+3. Coding style cleanups (no superfluous comments, not more than
+ 80 characters per column, no uncommented code.
+
+4. No strange characters in the outfile, latin alphabet in purity instead.
+
+5. Alevt can be started in 4 modes now if you are running it in DVB mode:
+
+- by service id (sid)
+- by teletext pid (ttpid)
+- by channel name
+- without parameter
+
+6. Starting it in DVB mode on the command line it presents you
+a table with human readable values such as sid, teletext pid,
+PMT (Program Map Table), provider name, service name, language, service type.
+This makes it easier for you to start multiple teletext windows
+in multiple console sessions manually.
+
+If working with a script and the option -o (outfile) you can
+also start multiple teletext windows of all channels in a transponder.
+I develop a GUI using TCL / TK 8.5 and Iwidgets 4.01 to do that and other
+tasks graphically (i. e. by mouse click).
+
+7. If you install the program on the command line by typing "make &
+ make install" there is an uninstaller now to revert the installation:
+ "make uninstall".
+
+ENJOY IT!
+
+Uwe Bugla, February 11th, 2010.
+
+External dependencies
+
+AleVT needs some system libraries to be installed in your system.
+They are zlib, libX11, libpng and libzvbi.
+
+Credits go to:
+- Andreas Rottmann from debian.org for compiler fixes and
+ other kinds of investigation.
+- Francesco Lavra for supplying a kernel patch to avoid kernel demux
+ incompatibilities with kernels >= 2.6.32
+- Andy Walls for helpful investigation in kernelspace
+- Edgar Toernig for providing the source version 1.6.2 and doing all the
+ development for the basic versions
+- Tom Zoerner for the implementation of libzvbi
diff --git a/util/alevt/README.OLD b/util/alevt/README.OLD
new file mode 100644
index 0000000..4fb0e41
--- /dev/null
+++ b/util/alevt/README.OLD
@@ -0,0 +1,78 @@
+Hi, Menden, 21 Sep 2000
+
+ This program decodes and displays Videotext/Teletext from a
+ /dev/vbi device.
+
+
+COMPILE & INSTALL:
+
+ There's nothing to configure. A simple 'make' is all.
+ If you do not want png support remove the WITH_PNG in
+ the Makefile. Additionally, if you want a smaller font
+ uncomment the "FONT=neep9" line.
+
+ It gives you 'alevt', 'alevt-date', and 'alevt-cap' and
+ their man pages 'alevt.1x', 'alevt-date.1', and 'alevt-cap.1'.
+
+ You can install them where ever you want (i.e. /usr/local/bin).
+ The programs are self-contained and require no other files.
+
+ NOTE: Be careful with 'make install'. It's just for me :-)
+
+
+PROBLEMS:
+
+ If you have a lot of decoding errors (lot of these lightning symbols)
+ you may try pressing the 'f' and 'F' key. This allows fine tuning of
+ the decoder circuit. There's also a -finetune command line option.
+ This should only be necessary on really bad signals.
+
+ Maybe, I add autotuning later...
+
+ UPDATE: added autotuning. It's the default. If you add -debug the
+ the actions of the pll are printed to stdout.
+
+ To get the old (pre finetune) behaviour start it with -finetune 0.
+
+ UPDATE: disabled autotuning *g* sometimes it's too jumpy...
+
+
+ALEVT-DATE:
+ I added a little tool to set the system time from the videotext
+ time. The date is not interpreted (not even transmitted on some
+ channels). So it allows only adjustment of +/-12 hours.
+ The default allowed adjustment is limited to +/-2 hours (use
+ -delta to change). Without the -set option it just display
+ the date in the format of the date command. Look at strftime(3)
+ for possible control sequences you may use in the -format option.
+
+
+HACKING:
+
+ If you want to play with the font size, you may resize it with
+ xv (xv font1.xbm). Just make sure, that its width is a multiple of
+ 32 and its height a multiple of 8. A simple make will create
+ a version of AleTV with the new font. Warning: a make clean
+ will erase font1.xbm. The next make will recreate font.xbm from
+ vtxt.bdf.
+
+ AleVT has a built in page editor. If you start it with -editor
+ you may press 'E' to invoke it. For the usage you have to consult
+ the sources. (It's very crude!)
+
+
+TODO: (no specific order)
+
+ - Error correction in alevt-cap
+ - Better language support. Internal 16-bit charset.
+ - Separated graphics.
+ - Rewrite the whole stuff. A networked teletext daemon and clients
+ that connect to it for display, capture, cgi, ...
+
+
+NEWER VERSIONS:
+
+ The primary site of AleVT is http://goron.de/~froese
+
+Have fun,
+Edgar Toernig (froese@gmx.de)
diff --git a/util/alevt/ReadmeGR b/util/alevt/ReadmeGR
new file mode 100644
index 0000000..68d32c2
--- /dev/null
+++ b/util/alevt/ReadmeGR
@@ -0,0 +1,28 @@
+29-9-2003
+
+ÅëëçíéêÜ ãéá ôï ALEVT
+Ç ðñïóèÞêç Åëëçíéêþí Ýãéíå ôñïðïðïéþíôáò ôï patch alevt-1.6.3.rus.diff ðïõ âñßóêåôå óôï öÜêåëï
+contrib óôá sources ôïõ alevt-1.6.3
+
+ÎåêéíÞóôå ôï ðñüãñáììá ìå ôçí ðáñÜìåôñï
+
+alevt -charset iso8859-7
+
+
+alevt -charset el
+
+ÄïõëåéÝò ðïõ Ý÷ïõí íá ãßíïõí:
+Êáëýôåñïò ó÷åäéáóìüò ôïõ font file vtxt-iso8859-7.bdf
+ïé Áããëéêïß ÷áñáêôÞñåò ìïéÜæïõí óáí bold óå ó÷Ýóç ìå ôïõò Åëëçíéêïýò êáé õðÜñ÷ïõí
+êÜðïéá ìéêñÜ ðñïâëçìáôÜêéá ìå ôïõò graphics (0x01 -0x1f)
+
+¸ëåã÷ïò ãéá ôï áí áðåéêïíßæïíôáé óùóôÜ üëïé ïé ÷áñáêôÞñåò
+
+¼ðïéïò èÝëåé íá âïçèÞóåé ðáñáêáëþ íá ìïõ óôåßëåé ôçò áëëáãÝò ôïõ óôï sl45sms@yahoo.gr
+Áí êÜðïéïò êÜíåé åêôåôáìÝíåò áëëáãÝò ðïõ äåí áöïñïýí ôá ÅëëçíéêÜ èá ðñÝðåé íá ôéò óôåßëåé êáé
+óôïí óõããñáöÝá ôïõ ðñïãñÜììáôïò
+
+ÍåüôåñÜ áñ÷åßá ôïõ ðáñüíôïò èá ìðïñåßôå íá âñßóêåôå óôï http://go.to/sl45sms/alevt/index.html
+
+ÓêáñâÝëçò Ðáíáãéþôçò
diff --git a/util/alevt/TODO b/util/alevt/TODO
new file mode 100644
index 0000000..4b56676
--- /dev/null
+++ b/util/alevt/TODO
@@ -0,0 +1,12 @@
+Hi, these are issues that I unfortunately cannot resolve myself:
+
+1. graphical menu written in GKT2, to be used in general connection with
+ the outfile (-o) option.
+
+2. for usage without script and outfile option:
+ DVB monitoring demon helping the program to rewrite the PAT when the
+ external player software has chosen a channel which is part of a
+ new transponder.
+ At the moment alevt hangs when the transponder is changed.
+
+Uwe Bugla, February 11th, 2010.
diff --git a/util/alevt/alevt-cap.1 b/util/alevt/alevt-cap.1
new file mode 100644
index 0000000..2af1879
--- /dev/null
+++ b/util/alevt/alevt-cap.1
@@ -0,0 +1,53 @@
+.TH alevt-cap 1 "February 07, 2010"
+.SH NAME
+alevt-cap \- capture teletext windows.
+.SH SYNOPSIS
+.B alevt-cap
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt-cap
+commands.
+.PP
+\fBalevt-cap\fP is a program to capture teletext pages.
+.SH OPTIONS
+.TP
+.B \-cs -charset <latin-1/2/koi8-r/iso-8859-7>
+character set
+.TP
+.B \-f -format <fmt[,options]>
+format to save
+.TP
+.B \-f help -format help
+lists available storage formats
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-n -name <filename>
+page name to save
+.B \-t -timeout <secs>
+timeout
+.TP
+.B \-s -sid <sid>
+service pid
+.TP
+.B \-t -ttpid <ttpid>
+teletext pid
+.TP
+.B \-v -vbi <vbidev>
+vbi device
+.TP
+Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+ppp.ss stands for a page number and an optional
+subpage number (example: 123.4).
+.TP
+.SH SEE ALSO
+.BR alevt-date (1) , alevt (1).
+.br
+.SH AUTHOR
+alevt-cap was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt-cap.c b/util/alevt/alevt-cap.c
new file mode 100644
index 0000000..9e0c3bd
--- /dev/null
+++ b/util/alevt/alevt-cap.c
@@ -0,0 +1,280 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <signal.h>
+#include <unistd.h>
+#include "vt.h"
+#include "misc.h"
+#include "fdset.h"
+#include "vbi.h"
+#include "lang.h"
+#include "dllist.h"
+#include "export.h"
+
+static volatile int timed_out = 0;
+static char *channel;
+char *outfile = "";
+u_int16_t sid;
+
+
+struct req
+{
+ struct dl_node node[1];
+ char *name; // file name
+ char *pgno_str; // the pgno as given on the cmdline
+ int pgno, subno; // decoded pgno
+ struct export *export; // export data
+ struct vt_page vtp[1]; // the capture page data
+};
+
+
+static void usage(FILE *fp, int exitval)
+{
+ fprintf(fp, "\nUsage: %s [options] ppp.ss...\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -cs -charset\t\tlatin-1\n"
+ " <latin-1/2/koi8-r/iso8859-7>\n"
+ " -f -format <fmt,options>\tascii\n"
+ " -f help -format help\n"
+ " -h -help\n"
+ " -n -name <filename>\t\tttext-%%s.%%e\n"
+ " -s -sid <sid>\t\t(none;dvb only)\n"
+ " -to -timeout <secs>\t\t(none)\n"
+ " -t -ttpid <ttpid>\t\t(none;dvb only)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ "\n"
+ " ppp.ss stands for a page number and an\n"
+ " optional subpage number (ie 123.4).\n"
+ );
+ exit(exitval);
+}
+
+
+static void exp_help(FILE *fp)
+{
+ struct export_module **ep;
+ char **cp, c;
+
+ fprintf(fp,
+ "\nSyntax: -format Name[,Options]\n"
+ "\n"
+ " Name\tExt.\tOptions\n"
+ " --------------------------------\n"
+ );
+ for (ep = modules; *ep; ep++)
+ {
+ fprintf(fp, " %-7s\t.%-4s", (*ep)->fmt_name, (*ep)->extension);
+ for (c = '\t', cp = (*ep)->options; cp && *cp; cp++, c = ',')
+ fprintf(fp, "%c%s", c, *cp);
+ fprintf(fp, "\n");
+ }
+ fprintf(fp,
+ "\n"
+ "Common options: reveal,hide\n"
+ "Example: -format ansi,reveal,bg=none\n"
+ "\n"
+ );
+ exit(0);
+}
+
+
+static int arg_pgno(char *p, int *subno)
+{
+ char *end;
+ int pgno;
+
+ *subno = ANY_SUB;
+ if (*p)
+ {
+ pgno = strtol(p, &end, 16);
+ if ((*end == ':' || *end == '/' || *end == '.') && end[1])
+ *subno = strtol(end + 1, &end, 16);
+ if (*end == 0)
+ if (pgno >= 0x100 && pgno <= 0x899)
+ if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
+ return pgno;
+ }
+ fatal("%s: invalid page number", p);
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-charset", "-cs", 1 },
+ { "-format", "-f", 1 },
+ { "-help", "-h", 0 },
+ { "-name", "-n", 1 },
+ { "-sid", "-s", 1 },
+ { "-timeout", "-to", 1 },
+ { "-ttpid", "-t", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+
+ if (*ind >= argc)
+ return 0;
+
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 2);
+ }
+
+ return -1;
+}
+
+
+static void event(struct dl_head *reqs, struct vt_event *ev)
+{
+ struct req *req, *nxt;
+
+ switch (ev->type)
+ {
+ case EV_PAGE: // new page
+ {
+ struct vt_page *vtp = ev->p1;
+
+ for (req = PTR reqs->first; nxt = PTR req->node->next; req = nxt)
+ if (req->pgno == vtp->pgno)
+ if (req->subno == ANY_SUB || req->subno == vtp->subno)
+ {
+ *req->vtp = *vtp;
+ dl_insert_last(reqs + 1, dl_remove(req->node));
+ }
+ }
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ char *vbi_name = NULL;
+ int timeout = 0;
+ char *fname = "ttext-%s.%e";
+ char *out_fmt = "ascii";
+ struct export *fmt = 0;
+ int opt, ind;
+ char *arg;
+ struct vbi *vbi;
+ struct req *req;
+ struct dl_head reqs[2]; // simple linear lists of requests & captures
+ int ttpid = -1;
+
+ setlocale (LC_CTYPE, "");
+ setprgname(argv[0]);
+
+ fdset_init(fds);
+ dl_init(reqs); // the requests
+ dl_init(reqs+1); // the captured pages
+
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+ case 1: // charset
+ if (streq(arg, "latin-1") || streq(arg, "1"))
+ latin1 = 1;
+ else if (streq(arg, "latin-2") || streq(arg, "2"))
+ latin1 = 0;
+ else if (streq(arg, "koi8-r") || streq(arg, "koi"))
+ latin1 = KOI8;
+ else if (streq(arg, "iso8859-7") || streq(arg, "el"))
+ latin1 = GREEK;
+ else
+ fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
+ break;
+ case 2: // format
+ if (streq(arg, "help") || streq(arg, "?") || streq(arg, "list"))
+ exp_help(stdout);
+ out_fmt = arg;
+ fmt = 0;
+ break;
+ case 3: // help
+ usage(stdout, 0);
+ break;
+ case 4: // name
+ fname = arg;
+ break;
+ case 5: // timeout
+ timeout = strtol(arg, 0, 10);
+ if (timeout < 1 || timeout > 999999)
+ fatal("bad timeout value", timeout);
+ break;
+ case 6: // service id
+ sid = strtoul(arg, NULL, 0);
+ break;
+ case 7: // teletext pid
+ ttpid = strtoul(arg, NULL, 0);
+ break;
+ case 8: // vbi
+ vbi_name = arg;
+ break;
+ case -1: // non-option arg
+ if (not fmt)
+ fmt = export_open(out_fmt);
+ if (not fmt)
+ fatal("%s", export_errstr());
+ if (not(req = malloc(sizeof(*req))))
+ out_of_mem(sizeof(*req));
+ req->name = fname;
+ req->pgno_str = arg;
+ req->pgno = arg_pgno(arg, &req->subno);
+ req->export = fmt;
+ dl_insert_last(reqs, req->node);
+ break;
+ }
+
+ if (dl_empty(reqs))
+ fatal("no pages requested");
+
+ // setup device
+ if (not(vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid)))
+ fatal("cannot open %s", vbi_name);
+ vbi_add_handler(vbi, event, reqs); // register event handler
+
+ if (timeout)
+ alarm(timeout);
+
+ // capture pages (moves requests from reqs[0] to reqs[1])
+ while (not dl_empty(reqs) && not timed_out)
+ if (fdset_select(fds, 30000) == 0) // 30sec select time out
+ {
+ error("no signal.");
+ break;
+ }
+
+ alarm(0);
+ vbi_del_handler(vbi, event, reqs);
+ vbi_close(vbi);
+ if (not dl_empty(reqs))
+ error("capture aborted. Some pages are missing.");
+
+ for (req = PTR reqs[1].first; req->node->next; req = PTR req->node->next)
+ {
+ fname = export_mkname(req->export, req->name, req->vtp, req->pgno_str);
+ if (not fname || export(req->export, req->vtp, fname))
+ error("error saving page %s: %s", req->pgno_str, export_errstr());
+ if (fname)
+ free(fname);
+ }
+ exit(dl_empty(reqs) ? 0 : 1);
+}
diff --git a/util/alevt/alevt-date.1 b/util/alevt/alevt-date.1
new file mode 100644
index 0000000..69d2f6f
--- /dev/null
+++ b/util/alevt/alevt-date.1
@@ -0,0 +1,41 @@
+.TH alevt-date 1 "February 07, 2010"
+.SH NAME
+alevt-date \- print out UTC date.
+.SH SYNOPSIS
+.B alevt-date
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt-date
+commands.
+.PP
+\fBalevt-date\fP is a program to print the UTC date.
+.SH OPTIONS
+.TP
+.B \-d -delta <max_secs>
+maximum delta
+.TP
+.B \-f -format <fmtstr>
+time format
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-s -set
+set the system clock
+.TP
+.B \-t -timeout <seconds>
+timeout
+.TP
+.B \-v -vbi <vbidev>
+vbi device /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+.br
+.SH SEE ALSO
+.BR alevt-cap (1) , alevt (1).
+.br
+.SH AUTHOR
+alevt-date was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt-date.c b/util/alevt/alevt-date.c
new file mode 100644
index 0000000..5496937
--- /dev/null
+++ b/util/alevt/alevt-date.c
@@ -0,0 +1,225 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include "os.h"
+#include "vt.h"
+#include "fdset.h"
+#include "vbi.h"
+#include "lang.h"
+#include "misc.h"
+
+char *fmt = "%a %b %d %H:%M:%S %Z %Y";
+int max_diff = 2*60*60; // default: 2 hours
+int set_time = 0;
+char *outfile = "";
+static char *channel;
+u_int16_t sid;
+
+
+static void chk_time(int t)
+{
+ struct tm *tm;
+ time_t sys_t;
+ int dt;
+ char buf[256];
+
+ if (t < 0 || t > 235959 || t%100 > 59 || t/100%100 > 59)
+ return;
+
+ sys_t = time(0);
+ tm = localtime(&sys_t);
+
+ // Now convert to UTC seconds
+ t = t/100/100 * 60*60 + t/100%100 * 60 + t%100;
+#ifdef BSD
+ t -= tm->tm_gmtoff; // dst already included...
+#else
+ t += timezone;
+ if (tm->tm_isdst)
+ t -= 60*60;
+#endif
+
+ dt = t - sys_t % (24*60*60);
+ if (dt <= -12*60*60)
+ dt += 24*60*60;
+
+ if (dt <= -max_diff || dt >= max_diff)
+ fatal("time diff too big (%2d:%02d:%02d)", dt/60/60, abs(dt)/60%60, abs(dt)%60);
+
+ sys_t += dt;
+
+ if (set_time)
+ {
+ struct timeval tv[1];
+
+ tv->tv_sec = sys_t;
+ tv->tv_usec = 500000;
+ if (settimeofday(tv, 0) == -1)
+ ioerror("settimeofday");
+ }
+ if (*fmt)
+ {
+ tm = localtime(&sys_t);
+ if (strftime(buf, sizeof(buf), fmt, tm))
+ puts(buf);
+ }
+ exit(0);
+}
+
+
+static void event(void *_, struct vt_event *ev)
+{
+ switch (ev->type)
+ {
+ /* vbi may generate EV_PAGE, EV_HEADER, EV_XPACKET */
+ /* for event arguments see vt.h */
+
+ case EV_HEADER: // a new title line (for running headers)
+ {
+ static int last_t = -1;
+ u8 *s = ev->p1;
+ int i, t = 1;
+
+ if (ev->i2 & PG_OUTOFSEQ)
+ break;
+
+ for (i = 32; i < 40; ++i)
+ if (s[i] >= '0' && s[i] <= '9')
+ t = t * 10+ s[i] - '0';
+ if (t >= 1000000 && t <= 1235959)
+ if (t == last_t || t - last_t == 1)
+ chk_time(t - 1000000);
+ last_t = t;
+ break;
+ }
+ }
+}
+
+
+static void usage(FILE *fp, int exit_val)
+{
+ fprintf(fp, "usage: %s [options]\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -d -delta <max_secs>\t7200 (2 hours)\n"
+ " -f -format <fmtstr>\t\t%%c\n"
+ " -h -help\n"
+ " -s -set\t\t\toff\n"
+ " -to -timeout <seconds>\t(none)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ );
+ exit(exit_val);
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-delta", "-d", 1 },
+ { "-format", "-f", 1 },
+ { "-help", "-h", 0 },
+ { "-set", "-s", 0 },
+ { "-timeout", "-to", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+
+ if (*ind >= argc)
+ return 0;
+
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 1);
+ }
+
+ return -1;
+}
+
+
+int main(int argc, char **argv)
+{
+ char *vbi_name = NULL;
+ int timeout = 0;
+ struct vbi *vbi;
+ int opt, ind;
+ char *arg;
+ int ttpid = -1;
+
+ setprgname(argv[0]);
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+ case 1: // -delta
+ max_diff = atoi(arg);
+ if (max_diff < 1)
+ fatal("-delta: illegal value '%s'", arg);
+ if (max_diff > 12*60*60)
+ {
+ max_diff = 12*60*60;
+ error("-delta: %d too big. Assuming %d", arg, max_diff);
+ }
+ break;
+ case 2: // -format
+ fmt = arg;
+ break;
+ case 3: // help
+ usage(stdout, 0);
+ break;
+ case 4: // -set
+ set_time = 1;
+ break;
+ case 5: // -timeout
+ timeout = atoi(arg);
+ if (timeout < 1 || timeout > 60*60)
+ fatal("-timeout: illegal value '%s'", arg);
+ break;
+ case 6: // -vbi
+ vbi_name = arg;
+ break;
+ case -1:
+ usage(stderr, 1);
+ break;
+ }
+
+ fdset_init(fds);
+
+ if (timeout)
+ {
+ signal(SIGALRM, SIG_DFL); // kill me
+ alarm(timeout);
+ }
+ vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid); // open device
+ if (not vbi)
+ fatal_ioerror(vbi_name);
+ vbi_add_handler(vbi, event, 0); // register event handler
+
+ for (;;)
+ fdset_select(fds, -1); // call scheduler
+
+ /* never reached */
+ vbi_del_handler(vbi, event, 0);
+ vbi_close(vbi);
+ exit(0);
+}
diff --git a/util/alevt/alevt.1 b/util/alevt/alevt.1
new file mode 100644
index 0000000..68bff45
--- /dev/null
+++ b/util/alevt/alevt.1
@@ -0,0 +1,60 @@
+.TH alevt 1 "February 07, 2010"
+.SH NAME
+alevt \- a teletext browser for analogue and DVB channels.
+.SH SYNOPSIS
+.B alevt
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt
+commands.
+.PP
+\fBalevt\fP is a program to read teletext from analogue or DVB channels.
+.SH OPTIONS
+.TP
+.B \-c <channel>
+channel name (dvb only)
+.TP
+.B \-ch -child <ppp.ss>
+child window
+.TP
+.B \-cs -charset <latin-1/2/koi8-r/iso8859-7>
+character set
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-o <outfile>
+path + file for all services (dvb only)
+.TP
+.B \-p -parent <ppp.ss>
+parent window
+.TP
+.B \-s -sid <sid>
+service id (dvb only)
+.TP
+.B \-t -ttpid <ttpid>
+teletext pid (dvb only)
+.TP
+.B \-v -vbi <vbidev>
+vbi device
+.TP
+Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+Order is important! Each page number opens a new window
+with the previously given geometry, device, and display.
+.TP
+ppp.ss stands for a page number and an optional
+subpage number (example: 123.4).
+.TP
+The -child option requires a parent window. So it must
+be preceded by a parent or another child window.
+.TP
+.SH SEE ALSO
+.BR alevt-cap (1), alevt-date (1).
+.br
+.SH AUTHOR
+alevt was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt.desktop b/util/alevt/alevt.desktop
new file mode 100644
index 0000000..c125bb9
--- /dev/null
+++ b/util/alevt/alevt.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=alevt
+Comment=Teletext Browser
+Exec=alevt
+Icon=alevt
+Terminal=false
+Type=Application
+Categories=GNOME;GTK;AudioVideo;Video;
diff --git a/util/alevt/bdf2xbm.c b/util/alevt/bdf2xbm.c
new file mode 100644
index 0000000..74d238e
--- /dev/null
+++ b/util/alevt/bdf2xbm.c
@@ -0,0 +1,212 @@
+/*
+ Simple program to convert a bdf-font to a bitmap.
+ The characters are arranged in a 32x8 matrix.
+ usage: bdf2xbm [identifier] <bdf >xbm
+ Copyright 1998,1999 by E. Toernig (froese@gmx.de)
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#define not !
+#define streq(a,b) (strcmp((a),(b)) == 0)
+
+int lineno;
+char *word[64];
+int nword;
+
+char *font = "font%dx%d";
+int w, h, bpl;
+unsigned char *bmap;
+
+
+static void error(char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ fprintf(stderr, "bdf2xbm");
+ if (lineno)
+ fprintf(stderr, ":%d", lineno);
+ fprintf(stderr, ": ");
+ vfprintf(stderr, fmt, args);
+ fputc('\n', stderr);
+ exit(1);
+}
+
+
+static int nextline()
+{
+ static char buf[256];
+ char *p;
+ int i;
+
+ do
+ {
+ nword = 0;
+ if (fgets(buf, sizeof(buf), stdin) == 0)
+ return nword;
+ lineno++;
+
+ p = buf;
+ for (;;)
+ {
+ while (isspace(*p))
+ p++;
+ if (*p == 0)
+ break;
+ word[nword++] = p;
+ while (*p && not isspace(*p))
+ *p = toupper(*p), p++;
+ if (*p == 0)
+ break;
+ *p++ = 0;
+ }
+ } while (nword == 0);
+
+ for (i = nword; i < 64; ++i)
+ word[i] = "";
+ return nword;
+}
+
+
+static inline void setbit(int ch, int x, int y)
+{
+
+ int yo = ch / 32 * h + y;
+ int xo = ch % 32 * w + x;
+
+ bmap[yo * bpl + xo / 8] |= 1 << (xo % 8);
+}
+
+
+static void dobitmap(int ch, int x, int y)
+{
+ int i, j;
+
+ for (i = 0; i < y; ++i)
+ {
+ nextline();
+ if (nword > 1 || strlen(word[0]) != (x + 7) / 8 * 2)
+ error("bad BITMAP");
+ for (j = 0; j < x; ++j)
+ {
+ int c = word[0][j / 4];
+ if (c >= '0' && c <= '9')
+ c -= '0';
+ else if (c >= 'A' && c <= 'F')
+ c -= 'A' - 10;
+ else
+ error("bad hexchar in BITMAP");
+ if (c & (8 >> (j % 4)))
+ setbit(ch, j, i);
+ }
+ }
+}
+
+
+static void dochar()
+{
+ int ch = -1, x = -1, y = -1;
+
+ while (nextline())
+ {
+ if (streq(word[0], "ENDCHAR"))
+ return;
+ else if (streq(word[0], "ENCODING") && nword == 2)
+ {
+ ch = atoi(word[1]);
+ if (ch < 0 || ch > 255)
+ error("bad character code %d", ch);
+ }
+ else if (streq(word[0], "BBX") && nword == 5)
+ {
+ x = atoi(word[1]), y = atoi(word[2]);
+ if (x < 1 || x > 64 || y < 1 || y > 64)
+ error("bad BBX (%dx%d)", x, y);
+ }
+ else if (streq(word[0], "BITMAP"))
+ {
+ if (x < 0)
+ error("missing BBX");
+ if (ch < 0)
+ error("missing ENDCODING");
+ dobitmap(ch, x, y);
+ }
+ }
+ error("unexpected EOF (missing ENDCHAR)");
+}
+
+
+static void dofile()
+{
+ lineno = 0;
+ w = h = 0;
+ bmap = 0;
+
+ nextline();
+ if (nword != 2 || not streq(word[0], "STARTFONT"))
+ error("not a bdf-file");
+
+ while (nextline())
+ {
+ if (streq(word[0], "ENDFONT"))
+ return;
+ else if (streq(word[0], "FONTBOUNDINGBOX") && nword == 5)
+ {
+ if (bmap)
+ error("multiple FONTBOUNDINGBOXes!?!");
+ w = atoi(word[1]), h = atoi(word[2]);
+ if (w < 1 || w > 64 || h < 1 || h > 64)
+ error("bad bounding box %dx%d\n", w, h);
+ bpl = (w*32+7)/8; // rounding is unnecessary
+ bmap = calloc(1, bpl * h*8);
+ if (bmap == 0)
+ error("out of memory");
+ }
+ else if (streq(word[0], "STARTCHAR"))
+ {
+ if (not bmap)
+ error("no FONTBOUNDINGBOX");
+ dochar();
+ }
+ }
+ error("unexpected EOF (missing ENDFONT)");
+}
+
+
+static void writexbm()
+{
+ char buf[256];
+ int i, j;
+ unsigned char *p = bmap;
+
+ if (not bmap)
+ return;
+
+ sprintf(buf, font, w, h);
+
+ printf("#define %s_width %d\n", buf, 32 * w);
+ printf("#define %s_height %d\n", buf, 8 * h);
+ printf("static unsigned char %s_bits[] = {\n", buf);
+ for (i = 0; i < 16 * h * w / 8; ++i)
+ {
+ for (j = 0; j < 16; ++j)
+ printf("0x%02x,", *p++);
+ printf("\n");
+ }
+ printf("};\n");
+}
+
+
+int main(int argc, char **argv)
+{
+ if (argc > 1)
+ font = argv[1];
+ dofile();
+ writexbm();
+ exit(0);
+}
diff --git a/util/alevt/cache.c b/util/alevt/cache.c
new file mode 100644
index 0000000..c747448
--- /dev/null
+++ b/util/alevt/cache.c
@@ -0,0 +1,229 @@
+#include <stdlib.h>
+#include <string.h>
+#include "misc.h"
+#include "dllist.h"
+#include "cache.h"
+#include "help.h"
+
+
+static inline int hash(int pgno)
+{
+ // very simple...
+ return pgno % HASH_SIZE;
+}
+
+
+static void do_erc(struct vt_page *ovtp, struct vt_page *nvtp)
+{
+ int l, c;
+
+ if (nvtp->errors == 0 && ovtp->lines == nvtp->lines)
+ return;
+
+ for (l = 0; l < H; ++l)
+ {
+ if (~nvtp->lines & (1 << l))
+ memcpy(nvtp->data[l], ovtp->data[l], W);
+ else if (ovtp->lines & (1 << l))
+ for (c = 0; c < W; ++c)
+ if (nvtp->data[l][c] == BAD_CHAR)
+ nvtp->data[l][c] = ovtp->data[l][c];
+ }
+ nvtp->lines |= ovtp->lines;
+}
+
+
+static void cache_close(struct cache *ca)
+{
+ struct cache_page *cp;
+ int i;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ while (not dl_empty(ca->hash + i))
+ {
+ cp = PTR ca->hash[i].first;
+ dl_remove(cp->node);
+ free(cp);
+ }
+ free(ca);
+}
+
+
+static void cache_reset(struct cache *ca)
+{
+ struct cache_page *cp, *cpn;
+ int i;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ for (cp = PTR ca->hash[i].first; cpn = PTR cp->node->next; cp = cpn)
+ if (cp->page->pgno / 256 != 9) // don't remove help pages
+ {
+ dl_remove(cp->node);
+ free(cp);
+ ca->npages--;
+ }
+ memset(ca->hi_subno, 0, sizeof(ca->hi_subno[0]) * 0x900);
+}
+
+/* Get a page from the cache.
+ If subno is SUB_ANY, the newest subpage of that page is returned */
+
+
+static struct vt_page * cache_get(struct cache *ca, int pgno, int subno)
+{
+ struct cache_page *cp;
+ int h = hash(pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == pgno)
+ if (subno == ANY_SUB || cp->page->subno == subno)
+ {
+ // found, move to front (make it 'new')
+ dl_insert_first(ca->hash + h, dl_remove(cp->node));
+ return cp->page;
+ }
+ return 0;
+}
+
+/* Put a page in the cache.
+ If it's already there, it is updated. */
+
+
+static struct vt_page * cache_put(struct cache *ca, struct vt_page *vtp)
+{
+ struct cache_page *cp;
+ int h = hash(vtp->pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == vtp->pgno && cp->page->subno == vtp->subno)
+ break;
+
+ if (cp->node->next)
+ {
+ // move to front.
+ dl_insert_first(ca->hash + h, dl_remove(cp->node));
+ if (ca->erc)
+ do_erc(cp->page, vtp);
+ }
+ else
+ {
+ cp = malloc(sizeof(*cp));
+ if (cp == 0)
+ return 0;
+ if (vtp->subno >= ca->hi_subno[vtp->pgno])
+ ca->hi_subno[vtp->pgno] = vtp->subno + 1;
+ ca->npages++;
+ dl_insert_first(ca->hash + h, cp->node);
+ }
+
+ *cp->page = *vtp;
+ return cp->page;
+}
+
+/* Same as cache_get but doesn't make the found entry new */
+
+
+static struct vt_page * cache_lookup(struct cache *ca, int pgno, int subno)
+{
+ struct cache_page *cp;
+ int h = hash(pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == pgno)
+ if (subno == ANY_SUB || cp->page->subno == subno)
+ return cp->page;
+ return 0;
+}
+
+
+static struct vt_page * cache_foreach_pg(struct cache *ca, int pgno, int subno,
+ int dir, int (*func)(), void *data)
+{
+ struct vt_page *vtp, *s_vtp = 0;
+
+ if (ca->npages == 0)
+ return 0;
+
+ if (vtp = cache_lookup(ca, pgno, subno))
+ subno = vtp->subno;
+ else if (subno == ANY_SUB)
+ subno = dir < 0 ? 0 : 0xffff;
+
+ for (;;)
+ {
+ subno += dir;
+ while (subno < 0 || subno >= ca->hi_subno[pgno])
+ {
+ pgno += dir;
+ if (pgno < 0x100)
+ pgno = 0x9ff;
+ if (pgno > 0x9ff)
+ pgno = 0x100;
+ subno = dir < 0 ? ca->hi_subno[pgno] - 1 : 0;
+ }
+ if (vtp = cache_lookup(ca, pgno, subno))
+ {
+ if (s_vtp == vtp)
+ return 0;
+ if (s_vtp == 0)
+ s_vtp = vtp;
+ if (func(data, vtp))
+ return vtp;
+ }
+ }
+}
+
+
+static int cache_mode(struct cache *ca, int mode, int arg)
+{
+ int res = -1;
+
+ switch (mode)
+ {
+ case CACHE_MODE_ERC:
+ res = ca->erc;
+ ca->erc = arg ? 1 : 0;
+ break;
+ }
+ return res;
+}
+
+
+static struct cache_ops cops =
+{
+ cache_close,
+ cache_get,
+ cache_put,
+ cache_reset,
+ cache_foreach_pg,
+ cache_mode,
+};
+
+
+struct cache * cache_open(void)
+{
+ struct cache *ca;
+ struct vt_page *vtp;
+ int i;
+
+ if (not(ca = malloc(sizeof(*ca))))
+ goto fail1;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ dl_init(ca->hash + i);
+
+ memset(ca->hi_subno, 0, sizeof(ca->hi_subno));
+ ca->erc = 1;
+ ca->npages = 0;
+ ca->op = &cops;
+
+ for (vtp = help_pages; vtp < help_pages + nr_help_pages; vtp++)
+ cache_put(ca, vtp);
+
+ return ca;
+
+fail2:
+ free(ca);
+fail1:
+ return 0;
+}
diff --git a/util/alevt/cache.h b/util/alevt/cache.h
new file mode 100644
index 0000000..934ef9a
--- /dev/null
+++ b/util/alevt/cache.h
@@ -0,0 +1,41 @@
+#ifndef CACHE_H
+#define CACHE_H
+
+#include "vt.h"
+#include "misc.h"
+#include "dllist.h"
+
+#define HASH_SIZE 113
+
+
+struct cache
+{
+ struct dl_head hash[HASH_SIZE];
+ int erc; // error reduction circuit on
+ int npages;
+ u16 hi_subno[0x9ff + 1]; // 0:pg not in cache, 1-3f80:highest subno + 1
+ struct cache_ops *op;
+};
+
+
+struct cache_page
+{
+ struct dl_node node[1];
+ struct vt_page page[1];
+};
+
+
+struct cache_ops
+{
+ void (*close)(struct cache *ca);
+ struct vt_page *(*get)(struct cache *ca, int pgno, int subno);
+ struct vt_page *(*put)(struct cache *ca, struct vt_page *vtp);
+ void (*reset)(struct cache *ca);
+ struct vt_page *(*foreach_pg)(struct cache *ca, int pgno, int subno, int dir,
+ int (*func)(), void *data);
+ int (*mode)(struct cache *ca, int mode, int arg);
+};
+
+struct cache *cache_open(void);
+#define CACHE_MODE_ERC 1
+#endif
diff --git a/util/alevt/dllist.h b/util/alevt/dllist.h
new file mode 100644
index 0000000..f925506
--- /dev/null
+++ b/util/alevt/dllist.h
@@ -0,0 +1,55 @@
+#ifndef DLLIST_H
+#define DLLIST_H
+
+
+struct dl_node
+{
+ struct dl_node *next;
+ struct dl_node *prev;
+};
+
+
+struct dl_head
+{
+ struct dl_node *first;
+ struct dl_node *null;
+ struct dl_node *last;
+};
+
+
+static inline struct dl_head * dl_init(struct dl_head *h)
+{
+ h->first = (struct dl_node *)&h->null;
+ h->null = 0;
+ h->last = (struct dl_node *)&h->first;
+ return h;
+}
+
+
+static inline struct dl_node * dl_remove(struct dl_node *n)
+{
+ n->prev->next = n->next;
+ n->next->prev = n->prev;
+ return n;
+}
+
+
+static inline struct dl_node *
+ dl_insert_after(struct dl_node *p, struct dl_node *n)
+{
+ n->next = p->next;
+ n->prev = p;
+ p->next = n;
+ n->next->prev = n;
+ return n;
+}
+
+#define dl_empty(h) ((h)->first->next == 0)
+#define dl_insert_before(p, n) dl_insert_after((p)->prev, (n))
+#define dl_insert_first(h, n) ({ struct dl_node *_n = (n); \
+ dl_insert_before((h)->first, _n); })
+#define dl_insert_last(h, n) ({ struct dl_node *_n = (n); \
+ dl_insert_after((h)->last, _n); })
+#define dl_remove_first(h) dl_remove((h)->first) // mustn't be empty!
+#define dl_remove_last(h) dl_remove((h)->last) // mustn't be empty!
+#endif
diff --git a/util/alevt/exp-gfx.c b/util/alevt/exp-gfx.c
new file mode 100644
index 0000000..82ab218
--- /dev/null
+++ b/util/alevt/exp-gfx.c
@@ -0,0 +1,258 @@
+/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "lang.h"
+#include "export.h"
+#include "font.h"
+#define WW (W*CW) /* pixel width of window */
+#define WH (H*CH) /* pixel hegiht of window */
+
+
+static inline void draw_char(unsigned char * colour_matrix, int fg, int bg,
+ int c, int dbl, int _x, int _y, int sep)
+{
+ int x,y;
+ unsigned char* src= (latin1==LATIN1 ? font1_bits : font2_bits);
+ int dest_x=_x*CW;
+ int dest_y=_y*CH;
+
+ for(y=0;y<(CH<<dbl); y++)
+ {
+ for(x=0;x<CW; x++)
+ {
+ int bitnr, bit, maskbitnr, maskbit;
+ bitnr=(c/32*CH + (y>>dbl))*CW*32+ c%32*CW +x;
+ bit=(*(src+bitnr/8))&(1<<bitnr%8);
+ if (sep)
+ {
+ maskbitnr=(0xa0/32*CH + (y>>dbl))*CW*32+ 0xa0%32*CW +x;
+ maskbit=(*(src+maskbitnr/8))&(1<<maskbitnr%8);
+ *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
+ (char)((bit && (!maskbit)) ? fg : bg);
+ }
+ else
+ *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
+ (char)(bit ? fg : bg);
+ }
+ }
+ return;
+}
+
+
+static void prepare_colour_matrix(/*struct export *e,*/
+ struct fmt_page *pg,
+ unsigned char *colour_matrix)
+{
+ int x, y;
+ for (y = 0; y < H; ++y)
+ {
+ for (x = 0; x < W; ++x)
+ {
+ if (pg->dbl & (1<<(y-1)))
+ {
+ if (pg->data[y-1][x].attr & EA_HDOUBLE)
+ draw_char(colour_matrix, pg->data[y][x].fg,
+ pg->data[y][x].bg, pg->data[y][x].ch,
+ (0),
+ x, y,
+ ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
+ );
+ }
+ else
+ {
+ draw_char(colour_matrix, pg->data[y][x].fg,
+ pg->data[y][x].bg, pg->data[y][x].ch,
+ ((pg->data[y][x].attr & EA_DOUBLE) ? 1 : 0),
+ x, y,
+ ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
+ );
+ }
+ }
+ }
+ return;
+}
+
+
+static int ppm_output(struct export *e, char *name, struct fmt_page *pg);
+
+struct export_module export_ppm = // exported module definition
+{
+ "ppm", // id
+ "ppm", // extension
+ 0, // options
+ 0, // size
+ 0, // open
+ 0, // close
+ 0, // option
+ ppm_output // output
+};
+
+
+static int ppm_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ FILE *fp;
+ long n;
+ static u8 rgb1[][3]={{0,0,0},
+ {1,0,0},
+ {0,1,0},
+ {1,1,0},
+ {0,0,1},
+ {1,0,1},
+ {0,1,1},
+ {1,1,1}};
+ unsigned char *colour_matrix;
+
+ if (!(colour_matrix=malloc(WH*WW)))
+ {
+ export_error("cannot allocate memory");
+ return 0;
+ }
+
+ prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);
+ if (not(fp = fopen(name, "w")))
+ {
+ free(colour_matrix);
+ export_error("cannot create file");
+ return -1;
+ }
+ fprintf(fp,"P6 %d %d 1\n", WW, WH);
+
+ for(n=0;n<WH*WW;n++)
+ {
+ if (!fwrite(rgb1[(int) *(colour_matrix+n)], 3, 1, fp))
+ {
+ export_error("error while writting to file");
+ free(colour_matrix);
+ fclose(fp);
+ return -1;
+ }
+ }
+ free(colour_matrix);
+ fclose(fp);
+ return 0;
+}
+
+
+#ifdef WITH_PNG
+
+#include <png.h>
+static int png_open(struct export *e);
+static int png_option(struct export *e, int opt, char *arg);
+static int png_output(struct export *e, char *name, struct fmt_page *pg);
+static char *png_opts[] = // module options
+{
+ "compression=<0-9>", // set compression level
+ 0
+};
+
+struct png_data // private data in struct export
+{
+ int compression;
+};
+
+struct export_module export_png = // exported module definition
+{
+ "png", // id
+ "png", // extension
+ png_opts, // options
+ sizeof(struct png_data), // size
+ png_open, // open
+ 0, // close
+ png_option, // option
+ png_output // output
+};
+
+#define D ((struct png_data *)e->data)
+
+
+static int png_open(struct export *e)
+{
+ D->compression = Z_DEFAULT_COMPRESSION;
+ return 0;
+}
+
+
+static int png_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // compression=
+ if (*arg >= '0' && *arg <= '9')
+ D->compression = *arg - '0';
+ break;
+ }
+ return 0;
+}
+
+
+static int png_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ FILE *fp;
+ int x;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_byte *row_pointers[WH];
+ static u8 rgb8[][3]={{ 0, 0, 0},
+ {255, 0, 0},
+ { 0,255, 0},
+ {255,255, 0},
+ { 0, 0,255},
+ {255, 0,255},
+ { 0,255,255},
+ {255,255,255}};
+ unsigned char *colour_matrix;
+
+ if (!(colour_matrix=malloc(WH*WW)))
+ {
+ export_error("cannot allocate memory");
+ return -1;
+ }
+ prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);
+ if (not(fp = fopen(name, "w")))
+ {
+ free(colour_matrix);
+ export_error("cannot create file");
+ return -1;
+ }
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL);
+ if (!png_ptr)
+ {
+ free(colour_matrix);
+ fclose(fp);
+ export_error("libpng init error");
+ return -1;
+ }
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr)
+ {
+ png_destroy_write_struct(&png_ptr,
+ (png_infopp)NULL);
+ free(colour_matrix);
+ fclose(fp);
+ export_error("libpng init error");
+ return -1;
+ }
+ png_init_io(png_ptr, fp);
+ png_set_compression_level(png_ptr, D->compression);
+ png_set_compression_mem_level(png_ptr, 9);
+ png_set_compression_window_bits(png_ptr, 15);
+ png_set_IHDR(png_ptr, info_ptr, WW, WH,
+ 8, PNG_COLOR_TYPE_PALETTE , PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+ png_set_PLTE(png_ptr, info_ptr,(png_color*) rgb8 , 8);
+ png_write_info(png_ptr, info_ptr);
+ for(x=0; x<WH; x++)
+ { row_pointers[x]=colour_matrix+x*WW; }
+ png_write_image(png_ptr, row_pointers);
+ png_write_end(png_ptr, info_ptr);
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ free(colour_matrix);
+ fclose(fp);
+ return 0;
+}
+
+#endif
+
diff --git a/util/alevt/exp-html.c b/util/alevt/exp-html.c
new file mode 100644
index 0000000..6c9312a
--- /dev/null
+++ b/util/alevt/exp-html.c
@@ -0,0 +1,299 @@
+/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
+
+#include <stdio.h>
+#include <string.h>
+#include "lang.h"
+#include "export.h"
+
+static int html_open(struct export *e);
+static int html_option(struct export *e, int opt, char *arg);
+static int html_output(struct export *e, char *name, struct fmt_page *pg);
+static char *html_opts[] = // module options
+{
+ "gfx-chr=<char>", // substitute <char> for gfx-symbols
+ "bare", // no headers
+ 0
+};
+
+struct html_data // private data in struct export
+{
+ u8 gfx_chr;
+ u8 bare;
+};
+
+
+struct export_module export_html = // exported module definition
+{
+ "html", // id
+ "html", // extension
+ html_opts, // options
+ sizeof(struct html_data), // size
+ html_open, // open
+ 0, // close
+ html_option, // option
+ html_output // output
+};
+
+#define D ((struct html_data *)e->data)
+
+
+static int html_open(struct export *e)
+{
+ D->gfx_chr = '#';
+ D->bare = 0;
+ //e->reveal=1; // the default should be the same for all formats.
+ return 0;
+}
+
+
+static int html_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // gfx-chr=
+ D->gfx_chr = *arg ?: ' ';
+ break;
+ case 2: // bare (no headers)
+ D->bare=1;
+ break;
+ }
+ return 0;
+}
+
+#define HTML_BLACK "#000000"
+#define HTML_RED "#FF0000"
+#define HTML_GREEN "#00FF00"
+#define HTML_YELLOW "#FFFF00"
+#define HTML_BLUE "#0000FF"
+#define HTML_MAGENTA "#FF00FF"
+#define HTML_CYAN "#00FFFF"
+#define HTML_WHITE "#FFFFFF"
+
+#undef UNREADABLE_HTML //no '\n'
+#define STRIPPED_HTML //only necessary fields in header
+
+static int html_output(struct export *e, char *name, struct fmt_page *pg)
+{
+
+ const char* html_colours[]={ HTML_BLACK,
+ HTML_RED,
+ HTML_GREEN,
+ HTML_YELLOW,
+ HTML_BLUE,
+ HTML_MAGENTA,
+ HTML_CYAN,
+ HTML_WHITE};
+ FILE *fp;
+ int x, y;
+
+#ifdef UNREADABLE_HTML
+#define HTML_NL
+#else
+#define HTML_NL fputc('\n',fp);
+#endif
+
+ if (not(fp = fopen(name, "w")))
+ {
+ export_error("cannot create file");
+ return -1;
+ }
+
+if (!D->bare)
+ {
+#ifndef STRIPPED_HTML
+ fputs("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">",fp);
+ HTML_NL
+#endif
+ fputs("<html><head>",fp);
+ HTML_NL
+#ifndef STRIPPED_HTML
+ fputs("<meta http-equiv=\"Content-Type\" content=\"text/html;",fp);
+ switch(latin1) {
+ case LATIN1: fprintf(fp,"charset=iso-8859-1\">"); break;
+ case LATIN2: fprintf(fp,"charset=iso-8859-2\">"); break;
+ case KOI8: fprintf(fp,"charset=koi8-r\">"); break;
+ case GREEK: fprintf(fp,"charset=iso-8859-7\">"); break;
+ }
+ HTML_NL
+ fputs("<meta name=\"GENERATOR\" content=\"alevt-cap\">",fp);
+ HTML_NL
+#else
+ switch(latin1) {
+ case LATIN1: fprintf(fp,"<meta charset=iso-8859-1\">"); break;
+ case LATIN2: fprintf(fp,"<meta charset=iso-8859-2\">"); break;
+ case KOI8: fprintf(fp,"<meta charset=koi8-r\">"); break;
+ case GREEK: fprintf(fp,"<meta charset=iso-8859-7\">"); break;
+ }
+ HTML_NL
+#endif
+ fputs("</head>",fp);
+ fputs("<body text=\"#FFFFFF\" bgcolor=\"#000000\">",fp);
+ HTML_NL
+ } //bare
+
+ fputs("<tt><b>",fp);
+ HTML_NL
+
+ // write tables in form of HTML format
+ for (y = 0; y < 25; ++y)
+ {
+ int last_nonblank=0;
+ int first_unprinted=0;
+ int last_space=1;
+ // previous char was &nbsp;
+ // is used for deciding to put semicolon or not
+ int nbsp=0;
+
+ // for output filled with ' ' up to 40 chars
+ // set last_nonblank=39
+ for (x = 0 ; x < 40; ++x)
+ {
+ if (pg->data[y][x].attr & EA_GRAPHIC)
+ {pg->data[y][x].ch= D->gfx_chr;}
+
+ if (pg->data[y][x].ch!=' ')
+ {
+ last_nonblank=x;
+ }
+ }
+
+ for (x = 0 ; x <= last_nonblank ; ++x)
+ {
+ if (pg->data[y][x].ch==' ')
+ {
+ // if single space between blinking/colour words
+ // then make the space blinking/colour too
+ if ((x)&&(x<39))
+ {
+ if ((pg->data[y][x-1].ch!=' ')
+ &&(pg->data[y][x+1].ch!=' ')
+ &&(pg->data[y][x-1].attr & EA_BLINK)
+ &&(pg->data[y][x+1].attr & EA_BLINK))
+ {pg->data[y][x].attr |= EA_BLINK;}
+ else
+ {pg->data[y][x].attr &= ~EA_BLINK;}
+
+ if ((pg->data[y][x-1].ch!=' ')
+ &&(pg->data[y][x+1].ch!=' ')
+ &&(pg->data[y][x-1].fg==pg->data[y][x+1].fg))
+ {pg->data[y][x].fg=pg->data[y][x-1].fg;}
+ else
+ pg->data[y][x].fg=7;
+ }
+ else
+ {
+ pg->data[y][x].attr &= ~EA_BLINK;
+ pg->data[y][x].fg=7;
+ }
+ }
+ else
+ {
+ // if foreground is black set the foreground to previous
+ // background colour to let it be visible
+ if (!pg->data[y][x].fg)
+ {pg->data[y][x].fg=pg->data[y][x].bg;}
+ }
+ //check if attributes changed,
+ //if yes then print chars and update first_unprinted
+ //if not then go to next char
+ if (x)
+ {
+ if (((
+ (pg->data[y][x].attr & EA_BLINK)
+ ==
+ (pg->data[y][x-1].attr & EA_BLINK)
+ )
+ &&
+ (
+ pg->data[y][x].fg == pg->data[y][x-1].fg
+ ))
+ &&(x!=last_nonblank))
+
+ { continue; }
+ }
+ else continue;
+
+ {
+ int z=first_unprinted;
+ for(;(pg->data[y][z].ch==' ') && (z<x);z++)
+ {
+ if (last_space)
+ {
+ fprintf(fp,"&nbsp");
+ last_space=0;
+ nbsp=1;
+ }
+ else
+ {
+ fputc(' ',fp);
+ last_space=1;
+ nbsp=0;
+ }
+ }
+
+ first_unprinted=z;
+
+ if (z==x) continue;
+
+ if (pg->data[y][first_unprinted].attr & EA_BLINK)
+ {
+ fprintf(fp,"<blink>");
+ nbsp=0;
+ }
+
+ if (pg->data[y][first_unprinted].fg!=7)
+ {
+ fprintf(fp,"<font color=\"%s\">",
+ html_colours[pg->data[y][first_unprinted].fg]);
+ nbsp=0;
+ }
+ for(;(z<x)||(z==last_nonblank);z++)
+ {
+
+ if (pg->data[y][z].ch==' ')
+ {
+ for(;(pg->data[y][z].ch==' ') && (z<x);z++)
+ {
+ if (last_space)
+ {
+ fprintf(fp,"&nbsp");
+ last_space=0;
+ nbsp=1;
+ }
+ else
+ {
+ fputc(' ',fp);
+ last_space=1;
+ nbsp=0;
+ }
+ }
+ z--;
+ }
+ else
+ {
+ //if previous nbsp --> put semicolon!!!
+ if (nbsp) fputc(';',fp);
+ fputc(pg->data[y][z].ch,fp);
+ last_space=0;
+ nbsp=0;
+ }
+ }
+ if (pg->data[y][first_unprinted].fg!=7)
+ {
+ fprintf(fp,"</font>");
+ }
+ if (pg->data[y][first_unprinted].attr & EA_BLINK)
+ fprintf(fp,"</blink>");
+
+ first_unprinted=z;
+ }
+ }
+ fputs("<br>",fp);
+ HTML_NL
+ }
+ fputs("</b></tt>",fp);
+ if (!D->bare)
+ fputs("</body></html>",fp);
+ fclose(fp);
+ return 0;
+}
diff --git a/util/alevt/exp-txt.c b/util/alevt/exp-txt.c
new file mode 100644
index 0000000..8009c17
--- /dev/null
+++ b/util/alevt/exp-txt.c
@@ -0,0 +1,226 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os.h"
+#include "export.h"
+
+static int txt_open(struct export *e);
+static int txt_option(struct export *e, int opt, char *arg);
+static int txt_output(struct export *e, char *name, struct fmt_page *pg);
+static char *txt_opts[] = // module options
+{
+ "color", // generate ansi color codes (and attributes)
+ "gfx-chr=<char>", // substitute <char> for gfx-symbols
+ "fg=<0-7|none>", // assume term has <x> as foreground color
+ "bg=<0-7|none>", // assume term has <x> as background color
+ "lines=<1-25>", // output 24 or 25 lines
+ 0
+};
+
+
+struct txt_data // private data in struct export
+{
+ u8 color;
+ u8 gfx_chr;
+ u8 def_fg;
+ u8 def_bg;
+ int endline;
+ struct fmt_char curr[1];
+ FILE *fp;
+};
+
+
+struct export_module export_txt = // exported module definition
+{
+ "ascii", // id
+ "txt", // extension
+ txt_opts, // options
+ sizeof(struct txt_data), // data size
+ txt_open, // open
+ 0, // close
+ txt_option, // option
+ txt_output, // output
+};
+
+
+struct export_module export_ansi = // exported module definition
+{
+ "ansi", // id
+ "txt", // extension
+ txt_opts, // options
+ sizeof(struct txt_data), // data size
+ txt_open, // open
+ 0, // close
+ txt_option, // option
+ txt_output, // output
+};
+
+#define D ((struct txt_data *)e->data)
+
+
+char * my_stpcpy(char *dst, const char *src)
+{
+ while (*dst = *src++)
+ dst++;
+ return dst;
+}
+
+
+static int txt_open(struct export *e)
+{
+ D->gfx_chr = '#';
+ D->def_fg = -1;
+ D->def_bg = -1;
+ D->endline = H;
+ if (e->mod == &export_ansi)
+ D->color = 1;
+ return 0;
+}
+
+
+static int txt_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // color
+ D->color = 1;
+ break;
+ case 2: // gfx-chr=
+ D->gfx_chr = *arg ?: ' ';
+ break;
+ case 3: // fg=
+ D->def_fg = *arg - '0';
+ break;
+ case 4: // bg=
+ D->def_bg = *arg - '0';
+ break;
+ case 5: // lines=
+ D->endline = atoi(arg);
+ if (D->endline < 1 || D->endline > H)
+ {
+ export_error("lines: invalid number");
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+static void put_attr(struct export *e, struct fmt_char *new)
+{
+ char buf[512];
+ char *p = buf;
+ int fg, bg, attr;
+ int reset = 0;
+
+ if (D->color)
+ {
+ fg = D->curr->fg ^ new->fg;
+ bg = D->curr->bg ^ new->bg;
+ attr = (D->curr->attr ^ new->attr) & (EA_BLINK | EA_DOUBLE);
+
+ if (fg | bg | attr)
+ {
+ if (~new->attr & attr) // reset some attributes -> reset all.
+ reset = 1;
+ if (fg && new->fg == D->def_fg) // switch to def fg -> reset all
+ reset = 1;
+ if (bg && new->bg == D->def_bg) // switch to def bg -> reset all
+ reset = 1;
+
+ p = my_stpcpy(buf, "\e[");
+ if (reset)
+ {
+ p = my_stpcpy(p, ";"); // "0;" but 0 isn't neccesary
+ attr = -1; // set all attributes
+ fg = new->fg ^ D->def_fg; // set fg if != default fg
+ bg = new->bg ^ D->def_bg; // set bg if != default bg
+ }
+ if (attr & new->attr & EA_BLINK)
+ p = my_stpcpy(p, "5;"); // blink
+ if (attr & new->attr & EA_DOUBLE)
+ p = my_stpcpy(p, "1;"); // bold
+ if (fg)
+ p += sprintf(p, "%d;", new->fg + 30); // fg-color
+ if (bg)
+ p += sprintf(p, "%d;", new->bg + 40); // bg-color
+ p[-1] = 'm'; // replace last ;
+ *D->curr = *new;
+ }
+ }
+ *p++ = new->ch;
+ *p = 0;
+ fputs(buf, D->fp);
+}
+
+
+static int txt_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ struct fmt_char def_c[1];
+ struct fmt_char l[W+2];
+ #define L (l+1)
+ int x, y;
+
+ D->fp = fopen(name, "w");
+ if (not D->fp)
+ {
+ export_error("cannot create file");
+ return -1;
+ }
+
+ /* initialize default colors. These have to be restored at EOL. */
+ def_c->ch = '\n';
+ def_c->fg = D->def_fg;
+ def_c->bg = D->def_bg;
+ def_c->attr = E_DEF_ATTR;
+ *D->curr = *def_c;
+ L[-1] = L[W] = *def_c;
+
+ for (y = 0; y < D->endline; y++)
+ if (~pg->hid & (1 << y)) // not hidden
+ {
+ // character conversion
+ for (x = 0; x < W; ++x)
+ {
+ struct fmt_char c = pg->data[y][x];
+
+ switch (c.ch)
+ {
+ case 0x00: case 0xa0: c.ch = ' '; break;
+ case 0x7f: c.ch = '*'; break;
+ case BAD_CHAR: c.ch = '?'; break;
+ default:
+ if (c.attr & EA_GRAPHIC)
+ c.ch = D->gfx_chr;
+ break;
+ }
+ L[x] = c;
+ }
+
+ if (D->color)
+ {
+ // optimize color and attribute changes
+ // delay fg and attr changes as far as possible
+ for (x = 0; x < W; ++x)
+ if (L[x].ch == ' ')
+ {
+ L[x].fg = L[x-1].fg;
+ l[x].attr = L[x-1].attr;
+ }
+
+ // move fg and attr changes to prev bg change point
+ for (x = W-1; x >= 0; x--)
+ if (L[x].ch == ' ' && L[x].bg == L[x+1].bg)
+ {
+ L[x].fg = L[x+1].fg;
+ L[x].attr = L[x+1].attr;
+ }
+ }
+
+ // now emit the whole line (incl EOL)
+ for (x = 0; x < W+1; ++x)
+ put_attr(e, L + x);
+ }
+ fclose(D->fp);
+ return 0;
+}
diff --git a/util/alevt/export.c b/util/alevt/export.c
new file mode 100644
index 0000000..1eb8ea9
--- /dev/null
+++ b/util/alevt/export.c
@@ -0,0 +1,364 @@
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "vt.h"
+#include "misc.h"
+#include "export.h"
+
+extern struct export_module export_txt;
+extern struct export_module export_ansi;
+extern struct export_module export_html;
+extern struct export_module export_png;
+extern struct export_module export_ppm;
+struct export_module *modules[] =
+{
+ &export_txt,
+ &export_ansi,
+ &export_html,
+ &export_ppm,
+#ifdef WITH_PNG
+ &export_png,
+#endif
+ 0
+};
+
+
+static char *glbl_opts[] =
+{
+ "reveal", // show hidden text
+ "hide", // don't show hidden text (default)
+ 0
+};
+
+static char errbuf[64];
+
+
+void export_error(char *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ vsnprintf(errbuf, sizeof(errbuf)-1, str, args);
+}
+
+
+char * export_errstr(void)
+{
+ return errbuf;
+}
+
+
+static int find_opt(char **opts, char *opt, char *arg)
+{
+ int err = 0;
+ char buf[256];
+ char **oo, *o, *a;
+
+ if (oo = opts)
+ while (o = *oo++)
+ {
+ if (a = strchr(o, '='))
+ {
+ a = buf + (a - o);
+ o = strcpy(buf, o);
+ *a++ = 0;
+ }
+ if (strcasecmp(o, opt) == 0)
+ {
+ if ((a != 0) == (arg != 0))
+ return oo - opts;
+ err = -1;
+ }
+ }
+ return err;
+}
+
+
+struct export * export_open(char *fmt)
+{
+ struct export_module **eem, *em;
+ struct export *e;
+ char *opt, *optend, *optarg;
+ int opti;
+
+ if (fmt = strdup(fmt))
+ {
+ if (opt = strchr(fmt, ','))
+ *opt++ = 0;
+ for (eem = modules; em = *eem; eem++)
+ if (strcasecmp(em->fmt_name, fmt) == 0)
+ break;
+ if (em)
+ {
+ if (e = malloc(sizeof(*e) + em->local_size))
+ {
+ e->mod = em;
+ e->fmt_str = fmt;
+ e->reveal = 0;
+ memset(e + 1, 0, em->local_size);
+ if (not em->open || em->open(e) == 0)
+ {
+ for (; opt; opt = optend)
+ {
+ if (optend = strchr(opt, ','))
+ *optend++ = 0;
+ if (not *opt)
+ continue;
+ if (optarg = strchr(opt, '='))
+ *optarg++ = 0;
+ if ((opti = find_opt(glbl_opts, opt, optarg)) > 0)
+ {
+ if (opti == 1) // reveal
+ e->reveal = 1;
+ else if (opti == 2) // hide
+ e->reveal = 0;
+ }
+ else if (opti == 0 &&
+ (opti = find_opt(em->options, opt, optarg)) > 0)
+ {
+ if (em->option(e, opti, optarg))
+ break;
+ }
+ else
+ {
+ if (opti == 0)
+ export_error("%s: unknown option", opt);
+ else if (optarg)
+ export_error("%s: takes no arg", opt);
+ else
+ export_error("%s: missing arg", opt);
+ break;
+ }
+ }
+ if (opt == 0)
+ return e;
+
+ if (em->close)
+ em->close(e);
+ }
+ free(e);
+ }
+ else
+ export_error("out of memory");
+ }
+ else
+ export_error("unknown format: %s", fmt);
+ free(fmt);
+ }
+ else
+ export_error("out of memory");
+ return 0;
+}
+
+
+void export_close(struct export *e)
+{
+ if (e->mod->close)
+ e->mod->close(e);
+ free(e->fmt_str);
+ free(e);
+}
+
+
+static char * hexnum(char *buf, unsigned int num)
+{
+ char *p = buf + 5;
+
+ num &= 0xffff;
+ *--p = 0;
+ do
+ {
+ *--p = "0123456789abcdef"[num % 16];
+ num /= 16;
+ } while (num);
+ return p;
+}
+
+
+static char * adjust(char *p, char *str, char fill, int width)
+{
+ int l = width - strlen(str);
+
+ while (l-- > 0)
+ *p++ = fill;
+ while (*p = *str++)
+ p++;
+ return p;
+}
+
+
+char * export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr)
+{
+ char bbuf[1024];
+ char *p = bbuf;
+
+ while (*p = *fmt++)
+ if (*p++ == '%')
+ {
+ char buf[32], buf2[32];
+ int width = 0;
+
+ p--;
+ while (*fmt >= '0' && *fmt <= '9')
+ width = width*10 + *fmt++ - '0';
+
+ switch (*fmt++)
+ {
+ case '%':
+ p = adjust(p, "%", '%', width);
+ break;
+ case 'e': // extension
+ p = adjust(p, e->mod->extension, '.', width);
+ break;
+ case 'p': // pageno[.subno]
+ if (vtp->subno)
+ p = adjust(p,strcat(strcat(hexnum(buf, vtp->pgno),
+ "."), hexnum(buf2, vtp->subno)), ' ', width);
+ else
+ p = adjust(p, hexnum(buf, vtp->pgno), ' ', width);
+ break;
+ case 'S': // subno
+ p = adjust(p, hexnum(buf, vtp->subno), '0', width);
+ break;
+ case 'P': // pgno
+ p = adjust(p, hexnum(buf, vtp->pgno), '0', width);
+ break;
+ case 's': // user strin
+ p = adjust(p, usr, ' ', width);
+ break;
+ //TODO: add date, channel name, ...
+ }
+ }
+ p = strdup(bbuf);
+ if (not p)
+ export_error("out of memory");
+ return p;
+}
+
+
+static void fmt_page(struct export *e, struct fmt_page *pg, struct vt_page *vtp)
+{
+ char buf[16];
+ int x, y;
+ u8 *p = vtp->data[0];
+
+ pg->dbl = 0;
+
+ sprintf(buf, "\2%x.%02x\7", vtp->pgno, vtp->subno & 0xff);
+
+ for (y = 0; y < H; y++)
+ {
+ struct fmt_char c;
+ int last_ch = ' ';
+ int dbl = 0, hold = 0;
+
+ c.fg = 7;
+ c.bg = 0;
+ c.attr = 0;
+
+ for (x = 0; x < W; ++x)
+ {
+ c.ch = *p++;
+ if (y == 0 && x < 8)
+ c.ch = buf[x];
+ switch (c.ch)
+ {
+ case 0x00 ... 0x07: /* alpha + fg color */
+ c.fg = c.ch & 7;
+ c.attr &= ~(EA_GRAPHIC | EA_CONCEALED);
+ goto ctrl;
+ case 0x08: /* flash */
+ c.attr |= EA_BLINK;
+ goto ctrl;
+ case 0x09: /* steady */
+ c.attr &= ~EA_BLINK;
+ goto ctrl;
+ case 0x0a: /* end box */
+ case 0x0b: /* start box */
+ goto ctrl;
+ case 0x0c: /* normal height */
+ c.attr &= EA_DOUBLE;
+ goto ctrl;
+ case 0x0d: /* double height */
+ if (y < H-2) /* ignored on last 2 lines */
+ {
+ c.attr |= EA_DOUBLE;
+ dbl = 1;
+ }
+ goto ctrl;
+ case 0x10 ... 0x17: /* gfx + fg color */
+ c.fg = c.ch & 7;
+ c.attr |= EA_GRAPHIC;
+ c.attr &= ~EA_CONCEALED;
+ goto ctrl;
+ case 0x18: /* conceal */
+ c.attr |= EA_CONCEALED;
+ goto ctrl;
+ case 0x19: /* contiguous gfx */
+ c.attr &= ~EA_SEPARATED;
+ goto ctrl;
+ case 0x1a: /* separate gfx */
+ c.attr |= EA_SEPARATED;
+ goto ctrl;
+ case 0x1c: /* black bg */
+ c.bg = 0;
+ goto ctrl;
+ case 0x1d: /* new bg */
+ c.bg = c.fg;
+ goto ctrl;
+ case 0x1e: /* hold gfx */
+ hold = 1;
+ goto ctrl;
+ case 0x1f: /* release gfx */
+ hold = 0;
+ goto ctrl;
+
+ case 0x0e: /* SO */
+ case 0x0f: /* SI */
+ case 0x1b: /* ESC */
+ c.ch = ' ';
+ break;
+
+ ctrl:
+ c.ch = ' ';
+ if (hold && (c.attr & EA_GRAPHIC))
+ c.ch = last_ch;
+ break;
+ }
+ if (c.attr & EA_GRAPHIC)
+ if ((c.ch & 0xa0) == 0x20)
+ {
+ last_ch = c.ch;
+ c.ch += (c.ch & 0x40) ? 32 : -32;
+ }
+ if (c.attr & EA_CONCEALED)
+ if (not e->reveal)
+ c.ch = ' ';
+ pg->data[y][x] = c;
+ }
+ if (dbl)
+ {
+ pg->dbl |= 1 << y;
+ for (x = 0; x < W; ++x)
+ {
+ if (~pg->data[y][x].attr & EA_DOUBLE)
+ pg->data[y][x].attr |= EA_HDOUBLE;
+ pg->data[y+1][x] = pg->data[y][x];
+ pg->data[y+1][x].ch = ' ';
+ }
+ y++;
+ p += W;
+ }
+ }
+ pg->hid = pg->dbl << 1;
+}
+
+
+int export(struct export *e, struct vt_page *vtp, char *name)
+{
+ struct fmt_page pg[1];
+
+ fmt_page(e, pg, vtp);
+ return e->mod->output(e, name, pg);
+}
diff --git a/util/alevt/export.h b/util/alevt/export.h
new file mode 100644
index 0000000..a08875c
--- /dev/null
+++ b/util/alevt/export.h
@@ -0,0 +1,66 @@
+#ifndef EXPORT_H
+#define EXPORT_H
+
+#include "vt.h"
+#include "misc.h"
+
+
+struct fmt_char
+{
+ u8 ch, fg, bg, attr;
+};
+
+#define EA_DOUBLE 1 // double height char
+#define EA_HDOUBLE 2 // single height char in double height line
+#define EA_BLINK 4 // blink
+#define EA_CONCEALED 8 // concealed
+#define EA_GRAPHIC 16 // graphic symbol
+#define EA_SEPARATED 32 // use separated graphic symbol
+
+#define E_DEF_FG 7
+#define E_DEF_BG 0
+#define E_DEF_ATTR 0
+
+
+struct fmt_page
+{
+ struct vt_page *vtp;
+ u32 dbl, hid;
+ struct fmt_char data[H][W];
+};
+
+
+struct export
+{
+ struct export_module *mod; // module type
+ char *fmt_str; // saved option string (splitted)
+ // global options
+ int reveal; // reveal hidden chars
+ // local data for module's use. initialized to 0.
+ struct { int dummy; } data[0];
+};
+
+
+struct export_module
+{
+ char *fmt_name; // the format type name (ASCII/HTML/PNG/...)
+ char *extension; // the default file name extension
+ char **options; // module options
+ int local_size;
+ int (*open)(struct export *fmt);
+ void (*close)(struct export *fmt);
+ int (*option)(struct export *fmt, int opt, char *arg);
+ int (*output)(struct export *fmt, char *name, struct fmt_page *pg);
+};
+
+
+extern struct export_module *modules[]; // list of modules (for help msgs)
+void export_error(char *str, ...); // set error
+char *export_errstr(void); // return last error
+char *export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr);
+
+
+struct export *export_open(char *fmt);
+void export_close(struct export *e);
+int export(struct export *e, struct vt_page *vtp, char *user_str);
+#endif
diff --git a/util/alevt/fdset.c b/util/alevt/fdset.c
new file mode 100644
index 0000000..99edac4
--- /dev/null
+++ b/util/alevt/fdset.c
@@ -0,0 +1,97 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include "dllist.h"
+#include "misc.h"
+#include "fdset.h"
+
+struct fdset fds[1]; /* global fd list */
+
+
+int fdset_init(struct fdset *fds)
+{
+ dl_init(fds->list);
+ fds->del_count = 0;
+ return 0;
+}
+
+
+int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data)
+{
+ struct fdset_node *fn;
+
+ if (fd < 0)
+ return -1;
+ if (handler == 0)
+ return -1;
+
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (fn->fd == fd)
+ return -1;
+
+ if (not(fn = malloc(sizeof(*fn))))
+ return -1;
+ fn->fd = fd;
+ fn->handler = handler;
+ fn->data = data;
+ dl_insert_last(fds->list, fn->node);
+ return 0;
+}
+
+
+int fdset_del_fd(struct fdset *fds, int fd)
+{
+ struct fdset_node *fn;
+
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (fn->fd == fd)
+ {
+ dl_remove(fn->node);
+ free(fn);
+ fds->del_count++;
+ return 0;
+ }
+ return -1;
+}
+
+
+int fdset_select(struct fdset *fds, int timeout)
+{
+ struct fdset_node *fn;
+ fd_set rfds[1];
+ struct timeval tv[1], *tvp = 0;
+ int max_fd, x, del_count;
+
+ FD_ZERO(rfds);
+ max_fd = 0;
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ {
+ FD_SET(fn->fd, rfds);
+ if (fn->fd >= max_fd)
+ max_fd = fn->fd + 1;
+ }
+
+ if (timeout >= 0)
+ {
+ tv->tv_sec = timeout/1000;
+ tv->tv_usec = timeout%1000*1000;
+ tvp = tv;
+ }
+
+ x = select(max_fd, rfds, 0, 0, tvp);
+ if (x <= 0)
+ return x;
+
+ /* A little bit complicated. A called handler may modify the fdset... */
+restart:
+ del_count = fds->del_count;
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (FD_ISSET(fn->fd, rfds))
+ {
+ FD_CLR(fn->fd, rfds);
+ fn->handler(fn->data, fn->fd);
+ if (fds->del_count != del_count)
+ goto restart;
+ }
+ return 1;
+}
diff --git a/util/alevt/fdset.h b/util/alevt/fdset.h
new file mode 100644
index 0000000..4b786e6
--- /dev/null
+++ b/util/alevt/fdset.h
@@ -0,0 +1,28 @@
+#ifndef FDSET_H
+#define FDSET_H
+
+#include "dllist.h"
+
+
+struct fdset
+{
+ struct dl_head list[1];
+ int del_count;
+};
+
+
+struct fdset_node /*internal*/
+{
+ struct dl_node node[1];
+ int fd;
+ void (*handler)(void *data, int fd);
+ void *data;
+};
+
+extern struct fdset fds[1]; /* global fd list */
+
+int fdset_init(struct fdset *fds);
+int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data);
+int fdset_del_fd(struct fdset *fds, int fd);
+int fdset_select(struct fdset *fds, int timeout /*millisec*/);
+#endif
diff --git a/util/alevt/font.c b/util/alevt/font.c
new file mode 100644
index 0000000..da0e448
--- /dev/null
+++ b/util/alevt/font.c
@@ -0,0 +1,5 @@
+#define static /* I want them global */
+#include "font1.xbm"
+#include "font2.xbm"
+#include "font3.xbm"
+#include "font4.xbm"
diff --git a/util/alevt/font.h b/util/alevt/font.h
new file mode 100644
index 0000000..c17c4bc
--- /dev/null
+++ b/util/alevt/font.h
@@ -0,0 +1,19 @@
+#ifndef FONT_H
+#define FONT_H
+
+#include "fontsize.h" /* the #defines from font?.xbm */
+
+#if font1_width != font2_width || font1_height != font2_height
+#error different font sizes.
+#endif
+
+extern unsigned char font1_bits[];
+extern unsigned char font2_bits[];
+extern unsigned char font3_bits[];
+extern unsigned char font4_bits[];
+
+#define font_width font1_width
+#define font_height font1_height
+#define CW (font_width/32) /* pixel width of a character */
+#define CH (font_height/8) /* pixel height of a character */
+#endif
diff --git a/util/alevt/hamm.c b/util/alevt/hamm.c
new file mode 100644
index 0000000..c44a902
--- /dev/null
+++ b/util/alevt/hamm.c
@@ -0,0 +1,229 @@
+#include "vt.h"
+#include "hamm.h"
+
+// table to decode hamm8/4 encoded bytes.
+// the low 4 bits are the (corrected) data bits
+// bit 8 is set if there was a single bit error
+// bit 12 is set if there was an uncorrectable error
+
+// the idea: you may add up to 15 words and get the
+// number of single bit errors in b8-b11 and the number
+// of double errors in b12-b15
+
+
+static unsigned short hammtab[256] =
+{
+ 0x0101, 0x100f, 0x0001, 0x0101, 0x100f, 0x0100, 0x0101, 0x100f,
+ 0x100f, 0x0102, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0100, 0x0101, 0x100f, 0x0100, 0x0000, 0x100f, 0x0100,
+ 0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
+ 0x0106, 0x100f, 0x100f, 0x0107, 0x100f, 0x0107, 0x0107, 0x0007,
+ 0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x010d, 0x100f,
+ 0x0006, 0x0106, 0x0106, 0x100f, 0x0106, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0102, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
+ 0x0102, 0x0002, 0x100f, 0x0102, 0x100f, 0x0102, 0x0103, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x0103, 0x100f,
+ 0x100f, 0x0102, 0x0103, 0x100f, 0x0103, 0x100f, 0x0003, 0x0103,
+ 0x0104, 0x100f, 0x100f, 0x0105, 0x0004, 0x0104, 0x0104, 0x100f,
+ 0x100f, 0x0102, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0105, 0x0105, 0x0005, 0x0104, 0x100f, 0x100f, 0x0105,
+ 0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
+ 0x010a, 0x100f, 0x100f, 0x010b, 0x000a, 0x010a, 0x010a, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x010d, 0x100f,
+ 0x100f, 0x010b, 0x010b, 0x000b, 0x010a, 0x100f, 0x100f, 0x010b,
+ 0x010c, 0x000c, 0x100f, 0x010c, 0x100f, 0x010c, 0x010d, 0x100f,
+ 0x100f, 0x010c, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x010c, 0x010d, 0x100f, 0x010d, 0x100f, 0x000d, 0x010d,
+ 0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x010d, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0109, 0x100f, 0x0109, 0x0109, 0x0009,
+ 0x100f, 0x0102, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
+ 0x0008, 0x0108, 0x0108, 0x100f, 0x0108, 0x100f, 0x100f, 0x0109,
+ 0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
+ 0x010f, 0x100f, 0x000f, 0x010f, 0x100f, 0x010e, 0x010f, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x010d, 0x100f,
+ 0x100f, 0x010e, 0x010f, 0x100f, 0x010e, 0x000e, 0x100f, 0x010e,
+};
+
+#if 0 // this information is contained in hamm24par bit 5
+// simple parity table (sum of 1 bits modulo 2)
+
+
+static char odd_parity[256] =
+{
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0
+};
+#endif
+
+// this table generates the parity checks for hamm24/18 decoding.
+// bit 0 is for test A, 1 for B, ...
+// thanks to R. Gancarz for this fine table *g*
+
+
+static char hamm24par[3][256] =
+{
+ { // parities of first byte
+ 0, 33, 34, 3, 35, 2, 1, 32, 36, 5, 6, 39, 7, 38, 37, 4,
+ 37, 4, 7, 38, 6, 39, 36, 5, 1, 32, 35, 2, 34, 3, 0, 33,
+ 38, 7, 4, 37, 5, 36, 39, 6, 2, 35, 32, 1, 33, 0, 3, 34,
+ 3, 34, 33, 0, 32, 1, 2, 35, 39, 6, 5, 36, 4, 37, 38, 7,
+ 39, 6, 5, 36, 4, 37, 38, 7, 3, 34, 33, 0, 32, 1, 2, 35,
+ 2, 35, 32, 1, 33, 0, 3, 34, 38, 7, 4, 37, 5, 36, 39, 6,
+ 1, 32, 35, 2, 34, 3, 0, 33, 37, 4, 7, 38, 6, 39, 36, 5,
+ 36, 5, 6, 39, 7, 38, 37, 4, 0, 33, 34, 3, 35, 2, 1, 32,
+ 40, 9, 10, 43, 11, 42, 41, 8, 12, 45, 46, 15, 47, 14, 13, 44,
+ 13, 44, 47, 14, 46, 15, 12, 45, 41, 8, 11, 42, 10, 43, 40, 9,
+ 14, 47, 44, 13, 45, 12, 15, 46, 42, 11, 8, 41, 9, 40, 43, 10,
+ 43, 10, 9, 40, 8, 41, 42, 11, 15, 46, 45, 12, 44, 13, 14, 47,
+ 15, 46, 45, 12, 44, 13, 14, 47, 43, 10, 9, 40, 8, 41, 42, 11,
+ 42, 11, 8, 41, 9, 40, 43, 10, 14, 47, 44, 13, 45, 12, 15, 46,
+ 41, 8, 11, 42, 10, 43, 40, 9, 13, 44, 47, 14, 46, 15, 12, 45,
+ 12, 45, 46, 15, 47, 14, 13, 44, 40, 9, 10, 43, 11, 42, 41, 8
+ }, { // parities of second byte
+ 0, 41, 42, 3, 43, 2, 1, 40, 44, 5, 6, 47, 7, 46, 45, 4,
+ 45, 4, 7, 46, 6, 47, 44, 5, 1, 40, 43, 2, 42, 3, 0, 41,
+ 46, 7, 4, 45, 5, 44, 47, 6, 2, 43, 40, 1, 41, 0, 3, 42,
+ 3, 42, 41, 0, 40, 1, 2, 43, 47, 6, 5, 44, 4, 45, 46, 7,
+ 47, 6, 5, 44, 4, 45, 46, 7, 3, 42, 41, 0, 40, 1, 2, 43,
+ 2, 43, 40, 1, 41, 0, 3, 42, 46, 7, 4, 45, 5, 44, 47, 6,
+ 1, 40, 43, 2, 42, 3, 0, 41, 45, 4, 7, 46, 6, 47, 44, 5,
+ 44, 5, 6, 47, 7, 46, 45, 4, 0, 41, 42, 3, 43, 2, 1, 40,
+ 48, 25, 26, 51, 27, 50, 49, 24, 28, 53, 54, 31, 55, 30, 29, 52,
+ 29, 52, 55, 30, 54, 31, 28, 53, 49, 24, 27, 50, 26, 51, 48, 25,
+ 30, 55, 52, 29, 53, 28, 31, 54, 50, 27, 24, 49, 25, 48, 51, 26,
+ 51, 26, 25, 48, 24, 49, 50, 27, 31, 54, 53, 28, 52, 29, 30, 55,
+ 31, 54, 53, 28, 52, 29, 30, 55, 51, 26, 25, 48, 24, 49, 50, 27,
+ 50, 27, 24, 49, 25, 48, 51, 26, 30, 55, 52, 29, 53, 28, 31, 54,
+ 49, 24, 27, 50, 26, 51, 48, 25, 29, 52, 55, 30, 54, 31, 28, 53,
+ 28, 53, 54, 31, 55, 30, 29, 52, 48, 25, 26, 51, 27, 50, 49, 24
+ }, { // parities of third byte
+ 63, 14, 13, 60, 12, 61, 62, 15, 11, 58, 57, 8, 56, 9, 10, 59,
+ 10, 59, 56, 9, 57, 8, 11, 58, 62, 15, 12, 61, 13, 60, 63, 14,
+ 9, 56, 59, 10, 58, 11, 8, 57, 61, 12, 15, 62, 14, 63, 60, 13,
+ 60, 13, 14, 63, 15, 62, 61, 12, 8, 57, 58, 11, 59, 10, 9, 56,
+ 8, 57, 58, 11, 59, 10, 9, 56, 60, 13, 14, 63, 15, 62, 61, 12,
+ 61, 12, 15, 62, 14, 63, 60, 13, 9, 56, 59, 10, 58, 11, 8, 57,
+ 62, 15, 12, 61, 13, 60, 63, 14, 10, 59, 56, 9, 57, 8, 11, 58,
+ 11, 58, 57, 8, 56, 9, 10, 59, 63, 14, 13, 60, 12, 61, 62, 15,
+ 31, 46, 45, 28, 44, 29, 30, 47, 43, 26, 25, 40, 24, 41, 42, 27,
+ 42, 27, 24, 41, 25, 40, 43, 26, 30, 47, 44, 29, 45, 28, 31, 46,
+ 41, 24, 27, 42, 26, 43, 40, 25, 29, 44, 47, 30, 46, 31, 28, 45,
+ 28, 45, 46, 31, 47, 30, 29, 44, 40, 25, 26, 43, 27, 42, 41, 24,
+ 40, 25, 26, 43, 27, 42, 41, 24, 28, 45, 46, 31, 47, 30, 29, 44,
+ 29, 44, 47, 30, 46, 31, 28, 45, 41, 24, 27, 42, 26, 43, 40, 25,
+ 30, 47, 44, 29, 45, 28, 31, 46, 42, 27, 24, 41, 25, 40, 43, 26,
+ 43, 26, 25, 40, 24, 41, 42, 27, 31, 46, 45, 28, 44, 29, 30, 47
+ }
+};
+
+// table to extract the lower 4 bit from hamm24/18 encoded bytes
+
+
+static char hamm24val[256] =
+{
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+ 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9,
+ 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
+ 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
+ 14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15,
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+ 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9,
+ 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
+ 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
+ 14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15
+};
+
+// mapping from parity checks made by table hamm24par to error
+// results return by hamm24.
+// (0 = no error, 0x0100 = single bit error, 0x1000 = double error)
+
+
+static short hamm24err[64] =
+{
+ 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+};
+
+// mapping from parity checks made by table hamm24par to faulty bit
+// in the decoded 18 bit word.
+
+
+static int hamm24cor[64] =
+{
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00001, 0x00000, 0x00002, 0x00004, 0x00008,
+ 0x00000, 0x00010, 0x00020, 0x00040, 0x00080, 0x00100, 0x00200, 0x00400,
+ 0x00000, 0x00800, 0x01000, 0x02000, 0x04000, 0x08000, 0x10000, 0x20000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+};
+
+
+int hamm8(u8 *p, int *err)
+{
+ int a = hammtab[p[0]];
+ *err += a;
+ return a & 15;
+}
+
+
+int hamm16(u8 *p, int *err)
+{
+ int a = hammtab[p[0]];
+ int b = hammtab[p[1]];
+ *err += a;
+ *err += b;
+ return (a & 15) | (b & 15) * 16;
+}
+
+
+int hamm24(u8 *p, int *err)
+{
+ int e = hamm24par[0][p[0]] ^ hamm24par[1][p[1]] ^ hamm24par[2][p[2]];
+ int x = hamm24val[p[0]] + p[1] % 128 * 16 + p[2] % 128 * 2048;
+ *err += hamm24err[e];
+ return x ^ hamm24cor[e];
+}
+
+
+int chk_parity(u8 *p, int n)
+{
+ int err;
+ for (err = 0; n--; p++)
+ if (hamm24par[0][*p] & 32)
+ *p &= 0x7f;
+ else
+ *p = BAD_CHAR, err++;
+ return err;
+}
diff --git a/util/alevt/hamm.h b/util/alevt/hamm.h
new file mode 100644
index 0000000..3b8c8ad
--- /dev/null
+++ b/util/alevt/hamm.h
@@ -0,0 +1,7 @@
+#ifndef HAMM_H
+#define HAMM_H
+int hamm8(u8 *p, int *err);
+int hamm16(u8 *p, int *err);
+int hamm24(u8 *p, int *err);
+int chk_parity(u8 *p, int n);
+#endif
diff --git a/util/alevt/help.c b/util/alevt/help.c
new file mode 100644
index 0000000..b867855
--- /dev/null
+++ b/util/alevt/help.c
@@ -0,0 +1,83 @@
+#include "vt.h"
+#include "misc.h"
+
+#define VFILL " "
+#define HELP_HEADER \
+"........\6AleVT Online Help System ", \
+" \22`p0`0 p `0pppp ", \
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34", \
+"\4\35\22\177,\177j5\177.! +t>! j5 \7"VFILL VERSION" \34", \
+" \22# #\42!\42# \42 \42! ",
+#define FLOF_DATA \
+ 1, { {0x100,ANY_SUB}, {0x200,ANY_SUB}, {0x300,ANY_SUB}, \
+ {0x400,ANY_SUB}, {0x0ff,ANY_SUB}, {0x100,ANY_SUB} }
+
+
+struct vt_page help_pages[] =
+{
+ { 0x900, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt900.out"
+ }, FLOF_DATA },
+
+ { 0x901, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt901.out"
+ }, FLOF_DATA },
+
+ { 0x902, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt902.out"
+ }, FLOF_DATA },
+
+ { 0x903, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt903.out"
+ }, FLOF_DATA },
+
+ { 0x904, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt904.out"
+ }, FLOF_DATA },
+
+ { 0x905, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt905.out"
+ }, FLOF_DATA },
+
+ { 0x906, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt906.out"
+ }, FLOF_DATA },
+
+ { 0x907, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt907.out"
+ }, FLOF_DATA },
+
+ { 0x908, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt908.out"
+ }, FLOF_DATA },
+
+ { 0x909, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt909.out"
+ }, FLOF_DATA },
+
+ { 0x910, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt910.out"
+ }, FLOF_DATA },
+
+ { 0x911, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt911.out"
+ }, FLOF_DATA },
+
+ { 0x912, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt912.out"
+ }, FLOF_DATA },
+
+ { 0x913, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt913.out"
+ }, FLOF_DATA },
+
+ { 0x914, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt914.out"
+ }, FLOF_DATA },
+
+ { 0x915, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt915.out"
+ }, FLOF_DATA },
+};
+
+const int nr_help_pages = NELEM(help_pages);
diff --git a/util/alevt/help.h b/util/alevt/help.h
new file mode 100644
index 0000000..5df47fc
--- /dev/null
+++ b/util/alevt/help.h
@@ -0,0 +1,8 @@
+#ifndef HELP_H
+#define HELP_H
+
+#include "vt.h"
+
+extern struct vt_page help_pages[];
+extern const int nr_help_pages;
+#endif
diff --git a/util/alevt/icon.xbm b/util/alevt/icon.xbm
new file mode 100644
index 0000000..27255a4
--- /dev/null
+++ b/util/alevt/icon.xbm
@@ -0,0 +1,17 @@
+#define icon_width 58
+#define icon_height 20
+static unsigned char icon_bits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x03, 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03,
+ 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03, 0xc5, 0x23, 0xaa, 0xaa,
+ 0xa8, 0xf1, 0xf1, 0x03, 0xc6, 0x22, 0xfe, 0xd5, 0x58, 0xb1, 0xb1, 0x02,
+ 0x45, 0x23, 0x06, 0xaa, 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x22, 0x06, 0xd6,
+ 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac, 0xa8, 0x51, 0x51, 0x01,
+ 0xc6, 0x22, 0x62, 0xd4, 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac,
+ 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x23, 0x62, 0xd4, 0xf8, 0xb1, 0xb1, 0x02,
+ 0x05, 0x20, 0x02, 0xae, 0x61, 0x58, 0x51, 0x01, 0x06, 0x20, 0x02, 0x56,
+ 0x61, 0xa8, 0xb1, 0x02, 0xc5, 0x23, 0xe2, 0xab, 0x06, 0x56, 0x51, 0x01,
+ 0x46, 0x22, 0xe2, 0x57, 0x05, 0xaa, 0xb1, 0x02, 0xc7, 0x23, 0x06, 0xfe,
+ 0x9f, 0xff, 0xf1, 0x03, 0xc7, 0x23, 0x06, 0xfe, 0x9f, 0xff, 0xf1, 0x03,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x03, };
diff --git a/util/alevt/lang.c b/util/alevt/lang.c
new file mode 100644
index 0000000..3a49307
--- /dev/null
+++ b/util/alevt/lang.c
@@ -0,0 +1,393 @@
+#include <string.h>
+#include <ctype.h>
+#include "misc.h"
+#include "vt.h"
+#include "lang.h"
+
+int latin1 = -1;
+
+
+static u8 lang_char[256];
+static u8 lang_chars[1+8+8][16] =
+{
+ { 0, 0x23,0x24,0x40,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x7b,0x7c,0x7d,0x7e },
+
+ // for latin-1 font
+ // English (100%)
+ { 0, '£', '$', '@', '«', '½', '»', '¬', '#', '­', '¼', '¦', '¾', '÷' },
+ // German (100%)
+ { 0, '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' },
+ // Swedish/Finnish/Hungarian (100%)
+ { 0, '#', '¤', 'É', 'Ä', 'Ö', 'Å', 'Ü', '_', 'é', 'ä', 'ö', 'å', 'ü' },
+ // Italian (100%)
+ { 0, '£', '$', 'é', '°', 'ç', '»', '¬', '#', 'ù', 'à', 'ò', 'è', 'ì' },
+ // French (100%)
+ { 0, 'é', 'ï', 'à', 'ë', 'ê', 'ù', 'î', '#', 'è', 'â', 'ô', 'û', 'ç' },
+ // Portuguese/Spanish (100%)
+ { 0, 'ç', '$', '¡', 'á', 'é', 'í', 'ó', 'ú', '¿', 'ü', 'ñ', 'è', 'à' },
+ // Czech/Slovak (60%)
+ { 0, '#', 'u', 'c', 't', 'z', 'ý', 'í', 'r', 'é', 'á', 'e', 'ú', 's' },
+ // reserved (English mapping)
+ { 0, '£', '$', '@', '«', '½', '»', '¬', '#', '­', '¼', '¦', '¾', '÷' },
+
+ // for latin-2 font
+ // Polish (100%)
+ { 0, '#', 'ñ', '±', '¯', '¦', '£', 'æ', 'ó', 'ê', '¿', '¶', '³', '¼' },
+ // German (100%)
+ { 0, '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' },
+ // Estonian (100%)
+ { 0, '#', 'õ', '©', 'Ä', 'Ö', '®', 'Ü', 'Õ', '¹', 'ä', 'ö', '¾', 'ü' },
+ // Lettish/Lithuanian (90%)
+ { 0, '#', '$', '©', 'ë', 'ê', '®', 'è', 'ü', '¹', '±', 'u', '¾', 'i' },
+ // French (90%)
+ { 0, 'é', 'i', 'a', 'ë', 'ì', 'u', 'î', '#', 'e', 'â', 'ô', 'u', 'ç' },
+ // Serbian/Croation/Slovenian (100%)
+ { 0, '#', 'Ë', 'È', 'Æ', '®', 'Ð', '©', 'ë', 'è', 'æ', '®', 'ð', '¹' },
+ // Czech/Slovak (100%)
+ { 0, '#', 'ù', 'è', '»', '¾', 'ý', 'í', 'ø', 'é', 'á', 'ì', 'ú', '¹' },
+ // Rumanian (95%)
+ { 0, '#', '¢', 'Þ', 'Â', 'ª', 'Ã', 'Î', 'i', 'þ', 'â', 'º', 'ã', 'î' },
+};
+
+/* Yankable latin charset :-)
+ !"#$%&'()*+,-./0123456789:;<=>?
+ @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
+ `abcdefghijklmnopqrstuvwxyz{|}~
+ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿
+ ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
+ àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
+*/
+
+
+static struct mark { u8 *g0, *latin1, *latin2; } marks[16] =
+{
+ /* none */ { "#",
+ "¤",
+ "$" },
+ /* grave - ` */ { " aeiouAEIOU",
+ "`àèìòùÀÈÌÒÙ",
+ "`aeiouAEIOU" },
+ /* acute - ' */ { " aceilnorsuyzACEILNORSUYZ",
+ "'ácéílnórsúýzÁCÉÍLNÓRSÚÝZ",
+ "'áæéíåñóà¶úý¼ÁÆÉÍÅÑÓÀ¦Úݬ" },
+ /* cirumflex - ^ */ { " aeiouAEIOU",
+ "^âêîôûÂÊÎÔÛ",
+ "^âeîôuÂEÎÔU" },
+ /* tilde - ~ */ { " anoANO",
+ "~ãñõÃÑÕ",
+ "~anoANO" },
+ /* ??? - ¯ */ { "",
+ "",
+ "" },
+ /* breve - u */ { "aA",
+ "aA",
+ "ãÃ" },
+ /* abovedot - · */ { "zZ",
+ "zZ",
+ "¿¯" },
+ /* diaeresis ¨ */ { "aeiouAEIOU",
+ "äëïöüÄËÏÖÜ",
+ "äëiöüÄËIÖÜ" },
+ /* ??? - . */ { "",
+ "",
+ "" },
+ /* ringabove - ° */ { " auAU",
+ "°åuÅU",
+ "°aùAÙ" },
+ /* cedilla - ¸ */ { "cstCST",
+ "çstÇST",
+ "çºþǪÞ" },
+ /* ??? - _ */ { " ",
+ "_",
+ "_" },
+ /* dbl acute - " */ { " ouOU",
+ "\"ouOU",
+ "\"õûÕÛ" },
+ /* ogonek - \, */ { "aeAE",
+ "aeAE",
+ "±ê¡Ê" },
+ /* caron - v */ { "cdelnrstzCDELNRSTZ",
+ "cdelnrstzCDELNRSTZ",
+ "èïìµòø¹»¾ÈÏÌ¥ÒØ©«®" },
+};
+
+
+static u8 g2map_latin1[] =
+ /*0123456789abcdef*/
+ " ¡¢£$¥#§¤'\"« "
+ "°±²³×µ¶·÷'\"»¼½¾¿"
+ " `´^~ ¨.°¸_\" "
+ "_¹®© "
+ " ÆЪH ILLØ ºÞTNn"
+ "Kædðhiillø ßþtn\x7f";
+
+
+static u8 g2map_latin2[] =
+ /*0123456789abcdef*/
+ " icL$Y#§¤'\"< "
+ "° ×u ÷'\"> "
+ " `´^~ ¢ÿ¨.°¸_½²·"
+ "- RC "
+ " ÐaH iL£O opTNn"
+ "K ðdhiil³o ßptn\x7f";
+
+
+void lang_init(void)
+{
+ int i;
+
+ memset(lang_char, 0, sizeof(lang_char));
+ for (i = 1; i <= 13; i++)
+ lang_char[lang_chars[0][i]] = i;
+}
+
+
+void conv2latin(u8 *p, int n, int lang)
+{
+ int c, gfx = 0, lat=0;
+
+ if ((latin1 == KOI8) && lang==12) { /* russian */
+ while (n--) {
+ c=*p;
+
+ if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
+
+ if ( is_koi(c)) {
+ if (not gfx || (c & 0xa0) != 0x20) {
+ if(!lat) conv2koi8(p);
+ }
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+else if ((latin1 == GREEK) && lang==15) { /* Hellas */
+ while (n--) {
+ c=*p;
+
+ if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
+
+ if ( is_greek(c)) {
+ if (not gfx || (c & 0xa0) != 0x20) {
+ if(!lat) conv2greek(p);
+ }
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+
+ else {
+ while (n--)
+ {
+ if (lang_char[c = *p])
+ {
+ if (not gfx || (c & 0xa0) != 0x20)
+ *p = lang_chars[lang + 1][lang_char[c]];
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+}
+
+
+/* check for Greek chars - needs locale iso8859-7 set */
+int is_greek(int c)
+{
+ if( isalpha(c | 0x80)) return 1;
+ return 0;
+}
+
+
+/* check for russian chars - needs locale KOI8-R set */
+int is_koi(int c)
+{
+ if( isalpha(c | 0x80)) return 1;
+ if( c=='&' ) return 1;
+ return 0;
+}
+
+
+/* teletext to koi8-r conversion */
+void conv2koi8(u8 *p)
+{
+ u8 c;
+ static u8 l2koi[]={
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
+ 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+ 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xFF, 0xFA, 0xFB, 0xFC, 0xFD,
+ 0xFE, 0xF9, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF
+ };
+
+ c= *p;
+ if ( (c >= 0x40) && (c <= 0x7f)) *p=l2koi[(c & 0x7f) - 0x40];
+ if (c=='&') *p='Ù';
+}
+
+
+/* teletext to iso8859-7 conversion */
+void conv2greek(u8 *p)
+{
+ u8 c;
+ static u8 l2greek[]={
+/* 1 @ 0x40->ú*/0xc0,
+/* 2 A 0x41->Á*/0xc1,
+/* 3 B 0x42->Â*/0xc2,
+/* 4 C 0x43->Ã*/0xc3,
+/* 5 D 0x44->Ä*/0xc4,
+/* 6 E 0x45->Å*/0xc5,
+/* 7 F 0x46->Æ*/0xc6,
+/* 8 G 0x47->Ç*/0xc7,
+/* 9 H 0x48->È*/0xc8,
+/*10 I 0x49->É*/0xc9,
+/*11 J 0x4a->Ê*/0xca,
+/*12 K 0x4b->Ë*/0xcb,
+/*13 L 0x4c->Ì*/0xcc,
+/*14 M 0x4d->Í*/0xcd,
+/*15 N 0x4e->Î*/0xce,
+/*16 O 0x4f->Ï*/0xcf,
+/*17 P 0x50->Ð*/0xd0,
+/*18 Q 0x51->Ñ*/0xd1,
+/*19 R 0x52->?*/0x52,
+/*20 S 0x53->Ó*/0xd3,
+/*21 T 0x54->Ô*/0xd4,
+/*22 U 0x55->Õ*/0xd5,
+/*23 V 0x56->Ö*/0xd6,
+/*24 W 0x57->÷*/0xd7,
+/*25 X 0x58->Ø*/0xd8,
+/*26 Y 0x59->Ù*/0xd9,
+/*27 Z 0x5a->?*/0x5a,
+/*28 [ 0x5b->?*/0x5b,
+/*!29 \ 0x5c->Ü*/0xdc,
+/*!30 ] 0x5d->Ý*/0xdd,
+/*!31 ^ 0x5e->Þ*/0xde,
+/*!32 _ 0x5f->ß*/0xdf,
+/*33 ` 0x60->?*/0x60,
+/*!34 a 0x61->á*/0xe1,
+/*!35 b 0x62->â*/0xe2,
+/*!36 c 0x63->ã*/0xe3,
+/*!37 d 0x64->ä*/0xe4,
+/*!38 e 0x65->å*/0xe5,
+/*!39 f 0x66->æ*/0xe6,
+/*!40 g 0x67->ç*/0xe7,
+/*!41 h 0x68->è*/0xe8,
+/*!42 i 0x69->é*/0xe9,
+/*!43 j 0x6a->ê*/0xea,
+/*!44 k 0x6b->ë*/0xeb,
+/*!45 l 0x6c->ì*/0xec,
+/*!46 m 0x6d->í*/0xed,
+/*!47 n 0x6e->î*/0xee,
+/*!48 o 0x6f->ï*/0xef,
+/*!49 p 0x70->ð*/0xf0,
+/*!50 q 0x71->ñ*/0xf1,
+/*!51 r 0x72->ò*/0xf2,
+/*!52 s 0x73->ó*/0xf3,
+/*!53 t 0x74->ô*/0xf4,
+/*!54 u 0x75->õ*/0xf5,
+/*!55 v 0x76->ö*/0xf6,
+/*!56 w 0x77->÷*/0xf7,
+/*!57 x 0x78->ø*/0xf8,
+/*!58 y 0x79->ù*/0xf9,
+/*59 z 0x7a->ú(ìå ôüíï)*/0xc0,
+/*60 { 0x7b->?*/0x7b,
+/*!61 | 0x7c->ü*/0xfc,
+/*!62 } 0x7d->ý*/0xfd,
+/*!63 ~ 0x7e->þ*/0xfe,
+/*64 0x7f->?*/0x7f
+ };
+ c= *p;
+ if ( (c >= 0x40) && (c <= 0x7f)) *p=l2greek[(c & 0x7f) - 0x40];
+}
+
+
+void init_enhance(struct enhance *eh)
+{
+ eh->next_des = 0;
+}
+
+
+void add_enhance(struct enhance *eh, int dcode, u32 *t)
+{
+
+ if (dcode == eh->next_des)
+ {
+ memcpy(eh->trip + dcode * 13, t, 13 * sizeof(*t));
+ eh->next_des++;
+ }
+ else
+ eh->next_des = -1;
+}
+
+
+void enhance(struct enhance *eh, struct vt_page *vtp)
+{
+ int row = 0;
+ u32 *p, *e;
+
+ if (eh->next_des < 1)
+ return;
+
+ for (p = eh->trip, e = p + eh->next_des * 13; p < e; p++)
+ if (*p % 2048 != 2047)
+ {
+ int adr = *p % 64;
+ int mode = *p / 64 % 32;
+ int data = *p / 2048 % 128;
+
+ if (adr < 40)
+ {
+ // col functions
+ switch (mode)
+ {
+ case 15: // char from G2 set
+ if (adr < W && row < H)
+ if (latin1==LATIN1)
+ vtp->data[row][adr] = g2map_latin1[data-32];
+ else if (latin1==LATIN2)
+ vtp->data[row][adr] = g2map_latin2[data-32];
+ break;
+ case 16 ... 31: // char from G0 set with diacritical mark
+ if (adr < W && row < H)
+ {
+ struct mark *mark = marks + (mode - 16);
+ u8 *x;
+
+ if (x = strchr(mark->g0, data))
+ if (latin1==LATIN1)
+ data = mark->latin1[x - mark->g0];
+ else if (latin1==LATIN2)
+ data = mark->latin2[x - mark->g0];
+ vtp->data[row][adr] = data;
+ }
+ break;
+ }
+ }
+ else
+ {
+ // row functions
+ if ((adr -= 40) == 0)
+ adr = 24;
+
+ switch (mode)
+ {
+ case 1: // full row color
+ row = adr;
+ break;
+ case 4: // set active position
+ row = adr;
+ break;
+ case 7: // address row 0 (+ full row color)
+ if (adr == 23)
+ row = 0;
+ break;
+ }
+ }
+ }
+}
diff --git a/util/alevt/lang.h b/util/alevt/lang.h
new file mode 100644
index 0000000..531f3b0
--- /dev/null
+++ b/util/alevt/lang.h
@@ -0,0 +1,28 @@
+#ifndef LANG_H
+#define LANG_H
+
+#include "misc.h"
+#include "vt.h"
+
+extern int latin1;
+
+#define LATIN1 1
+#define LATIN2 2
+#define KOI8 3
+#define GREEK 4
+
+
+struct enhance
+{
+ int next_des; // next expected designation code
+ u32 trip[13*16]; // tripplets
+};
+
+void lang_init(void);
+void conv2latin(u8 *p, int n, int lang);
+void conv2koi8(u8 *p);
+void conv2greek(u8 *p);
+void init_enhance(struct enhance *eh);
+void add_enhance(struct enhance *eh, int dcode, u32 *data);
+void enhance(struct enhance *eh, struct vt_page *vtp);
+#endif
diff --git a/util/alevt/main.c b/util/alevt/main.c
new file mode 100644
index 0000000..31fe9c3
--- /dev/null
+++ b/util/alevt/main.c
@@ -0,0 +1,221 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include "vt.h"
+#include "misc.h"
+#include "fdset.h"
+#include "xio.h"
+#include "vbi.h"
+#include "lang.h"
+#include "cache.h"
+#include "ui.h"
+
+static char *geometry;
+static char *dpy_name;
+static char *vbi_name = NULL;
+static struct xio *xio;
+static struct vbi *vbi;
+static int erc = 1;
+char *outfile = "";
+static char *channel;
+static int ttpid = -1;
+u_int16_t sid = 0;
+
+
+static void usage(FILE *fp, int exitval)
+{
+ fprintf(fp, "\nUsage: %s [options]\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -c <channel name>\t\t(none;dvb only)\n"
+ " -ch -child <ppp.ss>\t\t(none)\n"
+ " -cs -charset\t\tlatin-1\n"
+ " <latin-1/2/koi8-r/iso8859-7>\n"
+ " -h -help\n"
+ " -o <outfile>\t\t(none;dvb only)\n"
+ " -p -parent <ppp.ss>\t\t900\n"
+ " -s -sid <sid>\t\t(none;dvb only)\n"
+ " -t -ttpid <ttpid>\t\t(none;dvb only)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ "\n"
+ " ppp.ss stands for a page number and an\n"
+ " optional subpage number (Example: 123.4).\n"
+ "\n"
+ " The -child option requires a parent\n"
+ " window. So it must be preceded by\n"
+ " a parent or another child window.\n"
+ );
+ exit(exitval);
+}
+
+
+static int arg_pgno(char *p, int *subno)
+{
+ char *end;
+ int pgno;
+
+ *subno = ANY_SUB;
+ if (*p)
+ {
+ pgno = strtol(p, &end, 16);
+ if ((*end == ':' || *end == '/' || *end == '.') && end[1])
+ *subno = strtol(end + 1, &end, 16);
+ if (*end == 0)
+ if (pgno >= 0x100 && pgno <= 0x999)
+ if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
+ return pgno;
+ }
+ fatal("%s: invalid page number", p);
+}
+
+
+static struct vtwin * start(int argc, char **argv, struct vtwin *parent,
+ int pgno, int subno)
+{
+ static int valid_vbi_name = 1;
+
+ if (!valid_vbi_name)
+ return parent;
+
+ if (vbi == 0)
+ vbi = vbi_open(vbi_name, cache_open(), channel, outfile, sid, ttpid);
+ if (vbi == 0)
+ {
+ if (vbi_name)
+ error("cannot open device: %s", vbi_name);
+ valid_vbi_name = 0;
+ vbi = open_null_vbi(cache_open());
+ }
+ if (vbi->cache)
+ vbi->cache->op->mode(vbi->cache, CACHE_MODE_ERC, erc);
+
+ if (xio == 0)
+ xio = xio_open_dpy(dpy_name, argc, argv);
+ if (xio == 0)
+ fatal("cannot open display");
+
+ parent = vtwin_new(xio, vbi, geometry, parent, pgno, subno);
+ if (parent == 0)
+ fatal("cannot create window");
+
+ if (!valid_vbi_name)
+ {
+ if (vbi_name)
+ send_errmsg(vbi, "cannot open device: %s", vbi_name);
+ else
+ send_errmsg(vbi, "cannot open any device", vbi_name);
+ }
+
+ return parent;
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-channel", "-c", 1 },
+ { "-child", "-ch", 1 },
+ { "-charset", "-cs", 1 },
+ { "-help", "-h", 0 },
+ { "-outfile", "-o", 1 },
+ { "-parent", "-p", 1 },
+ { "-sid", "-s", 1 },
+ { "-ttpid", "-t", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+ if (*ind >= argc)
+ return 0;
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 1);
+ }
+ return -1;
+}
+
+
+int main(int argc, char **argv)
+{
+ struct vtwin *parent = 0;
+ int pgno, subno;
+ int opt, ind;
+ char *arg;
+ sid = 0;
+
+ setprgname(argv[0]);
+ fdset_init(fds);
+
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+
+ case 1: // channel
+ channel = arg;
+ break;
+ case 2: // child
+ if (parent == 0)
+ fatal("-child requires a parent window");
+ pgno = arg_pgno(arg, &subno);
+ parent = start(argc, argv, parent, pgno, subno);
+ geometry = 0;
+ break;
+ case 3: // charset
+ if (streq(arg, "latin-1") || streq(arg, "1"))
+ latin1 = LATIN1;
+ else if (streq(arg, "latin-2") || streq(arg, "2"))
+ latin1 = LATIN2;
+ else if (streq(arg, "koi8-r") || streq(arg, "koi"))
+ latin1 = KOI8;
+ else if (streq(arg, "iso8859-7") || streq(arg, "el"))
+ latin1 = GREEK;
+ else
+ fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
+ break;
+ case 4: // help
+ usage(stdout, 0);
+ break;
+ case 5: // outfile
+ outfile = arg;
+ break;
+ case 6: // parent
+ case -1: // non-option arg
+ pgno = arg_pgno(arg, &subno);
+ parent = start(argc, argv, 0, pgno, subno);
+ geometry = 0;
+ break;
+ case 7: // sid
+ sid = strtoul(arg, NULL, 0);
+ break;
+ case 8: // ttpid
+ ttpid = strtoul(arg, NULL, 0);
+ break;
+ case 9: // vbi
+ vbi_name = arg;
+ vbi = 0;
+ parent = 0;
+ break;
+ }
+
+ if (parent == 0)
+ start(argc, argv, 0, 0x900, ANY_SUB);
+ xio_event_loop();
+ exit(0);
+}
diff --git a/util/alevt/misc.c b/util/alevt/misc.c
new file mode 100644
index 0000000..32d0595
--- /dev/null
+++ b/util/alevt/misc.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include "misc.h"
+
+char *prgname = 0;
+
+extern char *strrchr(const char *, int);
+NORETURN(exit(int));
+
+
+void setprgname(char *str)
+{
+ char *x = strrchr(str, '/');
+ prgname = x ? x+1 : str;
+}
+
+
+static void print_prgname(void)
+{
+ if (prgname && *prgname)
+ fprintf(stderr, "%s: ", prgname);
+}
+
+
+void error(const char *str, ...)
+{
+ va_list args;
+ va_start(args, str);
+ print_prgname();
+ vfprintf(stderr, str, args);
+ fputc('\n', stderr);
+}
+
+
+void ioerror(const char *str)
+{
+ print_prgname();
+ perror(str);
+}
+
+
+void fatal(const char *str, ...)
+{
+ va_list args;
+ va_start(args, str);
+ print_prgname();
+ vfprintf(stderr, str, args);
+ fputc('\n', stderr);
+ exit(2);
+}
+
+
+void fatal_ioerror(const char *str)
+{
+ print_prgname();
+ perror(str);
+ exit(2);
+}
+
+
+void out_of_mem(int size)
+{
+ if (size > 0)
+ fatal("out of memory allocating %d bytes.", size);
+ fatal("out of memory.");
+}
diff --git a/util/alevt/misc.h b/util/alevt/misc.h
new file mode 100644
index 0000000..00a71f8
--- /dev/null
+++ b/util/alevt/misc.h
@@ -0,0 +1,32 @@
+#ifndef MISC_H
+#define MISC_H
+#define PTR (void *)
+#define NELEM(x) ((int)(sizeof(x)/sizeof(*(x))))
+#define NORETURN(x) void x __attribute__((__noreturn__))
+#define DEFINE(x) typeof(x) x
+#define OFFSET_OF(type, elem) ((u8 *)&((type *)0)->elem - (u8 *)0)
+#define BASE_OF(type, elem, p) ((type *)((u8 *)(p) - OFFSET_OF(type, elem)))
+
+#define not !
+#define streq(a, b) (strcmp((a), (b)) == 0)
+#define min(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a < _b ? _a : _b; })
+#define max(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a > _b ? _a : _b; })
+#define bound(a,b,c) ({ typeof(a) _a = a; typeof(b) _b = b; typeof(c) _c = c; \
+ _b < _a ? _a : _b > _c ? _c : _b; })
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef signed char s8;
+typedef signed short s16;
+typedef signed int s32;
+
+extern char *prgname;
+void setprgname(char *argv_0);
+
+NORETURN(fatal(const char *str, ...));
+NORETURN(fatal_ioerror(const char *str));
+NORETURN(out_of_mem(int size));
+void error(const char *str, ...);
+void ioerror(const char *str);
+#endif
diff --git a/util/alevt/os.h b/util/alevt/os.h
new file mode 100644
index 0000000..50b7662
--- /dev/null
+++ b/util/alevt/os.h
@@ -0,0 +1,7 @@
+#ifndef OS_H
+#define OS_H
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBsd__) \
+ || defined(__bsdi__)
+#define BSD
+#endif
+#endif
diff --git a/util/alevt/search.c b/util/alevt/search.c
new file mode 100644
index 0000000..082cefb
--- /dev/null
+++ b/util/alevt/search.c
@@ -0,0 +1,127 @@
+#include <sys/types.h> // for freebsd
+#include <stdlib.h>
+#include "vt.h"
+#include "misc.h"
+#include "cache.h"
+#include "search.h"
+
+
+static void convert(u8 *p, u8 *buf, int *line)
+{
+ int x, y, c, ch, gfx, hid = 0;
+
+ for (y = 1, p += 40; y < 25; ++y)
+ {
+ if (not hid)
+ {
+ gfx = 0;
+ for (x = 0; x < 40; ++x)
+ {
+ c = ' ';
+ switch (ch = *p++)
+ {
+ case 0x00 ... 0x07:
+ gfx = 0;
+ break;
+ case 0x10 ... 0x17:
+ gfx = 1;
+ break;
+ case 0x0c:
+ hid = 1;
+ break;
+ case 0x7f:
+ c = '*';
+ break;
+ case 0x20 ... 0x7e:
+ if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
+ ch = '#';
+ case 0xa0 ... 0xff:
+ c= ch;
+ }
+ *buf++ = c;
+ }
+ *buf++ = '\n';
+ *line++ = y;
+ }
+ else
+ {
+ p += 40;
+ hid = 0;
+ }
+ }
+ *line = y;
+ *buf = 0;
+}
+
+
+static int search_pg(struct search *s, struct vt_page *vtp)
+{
+ regmatch_t m[1];
+ u8 buf[H *(W+1) + 1];
+ int line[H];
+
+ convert(PTR vtp->data, buf, line);
+ if (regexec(s->pattern, buf, 1, m, 0) == 0)
+ {
+ s->len = 0;
+ if (m->rm_so >= 0)
+ {
+ s->y = line[m->rm_so / (W+1)];
+ s->x = m->rm_so % (W+1);
+ s->len = m->rm_eo - m->rm_so;
+ if (s->x + s->len > 40)
+ s->len = 40 - s->x;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+
+struct search * search_start(struct cache *ca, u8 *pattern)
+{
+ struct search *s;
+ int f = 0;
+
+ if (not(s = malloc(sizeof(*s))))
+ goto fail1;
+
+ if (pattern[0] == '!')
+ pattern++;
+ else
+ f = REG_ICASE;
+
+ if (regcomp(s->pattern, pattern, f | REG_NEWLINE) != 0)
+ goto fail2;
+
+ s->cache = ca;
+ return s;
+
+fail2:
+ free(s);
+fail1:
+ return 0;
+}
+
+
+void search_end(struct search *s)
+{
+ regfree(s->pattern);
+ free(s);
+}
+
+
+int search_next(struct search *s, int *pgno, int *subno, int dir)
+{
+ struct vt_page *vtp = 0;
+
+ if (s->cache)
+ vtp = s->cache->op->foreach_pg(s->cache, *pgno, *subno, dir,
+ search_pg, s);
+ if (vtp == 0)
+ return -1;
+
+ *pgno = vtp->pgno;
+ *subno = vtp->subno ?: ANY_SUB;
+ return 0;
+}
diff --git a/util/alevt/search.h b/util/alevt/search.h
new file mode 100644
index 0000000..c7e813a
--- /dev/null
+++ b/util/alevt/search.h
@@ -0,0 +1,16 @@
+#ifndef SEARCH_H
+#define SEARCH_H
+
+#include <regex.h>
+
+struct search
+{
+ struct cache *cache;
+ regex_t pattern[1];
+ int x, y, len; // the position of the match
+};
+
+struct search *search_start(struct cache *ca, u8 *pattern);
+void search_end(struct search *s);
+int search_next(struct search *s, int *pgno, int *subno, int dir);
+#endif
diff --git a/util/alevt/ui.c b/util/alevt/ui.c
new file mode 100644
index 0000000..70391c7
--- /dev/null
+++ b/util/alevt/ui.c
@@ -0,0 +1,721 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include "vt.h"
+#include "misc.h"
+#include "xio.h"
+#include "vbi.h"
+#include "fdset.h"
+#include "search.h"
+#include "export.h"
+#include "ui.h"
+
+static void vtwin_event(struct vtwin *w, struct vt_event *ev);
+static void msg(struct vtwin *w, u8 *str, ...);
+static void err(struct vtwin *w, u8 *str, ...);
+
+#define hist(w,o) ((w)->hist + (((w)->hist_top + (o)) & (N_HISTORY-1)))
+
+
+static int inc_hex(int i, int bcd_mode)
+{
+ i++;
+ if (bcd_mode)
+ {
+ if ((i & 0x000f) > 0x0009)
+ i = (i + 0x0010) & 0x0ff0;
+ if ((i & 0x00f0) > 0x090)
+ i = (i + 0x0100) & 0x0f00;
+ if ((i & 0x0f00) > 0x0900)
+ i = (i + 0x1000) & 0xf000;
+ }
+ return i;
+}
+
+
+static int dec_hex(int i, int bcd_mode)
+{
+ i--;
+ if (bcd_mode)
+ {
+ if ((i & 0x000f) > 0x0009)
+ i = (i & 0xfff0) + 0x0009;
+ if ((i & 0x00f0) > 0x0090)
+ i = (i & 0xff00) + 0x0099;
+ if ((i & 0x0f00) > 0x0900)
+ i = (i & 0xf000) + 0x0999;
+ }
+ return i;
+}
+
+
+static void set_title(struct vtwin *w)
+{
+ char buf[32], buf2[32];
+
+ if (w->subno == ANY_SUB)
+ sprintf(buf, "%x", w->pgno);
+ else
+ sprintf(buf, "%x/%x", w->pgno, w->subno);
+ if (w->searching)
+ sprintf(buf2, "(%s)", buf);
+ else
+ sprintf(buf2, "%s", buf);
+ xio_title(w->xw, buf2);
+}
+
+
+static void query_page(struct vtwin *w, int pgno, int subno)
+{
+ w->pgno = pgno;
+ w->subno = subno;
+ w->searching = 1;
+ w->hold = 0; //subno != ANY_SUB;
+ xio_set_concealed(w->xw, w->revealed = 0);
+
+ if (hist(w, 0)->pgno != pgno ||
+ (hist(w,0)->subno == ANY_SUB && subno != ANY_SUB))
+ w->hist_top++;
+ hist(w, 0)->pgno = pgno;
+ hist(w, 0)->subno = subno;
+ hist(w, 1)->pgno = 0; // end marker
+
+ xio_cancel_selection(w->xw);
+ if (vbi_query_page(w->vbi, pgno, subno) == 0)
+ {
+ w->vtp = 0;
+ }
+ set_title(w);
+}
+
+
+static void new_or_query(struct vtwin *w, int pgno, int subno, int new_win)
+{
+ if (new_win)
+ {
+ if (w->child)
+ query_page(w->child, pgno, subno);
+ else
+ vtwin_new(w->xw->xio, w->vbi, 0, w, pgno, subno);
+ }
+ else
+ query_page(w, pgno, subno);
+}
+
+static int _next_pgno(int *arg, struct vt_page *vtp)
+{
+ int pgno = vtp->pgno;
+
+ if (arg[0] == pgno) // want different page
+ return 0;
+ if (arg[1]) // and not a hex page
+ for (; pgno; pgno >>=4)
+ if ((pgno & 15) > 9)
+ return 0;
+ return 1;
+}
+
+
+static int _next_subno(int *arg, struct vt_page *vtp)
+{
+ return vtp->pgno == arg[0]; // only subpages of this page
+}
+
+
+static void do_next_pgno(struct vtwin *w, int dir, int bcd_mode, int subs,
+ int new_win)
+{
+ struct vt_page *vtp;
+ struct vtwin *cw = (new_win && w->child) ? w->child : w;
+ int pgno = cw->pgno;
+ int subno = cw->subno;
+
+ if (w->vbi->cache)
+ {
+ int arg[2];
+ arg[0] = pgno;
+ arg[1] = bcd_mode;
+ if (vtp = w->vbi->cache->op->foreach_pg(w->vbi->cache,
+ pgno, subno, dir, subs ? _next_subno:_next_pgno, &arg))
+ {
+ new_or_query(w, vtp->pgno, subs ? vtp->subno : ANY_SUB, new_win);
+ return;
+ }
+ }
+ err(w, "No page.");
+}
+
+#define notdigit(x) (not isdigit((x)))
+
+
+static int chk_screen_fromto(u8 *p, int x, int *n1, int *n2)
+{
+ p += x;
+
+ if (x >= 0 && x+5 < 42)
+ if (notdigit(p[1]) || notdigit(p[0]))
+ if (isdigit(p[2]))
+ if (p[3] == '/' || p[3] == ':')
+ if (isdigit(p[4]))
+ if (notdigit(p[5]) || notdigit(p[6])) /* p[6] is save here */
+ {
+ *n1 = p[2] % 16;
+ if (isdigit(p[1]))
+ *n1 += p[1] % 16 * 16;
+ *n2 = p[4] % 16;
+ if (isdigit(p[5]))
+ *n2 = *n2 * 16 + p[5] % 16;
+ return 1;
+ }
+ return 0;
+}
+
+
+static int chk_screen_pgno(u8 *p, int x, int *pgno, int *subno)
+{
+ p += x;
+
+ if (x >= 0 && x+4 < 42)
+ if (notdigit(p[0]) && notdigit(p[4]))
+ if (isdigit(p[1]) && isdigit(p[2]) && isdigit(p[3]))
+ {
+ *pgno = p[1] % 16 * 256 + p[2] % 16 * 16 + p[3] % 16;
+ if (*pgno >= 0x100 && *pgno <= 0x999)
+ {
+ *subno = ANY_SUB;
+ if (x+6 < 42)
+ if (p[4] == '.' || p[4] == '/')
+ if (isdigit(p[5]))
+ if (notdigit(p[6]) || notdigit(p[7])) /* p[7] is save here */
+ {
+ *subno = p[5] % 16;
+ if (isdigit(p[6]))
+ *subno = *subno * 16 + p[6] % 16;
+ }
+ // hackhackhack:
+ // pgno followed by start box gets subno 1
+ if (x+4 < 42 && p[4] == 11)
+ *subno = 1;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+static void do_screen_pgno(struct vtwin *w, int x, int y, int new_win)
+{
+ u8 buf[42];
+ int n1, n2, i;
+
+ if (x >= 0 && x < 40)
+ {
+ if (xio_get_line(w->xw, y, buf+1) == 0)
+ {
+ buf[0] = buf[41] = ' ';
+ x++;
+
+ for (i = -6; i < 35; i++)
+ {
+ if (w->vtp == 0 || w->vtp->subno != 0)
+ if (chk_screen_fromto(buf, x+i, &n1, &n2))
+ {
+ // subno cycling works wrong with children.
+ // so middle button cycles backwards...
+ if (w->subno != ANY_SUB)
+ n1 = w->subno;
+ n1 = new_win ? dec_hex(n1, 1) : inc_hex(n1, 1);
+ if (n1 < 1)
+ n1 = n2;
+ if (n1 > n2)
+ n1 = 1;
+ new_or_query(w, w->pgno, n1, 0);
+ return;
+ }
+ if (i >= -4)
+ if (chk_screen_pgno(buf, x+i, &n1, &n2))
+ {
+ new_or_query(w, n1, n2, new_win);
+ return;
+ }
+ }
+ }
+ }
+ err(w, "No page.");
+}
+
+
+static void do_flof_pgno(struct vtwin *w, int button, int x, int new_win)
+{
+ struct vt_page *vtp = w->vtp;
+ int lk = 99, i, c;
+
+ if (vtp && vtp->flof)
+ {
+ switch (button)
+ {
+ case 1 ... 3:
+ for (i = 0; i <= x && i < 40; ++i)
+ if ((c = vtp->data[24][i]) < 8) // fg-color code
+ lk = c;
+ lk = "x\0\1\2\3x\3x"[lk]; // color -> link#
+ break;
+ case KEY_F(1): lk = 0; break;
+ case KEY_F(2): lk = 1; break;
+ case KEY_F(3): lk = 2; break;
+ case KEY_F(4): lk = 3; break;
+ case KEY_F(5): lk = 5; break;
+ }
+ if (lk < 6 && (vtp->link[lk].pgno & 0xff) != 0xff)
+ {
+ new_or_query(w, vtp->link[lk].pgno, vtp->link[lk].subno, new_win);
+ return;
+ }
+ }
+ else
+ {
+ switch (button)
+ {
+ case 1 ... 3: lk = x / 8; break;
+ case KEY_F(1): lk = 0; break;
+ case KEY_F(2): lk = 1; break;
+ case KEY_F(3): lk = 2; break;
+ case KEY_F(4): lk = 3; break;
+ case KEY_F(5): lk = 4; break;
+ }
+ switch (lk)
+ {
+ case 0: new_or_query(w, 0x100, ANY_SUB, new_win); return;
+ case 1: do_next_pgno(w, -1, 1, 0, new_win); return;
+ case 2: new_or_query(w, 0x900, ANY_SUB, new_win); return;
+ case 3: do_next_pgno(w, 1, 1, 0, new_win); return;
+ case 4: new_or_query(w, 0x999, ANY_SUB, new_win); return;
+ }
+ }
+ err(w, "No page.");
+}
+
+
+static void do_hist_pgno(struct vtwin *w)
+{
+ if (hist(w, -1)->pgno)
+ {
+ w->hist_top--;
+ query_page(w, hist(w, 0)->pgno, hist(w, 0)->subno);
+ }
+ else
+ err(w, "Empty history.");
+}
+
+
+static void put_head_line(struct vtwin *w, u8 *p)
+{
+ char buf[40];
+
+ if (p == 0)
+ xio_get_line(w->xw, 0, buf);
+ else
+ memcpy(buf + 8, p + 8, 32);
+
+ if (w->subno == ANY_SUB)
+ sprintf(buf, "\2%3x \5\xb7", w->pgno);
+ else
+ sprintf(buf, "\2S%02x \5\xb7", w->subno & 0xff);
+
+ if (w->searching)
+ buf[0] = 1;
+ if (w->hold)
+ buf[4] = 'H';
+ if (w->xw->concealed)
+ buf[6] = '*';
+ buf[7] = 7;
+
+ xio_put_line(w->xw, 0, buf);
+}
+
+
+static void put_menu_line(struct vtwin *w)
+{
+ if (w->status > 0)
+ xio_put_line(w->xw, 24, w->statusline);
+ else if (w->vtp && w->vtp->flof)
+ xio_put_line(w->xw, 24, w->vtp->data[24]);
+ else
+ xio_put_line(w->xw, 24, "\0 100 \4<< \6Help \4>>\0 999 ");
+}
+
+
+static void _msg(struct vtwin *w, u8 *str, va_list args)
+{
+ u8 buf[128];
+ int i;
+
+ i = vsprintf(buf, str, args);
+ if (i > W)
+ i = W;
+ memset(w->statusline, ' ', W);
+ memcpy(w->statusline + (W-i+1)/2, buf, i);
+ w->status = 6;
+ put_menu_line(w);
+}
+
+
+static void msg(struct vtwin *w, u8 *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ _msg(w, str, args);
+ va_end(args);
+}
+
+
+static void err(struct vtwin *w, u8 *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ _msg(w, str, args);
+ va_end(args);
+}
+
+
+static void next_search(struct vtwin *w, int rev)
+{
+ if (w->search)
+ {
+ int pgno = w->pgno;
+ int subno = w->subno;
+ int dir = rev ? -w->searchdir : w->searchdir;
+
+ if (search_next(w->search, &pgno, &subno, dir) == 0)
+ {
+ query_page(w, pgno, subno);
+ if (not w->searching && w->search->len)
+ xio_set_selection(w->xw, w->search->x, w->search->y,
+ w->search->x + w->search->len - 1, w->search->y);
+ return;
+ }
+ else
+ err(w, "Pattern not found.");
+ }
+ else
+ err(w, "No search pattern.");
+}
+
+
+static void start_search(struct vtwin *w, u8 *string)
+{
+ if (not string)
+ return;
+
+ if (*string)
+ {
+ if (w->search)
+ search_end(w->search);
+ w->search = search_start(w->vbi->cache, string);
+ if (w->search == 0)
+ {
+ err(w, "Bad search pattern.");
+ return;
+ }
+ }
+ next_search(w, 0);
+}
+
+
+static void start_save2(struct vtwin *w, u8 *name)
+{
+ if (name && *name)
+ if (export(w->export, w->vtp, name))
+ err(w, export_errstr());
+
+ export_close(w->export);
+ w->export = 0;
+ put_menu_line(w);
+}
+
+
+struct vtwin * vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
+ struct vtwin *parent, int pgno, int subno)
+{
+ struct vtwin *w;
+
+ if (not(w = malloc(sizeof(*w))))
+ goto fail1;
+
+ if (not (w->xw = xio_open_win(xio, geom)))
+ goto fail2;
+ w->vbi = vbi;
+ w->vtp = 0;
+ w->search = 0;
+ w->export = 0;
+ w->parent = parent;
+ w->child = 0;
+ if (parent && parent->child)
+ fatal("internal error: parent already has a child != 0");
+ if (parent)
+ parent->child = w;
+
+ w->hist_top = 1;
+ hist(w,0)->pgno = 0;
+ hist(w,1)->pgno = 0;
+ w->status = 0;
+ xio_set_handler(w->xw, vtwin_event, w);
+ vbi_add_handler(w->vbi, vtwin_event, w);
+ query_page(w, pgno, subno);
+ return w;
+
+fail2:
+ free(w);
+fail1:
+ return 0;
+}
+
+
+static void vtwin_close(struct vtwin *w)
+{
+ if (w->parent)
+ w->parent->child = w->child;
+ if (w->child)
+ w->child->parent = w->parent;
+
+ if (w->search)
+ search_end(w->search);
+ if (w->export)
+ export_close(w->export);
+
+ vbi_del_handler(w->vbi, vtwin_event, w);
+ xio_close_win(w->xw, 1);
+ free(w);
+}
+
+
+static void vtwin_event(struct vtwin *w, struct vt_event *ev)
+{
+ struct xio_win *xw = w->xw;
+ int i;
+
+ switch (ev->type)
+ {
+ case EV_CLOSE:
+ vtwin_close(w);
+ break;
+
+ case EV_TIMER:
+ if (w->status > 0 && --w->status == 0)
+ put_menu_line(w);
+ break;
+
+ case EV_KEY:
+ {
+ switch (ev->i1)
+ {
+ case '0' ... '9':
+ i = ev->i1 - '0';
+ if (w->pgno >= 0x100)
+ {
+ if (i == 0)
+ break;
+ w->pgno = i;
+ }
+ else
+ {
+ w->pgno = w->pgno * 16 + i;
+ if (w->pgno >= 0x100)
+ query_page(w, w->pgno, ANY_SUB);
+ }
+ break;
+ case 'q':
+ case '\e':
+ vtwin_close(w);
+ break;
+ case 'h':
+ query_page(w, 0x900, ANY_SUB);
+ break;
+ case 'e':
+ if (w->vbi->cache)
+ {
+ i = w->vbi->cache->op->mode(w->vbi->cache,
+ CACHE_MODE_ERC, 0);
+ w->vbi->cache->op->mode(w->vbi->cache,
+ CACHE_MODE_ERC, !i);
+ msg(w, "Error reduction %sabled.", i ? "dis" : "en");
+ }
+ break;
+ case 'o':
+ if (vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno) == 0)
+ err(w, "Unable to open new window.");
+ break;
+ case KEY_RIGHT:
+ do_next_pgno(w, 1, not ev->i2, 0, 0);
+ break;
+ case KEY_LEFT:
+ do_next_pgno(w, -1, not ev->i2, 0, 0);
+ break;
+ case KEY_UP:
+ do_next_pgno(w, -1, not ev->i2, 1, 0);
+ break;
+ case KEY_DOWN:
+ do_next_pgno(w, 1, not ev->i2, 1, 0);
+ break;
+ case '\b':
+ do_hist_pgno(w);
+ break;
+ case ' ':
+ w->hold = !w->hold;
+ break;
+ case 'c':
+ vbi_reset(w->vbi);
+ break;
+ case 'i':
+ if (w->vtp && w->vtp->flof &&
+ (w->vtp->link[5].pgno & 0xff) != 0xff)
+ query_page(w, w->vtp->link[5].pgno,
+ w->vtp->link[5].subno);
+ else
+ query_page(w, 0x100, ANY_SUB);
+ break;
+ case 'r':
+ xio_set_concealed(xw, w->revealed = !w->revealed);
+ break;
+ case KEY_F(1) ... KEY_F(5):
+ do_flof_pgno(w, ev->i1, 0, ev->i2);
+ break;
+ case 'n':
+ next_search(w, 0);
+ break;
+ case 'N':
+ next_search(w, 1);
+ break;
+ default:
+ err(w, "Unused key.");
+ break;
+ }
+ break;
+ }
+ case EV_RESET:
+ {
+ if (w->search)
+ search_end(w->search);
+ w->search = 0;
+
+ query_page(w, w->pgno, w->subno);
+ msg(w, "Cache cleared!");
+ break;
+ }
+ case EV_MOUSE:
+ {
+ if (ev->i1 == 3)
+ do_hist_pgno(w);
+ else if (ev->i1 == 5) // wheel mouse
+ do_next_pgno(w, 1, not ev->i2, 0, 0);
+ else if (ev->i1 == 4) // wheel mouse
+ do_next_pgno(w, -1, not ev->i2, 0, 0);
+ else if (ev->i1 == 7) // dual wheel mouse
+ do_next_pgno(w, 1, not ev->i2, 1, 0);
+ else if (ev->i1 == 6) // dual wheel mouse
+ do_next_pgno(w, -1, not ev->i2, 1, 0);
+ else if (ev->i4 == 24)
+ do_flof_pgno(w, ev->i1, ev->i3, ev->i1 == 2);
+ else if (ev->i4 == 0 && ev->i3 < 5)
+ {
+ if (ev->i1 == 1)
+ w->hold = !w->hold;
+ else
+ vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno);
+ }
+ else if (ev->i4 == 0 && ev->i3 < 8)
+ {
+ if (ev->i1 == 2 && w->child)
+ w = w->child;
+ xio_set_concealed(w->xw, w->revealed = !w->revealed);
+ }
+ else
+ do_screen_pgno(w, ev->i3, ev->i4, ev->i1 == 2);
+ break;
+ }
+ case EV_PAGE:
+ {
+ struct vt_page *vtp = ev->p1;
+
+ if (0)
+ if (vtp->errors)
+ printf("errors=%4d\n",vtp->errors);
+ if (w->searching || not(w->hold || ev->i1))
+ if (vtp->pgno == w->pgno)
+ if (w->subno == ANY_SUB || vtp->subno == w->subno)
+ {
+ w->searching = 0;
+ w->vtp = vtp;
+ put_head_line(w, vtp->data[0]);
+ for (i = 1; i < 24; ++i)
+ xio_put_line(w->xw, i, vtp->data[i]);
+ put_menu_line(w);
+ set_title(w);
+ }
+ break;
+ }
+ case EV_HEADER:
+ {
+ u8 *p = ev->p1;
+ int hdr_mag = ev->i1 / 256;
+ int flags = ev->i3;
+ int mag = w->pgno;
+ if (mag >= 0x10)
+ mag = mag >> 4;
+ if (mag >= 0x10)
+ mag = mag >> 4;
+ if (flags & PG_OUTOFSEQ)
+ p = 0;
+ else
+ if (~flags & PG_MAGSERIAL)
+ if (mag != hdr_mag)
+ p = 0;
+
+ put_head_line(w, p);
+ break;
+ }
+ case EV_XPACKET:
+ {
+#if 0 /* VPS data (seems to be unused in .de */
+ u8 *p = ev->p1;
+
+ if (ev->i1 == 8 && ev->i2 == 30 && p[0]/2 == 1)
+ {
+ int i;
+ int pil, cni, pty, misc;
+
+ for (i = 7; i < 20; ++i)
+ p[i] = hamm8(p+i, &ev->i3);
+ if (ev->i3 & 0xf000) /* uncorrectable errors */
+ break;
+ cni = p[9] + p[15]/4*16 + p[16]%4*64 + p[10]%4*256
+ + p[16]/4*1024 + p[17]*4096;
+ pty = p[18] + p[19]*16;
+ pil = p[10]/4 + p[11]*4 + p[12]*64 + p[13]*1024
+ + p[14]*16384 + p[15]%4*262144;
+ misc = p[7] + p[8]*16;
+ err(w, "%02x %04x %05x %02x: %.20s", misc, cni, pil, pty, p+20);
+ }
+#endif
+ break;
+ }
+ case EV_ERR:
+ {
+ char *errmsg = ev->p1;
+ if (errmsg != NULL && *errmsg != '\0')
+ {
+ err(w, errmsg);
+ w->status = 30;
+ ev->p1 = NULL;
+ free(errmsg);
+ }
+ break;
+ }
+ }
+}
diff --git a/util/alevt/ui.h b/util/alevt/ui.h
new file mode 100644
index 0000000..9efc791
--- /dev/null
+++ b/util/alevt/ui.h
@@ -0,0 +1,35 @@
+#ifndef UI_H
+#define UI_H
+
+#include "vt.h"
+#include "xio.h"
+#include "vbi.h"
+#include "search.h"
+
+#define N_HISTORY (1 << 6) // number of history entries
+
+struct vtwin
+{
+ struct vtwin *parent, *child;
+ struct xio_win *xw;
+ struct vbi *vbi;
+ struct {
+ int pgno;
+ int subno;
+ } hist[N_HISTORY];
+ int hist_top;
+ int searching;
+ int revealed;
+ int hold;
+ int pgno, subno;
+ struct vt_page *vtp;
+ struct search *search;
+ int searchdir;
+ int status;
+ u8 statusline[W+1];
+ struct export *export;
+};
+
+extern struct vtwin *vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
+ struct vtwin *parent, int pgno, int subno);
+#endif
diff --git a/util/alevt/vbi.c b/util/alevt/vbi.c
new file mode 100644
index 0000000..6a8a47e
--- /dev/null
+++ b/util/alevt/vbi.c
@@ -0,0 +1,942 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include "os.h"
+#include "vt.h"
+#include "misc.h"
+#include "vbi.h"
+#include "fdset.h"
+#include "hamm.h"
+#include "lang.h"
+#include <libzvbi.h>
+
+
+static vbi_capture * pZvbiCapt;
+static vbi_raw_decoder * pZvbiRawDec;
+static vbi_sliced * pZvbiData;
+static vbi_proxy_client * pProxy;
+
+#define ZVBI_BUFFER_COUNT 10
+#define ZVBI_TRACE 0
+
+
+static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid);
+static void dvb_handler(struct vbi *vbi, int fd);
+
+#define FAC (1<<16) // factor for fix-point arithmetic
+
+static u8 *rawbuf; // one common buffer for raw vbi data
+static int rawbuf_size; // its current size
+u_int16_t sid;
+static char *vbi_names[]
+ = { "/dev/vbi", "/dev/vbi0", "/dev/video0", "/dev/dvb/adapter0/demux0",
+ NULL }; // default device names if none was given at the command line
+
+
+static void out_of_sync(struct vbi *vbi)
+{
+ int i; // discard all in progress pages
+ for (i = 0; i < 8; ++i)
+ vbi->rpage[i].page->flags &= ~PG_ACTIVE;
+}
+
+
+// send an event to all clients
+static void vbi_send(struct vbi *vbi, int type, int i1, int i2, int i3, void *p1)
+{
+ struct vt_event ev[1];
+ struct vbi_client *cl, *cln;
+ ev->resource = vbi;
+ ev->type = type;
+ ev->i1 = i1;
+ ev->i2 = i2;
+ ev->i3 = i3;
+ ev->p1 = p1;
+ for (cl = PTR vbi->clients->first; cln = PTR cl->node->next; cl = cln)
+ cl->handler(cl->data, ev);
+}
+
+
+static void vbi_send_page(struct vbi *vbi, struct raw_page *rvtp, int page)
+{
+ struct vt_page *cvtp = 0;
+
+ if (rvtp->page->flags & PG_ACTIVE)
+ {
+ if (rvtp->page->pgno % 256 != page)
+ {
+ rvtp->page->flags &= ~PG_ACTIVE;
+ enhance(rvtp->enh, rvtp->page);
+ if (vbi->cache)
+ cvtp = vbi->cache->op->put(vbi->cache, rvtp->page);
+ vbi_send(vbi, EV_PAGE, 0, 0, 0, cvtp ?: rvtp->page);
+ }
+ }
+}
+
+
+static void pll_add(struct vbi *vbi, int n, int err)
+{
+}
+
+
+// process one videotext packet
+static int vt_line(struct vbi *vbi, u8 *p)
+{
+ struct vt_page *cvtp;
+ struct raw_page *rvtp;
+ int hdr, mag, mag8, pkt, i;
+ int err = 0;
+
+ hdr = hamm16(p, &err);
+ if (err & 0xf000)
+ return -4;
+ mag = hdr & 7;
+ mag8 = mag?: 8;
+ pkt = (hdr >> 3) & 0x1f;
+ p += 2;
+ rvtp = vbi->rpage + mag;
+ cvtp = rvtp->page;
+ switch (pkt)
+ {
+ case 0:
+ {
+ int b1, b2, b3, b4;
+ b1 = hamm16(p, &err); // page number
+ b2 = hamm16(p+2, &err); // subpage number + flags
+ b3 = hamm16(p+4, &err); // subpage number + flags
+ b4 = hamm16(p+6, &err); // language code + more flags
+ if (vbi->ppage->page->flags & PG_MAGSERIAL)
+ vbi_send_page(vbi, vbi->ppage, b1);
+ vbi_send_page(vbi, rvtp, b1);
+
+ if (err & 0xf000)
+ return 4;
+
+ cvtp->errors = (err >> 8) + chk_parity(p + 8, 32);;
+ cvtp->pgno = mag8 * 256 + b1;
+ cvtp->subno = (b2 + b3 * 256) & 0x3f7f;
+ cvtp->lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1==LATIN1 ? 0 : 8);
+ cvtp->flags = b4 & 0x1f;
+ cvtp->flags |= b3 & 0xc0;
+ cvtp->flags |= (b2 & 0x80) >> 2;
+ cvtp->lines = 1;
+ cvtp->flof = 0;
+ vbi->ppage = rvtp;
+ pll_add(vbi, 1, cvtp->errors);
+ conv2latin(p + 8, 32, cvtp->lang);
+ vbi_send(vbi, EV_HEADER, cvtp->pgno, cvtp->subno, cvtp->flags, p);
+
+ if (b1 == 0xff)
+ return 0;
+ cvtp->flags |= PG_ACTIVE;
+ init_enhance(rvtp->enh);
+ memcpy(cvtp->data[0]+0, p, 40);
+ memset(cvtp->data[0]+40, ' ', sizeof(cvtp->data)-40);
+ return 0;
+ }
+
+ case 1 ... 24:
+ {
+ pll_add(vbi, 1, err = chk_parity(p, 40));
+
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0;
+
+ cvtp->errors += err;
+ cvtp->lines |= 1 << pkt;
+ conv2latin(p, 40, cvtp->lang);
+ memcpy(cvtp->data[pkt], p, 40);
+ return 0;
+ }
+ case 26:
+ {
+ int d, t[13];
+
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0;
+
+ d = hamm8(p, &err);
+ if (err & 0xf000)
+ return 4;
+
+ for (i = 0; i < 13; ++i)
+ t[i] = hamm24(p + 1 + 3*i, &err);
+ if (err & 0xf000)
+ return 4;
+
+ add_enhance(rvtp->enh, d, t);
+ return 0;
+ }
+ case 27:
+ {
+ int b1,b2,b3,x;
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0; // -1 flushes all pages. We may never resync again
+
+ b1 = hamm8(p, &err);
+ b2 = hamm8(p + 37, &err);
+ if (err & 0xf000)
+ return 4;
+ if (b1 != 0 || not(b2 & 8))
+ return 0;
+
+ for (i = 0; i < 6; ++i)
+ {
+ err = 0;
+ b1 = hamm16(p+1+6*i, &err);
+ b2 = hamm16(p+3+6*i, &err);
+ b3 = hamm16(p+5+6*i, &err);
+ if (err & 0xf000)
+ return 1;
+ x = (b2 >> 7) | ((b3 >> 5) & 0x06);
+ cvtp->link[i].pgno = ((mag ^ x) ?: 8) * 256 + b1;
+ cvtp->link[i].subno = (b2 + b3 * 256) & 0x3f7f;
+ }
+ cvtp->flof = 1;
+ return 0;
+ }
+ case 30:
+ {
+ if (mag8 != 8)
+ return 0;
+ p[0] = hamm8(p, &err); // designation code
+ p[1] = hamm16(p+1, &err); // initial page
+ p[3] = hamm16(p+3, &err); // initial subpage + mag
+ p[5] = hamm16(p+5, &err); // initial subpage + mag
+ if (err & 0xf000)
+ return 4;
+ err += chk_parity(p+20, 20);
+ conv2latin(p+20, 20, 0);
+ vbi_send(vbi, EV_XPACKET, mag8, pkt, err, p);
+ return 0;
+ }
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+
+// called when new vbi data is waiting
+static void vbi_handler(struct vbi *vbi, int fd)
+{
+ double timestamp;
+ struct timeval timeout;
+ int lineCount;
+ int line;
+ int res;
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 25000;
+ res = vbi_capture_read_sliced(pZvbiCapt, pZvbiData, &lineCount, &timestamp,
+ &timeout);
+ if (res > 0)
+ {
+ for (line=0; line < lineCount; line++)
+ {
+ if ((pZvbiData[line].id & VBI_SLICED_TELETEXT_B) != 0)
+ {
+ vt_line(vbi, pZvbiData[line].data);
+ }
+ }
+ }
+ else if (res < 0)
+ {
+ }
+}
+
+
+int vbi_add_handler(struct vbi *vbi, void *handler, void *data)
+{
+ struct vbi_client *cl;
+
+ if (not(cl = malloc(sizeof(*cl))))
+ return -1;
+ cl->handler = handler;
+ cl->data = data;
+ dl_insert_last(vbi->clients, cl->node);
+ return 0;
+}
+
+
+void vbi_del_handler(struct vbi *vbi, void *handler, void *data)
+{
+ struct vbi_client *cl;
+
+ for (cl = PTR vbi->clients->first; cl->node->next; cl = PTR cl->node->next)
+ if (cl->handler == handler && cl->data == data)
+ {
+ dl_remove(cl->node);
+ break;
+ }
+ return;
+}
+
+
+struct vbi * vbi_open(char *vbi_name, struct cache *ca,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid)
+{
+ static int inited = 0;
+ struct vbi *vbi;
+ char * pErrStr;
+ int services;
+
+ if (vbi_name == NULL)
+ {
+ int i;
+ char *tried_devices = NULL;
+ char *old_tried_devices = NULL;
+ for (i = 0; vbi_names[i] != NULL; i++)
+ {
+ vbi_name = vbi_names[i];
+ // collect device names for the error message below
+ if (old_tried_devices)
+ {
+ if (asprintf(&tried_devices, "%s, %s", old_tried_devices, vbi_name) < 0)
+ tried_devices = NULL;
+ free(old_tried_devices);
+ }
+ else if (asprintf(&tried_devices, "%s", vbi_name) < 0)
+ tried_devices = NULL;
+ if (tried_devices == NULL)
+ out_of_mem(-1);
+ old_tried_devices = tried_devices;
+ if (access(vbi_name, R_OK) != 0)
+ continue;
+ vbi = vbi_open(vbi_name, ca, channel, outfile, sid, ttpid);
+ if (vbi != NULL)
+ {
+ if (tried_devices != NULL)
+ free(tried_devices);
+ return vbi;
+ }
+ }
+
+ error("could not open any of the standard devices (%s)", tried_devices);
+ free(tried_devices);
+ return NULL;
+ }
+
+ if (not inited)
+ lang_init();
+ inited = 1;
+
+ if (not(vbi = malloc(sizeof(*vbi))))
+ {
+ error("out of memory");
+ goto fail1;
+ }
+ if (!vbi_dvb_open(vbi, vbi_name, channel, outfile, sid, ttpid)) {
+ vbi->cache = ca;
+ dl_init(vbi->clients);
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, dvb_handler, vbi);
+ return vbi;
+ }
+
+ services = VBI_SLICED_TELETEXT_B;
+ pErrStr = NULL;
+ vbi->fd = -1;
+
+ pProxy = vbi_proxy_client_create(vbi_name, "alevt",
+ VBI_PROXY_CLIENT_NO_STATUS_IND, &pErrStr, ZVBI_TRACE);
+ if (pProxy != NULL)
+ {
+ pZvbiCapt = vbi_capture_proxy_new(pProxy, ZVBI_BUFFER_COUNT, 0,
+ &services, 0, &pErrStr);
+ if (pZvbiCapt == NULL)
+ {
+ vbi_proxy_client_destroy(pProxy);
+ pProxy = NULL;
+ }
+ }
+ if (pZvbiCapt == NULL)
+ pZvbiCapt = vbi_capture_v4l2_new(vbi_name, ZVBI_BUFFER_COUNT,
+ &services, 0, &pErrStr, ZVBI_TRACE);
+ if (pZvbiCapt == NULL)
+ pZvbiCapt = vbi_capture_v4l_new(vbi_name, 0, &services, 0, &pErrStr,
+ ZVBI_TRACE);
+
+ if (pZvbiCapt != NULL)
+ {
+ pZvbiRawDec = vbi_capture_parameters(pZvbiCapt);
+ if ((pZvbiRawDec != NULL) && ((services & VBI_SLICED_TELETEXT_B) != 0))
+ {
+ pZvbiData = malloc((pZvbiRawDec->count[0] + pZvbiRawDec->count[1]) \
+ * sizeof(*pZvbiData));
+
+ vbi->fd = vbi_capture_fd(pZvbiCapt);
+ }
+ else
+ vbi_capture_delete(pZvbiCapt);
+ }
+
+ if (pErrStr != NULL)
+ {
+ fprintf(stderr, "libzvbi: %s\n", pErrStr);
+ free(pErrStr);
+ }
+
+ if (vbi->fd == -1)
+ goto fail2;
+ vbi->cache = ca;
+ dl_init(vbi->clients);
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
+ return vbi;
+
+fail3:
+ close(vbi->fd);
+fail2:
+ free(vbi);
+fail1:
+ return 0;
+}
+
+
+void vbi_close(struct vbi *vbi)
+{
+ fdset_del_fd(fds, vbi->fd);
+ if (vbi->cache)
+ vbi->cache->op->close(vbi->cache);
+
+ if (pZvbiData != NULL)
+ free(pZvbiData);
+ pZvbiData = NULL;
+
+ if (pZvbiCapt != NULL)
+ {
+ vbi_capture_delete(pZvbiCapt);
+ pZvbiCapt = NULL;
+ }
+ if (pProxy != NULL)
+ {
+ vbi_proxy_client_destroy(pProxy);
+ pProxy = NULL;
+ }
+ free(vbi);
+}
+
+
+struct vt_page * vbi_query_page(struct vbi *vbi, int pgno, int subno)
+{
+ struct vt_page *vtp = 0;
+ if (vbi->cache)
+ vtp = vbi->cache->op->get(vbi->cache, pgno, subno);
+ if (vtp == 0)
+ {
+ return 0;
+ }
+ vbi_send(vbi, EV_PAGE, 1, 0, 0, vtp);
+ return vtp;
+}
+
+
+void vbi_reset(struct vbi *vbi)
+{
+ if (vbi->cache)
+ vbi->cache->op->reset(vbi->cache);
+ vbi_send(vbi, EV_RESET, 0, 0, 0, 0);
+}
+
+
+/* Starting from here: DVB API */
+#include <linux/dvb/dmx.h>
+#include <linux/dvb/frontend.h>
+#include <linux/dvb/video.h>
+
+static int dvb_get_table(int fd, u_int16_t pid, u_int8_t tblid, u_int8_t *buf,
+ size_t bufsz)
+{
+ struct dmx_sct_filter_params sctFilterParams;
+ struct pollfd pfd;
+ int r;
+ memset(&sctFilterParams, 0, sizeof(sctFilterParams));
+ sctFilterParams.pid = pid;
+ sctFilterParams.timeout = 10000;
+ sctFilterParams.flags = DMX_ONESHOT | DMX_IMMEDIATE_START | DMX_CHECK_CRC;
+ sctFilterParams.filter.filter[0] = tblid;
+ sctFilterParams.filter.mask[0] = 0xff;
+ if (ioctl(fd, DMX_SET_FILTER, &sctFilterParams)) {
+ perror("DMX_SET_FILTER");
+ return -1;
+ }
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+ r = poll(&pfd, 1, 10000);
+ if (r < 0) {
+ perror("poll");
+ goto out;
+ }
+ if (r > 0) {
+ r = read(fd, buf, bufsz);
+ if (r < 0) {
+ perror("read");
+ goto out;
+ }
+ }
+ out:
+ ioctl(fd, DMX_STOP, 0);
+ return r;
+}
+
+static const u_int8_t byterev8[256] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+static void dvb_handle_pes_payload(struct vbi *vbi, const u_int8_t *buf,
+ unsigned int len)
+{
+ unsigned int p, i;
+ u_int8_t data[42];
+
+ if (buf[0] < 0x10 || buf[0] > 0x1f)
+ return; /* no EBU teletext data */
+ for (p = 1; p < len; p += /*6 + 40*/ 2 + buf[p + 1]) {
+#if 0
+ printf("Txt Line:\n"
+ " data_unit_id 0x%02x\n"
+ " data_unit_length 0x%02x\n"
+ " reserved_for_future_use 0x%01x\n"
+ " field_parity 0x%01x\n"
+ " line_offset 0x%02x\n"
+ " framing_code 0x%02x\n"
+ " magazine_and_packet_addr 0x%04x\n"
+ " data_block 0x%02x 0x%02x 0x%02x 0x%02x\n",
+ buf[p], buf[p+1],
+ buf[p+2] >> 6,
+ (buf[p+2] >> 5) & 1,
+ buf[p+2] & 0x1f,
+ buf[p+3],
+ (buf[p+4] << 8) | buf[p+5],
+ buf[p+6], buf[p+7], buf[p+8], buf[p+9]);
+#endif
+ for (i = 0; i < sizeof(data); i++)
+ data[i] = byterev8[buf[p+4+i]];
+ /* note: we should probably check for missing lines and then
+ * call out_of_sync(vbi); and/or vbi_reset(vbi); */
+ vt_line(vbi, data);
+ }
+}
+
+static unsigned int rawptr;
+
+static void dvb_handler(struct vbi *vbi, int fd)
+{
+ /* PES packet start code prefix and stream_id == private_stream_1 */
+ static const u_int8_t peshdr[4] = { 0x00, 0x00, 0x01, 0xbd };
+ u_int8_t *bp;
+ int n;
+ unsigned int p, i, len;
+ u_int16_t rpid;
+ u_int32_t crc, crccomp;
+
+ if (rawptr >= (unsigned int)rawbuf_size)
+ rawptr = 0;
+ n = read(vbi->fd, rawbuf + rawptr, rawbuf_size - rawptr);
+ if (n <= 0)
+ return;
+ rawptr += n;
+ if (rawptr < 6)
+ return;
+ if (memcmp(rawbuf, peshdr, sizeof(peshdr))) {
+ bp = memmem(rawbuf, rawptr, peshdr, sizeof(peshdr));
+ if (!bp)
+ return;
+ rawptr -= (bp - rawbuf);
+ memmove(rawbuf, bp, rawptr);
+ if (rawptr < 6)
+ return;
+ }
+ len = (rawbuf[4] << 8) | rawbuf[5];
+ if (len < 9) {
+ rawptr = 0;
+ return;
+ }
+ if (rawptr < len + 6)
+ return;
+ p = 9 + rawbuf[8];
+#if 0
+ for (i = 0; i < len - p; i++) {
+ if (!(i & 15))
+ printf("\n%04x:", i);
+ printf(" %02x", rawbuf[p + i]);
+ }
+ printf("\n");
+#endif
+ if (!dl_empty(vbi->clients))
+ dvb_handle_pes_payload(vbi, rawbuf + p, len - p);
+ rawptr -= len;
+ if (rawptr)
+ memmove(rawbuf, rawbuf + len, rawptr);
+}
+
+
+static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid)
+{
+ struct {
+ u_int16_t pmtpid;
+ u_int16_t ttpid;
+ u_int16_t service_id;
+ u_int8_t service_type;
+ char service_provider_name[64];
+ char service_name[64];
+ u_int8_t txtlang[3];
+ u_int8_t txttype;
+ u_int8_t txtmagazine;
+ u_int8_t txtpage;
+ } progtbl[16], *progp;
+ u_int8_t tbl[4096];
+ u_int8_t * ppname, * psname, pncode, sncode, pnlen, snlen;
+ int r;
+ FILE *ofd;
+ unsigned int i, j, k, l, progcnt = 0;
+ struct dmx_pes_filter_params filterpar;
+
+ /* open DVB demux device */
+ if (!vbi_name)
+ vbi_name = "/dev/dvb/adapter0/demux0";
+ if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
+ error("cannot open demux device %s", vbi_name);
+ return -1;
+ }
+ memset(progtbl, 0, sizeof(progtbl));
+ if (ttpid >= 0x15 && ttpid < 0x1fff) {
+ vbi->ttpid = ttpid;
+ printf("Using command line specified teletext PID 0x%x\n",
+ vbi->ttpid);
+ goto ttpidfound;
+ }
+ /* parse PAT to enumerate services and to find the PMT PIDs */
+ r = dvb_get_table(vbi->fd, 0, 0, tbl, sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) {
+ error("PAT not active (current_next_indicator == 0)");
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("PAT has multiple sections");
+ goto outerr;
+ }
+ if (r < 13) {
+ error("PAT too short\n");
+ goto outerr;
+ }
+ r -= 13;
+ for (i = 0; i < (unsigned)r; i += 4) {
+ if (progcnt >= sizeof(progtbl)/sizeof(progtbl[0])) {
+ error("Program table overflow");
+ goto outerr;
+ }
+ progtbl[progcnt].service_id = (tbl[8 + i] << 8) | tbl[9 + i];
+ if (!progtbl[progcnt].service_id) /* this is the NIT pointer */
+ continue;
+ progtbl[progcnt].pmtpid = ((tbl[10 + i] << 8) | tbl[11 + i])
+ & 0x1fff;
+ progcnt++;
+ }
+ /* find the SDT to get the station names */
+ r = dvb_get_table(vbi->fd, 0x11, 0x42, tbl, sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) {
+ error("SDT not active (current_next_indicator == 0)");
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("SDT has multiple sections");
+ goto outerr;
+ }
+ if (r < 12) {
+ error("SDT too short\n");
+ goto outerr;
+ }
+ i = 11;
+ while (i < (unsigned)r - 1) {
+ k = (tbl[i] << 8) | tbl[i+1]; /* service ID */
+ progp = NULL;
+ for (j = 0; j < progcnt; j++)
+ if (progtbl[j].service_id == k) {
+ progp = &progtbl[j];
+ break;
+ }
+ j = i + 5;
+ i = j + (((tbl[i+3] << 8) | tbl[i+4]) & 0x0fff);
+ if (!progp) {
+ error("SDT: service_id 0x%x not in PAT\n", k);
+ continue;
+ }
+ while (j < i) {
+ switch (tbl[j]) {
+ case 0x48: // service descriptor
+ k = j + 4 + tbl[j + 3];
+ progp->service_type = tbl[j+2];
+ ppname = tbl+j+4 ; // points to 1st byte of provider_name
+ pncode = *ppname ; // 1st byte of provider_name
+ pnlen = tbl[j+3]; // length of provider_name
+ psname = tbl+k+1 ; // points to 1st byte of service_name
+ sncode = *psname ; // 1st byte of service_name
+ snlen = tbl[k] ; // length of service_name
+ if (pncode >= 0x20) {
+ pncode = 0 ; // default character set Latin alphabet fig.A.1
+ } else {
+ ppname++ ; pnlen-- ;
+ // character code from table A.3 1st byte = ctrl-code
+ }
+ if (sncode >= 0x20) {
+ sncode = 0 ; // default character set Latin alphabet fig.A.1
+ } else {
+ psname++ ; snlen-- ;
+ // character code from table A.3 ; 1st byte = ctrl-code
+ }
+ snprintf(progp->service_provider_name,
+ sizeof(progp->service_provider_name), "%.*s", pnlen, ppname);
+ snprintf(progp->service_name,
+ sizeof(progp->service_name), "%.*s", snlen, psname); break;
+ }
+ j += 2 + tbl[j + 1]; // next descriptor
+ }
+ }
+ /* parse PMT's to find Teletext Services */
+ for (l = 0; l < progcnt; l++) {
+ progtbl[l].ttpid = 0x1fff;
+ if (progtbl[l].service_type != 0x01 || /* not digital TV */
+ progtbl[l].pmtpid < 0x15 || /* PMT PID sanity check */
+ progtbl[l].pmtpid >= 0x1fff)
+ continue;
+ r = dvb_get_table(vbi->fd, progtbl[l].pmtpid, 0x02, tbl,
+ sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) { error \
+ ("PMT pid 0x%x not active (current_next_indicator == 0)",
+ progtbl[l].pmtpid);
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("PMT pid 0x%x has multiple sections",
+ progtbl[l].pmtpid);
+ goto outerr;
+ }
+ if (r < 13) {
+ error("PMT pid 0x%x too short\n", progtbl[l].pmtpid);
+ goto outerr;
+ }
+ i = 12 + (((tbl[10] << 8) | tbl[11]) & 0x0fff);
+ /* skip program info section */
+ while (i <= (unsigned)r-6) {
+ j = i + 5;
+ i = j + (((tbl[i + 3] << 8) | tbl[i + 4]) & 0x0fff);
+ if (tbl[j - 5] != 0x06)
+ /* teletext streams have type 0x06 */
+ continue;
+ k = ((tbl[j - 4] << 8) | tbl[j - 3]) & 0x1fff;
+ /* elementary PID - save until we know if it's teletext PID */
+ while (j < i) {
+ switch (tbl[j]) {
+ case 0x56: /* EBU teletext descriptor */
+ progtbl[l].txtlang[0] = tbl[j + 2];
+ progtbl[l].txtlang[1] = tbl[j + 3];
+ progtbl[l].txtlang[2] = tbl[j + 4];
+ progtbl[l].txttype = tbl[j + 5] >> 3;
+ progtbl[l].txtmagazine = tbl[j + 5] & 7;
+ progtbl[l].txtpage = tbl[j + 6];
+ progtbl[l].ttpid = k;
+ break;
+ }
+ j += 2 + tbl[j + 1];
+ }
+ }
+ }
+
+ printf \
+ ("sid:pmtpid:ttpid:type:provider:name:language:texttype:magazine:page\n\n");
+ for (i = 0; i < progcnt; i++) {
+ printf("%d:%d:%d:%d:%s:%s:lang=%.3s:type=%d:magazine=%1u:page=%3u\n",
+ progtbl[i].service_id, progtbl[i].pmtpid, progtbl[i].ttpid,
+ progtbl[i].service_type, progtbl[i].service_provider_name,
+ progtbl[i].service_name, progtbl[i].txtlang, progtbl[i].txttype,
+ progtbl[i].txtmagazine, progtbl[i].txtpage);
+ }
+
+ if (*outfile) {
+ ofd = fopen(outfile,"w") ;
+ if (ofd == NULL) { error("cannot open outfile\n"); goto outerr ; }
+ for (i = 0; i < progcnt; i++) {
+ if (progtbl[i].ttpid == 0x1fff) continue ; // service without teletext
+ fprintf(ofd,"%d:%d:%s:%s:lang=%.3s\n",
+ progtbl[i].service_id, progtbl[i].ttpid, progtbl[i].service_provider_name,
+ progtbl[i].service_name, progtbl[i].txtlang);
+ }
+ fclose(ofd) ;
+ }
+
+ progp = NULL;
+
+ if (channel) {
+ j = strlen(channel);
+ for (i = 0; i < progcnt; i++)
+ if (!strncmp(progtbl[i].service_name, channel, j)
+ && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
+ break ;
+ }
+ }
+
+ if (channel && !progp) {
+ j = strlen(channel);
+ for (i = 0; i < progcnt; i++)
+ if (!strncasecmp(progtbl[i].service_name, channel, j)
+ && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
+ break ;
+ }
+ }
+
+ if (sid) {
+ for (i = 0; i < progcnt; i++) {
+ if ((progtbl[i].service_id == sid) && (progtbl[i].ttpid != 0x1fff)) {
+ progp = &progtbl[i]; break ; }
+ }
+ }
+
+ if (!progp) {
+ for (i = 0; i < progcnt; i++)
+ if (progtbl[i].ttpid != 0x1fff) {
+ progp = &progtbl[i]; break ;
+ }
+ }
+
+ printf("\nUsing: Service ID = %d ; PMT PID = %d ; TXT PID = %d ;\n"
+ "Service type = %d ; Provider Name = %s ; Service name = %s ;\n"
+ "language = %.3s ; Text type = %d ; Text Magazine = %1u ; Text page = %3u\n",
+ progp->service_id, progp->pmtpid, progp->ttpid, progp->service_type,
+ progp->service_provider_name, progp->service_name, progp->txtlang,
+ progp->txttype, progp->txtmagazine, progp->txtpage);
+ vbi->ttpid = progp->ttpid;
+
+ ttpidfound:
+ rawbuf = malloc(rawbuf_size = 8192);
+ if (!rawbuf)
+ goto outerr;
+ rawptr = 0;
+#if 0
+ close(vbi->fd);
+ if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
+ error("cannot open demux device %s", vbi_name);
+ return -1;
+ }
+#endif
+ memset(&filterpar, 0, sizeof(filterpar));
+ filterpar.pid = vbi->ttpid;
+ filterpar.input = DMX_IN_FRONTEND;
+ filterpar.output = DMX_OUT_TAP;
+ filterpar.pes_type = DMX_PES_OTHER;
+ filterpar.flags = DMX_IMMEDIATE_START;
+ if (ioctl(vbi->fd, DMX_SET_PES_FILTER, &filterpar) < 0) {
+ error("ioctl: DMX_SET_PES_FILTER %s (%u)", strerror(errno), errno);
+ goto outerr;
+ }
+ return 0;
+
+ outerr:
+ close(vbi->fd);
+ vbi->fd = -1;
+ return -1;
+}
+
+
+struct vbi *open_null_vbi(struct cache *ca)
+{
+ static int inited = 0;
+ struct vbi *vbi;
+
+ if (not inited)
+ lang_init();
+ inited = 1;
+
+ vbi = malloc(sizeof(*vbi));
+ if (!vbi)
+ {
+ error("out of memory");
+ goto fail1;
+ }
+
+ vbi->fd = open("/dev/null", O_RDONLY);
+ if (vbi->fd == -1)
+ {
+ error("cannot open null device");
+ goto fail2;
+ }
+
+ vbi->ttpid = -1;
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
+ return vbi;
+
+fail3:
+ close(vbi->fd);
+fail2:
+ free(vbi);
+fail1:
+ return 0;
+}
+
+
+void send_errmsg(struct vbi *vbi, char *errmsg, ...)
+{
+ va_list args;
+ if (errmsg == NULL || *errmsg == '\0')
+ return;
+ va_start(args, errmsg);
+ char *buff = NULL;
+ if (vasprintf(&buff, errmsg, args) < 0)
+ buff = NULL;
+ va_end(args);
+ if(buff == NULL)
+ out_of_mem(-1);
+ vbi_send(vbi, EV_ERR, 0, 0, 0, buff);
+}
diff --git a/util/alevt/vbi.h b/util/alevt/vbi.h
new file mode 100644
index 0000000..edb9dab
--- /dev/null
+++ b/util/alevt/vbi.h
@@ -0,0 +1,47 @@
+#ifndef VBI_H
+#define VBI_H
+
+#include "vt.h"
+#include "dllist.h"
+#include "cache.h"
+#include "lang.h"
+
+#define PLL_ADJUST 4
+
+struct raw_page
+{
+ struct vt_page page[1];
+ struct enhance enh[1];
+};
+
+struct vbi
+{
+ int fd;
+ struct cache *cache;
+ struct dl_head clients[1];
+ // page assembly
+ struct raw_page rpage[8]; // one for each magazin
+ struct raw_page *ppage; // points to page of previous pkt0
+ // DVB stuff
+ unsigned int ttpid;
+ u_int16_t sid;
+};
+
+struct vbi_client
+{
+ struct dl_node node[1];
+ void (*handler)(void *data, struct vt_event *ev);
+ void *data;
+};
+
+struct vbi *vbi_open(char *vbi_dev_name, struct cache *ca,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid);
+void vbi_close(struct vbi *vbi);
+void vbi_reset(struct vbi *vbi);
+int vbi_add_handler(struct vbi *vbi, void *handler, void *data);
+void vbi_del_handler(struct vbi *vbi, void *handler, void *data);
+struct vt_page *vbi_query_page(struct vbi *vbi, int pgno, int subno);
+
+struct vbi *open_null_vbi(struct cache *ca);
+void send_errmsg(struct vbi *vbi, char *errmsg, ...);
+#endif
diff --git a/util/alevt/vt.h b/util/alevt/vt.h
new file mode 100644
index 0000000..75986e8
--- /dev/null
+++ b/util/alevt/vt.h
@@ -0,0 +1,62 @@
+#ifndef VT_H
+#define VT_H
+
+#include "misc.h"
+
+#define W 40
+#define H 25
+#define BAD_CHAR 0xb8 // substitute for chars with bad parity
+
+struct vt_event
+{
+ int type;
+ void *resource; /* struct xio_win *, struct vbi *, ... */
+ int i1, i2, i3, i4;
+ void *p1;
+};
+
+#define EV_CLOSE 1
+#define EV_KEY 2 // i1:KEY_xxx i2:shift-flag
+#define EV_MOUSE 3 // i1:button i2:shift-flag i3:x i4:y
+#define EV_SELECTION 4 // i1:len p1:data
+#define EV_PAGE 5 // p1:vt_page i1:query-flag
+#define EV_HEADER 6 // i1:pgno i2:subno i3:flags p1:data
+#define EV_XPACKET 7 // i1:mag i2:pkt i3:errors p1:data
+#define EV_RESET 8 // ./.
+#define EV_TIMER 9 // ./.
+#define EV_ERR 10 // p1: errmsg
+#define KEY_F(i) (1000+i)
+#define KEY_LEFT 2001
+#define KEY_RIGHT 2002
+#define KEY_UP 2003
+#define KEY_DOWN 2004
+#define KEY_PUP 2005
+#define KEY_PDOWN 2006
+#define KEY_DEL 2007
+#define KEY_INS 2008
+
+struct vt_page
+{
+ int pgno, subno; // the wanted page number
+ int lang; // language code
+ int flags; // misc flags (see PG_xxx below)
+ int errors; // number of single bit errors in page
+ u32 lines; // 1 bit for each line received
+ u8 data[25][40]; // page contents
+ int flof; // page has FastText links
+ struct {
+ int pgno;
+ int subno;
+ } link[6]; // FastText links (FLOF)
+};
+
+#define PG_SUPPHEADER 0x01 // C7 row 0 is not to be displayed
+#define PG_OUTOFSEQ 0x04 // C9 page out of numerical order
+#define PG_NODISPLAY 0x08 // C10 rows 1-24 is not to be displayed
+#define PG_MAGSERIAL 0x10 // C11 serial trans. (any pkt0 terminates page)
+#define PG_ERASE 0x20 // C4 clear previously stored lines
+#define PG_NEWSFLASH 0x40 // C5 box it and insert into normal video pict.
+#define PG_SUBTITLE 0x80 // C6 box it and insert into normal video pict.
+#define PG_ACTIVE 0x100 // currently fetching this page
+#define ANY_SUB 0x3f7f // universal subpage number
+#endif
diff --git a/util/alevt/vt900.out b/util/alevt/vt900.out
new file mode 100644
index 0000000..558ee67
--- /dev/null
+++ b/util/alevt/vt900.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Contents: ",
+"\6\15Contents: ",
+"\24 #################################### ",
+" ",
+" \3\177\6Starting alevt . . . . . . 902 ",
+" ",
+" \3\177\6Copying/Warranty . . . . . 904 ",
+" ",
+" \3\177\6The Status Line . . . . . 905 ",
+" ",
+" \3\177\6Selecting Pages . . . . . 907 ",
+" ",
+" \3\177\6QuickClick Page . . . . . 915 ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" (Click to select a page) ",
+" ",
+"\4\35\7 Next 901 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt901.out b/util/alevt/vt901.out
new file mode 100644
index 0000000..1bde77c
--- /dev/null
+++ b/util/alevt/vt901.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Contents: ",
+"\6\15Contents: ",
+"\24 #################################### ",
+" ",
+"\6 \3\177\6FastText Menu . . . . . . 909 ",
+"\6 ",
+"\6 \3\177\6Keyboard Commands . . . . 910 ",
+"\6 ",
+"\6 \3\177\6Starting alevt-cap . . . . 912 ",
+"\6 ",
+"\6 \3\177\6Starting alevt-date . . . 914 ",
+"\6 ",
+"\6 \3\177\6QuickClick Page . . . . . 915 ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" (Click to select a page) ",
+" ",
+"\4\35\7Back 900 Index 900 Next 902 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt902.out b/util/alevt/vt902.out
new file mode 100644
index 0000000..665b41d
--- /dev/null
+++ b/util/alevt/vt902.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt: ",
+"\6\15Starting alevt: ",
+"\24 #################################### ",
+"\6 $\7alevt\6[options] Default: ",
+" ",
+" -c\6<channel name> (none;dvb only) ",
+" -ch -child\6<ppp.ss> (none) ",
+" -cs -charset \6latin-1 ",
+" \6<latin-1/2/koi8-r/ ",
+" \6iso8859-7> ",
+" -h -help ",
+" ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 901 Index 900 Next 903 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt903.out b/util/alevt/vt903.out
new file mode 100644
index 0000000..0df75c1
--- /dev/null
+++ b/util/alevt/vt903.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt: ",
+"\6\15Starting alevt: ",
+"\24 #################################### ",
+"\6 $\7alevt\6[options] Default: ",
+" -o\6<outfile> (none;dvb only) ",
+" -p -parent\6<ppp.ss> 900 ",
+" -s -sid\6<sid> (none;dvb only) ",
+" -t -ttpid\6<ttpid> (none;dvb only) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 902 Index 900 Next 904 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt904.out b/util/alevt/vt904.out
new file mode 100644
index 0000000..d13dcfd
--- /dev/null
+++ b/util/alevt/vt904.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Copying: ",
+"\6\15Copying: ",
+"\24 #################################### ",
+"\6 2002-07 Edgar Toernig (froese@gmx.de) ",
+"\6 All Rights Reserved. ",
+"\6 ",
+"\6 This program is free software; you ",
+"\6 can redistribute it and/or modify it ",
+"\6 under the terms of the GNU General ",
+"\6 Public License Version 2 as published ",
+"\6 by the Free Software Foundation. ",
+"\6 ",
+"\6 This program is distributed in the ",
+"\6 hope that it will be useful, but ",
+"\6\7without any warranty.\6See the GNU ",
+"\6 General Public License for details. ",
+" ",
+"\4\35\7Back 903 Index 900 Next 905 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt905.out b/util/alevt/vt905.out
new file mode 100644
index 0000000..b445ebb
--- /dev/null
+++ b/util/alevt/vt905.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Status Line: ",
+"\6\15Status Line: ",
+"\24 #################################### ",
+"\6 The top line of each window is the ",
+"\6 status line. On the left it shows ",
+"\6 the current page number (CPN) and ",
+"\6 some flags. The rest of the line ",
+"\6 is the running header sent by the ",
+"\6 TV station. ",
+"\6 ",
+"\6 If the CPN is red, the program is ",
+"\6 searching for that page. If it's ",
+"\6 green, it's the PN of the currently ",
+"\6 displayed page. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 904 Index 900 Next 906 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt906.out b/util/alevt/vt906.out
new file mode 100644
index 0000000..156b481
--- /dev/null
+++ b/util/alevt/vt906.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Status Line: \14\5\30 ",
+"\6\15Status Line: \14\5\30 ",
+"\24 #################################### ",
+"\6 An\2H\6behind the CPN indicates that ",
+"\6 the page is on hold. This inhibits ",
+"\6 subpage cycling and page updates. A ",
+"\6 click on the CPN toggles the\2H\6flag.",
+" ",
+"\6 A\5*\6indicates that the page ",
+"\6 contains concealed text. Clicking on ",
+"\6 the\5*\6reveals that text. ",
+" ",
+"\6 A CPN in the form\2Sxx\6is shown if a ",
+"\6 specific subpage is selected. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 905 Index 900 Next 907 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt907.out b/util/alevt/vt907.out
new file mode 100644
index 0000000..6aeb4e6
--- /dev/null
+++ b/util/alevt/vt907.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Selecting Pages: ",
+"\6\15Selecting Pages: ",
+"\24 #################################### ",
+"\6 To select a specific page, you may ",
+"\6 either enter the page number with ",
+"\6 the keyboard or click with the\7left ",
+"\6 mouse button on a page number ",
+"\6 somewhere on the screen. ",
+"\6 ",
+"\6 Clicking with the\7middle\6button will ",
+"\6 show the page in a child window. If ",
+"\6 there is no child window, a new one ",
+"\6 will be opened. ",
+"\6 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 906 Index 900 Next 908 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt908.out b/util/alevt/vt908.out
new file mode 100644
index 0000000..851a9b5
--- /dev/null
+++ b/util/alevt/vt908.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Selecting Pages: ",
+"\6\15Selecting Pages: ",
+"\24 #################################### ",
+"\6 AleVT also recognizes something like ",
+"\3 3/7\6as a valid page number. Clicking ",
+"\6 with the\7left\6button will cycle to ",
+"\6 the next subpage of the current page. ",
+"\6 The\7middle\6buttons cycles backwards. ",
+"\6 ",
+"\6 For each window a history of ",
+"\6 recently visited pages is kept. ",
+"\6 Pressing the\7right\6mouse button will ",
+"\6 take you back to the previous page. ",
+"\6 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 907 Index 900 Next 909 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt909.out b/util/alevt/vt909.out
new file mode 100644
index 0000000..0b28450
--- /dev/null
+++ b/util/alevt/vt909.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15FastText Menu: ",
+"\6\15FastText Menu: ",
+"\24 #################################### ",
+"\6 The last line of each window shows ",
+"\6 the FastText Menu (only if one is ",
+"\6 transmitted for that page). ",
+"\6 ",
+"\6 It consists of up to four colored ",
+"\6 labels. You may click on a label ",
+"\6 or press one of the function keys ",
+"\6 F1-F4 to go to the associated page. ",
+"\6 ",
+"\6 For the 5th (white) key present on ",
+"\6 some remote controls press F5. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 908 Index 900 Next 910 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt910.out b/util/alevt/vt910.out
new file mode 100644
index 0000000..d3a2095
--- /dev/null
+++ b/util/alevt/vt910.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Keyboard Commands: ",
+"\6\15Keyboard Commands: ",
+"\24 #################################### ",
+" 0\6-\0079 \6Enter page number ",
+" q\6or\7ESC \6Close window ",
+" h \6Goto page 900 (help page) ",
+" i \6Goto page 100 (index page) ",
+" o \6Open a new window ",
+" SPACE \6Hold page ",
+" RIGHT \6Goto next page ",
+" LEFT \6Goto previous page ",
+" DOWN \6Goto next subpage ",
+" UP \6Goto previous subpage ",
+" BACKSPACE\6Previous page from history ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 909 Index 900 Next 911 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt911.out b/util/alevt/vt911.out
new file mode 100644
index 0000000..49e6cc1
--- /dev/null
+++ b/util/alevt/vt911.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \007 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Keyboard Commands: ",
+"\6\15Keyboard Commands: ",
+"\24 #################################### ",
+" s \6Save page to file ",
+" c \6Clear page cache ",
+" r \6Reveal concealed text ",
+" F1\6-\7F5 \6FastText keys ",
+" /\6and\7? \6Search forward/backward ",
+" n\6and\7N \6Search next/previous ",
+" f\6and\7F \6Fine tune the decoder ",
+" e \6Error reduction on/off ",
+" b \6Error bell on/off ",
+"\6 Holding the\7shift\6key while pressing ",
+"\6 one of the\7cursor\6keys allows ",
+"\6 selecting the 'hex' pages (Ex.: 1f1). ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+"\4\35\7Back 910 Index 900 Next 912 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt912.out b/util/alevt/vt912.out
new file mode 100644
index 0000000..6fd7d12
--- /dev/null
+++ b/util/alevt/vt912.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-cap: ",
+"\6\15Starting alevt-cap: ",
+"\24 #################################### ",
+"\6 $\7alevt-cap\6[options] Default: ",
+" ",
+" -cs -charset \6latin-1 ",
+" \6<latin-1/2/koi8-r/ ",
+" \6iso8859-7> ",
+" -f -format \6ascii ",
+" \6<fmt,options> ",
+" -f help -format help ",
+" -h -help ",
+" -n -name \6<filename> ttext-%s.%e ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 911 Index 900 Next 913 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt913.out b/util/alevt/vt913.out
new file mode 100644
index 0000000..e0f4878
--- /dev/null
+++ b/util/alevt/vt913.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-cap: ",
+"\6\15Starting alevt-cap: ",
+"\24 #################################### ",
+"\6 $\7alevt-cap\6[options] Default: ",
+" ",
+" -s -sid\6<sid> (none;dvb only) ",
+" -t -ttpid\6<ttpid> (none;dvb only) ",
+" -to -timeout\6<secs> (none) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 912 Index 900 Next 914 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt914.out b/util/alevt/vt914.out
new file mode 100644
index 0000000..a55eed1
--- /dev/null
+++ b/util/alevt/vt914.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-date: ",
+"\6\15Starting alevt-date: ",
+"\24 #################################### ",
+"\6 $\7alevt-date\6[options] Default: ",
+" ",
+" -d -delta\6<max_secs> 7200 (2 hours) ",
+" -f -format\6<fmtstr> %c ",
+" -h -help ",
+" -s -set \6off ",
+" -to -timeout\6<seconds>(none) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 913 Index 900 Next 915 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt915.out b/util/alevt/vt915.out
new file mode 100644
index 0000000..66041ac
--- /dev/null
+++ b/util/alevt/vt915.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15QuickClick: ",
+"\6\15QuickClick: ",
+"\24 #################################### ",
+"\6 100 200 300 400 500 600 700 800 ",
+"\6 101 201 301 401 501 601 701 801 ",
+"\6 110 210 310 410 510 610 710 810 ",
+"\6 120\006220 320 420 520 620 720 820 ",
+"\6 130 230 330 430 530 630 730 830 ",
+"\6 140\006240 340 440 540 640 740 840 ",
+"\6 150 250 350 450 550 650 750 850 ",
+"\6 160\006260 360 460 560 660 760 860 ",
+"\6 170 270 370 470 570 670 770 870 ",
+"\6 180\006280 380 480 580 680 780 880 ",
+"\6 190 290 390 490 590 690 790 890 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7 Index 900 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vtxt-iso8859-7.bdf b/util/alevt/vtxt-iso8859-7.bdf
new file mode 100644
index 0000000..7d62c95
--- /dev/null
+++ b/util/alevt/vtxt-iso8859-7.bdf
@@ -0,0 +1,5768 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 4.5."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 250
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0600
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+0C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A0 NO-BREAK SPACE
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+02BD MODIFIER LETTER REVERSED COMMA
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+1000
+1000
+0800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+02BC MODIFIER LETTER APOSTROPHE
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0800
+0800
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A3 POUND SIGN
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1000
+1000
+1000
+7C00
+1000
+1000
+1000
+3E00
+6100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A6 BROKEN BAR
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+0800
+0800
+0000
+0000
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A7 SECTION SIGN
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4000
+3C00
+4200
+4200
+3C00
+0200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A8 DIAERESIS
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A9 COPYRIGHT SIGN
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+9900
+A500
+A100
+A100
+A500
+9900
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1200
+1200
+2400
+2400
+4800
+2400
+2400
+1200
+1200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AC NOT SIGN
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7E00
+0200
+0200
+0200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AD SOFT HYPHEN
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+2015 HORIZONTAL BAR
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B0 DEGREE SIGN
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+2800
+2800
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B1 PLUS-MINUS SIGN
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+0800
+7F00
+0800
+0800
+0800
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B2 SUPERSCRIPT TWO
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+2200
+0200
+1C00
+2000
+2000
+3E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B3 SUPERSCRIPT THREE
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+2200
+0200
+1C00
+0200
+2200
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0384 GREEK TONOS
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0385 GREEK DIALYTIKA TONOS
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+1000
+4400
+4400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+1800
+2400
+2400
+4200
+4200
+7E00
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B7 MIDDLE DOT
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+7E00
+4000
+4000
+4000
+7C00
+4000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0389 GREEK CAPITAL LETTER ETA WITH TONOS
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+4200
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038A GREEK CAPITAL LETTER IOTA WITH TONOS
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4800
+4800
+2400
+2400
+1200
+2400
+2400
+4800
+4800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00BD VULGAR FRACTION ONE HALF
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2200
+6200
+2400
+2800
+2800
+1400
+1A00
+2200
+4400
+4E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3E00
+4100
+4100
+4100
+4100
+2200
+1400
+1400
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1000
+5400
+4400
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0391 GREEK CAPITAL LETTER ALPHA
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+2400
+2400
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0392 GREEK CAPITAL LETTER BETA
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+4200
+4200
+4200
+7C00
+4200
+4200
+4200
+4200
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0393 GREEK CAPITAL LETTER GAMMA
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0394 GREEK CAPITAL LETTER DELTA
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+1400
+1400
+2200
+2200
+2200
+4100
+4100
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0395 GREEK CAPITAL LETTER EPSILON
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+4000
+4000
+7C00
+4000
+4000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0396 GREEK CAPITAL LETTER ZETA
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+0200
+0200
+0400
+0800
+1000
+2000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0397 GREEK CAPITAL LETTER ETA
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0398 GREEK CAPITAL LETTER THETA
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0399 GREEK CAPITAL LETTER IOTA
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039A GREEK CAPITAL LETTER KAPPA
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4400
+4800
+5000
+6000
+6000
+5000
+4800
+4400
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039B GREEK CAPITAL LETTER LAMDA
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+1400
+1400
+2200
+2200
+2200
+4100
+4100
+4100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039C GREEK CAPITAL LETTER MU
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+6600
+6600
+5A00
+5A00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039D GREEK CAPITAL LETTER NU
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+6200
+6200
+5200
+5200
+4A00
+4A00
+4600
+4600
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039E GREEK CAPITAL LETTER XI
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+0000
+0000
+0000
+3C00
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039F GREEK CAPITAL LETTER OMICRON
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A0 GREEK CAPITAL LETTER PI
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A1 GREEK CAPITAL LETTER RHO
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+4200
+4200
+4200
+7C00
+4000
+4000
+4000
+4000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A3 GREEK CAPITAL LETTER SIGMA
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+2000
+1000
+0800
+0800
+1000
+2000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A4 GREEK CAPITAL LETTER TAU
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A5 GREEK CAPITAL LETTER UPSILON
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A6 GREEK CAPITAL LETTER PHI
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+0800
+3E00
+4900
+4900
+4900
+4900
+3E00
+0800
+1C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A7 GREEK CAPITAL LETTER CHI
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+2400
+2400
+1800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A8 GREEK CAPITAL LETTER PSI
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A9 GREEK CAPITAL LETTER OMEGA
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+4100
+4100
+4100
+4100
+4100
+2200
+1400
+1400
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AC GREEK SMALL LETTER ALPHA WITH TONOS
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3200
+4A00
+4400
+4400
+4400
+4400
+4A00
+3200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AD GREEK SMALL LETTER EPSILON WITH TONOS
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3E00
+4000
+4000
+3C00
+4000
+4000
+4000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AE GREEK SMALL LETTER ETA WITH TONOS
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+5C00
+6200
+4200
+4200
+4200
+4200
+4200
+4200
+0200
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AF GREEK SMALL LETTER IOTA WITH TONOS
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+4400
+4400
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B1 GREEK SMALL LETTER ALPHA
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3200
+4A00
+4400
+4400
+4400
+4400
+4A00
+3200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B2 GREEK SMALL LETTER BETA
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+4400
+4400
+4400
+7C00
+4200
+4200
+4200
+6200
+5C00
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B3 GREEK SMALL LETTER GAMMA
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3100
+4900
+0A00
+0400
+0800
+0800
+1000
+1000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B4 GREEK SMALL LETTER DELTA
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+2000
+2000
+2000
+1800
+2400
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B5 GREEK SMALL LETTER EPSILON
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4000
+3C00
+4000
+4000
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B6 GREEK SMALL LETTER ZETA
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2000
+2000
+1C00
+0800
+1000
+2000
+2000
+2000
+2000
+1C00
+0200
+1C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B7 GREEK SMALL LETTER ETA
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+5C00
+6200
+4200
+4200
+4200
+4200
+4200
+4200
+0200
+0200
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B8 GREEK SMALL LETTER THETA
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+2400
+2400
+4200
+7E00
+4200
+4200
+2400
+2400
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B9 GREEK SMALL LETTER IOTA
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BA GREEK SMALL LETTER KAPPA
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+2200
+2400
+2800
+3000
+3000
+2800
+2400
+2200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BB GREEK SMALL LETTER LAMDA
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2000
+2000
+1000
+1000
+0800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BC GREEK SMALL LETTER MU
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4200
+6600
+6600
+5A00
+4200
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BD GREEK SMALL LETTER NU
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4400
+4400
+4800
+5000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BE GREEK SMALL LETTER XI
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4000
+4000
+3C00
+4000
+4000
+3C00
+4000
+4000
+3C00
+0200
+0200
+3C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BF GREEK SMALL LETTER OMICRON
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C0 GREEK SMALL LETTER PI
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+7E00
+2400
+2400
+2400
+2400
+2400
+2400
+2400
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C1 GREEK SMALL LETTER RHO
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+6200
+5C00
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C2 GREEK SMALL LETTER FINAL SIGMA
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1E00
+2000
+4000
+4000
+4000
+2000
+1C00
+0200
+0200
+1C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C3 GREEK SMALL LETTER SIGMA
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3F00
+4800
+4400
+4400
+4400
+4400
+4400
+3800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C4 GREEK SMALL LETTER TAU
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+7E00
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C5 GREEK SMALL LETTER UPSILON
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C6 GREEK SMALL LETTER PHI
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3E00
+4900
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C7 GREEK SMALL LETTER CHI
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+2400
+2400
+1800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C8 GREEK SMALL LETTER PSI
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C9 GREEK SMALL LETTER OMEGA
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+2200
+4100
+4100
+4900
+4900
+4900
+4900
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CC GREEK SMALL LETTER OMICRON WITH TONOS
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CD GREEK SMALL LETTER UPSILON WITH TONOS
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CE GREEK SMALL LETTER OMEGA WITH TONOS
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+0800
+0000
+0000
+2200
+4100
+4100
+4900
+4900
+4900
+4900
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-koi8.bdf b/util/alevt/vtxt-koi8.bdf
new file mode 100644
index 0000000..a7398b2
--- /dev/null
+++ b/util/alevt/vtxt-koi8.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 3.0."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char161
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+1800
+3C00
+3C00
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+1800
+7E00
+C300
+C000
+C000
+C000
+C300
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+6600
+3C00
+1800
+FF00
+1800
+FF00
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+7E00
+DB00
+FF00
+BD00
+C300
+E700
+FF00
+7E00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5100
+5100
+5D00
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+0C00
+3C00
+6400
+3C00
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+3000
+7F00
+7F00
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5500
+5900
+5500
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char177
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char178
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+1800
+3000
+6400
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char179
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7C00
+0C00
+1800
+0C00
+6C00
+3800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char181
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+7E00
+6300
+6000
+C000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char182
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+DB00
+DB00
+DB00
+7B00
+1B00
+1B00
+1B00
+1B00
+1B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char183
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+7000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char186
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+4400
+6C00
+3800
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0C00
+0600
+7F00
+7F00
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char188
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3000
+6700
+4D80
+0300
+0600
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7800
+1800
+3900
+1B00
+7600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char191
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+3000
+6000
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+CE00
+DB00
+DB00
+FB00
+DB00
+DB00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char160
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7800
+0C00
+7C00
+CC00
+CC00
+CC00
+7600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char161
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0200
+0600
+3C00
+6000
+6000
+7C00
+6600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char230
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+FE00
+0600
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1E00
+3600
+3600
+6600
+6600
+6600
+FF00
+C300
+C300
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+FE00
+C000
+C000
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+1800
+7E00
+DB00
+DB00
+DB00
+DB00
+7E00
+1800
+1800
+3C00
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+3200
+3200
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char229
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+6C00
+3800
+3800
+3800
+6C00
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+CE00
+D600
+E600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3800
+3800
+C600
+C600
+CE00
+D600
+E600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+6C00
+7800
+7800
+6C00
+6600
+E600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1E00
+3600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+EE00
+FE00
+FE00
+D600
+D600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+FE00
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+C600
+C600
+C600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FE00
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+CC00
+CC00
+FC00
+6C00
+CC00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+DC00
+6600
+6600
+6600
+6600
+6600
+7C00
+6000
+6000
+F000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+C000
+C000
+C000
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+5A00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+C600
+7C00
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+5400
+7C00
+5400
+D600
+D600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FC00
+6600
+6600
+7C00
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+6000
+6000
+7C00
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+F600
+DE00
+DE00
+F600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+6600
+0600
+0C00
+0600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+D600
+D600
+D600
+D600
+FE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+6600
+0600
+1E00
+0600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+D600
+D600
+D600
+D600
+FE00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F800
+B000
+3000
+3E00
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char158
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+CE00
+DB00
+DB00
+DB00
+FB00
+DB00
+DB00
+DB00
+DB00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char128
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+C600
+C600
+FE00
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char129
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6200
+6200
+6000
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char150
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+FE00
+0600
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char132
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+FF00
+C300
+8100
+0000
+0000
+ENDCHAR
+STARTCHAR char133
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6600
+6200
+6800
+7800
+6800
+6000
+6200
+6600
+FE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char148
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3C00
+1800
+7E00
+DB00
+DB00
+DB00
+DB00
+DB00
+7E00
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char131
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6200
+6200
+6000
+6000
+6000
+6000
+6000
+6000
+F000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char149
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+6C00
+7C00
+3800
+3800
+7C00
+6C00
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char136
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+CE00
+CE00
+D600
+E600
+E600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char137
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3800
+3800
+C600
+C600
+CE00
+CE00
+D600
+E600
+E600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char138
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+E600
+6600
+6C00
+6C00
+7800
+7800
+6C00
+6C00
+6600
+E600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char139
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char140
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+EE00
+FE00
+FE00
+D600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char141
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+FE00
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char142
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char143
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char159
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3F00
+6600
+6600
+6600
+3E00
+3E00
+6600
+6600
+6600
+E700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char144
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FC00
+6600
+6600
+6600
+7C00
+6000
+6000
+6000
+6000
+F000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char145
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C200
+C000
+C000
+C000
+C000
+C200
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char146
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char147
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char134
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+D600
+D600
+5400
+5400
+7C00
+7C00
+5400
+D600
+D600
+D600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char130
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FC00
+6600
+6600
+6600
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char156
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+F000
+6000
+6000
+6000
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char155
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+F300
+DB00
+DB00
+DB00
+DB00
+F300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char135
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+0600
+0600
+3C00
+0600
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char152
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char157
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+0600
+2600
+3E00
+2600
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char153
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+FF00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char151
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char154
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+F800
+B000
+3000
+3000
+3C00
+3600
+3600
+3600
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-latin-1.bdf b/util/alevt/vtxt-latin-1.bdf
new file mode 100644
index 0000000..2f1a11b
--- /dev/null
+++ b/util/alevt/vtxt-latin-1.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 2.4."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char161
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+1800
+3C00
+3C00
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+1800
+7E00
+C300
+C000
+C000
+C000
+C300
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+6600
+3C00
+1800
+FF00
+1800
+FF00
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+7E00
+DB00
+FF00
+BD00
+C300
+E700
+FF00
+7E00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5100
+5100
+5D00
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+0C00
+3C00
+6400
+3C00
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+3000
+7F00
+7F00
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5500
+5900
+5500
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char177
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char178
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+1800
+3000
+6400
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char179
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7C00
+0C00
+1800
+0C00
+6C00
+3800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char181
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+7E00
+6300
+6000
+C000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char182
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+DB00
+DB00
+DB00
+7B00
+1B00
+1B00
+1B00
+1B00
+1B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char183
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+7000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char186
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+4400
+6C00
+3800
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0C00
+0600
+7F00
+7F00
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char188
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3000
+6700
+4D80
+0300
+0600
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7800
+1800
+3900
+1B00
+7600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char191
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+3000
+6000
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char192
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0C00
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char193
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char194
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char195
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char197
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+1400
+1C00
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char198
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1F00
+3600
+6600
+6600
+7F00
+6600
+6600
+6600
+6600
+6700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char199
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6100
+3300
+1E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char200
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0C00
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char201
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char202
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char203
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char204
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char205
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char206
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3C00
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char207
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char208
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3600
+3300
+3300
+7B00
+7B00
+3300
+3300
+3600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char209
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char210
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char211
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char212
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char213
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char214
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char215
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6300
+3600
+1C00
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char216
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0100
+0300
+3E00
+6700
+6700
+6F00
+6B00
+6B00
+7B00
+7300
+7300
+3E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char217
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char218
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char219
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+1400
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char220
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char221
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char222
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+7800
+3000
+3E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char223
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+6300
+6700
+6E00
+6C00
+6600
+6300
+6B00
+6E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char229
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+1C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char230
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+1B00
+7E00
+D800
+DC00
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0C00
+0600
+3C00
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+3000
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0F00
+0600
+3E00
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char241
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char242
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char243
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char244
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char245
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char246
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char247
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+7E00
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char248
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0100
+0300
+3E00
+6700
+6F00
+6B00
+7B00
+7300
+3E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char249
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char250
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char251
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char252
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char253
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char254
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7800
+3000
+3E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char255
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-latin-2.bdf b/util/alevt/vtxt-latin-2.bdf
new file mode 100644
index 0000000..6505c6e
--- /dev/null
+++ b/util/alevt/vtxt-latin-2.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-2
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 3.3."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char65
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0600
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+3C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3C00
+3800
+3000
+7000
+F100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7B00
+3300
+3600
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+7E00
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0600
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0C00
+1800
+0E00
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1E00
+1C00
+1800
+3800
+7800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3980
+1980
+1B00
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+1C00
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0300
+1E00
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0180
+0980
+1B00
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3300
+6600
+CC00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6600
+3C00
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+0C00
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char193
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0300
+0600
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char194
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char195
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+3E00
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7C00
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char199
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6100
+3300
+1E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char200
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+1E00
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char201
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char202
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0C00
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char203
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char204
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+1E00
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char205
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char206
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3C00
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char207
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char208
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3600
+3300
+3300
+7B00
+7B00
+3300
+3300
+3600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char210
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char211
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char212
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char213
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+6600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char214
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char215
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6300
+3600
+1C00
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char216
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char217
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1400
+6B00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char218
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char219
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1B00
+3600
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char220
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char221
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0600
+3C00
+0000
+0000
+ENDCHAR
+STARTCHAR char223
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+6300
+6700
+6E00
+6C00
+6600
+6300
+6B00
+6E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0C00
+1800
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+3C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0C00
+0600
+3C00
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6600
+3C00
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+1800
+0E00
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6E00
+3600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0F00
+0600
+3E00
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char241
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char242
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char243
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char244
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char245
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3300
+6600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char246
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char247
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+7E00
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char248
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char249
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+2400
+2400
+1800
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char250
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char251
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3300
+6600
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char252
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char253
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0300
+1E00
+0000
+0000
+ENDCHAR
+STARTCHAR char255
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/xio.c b/util/alevt/xio.c
new file mode 100644
index 0000000..4c0bca2
--- /dev/null
+++ b/util/alevt/xio.c
@@ -0,0 +1,1156 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#define XK_MISCELLANY
+#define XK_LATIN1
+#include <X11/keysymdef.h>
+#include <sys/time.h>
+#include "vt.h"
+#include "misc.h"
+#include "dllist.h"
+#include "xio.h"
+#include "fdset.h"
+#include "lang.h"
+#include "icon.xbm"
+#include "font.h"
+
+#define WW (W*CW) /* pixel width of window */
+#define WH (H*CH) /* pixel hegiht of window */
+#define NO_SEL 999 /* sel_y1 value if no selection */
+#define SEL_MIN_TIME 500 /* anything shorter is a click */
+
+static struct dl_head dpys[1]; /* list of all displays */
+static void xio_timer(void *data, int fd);
+static void handle_event(struct xio *xio, int fd);
+
+
+static int timer_init(int argc, char **argv)
+{
+ int p[2], timer_pid, i;
+
+ if (pipe(p) == -1)
+ return -1;
+
+ signal(SIGPIPE, SIG_DFL);
+ timer_pid = fork();
+ if (timer_pid == -1)
+ return -1;
+ if (timer_pid > 0)
+ {
+ fdset_add_fd(fds, p[0], xio_timer, 0);
+ close(p[1]);
+ return 0;
+ }
+
+ close(p[0]);
+ for (i = 0; i < 32; ++i)
+ if (p[1] != i)
+ close(i);
+ memcpy(argv[0], "Timer", 6);
+
+ for (;;)
+ {
+ usleep(300000);
+ write(p[1], "*", 1);
+ }
+}
+
+
+static int local_init(int argc, char **argv)
+{
+ static int inited = 0;
+
+ if (inited)
+ return 0;
+
+ if (timer_init(argc, argv) == -1)
+ return -1;
+
+ dl_init(dpys);
+
+ inited = 1;
+ return 0;
+}
+
+
+static int get_colors(struct xio *xio)
+{
+ int i;
+ XColor c;
+
+ static short rgb[][3] =
+ {
+ { 0x0000,0x0000,0x0000 },
+ { 0xffff,0x0000,0x0000 },
+ { 0x0000,0xffff,0x0000 },
+ { 0xffff,0xffff,0x0000 },
+ { 0x0000,0x0000,0xffff },
+ { 0xffff,0x0000,0xffff },
+ { 0x0000,0xffff,0xffff },
+ { 0xffff,0xffff,0xffff },
+ { 0x7fff,0x7fff,0x7fff },
+ { 0x7fff,0x0000,0x0000 },
+ { 0x0000,0x7fff,0x0000 },
+ { 0x7fff,0x7fff,0x0000 },
+ { 0x0000,0x0000,0x7fff },
+ { 0x7fff,0x0000,0x7fff },
+ { 0x0000,0x7fff,0x7fff },
+ { 0x3fff,0x3fff,0x3fff },
+ };
+
+ for (i = 0; i < 16; ++i)
+ {
+ c.red = rgb[i][0];
+ c.green = rgb[i][1];
+ c.blue = rgb[i][2];
+ if (XAllocColor(xio->dpy, xio->cmap, &c) == 0)
+ return -1;
+ xio->color[i] = c.pixel;
+ }
+ return 0;
+}
+
+
+static int get_fonts(struct xio *xio)
+{
+ GC gc;
+ int i;
+ unsigned char *font_bits;
+ switch(latin1) {
+ case LATIN1: font_bits=font1_bits; break;
+ case LATIN2: font_bits=font2_bits; break;
+ case KOI8: font_bits=font3_bits; break;
+ case GREEK: font_bits=font4_bits; break;
+ default: font_bits=font1_bits; break;
+ }
+
+ xio->font[0] = XCreateBitmapFromData(xio->dpy, xio->root,
+ font_bits, font_width, font_height);
+ xio->font[1] = XCreatePixmap(xio->dpy, xio->root,
+ font_width, font_height*2, 1);
+ gc = XCreateGC(xio->dpy, xio->font[0], 0, 0);
+ for (i = 0; i < font_height; ++i)
+ {
+ XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
+ font_width, 1, 0, i*2);
+ XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
+ font_width, 1, 0, i*2+1);
+ }
+ XFreeGC(xio->dpy, gc);
+ return 0;
+}
+
+
+static void xlib_conn_watch(Display *dpy, void *fds, int fd, int open_flag, void *data)
+{
+ if (open_flag)
+ fdset_add_fd(fds, fd, XProcessInternalConnection, dpy);
+ else
+ fdset_del_fd(fds, fd);
+}
+
+
+struct xio * xio_open_dpy(char *dpy, int argc, char **argv)
+{
+ XClassHint classhint[1];
+ struct xio *xio;
+
+ if (local_init(argc, argv) == -1)
+ goto fail1;
+
+ if (not(xio = malloc(sizeof(*xio))))
+ goto fail1;
+
+ if (not(xio->dpy = XOpenDisplay(dpy)))
+ goto fail2;
+
+ xio->fd = ConnectionNumber(xio->dpy);
+ xio->argc = argc;
+ xio->argv = argv;
+ dl_init(xio->windows);
+ xio->screen = DefaultScreen(xio->dpy);
+ xio->depth = DefaultDepth(xio->dpy, xio->screen);
+ xio->width = DisplayWidth(xio->dpy, xio->screen);
+ xio->height = DisplayHeight(xio->dpy, xio->screen);
+ xio->root = DefaultRootWindow(xio->dpy);
+ xio->cmap = DefaultColormap(xio->dpy, xio->screen);
+ xio->xa_del_win = XInternAtom(xio->dpy, "WM_DELETE_WINDOW", False);
+ xio->xa_targets = XInternAtom(xio->dpy, "TARGETS", False);
+ xio->xa_timestamp = XInternAtom(xio->dpy, "TIMESTAMP", False);
+ xio->xa_multiple = XInternAtom(xio->dpy, "MULTIPLE", False);
+ xio->xa_text = XInternAtom(xio->dpy, "TEXT", False);
+
+ if (get_colors(xio) == -1)
+ goto fail3;
+
+ if (get_fonts(xio) == -1)
+ goto fail3;
+
+ if (fdset_add_fd(fds, xio->fd, handle_event, xio) == -1)
+ goto fail3;
+
+ XAddConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
+
+ xio->icon = XCreateBitmapFromData(xio->dpy, xio->root,
+ icon_bits, icon_width, icon_height);
+
+ xio->group_leader = XCreateSimpleWindow(xio->dpy, xio->root,
+ 0, 0, 1, 1, 0, 0, 0);
+ XSetCommand(xio->dpy, xio->group_leader, xio->argv, xio->argc);
+ classhint->res_name = "VTLeader";
+ classhint->res_class = "AleVT";
+ XSetClassHint(xio->dpy, xio->group_leader, classhint);
+
+ dl_insert_first(dpys, xio->node);
+ return xio;
+
+fail4:
+ fdset_del_fd(fds, xio->fd);
+fail3:
+ XCloseDisplay(xio->dpy);
+fail2:
+ free(xio);
+fail1:
+ return 0;
+}
+
+
+static void set_user_geometry(struct xio_win *xw, char *geom, XSizeHints *sh, int bwidth)
+{
+ static int gravs[] = { NorthWestGravity, NorthEastGravity,
+ SouthWestGravity, SouthEastGravity };
+ int f, g = 0;
+
+ f = XParseGeometry(geom, &sh->x, &sh->y, &sh->width, &sh->height);
+
+ if (f & WidthValue)
+ sh->width = sh->base_width + sh->width * sh->width_inc;
+ if (f & HeightValue)
+ sh->height = sh->base_height + sh->height * sh->height_inc;
+ if (f & XNegative)
+ g+=1, sh->x = xw->xio->width + sh->x - sh->width - bwidth;
+ if (f & YNegative)
+ g+=2, sh->y = xw->xio->height + sh->y - sh->height - bwidth;
+
+ sh->width = bound(sh->min_width, sh->width, sh->max_width);
+ sh->height = bound(sh->min_height, sh->height, sh->max_height);
+
+ if (f & (WidthValue | HeightValue))
+ sh->flags |= USSize;
+ if (f & (XValue | YValue))
+ sh->flags |= USPosition | PWinGravity;
+
+ sh->win_gravity = gravs[g];
+}
+
+
+struct xio_win * xio_open_win(struct xio *xio, char *geom)
+{
+ struct xio_win *xw;
+ XSetWindowAttributes attr;
+ XGCValues gcval;
+ XSizeHints sizehint[1];
+ XClassHint classhint[1];
+ XWMHints wmhint[1];
+
+ if (not(xw = malloc(sizeof(*xw))))
+ goto fail1;
+
+ xw->xio = xio;
+
+ sizehint->flags = PSize | PBaseSize | PMinSize | PMaxSize | PResizeInc;
+ sizehint->x = sizehint->y = 0;
+ sizehint->width_inc = CW;
+ sizehint->height_inc = CH;
+ sizehint->base_width = 0;
+ sizehint->base_height = 0;
+ sizehint->min_width = 11*CW;
+ sizehint->min_height = 1*CH;
+ sizehint->max_width = sizehint->width = WW + CW;
+ sizehint->max_height = sizehint->height = WH;
+ set_user_geometry(xw, geom, sizehint, 1);
+
+ attr.background_pixel = xio->color[0];
+ attr.event_mask = KeyPressMask |
+ ButtonPressMask|ButtonReleaseMask|Button1MotionMask |
+ ExposureMask;
+ xw->win = XCreateWindow(xio->dpy, xio->root,
+ sizehint->x, sizehint->y, sizehint->width, sizehint->height, 1,
+ CopyFromParent, CopyFromParent, CopyFromParent,
+ CWBackPixel|CWEventMask, &attr);
+
+ classhint->res_name = "VTPage";
+ classhint->res_class = "AleVT";
+
+ wmhint->flags = InputHint | StateHint | WindowGroupHint | IconPixmapHint;
+ wmhint->input = True;
+ wmhint->initial_state = NormalState; //IconicState;
+ wmhint->window_group = xio->group_leader;
+ wmhint->icon_pixmap = xio->icon;
+
+ XSetWMProperties(xio->dpy, xw->win, 0,0, 0,0, sizehint, wmhint, classhint);
+ XSetWMProtocols(xio->dpy, xw->win, &xio->xa_del_win, 1);
+
+ xw->title[0] = 0;
+ xio_title(xw, "AleVT"); // will be reset pretty soon
+
+ gcval.graphics_exposures = False;
+ xw->gc = XCreateGC(xio->dpy, xw->win, GCGraphicsExposures, &gcval);
+
+ xw->tstamp = CurrentTime;
+ xw->fg = xw->bg = -1; /* unknown colors */
+
+ xw->curs_x = xw->curs_y = 999; // no cursor
+
+ xw->sel_y1 = NO_SEL; /* no selection area */
+ xw->sel_start_t = 0; /* no selection-drag active */
+ xw->sel_set_t = 0; /* not selection owner */
+ xw->sel_pixmap = 0; /* no selection pixmap yet */
+
+ xio_clear_win(xw);
+ xw->blink_on = xw->reveal = 0;
+
+ xw->handler = 0;
+
+ XMapWindow(xio->dpy, xw->win);
+ dl_insert_first(xio->windows, xw->node);
+ return xw;
+
+fail2:
+ free(xw);
+fail1:
+ return 0;
+}
+
+
+void xio_close_win(struct xio_win *xw, int dpy_too)
+{
+ struct xio *xio = xw->xio;
+
+ XDestroyWindow(xio->dpy, xw->win);
+ dl_remove(xw->node);
+ free(xw);
+
+ if (dpy_too && dl_empty(xio->windows))
+ xio_close_dpy(xio);
+}
+
+
+void xio_close_dpy(struct xio *xio)
+{
+ while (not dl_empty(xio->windows))
+ xio_close_win((struct xio_win *)xio->windows->first, 0);
+
+ XDestroyWindow(xio->dpy, xio->group_leader);
+ XRemoveConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
+ fdset_del_fd(fds, xio->fd);
+ dl_remove(xio->node);
+ free(xio);
+}
+
+
+void xio_set_handler(struct xio_win *xw, void *handler, void *data)
+{
+ xw->handler = handler;
+ xw->data = data;
+}
+
+
+void xio_title(struct xio_win *xw, char *title)
+{
+ char buf[sizeof(xw->title) + 32];
+
+ if (strlen(title) >= sizeof(xw->title))
+ return; //TODO: trimm...
+ if (strcmp(xw->title, title) == 0)
+ return;
+
+ strcpy(xw->title, title);
+ sprintf(buf, "AleVT " VERSION " %s", xw->title);
+ XStoreName(xw->xio->dpy, xw->win, buf);
+ XSetIconName(xw->xio->dpy, xw->win, xw->title);
+}
+
+
+void xio_clear_win(struct xio_win *xw)
+{
+ memset(xw->ch, ' ', sizeof(xw->ch));
+ xw->dheight = xw->blink = xw->concealed = 0;
+ xw->hidden = xw->lhidden = 0;
+ xw->modified = ALL_LINES;
+}
+
+
+void xio_put_line(struct xio_win *xw, int y, u8 *data)
+{
+ u8 *p = xw->ch + y*W;
+ u8 *ep = p + W;
+ lbits yb = 1 << y;
+ lbits x = xw->dheight;
+
+ if (y < 0 || y >= H)
+ return;
+
+ if (memcmp(data, p, ep - p) == 0)
+ return;
+
+ xw->modified |= yb;
+ xw->blink &= ~yb;
+ xw->dheight &= ~yb;
+ xw->concealed &= ~yb;
+
+ while (p < ep)
+ switch (*p++ = *data++)
+ {
+ case 0x08:
+ xw->blink |= yb;
+ break;
+ case 0x0d:
+ if (y < H-1)
+ xw->dheight |= yb;
+ break;
+ case 0x18:
+ xw->concealed |= yb;
+ break;
+ }
+
+ if ((xw->dheight ^ x) & yb) // dheight has changed, recalc hidden
+ {
+ xw->hidden &= yb*2 - 1;
+ for (; yb & ALL_LINES/2; yb *= 2)
+ if (~xw->hidden & xw->dheight & yb)
+ xw->hidden |= yb*2;
+ }
+}
+
+
+void xio_put_str(struct xio_win *xw, int y, u8 *str)
+{
+ u8 buf[W];
+ int l;
+ l = strlen(str);
+ if (l < W)
+ {
+ memcpy(buf, str, l);
+ memset(buf + l, ' ', W - l);
+ }
+ else
+ memcpy(buf, str, W);
+ xio_put_line(xw, y, buf);
+}
+
+
+static void dirty(struct xio_win *xw, int y1, int y2) // mark [y1,y2[ dirty
+{
+ if (y1 >= 0 && y1 < H && y1 < y2)
+ {
+ if (y2 > H)
+ y2 = H;
+ if (xw->hidden & (1 << y1))
+ y1--;
+ while (y1 < y2)
+ xw->modified |= 1 << y1++;
+ }
+}
+
+
+int xio_get_line(struct xio_win *xw, int y, u8 *data)
+{
+ if (y < 0 || y >= H)
+ return -1;
+ if (xw->hidden & (1 << y))
+ y--;
+ memcpy(data, xw->ch + y*W, 40);
+ return 0;
+}
+
+
+void xio_set_cursor(struct xio_win *xw, int x, int y)
+{
+ if (xw->curs_y >= 0 && xw->curs_y < H)
+ dirty(xw, xw->curs_y, xw->curs_y + 1);
+ if (x >= 0 && x < W && y >= 0 && y < H)
+ dirty(xw, y, y + 1);
+ else
+ x = y = 999;
+ xw->curs_x = x;
+ xw->curs_y = y;
+}
+
+
+static inline void draw_char(struct xio_win *xw, Window win, int fg, int bg,
+ int c, int dbl, int x, int y, int ry)
+{
+ struct xio *xio = xw->xio;
+
+ if (fg != xw->fg)
+ XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = fg]);
+ if (bg != xw->bg)
+ XSetBackground(xio->dpy, xw->gc, xio->color[xw->bg = bg]);
+
+ if (dbl)
+ {
+ XCopyPlane(xio->dpy, xio->font[1], win, xw->gc,
+ c%32*CW, c/32*CH*2, CW, CH*2, x*CW, y*CH, 1);
+ }
+ else
+ {
+ XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
+ c%32*CW, c/32*CH, CW, CH, x*CW, y*CH, 1);
+ if (xw->dheight & (1<<ry))
+ XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
+ ' '%32*CW, ' '/32*CH, CW, CH, x*CW, y*CH+CH, 1);
+ }
+}
+
+static void draw_cursor(struct xio_win *xw, int x, int y, int dbl)
+{
+ struct xio *xio = xw->xio;
+
+ if (xw->blink_on)
+ XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = xw->bg ^ 8]);
+ XDrawRectangle(xio->dpy, xw->win, xw->gc, x * CW, y * CH, CW-1,
+ (dbl ? 2*CH : CH)-1);
+}
+
+
+void xio_update_win(struct xio_win *xw)
+{
+ u8 *p = xw->ch;
+ lbits yb, redraw;
+ int x, y, c;
+
+ if (xw->modified == 0)
+ return;
+
+ redraw = xw->modified; // all modified lines
+ redraw |= xw->lhidden; // all previously hidden lines
+ redraw &= ~xw->hidden;
+
+ xw->lhidden = xw->hidden;
+ xw->modified = 0;
+
+ if (redraw == 0)
+ return;
+
+ for (yb = 1, y = 0; y < H; ++y, yb *= 2)
+ if (redraw & yb)
+ {
+ int fg = 7, bg = 0, _fg, _bg;
+ int dbl = 0, blk = 0, con = 0, gfx = 0, sep = 0, hld = 0;
+ int last_ch = ' ';
+
+ for (x = 0; x < W; ++x)
+ {
+ switch (c = *p++)
+ {
+ case 0x00 ... 0x07: /* alpha + foreground color */
+ fg = c & 7;
+ gfx = 0;
+ con = 0;
+ goto ctrl;
+ case 0x08: /* flash */
+ blk = not xw->blink_on;
+ goto ctrl;
+ case 0x09: /* steady */
+ blk = 0;
+ goto ctrl;
+ case 0x0a: /* end box */
+ case 0x0b: /* start box */
+ goto ctrl;
+ case 0x0c: /* normal height */
+ dbl = 0;
+ goto ctrl;
+ case 0x0d: /* double height */
+ dbl = y < H-1;
+ goto ctrl;
+ case 0x10 ... 0x17: /* graphics + foreground color */
+ fg = c & 7;
+ gfx = 1;
+ con = 0;
+ goto ctrl;
+ case 0x18: /* conceal display */
+ con = not xw->reveal;
+ goto ctrl;
+ case 0x19: /* contiguous graphics */
+ sep = 0;
+ goto ctrl;
+ case 0x1a: /* separate graphics */
+ sep = 1;
+ goto ctrl;
+ case 0x1c: /* black background */
+ bg = 0;
+ goto ctrl;
+ case 0x1d: /* new background */
+ bg = fg;
+ goto ctrl;
+ case 0x1e: /* hold graphics */
+ hld = 1;
+ goto ctrl;
+ case 0x1f: /* release graphics */
+ hld = 0;
+ goto ctrl;
+
+ case 0x0e: /* SO (reserved, double width) */
+ case 0x0f: /* SI (reserved, double size) */
+ c= ' '; break;
+ case 0x1b: /* ESC (reserved) */
+ c = ' ';
+ break;
+
+ ctrl:
+ c = ' ';
+ if (hld && gfx)
+ c = last_ch;
+ break;
+
+ case 0x80 ... 0x9f: /* these aren't used */
+ c = BAD_CHAR;
+ break;
+
+ default: /* mapped to selected font */
+ break;
+ }
+
+ if (gfx && (c & 0xa0) == 0x20)
+ {
+ last_ch = c;
+ c += (c & 0x40) ? 32 : -32;
+ }
+
+ _fg = fg;
+ _bg = bg;
+ if (blk)
+ _fg |= 8;
+ if (y >= xw->sel_y1 && y < xw->sel_y2 &&
+ x >= xw->sel_x1 && x < xw->sel_x2)
+ _bg |= 8;
+ if (con)
+ _fg = _bg;
+
+ draw_char(xw, xw->win, _fg, _bg, c, dbl, x, y, y);
+
+ if (y == xw->curs_y && x == xw->curs_x)
+ draw_cursor(xw, xw->curs_x, xw->curs_y, dbl);
+
+ if (xw->sel_pixmap && (_bg & 8))
+ draw_char(xw, xw->sel_pixmap, con ? bg : fg, bg, c, dbl,
+ x - xw->sel_x1, y - xw->sel_y1, y);
+ }
+ }
+ else
+ p += 40;
+}
+
+
+static void for_all_windows(void (*func)(struct xio_win *xw), struct xio_win *except)
+{
+ struct xio *xio, *vtn;
+ struct xio_win *xw, *vwn;
+
+ for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
+ for (xw = PTR xio->windows->first; vwn = PTR xw->node->next; xw = vwn)
+ if (xw != except)
+ func(xw);
+}
+
+
+int xio_set_concealed(struct xio_win *xw, int on)
+{
+ on = !!on;
+ if (xw->reveal == on)
+ return on;
+
+ xw->reveal = on;
+ xw->modified |= xw->concealed;
+ return !on;
+}
+
+
+static void sel_set(struct xio_win *xw, int x1, int y1, int x2, int y2)
+{
+ int t;
+
+ x1 = bound(0, x1, W-1);
+ y1 = bound(0, y1, H-1);
+ x2 = bound(0, x2, W-1);
+ y2 = bound(0, y2, H-1);
+
+ if (x1 > x2)
+ t = x1, x1 = x2, x2 = t;
+ if (y1 > y2)
+ t = y1, y1 = y2, y2 = t;
+
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+
+ if (xw->hidden & (1 << y1))
+ y1--;
+ if (xw->hidden & (2 << y2))
+ y2++;
+
+ xw->sel_x1 = x1;
+ xw->sel_y1 = y1;
+ xw->sel_x2 = x2 + 1;
+ xw->sel_y2 = y2 + 1;
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+}
+
+
+static void sel_abort(struct xio_win *xw)
+{
+ if (xw->sel_set_t)
+ XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, None, xw->sel_set_t);
+ if (xw->sel_y1 != NO_SEL)
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+ xw->sel_y1 = NO_SEL;
+ xw->sel_set_t = 0;
+ xw->sel_start_t = 0;
+}
+
+
+static void sel_start(struct xio_win *xw, int x, int y, Time t)
+{
+ sel_abort(xw);
+ xw->sel_start_x = x;
+ xw->sel_start_y = y;
+ xw->sel_start_t = t;
+}
+
+
+static void sel_move(struct xio_win *xw, int x, int y, Time t)
+{
+ if (xw->sel_start_t == 0)
+ return;
+ if (xw->sel_y1 == NO_SEL)
+ if (t - xw->sel_start_t < SEL_MIN_TIME)
+ if (x == xw->sel_start_x)
+ if (y == xw->sel_start_y)
+ return;
+ sel_set(xw, xw->sel_start_x, xw->sel_start_y, x, y);
+}
+
+
+static int sel_end(struct xio_win *xw, int x, int y, Time t)
+{
+ sel_move(xw, x, y, t);
+ xw->sel_start_t = 0;
+
+ if (xw->sel_y1 == NO_SEL)
+ return 0;
+
+ for_all_windows(sel_abort, xw);
+ XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, xw->win, t);
+ if (XGetSelectionOwner(xw->xio->dpy, XA_PRIMARY) == xw->win)
+ xw->sel_set_t = t;
+ else
+ sel_abort(xw);
+ return 1;
+}
+
+
+static int sel_convert2ascii(struct xio_win *xw, u8 *buf)
+{
+ u8 *d = buf;
+ int x, y, nl = 0;
+
+ for (y = xw->sel_y1; y < xw->sel_y2; y++)
+ {
+ u8 *s = xw->ch + y * W;
+ int gfx = 0, con = 0;
+
+ if (~xw->hidden & (1 << y))
+ {
+ for (x = 0; x < xw->sel_x2; ++x)
+ {
+ int ch, c = ' ';
+ switch (ch = *s++)
+ {
+ case 0x00 ... 0x07:
+ gfx = con = 0;
+ break;
+ case 0x10 ... 0x17:
+ gfx = 1, con = 0;
+ break;
+ case 0x18:
+ con = not xw->reveal;
+ break;
+ case 0xa0 ... 0xff:
+ case 0x20 ... 0x7f:
+ if (not con)
+ if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
+ c = '#';
+ else if (ch == 0x7f)
+ c = '*';
+ else
+ c = ch;
+ break;
+ }
+ if (x >= xw->sel_x1)
+ {
+ if (nl)
+ *d++ = '\n', nl = 0;
+ *d++ = c;
+ }
+ }
+ nl = 1;
+ }
+ }
+ *d = 0; // not necessary
+ return d - buf;
+}
+
+
+static Pixmap sel_convert2pixmap(struct xio_win *xw)
+{
+ struct xio *xio = xw->xio;
+ Pixmap pm;
+
+ if (xw->sel_y1 == NO_SEL)
+ return None;
+
+ pm = XCreatePixmap(xio->dpy, xio->root, (xw->sel_x2 - xw->sel_x1) * CW,
+ (xw->sel_y2 - xw->sel_y1) * CH,
+ xio->depth);
+ xw->sel_pixmap = pm;
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+ xio_update_win(xw);
+ xw->sel_pixmap = 0;
+
+ return pm;
+}
+
+
+static int sel_do_conv(struct xio_win *xw, Window w, Atom type, Atom prop)
+{
+ struct xio *xio = xw->xio;
+
+ if (type == xio->xa_targets)
+ {
+ u32 atoms[6];
+
+ atoms[0] = XA_STRING;
+ atoms[1] = xio->xa_text;
+ atoms[2] = XA_PIXMAP;
+ atoms[3] = XA_COLORMAP;
+ atoms[4] = xio->xa_multiple;
+ atoms[5] = xio->xa_timestamp;
+ XChangeProperty(xio->dpy, w, prop, type,
+ 32, PropModeReplace, PTR atoms, NELEM(atoms));
+ }
+ else if (type == xio->xa_timestamp)
+ {
+ u32 t = xw->sel_set_t;
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
+ }
+ else if (type == XA_COLORMAP)
+ {
+ u32 t = xio->cmap;
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
+ }
+ else if (type == XA_STRING || type == xio->xa_text)
+ {
+ u8 buf[H * (W+1)];
+ int len;
+
+ len = sel_convert2ascii(xw, buf);
+
+ XChangeProperty(xio->dpy, w, prop, type, 8, PropModeReplace, buf, len);
+ }
+ else if (type == XA_PIXMAP || type == XA_DRAWABLE)
+ {
+ Pixmap pm;
+
+ pm = sel_convert2pixmap(xw);
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &pm, 1);
+ }
+ else if (type == xio->xa_multiple)
+ {
+ u32 *atoms, ty, fo, i;
+ unsigned long n, b;
+
+ if (prop != None)
+ {
+ if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, 0,
+ AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &atoms))
+ {
+ if (fo == 32 && n%2 == 0)
+ {
+ for (i = 0; i < n; i += 2)
+ if (sel_do_conv(xw, w, atoms[i], atoms[i+1]) == None)
+ atoms[i] = None;
+ }
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace,
+ PTR atoms, n);
+ XFree(atoms);
+ }
+ }
+ }
+ else
+ return None;
+ return prop;
+}
+
+
+static void sel_send(struct xio_win *xw, XSelectionRequestEvent *req)
+{
+ XSelectionEvent ev[1];
+
+ if (req->property == None)
+ req->property = req->target;
+
+ ev->type = SelectionNotify;
+ ev->requestor = req->requestor;
+ ev->selection = req->selection;
+ ev->target = req->target;
+ ev->property = sel_do_conv(xw, req->requestor, req->target, req->property);
+ ev->time = req->time;
+ XSendEvent(xw->xio->dpy, req->requestor, False, 0, PTR ev);
+}
+
+
+static void sel_retrieve(struct xio_win *xw, Window w, Atom prop, int del)
+{
+ u8 *data;
+ u32 ty, fo;
+ unsigned long n, b;
+ struct xio *xio = xw->xio;
+
+ if (prop == None)
+ return;
+
+ if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, del,
+ AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &data))
+ {
+ if (fo == 8 && n != 0)
+ {
+ struct vt_event vtev[1];
+
+ vtev->resource = xw;
+ vtev->type = EV_SELECTION;
+ vtev->i1 = n;
+ vtev->p1 = data;
+ xw->handler(xw->data, vtev);
+ }
+ XFree(data);
+ }
+}
+
+
+void xio_cancel_selection(struct xio_win *xw)
+{
+ sel_abort(xw);
+}
+
+
+void xio_query_selection(struct xio_win *xw)
+{
+ struct xio *xio = xw->xio;
+
+ if (XGetSelectionOwner(xio->dpy, XA_PRIMARY) == None)
+ sel_retrieve(xw, xio->root, XA_CUT_BUFFER0, False);
+ else
+ {
+ XDeleteProperty(xio->dpy, xw->win, XA_STRING);
+ XConvertSelection(xio->dpy, XA_PRIMARY, XA_STRING,
+ XA_STRING, xw->win, xw->tstamp);
+ }
+}
+
+
+void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2)
+{
+ sel_start(xw, x1, y1, xw->tstamp - SEL_MIN_TIME);
+ sel_end(xw, x2, y2, xw->tstamp);
+}
+
+
+static void handle_event(struct xio *xio, int fd)
+{
+ struct xio_win *xw;
+ struct vt_event vtev[1];
+ XEvent ev[1];
+
+ XNextEvent(xio->dpy, ev);
+
+ for (xw = PTR xio->windows->first; xw->node->next; xw = PTR xw->node->next)
+ if (xw->win == ev->xany.window)
+ break;
+ if (xw->node->next == 0)
+ return;
+
+ vtev->resource = xw;
+
+ switch(ev->type)
+ {
+ case Expose:
+ {
+ int y1 = ev->xexpose.y / CH;
+ int y2 = (ev->xexpose.y + ev->xexpose.height + CH-1) / CH;
+
+ dirty(xw, y1, y2);
+ break;
+ }
+ case ClientMessage:
+ {
+ vtev->type = EV_CLOSE;
+ if (ev->xclient.format == 32)
+ if ((Atom)ev->xclient.data.l[0] == xio->xa_del_win)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case KeyPress:
+ {
+ unsigned char ch;
+ KeySym k;
+
+ xw->tstamp = ev->xkey.time;
+ vtev->type = EV_KEY;
+ vtev->i1 = 0;
+ vtev->i2 = (ev->xkey.state & ShiftMask) != 0;
+ if (XLookupString(&ev->xkey, &ch, 1, &k, 0))
+ vtev->i1 = ch;
+ else
+ switch (k)
+ {
+ case XK_Left: vtev->i1 = KEY_LEFT; break;
+ case XK_Right: vtev->i1 = KEY_RIGHT; break;
+ case XK_Up: vtev->i1 = KEY_UP; break;
+ case XK_Down: vtev->i1 = KEY_DOWN; break;
+ case XK_Prior: vtev->i1 = KEY_PUP; break;
+ case XK_Next: vtev->i1 = KEY_PDOWN; break;
+ case XK_Delete: vtev->i1 = KEY_DEL; break;
+ case XK_Insert: vtev->i1 = KEY_INS; break;
+ case XK_F1: vtev->i1 = KEY_F(1); break;
+ case XK_F2: vtev->i1 = KEY_F(2); break;
+ case XK_F3: vtev->i1 = KEY_F(3); break;
+ case XK_F4: vtev->i1 = KEY_F(4); break;
+ case XK_F5: vtev->i1 = KEY_F(5); break;
+ case XK_F6: vtev->i1 = KEY_F(6); break;
+ case XK_F7: vtev->i1 = KEY_F(7); break;
+ case XK_F8: vtev->i1 = KEY_F(8); break;
+ case XK_F9: vtev->i1 = KEY_F(9); break;
+ case XK_F10: vtev->i1 = KEY_F(10); break;
+ case XK_F11: vtev->i1 = KEY_F(11); break;
+ case XK_F12: vtev->i1 = KEY_F(12); break;
+ }
+ if (vtev->i1)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case ButtonPress:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xbutton.x /= CW;
+ ev->xbutton.y /= CH;
+ if (ev->xbutton.button == Button1)
+ sel_start(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time);
+ break;
+ }
+ case MotionNotify:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xmotion.x /= CW;
+ ev->xmotion.y /= CH;
+ if (ev->xmotion.state & Button1Mask)
+ sel_move(xw, ev->xmotion.x, ev->xmotion.y, ev->xmotion.time);
+ break;
+ }
+ case ButtonRelease:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xbutton.x /= CW;
+ ev->xbutton.y /= CH;
+ if (ev->xbutton.button == Button1)
+ if (sel_end(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time))
+ break;
+
+ vtev->type = EV_MOUSE;
+ vtev->i1 = ev->xbutton.button;
+ vtev->i2 = (ev->xbutton.state & ShiftMask) != 0;
+ vtev->i3 = ev->xbutton.x;
+ vtev->i4 = ev->xbutton.y;
+ if (vtev->i3 >= 0 && vtev->i3 < W && vtev->i4 >= 0 && vtev->i4 < H)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case SelectionClear:
+ {
+ // may be our own Owner=None due to sel_start
+ if (xw->sel_set_t && ev->xselectionclear.time >= xw->sel_set_t)
+ {
+ xw->sel_set_t = 0; // no need to reset owner
+ sel_abort(xw);
+ }
+ break;
+ }
+ case SelectionRequest:
+ {
+ sel_send(xw, &ev->xselectionrequest);
+ break;
+ }
+ case SelectionNotify:
+ {
+ sel_retrieve(xw, ev->xselection.requestor, ev->xselection.property, True);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+
+static void switch_blink_state(struct xio_win *xw)
+{
+ xw->blink_on = !xw->blink_on;
+ xw->modified |= xw->blink;
+ dirty(xw, xw->curs_y, xw->curs_y + 1);
+}
+
+
+static void send_timer_event(struct xio_win *xw)
+{
+ struct vt_event vtev[1];
+ vtev->type = EV_TIMER;
+ xw->handler(xw->data, vtev);
+}
+
+
+static void xio_timer(void *data, int fd)
+{
+ char buf[64];
+ read(fd, buf, sizeof(buf));
+ for_all_windows(switch_blink_state, 0);
+ for_all_windows(send_timer_event, 0);
+}
+
+
+void xio_event_loop(void)
+{
+ struct xio *xio, *vtn;
+ int f;
+
+ while (not dl_empty(dpys))
+ {
+ do
+ {
+ for_all_windows(xio_update_win, 0);
+ f = 0;
+ for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
+ while (XPending(xio->dpy))
+ {
+ handle_event(xio, xio->fd);
+ f++;
+ }
+ } while (f);
+ fdset_select(fds, -1);
+ }
+}
diff --git a/util/alevt/xio.h b/util/alevt/xio.h
new file mode 100644
index 0000000..664b701
--- /dev/null
+++ b/util/alevt/xio.h
@@ -0,0 +1,80 @@
+#ifndef VTXIO_H
+#define VTXIO_H
+
+#include <X11/Xlib.h>
+#include "vt.h"
+#include "dllist.h"
+
+typedef u32 lbits;
+#define ALL_LINES ((1ul << H) - 1)
+
+/* one xio per display */
+struct xio
+{
+ struct dl_node node[1];
+ int argc;
+ char **argv;
+ Display *dpy; /* display connection */
+ int fd; /* the displays file descriptor */
+ Atom xa_del_win; /* WM_DELETE_WINDOW atom */
+ Atom xa_targets; /* TARGETS atom (selection) */
+ Atom xa_timestamp; /* TIMESTAMP atom (selection) */
+ Atom xa_text; /* TEXT atom (selection) */
+ Atom xa_multiple; /* MULTIPLE atom (selection) */
+ Window group_leader; /* unmapped window */
+ int screen; /* DefaultScreen */
+ int width, height; /* DisplayWidth/Height */
+ int depth; /* DefaultDepth */
+ Window root; /* DefaultRoot */
+ Colormap cmap;
+ int color[16]; /* 8 normal, 8 dim intensity */
+ Pixmap font[2]; /* normal, dbl-height */
+ Pixmap icon; /* icon pixmap */
+ struct dl_head windows[1]; /* all windows on this display */
+};
+
+/* one vt_win per window */
+struct xio_win
+{
+ struct dl_node node[1];
+ struct xio *xio; /* display */
+ Window win; /* the drawing window */
+ Time tstamp; /* timestamp of last user event */
+ GC gc; /* it's graphics context */
+ u8 ch[H*W]; /* the page contents */
+ lbits modified, hidden, lhidden; /* states for each line */
+ lbits dheight, blink, concealed; /* attributes for each line */
+ int fg, bg; /* current foreground/background */
+ int blink_on; /* blinking on */
+ int reveal; /* reveal concealed text */
+ void (*handler)(void *data, struct vt_event *ev); /* event-handler */
+ void *data; /* data for the event-handler */
+ int curs_x, curs_y; /* cursor position */
+ u8 title[32]; /* the user title */
+ // selection support
+ int sel_start_x, sel_start_y;
+ Time sel_start_t;
+ Time sel_set_t; /* time we got selection owner */
+ int sel_x1, sel_y1, sel_x2, sel_y2; /* selected area */
+ Pixmap sel_pixmap; /* for pixmap-selection requests */
+};
+
+struct xio *xio_open_dpy(char *dpy, int argc, char **argv);
+struct xio_win *xio_open_win(struct xio *xio, char *geom);
+void xio_close_win(struct xio_win *xw, int dpy_too);
+void xio_close_dpy(struct xio *xio);
+void xio_set_handler(struct xio_win *xw, void *handler, void *data);
+void xio_clear_win(struct xio_win *xw);
+void xio_put_line(struct xio_win *xw, int line, u8 *data);
+void xio_put_str(struct xio_win *xw, int line, u8 *c_str);
+int xio_get_line(struct xio_win *xw, int line, u8 *data);
+int xio_set_concealed(struct xio_win *xw, int on);
+void xio_update_win(struct xio_win *xw);
+void xio_fd_handler(int fd, void *handler, void *data);
+void xio_cancel_selection(struct xio_win *xw);
+void xio_query_selection(struct xio_win *xw);
+void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2);
+void xio_set_cursor(struct xio_win *xw, int x, int y);
+void xio_event_loop(void);
+void xio_title(struct xio_win *xw, char *title);
+#endif
diff --git a/util/atsc_epg/Makefile b/util/atsc_epg/Makefile
new file mode 100644
index 0000000..747e2b8
--- /dev/null
+++ b/util/atsc_epg/Makefile
@@ -0,0 +1,16 @@
+# Makefile for linuxtv.org dvb-apps/util/atsc_epg
+
+binaries = atsc_epg
+
+inst_bin = $(binaries)
+
+CPPFLAGS += -I../../lib -std=c99 -D_POSIX_SOURCE
+#LDFLAGS += -static -L../../lib/libdvbapi -L../../lib/libucsi
+LDFLAGS += -L../../lib/libdvbapi -L../../lib/libucsi
+LDLIBS += -ldvbapi -lucsi
+
+.PHONY: all
+
+all: $(binaries)
+
+include ../../Make.rules
diff --git a/util/atsc_epg/README b/util/atsc_epg/README
new file mode 100644
index 0000000..6a82453
--- /dev/null
+++ b/util/atsc_epg/README
@@ -0,0 +1,12 @@
+Hi there,
+
+atsc_epg is a small utility for obtaining information such as programs, EPG
+(electronic program guide) from an ATSC channel.
+
+Pulling the detailed information, i.e., option '-t', may take fairly long
+time, or never ending, which is a bug of the PSIP generator. Ctrl+C can be
+used to abort and the received parts will be printed.
+
+Enjoy,
+Yufei
+
diff --git a/util/atsc_epg/atsc_epg.c b/util/atsc_epg/atsc_epg.c
new file mode 100644
index 0000000..55e266d
--- /dev/null
+++ b/util/atsc_epg/atsc_epg.c
@@ -0,0 +1,1249 @@
+/*
+ * atsc_epg utility
+ *
+ * Copyright (C) 2009 Yufei Yuan <yfyuan@gmail.com>
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include <errno.h>
+#include <getopt.h>
+#include <stdarg.h>
+#include <libdvbapi/dvbfe.h>
+#include <libdvbapi/dvbdemux.h>
+#include <libucsi/dvb/section.h>
+#include <libucsi/atsc/section.h>
+#include <libucsi/atsc/types.h>
+
+#define TIMEOUT 60
+#define RRT_TIMEOUT 60
+#define MAX_NUM_EVENT_TABLES 128
+#define TITLE_BUFFER_LEN 4096
+#define MESSAGE_BUFFER_LEN (16 * 1024)
+#define MAX_NUM_CHANNELS 16
+#define MAX_NUM_EVENTS_PER_CHANNEL (4 * 24 * 7)
+
+static int atsc_scan_table(int dmxfd, uint16_t pid, enum atsc_section_tag tag,
+ void **table_section);
+
+static const char *program;
+static int adapter = 0;
+static int period = 12; /* hours */
+static int frequency;
+static int enable_ett = 0;
+static int ctrl_c = 0;
+static const char *modulation = NULL;
+static char separator[80];
+void (*old_handler)(int);
+
+struct atsc_string_buffer {
+ int buf_len;
+ int buf_pos;
+ char *string;
+};
+
+struct atsc_event_info {
+ uint16_t id;
+ struct tm start;
+ struct tm end;
+ int title_pos;
+ int title_len;
+ int msg_pos;
+ int msg_len;
+};
+
+struct atsc_eit_section_info {
+ uint8_t section_num;
+ uint8_t num_events;
+ uint8_t num_etms;
+ uint8_t num_received_etms;
+ struct atsc_event_info **events;
+};
+
+struct atsc_eit_info {
+ int num_eit_sections;
+ struct atsc_eit_section_info *section;
+};
+
+struct atsc_channel_info {
+ uint8_t num_eits;
+ uint8_t service_type;
+ char short_name[8];
+ uint16_t major_num;
+ uint16_t minor_num;
+ uint16_t tsid;
+ uint16_t prog_num;
+ uint16_t src_id;
+ struct atsc_eit_info *eit;
+ struct atsc_event_info *last_event;
+ int event_info_index;
+ struct atsc_event_info e[MAX_NUM_EVENTS_PER_CHANNEL];
+ struct atsc_string_buffer title_buf;
+ struct atsc_string_buffer msg_buf;
+};
+
+struct atsc_virtual_channels_info {
+ int num_channels;
+ uint16_t eit_pid[MAX_NUM_EVENT_TABLES];
+ uint16_t ett_pid[MAX_NUM_EVENT_TABLES];
+ struct atsc_channel_info ch[MAX_NUM_CHANNELS];
+} guide;
+
+struct mgt_table_name {
+ uint16_t range;
+ const char *string;
+};
+
+struct mgt_table_name mgt_tab_name_array[] = {
+ {0x0000, "terrestrial VCT with current_next_indictor=1"},
+ {0x0001, "terrestrial VCT with current_next_indictor=0"},
+ {0x0002, "cable VCT with current_next_indictor=1"},
+ {0x0003, "cable VCT with current_next_indictor=0"},
+ {0x0004, "channel ETT"},
+ {0x0005, "DCCSCT"},
+ {0x00FF, "reserved for future ATSC use"},
+ {0x017F, "EIT"},
+ {0x01FF, "reserved for future ATSC use"},
+ {0x027F, "event ETT"},
+ {0x02FF, "reserved for future ATSC use"}, /* FIXME */
+ {0x03FF, "RRT with rating region"},
+ {0x0FFF, "user private"},
+ {0x13FF, "reserved for future ATSC use"},
+ {0x14FF, "DCCT with dcc_id"},
+ {0xFFFF, "reserved for future ATSC use"}
+};
+
+const char *channel_modulation_mode[] = {
+ "",
+ "analog",
+ "SCTE mode 1",
+ "SCTE mode 2",
+ "ATSC 8VSB",
+ "ATSC 16VSB"
+};
+
+const char *channel_service_type[] = {
+ "",
+ "analog TV",
+ "ATSC digital TV",
+ "ATSC audio",
+ "ATSC data-only"
+};
+
+void *(*table_callback[16])(struct atsc_section_psip *) =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ (void *(*)(struct atsc_section_psip *))atsc_mgt_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_tvct_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_cvct_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_rrt_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_eit_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_ett_section_codec,
+ (void *(*)(struct atsc_section_psip *))atsc_stt_section_codec,
+ NULL, NULL
+};
+
+static void int_handler(int sig_num)
+{
+ if(SIGINT != sig_num) {
+ return;
+ }
+ ctrl_c = 1;
+}
+
+/* shamelessly stolen from dvbsnoop, but almost not modified */
+static uint32_t get_bits(const uint8_t *buf, int startbit, int bitlen)
+{
+ const uint8_t *b;
+ uint32_t mask,tmp_long;
+ int bitHigh,i;
+
+ b = &buf[startbit / 8];
+ startbit %= 8;
+
+ bitHigh = 8;
+ tmp_long = b[0];
+ for (i = 0; i < ((bitlen-1) >> 3); i++) {
+ tmp_long <<= 8;
+ tmp_long |= b[i+1];
+ bitHigh += 8;
+ }
+
+ startbit = bitHigh - startbit - bitlen;
+ tmp_long = tmp_long >> startbit;
+ mask = (1ULL << bitlen) - 1;
+ return tmp_long & mask;
+}
+
+static void usage(void)
+{
+ fprintf(stderr, "usage: %s [-a <n>] -f <frequency> [-p <period>]"
+ " [-m <modulation>] [-t] [-h]\n", program);
+}
+
+static void help(void)
+{
+ fprintf(stderr,
+ "\nhelp:\n"
+ "%s [-a <n>] -f <frequency> [-p <period>] [-m <modulation>] [-t] [-h]\n"
+ " -a: adapter index to use, (default 0)\n"
+ " -f: tuning frequency\n"
+ " -p: period in hours, (default 12)\n"
+ " -m: modulation ATSC vsb_8|vsb_16 (default vsb_8)\n"
+ " -t: enable ETT to receive program details, if available\n"
+ " -h: display this message\n", program);
+}
+
+static int close_frontend(struct dvbfe_handle *fe)
+{
+ if(NULL == fe) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ }
+
+ dvbfe_close(fe);
+
+ return 0;
+}
+
+static int open_frontend(struct dvbfe_handle **fe)
+{
+ struct dvbfe_info fe_info;
+
+ if(NULL == (*fe = dvbfe_open(adapter, 0, 0))) {
+ fprintf(stderr, "%s(): error calling dvbfe_open()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ dvbfe_get_info(*fe, 0, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0);
+ if(DVBFE_TYPE_ATSC != fe_info.type) {
+ fprintf(stderr, "%s(): only ATSC frontend supported currently\n",
+ __FUNCTION__);
+ return -1;
+ }
+ fe_info.feparams.frequency = frequency;
+ fe_info.feparams.inversion = DVBFE_INVERSION_AUTO;
+ fe_info.feparams.u.atsc.modulation = DVBFE_ATSC_MOD_VSB_8;
+ fprintf(stdout, "tuning to %d Hz, please wait...\n", frequency);
+ if(dvbfe_set(*fe, &fe_info.feparams, TIMEOUT * 1000)) {
+ fprintf(stderr, "%s(): cannot lock to %d Hz in %d seconds\n",
+ __FUNCTION__, frequency, TIMEOUT);
+ return -1;
+ }
+ fprintf(stdout, "tuner locked.\n");
+
+ return 0;
+}
+
+#if ENABLE_RRT
+/* this is untested as since this part of the library is broken */
+static int parse_rrt(int dmxfd)
+{
+ const enum atsc_section_tag tag = stag_atsc_rating_region;
+ struct atsc_rrt_section *rrt;
+ struct atsc_text *region_name;
+ struct atsc_text_string *atsc_str;
+ int i, j, ret;
+
+ i = 0;
+ fprintf(stdout, "waiting for RRT: ");
+ fflush(stdout);
+ while(i < RRT_TIMEOUT) {
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&rrt);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ if(RRT_TIMEOUT > i) {
+ fprintf(stdout, ".");
+ fflush(stdout);
+ } else {
+ fprintf(stdout, "\nno RRT in %d seconds\n",
+ RRT_TIMEOUT);
+ return 0;
+ }
+ i += TIMEOUT;
+ } else {
+ fprintf(stdout, "\n");
+ fflush(stdout);
+ break;
+ }
+ }
+
+ region_name = atsc_rrt_section_rating_region_name_text(rrt);
+ atsc_text_strings_for_each(region_name, atsc_str, i) {
+ struct atsc_text_string_segment *seg;
+
+ atsc_text_string_segments_for_each(atsc_str, seg, j) {
+ const char *c;
+ int k;
+ if(seg->mode < 0x3E) {
+ fprintf(stderr, "%s(): text mode of 0x%02X "
+ "not supported yet\n",
+ __FUNCTION__, seg->mode);
+ return -1;
+ }
+ c = (const char *)atsc_text_string_segment_bytes(seg);
+ for(k = 0; k < seg->number_bytes; k++) {
+ fprintf(stdout, "%c", c[k]);
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+
+static int parse_stt(int dmxfd)
+{
+ const enum atsc_section_tag tag = stag_atsc_system_time;
+ const struct atsc_stt_section *stt;
+ time_t rx_time;
+ time_t sys_time;
+ int ret;
+
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&stt);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no STT in %d seconds\n", TIMEOUT);
+ return 0;
+ }
+
+ rx_time = atsctime_to_unixtime(stt->system_time);
+ time(&sys_time);
+ fprintf(stdout, "system time: %s", ctime(&sys_time));
+ fprintf(stdout, "TS STT time: %s", ctime(&rx_time));
+
+ return 0;
+}
+
+static int parse_tvct(int dmxfd)
+{
+ int num_sections;
+ uint32_t section_pattern;
+ const enum atsc_section_tag tag = stag_atsc_terrestrial_virtual_channel;
+ struct atsc_tvct_section *tvct;
+ struct atsc_tvct_channel *ch;
+ struct atsc_channel_info *curr_info;
+ int i, k, ret;
+
+ section_pattern = 0;
+ num_sections = -1;
+
+ do {
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&tvct);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no TVCT in %d seconds\n", TIMEOUT);
+ return 0;
+ }
+
+ if(-1 == num_sections) {
+ num_sections = 1 + tvct->head.ext_head.last_section_number;
+ if(32 < num_sections) {
+ fprintf(stderr, "%s(): no support yet for "
+ "tables having more than 32 sections\n",
+ __FUNCTION__);
+ return -1;
+ }
+ } else {
+ if(num_sections !=
+ 1 + tvct->head.ext_head.last_section_number) {
+ fprintf(stderr,
+ "%s(): last section number does not match\n",
+ __FUNCTION__);
+ return -1;
+ }
+ }
+ if(section_pattern & (1 << tvct->head.ext_head.section_number)) {
+ continue;
+ }
+ section_pattern |= 1 << tvct->head.ext_head.section_number;
+
+ if(MAX_NUM_CHANNELS < guide.num_channels +
+ tvct->num_channels_in_section) {
+ fprintf(stderr, "%s(): no support for more than %d "
+ "virtual channels in a pyhsical channel\n",
+ __FUNCTION__, MAX_NUM_CHANNELS);
+ return -1;
+ }
+ curr_info = &guide.ch[guide.num_channels];
+ guide.num_channels += tvct->num_channels_in_section;
+
+ atsc_tvct_section_channels_for_each(tvct, ch, i) {
+ /* initialize the curr_info structure */
+ /* each EIT covers 3 hours */
+ curr_info->num_eits = (period / 3) + !!(period % 3);
+ while (curr_info->num_eits &&
+ (0xFFFF == guide.eit_pid[curr_info->num_eits - 1])) {
+ curr_info->num_eits -= 1;
+ }
+ if(curr_info->eit) {
+ fprintf(stderr, "%s(): non-NULL pointer detected "
+ "during initialization", __FUNCTION__);
+ return -1;
+ }
+ if(NULL == (curr_info->eit = calloc(curr_info->num_eits,
+ sizeof(struct atsc_eit_info)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(NULL == (curr_info->title_buf.string = calloc(TITLE_BUFFER_LEN,
+ sizeof(char)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ curr_info->title_buf.buf_len = TITLE_BUFFER_LEN;
+ curr_info->title_buf.buf_pos = 0;
+
+ if(NULL == (curr_info->msg_buf.string = calloc(MESSAGE_BUFFER_LEN,
+ sizeof(char)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ curr_info->msg_buf.buf_len = MESSAGE_BUFFER_LEN;
+ curr_info->msg_buf.buf_pos = 0;
+
+ for(k = 0; k < 7; k++) {
+ curr_info->short_name[k] =
+ get_bits((const uint8_t *)ch->short_name,
+ k * 16, 16);
+ }
+ curr_info->service_type = ch->service_type;
+ curr_info->major_num = ch->major_channel_number;
+ curr_info->minor_num = ch->minor_channel_number;
+ curr_info->tsid = ch->channel_TSID;
+ curr_info->prog_num = ch->program_number;
+ curr_info->src_id = ch->source_id;
+ curr_info++;
+ }
+ } while(section_pattern != (uint32_t)((1 << num_sections) - 1));
+
+ return 0;
+}
+
+static int match_event(struct atsc_eit_info *eit, uint16_t event_id,
+ struct atsc_event_info **event, uint8_t *curr_index)
+{
+ int j, k;
+ struct atsc_eit_section_info *section;
+
+ if(NULL == eit || NULL == event || NULL == curr_index) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ return -1;
+ }
+
+ for(j = 0; j < eit->num_eit_sections; j++) {
+ section = &eit->section[j];
+
+ for(k = 0; k < section->num_events; k++) {
+ if(section->events[k] && section->events[k]->id ==
+ event_id) {
+ *event = section->events[k];
+ break;
+ }
+ }
+ if(*event) {
+ *curr_index = j;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static int parse_message(struct atsc_channel_info *channel,
+ struct atsc_ett_section *ett, struct atsc_event_info *event)
+{
+ int i, j;
+ struct atsc_text *text;
+ struct atsc_text_string *str;
+
+ if(NULL == ett || NULL == event || NULL == channel) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ return -1;
+ }
+
+ text = atsc_ett_section_extended_text_message(ett);
+ atsc_text_strings_for_each(text, str, i) {
+ struct atsc_text_string_segment *seg;
+
+ atsc_text_string_segments_for_each(str, seg, j) {
+ event->msg_pos = channel->msg_buf.buf_pos;
+ if(0 > atsc_text_segment_decode(seg,
+ (uint8_t **)&channel->msg_buf.string,
+ (size_t *)&channel->msg_buf.buf_len,
+ (size_t *)&channel->msg_buf.buf_pos)) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_text_segment_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ event->msg_len = 1 + channel->msg_buf.buf_pos -
+ event->msg_pos;
+ }
+ }
+
+ return 0;
+}
+
+static int parse_ett(int dmxfd, int index, uint16_t pid)
+{
+ uint8_t curr_index;
+ uint32_t section_pattern;
+ const enum atsc_section_tag tag = stag_atsc_extended_text;
+ struct atsc_eit_info *eit;
+ struct atsc_ett_section *ett;
+ struct atsc_channel_info *channel;
+ struct atsc_event_info *event;
+ struct atsc_eit_section_info *section;
+ uint16_t source_id, event_id;
+ int c, ret;
+
+ if(0xFFFF == guide.ett_pid[index]) {
+ return 0;
+ }
+
+ for(c = 0; c < guide.num_channels; c++) {
+ channel = &guide.ch[c];
+ eit = &channel->eit[index];
+
+ section_pattern = 0;
+ while(section_pattern !=
+ (uint32_t)((1 << eit->num_eit_sections) - 1)) {
+ if(ctrl_c) {
+ return 0;
+ }
+ ret = atsc_scan_table(dmxfd, pid, tag, (void **)&ett);
+ fprintf(stdout, ".");
+ fflush(stdout);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_scan_table()\n", __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no ETT %d in %d seconds\n",
+ index, TIMEOUT);
+ return 0;
+ }
+
+ source_id = ett->ETM_source_id;
+ event_id = ett->ETM_sub_id;
+ if(source_id != channel->src_id) {
+ continue;
+ }
+
+ event = NULL;
+ if(match_event(eit, event_id, &event, &curr_index)) {
+ fprintf(stderr, "%s(): error calling "
+ "match_event()\n", __FUNCTION__);
+ return -1;
+ }
+ if(NULL == event) {
+ continue;
+ }
+ if(section_pattern & (1 << curr_index)) {
+ /* the section has been filled, so skip,
+ * not consider version yet
+ */
+ continue;
+ }
+ if(event->msg_len) {
+ /* the message has been filled */
+ continue;
+ }
+
+ if(parse_message(channel, ett, event)) {
+ fprintf(stderr, "%s(): error calling "
+ "parse_message()\n", __FUNCTION__);
+ return -1;
+ }
+ section = &eit->section[curr_index];
+ if(++section->num_received_etms == section->num_etms) {
+ section_pattern |= 1 << curr_index;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int parse_events(struct atsc_channel_info *curr_info,
+ struct atsc_eit_section *eit, struct atsc_eit_section_info *section)
+{
+ int i, j, k;
+ struct atsc_eit_event *e;
+ time_t start_time, end_time;
+
+ if(NULL == curr_info || NULL == eit) {
+ fprintf(stderr, "%s(): NULL pointer detected\n", __FUNCTION__);
+ return -1;
+ }
+
+ atsc_eit_section_events_for_each(eit, e, i) {
+ struct atsc_text *title;
+ struct atsc_text_string *str;
+ struct atsc_event_info *e_info =
+ &curr_info->e[curr_info->event_info_index];
+
+ if(0 == i && curr_info->last_event) {
+ if(e->event_id == curr_info->last_event->id) {
+ section->events[i] = NULL;
+ /* skip if it's the same event spanning
+ * over sections
+ */
+ continue;
+ }
+ }
+ curr_info->event_info_index += 1;
+ section->events[i] = e_info;
+ e_info->id = e->event_id;
+ start_time = atsctime_to_unixtime(e->start_time);
+ end_time = start_time + e->length_in_seconds;
+ localtime_r(&start_time, &e_info->start);
+ localtime_r(&end_time, &e_info->end);
+ if(0 != e->ETM_location && 3 != e->ETM_location) {
+ /* FIXME assume 1 and 2 is interchangable as of now */
+ section->num_etms++;
+ }
+
+ title = atsc_eit_event_name_title_text(e);
+ atsc_text_strings_for_each(title, str, j) {
+ struct atsc_text_string_segment *seg;
+
+ atsc_text_string_segments_for_each(str, seg, k) {
+ e_info->title_pos = curr_info->title_buf.buf_pos;
+ if(0 > atsc_text_segment_decode(seg,
+ (uint8_t **)&curr_info->title_buf.string,
+ (size_t *)&curr_info->title_buf.buf_len,
+ (size_t *)&curr_info->title_buf.buf_pos)) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_text_segment_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ e_info->title_len = curr_info->title_buf.buf_pos -
+ e_info->title_pos + 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int parse_eit(int dmxfd, int index, uint16_t pid)
+{
+ int num_sections;
+ uint8_t section_num;
+ uint8_t curr_channel_index;
+ uint32_t section_pattern;
+ const enum atsc_section_tag tag = stag_atsc_event_information;
+ struct atsc_eit_section *eit;
+ struct atsc_channel_info *curr_info;
+ struct atsc_eit_info *eit_info;
+ struct atsc_eit_section_info *section;
+ uint16_t source_id;
+ uint32_t eit_instance_pattern = 0;
+ int i, k, ret;
+
+ while(eit_instance_pattern !=
+ (uint32_t)((1 << guide.num_channels) - 1)) {
+ source_id = 0xFFFF;
+ section_pattern = 0;
+ num_sections = -1;
+
+ do {
+ ret = atsc_scan_table(dmxfd, pid, tag, (void **)&eit);
+ fprintf(stdout, ".");
+ fflush(stdout);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling "
+ "atsc_scan_table()\n", __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no EIT %d in %d seconds\n",
+ index, TIMEOUT);
+ return 0;
+ }
+
+ if(0xFFFF == source_id) {
+ source_id = atsc_eit_section_source_id(eit);
+ for(k = 0; k < guide.num_channels; k++) {
+ if(source_id == guide.ch[k].src_id) {
+ curr_info = &guide.ch[k];
+ curr_channel_index = k;
+ if(0 == index) {
+ curr_info->last_event = NULL;
+ }
+ break;
+ }
+ }
+ if(k == guide.num_channels) {
+ fprintf(stderr, "%s(): cannot find source_id "
+ "0x%04X in the EIT\n",
+ __FUNCTION__, source_id);
+ return -1;
+ }
+ } else {
+ if(source_id !=
+ atsc_eit_section_source_id(eit)) {
+ continue;
+ }
+ }
+ if(eit_instance_pattern & (1 << curr_channel_index)) {
+ /* we have received this instance,
+ * so quit quick
+ */
+ break;
+ }
+
+ if(-1 == num_sections) {
+ num_sections = 1 +
+ eit->head.ext_head.last_section_number;
+ if(32 < num_sections) {
+ fprintf(stderr,
+ "%s(): no support yet for "
+ "tables having more than "
+ "32 sections\n", __FUNCTION__);
+ return -1;
+ }
+ } else {
+ if(num_sections != 1 +
+ eit->head.ext_head.last_section_number) {
+ fprintf(stderr,
+ "%s(): last section number "
+ "does not match\n",
+ __FUNCTION__);
+ return -1;
+ }
+ }
+ if(section_pattern &
+ (1 << eit->head.ext_head.section_number)) {
+ continue;
+ }
+ section_pattern |= 1 << eit->head.ext_head.section_number;
+
+ eit_info = &curr_info->eit[index];
+ if(NULL == (eit_info->section =
+ realloc(eit_info->section,
+ (eit_info->num_eit_sections + 1) *
+ sizeof(struct atsc_eit_section_info)))) {
+ fprintf(stderr,
+ "%s(): error calling realloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ section_num = eit->head.ext_head.section_number;
+ if(0 == eit_info->num_eit_sections) {
+ eit_info->num_eit_sections = 1;
+ section = eit_info->section;
+ } else {
+ /* have to sort it into section order
+ * (temporal order)
+ */
+ for(i = 0; i < eit_info->num_eit_sections; i++) {
+ if(eit_info->section[i].section_num >
+ section_num) {
+ break;
+ }
+ }
+ memmove(&eit_info->section[i + 1],
+ &eit_info->section[i],
+ (eit_info->num_eit_sections - i) *
+ sizeof(struct atsc_eit_section_info));
+ section = &eit_info->section[i - 1];
+ section = &eit_info->section[i];
+ eit_info->num_eit_sections += 1;
+ }
+
+ section->section_num = section_num;
+ section->num_events = eit->num_events_in_section;
+ section->num_etms = 0;
+ section->num_received_etms = 0;
+ if(NULL == (section->events = calloc(section->num_events,
+ sizeof(struct atsc_event_info *)))) {
+ fprintf(stderr, "%s(): error calling calloc()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(parse_events(curr_info, eit, section)) {
+ fprintf(stderr, "%s(): error calling "
+ "parse_events()\n", __FUNCTION__);
+ return -1;
+ }
+ } while(section_pattern != (uint32_t)((1 << num_sections) - 1));
+ eit_instance_pattern |= 1 << curr_channel_index;
+ }
+
+ for(i = 0; i < guide.num_channels; i++) {
+ struct atsc_channel_info *channel = &guide.ch[i];
+ struct atsc_eit_info *ei = &channel->eit[index];
+ struct atsc_eit_section_info *s;
+
+ if(0 == ei->num_eit_sections) {
+ channel->last_event = NULL;
+ continue;
+ }
+ s = &ei->section[ei->num_eit_sections - 1];
+ /* BUG: it's incorrect when last section has no event */
+ if(0 == s->num_events) {
+ channel->last_event = NULL;
+ continue;
+ }
+ channel->last_event = s->events[s->num_events - 1];
+ }
+
+ return 0;
+}
+
+static int parse_mgt(int dmxfd)
+{
+ const enum atsc_section_tag tag = stag_atsc_master_guide;
+ struct atsc_mgt_section *mgt;
+ struct atsc_mgt_table *t;
+ int i, j, ret;
+
+ ret = atsc_scan_table(dmxfd, ATSC_BASE_PID, tag, (void **)&mgt);
+ if(0 > ret) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ if(0 == ret) {
+ fprintf(stdout, "no MGT in %d seconds\n", TIMEOUT);
+ return 0;
+ }
+
+ fprintf(stdout, "MGT table:\n");
+ atsc_mgt_section_tables_for_each(mgt, t, i) {
+ struct mgt_table_name table;
+
+ for(j = 0; j < (int)(sizeof(mgt_tab_name_array) /
+ sizeof(struct mgt_table_name)); j++) {
+ if(t->table_type > mgt_tab_name_array[j].range) {
+ continue;
+ }
+ table = mgt_tab_name_array[j];
+ if(0 == j || mgt_tab_name_array[j - 1].range + 1 ==
+ mgt_tab_name_array[j].range) {
+ j = -1;
+ } else {
+ j = t->table_type - mgt_tab_name_array[j - 1].range - 1;
+ if(0x017F == table.range) {
+ guide.eit_pid[j] = t->table_type_PID;
+ } else if (0x027F == table.range) {
+ guide.ett_pid[j] = t->table_type_PID;
+ }
+ }
+ break;
+ }
+
+ fprintf(stdout, " %2d: type = 0x%04X, PID = 0x%04X, %s", i,
+ t->table_type, t->table_type_PID, table.string);
+ if(-1 != j) {
+ fprintf(stdout, " %d", j);
+ }
+ fprintf(stdout, "\n");
+ }
+
+ return 0;
+}
+
+static int cleanup_guide(void)
+{
+ int i, j, k;
+
+ for(i = 0; i < guide.num_channels; i++) {
+ struct atsc_channel_info *channel = &guide.ch[i];
+
+ if(channel->title_buf.string) {
+ free(channel->title_buf.string);
+ }
+ if(channel->msg_buf.string) {
+ free(channel->msg_buf.string);
+ }
+ for(j = 0; j < channel->num_eits; j++) {
+ struct atsc_eit_info *eit = &channel->eit[j];
+
+ for(k = 0; k < eit->num_eit_sections; k++) {
+ struct atsc_eit_section_info *section =
+ &eit->section[k];
+ if(section->num_events) {
+ free(section->events);
+ }
+ }
+ if(k) {
+ free(eit->section);
+ }
+ }
+ if(j) {
+ free(channel->eit);
+ }
+ }
+
+ return 0;
+}
+
+static int print_events(struct atsc_channel_info *channel,
+ struct atsc_eit_section_info *section)
+{
+ int m;
+ char line[256];
+
+ if(NULL == section) {
+ fprintf(stderr, "%s(): NULL pointer detected", __FUNCTION__);
+ return -1;
+ }
+ for(m = 0; m < section->num_events; m++) {
+ struct atsc_event_info *event =
+ section->events[m];
+
+ if(NULL == event) {
+ continue;
+ }
+ fprintf(stdout, "|%02d:%02d--%02d:%02d| ",
+ event->start.tm_hour, event->start.tm_min,
+ event->end.tm_hour, event->end.tm_min);
+ snprintf(line, event->title_len, "%s",
+ &channel->title_buf.string[event->title_pos]);
+ line[event->title_len] = '\0';
+ fprintf(stdout, "%s\n", line);
+ if(event->msg_len) {
+ int len = event->msg_len;
+ int pos = event->msg_pos;
+ size_t part;
+
+ do {
+ part = len > 255 ? 255 : len;
+ snprintf(line, part, "%s",
+ &channel->msg_buf.string[pos]);
+ line[part] = '\0';
+ fprintf(stdout, "%s", line);
+ len -= part;
+ pos += part;
+ } while(0 < len);
+ fprintf(stdout, "\n");
+ }
+ }
+ return 0;
+}
+
+static int print_guide(void)
+{
+ int i, j, k;
+
+ fprintf(stdout, "%s\n", separator);
+ for(i = 0; i < guide.num_channels; i++) {
+ struct atsc_channel_info *channel = &guide.ch[i];
+
+ fprintf(stdout, "%d.%d %s\n", channel->major_num,
+ channel->minor_num, channel->short_name);
+ for(j = 0; j < channel->num_eits; j++) {
+ struct atsc_eit_info *eit = &channel->eit[j];
+
+ for(k = 0; k < eit->num_eit_sections; k++) {
+ struct atsc_eit_section_info *section =
+ &eit->section[k];
+ if(print_events(channel, section)) {
+ fprintf(stderr, "%s(): error calling "
+ "print_events()\n", __FUNCTION__);
+ return -1;
+ }
+ }
+ }
+ fprintf(stdout, "%s\n", separator);
+ }
+
+ return 0;
+}
+
+static int open_demux(int *dmxfd)
+{
+ if((*dmxfd = dvbdemux_open_demux(adapter, 0, 0)) < 0) {
+ fprintf(stderr, "%s(): error calling dvbdemux_open_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ return 0;
+}
+
+static int close_demux(int dmxfd)
+{
+ if(dvbdemux_stop(dmxfd)) {
+ fprintf(stderr, "%s(): error calling dvbdemux_stop()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ return 0;
+}
+
+/* used other utilities as template and generalized here */
+static int atsc_scan_table(int dmxfd, uint16_t pid, enum atsc_section_tag tag,
+ void **table_section)
+{
+ uint8_t filter[18];
+ uint8_t mask[18];
+ unsigned char sibuf[4096];
+ int size;
+ int ret;
+ struct pollfd pollfd;
+ struct section *section;
+ struct section_ext *section_ext;
+ struct atsc_section_psip *psip;
+
+ /* create a section filter for the table */
+ memset(filter, 0, sizeof(filter));
+ memset(mask, 0, sizeof(mask));
+ filter[0] = tag;
+ mask[0] = 0xFF;
+ if(dvbdemux_set_section_filter(dmxfd, pid, filter, mask, 1, 1)) {
+ fprintf(stderr, "%s(): error calling atsc_scan_table()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ /* poll for data */
+ pollfd.fd = dmxfd;
+ pollfd.events = POLLIN | POLLERR |POLLPRI;
+ if((ret = poll(&pollfd, 1, TIMEOUT * 1000)) < 0) {
+ if(ctrl_c) {
+ return 0;
+ }
+ fprintf(stderr, "%s(): error calling poll()\n", __FUNCTION__);
+ return -1;
+ }
+
+ if(0 == ret) {
+ return 0;
+ }
+
+ /* read it */
+ if((size = read(dmxfd, sibuf, sizeof(sibuf))) < 0) {
+ fprintf(stderr, "%s(): error calling read()\n", __FUNCTION__);
+ return -1;
+ }
+
+ /* parse section */
+ section = section_codec(sibuf, size);
+ if(NULL == section) {
+ fprintf(stderr, "%s(): error calling section_codec()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ section_ext = section_ext_decode(section, 0);
+ if(NULL == section_ext) {
+ fprintf(stderr, "%s(): error calling section_ext_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ psip = atsc_section_psip_decode(section_ext);
+ if(NULL == psip) {
+ fprintf(stderr,
+ "%s(): error calling atsc_section_psip_decode()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ *table_section = table_callback[tag & 0x0F](psip);
+ if(NULL == *table_section) {
+ fprintf(stderr, "%s(): error decode table section\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ return 1;
+}
+
+int main(int argc, char *argv[])
+{
+ int i, dmxfd;
+ struct dvbfe_handle *fe;
+
+ program = argv[0];
+
+ if(1 == argc) {
+ usage();
+ exit(-1);
+ }
+
+ for( ; ; ) {
+ char c;
+
+ if(-1 == (c = getopt(argc, argv, "a:f:p:m:th"))) {
+ break;
+ }
+
+ switch(c) {
+ case 'a':
+ adapter = strtoll(optarg, NULL, 0);
+ break;
+
+ case 'f':
+ frequency = strtol(optarg, NULL, 0);
+ break;
+
+ case 'p':
+ period = strtol(optarg, NULL, 0);
+ /* each table covers 3 hours */
+ if((3 * MAX_NUM_EVENT_TABLES) < period) {
+ period = 3 * MAX_NUM_EVENT_TABLES;
+ }
+ break;
+
+ case 'm':
+ /* just stub, so far ATSC only has VSB_8 */
+ modulation = optarg;
+ break;
+
+ case 't':
+ enable_ett = 1;
+ break;
+
+ case 'h':
+ help();
+ exit(0);
+
+ default:
+ usage();
+ exit(-1);
+ }
+ }
+
+ memset(separator, '-', sizeof(separator));
+ separator[79] = '\0';
+ memset(&guide, 0, sizeof(struct atsc_virtual_channels_info));
+ memset(guide.eit_pid, 0xFF, MAX_NUM_EVENT_TABLES * sizeof(uint16_t));
+ memset(guide.ett_pid, 0xFF, MAX_NUM_EVENT_TABLES * sizeof(uint16_t));
+
+ if(open_frontend(&fe)) {
+ fprintf(stderr, "%s(): error calling open_frontend()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(open_demux(&dmxfd)) {
+ fprintf(stderr, "%s(): error calling open_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(parse_stt(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_stt()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(parse_mgt(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_mgt()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(parse_tvct(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_tvct()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+#ifdef ENABLE_RRT
+ if(parse_rrt(dmxfd)) {
+ fprintf(stderr, "%s(): error calling parse_rrt()\n",
+ __FUNCTION__);
+ return -1;
+ }
+#endif
+
+ fprintf(stdout, "receiving EIT ");
+ for(i = 0; i < guide.ch[0].num_eits; i++) {
+ if(parse_eit(dmxfd, i, guide.eit_pid[i])) {
+ fprintf(stderr, "%s(): error calling parse_eit()\n",
+ __FUNCTION__);
+ return -1;
+ }
+ }
+ fprintf(stdout, "\n");
+
+ old_handler = signal(SIGINT, int_handler);
+ if(enable_ett) {
+ fprintf(stdout, "receiving ETT ");
+ for(i = 0; i < guide.ch[0].num_eits; i++) {
+ if(0xFFFF != guide.ett_pid[i]) {
+ if(parse_ett(dmxfd, i, guide.ett_pid[i])) {
+ fprintf(stderr, "%s(): error calling "
+ "parse_eit()\n", __FUNCTION__);
+ return -1;
+ }
+ }
+ if(ctrl_c) {
+ break;
+ }
+ }
+ fprintf(stdout, "\n");
+ }
+ signal(SIGINT, old_handler);
+
+ if(print_guide()) {
+ fprintf(stderr, "%s(): error calling print_guide()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(cleanup_guide()) {
+ fprintf(stderr, "%s(): error calling cleanup_guide()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(close_demux(dmxfd)) {
+ fprintf(stderr, "%s(): error calling close_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ if(close_frontend(fe)) {
+ fprintf(stderr, "%s(): error calling close_demux()\n",
+ __FUNCTION__);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/util/femon/femon.c b/util/femon/femon.c
index 46d239d..a50fe17 100644
--- a/util/femon/femon.c
+++ b/util/femon/femon.c
@@ -42,14 +42,21 @@
static char *usage_str =
"\nusage: femon [options]\n"
" -H : human readable output\n"
+ " -A : Acoustical mode. A sound indicates the signal quality.\n"
+ " -r : If 'Acoustical mode' is active it tells the application\n"
+ " is called remotely via ssh. The sound is heard on the 'real'\n"
+ " machine but. The user has to be root.\n"
" -a number : use given adapter (default 0)\n"
" -f number : use given frontend (default 0)\n"
" -c number : samples to take (default 0 = infinite)\n\n";
+int sleep_time=1000000;
+int acoustical_mode=0;
+int remote=0;
static void usage(void)
{
- fprintf(stderr, usage_str);
+ fprintf(stderr, "%s", usage_str);
exit(1);
}
@@ -59,6 +66,27 @@ int check_frontend (struct dvbfe_handle *fe, int human_readable, unsigned int co
{
struct dvbfe_info fe_info;
unsigned int samples = 0;
+ FILE *ttyFile=NULL;
+
+ // We dont write the "beep"-codes to stdout but to /dev/tty1.
+ // This is neccessary for Thin-Client-Systems or Streaming-Boxes
+ // where the computer does not have a monitor and femon is called via ssh.
+ if(acoustical_mode)
+ {
+ if(remote)
+ {
+ ttyFile=fopen("/dev/tty1","w");
+ if(!ttyFile)
+ {
+ fprintf(stderr, "Could not open /dev/tty1. No access rights?\n");
+ exit(-1);
+ }
+ }
+ else
+ {
+ ttyFile=stdout;
+ }
+ }
do {
if (dvbfe_get_info(fe, FE_STATUS_PARAMS, &fe_info, DVBFE_INFO_QUERYTYPE_IMMEDIATE, 0) != FE_STATUS_PARAMS) {
@@ -94,12 +122,24 @@ int check_frontend (struct dvbfe_handle *fe, int human_readable, unsigned int co
if (fe_info.lock)
printf("FE_HAS_LOCK");
+ // create beep if acoustical_mode enabled
+ if(acoustical_mode)
+ {
+ int signal=(fe_info.signal_strength * 100) / 0xffff;
+ fprintf( ttyFile, "\033[10;%d]\a", 500+(signal*2));
+ // printf("Variable : %d\n", signal);
+ fflush(ttyFile);
+ }
+
printf("\n");
fflush(stdout);
- usleep(1000000);
+ usleep(sleep_time);
samples++;
} while ((!count) || (count-samples));
-
+
+ if(ttyFile)
+ fclose(ttyFile);
+
return 0;
}
@@ -148,7 +188,7 @@ int main(int argc, char *argv[])
int human_readable = 0;
int opt;
- while ((opt = getopt(argc, argv, "Ha:f:c:")) != -1) {
+ while ((opt = getopt(argc, argv, "rAHa:f:c:")) != -1) {
switch (opt)
{
default:
@@ -166,6 +206,15 @@ int main(int argc, char *argv[])
case 'H':
human_readable = 1;
break;
+ case 'A':
+ // Acoustical mode: we have to reduce the delay between
+ // checks in order to hear nice sound
+ sleep_time=5000;
+ acoustical_mode=1;
+ break;
+ case 'r':
+ remote=1;
+ break;
}
}
diff --git a/util/gotox/Makefile b/util/gotox/Makefile
new file mode 100644
index 0000000..673586a
--- /dev/null
+++ b/util/gotox/Makefile
@@ -0,0 +1,17 @@
+# Makefile for linuxtv.org dvb-apps/util/gotox
+
+binaries = gotox
+
+inst_bin = $(binaries)
+
+CPPFLAGS += -I../../lib
+LDFLAGS += -L../../lib/libdvbapi
+LDFLAGS += -L../../lib/libdvbsec
+LDLIBS += -ldvbapi
+LDLIBS += -ldvbsec
+
+.PHONY: all
+
+all: $(binaries)
+
+include ../../Make.rules
diff --git a/util/gotox/gotox.c b/util/gotox/gotox.c
new file mode 100644
index 0000000..6616133
--- /dev/null
+++ b/util/gotox/gotox.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2006 by Michel Verbraak <michel@verbraak.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <libdvbapi/dvbfe.h>
+#include <libdvbsec/dvbsec_api.h>
+
+static char *usage_str =
+ "\nusage: gotox [options] -d <angle>\n"
+ " Goto the specified angle. Positive value for East rotation\n"
+ " Negative value for West rotation on Northern Hemisphere.\n"
+ " -d degrees : Angle to turn to in degrees (default 0)\n"
+ " -a number : use given adapter (default 0)\n"
+ " -f number : use given frontend (default 0)\n"
+ " -t seconds : leave power on to rotor for at least specified seconds of time (default 30)\n\n";
+
+int main(int argc, char *argv[])
+{
+ struct dvbfe_handle *fe;
+ unsigned int adapter = 0, frontend = 0;
+ double angle = 0;
+ int opt;
+ unsigned int sleepcount = 30;
+ static char *weststr = "west";
+ static char *eaststr = "east";
+
+ while ((opt = getopt(argc, argv, "ha:f:t:d:")) != -1) {
+
+ switch (opt){
+ case '?':
+ case 'h':
+ default:
+ fprintf(stderr, "%s", usage_str);
+ return EXIT_SUCCESS;
+
+ case 'a':
+ adapter = strtoul(optarg, NULL, 0);
+ break;
+
+ case 'f':
+ frontend = strtoul(optarg, NULL, 0);
+ break;
+
+ case 't':
+ sleepcount = strtoul(optarg, NULL, 0);
+ break;
+
+ case 'd':
+ angle = strtod(optarg, NULL);
+ break;
+ }
+ }
+
+ printf("Will try to rotate %s to %.2f degrees.\n", (angle < 0.0) ? weststr : eaststr, angle );
+
+ fe = dvbfe_open(adapter, frontend, 0);
+ if (fe == NULL) {
+ fprintf(stderr, "Could not open frontend %d on adapter %d.\n", frontend, adapter);
+ exit(1);
+ }
+
+ if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_OFF) != 0) {
+ fprintf(stderr, "Could not turn off power.\n");
+ dvbfe_close(fe);
+ return 1;
+ }
+ else
+ printf("Power OFF.\n");
+
+ sleep(1);
+
+ if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_18) != 0) {
+ fprintf(stderr, "Could not turn on power.\n");
+ dvbfe_close(fe);
+ return 1;
+ }
+ else
+ printf("Power on to 18V.\n");
+
+ sleep(1);
+
+ if (abs(angle) == 0.0) {
+
+ if (dvbsec_diseqc_goto_satpos_preset(fe, DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER, 0) != 0) {
+ fprintf(stderr, "Could not goto 0.\n");
+ dvbfe_close(fe);
+ return 2;
+ } else {
+ printf("Going to home base 0 degrees.\n");
+ }
+ } else {
+
+ if (dvbsec_diseqc_goto_rotator_bearing(fe, DISEQC_ADDRESS_POLAR_AZIMUTH_POSITIONER, angle) != 0) {
+ fprintf(stderr, "Could not rotate.\n");
+ dvbfe_close(fe);
+ return 2;
+ }
+ }
+
+ while (sleepcount != 0) {
+ printf("%d: Rotating to %.2f.\r", sleepcount, angle);
+ fflush(NULL);
+ sleepcount--;
+ sleep(1);
+ }
+
+ printf("\nRotated.\n");
+
+ if (dvbfe_set_voltage(fe, DVBFE_SEC_VOLTAGE_OFF) != 0) {
+ fprintf(stderr, "Could not turn off power.\n");
+ dvbfe_close(fe);
+ return 1;
+ }
+ else
+ printf("Power OFF.\n");
+
+ sleep(1);
+
+ dvbfe_close(fe);
+
+ return EXIT_SUCCESS;
+}
diff --git a/util/scan/dvb-c/at-Kabel-Braunau b/util/scan/dvb-c/at-Kabel-Braunau
new file mode 100644
index 0000000..1d93567
--- /dev/null
+++ b/util/scan/dvb-c/at-Kabel-Braunau
@@ -0,0 +1,26 @@
+# Kabel Braunau
+# freq sr fec mod
+C 386000000 6900000 NONE QAM64
+C 394000000 6875000 NONE QAM64
+C 402000000 6875000 NONE QAM64
+C 410000000 6875000 NONE QAM64
+C 418000000 6875000 NONE QAM64
+C 426000000 6875000 NONE QAM64
+C 434000000 6875000 NONE QAM64
+C 458000000 6875000 NONE QAM64
+C 466000000 6900000 NONE QAM64
+C 474000000 6900000 NONE QAM64
+C 482000000 6111000 NONE QAM64
+C 490000000 6111000 NONE QAM64
+C 498000000 6875000 NONE QAM64
+C 506000000 6111000 NONE QAM64
+C 514000000 6111000 NONE QAM64
+C 522000000 6428000 NONE QAM128
+C 530000000 6428000 NONE QAM128
+C 546000000 6875000 NONE QAM64
+C 554000000 6875000 NONE QAM64
+C 562000000 6875000 NONE QAM64
+C 570000000 6111000 NONE QAM64
+C 578000000 6900000 NONE QAM256
+C 586000000 6900000 NONE QAM256
+C 594000000 6875000 NONE QAM64
diff --git a/util/scan/dvb-c/at-Kabelsignal b/util/scan/dvb-c/at-Kabelsignal
new file mode 100644
index 0000000..4f7ec11
--- /dev/null
+++ b/util/scan/dvb-c/at-Kabelsignal
@@ -0,0 +1,38 @@
+# kabelsignal
+# freq sr fec mod
+C 314000000 6900000 NONE QAM256
+C 322000000 6900000 NONE QAM256
+C 330000000 6900000 NONE QAM256
+C 338000000 6900000 NONE QAM256
+C 346000000 6900000 NONE QAM256
+C 354000000 6900000 NONE QAM256
+C 362000000 6900000 NONE QAM256
+C 370000000 6900000 NONE QAM256
+C 378000000 6900000 NONE QAM256
+C 386000000 6900000 NONE QAM256
+C 394000000 6900000 NONE QAM256
+C 402000000 6900000 NONE QAM256
+C 410000000 6900000 NONE QAM256
+C 418000000 6900000 NONE QAM256
+C 426000000 6900000 NONE QAM256
+C 434000000 6900000 NONE QAM256
+C 442000000 6900000 NONE QAM256
+C 450000000 6900000 NONE QAM256
+C 666000000 6900000 NONE QAM256
+C 674000000 6900000 NONE QAM256
+C 682000000 6900000 NONE QAM256
+C 690000000 6900000 NONE QAM256
+C 698000000 6900000 NONE QAM256
+C 706000000 6900000 NONE QAM256
+C 714000000 6900000 NONE QAM256
+C 722000000 6900000 NONE QAM256
+C 730000000 6900000 NONE QAM256
+C 738000000 6900000 NONE QAM256
+C 746000000 6900000 NONE QAM256
+C 762000000 6900000 NONE QAM256
+C 770000000 6900000 NONE QAM256
+C 778000000 6900000 NONE QAM256
+C 786000000 6900000 NONE QAM256
+C 794000000 6900000 NONE QAM256
+C 802000000 6900000 NONE QAM256
+C 810000000 6900000 NONE QAM256
diff --git a/util/scan/dvb-c/at-KarrerNet b/util/scan/dvb-c/at-KarrerNet
index 27e143a..a00c6a2 100644
--- a/util/scan/dvb-c/at-KarrerNet
+++ b/util/scan/dvb-c/at-KarrerNet
@@ -1,18 +1,26 @@
# Kabel St. Florian bei Linz/AT KarrerNet
# 2009-01-10
# freq sr fec mod
-C 418000000 6900000 NONE QAM64
-C 426000000 6900000 NONE QAM64
-C 434000000 6900000 NONE QAM64
C 442000000 6900000 NONE QAM64
-C 450000000 6900000 NONE QAM64
C 458000000 6900000 NONE QAM64
C 466000000 6900000 NONE QAM64
C 474000000 6900000 NONE QAM64
C 482000000 6900000 NONE QAM64
+C 490000000 6900000 NONE QAM64
+C 498000000 6900000 NONE QAM64
+C 506000000 6900000 NONE QAM64
+C 514000000 6900000 NONE QAM64
C 522000000 6900000 NONE QAM64
C 530000000 6900000 NONE QAM64
C 538000000 6900000 NONE QAM64
+C 546000000 6900000 NONE QAM64
+C 554000000 6900000 NONE QAM64
+C 562000000 6900000 NONE QAM64
+C 570000000 6900000 NONE QAM64
C 578000000 6900000 NONE QAM64
-C 402000000 6900000 NONE QAM256
+C 586000000 6900000 NONE QAM64
+C 610000000 6900000 NONE QAM64
+C 386000000 6900000 NONE QAM256
+C 394000000 6900000 NONE QAM256
C 410000000 6900000 NONE QAM256
+C 434000000 6900000 NONE QAM256
diff --git a/util/scan/dvb-c/hu-Digikabel b/util/scan/dvb-c/hu-Digikabel
new file mode 100644
index 0000000..c885bff
--- /dev/null
+++ b/util/scan/dvb-c/hu-Digikabel
@@ -0,0 +1,24 @@
+# Digikabel, Hungary
+# For the following cities:
+# Budapest, Dorog, Hatvan, Kiskunhalas, Debrecen, Szekesfehervar, Pecs,
+# Veszprem, Dunaujvaros, Miskolc, Gyongyos, Tatabanya, Varpalota, Nagykanizsa,
+# Salgotarjan, Batonyterenye, Szolnok, Szentistvan, Nyiregyhaza, Gyor,
+# Szazhalombatta, Bekescsaba, Bekes, Eger, Komlo, Oroszlany
+# In some of the cities not all the frequencies are available.
+# freq sr fec mod
+C 354000000 6900000 NONE QAM256
+C 362000000 6900000 NONE QAM256
+C 370000000 6900000 NONE QAM256
+C 378000000 6900000 NONE QAM256
+C 386000000 6900000 NONE QAM256
+C 394000000 6900000 NONE QAM256
+C 402000000 6900000 NONE QAM256
+C 410000000 6900000 NONE QAM256
+C 770000000 6900000 NONE QAM256
+C 778000000 6900000 NONE QAM256
+C 786000000 6900000 NONE QAM256
+C 794000000 6900000 NONE QAM256
+C 834000000 6900000 NONE QAM256
+C 842000000 6900000 NONE QAM256
+C 850000000 6900000 NONE QAM256
+C 858000000 6900000 NONE QAM256
diff --git a/util/scan/dvb-c/nl-Casema b/util/scan/dvb-c/nl-Casema
deleted file mode 100644
index 5c42d85..0000000
--- a/util/scan/dvb-c/nl-Casema
+++ /dev/null
@@ -1,3 +0,0 @@
-# Casema Netherlands
-# freq sr fec mod
-C 372000000 6875000 NONE QAM64
diff --git a/util/scan/dvb-c/nl-Ziggo b/util/scan/dvb-c/nl-Ziggo
new file mode 100644
index 0000000..037cca1
--- /dev/null
+++ b/util/scan/dvb-c/nl-Ziggo
@@ -0,0 +1,14 @@
+# Initial Tuning file for nl-Ziggo
+# This file only lists the main
+# frequencies. You still need to do
+# a network scan to find other
+# transponders.
+#
+# based on:
+# http://blob.ziggo.nl/dynamic/NL_HOME/PDF-UPLOAD/Gebruikers-Handleiding-DigitaleTV.pdf
+# Chapter 4
+#
+C 372000000 6875000 NONE QAM64 # Main Frequency Ziggo/Casema
+C 514000000 6875000 NONE QAM64 # Main Frequency Ziggo/Multikabel
+C 356000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Zuid
+C 369000000 6875000 NONE QAM64 # Main Frequency Ziggo/@Home Noord
diff --git a/util/scan/dvb-c/nl-Ziggo-Zwolle b/util/scan/dvb-c/nl-Ziggo-Zwolle
new file mode 100644
index 0000000..e47b4ac
--- /dev/null
+++ b/util/scan/dvb-c/nl-Ziggo-Zwolle
@@ -0,0 +1,26 @@
+C 313000000 6875000 NONE QAM64 # TS 1
+C 361000000 6875000 NONE QAM64 # TS 2
+C 353000000 6875000 NONE QAM64 # TS 3
+C 345000000 6875000 NONE QAM64 # TS 4
+C 818000000 6875000 NONE QAM64 # TS 5
+C 329000000 6875000 NONE QAM64 # TS 6
+C 810000000 6875000 NONE QAM64 # TS 7
+C 305000000 6875000 NONE QAM64 # TS 8
+C 762000000 6875000 NONE QAM64 # TS 9
+C 618000000 6875000 NONE QAM64 # TS 10
+C 610000000 6875000 NONE QAM64 # TS 11
+C 337000000 6875000 NONE QAM64 # TS 12
+C 321000000 6875000 NONE QAM64 # TS 13
+C 385000000 6875000 NONE QAM64 # TS 14
+C 393000000 6875000 NONE QAM64 # TS 15
+C 401000000 6875000 NONE QAM64 # TS 16
+C 369000000 6875000 NONE QAM64 # TS 18 (main TS)
+C 297000000 6875000 NONE QAM64 # TS 19
+C 377000000 6875000 NONE QAM64 # TS 22
+C 754000000 6875000 NONE QAM64 # TS 23
+C 642000000 6875000 NONE QAM64 # TS 24
+C 650000000 6875000 NONE QAM64 # TS 25
+C 794000000 6875000 NONE QAM64 # TS 26
+C 409000000 6875000 NONE QAM64 # TS 27
+C 425000000 6875000 NONE QAM64 # TS 206
+C 417000000 6875000 NONE QAM64 # TS 207
diff --git a/util/scan/dvb-c/se-comhem b/util/scan/dvb-c/se-comhem
index 16bd7dd..7452c7f 100644
--- a/util/scan/dvb-c/se-comhem
+++ b/util/scan/dvb-c/se-comhem
@@ -1,3 +1,25 @@
# com hem
# freq sr fec mod
+C 289500000 6875000 NONE QAM64
+C 298000000 6875000 NONE QAM64
+C 306000000 6875000 NONE QAM64
+C 314000000 6875000 NONE QAM64
+C 322000000 6875000 NONE QAM64
+C 338000000 6875000 NONE QAM64
+C 346000000 6875000 NONE QAM64
+C 354000000 6875000 NONE QAM64
C 362000000 6875000 NONE QAM64
+C 370000000 6875000 NONE QAM64
+C 378000000 6875000 NONE QAM64
+C 386000000 6875000 NONE QAM64
+C 394000000 6875000 NONE QAM64
+C 402000000 6875000 NONE QAM64
+C 418000000 6875000 NONE QAM64
+C 434000000 6875000 NONE QAM64
+C 442000000 6875000 NONE QAM64
+C 450000000 6875000 NONE QAM64
+C 458000000 6875000 NONE QAM64
+C 714000000 6875000 NONE QAM64
+C 722000000 6875000 NONE QAM64
+C 738000000 6875000 NONE QAM64
+C 786000000 6875000 NONE QAM64
diff --git a/util/scan/dvb-s/Agila2_C-146.0E b/util/scan/dvb-s/Agila2_C-146.0E
new file mode 100644
index 0000000..ac30747
--- /dev/null
+++ b/util/scan/dvb-s/Agila2_C-146.0E
@@ -0,0 +1,60 @@
+# Agila 2 @ 146.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Viva Prime Channel
+S 3725000 H 2345000 3/4
+
+# Zoe Philippines
+S 3774000 V 3300000 3/4
+
+# Da Ai TV indonesia
+S 3791000 H 3100000 3/4
+
+# Trinity Broadcasting Multiplex
+S 3791000 V 10091000 5/6
+
+# Bayon TV
+S 3796000 H 3360000 3/4
+
+# White Springs TV
+S 3846000 H 6110000 3/4
+
+# TCT World
+S 3854000 H 2603000 5/6
+
+# CCTN
+S 3873000 V 2532000 3/4
+
+# NBN Philippines
+S 3875000 H 3000000 3/4
+
+# Al Masriyah
+S 3880000 H 2000000 3/4
+
+# Viva Entertainment Multiplex
+S 3887000 H 6716000 3/4
+
+# IBC13
+S 3896000 H 3000000 3/4
+
+# CTN Cambodia Multiplex
+S 3979000 V 9628000 3/4
+
+# Divya TV
+S 3990000 V 13330000 3/4
+
+# Familyland TV Network
+S 4164000 V 3735000 7/8
+
+# MTV Philippines
+S 4171000 V 3213000 3/4
+
+# The Old Path TV
+S 4183000 V 2170000 3/4
+
+# UNTV
+S 4188000 V 2170000 3/4
diff --git a/util/scan/dvb-s/Amos-4w b/util/scan/dvb-s/Amos-4w
index 3a80591..d10c48a 100644
--- a/util/scan/dvb-s/Amos-4w
+++ b/util/scan/dvb-s/Amos-4w
@@ -1,70 +1,48 @@
# Amos 6 @ 4W
# freq pol sr fec
-
-S 11419000 H 2604000 AUTO
-S 11347000 H 2800000 AUTO
-S 11423000 H 2894000 AUTO
-S 11338000 H 2960000 AUTO
-S 11133000 H 2963000 AUTO
-S 11631000 H 3200000 AUTO
-S 11132000 V 3254000 AUTO
-S 11154000 V 3255000 AUTO
-S 11319000 H 3333000 AUTO
-S 11426000 H 3333000 AUTO
-S 11575000 H 3333000 AUTO
-S 11638000 H 3333000 AUTO
-S 11323000 H 3350000 AUTO
-S 11328000 H 3350000 AUTO
-S 11350000 H 3350000 AUTO
-S 11359000 H 3350000 AUTO
-S 11332000 H 3500000 AUTO
-S 11128000 V 3700000 AUTO
-S 11343000 H 3700000 AUTO
-S 11626000 H 4000000 AUTO
-S 11443000 H 4164000 AUTO
-S 11644000 V 4340000 AUTO
-S 11432000 V 4500000 AUTO
-S 10993000 H 4850000 AUTO
-S 11191000 H 6111000 AUTO
-S 11183000 H 6428000 AUTO
-S 10986000 H 6666000 AUTO
-S 11144000 H 6666000 AUTO
-S 11151000 H 6666000 AUTO
-S 11161000 H 6666000 AUTO
-S 11172000 H 6666000 AUTO
-S 11209000 H 6666000 AUTO
-S 11219000 H 6666000 AUTO
-S 11413000 H 6666000 AUTO
-S 11673000 H 6900000 AUTO
-S 11435000 H 7480000 AUTO
-S 11546000 H 8050000 AUTO
-S 11177000 V 8520000 AUTO
-S 11585000 H 8888000 AUTO
-S 11235000 H 10000000 AUTO
-S 11144000 V 11110000 AUTO
-S 11652000 V 11111000 AUTO
-S 11560000 H 13400000 AUTO
-S 11690000 H 15000000 AUTO
-S 11652000 H 16100000 AUTO
-S 11303000 H 19540000 AUTO
-S 11390000 H 24000000 AUTO
-S 10762000 H 26000000 AUTO
-S 10720000 V 27500000 AUTO
-S 10723000 H 27500000 AUTO
-S 10758000 V 27500000 AUTO
-S 10803000 V 27500000 AUTO
-S 10805000 H 27500000 AUTO
-S 10841000 V 27500000 AUTO
-S 10842000 H 27500000 AUTO
-S 10889000 H 27500000 AUTO
-S 10889000 V 27500000 AUTO
-S 10924000 H 27500000 AUTO
-S 10924000 V 27500000 AUTO
-S 10972000 V 27500000 AUTO
-S 11008000 V 27500000 AUTO
-S 11260000 H 27500000 AUTO
-S 11474000 V 27500000 AUTO
-S 11510000 V 27500000 AUTO
-S 11558000 V 27500000 AUTO
-S 11592000 V 27500000 AUTO
-S 11677000 V 27500000 AUTO
+S 10722000 H 27500000 3/4
+S 10722000 V 27500000 3/4
+S 10722000 V 30000000 2/3
+S 10758000 V 27500000 3/4
+S 10758000 V 30000000 2/3
+S 10759000 H 30000000 3/4
+S 10806000 H 27500000 5/6
+S 10806000 V 27500000 3/4
+S 10842000 H 27500000 7/8
+S 10842000 V 27500000 3/4
+S 10842000 V 30000000 2/3
+S 10890000 H 27500000 7/8
+S 10890000 V 27500000 3/4
+S 10925000 H 27500000 7/8
+S 10925000 V 27500000 3/4
+S 10972000 V 27500000 3/4
+S 11008000 V 27500000 3/4
+S 11015000 H 2295000 3/4
+S 11123000 H 1850000 7/8
+S 11167000 H 12500000 5/6
+S 11179000 H 6666000 3/4
+S 11260000 H 27500000 3/4
+S 11304000 H 19540000 3/4
+S 11319000 H 2750000 3/4
+S 11329000 H 3333000 3/4
+S 11333000 H 3500000 3/4
+S 11347000 H 3350000 3/4
+S 11384000 H 19000000 5/6
+S 11411000 H 7925000 5/6
+S 11429000 H 5925000 3/4
+S 11435000 H 2089000 3/4
+S 11474000 V 27500000 3/4
+S 11510000 V 30000000 2/3
+S 11558000 V 27500000 3/4
+S 11559000 H 13400000 7/8
+S 11572000 H 8888000 3/4
+S 11592000 H 21350000 3/4
+S 11593000 V 27500000 3/4
+S 11625000 V 3000000 3/4
+S 11630000 H 2963000 3/4
+S 11630000 V 3000000 3/4
+S 11637000 V 1480000 3/4
+S 11647000 H 9167000 3/4
+S 11647000 V 8518000 3/4
+S 11654000 H 2000000 5/6
+S 11658000 V 8520000 5/6
diff --git a/util/scan/dvb-s/Apstar6_C-134.0E b/util/scan/dvb-s/Apstar6_C-134.0E
new file mode 100644
index 0000000..6a8a1f1
--- /dev/null
+++ b/util/scan/dvb-s/Apstar6_C-134.0E
@@ -0,0 +1,15 @@
+# Apstar 6 @ 134.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# New Entertainment
+S 3766000 H 4285000 3/4
+
+# Test
+S 3840000 H 27500000 3/4
+
+# TV Nusantara
+S 3905000 H 3250000 3/4
diff --git a/util/scan/dvb-s/AsiaSat2_C-100.5E b/util/scan/dvb-s/AsiaSat2_C-100.5E
new file mode 100644
index 0000000..1cc8035
--- /dev/null
+++ b/util/scan/dvb-s/AsiaSat2_C-100.5E
@@ -0,0 +1,51 @@
+# AsiaSat 2 100.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Iris Sat Multiplex
+S 3660000 V 27500000 3/4
+
+# APTN Direct
+S 3706000 H 4167000 5/6
+
+# APTN Global Video Wire (MPEG-4 S/2)
+S 3732000 H 8889000 2/3
+
+# BYU TV
+S 3767000 V 6527000 1/2
+
+# AJK TV
+S 3778000 V 3333000 3/4
+
+# RTB International Brunei
+S 3786000 H 6000000 7/8
+
+# Shamshad TV
+S 3790000 V 2444000 3/4
+
+# FTV HD (MPEG-4 S/2)
+S 3794000 H 4640000 3/4
+
+# Arabsat ASBU Bouquet Multiplex
+S 3820000 V 27500000 3/4
+
+# Star TV Multiplex (MPEG-4 S/2)
+S 3840000 H 30000000 3/4
+
+# E Network Multiplex
+S 3880000 H 27500000 3/4
+
+# SatLink Multiplex
+S 3960000 H 27500000 3/4
+
+# Star TV Multiplex
+S 3980000 V 28100000 3/4
+
+# SatLink European Bouquet (MPEG-2 & MPEG-4 S2)
+S 4000000 H 28125000 3/4
+
+# Macau Satellite TV Multiplex
+S 4148000 V 11852000 3/4
diff --git a/util/scan/dvb-s/AsiaSat3S_C-105.5E b/util/scan/dvb-s/AsiaSat3S_C-105.5E
index 8e98a5d..4d09ef5 100644
--- a/util/scan/dvb-s/AsiaSat3S_C-105.5E
+++ b/util/scan/dvb-s/AsiaSat3S_C-105.5E
@@ -1,122 +1,102 @@
# AsiaSat 3S 105.5E C-BAND
-# Generated by Xingbo Wang
-# Apr 2, 2005
+# Generated by Pietro Casoar
+# 1st March 2009
-# MPEG-2 QPSK
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
# freq pol sr fec
-# [encrypted] ZEE English, ZEE TV International, ZEE Movies, MX, ZEE TV SE Asia, ZEE TV Asia, Trendz
-S 3700000 V 27500000 3/4
+# China Entertainment TV & Maharishi Veda Vision
+S 3680000 H 26670000 3/4
+
+# MediaCorp Channel News Asia
+S 3706000 H 6000000 3/4
# BTV World
S 3725000 V 4450000 3/4
-# SAB TV
-S 3743000 V 3300000 3/4
-
-# AAJ TV
-S 3750000 V 2820000 3/4
-
-# Arirang TV
-S 3755150 V 4417900 7/8
-
-# [encrypted] STAR Plus India, STAR Movies India, STAR News India, National Geographic India, STAR Gold, STAR Movies (Middle East)
-# STAR Utsav
-S 3780000 V 28100000 3/4
+# Galaxy TVB
+S 3729000 H 13650000 3/4
-# Chinese Provincial TV: Guangxi, Shanxi, Anhui, Jiangsu, Heilongjiang
-S 3806000 V 4420000 3/4
-S 3813000 V 4420000 3/4
-S 3820000 V 4420000 3/4
-S 3827000 V 4420000 3/4
-S 3834000 V 4420000 3/4
+# Zee Network
+S 3733000 V 6500000 3/4
-# [encrypted] ESPN Taiwan, STAR Sports Taiwan, ESPN Asia, STAR Sports South East Asia, STAR Sports India, ESPN India, ESPN Philippines
-S 3860000 V 27500000 3/4
+# Madani Channel
+S 3739000 V 2815000 3/4
-# Dragon TV
-S 3886000 V 4800000 3/4
+# Fashion TV
+S 3746000 V 2625000 3/4
-# Shandong TV
-S 3895000 V 6813000 3/4
+# Aaj News
+S 3750000 V 2821000 3/4
-# CCTV-1(comprehensive), China National Radio Channel 1
-S 3904000 V 4420000 7/8
+# Arirang Arab
+S 3755000 V 4418000 7/8
-# Jilin Provincial TV
-S 3914500 V 4420000 3/4
+# Globecast multiplex
+S 3760000 H 26000000 7/8
-# [encrypted] A1, History, STAR Movies SEA/China, STAR World India, STAR Plus Pakistan, Channel[V] India, STAR Chinese Movies, CNBC India, STAR One, STAR Vijay
-S 3980000 V 28100000 3/4
+# Star TV Multiplex
+S 3780000 V 28100000 3/4
-# Sahara One, Sahara Samay National, Sahara Samay Mumbai, Sahara Samay Uttar Pradesh, Sahara Samay Bihar, Sahara Samay Madhya Pradesh
-S 4020000 V 27250000 3/4
+# Airwaves Media Multiplex
+S 3786000 H 5700000 3/4
-# Tianjin TV
-S 4046000 V 5950000 3/4
+# Zee Network Multiplex
+S 3820000 V 27500000 3/4
-# PTV-1, PTV World, PTV Channel 3, AVT Khyber
-S 4091000 V 13333000 3/4
+# Star TV Multiplex
+S 3840000 H 26850000 7/8
-# PTV National
-S 4106000 V 3333300 3/4
+# Star TV Multiplex
+S 3860000 V 27500000 3/4
-# Indus News
-S 4115750 V 3333000 3/4
+# B4U INDIA - MPEG-4 S/2 Multiplex
+S 3880000 H 27500000 3/4
-# [encrypted] ZEE Biz, ZEE News, ZEE Cinema, ZEE Music, Alpha TV Punjabi, Alpha TV Gujarati, Alpha TV Bangla, Alpha TV Marathi, Smile TV
-S 4140000 V 27500000 3/4
+# Star TV Multiplex
+S 3940000 V 28100000 3/4
-# Chinese Provincial TV: Henan, Fujian, Jiangxi, Liaoning
-S 4166000 V 4420000 3/4
-S 4180000 V 4420000 3/4
-S 4187000 V 4420000 3/4
-S 4194000 V 4420000 3/4
+# Tuner International Multiplex
+S 3960000 H 28100000 3/4
-# CETV
-S 3680000 H 26670000 3/4
+# Star TV Multiplex
+S 3980000 V 28100000 3/4
-# Channel NewsAsia
-S 3706000 H 6000000 3/4
+# Star TV Multiplex
+S 4000000 H 26850000 7/8
-# Asia Plus
-S 3715500 H 7000000 3/4
+# Sahara Samay Multiplex
+S 4020000 V 27250000 3/4
-# TVB 8, CETV
-S 3729000 H 13650000 3/4
+# VOA Voice Of America Multiplex
+S 4040000 H 20400000 1/2
-# Network of the World, Bloomberg TV Asia, Indus Vision, Indus Music, Muslim TV Ahmadiyya, Living Asia Channel
-# [encrypted] Filmazia
-S 3760000 H 26000000 7/8
+# Globecast Multiplex
+S 4071000 H 14240000 3/4
-# [encrypted] Fox News, Sky News, STAR Movies Int'l Taiwan, National Geographic Taiwan, STAR Chinese Channel, STAR Movies mandarin, Channel[V] Taiwan
-S 3840000 H 26850000 7/8
+# PTV Multiplex
+S 4091000 V 13333000 3/4
-# STAR Sports Asia
-# [encrypted] ESPN China, STAR Sports Hong Kong, ESPN Hong Kong
-S 3920000 H 26750000 7/8
+# Sun TV
+S 4095000 H 5554000 3/4
-# [encrypted] CNN International Asia, CNN Newsource, Cartoon Network Asia, Cartoon Network Taiwan, Cartoon Network Philippines, Cartoon Network Australia/New Zealand, TCM Australia, Boomerang
-S 3960000 H 27500000 3/4
+# PTV Global USA
+S 4102000 V 2894000 3/4
-# [encrypted] Phoenix Movies, star World Asia, Star Movies Int'l, Channel[V] International, National Geographic Regional
-# Phoenix Chinese Channel, Phoenix Info News Channel, Xiong Kong Int'l, Xing Kong Regional, Channel[V](Greater China)
-S 4000000 H 26850000 7/8
+# PTV Global UK & Europe
+S 4106000 V 2894000 3/4
-# Chinese Provincial TV: Hubei, Sichuan
-S 4034600 H 4420000 3/4
-S 4051000 H 4420000 3/4
+# Galaxy TVB Multiplex
+S 4111000 H 13650000 3/4
-# Chinese Provincial TV: Qinghai, Hunan
-S 4067000 H 4420000 3/4
-S 4082000 H 4420000 3/4
+# PTV Multiplex
+S 4114000 V 7000000 3/4
-# Sun TV
-S 4094000 H 5555000 3/4
+# Eye TV Multiplex
+S 4129000 H 13600000 3/4
-# MATV, Horizon Channel
-# [encrypted] Tian Ying Movies Channel, TVB Xing He Channel
-S 4111000 H 13650000 3/4
+# Zee Network Multiplex
+S 4140000 V 27500000 3/4
-# CCTV Channel 4 (International), Channel 9 (English language), CCTV E&F
-S 4129000 H 13240000 3/4
+# Geo TV Network Multiplex
+S 4180000 V 26666000 3/4
diff --git a/util/scan/dvb-s/Asiasat4_C-122.2E b/util/scan/dvb-s/Asiasat4_C-122.2E
new file mode 100644
index 0000000..60a9730
--- /dev/null
+++ b/util/scan/dvb-s/Asiasat4_C-122.2E
@@ -0,0 +1,27 @@
+# Asiasat 4 @ 122.2E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# SITI Digital Network Multiplex
+S 3760000 H 27500000 3/4
+
+# SITI Digital Network Multiplex
+S 3820000 V 27500000 3/4
+
+# Henan Radio Multiplex
+S 3856000 H 2170000 3/4
+
+# SITI Digital Network Multiplex
+S 3880000 H 27500000 3/4
+
+# SITI Digital network Multiplex
+S 3920000 H 27500000 3/4
+
+# SITI Digital network Multiplex
+S 3960000 H 27500000 3/4
+
+# SITI Digital network Multiplex
+S 4180000 V 27500000 3/4
diff --git a/util/scan/dvb-s/Astra-23.5E b/util/scan/dvb-s/Astra-23.5E
new file mode 100644
index 0000000..6e45dbf
--- /dev/null
+++ b/util/scan/dvb-s/Astra-23.5E
@@ -0,0 +1,66 @@
+# Astra 23.5E
+# freq pol sr fec
+S 10758000 V 22000000 7/8
+S 10788000 V 22000000 5/6
+S 10802000 H 22000000 5/6
+S 10842000 V 13333000 5/6
+S 10862000 H 22000000 5/6
+# Astra2Connect
+# S2 10891250 H 22000000 3/4 AUTO 8PSK
+S 11475000 V 27500000 3/4
+S 11515000 H 27500000 3/4
+S2 11515000 V 28500000 9/10 AUTO QPSK
+S2 11555000 H 28500000 9/10 AUTO QPSK
+S2 11555000 V 28500000 9/10 AUTO QPSK
+S2 11592000 V 28500000 9/10 AUTO QPSK
+S2 11595000 H 28500000 9/10 AUTO QPSK
+S2 11635000 H 28500000 9/10 AUTO QPSK
+S2 11635000 V 28500000 9/10 AUTO QPSK
+S 11675000 H 27500000 3/4
+S2 11675000 V 28500000 9/10 AUTO QPSK
+S2 11719000 H 27500000 9/10 AUTO QPSK
+S 11739000 V 27500000 3/4
+# Astra2Connect
+# S2 11758000 H 27500000 5/6 AUTO 8PSK
+S2 11778000 V 27500000 9/10 AUTO QPSK
+S 11798000 H 27500000 3/4
+S2 11817000 V 27500000 9/10 AUTO QPSK
+S 11836000 H 29900000 3/4
+S2 11856000 V 27500000 5/6 AUTO QPSK
+S 11875000 H 27500000 3/4
+S 11914000 H 27500000 3/4
+# Astra2Connect
+# S2 11954000 H 27500000 3/4 AUTO 8PSK
+S 11992000 H 27500000 3/4
+S 12012000 V 27500000 3/4
+S2 12032000 H 27500000 9/10 AUTO QPSK
+S 12070000 H 27500000 3/4
+S2 12109000 H 27500000 9/10 AUTO QPSK
+# Astra2Connect
+# S2 12148000 H 27500000 3/4 AUTO 8PSK
+S 12168000 V 27500000 3/4
+# Astra2Connect
+# S2 12226000 H 27500000 3/5 AUTO 8PSK
+# Astra2Connect
+# S2 12304000 H 27500000 5/6 AUTO 8PSK
+# Astra2Connect
+# S2 12344000 H 28200000 5/6 AUTO 8PSK
+# Astra2Connect
+# S2 12382000 H 27500000 3/4 AUTO 8PSK
+S 12525000 H 27500000 3/4
+S 12525000 V 27500000 3/4
+S 12565000 H 27500000 2/3
+S 12565000 V 27500000 3/4
+S2 12605000 H 28500000 9/10 AUTO QPSK
+S2 12605000 V 28500000 9/10 AUTO QPSK
+S 12630000 V 6000000 3/4
+S 12631000 H 6666000 7/8
+S 12636000 V 2277000 5/6
+S 12641000 H 2220000 7/8
+S 12644000 H 2170000 3/4
+S 12649000 H 5600000 5/6
+S 12661000 H 2170000 5/6
+S 12685000 V 27500000 3/4
+S 12696000 H 3255000 1/2
+S 12711000 H 6111000 AUTO
+S 12725000 V 27500000 3/4
diff --git a/util/scan/dvb-s/Atlantic-Bird-1-12.5W b/util/scan/dvb-s/Atlantic-Bird-1-12.5W
index 5c38433..6735d70 100644
--- a/util/scan/dvb-s/Atlantic-Bird-1-12.5W
+++ b/util/scan/dvb-s/Atlantic-Bird-1-12.5W
@@ -1,20 +1,30 @@
# Atlantic Bird 1 @ 12.5W
# freq pol sr fec
-
-S 11682000 H 05632000 AUTO
-S 11673000 H 06111000 AUTO
-S 11664000 H 06111000 AUTO
-S 11655000 H 06666000 AUTO
-S 11690000 H 05700000 AUTO
-S 11596000 V 27500000 AUTO
-S 11618000 H 02324000 AUTO
-S 11590000 H 06111000 AUTO
-S 11597000 H 03184000 AUTO
-S 11629000 H 06507000 AUTO
-S 11622000 H 03255000 AUTO
-S 11585000 H 05632000 AUTO
-S 11643000 H 02398000 AUTO
-S 11647000 H 03990000 AUTO
-S 11647000 V 03990000 AUTO
-S 11693000 V 04800000 AUTO
-S 11644000 V 04800000 AUTO
+S 11099000 H 2000000 5/6
+S 11132000 H 3255000 3/4
+S 11136000 V 3700000 5/6
+S 11174000 H 15190000 3/4
+S 11179000 V 22400000 2/3
+S 11188000 H 5722000 5/6
+S 11332000 H 6428000 2/3
+S 11337000 H 1923000 7/8
+S 11340000 H 2279000 5/6
+S 11355000 H 11781000 7/8
+S 11408000 V 27500000 3/4
+S 11428000 H 30000000 5/6
+S 11595000 V 27500000 5/6
+S 11622000 H 3255000 AUTO
+S 11643000 H 2398000 AUTO
+S 11645000 V 4790000 AUTO
+S 11651000 V 3688000 AUTO
+S 12515000 H 17455000 3/4
+S 12535000 V 2000000 3/4
+S 12545000 H 17455000 3/4
+S 12594000 H 2170000 3/4
+S 12597000 H 1730000 3/4
+S 12604000 H 1481000 3/4
+S 12655000 H 4285000 3/4
+S 12659000 H 2141000 3/4
+S 12662000 V 3928000 3/4
+S 12720000 V 1808000 3/4
+S 12743000 V 3214000 3/4
diff --git a/util/scan/dvb-s/Atlantic-Bird-3-5.0W b/util/scan/dvb-s/Atlantic-Bird-3-5.0W
new file mode 100644
index 0000000..4e7f007
--- /dev/null
+++ b/util/scan/dvb-s/Atlantic-Bird-3-5.0W
@@ -0,0 +1,4 @@
+# Atlantic Bird 3 @ 5.0W
+# freq pol sr fec
+S 11096000 V 29950000 7/8
+S 11591000 V 20000000 2/3
diff --git a/util/scan/dvb-s/Chinastar1_C-87.5E b/util/scan/dvb-s/Chinastar1_C-87.5E
new file mode 100644
index 0000000..0c03cfc
--- /dev/null
+++ b/util/scan/dvb-s/Chinastar1_C-87.5E
@@ -0,0 +1,15 @@
+# ChinaStar 1 @ 87.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Myawady TV
+S 3734000 H 5925000 3/4
+
+# Zam TV Tests
+S 4076000 H 2532000 3/4
+
+# Test Card
+S 4081000 H 4687000 3/4
diff --git a/util/scan/dvb-s/Insat2E_C-83.0E b/util/scan/dvb-s/Insat2E_C-83.0E
new file mode 100644
index 0000000..8e76b8e
--- /dev/null
+++ b/util/scan/dvb-s/Insat2E_C-83.0E
@@ -0,0 +1,93 @@
+# Insat 2E @ 83.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# NE TV Multiplex
+S 3521000 V 8640000 3/4
+
+# NE TV Multiplex
+S 3537000 V 10800000 3/4
+
+# TV 9 Telugu
+S 3550000 V 3255000 3/4
+
+# S1 Channel
+S 3559000 V 3366000 3/4
+
+# TV 9 Kannada
+S 3581000 V 3255000 3/4
+
+# Jaya TV
+S 3593000 V 8680000 3/4
+
+# Tata Communications Multiplex
+S 3593000 V 9629000 3/4
+
+# Asianet Multiplex
+S 3643000 V 19531000 3/4
+
+# Amrita TV Middle East
+S 3678000 V 5926000 3/4
+
+# Mahaa TV
+S 3689000 V 2893000 3/4
+
+# Tata Communications Multiplex
+S 3696000 V 6111000 3/4
+
+# CNBC India
+S 3760000 V 6500000 3/4
+
+# Raj TV Network Multiplex
+S 3774000 V 13021000 3/4
+
+# UTVi TV
+S 3794000 V 3500000 3/5
+
+# PTC Multiplex (MPEG-4 S/2)
+S 3815000 V 6000000 3/4
+
+# Tata Communications Multiplex
+S 3845000 V 26043000 3/4
+
+# Indiavision
+S 3914000 V 3000000 3/4
+
+# Yes Indiavision
+S 3919000 V 3000000 3/4
+
+# Manorama News International
+S 3923000 V 3000000 3/4
+
+# Tata Communications Multiplex
+S 3934000 V 13021000 3/4
+
+# Raj Musix kanada
+S 3961000 V 6656000 3/4
+
+# TV 9 Multiplex
+S 3974000 V 13333000 3/4
+
+# Asianet Multiplex
+S 4010000 V 19531000 3/4
+
+# Tata Communications Multiplex
+S 4031000 V 7440000 7/8
+
+# RRSat Multiplex
+S 4042000 V 7420000 7/8
+
+# Tata Communications Multiplex
+S 4050000 V 5084000 7/8
+
+# DD national
+S 4070000 V 5000000 3/4
+
+# Indiasign Mulitplex
+S 4091000 V 9230000 7/8
+
+# News Live (MPEG-4 S/2)
+S 4100000 V 4700000 3/4
diff --git a/util/scan/dvb-s/Insat3A_C-93.5E b/util/scan/dvb-s/Insat3A_C-93.5E
new file mode 100644
index 0000000..b4430df
--- /dev/null
+++ b/util/scan/dvb-s/Insat3A_C-93.5E
@@ -0,0 +1,66 @@
+# Insat 3A @ 93.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# DD Bangla
+S 3732000 V 6250000 3/4
+
+# DD Punjab
+S 3740000 V 6250000 3/4
+
+# DD Gujarati
+S 3750000 V 6250000 3/4
+
+# DD Chandana
+S 3759000 V 6250000 3/4
+
+# DD Oriya
+S 3772000 V 6250000 3/4
+
+# DD kashir
+S 3782000 V 6250000 3/4
+
+# DD Sahyadri
+S 3791000 V 8600000 3/4
+
+# DD Malayalam
+S 3812000 V 6250000 3/4
+
+# DD Saptagiri
+S 3820000 V 6250000 3/4
+
+# DD podhigai
+S 3831000 V 8600000 3/4
+
+# DD Himachal Pradesh
+S 3932000 V 6250000 3/4
+
+# DD Jaipur
+S 3940000 V 6250000 3/4
+
+# Madhya Pradesh
+S 3950000 V 6250000 3/4
+
+# DD Uttar Pradesh
+S 3958000 V 6250000 3/4
+
+# DD North East
+S 4092000 V 6250000 3/4
+
+# DD Mizoram
+S 4101000 V 6250000 3/4
+
+# DD Tripura
+S 4109000 V 4250000 3/4
+
+# RTA Afghanistan
+S 4132000 V 4000000 3/4
+
+# RTA Afghanistan Nangarhar
+S 4136000 V 2000000 3/4
+
+# Ariana TV Network Multiplex
+S 4141000 V 5150000 3/4
diff --git a/util/scan/dvb-s/Insat4A_C-83.0E b/util/scan/dvb-s/Insat4A_C-83.0E
new file mode 100644
index 0000000..fa27210
--- /dev/null
+++ b/util/scan/dvb-s/Insat4A_C-83.0E
@@ -0,0 +1,93 @@
+# Insat 4A @ 83.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# NSTPL Multiplex
+S 3725000 H 26665000 3/4
+
+# Indiasign multiplex
+S 3756000 H 13333000 3/4
+
+# Star TV Multiplex
+S 3777000 H 10900000 3/4
+
+# Essel Shyam Multiplex
+S 3805000 H 28500000 7/8
+
+# Tarang TV Multiplex (MPEG-4 S/2)
+S 3841000 H 6920000 3/4
+
+# CTVN AKD Plus
+S 3853000 H 3265000 3/4
+
+# Kasthuri TV
+S 3857000 H 3462000 3/4
+
+# Kamyab TV
+S 3874000 H 3403000 3/4
+
+# Vanitha TV
+S 3892000 H 3300000 3/4
+
+# Essel Shayam Multiplex
+S 3898000 H 6800000 3/4
+
+# Channel 10 India
+S 3910000 H 3600000 7/8
+
+# Essel Shyam
+S 3923000 H 13000000 3/4
+
+# DY 365
+S 3949000 H 3225000 3/4
+
+# Multiplex
+S 3958000 H 9500000 7/8
+
+# Zee News Uttar Pradesh
+S 3976000 H 3200000 3/4
+
+# ETV Network Multiplex
+S 4004000 H 22220000 5/6
+
+# Essel Shyam
+S 4040000 H 7500000 7/8
+
+# Lamhas Multiplex
+S 4054000 H 13230000 3/4
+
+# Network 18 Multiplex
+S 4072000 H 6500000 3/4
+
+# IBN Lokmat
+S 4078000 H 3250000 3/4
+
+# Live India
+S 4087000 H 3300000 3/4
+
+# Mi Marathi
+S 4091000 H 3000000 3/4
+
+# BBS TV
+S 4100000 H 4750000 3/4
+
+# Manorama News
+S 4115000 H 5555000 3/4
+
+# BAG Films
+S 4134000 H 10600000 3/4
+
+# Zee Network Multiplex
+S 4151000 H 6500000 3/4
+
+# Zee Network Multiplex
+S 4161000 H 6500000 3/4
+
+# Lok Sabha TV
+S 4170000 H 6500000 3/4
+
+# Kolkata TV
+S 4180000 H 3233000 3/4
diff --git a/util/scan/dvb-s/Insat4B_C-93.5E b/util/scan/dvb-s/Insat4B_C-93.5E
new file mode 100644
index 0000000..5431ae0
--- /dev/null
+++ b/util/scan/dvb-s/Insat4B_C-93.5E
@@ -0,0 +1,51 @@
+# Insat 4B @ 93.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Doordarshan Multiplex
+S 3725000 H 27500000 3/4
+
+# DD Dehradun
+S 3750000 H 4250000 3/4
+
+# DD Raipur
+S 3762000 H 4250000 3/4
+
+# DD Ranchi
+S 3768000 H 4250000 3/4
+
+# DD Jammu
+S 3774000 H 4250000 3/4
+
+# DD Hissar
+S 3802000 H 4250000 3/4
+
+# DD Chandigarh
+S 3808000 H 4250000 3/4
+
+# DD Port Blair
+S 3822000 H 4250000 3/4
+
+# DD Bihar
+S 3832000 H 6250000 3/4
+
+# DD North East
+S 3841000 H 6250000 3/4
+
+# Sun network
+S 3885000 H 28000000 3/4
+
+# Doordarshan Multiplex
+S 3925000 H 27500000 3/4
+
+# Sakshi TV
+S 3950000 H 4440000 3/4
+
+# Tata Communications Multiplex
+S 4005000 H 25422000 7/8
+
+# Sun Network
+S 4045000 H 28000000 3/4
diff --git a/util/scan/dvb-s/Intelsat-1002-1.0W b/util/scan/dvb-s/Intelsat-1002-1.0W
index 09d82ca..0142ded 100644
--- a/util/scan/dvb-s/Intelsat-1002-1.0W
+++ b/util/scan/dvb-s/Intelsat-1002-1.0W
@@ -1,5 +1,20 @@
# Intelsat 1002 @ 1.0W
# freq pol sr fec
-
S 4175000 V 28000000 AUTO
S 4180000 H 21050000 AUTO
+S 11093000 H 19191000 7/8
+S 11166000 V 1450000 7/8
+S 11182000 V 3100000 7/8
+S 11606000 H 13356000 7/8
+S 12527000 H 27500000 3/4
+S 12563000 H 27500000 3/4
+S 12563000 V 27500000 3/4
+S 12607000 H 27500000 3/4
+S 12607000 V 27500000 3/4
+S 12643000 H 27500000 3/4
+S 12643000 V 27500000 3/4
+S 12687000 H 27500000 3/4
+S 12687000 V 27500000 3/4
+S 12718000 V 18400000 3/4
+S 12723000 H 27500000 3/4
+S 12735000 V 8800000 5/6
diff --git a/util/scan/dvb-s/Intelsat8_C-166.0E b/util/scan/dvb-s/Intelsat8_C-166.0E
new file mode 100644
index 0000000..6c671cc
--- /dev/null
+++ b/util/scan/dvb-s/Intelsat8_C-166.0E
@@ -0,0 +1,39 @@
+# Intelsat 8 @ 166.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Viacom Multiplex
+S 3740000 H 27500000 2/3
+
+# South Korean Multiplex
+S 3790000 V 6510000 3/4
+
+# Arirang World
+S 3815000 V 4400000 3/4
+
+# Australian network Multiplex
+S 3829000 H 13238000 3/4
+
+# TVBS multiplex
+S 3833000 V 17500000 3/4
+
+# NBC Universal
+S 3900000 H 27500000 3/4
+
+# Intelsat multiplex
+S 3940000 H 27690000 7/8
+
+# China Radio multiplex
+S 3959000 V 3428000 3/4
+
+# NHK World network Multiplex
+S 4060000 H 16180000 1/2
+
+# Philippines Network TV Multiplex
+S 4122000 V 5554000 3/4
+
+# TAS Multiplex
+S 4130000 V 5800000 3/4
diff --git a/util/scan/dvb-s/JCSat3A_C-128.0E b/util/scan/dvb-s/JCSat3A_C-128.0E
new file mode 100644
index 0000000..71f68d1
--- /dev/null
+++ b/util/scan/dvb-s/JCSat3A_C-128.0E
@@ -0,0 +1,18 @@
+# JCSAT 3A @ 128.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# TAS Multiplex
+S 3960000 V 30000000 5/6
+
+# TAS Multiplex
+S 4000000 V 30000000 5/6
+
+# Miraclenet
+S 4055000 V 3332000 3/4
+
+# TAS Multiplex
+S 4120000 V 30000000 5/6
diff --git a/util/scan/dvb-s/Measat3_C-91.5E b/util/scan/dvb-s/Measat3_C-91.5E
new file mode 100644
index 0000000..2753ac0
--- /dev/null
+++ b/util/scan/dvb-s/Measat3_C-91.5E
@@ -0,0 +1,54 @@
+# Measat 3 @ 91.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Shop TV
+S 3629000 V 2200000 3/4
+
+# Aora TV Mulitplex
+S 3644000 H 22320000 3/4
+
+# Solar Entertainment
+S 3645000 V 19510000 3/4
+
+# National Geographic music
+S 3718000 V 1700000 7/8
+
+# DZRH TV Multiplex
+S 3721000 V 2170000 3/4
+
+# Ascent Media (MPEG-4 S/2)
+S 3751000 V 13330000 2/3
+
+# Globecast Multiplex (MPEG-4 S/2)
+S 3769000 V 14000000 3/4
+
+# HTV Multiplex
+S 3796000 V 7030000 3/4
+
+# Sky International
+S 3814000 V 6666000 3/4
+
+# Un-named Mulitplex
+S 3865000 V 3835000 3/4
+
+# RTM Multiplex
+S 3877000 V 12525000 7/8
+
+# RTM Sarawak Feeds
+S 3887000 V 3984000 3/4
+
+# Globecast Multiplex
+S 3920000 V 28000000 7/8
+
+# Ginx TV
+S 4113000 V 2960000 3/4
+
+# YR Asia TV
+S 4117000 V 2963000 3/4
+
+# All Sports Network (MPEG-4 S/2)
+S 4134000 V 7200000 3/4
diff --git a/util/scan/dvb-s/Nilesat101+102-7.0W b/util/scan/dvb-s/Nilesat101+102-7.0W
index 64c1921..8ef176f 100644
--- a/util/scan/dvb-s/Nilesat101+102-7.0W
+++ b/util/scan/dvb-s/Nilesat101+102-7.0W
@@ -1,36 +1,41 @@
# Nilesat 101/102 & Atlantic Bird @ 7W
# freq pol sr fec
-S 10758000 V 27500000 AUTO
-S 10796000 V 27500000 AUTO
-S 10853000 H 27500000 AUTO
-S 10873000 V 27500000 AUTO
-S 10892000 H 27500000 AUTO
-S 10911000 V 27500000 AUTO
-S 10930000 H 27500000 AUTO
-S 11747000 V 27500000 AUTO
-S 11766000 H 27500000 AUTO
-S 11785000 V 27500000 AUTO
-S 11804000 H 27500000 AUTO
-S 11823000 V 27500000 AUTO
-S 11843000 H 27500000 AUTO
-S 11862000 V 27500000 AUTO
-S 11881000 H 27500000 AUTO
-S 11900000 V 27500000 AUTO
-S 11919000 H 27500000 AUTO
-S 11938000 V 27500000 AUTO
-S 11958000 H 27500000 AUTO
-S 11977000 V 27500000 AUTO
-S 11996000 H 27500000 AUTO
-S 12015000 V 27500000 AUTO
-S 12034000 H 27500000 AUTO
-S 12054000 V 27500000 AUTO
-S 12073000 H 27500000 AUTO
-S 12130000 V 27500000 AUTO
-S 12149000 H 27500000 AUTO
-S 12207000 V 27500000 AUTO
-S 12226000 H 27500000 AUTO
-S 12284000 V 27500000 AUTO
-S 12303000 H 27500000 AUTO
-S 12341000 V 27500000 AUTO
-S 12360000 H 27500000 AUTO
-S 12399000 H 27500000 AUTO
+S 10719000 V 27500000 3/4
+S 10723000 H 27500000 3/4
+S 10758000 V 27500000 3/4
+S 10775000 H 27500000 3/4
+S 10796000 V 27500000 3/4
+S 10892000 H 27500000 3/4
+S 10911000 V 27500000 3/4
+S 10930000 H 27500000 3/4
+S 11317000 V 27500000 3/4
+S 11747000 V 27500000 3/4
+S 11766000 H 27500000 3/4
+S 11785000 V 27500000 3/4
+S 11804000 H 27500000 3/4
+S 11823000 V 27500000 3/4
+S 11843000 H 27500000 3/4
+S 11862000 V 27500000 3/4
+S 11881000 H 27500000 3/4
+S 11900000 V 27500000 3/4
+S 11919000 H 27500000 3/4
+S 11938000 V 27500000 3/4
+S 11958000 H 27500000 3/4
+S 11977000 V 27600000 5/6
+S 11996000 H 27500000 3/4
+S 12015000 V 27500000 3/4
+S 12034000 H 27500000 3/4
+S 12054000 V 27500000 3/4
+S 12073000 H 27500000 3/4
+S 12130000 V 27500000 3/4
+S 12149000 H 27500000 3/4
+S 12207000 V 27500000 3/4
+S 12226000 H 27500000 3/4
+S 12284000 V 27500000 3/4
+S 12303000 H 27500000 3/4
+S 12341000 V 27500000 3/4
+S 12360000 H 27500000 3/4
+S 12380000 V 27500000 3/4
+S 12399000 H 27500000 3/4
+S 12418000 V 27500000 3/4
+S 12476000 H 27500000 3/4
diff --git a/util/scan/dvb-s/PalapaC2_C-113.0E b/util/scan/dvb-s/PalapaC2_C-113.0E
new file mode 100644
index 0000000..d9b0fc8
--- /dev/null
+++ b/util/scan/dvb-s/PalapaC2_C-113.0E
@@ -0,0 +1,39 @@
+# Palapa C2 @ 113.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# SCTV Jawa Timur
+S 3745000 H 3125000 3/4
+
+# SCTV
+S 3758000 H 4470000 3/4
+
+# TVRI Nasional
+S 3765000 H 5555000 3/4
+
+# RCTI
+S 3774000 H 6520000 3/4
+
+# KBS World Indonesia
+S 3836000 V 2097000 3/4
+
+# Bali TV
+S 3926000 H 4208000 3/4
+
+# TV One Indonesia
+S 4054000 H 5632000 3/4
+
+# ANTV Indonesia
+S 4055000 V 6510000 3/4
+
+# Indosiar
+S 4074000 V 6500000 3/4
+
+# Satelindo Multiplex
+S 4080000 H 28125000 3/4
+
+# TPI Indonesia
+S 4184000 V 6700000 3/4
diff --git a/util/scan/dvb-s/ST1_C-80.0E b/util/scan/dvb-s/ST1_C-80.0E
new file mode 100644
index 0000000..92d5b80
--- /dev/null
+++ b/util/scan/dvb-s/ST1_C-80.0E
@@ -0,0 +1,27 @@
+# ST1 @ 88.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# GTV Multiplex
+S 3469000 V 30000000 3/4
+
+# ABTV Multiplex
+S 3521000 H 8332000 5/6
+
+# Videoland Multiplex
+S 3550000 V 30000000 3/4
+
+# GTV Multiplex
+S 3595000 H 30000000 3/4
+
+# Videoland multiplex
+S 3632000 V 30000000 3/4
+
+# Chungwa Telecom
+S 3671000 H 9256000 3/4
+
+# NTD TV Asia-Pacific
+S 3689000 H 3000000 3/4
diff --git a/util/scan/dvb-s/Sirius-5.0E b/util/scan/dvb-s/Sirius-5.0E
index ec4e4ea..949d0e2 100644
--- a/util/scan/dvb-s/Sirius-5.0E
+++ b/util/scan/dvb-s/Sirius-5.0E
@@ -1,5 +1,62 @@
# Sirius 5.0E
# freq pol sr fec
+S 11215000 V 6666000 1/2
+S 11227000 H 23145000 3/4
+S 11247000 V 23145000 3/4
+S 11420000 H 23145000 3/4
+S 11727000 H 27500000 5/6
+S 11747000 V 27500000 3/4
+S 11766000 H 27500000 3/4
+S 11785000 V 27500000 3/4
+S 11804000 H 27500000 3/4
S 11823000 V 27500000 3/4
+S 11843000 H 27500000 3/4
+S 11862000 V 27500000 3/4
+S 11881000 H 27500000 3/4
+S 11900000 V 27500000 3/4
+S 11919000 H 27500000 3/4
+S 11938000 V 27500000 3/4
+S 11958000 H 27500000 3/4
S 11977000 V 27500000 3/4
+S 11996000 H 27500000 3/4
+S 12015000 V 27500000 5/6
+S 12034000 H 27500000 3/4
S 12054000 V 27500000 3/4
+S 12073000 H 27500000 3/4
+S 12092000 V 27500000 3/4
+S 12111000 H 27500000 5/6
+S 12130000 V 27500000 3/4
+S 12149000 H 27500000 3/4
+S 12169000 V 27500000 3/4
+S 12188000 H 27500000 7/8
+S 12207000 V 27500000 3/4
+S 12226000 H 25540000 7/8
+S 12245000 V 27500000 3/4
+S 12265000 H 27500000 3/4
+S 12284000 V 27500000 3/4
+S 12303000 H 25547000 7/8
+S 12322000 V 27500000 3/4
+S 12341000 H 27500000 3/4
+S 12360000 V 27500000 7/8
+S 12379000 H 27500000 3/4
+S 12399000 V 27500000 2/3
+S 12418000 H 27500000 3/4
+S 12437000 V 27500000 2/3
+S 12456000 H 27500000 3/4
+S 12476000 V 27500000 3/4
+S 12608000 H 27500000 3/4
+S 12637000 H 14465000 3/4
+S 12668000 V 6666000 1/2
+S 12672000 H 3300000 3/4
+S 12674000 V 10000000 3/4
+S 12678000 V 13333000 5/6
+S 12680000 H 9404000 3/4
+S 12685000 V 4444000 3/4
+S 12690000 H 3330000 3/4
+S 12693000 V 3333000 5/6
+S 12701000 H 6111000 3/4
+S 12715000 H 3330000 3/4
+S 12718000 V 23500000 3/4
+S 12724000 H 1772000 3/4
+S 12728000 V 19720000 3/4
+S 12737000 V 6150000 3/4
diff --git a/util/scan/dvb-s/Telecom2-8.0W b/util/scan/dvb-s/Telecom2-8.0W
index 91678b4..5f48631 100644
--- a/util/scan/dvb-s/Telecom2-8.0W
+++ b/util/scan/dvb-s/Telecom2-8.0W
@@ -1,4 +1,17 @@
# Telecom2 8.0W
# freq pol sr fec
-S 11635000 H 6800000 5/6
-S 12687000 V 1879000 3/4
+S 10972000 V 27500000 3/4
+S 10974000 H 27500000 3/4
+S 11010000 H 27500000 3/4
+S 11011000 V 27500000 3/4
+S 11042000 H 7860000 3/4
+S 11053000 H 2850000 3/4
+S 11064000 H 12667000 3/4
+S 11387000 H 24740000 5/6
+S 11428000 H 27500000 3/4
+S 11500000 H 3460000 AUTO
+S 11554000 V 27500000 3/4
+S 11595000 V 27500000 3/4
+S 12545000 H 3038000 3/4
+S 12566000 V 27500000 3/4
+S 12649000 V 27500000 3/4
diff --git a/util/scan/dvb-s/Telkom1_C-108.0E b/util/scan/dvb-s/Telkom1_C-108.0E
new file mode 100644
index 0000000..f60c246
--- /dev/null
+++ b/util/scan/dvb-s/Telkom1_C-108.0E
@@ -0,0 +1,48 @@
+# Telkom 1 @ 108.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Telkom Vision Multiplex
+S 3580000 H 28000000 3/4
+
+# Telkom Vision Multiplex
+S 3620000 H 28000000 3/4
+
+# Telkom Vision Multiplex
+S 3640000 V 28000000 3/4
+
+# TV Timor Leste
+S 3776000 H 4285000 3/4
+
+# TV Edukasi 1
+S 3785000 H 4000000 3/4
+
+# TVRI Kalbar
+S 3793000 H 3000000 3/4
+
+# TVRI Papua
+S 3797000 H 3900000 3/4
+
+# TV Edukasi 2
+S 3807000 H 4000000 3/4
+
+# Trans 7
+S 3990000 H 6000000 3/4
+
+# TVRI Aceh
+S 4015000 H 6000000 3/4
+
+# RCTI Jawa Timur
+S 4025000 H 3000000 3/4
+
+# Trans TV
+S 4084000 H 6000000 3/4
+
+# Papua TV
+S 4092000 H 3570000 3/4
+
+# JTV
+S 4097000 H 3125000 3/4
diff --git a/util/scan/dvb-s/Telstar-12-15.0W b/util/scan/dvb-s/Telstar-12-15.0W
deleted file mode 100644
index fb902ab..0000000
--- a/util/scan/dvb-s/Telstar-12-15.0W
+++ /dev/null
@@ -1,32 +0,0 @@
-# Telstar 12 @ 15.0W
-# freq pol sr fec
-
-S 12180000 H 03255000 AUTO
-S 11895000 V 05000000 AUTO
-S 11974000 V 03400000 AUTO
-S 12185000 H 04214000 AUTO
-S 12081000 H 03935000 AUTO
-S 12050000 V 03198000 AUTO
-S 11756000 H 06666000 AUTO
-S 12093000 V 02000000 AUTO
-S 11916000 H 06111000 AUTO
-S 11707000 H 03198000 AUTO
-S 11718000 V 05632000 AUTO
-S 11740000 V 03255000 AUTO
-S 12000000 H 06666000 AUTO
-S 12116000 H 02062000 AUTO
-S 12111000 H 02062000 AUTO
-S 12175000 H 03504000 AUTO
-S 12167000 H 03502000 AUTO
-S 12129000 V 02000000 AUTO
-S 12110000 V 06620000 AUTO
-S 11724000 H 13225000 AUTO
-S 11984000 H 13570000 AUTO
-S 12125000 H 03800000 AUTO
-S 11713000 V 09626000 AUTO
-S 11804000 V 07595000 AUTO
-S 11965000 H 14714000 AUTO
-S 12039000 V 05632000 AUTO
-S 12082000 V 06396000 AUTO
-S 12087000 V 03198000 AUTO
-S 12097000 V 03198000 AUTO
diff --git a/util/scan/dvb-s/Telstar10_C-76.5E b/util/scan/dvb-s/Telstar10_C-76.5E
new file mode 100644
index 0000000..36b0431
--- /dev/null
+++ b/util/scan/dvb-s/Telstar10_C-76.5E
@@ -0,0 +1,63 @@
+# Telstar 10 @ 76.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# Racing International
+S 3646000 H 5064000 3/4
+
+# Image Channel
+S 3655000 H 3214000 3/4
+
+# Globe Cast Asia multiplex
+S 3680000 H 27500000 3/4
+
+# UBI World TV Multiplex
+S 3760000 H 28066000 2/3
+
+# UBI World TV Multiplex
+S 3780000 V 28066000 2/3
+
+# Ekushey TV
+S 3787000 H 4600000 2/3
+
+# Diganta TV
+S 3793000 H 4340000 3/4
+
+# RRSat Global Network Multiplex
+S 3840000 H 27500000 3/4
+
+# Channel 1
+S 4003000 H 4080000 3/4
+
+# Boishakhi TV
+S 4009000 H 4300000 3/4
+
+# TV Maldives
+S 4030000 V 6312000 1/2
+
+# Channel I
+S 4034000 H 4300000 3/4
+
+# Bangla Vision
+S 4049000 H 3600000 3/4
+
+# Kantipur TV
+S 4056000 H 3214000 3/4
+
+# BBC World Service Multiplex
+S 4073000 H 13020000 1/2
+
+# MNC Indonesia
+S 4105000 H 3125000 3/4
+
+# NDTV Arabia
+S 4137000 H 2893000 3/4
+
+# Islamic TV
+S 4146000 H 3600000 3/4
+
+# Bangladesh Multiplex
+S 4173000 H 7400000 3/4
diff --git a/util/scan/dvb-s/Telstar12-15.0W b/util/scan/dvb-s/Telstar12-15.0W
index 529b91f..db14a6e 100644
--- a/util/scan/dvb-s/Telstar12-15.0W
+++ b/util/scan/dvb-s/Telstar12-15.0W
@@ -1,4 +1,26 @@
# Telstar 12 15.0W
# freq pol sr fec
-S 12041000 H 3256000 2/3
-S 12520000 V 8700000 1/2
+S 10988000 H 2893000 3/4
+S 10992000 H 2893000 3/4
+S 11060000 H 19279000 3/4
+S 11123000 V 19279000 3/4
+S 11124000 H 18386000 3/4
+S 11150000 H 18386000 3/4
+S 11150000 V 19279000 3/4
+S 11531000 H 3198000 7/8
+S 11566000 H 4284000 3/4
+S 11677000 V 2200000 1/2
+S 11709000 V 3195000 AUTO
+S 11806000 V 7596000 3/4
+S 11963000 H 14714000 3/4
+S 12082000 H 3935000 3/4
+S 12117000 H 4772000 AUTO
+S 12159000 H 7777000 2/3
+S 12166000 H 3503000 3/4
+S 12173000 H 3503000 3/4
+S 12524000 V 26470000 3/4
+S 12547000 H 11900000 2/3
+S 12589000 V 4503000 1/2
+S 12608000 H 19279000 2/3
+S 12615000 V 11939000 2/3
+S 12645000 H 3255000 3/4
diff --git a/util/scan/dvb-s/Telstar18_C-138.0E b/util/scan/dvb-s/Telstar18_C-138.0E
new file mode 100644
index 0000000..6bd70c6
--- /dev/null
+++ b/util/scan/dvb-s/Telstar18_C-138.0E
@@ -0,0 +1,18 @@
+# Telstar 18 @ 138.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# I-Sky-Net Multiplex
+S 3599000 V 30000000 3/4
+
+# I-Sky-Net Multiplex
+S 3660000 V 30000000 3/4
+
+# LNTV Laos
+S 3704000 V 3034000 3/4
+
+# BBC World Service Multiplex
+S 4124000 V 3255000 1/2
diff --git a/util/scan/dvb-s/Thaicom1A_C-120.0E b/util/scan/dvb-s/Thaicom1A_C-120.0E
new file mode 100644
index 0000000..1a9d11f
--- /dev/null
+++ b/util/scan/dvb-s/Thaicom1A_C-120.0E
@@ -0,0 +1,24 @@
+# Thaicom 1A @ 120.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# TV3 Cambodia
+S 3725000 V 3255000 3/4
+
+# Panyapiwat
+S 3745000 V 2850000 5/6
+
+# CTN Cambodia Multiplex
+S 3854000 V 9628000 3/4
+
+# Kasikorn TV
+S 3881000 V 2000000 3/4
+
+# Bayon TV
+S 3916000 V 3359000 3/4
+
+# Radio Thailand Multiplex
+S 4135000 V 1808000 3/4
diff --git a/util/scan/dvb-s/Thaicom2_C-78.5E b/util/scan/dvb-s/Thaicom2_C-78.5E
new file mode 100644
index 0000000..4e1fbcd
--- /dev/null
+++ b/util/scan/dvb-s/Thaicom2_C-78.5E
@@ -0,0 +1,33 @@
+# Thaicom 2 @ 78.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# BBTV Channel 7
+S 3764000 H 5900000 3/4
+
+# SBT TV
+S 3803000 H 1445000 7/8
+
+# MCOT Multiplex
+S 3888000 H 15625000 3/4
+
+# Royal Thai Army TV 5
+S 3905000 H 6250000 3/4
+
+# Thai TV Color Channel 3
+S 3967000 H 4551000 3/4
+
+# RU TV 1
+S 4003000 H 1085000 3/4
+
+# Ten TV & Rich Channel
+S 4016000 H 2305000 7/8
+
+# NBT TV
+S 4106000 H 4688000 3/4
+
+# Thai PBS
+S 4145000 H 4815000 3/4
diff --git a/util/scan/dvb-s/Thaicom5_C-78.5E b/util/scan/dvb-s/Thaicom5_C-78.5E
new file mode 100644
index 0000000..902ddac
--- /dev/null
+++ b/util/scan/dvb-s/Thaicom5_C-78.5E
@@ -0,0 +1,69 @@
+# Thaicom 5 @ 78.5E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# ETC India Multiplex
+S 3421000 V 6667000 3/4
+
+# Europe Media Port Multiplex
+S 3431000 H 13333000 3/4
+
+# Nepal TV Multiplex
+S 3432000 V 6667000 3/4
+
+# CTV9
+S 3448000 V 2222000 3/4
+
+# RRSat Global Network (MPEG-4 S/2)
+S 3450000 H 13333000 3/4
+
+# Avenues TV
+S 3454000 V 3333000 3/4
+
+# PSI Channel
+S 3460000 V 1538000 3/4
+
+# Sagarmatha TV
+S 3489000 V 3333000 3/4
+
+# Dhi TV
+S 3502000 V 4444000 2/3
+
+# Korean Central TV
+S 3504000 H 3367000 2/3
+
+# Gang Cartoon Channel
+S 3505000 V 1852000 3/4
+
+# Lao Star Channel
+S 3521000 V 2917000 3/4
+
+# Thaicom Multiplex
+S 3545000 V 30000000 5/6
+
+# RRSat Global Network
+S 3551000 H 13333000 3/4
+
+# VTV Maldives
+S 3562000 H 4444000 1/2
+
+# MRTV Multiplex
+S 3574000 H 7492000 2/3
+
+# Thaicom Multiplex
+S 3585000 V 26667000 3/4
+
+# Thaicom Multiplex
+S 3600000 H 26667000 3/4
+
+# MRTV Multiplex
+S 3617000 V 12500000 3/4
+
+# RRSat Global Network Multiplex
+S 3640000 H 28066000 3/4
+
+# TVK Cambodia
+S 3664000 H 3704000 3/4
diff --git a/util/scan/dvb-s/Thor-1.0W b/util/scan/dvb-s/Thor-1.0W
index 1f8f1d2..99e98d4 100644
--- a/util/scan/dvb-s/Thor-1.0W
+++ b/util/scan/dvb-s/Thor-1.0W
@@ -1,8 +1,36 @@
# Thor 1.0W
# freq pol sr fec
+S 11216000 V 24500000 7/8
+S 11229000 H 24500000 7/8
S 11247000 V 24500000 7/8
+S 11261000 H 24500000 7/8
+S 11278000 V 24500000 7/8
S 11293000 H 24500000 7/8
+S 11309000 V 24500000 7/8
S 11325000 H 24500000 7/8
-S 12054000 H 28000000 7/8
+S 11325000 V 24500000 7/8
+S 11325000 V 24500000 7/8
+S 11341000 V 24500000 7/8
+S 11357000 H 24500000 7/8
+S 11372000 V 24500000 7/8
+S 11389000 H 24500000 7/8
+S 11403000 V 24500000 7/8
+S 11421000 H 24500000 7/8
+S 11434000 V 24500000 7/8
+S 11747000 H 28000000 5/6
+S 11785000 H 28000000 5/6
+S 11823000 H 28000000 7/8
+S 11938000 H 25000000 3/4
+S 12015000 H 30000000 3/4
+S 12130000 H 30000000 3/4
+S 12149000 V 28000000 5/6
S 12169000 H 28000000 7/8
-S 12226000 V 28000000 7/8
+S 12188000 V 25000000 3/4
+S 12226000 V 28000000 3/4
+S 12245000 H 28000000 5/6
+S 12303000 V 28000000 5/6
+S 12322000 H 27800000 3/4
+S 12399000 H 28000000 7/8
+S 12418000 V 28000000 7/8
+S 12456000 V 28000000 3/4
+S 12476000 H 28000000 5/6
diff --git a/util/scan/dvb-s/Vinasat1_C-132.0E b/util/scan/dvb-s/Vinasat1_C-132.0E
new file mode 100644
index 0000000..4d611de
--- /dev/null
+++ b/util/scan/dvb-s/Vinasat1_C-132.0E
@@ -0,0 +1,12 @@
+# VINASAT 1 @ 132.0E C-BAND
+# Generated by Pietro Casoar
+# 1st March 2009
+
+# MPEG-2 & MPEG-4 QPSK (DVBS/S2)
+# freq pol sr fec
+
+# VTV Multiplex (VTV 1, VTV 2, VTV 3, VTV 4, VTV6)
+S 3413000 V 9766000 3/4
+
+# VOV TV (Voice of VietNam)
+S 3529000 V 2500000 2/3
diff --git a/util/scan/dvb-t/au-AdelaideFoothills b/util/scan/dvb-t/au-AdelaideFoothills
new file mode 100644
index 0000000..466a354
--- /dev/null
+++ b/util/scan/dvb-t/au-AdelaideFoothills
@@ -0,0 +1,12 @@
+# Australia / Adelaide / Grenfell Street
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC
+T 781625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Seven
+T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Nine
+T 795500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Ten
+T 732500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS
+T 760500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-Bendigo b/util/scan/dvb-t/au-Bendigo
new file mode 100644
index 0000000..a5df229
--- /dev/null
+++ b/util/scan/dvb-t/au-Bendigo
@@ -0,0 +1,41 @@
+# Australia / Bendigo (Mt Alexandria transmitters)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC
+T 669500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 620500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 572500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Seven
+T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 655500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 555250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Nine
+T 576250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 592500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Ten
+T 618250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# SBS
+T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 634500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 534250000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+
+# UNK1
+T 676500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# UNK2
+T 571500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+T 536625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 585625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 543500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 536500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 529500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 205500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 564500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 536625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 690500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 711500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+T 550500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/au-Devonport b/util/scan/dvb-t/au-Devonport
new file mode 100644
index 0000000..4985f09
--- /dev/null
+++ b/util/scan/dvb-t/au-Devonport
@@ -0,0 +1,19 @@
+# Australia / Tasmania / Devonport
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+#
+# Brett S Hallett October 2009 , may not be complete !!
+#
+# ABC VHF 57
+T 730250000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# ABC Digital 45
+T 648500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS VHF 54
+T 709250000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# SBS Digital 39
+T 606500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# SCTV
+T 613498000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# WIN
+T 627498000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
+# TDT
+T 585498000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-FraserCoast-Bundaberg b/util/scan/dvb-t/au-FraserCoast-Bundaberg
new file mode 100644
index 0000000..562fc34
--- /dev/null
+++ b/util/scan/dvb-t/au-FraserCoast-Bundaberg
@@ -0,0 +1,12 @@
+# Australia / QLD / Fraser Coast - Bundaberg / Mt Goonaneman
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC VHF9A
+T 205625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS UHF28
+T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# Seven VHF7
+T 184625000 7MHz 2/3 NONE QAM64 8k 1/16 NONE
+# WIN Wide Bay VHF10
+T 212500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Southern Cross Ten VHF9
+T 198525000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/au-Goulburn-Rocky_Hill b/util/scan/dvb-t/au-Goulburn-Rocky_Hill
new file mode 100644
index 0000000..bff0dbe
--- /dev/null
+++ b/util/scan/dvb-t/au-Goulburn-Rocky_Hill
@@ -0,0 +1,19 @@
+# Australia / Goulburn / Rocky Hill
+#
+# Scanned 17/10/2009 - Alex Ferrara (alex@receptiveit.com.au)
+
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# ABC - netid (4112) tid (547) offset (+125Khz)
+T 725625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# SBS - netid (12802) tid (848) offset (+125Khz)
+T 746625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+
+# WIN - netid (12915) tid (12922) offset (+125Khz)
+T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# Prime - netid (12929) tid (2462) offset (+125Khz)
+T 788625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+
+# TEN - netid (12812) tid (2055) offset (0Khz)
+T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill b/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill
new file mode 100644
index 0000000..04dee51
--- /dev/null
+++ b/util/scan/dvb-t/au-Hervey_Bay-Ghost_Hill
@@ -0,0 +1,16 @@
+# Australia / Hervey Bay / Ghost Hill
+#
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+#
+# ABC UHF56
+T 725500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Seven UHF59
+T 746500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Nine UHF62
+T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# Ten UHF68
+T 809500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+# SBS UHF28
+T 529500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+# SBS UHF34
+T 704500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-Perth b/util/scan/dvb-t/au-Perth
index 1d6778d..48c046f 100644
--- a/util/scan/dvb-t/au-Perth
+++ b/util/scan/dvb-t/au-Perth
@@ -9,4 +9,4 @@ T 191625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
# Network TEN
T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
# SBS
-T 536500000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 536625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/au-SunshineCoast b/util/scan/dvb-t/au-SunshineCoast
index 9fb17ef..c376678 100644
--- a/util/scan/dvb-t/au-SunshineCoast
+++ b/util/scan/dvb-t/au-SunshineCoast
@@ -3,7 +3,7 @@
# SBS36 SBS ***
T 585625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
# TNQ47 10 ***
-T 662625000 7MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 662625000 7MHz 3/4 NONE QAM64 8k 1/8 NONE
# ABQ62 ABC ***
T 767625000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
# STQ65 7 ***
diff --git a/util/scan/dvb-t/au-Sutherland b/util/scan/dvb-t/au-Sutherland
new file mode 100644
index 0000000..6c21a73
--- /dev/null
+++ b/util/scan/dvb-t/au-Sutherland
@@ -0,0 +1,20 @@
+# Australia / Sutherland
+#
+# Australia modulation params:
+# - http://www.dba.org.au/index.asp?sectionID=120
+#
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+#
+# North (Broadcast Site Escarpment Road BROKERS NOSE)
+# - http://www.dba.org.au/index.asp?query=true&sectionID=22&recLocation=Wollongong+%2D+North
+#
+#Channel 7 stations
+T 177500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+#Channel 9 bundle
+# T 191500000 7MHz AUTO AUTO AUTO AUTO AUTO AUTO
+#One and Channel 10
+T 219500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+#Aunty
+T 226500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
+#SBS
+T 571500000 7MHz 3/4 NONE QAM64 8k 1/16 NONE
diff --git a/util/scan/dvb-t/be-Brussels b/util/scan/dvb-t/be-Brussels
index f81b83b..6998b48 100644
--- a/util/scan/dvb-t/be-Brussels
+++ b/util/scan/dvb-t/be-Brussels
@@ -1,5 +1,5 @@
# Brussels - Belgium (Transmitters of the RTBF and the VRT)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 754000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # RTBF
-T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # BE-TV
-T 482000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # VRT
+T 754000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # RTBF
+T 746000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # BE-TV
+T 482000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # VRT
diff --git a/util/scan/dvb-t/cz-All b/util/scan/dvb-t/cz-All
new file mode 100644
index 0000000..7c6d601
--- /dev/null
+++ b/util/scan/dvb-t/cz-All
@@ -0,0 +1,41 @@
+# Czech Republic, whole country
+# Created from http://www.digizone.cz/texty/mapy-pokryti-multiplex-1-ceska-televize/
+# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-2-radiokomunikace/
+# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-3-czech-digital-group/
+# and http://www.digizone.cz/texty/mapy-pokryti-multiplex-4-telefonica-o2/
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 546000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 594000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 666000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 674000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 706000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 714000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 738000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 746000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 786000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 802000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 826000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/cz-Brno b/util/scan/dvb-t/cz-Brno
deleted file mode 100644
index b82e108..0000000
--- a/util/scan/dvb-t/cz-Brno
+++ /dev/null
@@ -1,10 +0,0 @@
-# DVB-T Brno (Brno, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-# MUX 1 Ceska televize
-T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 2 Ceske radiokomunikace
-T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 3 Czech Digital Group
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 4 Telefonica O2
-T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/cz-Domazlice b/util/scan/dvb-t/cz-Domazlice
deleted file mode 100644
index c20f70a..0000000
--- a/util/scan/dvb-t/cz-Domazlice
+++ /dev/null
@@ -1,3 +0,0 @@
-# DVB-T Domažlice (Domažlice, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 610000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/cz-Klet b/util/scan/dvb-t/cz-Klet
deleted file mode 100644
index 880db35..0000000
--- a/util/scan/dvb-t/cz-Klet
+++ /dev/null
@@ -1,4 +0,0 @@
-# DVB-T Ceske Budejovice (Klet, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-# CRa - Ceske radiokomunikace, TX Klet
-T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/cz-Ostrava b/util/scan/dvb-t/cz-Ostrava
deleted file mode 100644
index d2ea69f..0000000
--- a/util/scan/dvb-t/cz-Ostrava
+++ /dev/null
@@ -1,3 +0,0 @@
-# DVB-T Ostrava (Ostrava, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 618000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/cz-Plzen b/util/scan/dvb-t/cz-Plzen
deleted file mode 100644
index 0b916af..0000000
--- a/util/scan/dvb-t/cz-Plzen
+++ /dev/null
@@ -1,8 +0,0 @@
-# DVB-T Plzen (Pilsen, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-# MUX 1 Ceska televize
-T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 2 Ceske Radiokomunikace
-T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-# MUX 3 Czech Digital Group
-T 722000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/cz-Praha b/util/scan/dvb-t/cz-Praha
deleted file mode 100644
index 0d6721f..0000000
--- a/util/scan/dvb-t/cz-Praha
+++ /dev/null
@@ -1,7 +0,0 @@
-# DVB-T Praha (Prague, Czech Republic)
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 634000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 674000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
-T 818000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/de-Baden-Wuerttemberg b/util/scan/dvb-t/de-Baden-Wuerttemberg
index 3e5bec2..4dff1fd 100644
--- a/util/scan/dvb-t/de-Baden-Wuerttemberg
+++ b/util/scan/dvb-t/de-Baden-Wuerttemberg
@@ -1,20 +1,19 @@
# DVB-T Baden-Württemberg
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsPlus
-T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: SWR-BW, BR, hr, WDR
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: SWR-BW, BR, hr, WDR
T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: SWR-BW, BR, hr, WDR
T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsPlus
+T 666000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH45: RTL, RTL II, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SWR-BW, BR, hr, WDR
-T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsPlus
- # CH50: SWR-BW, BR, hr, WDR
+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: SWR-BW, BR, hr, WDR
T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Das Erste, arte, Phoenix, EinsPlus
-T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsPlus
- # CH53: SWR-BW, BR, hr, WDR
T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsPlus
T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsPlus
diff --git a/util/scan/dvb-t/de-Bayern b/util/scan/dvb-t/de-Bayern
index 50229fd..07ceeb0 100644
--- a/util/scan/dvb-t/de-Bayern
+++ b/util/scan/dvb-t/de-Bayern
@@ -1,26 +1,26 @@
# DVB-T Bayern
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 184500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH06: Das Erste, arte, Phoenix, EinsPlus
T 191500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH07: Das Erste, arte, Phoenix, EinsPlus
T 212500000 7MHz 3/4 NONE QAM16 8k 1/4 NONE # CH10: Das Erste, arte, Phoenix, EinsPlus
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: BR, BRalpha, SWR, Das Erste
- # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH25: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: BR, BRalpha, SWR, Das Erste
T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: BR, BRalpha, SWR, Das Erste
- # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH28: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsPlus
T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Das Erste, arte, Phoenix, EinsPlus
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
- # CH34: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH34: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, arte, Phoenix, EinsPlus
+T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: BR, BRalpha, SWR, Das Erste
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: BR, BRalpha, hr, mdr
# CH40: Das Erste, arte, Phoenix, EinsPlus
-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: BR, BRalpha, hr, mdr
# CH45: Das Erste, arte, Phoenix, EinsPlus
T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: BR, BRalpha, SWR, Das Erste
@@ -28,13 +28,13 @@ T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: BR, BRalpha, SWR, Das Erste
T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: BR, BRalpha, hr, mdr
# CH47: Das Erste, arte, Phoenix, EinsPlus
T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Pro7, Sat.1, Kabel1, N24
+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Das Erste, arte, Phoenix, EinsPlus
T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: Pro7, Sat.1, Kabel1, N24
T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, BRalpha, SWR, Das Erste
- # CH53: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: http://www.digitalfernsehen.de/news/news_769785.html
+ # CH53: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Das Erste, arte, Phoenix, EinsPlus
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsPlus
T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: BR, BRalpha, SWR, Das Erste
-T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: Das Erste, arte, Phoenix, EinsPlus
-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Eurosport, MonA, Franken Fernsehen
+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Eurosport, MonaTV, Franken TV
T 834000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH66: RTL, RTL II, Super RTL, VOX
- # CH66: Tele 5, Eurosport, HSE 24, münchen.tv
+ # CH66: Tele 5, Eurosport, HSE 24, München.TV
diff --git a/util/scan/dvb-t/de-Berlin b/util/scan/dvb-t/de-Berlin
index 86f875b..5b040c7 100644
--- a/util/scan/dvb-t/de-Berlin
+++ b/util/scan/dvb-t/de-Berlin
@@ -1,11 +1,12 @@
# DVB-T Berlin
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: HSE 24/MONA, FAB, WDR, SWR
+T 177500000 7MHz 3/4 NONE QAM16 8k 1/8 NONE # CH05: Tele 5, HSE 24 / MonaTV(+ DMAX / Bibel.TV), WDR, SWR (BW / RP)
T 191500000 7MHz 2/3 NONE QAM16 8k 1/8 NONE # CH07: MDR, NDR, arte
T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: RTL, RTL II, Super RTL, VOX
T 522000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH27: Das Erste, RBB, Phoenix, EinsExtra
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Vierte, Bibel.TV, QVC, TVP Polonia (ab Januar 2010)
T 658000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH44: Pro7, Sat.1, Kabel1, N24
T 754000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH56: Eurosport, TV.B, DSF, Neun live
-T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews, + 26 Radioprogramme
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH59: n-tv, EuroNews / Channel 21 Shop, + 14 Radioprogramme
diff --git a/util/scan/dvb-t/de-Brandenburg b/util/scan/dvb-t/de-Brandenburg
index 3949267..9fc6ebe 100644
--- a/util/scan/dvb-t/de-Brandenburg
+++ b/util/scan/dvb-t/de-Brandenburg
@@ -1,7 +1,7 @@
# DVB-T Brandenburg
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 730000000 8MHz 3/4 NONE QAM16 8k 1/4 NONE # CH53: Das Erste, RBB, Phoenix, EinsExtra
T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: MDR, NDR, arte
diff --git a/util/scan/dvb-t/de-Bremen b/util/scan/dvb-t/de-Bremen
index 7540bbf..9a79038 100644
--- a/util/scan/dvb-t/de-Bremen
+++ b/util/scan/dvb-t/de-Bremen
@@ -3,7 +3,7 @@
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
-T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MONA/DMAX
+T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: Tele 5, Neun live, Eurosport, MonaTV/ DMAX
T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
diff --git a/util/scan/dvb-t/de-Hamburg b/util/scan/dvb-t/de-Hamburg
index 4588748..f746043 100644
--- a/util/scan/dvb-t/de-Hamburg
+++ b/util/scan/dvb-t/de-Hamburg
@@ -1,16 +1,10 @@
# DVB-T Hamburg
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH30: Pro7, Sat.1, Kabel1, N24
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
-T 626000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH40: RTL, RTL II, Super RTL, VOX
-T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
-T 674000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH46: Neun live, HH1, BibelTV, Eurosport
+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Neun live, HH1, Bibel.TV, Eurosport
T 738000000 8MHz 1/2 NONE QAM64 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
-T 738000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH54: NDR HH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR SH
diff --git a/util/scan/dvb-t/de-Hessen b/util/scan/dvb-t/de-Hessen
index 7aa5d02..e4ad39c 100644
--- a/util/scan/dvb-t/de-Hessen
+++ b/util/scan/dvb-t/de-Hessen
@@ -2,18 +2,18 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 198500000 7MHz 2/3 NONE QAM16 8k 1/4 NONE # CH08: Phoenix, BR, SWR-RP
-T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: Phoenix, BR, SWR-RP, WDR
-T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 506000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH25: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: Das Erste, hr, EinsExtra/arte
T 578000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH34: RTL, RTL II, Super RTL, VOX
T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: Das Erste, hr, EinsExtra/arte
T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: Phoenix, BR, SWR-RP, mdr
-T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, hr, EinsExtra/arte
-T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: BR, hr, SWR-BW, WDR
T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: Pro7, Sat.1, Kabel1, N24
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Phoenix, NDR, mdr, WDR
-T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv
+T 818000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH64: Tele5, Eurosport, rheinmaintv, Bibel.TV
diff --git a/util/scan/dvb-t/de-Mecklenburg-Vorpommern b/util/scan/dvb-t/de-Mecklenburg-Vorpommern
index d1b0800..24e90ea 100644
--- a/util/scan/dvb-t/de-Mecklenburg-Vorpommern
+++ b/util/scan/dvb-t/de-Mecklenburg-Vorpommern
@@ -2,11 +2,11 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste, NDR MVP, RBB, MDR/NDR SH
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, NDR MVP, RBB, MDR/NDR SH
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: Das Erste, NDR MVP, RBB, MDR/NDR SH
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: Das Erste, NDR MVP, RBB, MDR/NDR SH
-T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 738000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH54: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
diff --git a/util/scan/dvb-t/de-Niedersachsen b/util/scan/dvb-t/de-Niedersachsen
index 7066933..636c1ec 100644
--- a/util/scan/dvb-t/de-Niedersachsen
+++ b/util/scan/dvb-t/de-Niedersachsen
@@ -5,21 +5,22 @@ T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: NDR NDS, WDR/NDR SH, MDR/NDR
T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: Das Erste (RB), RB TV (NDR NDS), arte, Phoenix
# CH22: Das Erste, arte, Phoenix, EinsExtra
# CH22: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: RTL, RTL II, Super RTL, VOX
- # CH24: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsExtra
+T 522000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH27: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: Tele 5, NICK / Comedy Central, Eurosport, MONA/DMAX
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 562000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH32: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 602000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH37: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
-T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 610000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH38: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 634000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH41: Das Erste, arte, Phoenix, EinsExtra
T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: RTL, RTL II, Super RTL, VOX
- # CH42: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH42: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 650000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH43: Das Erste, arte, Phoenix, EinsExtra
# CH43: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: Pro7, Sat.1, Kabel1, N24
@@ -29,12 +30,10 @@ T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, Ei
T 690000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH48: Das Erste, arte, Phoenix, EinsExtra
T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Pro7, Sat.1, Kabel1, N24
T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: Das Erste, arte, Phoenix, EinsExtra
-T 714000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH51: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Das Erste, arte, Phoenix, EinsExtra
T 754000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH56: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 770000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH58: NDR NDS, WDR/NDR SH, MDR/NDR MVP, HR/NDR HH
T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Das Erste, arte, Phoenix, EinsExtra
- # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, Comedy Central, Eurosport, MONA/DMAX
- # CH60: Tele 5, NICK/Comedy Central, Eurosport, MONA/DMAX
+ # CH59: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Tele 5, NICK / Comedy Central, Eurosport, MONA/DMAX
T 826000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH65: Das Erste, arte, Phoenix, EinsExtra
diff --git a/util/scan/dvb-t/de-Nordrhein-Westfalen b/util/scan/dvb-t/de-Nordrhein-Westfalen
index 4541df7..ec768a3 100644
--- a/util/scan/dvb-t/de-Nordrhein-Westfalen
+++ b/util/scan/dvb-t/de-Nordrhein-Westfalen
@@ -5,13 +5,13 @@ T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, Ei
T 482000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH22: WDR-Wuppertal, NDR/WDR-Düsseldorf, MDR, SWR
T 506000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH25: WDR-Dortmund, NDR/WDR-Essen, MDR, SWR
T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsFestival
- # CH26: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+ # CH26: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 522000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH27: WDR-Siegen, NDR, MDR, SWR
T 538000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH29: RTL, RTL II, Super RTL, VOX
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 554000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH31: WDR-Bielefeld, NDR/WDR-Siegen, MDR, SWR
-T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: CNN, Eurosport, Tele5, VIVA
T 602000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH37: WDR-Aachen, NDR/WDR-Köln, MDR, SWR
T 666000000 8MHz 1/2 NONE QAM64 8k 1/4 NONE # CH45: WDR-Münster, NDR/WDR-Dortmund, MDR, SWR
@@ -23,5 +23,5 @@ T 722000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH52: CNN, Eurosport, Tele5, VIVA
T 730000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH53: Pro7, Sat.1, Kabel1, N24
T 746000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH55: Pro7, Sat.1, Kabel1, N24
T 762000000 8MHz 2/3 NONE QAM16 8k 1/8 NONE # CH57: WDR-Essen, NDR/WDR-Dortmund, MDR, SWR
-T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsFestival
diff --git a/util/scan/dvb-t/de-Rheinland-Pfalz b/util/scan/dvb-t/de-Rheinland-Pfalz
index bf57d4d..a7d1d98 100644
--- a/util/scan/dvb-t/de-Rheinland-Pfalz
+++ b/util/scan/dvb-t/de-Rheinland-Pfalz
@@ -1,8 +1,8 @@
# DVB-T Rheinland-Pfalz
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: SWR-RP, BR, hr, WDR
T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
T 674000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH46: Das Erste, arte, Phoenix, EinsPlus
diff --git a/util/scan/dvb-t/de-Saarland b/util/scan/dvb-t/de-Saarland
index 330075b..049ae71 100644
--- a/util/scan/dvb-t/de-Saarland
+++ b/util/scan/dvb-t/de-Saarland
@@ -1,7 +1,7 @@
# DVB-T Saarland
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 642000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH42: Das Erste, SR Fernsehen, arte, Phoenix
T 658000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH44: SWR-RP, BR, hr, WDR
-T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: SaarTV, Tele 5, QVC, BibelTV
+T 698000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH49: Tele 5, QVC, Bibel.TV, freie Kapazität
diff --git a/util/scan/dvb-t/de-Sachsen b/util/scan/dvb-t/de-Sachsen
index 42e01eb..b3fcffd 100644
--- a/util/scan/dvb-t/de-Sachsen
+++ b/util/scan/dvb-t/de-Sachsen
@@ -2,11 +2,12 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 205500000 7MHz 2/3 NONE QAM64 8k 1/16 NONE # CH09: MDR-SN, rbb, BR, WDR
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-SN, rbb, BR, WDR
+T 530000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH28: RTL, RTL II, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: MDR-SN, rbb, BR, WDR
T 562000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH32: MDR-SN, rbb, BR, WDR
-T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 594000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH36: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH39: Das Erste, arte, Phoenix, EinsFestival
diff --git a/util/scan/dvb-t/de-Sachsen-Anhalt b/util/scan/dvb-t/de-Sachsen-Anhalt
index ee59498..d8582f2 100644
--- a/util/scan/dvb-t/de-Sachsen-Anhalt
+++ b/util/scan/dvb-t/de-Sachsen-Anhalt
@@ -1,11 +1,12 @@
# DVB-T Sachsen-Anhalt
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 498000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH24: Das Erste, arte, Phoenix, EinsFestival
+T 530000000 8MHz 3/4 NONE QAM16 8k 1/8 NONE # CH28: RTL, RTL II, Super RTL, VOX, RTL Crime, Passion [Sendenorm: MPEG-4]
T 538000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH29: Das Erste, arte, Phoenix, EinsFestival
-T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 578000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH34: MDR-ST, rbb, NDR, WDR
T 586000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH35: MDR-ST, rbb, NDR, WDR
T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH38: MDR-ST, rbb, NDR, WDR
diff --git a/util/scan/dvb-t/de-Schleswig-Holstein b/util/scan/dvb-t/de-Schleswig-Holstein
index 7b544d6..18728e1 100644
--- a/util/scan/dvb-t/de-Schleswig-Holstein
+++ b/util/scan/dvb-t/de-Schleswig-Holstein
@@ -1,18 +1,18 @@
# DVB-T Schleswig-Holstein
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
-T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+T 474000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH21: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 490000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH23: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
+T 498000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH24: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
+T 514000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH26: Das Erste, arte, Phoenix, EinsExtra
T 530000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH28: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
T 546000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH30: Pro7, Sat.1, Kabel1, N24
-T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 554000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH31: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 570000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH33: Das Erste, arte, Phoenix, EinsExtra
T 586000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH35: Pro7, Sat.1, Kabel1, N24
T 618000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH39: NDR SH, WDR/NDR NDS, MDR/NDR MVP, BR/NDR HH
T 626000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH40: RTL, RTL II, Super RTL, VOX
T 666000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH45: RTL, RTL II, Super RTL, VOX
T 682000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH47: Das Erste, arte, Phoenix, EinsExtra
-T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Neun live, Tele 5, Eurosport, MONA/DMAX
-T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Neun live, Tele 5, Eurosport, MONA/DMAX
-T 786000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH60: Das Erste, arte, Phoenix, EinsExtra
+T 762000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH57: Neun live, Tele 5, Eurosport, Bibel.TV
+T 778000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH59: Neun live, Tele 5, Eurosport, Bibel.TV
diff --git a/util/scan/dvb-t/de-Thueringen b/util/scan/dvb-t/de-Thueringen
index c159ea4..94bbf2c 100644
--- a/util/scan/dvb-t/de-Thueringen
+++ b/util/scan/dvb-t/de-Thueringen
@@ -2,9 +2,9 @@
# Created from http://www.ueberallfernsehen.de/data/senderliste.pdf
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 474000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH21: Das Erste, arte, Phoenix, EinsFestival
-T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 482000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH22: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 506000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH25: Das Erste, arte, Phoenix, EinsFestival
T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH27: MDR-TH, rbb, hr, BR
T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH48: MDR-TH, rbb, hr, BR
-T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFdokukanal, ZDFinfokanal
+T 706000000 8MHz 2/3 NONE QAM16 8k 1/4 NONE # CH50: ZDF, 3sat, KiKa / ZDFneo, ZDFinfokanal
T 730000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # CH53: Das Erste, arte, Phoenix, EinsFestival
diff --git a/util/scan/dvb-t/es-Albacete b/util/scan/dvb-t/es-Albacete
index 419156b..26b1e92 100644
--- a/util/scan/dvb-t/es-Albacete
+++ b/util/scan/dvb-t/es-Albacete
@@ -1,8 +1,10 @@
-# Spain, Albacete
+# Spain, Albacete - Update 2009/12/20 (Freud)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 59: La Primera, La 2, Canal 24H, Clan/TVE 50, RNE1, RNE Clásica, RNE 3
-T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: CLMTV
-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo, Veo 2, Net TV, Teledeporte
-T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, La Sexta 1
-T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, Telecinco Sport, Telecinco Estrellas, Fly Music
-T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena Neox, Antena Nova, La Sexta 2
+T 618000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 39: La Regional, AB TeVe/TVCM, CRN, La Tribuna TV
+T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 47: CNC, Vision6, ABTeVe
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 59: La 1, La 2, 24H, Clan, RNE1, RNE Clásica, RNE 3
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: CMT, CMT2, RCM
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Veo7, Sony TV en Veo, Tienda en Veo, Intereconomía, Teledeporte, Radio Intereconomía, Radio Marca, esRadio, Vaughan Radio
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: Cuatro, CNN+, 40 Latino, Canal Club, La Sexta, SER, 40 Principales, Cadena Dial
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, La Siete, FDF, CincoShop, Disney Channel, Punto Radio
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: Antena 3, Antena.Neox, Antena.Nova, Gol Televisión, Onda Cero, Europa FM, Onda Melodía
diff --git a/util/scan/dvb-t/es-Alfabia b/util/scan/dvb-t/es-Alfabia
index dc2956c..a7e1a5a 100644
--- a/util/scan/dvb-t/es-Alfabia
+++ b/util/scan/dvb-t/es-Alfabia
@@ -1,5 +1,6 @@
# DVB-T Alfabia, Mallorca, Balearic Islands, Spain.
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 602000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # TVM, Canal4, OnaMallorca Radio
T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.63: 24h, 50 aniv., ClanTV, La 2, TVE1; RNE 1, RNE 3, RNE C; Digitext, EPG, Lanzadera.
T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.65: IB3, Aprenda Ingles TV
T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # C.66: NetTV, Teledeporte, VeoTV1, VeoTV2.
diff --git a/util/scan/dvb-t/es-BaixoMinho b/util/scan/dvb-t/es-BaixoMinho
new file mode 100644
index 0000000..6f6fde4
--- /dev/null
+++ b/util/scan/dvb-t/es-BaixoMinho
@@ -0,0 +1,16 @@
+# file automatically generated by w_scan
+# (http://wirbel.htpc-forum.de/w_scan/index2.html)
+#! <w_scan> 20090528 1 0 OFDM ES </w_scan>
+#------------------------------------------------------------------------------
+# location and provider: Baixo Minho, Pontevedra (Spain)
+# date (yyyy-mm-dd) : 2009-07-11
+# provided by (opt) : neonmann@gmail.com
+#
+# T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [# comment]
+#------------------------------------------------------------------------------
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # SFN
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # SFN
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # RAR Pontevedra
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # RGE GALICIA
diff --git a/util/scan/dvb-t/es-Collserola b/util/scan/dvb-t/es-Collserola
index bec8c8b..395bd16 100644
--- a/util/scan/dvb-t/es-Collserola
+++ b/util/scan/dvb-t/es-Collserola
@@ -1,10 +1,12 @@
# DVB-T Collserola (Barcelona)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c26: BTV
-T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c33: CityTV
-T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c61: TV3, K3/33, 3/24, 300
+T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c26: BTV, TV Badalona, TV L'Hospitalet, TV del Besòs, COM Ràdio, Ràdio Ciutat Badalona, Ràdio L'Hospitalet
+T 570000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c33: 8TV, Barça TV, EDC3, 105TV, RAC 1, RAC 105
+T 650000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c43: TV3HD, 3/24, Canal 9, IB3, Catalunya Música, iCat FM
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c48: Urbe TV, Canal Català, 25 TV, Localia, Ona FM, Onda Rambla, Sensació Ràdio
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c61: TV3, 33, 3/24, K3/300, Catalunya Ràdio, Catalunya Informació
T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c64: TVE1, TVE2, TVE 24H, Clan/TVE 50 Años, RNE1, RNEC, RNE3
-T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c66: Veo TV, Veo2, Net TV, Teledeporte
-T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c67: Cuatro, CNN+, 40 Latino, La Sexta1
-T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c68: Telecino, T5 Sport, T5 Estrellas, Fly Music
-T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c69: Antena 3, Antena.Neox, Antena.Nova, La Sexta2
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c66: Veo7, Sony TV en Veo, Tienda en Veo, Intereconomía, Teledeporte, Radio Intereconomía, Radio Marca
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c67: Cuatro, CNN+, 40 Latino, La Sexta, Ser, 40 Principales, Cadena Dial
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c68: Telecino, La Siete, FDF, CincoShop, Disney Channel, Punto Radio
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE #c69: Antena 3, Antena.Neox, Antena.Nova, Hogar 10, Onda Cero, Europa FM, Onda Melodía
diff --git a/util/scan/dvb-t/es-Granada b/util/scan/dvb-t/es-Granada
new file mode 100644
index 0000000..05847f1
--- /dev/null
+++ b/util/scan/dvb-t/es-Granada
@@ -0,0 +1,8 @@
+# Spain, Granada
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 762000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/es-Huesca b/util/scan/dvb-t/es-Huesca
new file mode 100644
index 0000000..8079b83
--- /dev/null
+++ b/util/scan/dvb-t/es-Huesca
@@ -0,0 +1,8 @@
+# DVB-T Huesca (Aragón) [Spain] [es-Huesca]
+# Generated by Vicente Hernando Ara <bizenton@gmail.com>
+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # Canal 57: ARAGON TV, ARAGON RADIO, ARAGON HD
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: La 1, La 2, 24h, Clan, RNE1, RNEC, RNE3
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Teledeporte, Canal Ingenieria, VEO7, SONY TV en VEO, Tienda en VEO, GUIDE PLUS+, Intereconomia, Radio Intereconomia, RADIO MARCA
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: laSexta, CUATRO, CNN+, 40 LATINO, PROMO, SER, 40 PRINCIPALES, CADENA DIAL
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, FDF, Telecinco 2, Disney Channel, Cincoshop
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, ONDA CERO, EUROPA FM, ONDA MELODÃA, HOGAR 10
diff --git a/util/scan/dvb-t/es-Muros-Noia b/util/scan/dvb-t/es-Muros-Noia
new file mode 100644
index 0000000..a02c31d
--- /dev/null
+++ b/util/scan/dvb-t/es-Muros-Noia
@@ -0,0 +1,9 @@
+# DVB-T Muros and Noia
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 522000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 27: Local Ribeira
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 61: RAR A Corunha
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: RGE Galicia
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: SFN 1
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: SFN 2
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: SFN 3
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: SFN 4
diff --git a/util/scan/dvb-t/es-Pamplona b/util/scan/dvb-t/es-Pamplona
new file mode 100644
index 0000000..4644b2d
--- /dev/null
+++ b/util/scan/dvb-t/es-Pamplona
@@ -0,0 +1,9 @@
+# DVB-T Pamplona
+# T freq bw fec_hi fec_lo mod transm-mode guard-interval hierarchy
+T 610000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 802000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/es-Santiago_de_Compostela b/util/scan/dvb-t/es-Santiago_de_Compostela
new file mode 100644
index 0000000..cf63e64
--- /dev/null
+++ b/util/scan/dvb-t/es-Santiago_de_Compostela
@@ -0,0 +1,9 @@
+# DVB-T Santiago de Compostela
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 490000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 23: Local Santiago
+T 626000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 40: RAR Santiago
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: RGE Galicia
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: SFN 1
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: SFN 2
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: SFN 3
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: SFN 4
diff --git a/util/scan/dvb-t/es-Vitoria-Gasteiz b/util/scan/dvb-t/es-Vitoria-Gasteiz
new file mode 100644
index 0000000..5d97413
--- /dev/null
+++ b/util/scan/dvb-t/es-Vitoria-Gasteiz
@@ -0,0 +1,8 @@
+# Channel names in use at 2009/07/12, in Channel 66 [fffe] is a scrambled channel.
+# In the generated *channels.conf file could be necesary to change Intereconomía, Radio Intereconomía, ONDA MELODÃA to Intereconomia, Radio Intereconomia, ONDA MELODIA for Totem to work well.
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 58: ETB1, ETB2, ETB3, ETBSAT, Euskadi Irratia, Gaztea, EiTB Irratia, Radio Euskadi, Radio Vitoria
+T 810000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 63: La 1, La 2, 24h, Clan, RNE1, RNEC, RNE3
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 66: Teledeporte, Canal Ingenieria, VEO7, SONY TV en VEO, Tienda en VEO, GUIDE PLUS+, Intereconomía, Radio Intereconomía, [fffe], RADIO MARCA
+T 842000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 67: laSexta, CUATRO, CNN+, 40 LATINO, CANAL CLUB, SER, 40 PRINCIPALES, CADENA DIAL
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 68: Telecinco, FDF, LaSiete, Disney Channel, Cincoshop
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE # Canal 69: ANTENA 3, ANTENA.NEOX, ANTENA.NOVA, ONDA CERO, EUROPA FM, ONDA MELODÃA, HOGAR 10
diff --git a/util/scan/dvb-t/fi-Smedsbole b/util/scan/dvb-t/fi-Smedsbole
new file mode 100644
index 0000000..fa9bc03
--- /dev/null
+++ b/util/scan/dvb-t/fi-Smedsbole
@@ -0,0 +1,13 @@
+#------------------------------------------------------------------------------
+# file automatically generated by w_scan
+# (http://wirbel.htpc-forum.de/w_scan/index2.html)
+#! <w_scan> 20090808 2 0 OFDM FI </w_scan>
+#------------------------------------------------------------------------------
+# location and provider: Åland Smedsböle/Sund
+# date (yyyy-mm-dd) : 2009-12-23
+# provided by (opt) : k.hampf@gmail.com
+#
+# T[2] <freq> <bw> <fec_hi> <fec_lo> <mod> <tm> <guard> <hi> [# comment]
+#------------------------------------------------------------------------------
+T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Ã…land Network
+T 586000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE # Ã…land Network
diff --git a/util/scan/dvb-t/fr-Laval b/util/scan/dvb-t/fr-Laval
index 61c0aa0..d97f04c 100644
--- a/util/scan/dvb-t/fr-Laval
+++ b/util/scan/dvb-t/fr-Laval
@@ -12,14 +12,14 @@
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
#### Laval - MontRochard ####
#R1
-T 778000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 778166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R2
-T 610000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 610166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R3
-T 754000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 754166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R4
-T 794000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 794166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R5
-T 602000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 602166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
#R6
-T 802000000 8MHz AUTO NONE QAM64 8k AUTO NONE
+T 802166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/fr-Rochefort-sur-mer b/util/scan/dvb-t/fr-Rochefort-sur-mer
new file mode 100644
index 0000000..c32bc0d
--- /dev/null
+++ b/util/scan/dvb-t/fr-Rochefort-sur-mer
@@ -0,0 +1,14 @@
+# TNT à Rochefort (17)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+#multiplex 6 ( TF1 LCI Eurosport TF6 NRJ12 TMC )
+T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+
+#multiplex 4 ( M6 W9 NT1 Paris Première ARTE HD )
+T 738166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+
+#multiplex 1 ( France 2 France 3 France 5 ARTE LCP Chaîne locale ou France Ô )
+T 602166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+
+#multiplex 2 ( Direct 8 France 4 BFM TV Virgin 17 Gulli i>Télé )
+T 778167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/hr-All b/util/scan/dvb-t/hr-All
new file mode 100644
index 0000000..9a7223c
--- /dev/null
+++ b/util/scan/dvb-t/hr-All
@@ -0,0 +1,24 @@
+# Croatia, whole country
+# Created from http://www.hrt.hr/index.php?id=173&tx_ttnews[cat]=102&tx_ttnews[tt_news]=56725&tx_ttnews[backPid]=185&cHash=bdf5a53e91
+# and http://213.147.101.105/DVBT_MUXA_MUXB_Popis_odasiljackih_lokacija.html
+# and http://www.hrt.hr/index.php?id=173&tx_ttnews[cat]=102&tx_ttnews[tt_news]=7456&tx_ttnews[backPid]=185&cHash=d02ef00f9b
+# and http://www.oiv.hr/default.asp?ru=129&gl=200907100000002&sid=&jezik=0
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 490000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 530000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 546000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 570000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 570000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 594000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 618000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 642000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 658000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 666000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 682000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 690000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 714000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 730000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 738000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
+T 754000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 778000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/hr-Zagreb b/util/scan/dvb-t/hr-Zagreb
deleted file mode 100644
index b385c87..0000000
--- a/util/scan/dvb-t/hr-Zagreb
+++ /dev/null
@@ -1,3 +0,0 @@
-# DVB-T Hamburg
-# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 522000000 8MHz 3/4 NONE AUTO 8k 1/32 NONE # CH27:
diff --git a/util/scan/dvb-t/hu-Budapest b/util/scan/dvb-t/hu-Budapest
new file mode 100644
index 0000000..a697fda
--- /dev/null
+++ b/util/scan/dvb-t/hu-Budapest
@@ -0,0 +1,8 @@
+# Hungary / Budapest
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-55:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 746000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-62:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 802000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Debrecen b/util/scan/dvb-t/hu-Debrecen
new file mode 100644
index 0000000..29898d3
--- /dev/null
+++ b/util/scan/dvb-t/hu-Debrecen
@@ -0,0 +1,8 @@
+# Hungary / Debrecen
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-46:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 714000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-62:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 802000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Gyor b/util/scan/dvb-t/hu-Gyor
new file mode 100644
index 0000000..9650df5
--- /dev/null
+++ b/util/scan/dvb-t/hu-Gyor
@@ -0,0 +1,8 @@
+# Hungary / Gyor
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-42:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 642000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-61:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 794000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Kabhegy b/util/scan/dvb-t/hu-Kabhegy
new file mode 100644
index 0000000..7dfcecf
--- /dev/null
+++ b/util/scan/dvb-t/hu-Kabhegy
@@ -0,0 +1,8 @@
+# Hungary / Kabhegy
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# C.multiplex UHF-61:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 794000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# A2.multiplex UHF-64:
+# MTV-1 HD Sopron, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 818000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Kekes b/util/scan/dvb-t/hu-Kekes
new file mode 100644
index 0000000..76807df
--- /dev/null
+++ b/util/scan/dvb-t/hu-Kekes
@@ -0,0 +1,8 @@
+# Hungary / Kekes
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-44:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 658000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-69:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 858000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Kiskoros b/util/scan/dvb-t/hu-Kiskoros
new file mode 100644
index 0000000..edf3d90
--- /dev/null
+++ b/util/scan/dvb-t/hu-Kiskoros
@@ -0,0 +1,8 @@
+# Hungary / Kiskoros
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-45:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 666000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-68:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar b/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar
new file mode 100644
index 0000000..35f23d9
--- /dev/null
+++ b/util/scan/dvb-t/hu-Nagykanizsa-Ujudvar
@@ -0,0 +1,8 @@
+# Hungary / Nagykanizsa / Ujudvar
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-24:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 498000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-65:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Pecs b/util/scan/dvb-t/hu-Pecs
new file mode 100644
index 0000000..caf7643
--- /dev/null
+++ b/util/scan/dvb-t/hu-Pecs
@@ -0,0 +1,8 @@
+# Hungary / Pecs
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-52:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 722000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-67:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 842000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Szeged b/util/scan/dvb-t/hu-Szeged
new file mode 100644
index 0000000..23f1c05
--- /dev/null
+++ b/util/scan/dvb-t/hu-Szeged
@@ -0,0 +1,8 @@
+# Hungary / Szeged
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-60:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-65:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Szentes b/util/scan/dvb-t/hu-Szentes
new file mode 100644
index 0000000..41b9225
--- /dev/null
+++ b/util/scan/dvb-t/hu-Szentes
@@ -0,0 +1,8 @@
+# Hungary / Szentes
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A3.multiplex UHF-60:
+# MTV-1 HD Szeged, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 786000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-65:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 826000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Tokaj b/util/scan/dvb-t/hu-Tokaj
new file mode 100644
index 0000000..6ef172a
--- /dev/null
+++ b/util/scan/dvb-t/hu-Tokaj
@@ -0,0 +1,8 @@
+# Hungary / Tokaj
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-68:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-63:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 810000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Uzd b/util/scan/dvb-t/hu-Uzd
new file mode 100644
index 0000000..c2d270e
--- /dev/null
+++ b/util/scan/dvb-t/hu-Uzd
@@ -0,0 +1,8 @@
+# Hungary / Uzd
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-52:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 722000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-67:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 842000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/hu-Vasvar-Hegyhatsal b/util/scan/dvb-t/hu-Vasvar-Hegyhatsal
new file mode 100644
index 0000000..4190e4d
--- /dev/null
+++ b/util/scan/dvb-t/hu-Vasvar-Hegyhatsal
@@ -0,0 +1,8 @@
+# Hungary / Vasvar / Hegyhatsal
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# A1.multiplex UHF-58:
+# MTV-1 HD Budapest, MTV-2 HD, ATV (Hungary), Hir TV, MR-1 Kossuth R, MR-2 Petofi R, MR-3 Bartok R, Katolikus R
+T 770000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
+# C.multiplex UHF-68:
+# Duna TV HD, Duna-II. Autonomia, RTL Klub, TV-2 (Hungary), Euronews
+T 850000000 8MHz 3/4 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/it-Montevergine b/util/scan/dvb-t/it-Montevergine
new file mode 100644
index 0000000..0d7c30d
--- /dev/null
+++ b/util/scan/dvb-t/it-Montevergine
@@ -0,0 +1,18 @@
+# DVB-T Montevergine (Avellino) 83100
+# 12/12/2009 by Antonio Galasso anto1714@libero.it
+# (ricordati di mettere il lettore in posizione stop orima di iniziare la scansione dei canali)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+# C-MUX
+T 177500000 7MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 482000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 498000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 514000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 522000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 546000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 554000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 594000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 682000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
+T 698000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/lt-All b/util/scan/dvb-t/lt-All
new file mode 100644
index 0000000..daf2da2
--- /dev/null
+++ b/util/scan/dvb-t/lt-All
@@ -0,0 +1,39 @@
+# Lithuania, whole country
+# Created from http://www.skaitmenine.lt/lt/skaitmenine_tv_lietuvoje/antzemine_dvb_t.html
+# Created by baruse@gmail.com
+
+# LRTC I tinklas
+T 482000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 22
+T 514000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 26
+T 618000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 39
+T 658000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 44
+T 682000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 47
+T 762000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 57
+T 770000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 58
+T 786000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 60
+T 794000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 61
+
+# LRTC II tinklas
+T 570000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 33
+T 610000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 38
+T 690000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 48
+T 738000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 54
+T 802000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 62
+T 810000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 63
+T 818000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 64
+
+# TEO LT I tinklas
+T 594000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 36
+T 706000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 50
+T 778000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 59
+T 826000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 65
+
+# TEO LT II tinklas
+T 474000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 21
+T 546000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 30
+T 730000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 53
+#T 786000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 60
+
+# Vilniui bonusas
+T 602000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 37
+#T 730000000 8MHz AUTO NONE QAM64 8k 1/16 NONE # kanalas 53
diff --git a/util/scan/dvb-t/ro-Bucharest b/util/scan/dvb-t/ro-Bucharest
new file mode 100644
index 0000000..fac0ca9
--- /dev/null
+++ b/util/scan/dvb-t/ro-Bucharest
@@ -0,0 +1,5 @@
+# Romania / Bucharest
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 546000000 8MHz 2/3 NONE QAM16 8k 1/16 NONE
+T 738000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # SRTV
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/16 NONE # SNR DVB-T
diff --git a/util/scan/dvb-t/se-Ornskoldsvik_As b/util/scan/dvb-t/se-Ornskoldsvik_As
index e793d70..8fa6edb 100644
--- a/util/scan/dvb-t/se-Ornskoldsvik_As
+++ b/util/scan/dvb-t/se-Ornskoldsvik_As
@@ -4,3 +4,4 @@ T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 474000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 578000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 506000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 642000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/se-Skelleftea b/util/scan/dvb-t/se-Skelleftea
index 818beda..d831d9e 100644
--- a/util/scan/dvb-t/se-Skelleftea
+++ b/util/scan/dvb-t/se-Skelleftea
@@ -4,3 +4,4 @@ T 490000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 514000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
T 650000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+T 698000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
diff --git a/util/scan/dvb-t/sk-BanskaBystrica b/util/scan/dvb-t/sk-BanskaBystrica
index 48d3170..80d73a2 100644
--- a/util/scan/dvb-t/sk-BanskaBystrica
+++ b/util/scan/dvb-t/sk-BanskaBystrica
@@ -1,4 +1,5 @@
# DVB-T Banska Bystrica (Banska Bystrica, Slovak Republic)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 778000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+# on channel 65
+T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Bardejov b/util/scan/dvb-t/sk-Bardejov
new file mode 100644
index 0000000..95daa9e
--- /dev/null
+++ b/util/scan/dvb-t/sk-Bardejov
@@ -0,0 +1,5 @@
+# DVB-T Bardejov (Bardejov, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 62
+T 802000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Bratislava b/util/scan/dvb-t/sk-Bratislava
index 4924be4..57683a4 100644
--- a/util/scan/dvb-t/sk-Bratislava
+++ b/util/scan/dvb-t/sk-Bratislava
@@ -1,4 +1,5 @@
# DVB-T Bratislava (Bratislava, Slovak Republic)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 834000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+# on channel 66
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Kosice b/util/scan/dvb-t/sk-Kosice
index 46f7a7e..9046f28 100644
--- a/util/scan/dvb-t/sk-Kosice
+++ b/util/scan/dvb-t/sk-Kosice
@@ -1,4 +1,5 @@
# DVB-T Kosice (Kosice, Slovak Republic)
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 658000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
+# on channel 64
+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Michalovce b/util/scan/dvb-t/sk-Michalovce
new file mode 100644
index 0000000..f91b298
--- /dev/null
+++ b/util/scan/dvb-t/sk-Michalovce
@@ -0,0 +1,5 @@
+# DVB-T Michalovce (Michalovce, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 64
+T 818000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Namestovo b/util/scan/dvb-t/sk-Namestovo
new file mode 100644
index 0000000..da916ee
--- /dev/null
+++ b/util/scan/dvb-t/sk-Namestovo
@@ -0,0 +1,5 @@
+# DVB-T Namestovo (Namestovo, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 68
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Poprad b/util/scan/dvb-t/sk-Poprad
new file mode 100644
index 0000000..74040ff
--- /dev/null
+++ b/util/scan/dvb-t/sk-Poprad
@@ -0,0 +1,5 @@
+# DVB-T Poprad (Poprad, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 66
+T 834000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-RimavskaSobota b/util/scan/dvb-t/sk-RimavskaSobota
new file mode 100644
index 0000000..6dfe7af
--- /dev/null
+++ b/util/scan/dvb-t/sk-RimavskaSobota
@@ -0,0 +1,5 @@
+# DVB-T Rimavska Sobota (Rimavska Sobota, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 61
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Trencin b/util/scan/dvb-t/sk-Trencin
new file mode 100644
index 0000000..9a0d7c1
--- /dev/null
+++ b/util/scan/dvb-t/sk-Trencin
@@ -0,0 +1,5 @@
+# DVB-T Trencin (Trencin, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 69
+T 858000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-VelkyKrtis b/util/scan/dvb-t/sk-VelkyKrtis
new file mode 100644
index 0000000..90d186a
--- /dev/null
+++ b/util/scan/dvb-t/sk-VelkyKrtis
@@ -0,0 +1,5 @@
+# DVB-T Velky Krtis (Velky Krtis, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 65
+T 826000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/sk-Zilina b/util/scan/dvb-t/sk-Zilina
new file mode 100644
index 0000000..b1629b2
--- /dev/null
+++ b/util/scan/dvb-t/sk-Zilina
@@ -0,0 +1,5 @@
+# DVB-T Zilina (Zilina, Slovak Republic)
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+
+# on channel 68
+T 850000000 8MHz 2/3 NONE QAM64 8k 1/4 NONE
diff --git a/util/scan/dvb-t/uk-Redruth b/util/scan/dvb-t/uk-Redruth
index e8285a5..8f15fa0 100644
--- a/util/scan/dvb-t/uk-Redruth
+++ b/util/scan/dvb-t/uk-Redruth
@@ -2,9 +2,12 @@
# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 618000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 642167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 666167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 697833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 474167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 497833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 506167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 521833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 634167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
T 650167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 705833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 658167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 690000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 714000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/uk-StocklandHill b/util/scan/dvb-t/uk-StocklandHill
index c0d3c3e..f89a86d 100644
--- a/util/scan/dvb-t/uk-StocklandHill
+++ b/util/scan/dvb-t/uk-StocklandHill
@@ -1,10 +1,9 @@
# UK, Stockland Hill
-# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
-# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+# http://www.ukfree.tv/txdetail.php?a=ST222014
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 481833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 529833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 505833000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 561833000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 578167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 514167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # PSB1
+T 490167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # PSB2
+#T 538167000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # PSB3 (DVB-T2)
+T 505833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # COM4
+T 481833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # COM5
+T 529833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE # COM6
diff --git a/util/scan/dvb-t/uk-Storeton b/util/scan/dvb-t/uk-Storeton
index 1ca0841..8580aaa 100644
--- a/util/scan/dvb-t/uk-Storeton
+++ b/util/scan/dvb-t/uk-Storeton
@@ -2,9 +2,12 @@
# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 546167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 578167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 490167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 514167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 538167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 570167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 490000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 506000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 514000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 530000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 538000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 546000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 730000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 762000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 786000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/uk-WinterHill b/util/scan/dvb-t/uk-WinterHill
index 3ea6abd..635f227 100644
--- a/util/scan/dvb-t/uk-WinterHill
+++ b/util/scan/dvb-t/uk-WinterHill
@@ -1,13 +1,9 @@
# UK, Winter Hill
-# Auto-generated from http://www.dtg.org.uk/retailer/dtt_channels.html
-# and http://www.ofcom.org.uk/static/reception_advice/index.asp.html
+# Populated by J. Hornsby from a scan of active multiplexes
+# UK, Winter Hill B Ceased broadcasting on 02 December 2009
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
-T 754167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 834167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 850167000 8MHz 2/3 NONE QAM64 2k 1/32 NONE
-T 842167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 786167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 810167000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-# UK, Winter Hill B
-T 650000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
-T 626000000 8MHz 3/4 NONE QAM16 2k 1/32 NONE
+T 746000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 770000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 778000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 794000000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
+T 801833000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
diff --git a/util/scan/dvb-t/vn-Hanoi b/util/scan/dvb-t/vn-Hanoi
new file mode 100644
index 0000000..451a07f
--- /dev/null
+++ b/util/scan/dvb-t/vn-Hanoi
@@ -0,0 +1,5 @@
+# Hanoi - Vietnam - DVB-T by VTC
+# contributed by Pham Thanh Nam <phamthanhnam.ptn@gmail.com>
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 514000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
+T 578000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
diff --git a/util/scan/dvb-t/vn-Thaibinh b/util/scan/dvb-t/vn-Thaibinh
new file mode 100644
index 0000000..85f8098
--- /dev/null
+++ b/util/scan/dvb-t/vn-Thaibinh
@@ -0,0 +1,5 @@
+# Thaibinh - Vietnam - DVB-T by VTC
+# contributed by Pham Thanh Nam <phamthanhnam.ptn@gmail.com>
+# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
+T 626000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
+T 634000000 8MHz 3/4 NONE QAM64 2k 1/32 NONE
diff --git a/util/scan/scan.c b/util/scan/scan.c
index 1b7a3e5..3058bdb 100644
--- a/util/scan/scan.c
+++ b/util/scan/scan.c
@@ -236,6 +236,17 @@ static struct transponder *find_transponder(uint32_t frequency)
static void copy_transponder(struct transponder *d, struct transponder *s)
{
+ struct list_head *pos;
+ struct service *service;
+
+ if (d->transport_stream_id != s->transport_stream_id) {
+ /* propagate change to any already allocated services */
+ list_for_each(pos, &d->services) {
+ service = list_entry(pos, struct service, list);
+ service->transport_stream_id = s->transport_stream_id;
+ }
+ }
+
d->network_id = s->network_id;
d->original_network_id = s->original_network_id;
d->transport_stream_id = s->transport_stream_id;
diff --git a/util/szap/Makefile b/util/szap/Makefile
index b341c74..48d7149 100644
--- a/util/szap/Makefile
+++ b/util/szap/Makefile
@@ -1,6 +1,6 @@
# Makefile for linuxtv.org dvb-apps/util/szap
-objects = lnb.o
+objects = lnb.o util.o
binaries = azap \
czap \
diff --git a/util/szap/azap.c b/util/szap/azap.c
index 5bd7f33..93addf8 100644
--- a/util/szap/azap.c
+++ b/util/szap/azap.c
@@ -13,6 +13,8 @@
#include <linux/dvb/frontend.h>
#include <linux/dvb/dmx.h>
+#include "util.h"
+
static char FRONTEND_DEV [80];
static char DEMUX_DEV [80];
@@ -209,31 +211,6 @@ int parse(const char *fname, const char *channel,
static
-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid <= 0 || pid >= 0x1fff)
- return 0;
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
- PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
- type == DMX_PES_AUDIO ? "Audio" :
- type == DMX_PES_VIDEO ? "Video" : "??");
- return -1;
- }
-
- return 0;
-}
-
-
-static
int setup_frontend (int fe_fd, struct dvb_frontend_parameters *frontend)
{
struct dvb_frontend_info fe_info;
diff --git a/util/szap/czap.c b/util/szap/czap.c
index 469df56..e04ed4b 100644
--- a/util/szap/czap.c
+++ b/util/szap/czap.c
@@ -13,6 +13,8 @@
#include <linux/dvb/frontend.h>
#include <linux/dvb/dmx.h>
+#include "util.h"
+
static char FRONTEND_DEV [80];
static char DEMUX_DEV [80];
@@ -118,7 +120,7 @@ char *find_channel(FILE *f, int list_channels, int *chan_no, const char *channel
int parse(const char *fname, int list_channels, int chan_no, const char *channel,
- struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
+ struct dvb_frontend_parameters *frontend, int *vpid, int *apid, int *sid)
{
FILE *f;
char *chan;
@@ -141,10 +143,10 @@ int parse(const char *fname, int list_channels, int chan_no, const char *channel
}
printf("%3d %s", chan_no, chan);
- if ((sscanf(chan, "%a[^:]:%d:%a[^:]:%d:%a[^:]:%a[^:]:%d:%d\n",
+ if ((sscanf(chan, "%m[^:]:%d:%m[^:]:%d:%m[^:]:%m[^:]:%d:%d:%d\n",
&name, &frontend->frequency,
&inv, &frontend->u.qam.symbol_rate,
- &fec, &mod, vpid, apid) != 8)
+ &fec, &mod, vpid, apid, sid) != 9)
|| !name || !inv || !fec | !mod) {
ERROR("cannot parse service data");
return -3;
@@ -165,10 +167,10 @@ int parse(const char *fname, int list_channels, int chan_no, const char *channel
ERROR("modulation field syntax '%s'", mod);
return -6;
}
- printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x\n",
+ printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x, s %#x \n",
chan_no, name, frontend->frequency, frontend->u.qam.symbol_rate,
frontend->inversion, frontend->u.qam.fec_inner,
- frontend->u.qam.modulation, *vpid, *apid);
+ frontend->u.qam.modulation, *vpid, *apid, *sid);
free(name);
free(inv);
free(fec);
@@ -178,31 +180,6 @@ int parse(const char *fname, int list_channels, int chan_no, const char *channel
}
-
-static
-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid <= 0 || pid >= 0x1fff)
- return 0;
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
- PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
- type == DMX_PES_AUDIO ? "Audio" :
- type == DMX_PES_VIDEO ? "Video" : "??");
- return -1;
- }
-
- return 0;
-}
-
static
int setup_frontend(int fe_fd, struct dvb_frontend_parameters *frontend)
{
@@ -264,9 +241,20 @@ int check_frontend (int fe_fd, int human_readable)
}
-static const char *usage = "\nusage: %s [-a adapter_num] [-f frontend_id] [-d demux_id] [-c conf_file] [ -H ] {<channel name>| -n channel_num} [-x]\n"
- " or: %s [-c conf_file] -l\n\n";
-
+static const char *usage =
+ "\nusage: %s [options] -l\n"
+ " list known channels\n"
+ " %s [options] {-n channel-number|channel_name}\n"
+ " zap to channel via number or full name (case insensitive)\n"
+ " -a number : use given adapter (default 0)\n"
+ " -f number : use given frontend (default 0)\n"
+ " -d number : use given demux (default 0)\n"
+ " -c file : read channels list from 'file'\n"
+ " -x : exit after tuning\n"
+ " -H : human readable output\n"
+ " -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
+ " -p : add pat and pmt to TS recording (implies -r)\n"
+;
int main(int argc, char **argv)
{
@@ -275,12 +263,12 @@ int main(int argc, char **argv)
char *confname = NULL;
char *channel = NULL;
int adapter = 0, frontend = 0, demux = 0, dvr = 0;
- int vpid, apid;
- int frontend_fd, video_fd, audio_fd;
+ int vpid, apid, sid, pmtpid = 0;
+ int frontend_fd, video_fd, audio_fd, pat_fd, pmt_fd;
int opt, list_channels = 0, chan_no = 0;
- int human_readable = 0;
+ int human_readable = 0, rec_psi = 0;
- while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x")) != -1) {
+ while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x:p")) != -1) {
switch (opt) {
case 'a':
adapter = strtoul(optarg, NULL, 0);
@@ -300,6 +288,9 @@ int main(int argc, char **argv)
case 'n':
chan_no = strtoul(optarg, NULL, 0);
break;
+ case 'p':
+ rec_psi = 1;
+ break;
case 'x':
exit_after_tuning = 1;
break;
@@ -352,7 +343,7 @@ int main(int argc, char **argv)
memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
- if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid))
+ if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid, &sid))
return -1;
if (list_channels)
return 0;
@@ -365,6 +356,28 @@ int main(int argc, char **argv)
if (setup_frontend(frontend_fd, &frontend_param) < 0)
return -1;
+ if (rec_psi) {
+ pmtpid = get_pmt_pid(DEMUX_DEV, sid);
+ if (pmtpid <= 0) {
+ fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
+ return -1;
+ }
+
+ if ((pat_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pat demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+
+ if ((pmt_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pmt demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+ }
+
if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
PERROR("failed opening '%s'", DEMUX_DEV);
return -1;
@@ -383,6 +396,8 @@ int main(int argc, char **argv)
check_frontend (frontend_fd, human_readable);
+ close (pat_fd);
+ close (pmt_fd);
close (audio_fd);
close (video_fd);
close (frontend_fd);
diff --git a/util/szap/szap.c b/util/szap/szap.c
index ed1aa51..78da3a6 100644
--- a/util/szap/szap.c
+++ b/util/szap/szap.c
@@ -48,6 +48,7 @@
#include <linux/dvb/dmx.h>
#include <linux/dvb/audio.h>
#include "lnb.h"
+#include "util.h"
#ifndef TRUE
#define TRUE (1==1)
@@ -92,94 +93,6 @@ static char *usage_str =
" -p : add pat and pmt to TS recording (implies -r)\n"
" or -n numbers for zapping\n";
-static int set_demux(int dmxfd, int pid, int pes_type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */
- return TRUE;
-
- if (dvr) {
- int buffersize = 64 * 1024;
- if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1)
- perror("DMX_SET_BUFFER_SIZE failed");
- }
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = pes_type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
- fprintf(stderr, "DMX_SET_PES_FILTER failed "
- "(PID = 0x%04x): %d %m\n", pid, errno);
- return FALSE;
- }
-
- return TRUE;
-}
-
-int get_pmt_pid(char *dmxdev, int sid)
-{
- int patfd, count;
- int pmt_pid = 0;
- int patread = 0;
- int section_length;
- unsigned char buft[4096];
- unsigned char *buf = buft;
- struct dmx_sct_filter_params f;
-
- memset(&f, 0, sizeof(f));
- f.pid = 0;
- f.filter.filter[0] = 0x00;
- f.filter.mask[0] = 0xff;
- f.timeout = 0;
- f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
-
- if ((patfd = open(dmxdev, O_RDWR)) < 0) {
- perror("openening pat demux failed");
- return -1;
- }
-
- if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
- perror("ioctl DMX_SET_FILTER failed");
- close(patfd);
- return -1;
- }
-
- while (!patread){
- if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
- count = read(patfd, buf, sizeof(buft));
- if (count < 0) {
- perror("read_sections: read error");
- close(patfd);
- return -1;
- }
-
- section_length = ((buf[1] & 0x0f) << 8) | buf[2];
- if (count != section_length + 3)
- continue;
-
- buf += 8;
- section_length -= 8;
-
- patread = 1; /* assumes one section contains the whole pat */
- while (section_length > 0) {
- int service_id = (buf[0] << 8) | buf[1];
- if (service_id == sid) {
- pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
- section_length = 0;
- }
- buf += 4;
- section_length -= 4;
- }
- }
-
- close(patfd);
- return pmt_pid;
-}
-
struct diseqc_cmd {
struct dvb_diseqc_master_cmd cmd;
uint32_t wait;
@@ -390,10 +303,10 @@ int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux,
if (diseqc(fefd, sat_no, pol, hiband))
if (do_tune(fefd, ifreq, sr))
- if (set_demux(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
+ if (set_pesfilter(dmxfdv, vpid, DMX_PES_VIDEO, dvr))
if (audiofd >= 0)
(void)ioctl(audiofd, AUDIO_SET_BYPASS_MODE, bypass);
- if (set_demux(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
+ if (set_pesfilter(dmxfda, apid, DMX_PES_AUDIO, dvr)) {
if (rec_psi) {
pmtpid = get_pmt_pid(dmxdev, sid);
if (pmtpid < 0) {
@@ -403,8 +316,8 @@ int zap_to(unsigned int adapter, unsigned int frontend, unsigned int demux,
fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
result = FALSE;
}
- if (set_demux(patfd, 0, DMX_PES_OTHER, dvr))
- if (set_demux(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
+ if (set_pesfilter(patfd, 0, DMX_PES_OTHER, dvr))
+ if (set_pesfilter(pmtfd, pmtpid, DMX_PES_OTHER, dvr))
result = TRUE;
} else {
result = TRUE;
diff --git a/util/szap/tzap.c b/util/szap/tzap.c
index cd87bfa..b24bc2c 100644
--- a/util/szap/tzap.c
+++ b/util/szap/tzap.c
@@ -35,6 +35,8 @@
#include <linux/dvb/frontend.h>
#include <linux/dvb/dmx.h>
+#include "util.h"
+
static char FRONTEND_DEV [80];
static char DEMUX_DEV [80];
static char DVR_DEV [80];
@@ -269,7 +271,8 @@ static int check_fec(fe_code_rate_t *fec)
int parse(const char *fname, const char *channel,
- struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
+ struct dvb_frontend_parameters *frontend, int *vpid, int *apid,
+ int *sid)
{
int fd;
int err;
@@ -343,7 +346,11 @@ int parse(const char *fname, const char *channel,
if ((err = try_parse_int(fd, apid, "Audio PID")))
return -13;
-
+
+ if ((err = try_parse_int(fd, sid, "Service ID")))
+ return -14;
+
+
close(fd);
return 0;
@@ -351,31 +358,6 @@ int parse(const char *fname, const char *channel,
static
-int set_pesfilter (int fd, int pid, dmx_pes_type_t type, int dvr)
-{
- struct dmx_pes_filter_params pesfilter;
-
- if (pid <= 0 || pid >= 0x1fff)
- return 0;
-
- pesfilter.pid = pid;
- pesfilter.input = DMX_IN_FRONTEND;
- pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
- pesfilter.pes_type = type;
- pesfilter.flags = DMX_IMMEDIATE_START;
-
- if (ioctl(fd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
- PERROR ("ioctl(DMX_SET_PES_FILTER) for %s PID failed",
- type == DMX_PES_AUDIO ? "Audio" :
- type == DMX_PES_VIDEO ? "Video" : "??");
- return -1;
- }
-
- return 0;
-}
-
-
-static
int setup_frontend (int fe_fd, struct dvb_frontend_parameters *frontend)
{
struct dvb_frontend_info fe_info;
@@ -503,6 +485,7 @@ static char *usage =
" -c file : read channels list from 'file'\n"
" -x : exit after tuning\n"
" -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
+ " -p : add pat and pmt to TS recording (implies -r)\n"
" -s : only print summary\n"
" -S : run silently (no output)\n"
" -H : human readable output\n"
@@ -519,15 +502,16 @@ int main(int argc, char **argv)
char *confname = NULL;
char *channel = NULL;
int adapter = 0, frontend = 0, demux = 0, dvr = 0;
- int vpid, apid;
+ int vpid, apid, sid, pmtpid = 0;
+ int pat_fd, pmt_fd;
int frontend_fd, audio_fd = 0, video_fd = 0, dvr_fd, file_fd;
int opt;
int record = 0;
int frontend_only = 0;
char *filename = NULL;
- int human_readable = 0;
+ int human_readable = 0, rec_psi = 0;
- while ((opt = getopt(argc, argv, "H?hrxRsFSn:a:f:d:c:t:o:")) != -1) {
+ while ((opt = getopt(argc, argv, "H?hrpxRsFSn:a:f:d:c:t:o:")) != -1) {
switch (opt) {
case 'a':
adapter = strtoul(optarg, NULL, 0);
@@ -548,6 +532,9 @@ int main(int argc, char **argv)
case 'r':
dvr = 1;
break;
+ case 'p':
+ rec_psi = 1;
+ break;
case 'x':
exit_after_tuning = 1;
break;
@@ -610,7 +597,7 @@ int main(int argc, char **argv)
memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
- if (parse (confname, channel, &frontend_param, &vpid, &apid))
+ if (parse (confname, channel, &frontend_param, &vpid, &apid, &sid))
return -1;
if ((frontend_fd = open(FRONTEND_DEV, O_RDWR)) < 0) {
@@ -624,6 +611,28 @@ int main(int argc, char **argv)
if (frontend_only)
goto just_the_frontend_dude;
+ if (rec_psi) {
+ pmtpid = get_pmt_pid(DEMUX_DEV, sid);
+ if (pmtpid <= 0) {
+ fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
+ return -1;
+ }
+
+ if ((pat_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pat demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+
+ if ((pmt_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pmt demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+ }
+
if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
PERROR("failed opening '%s'", DEMUX_DEV);
return -1;
@@ -689,6 +698,8 @@ just_the_frontend_dude:
check_frontend (frontend_fd, human_readable);
}
+ close (pat_fd);
+ close (pmt_fd);
close (audio_fd);
close (video_fd);
close (frontend_fd);
diff --git a/util/szap/util.c b/util/szap/util.c
new file mode 100644
index 0000000..301d666
--- /dev/null
+++ b/util/szap/util.c
@@ -0,0 +1,126 @@
+/*
+ * util functions for various ?zap implementations
+ *
+ * Copyright (C) 2001 Johannes Stezenbach (js@convergence.de)
+ * for convergence integrated media
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <linux/dvb/frontend.h>
+#include <linux/dvb/dmx.h>
+
+
+int set_pesfilter(int dmxfd, int pid, int pes_type, int dvr)
+{
+ struct dmx_pes_filter_params pesfilter;
+
+ /* ignore this pid to allow radio services */
+ if (pid < 0 ||
+ pid >= 0x1fff ||
+ (pid == 0 && pes_type != DMX_PES_OTHER))
+ return 0;
+
+ if (dvr) {
+ int buffersize = 64 * 1024;
+ if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1)
+ perror("DMX_SET_BUFFER_SIZE failed");
+ }
+
+ pesfilter.pid = pid;
+ pesfilter.input = DMX_IN_FRONTEND;
+ pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER;
+ pesfilter.pes_type = pes_type;
+ pesfilter.flags = DMX_IMMEDIATE_START;
+
+ if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) {
+ fprintf(stderr, "DMX_SET_PES_FILTER failed "
+ "(PID = 0x%04x): %d %m\n", pid, errno);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int get_pmt_pid(char *dmxdev, int sid)
+{
+ int patfd, count;
+ int pmt_pid = 0;
+ int patread = 0;
+ int section_length;
+ unsigned char buft[4096];
+ unsigned char *buf = buft;
+ struct dmx_sct_filter_params f;
+
+ memset(&f, 0, sizeof(f));
+ f.pid = 0;
+ f.filter.filter[0] = 0x00;
+ f.filter.mask[0] = 0xff;
+ f.timeout = 0;
+ f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
+
+ if ((patfd = open(dmxdev, O_RDWR)) < 0) {
+ perror("openening pat demux failed");
+ return -1;
+ }
+
+ if (ioctl(patfd, DMX_SET_FILTER, &f) == -1) {
+ perror("ioctl DMX_SET_FILTER failed");
+ close(patfd);
+ return -1;
+ }
+
+ while (!patread){
+ if (((count = read(patfd, buf, sizeof(buft))) < 0) && errno == EOVERFLOW)
+ count = read(patfd, buf, sizeof(buft));
+ if (count < 0) {
+ perror("read_sections: read error");
+ close(patfd);
+ return -1;
+ }
+
+ section_length = ((buf[1] & 0x0f) << 8) | buf[2];
+ if (count != section_length + 3)
+ continue;
+
+ buf += 8;
+ section_length -= 8;
+
+ patread = 1; /* assumes one section contains the whole pat */
+ while (section_length > 0) {
+ int service_id = (buf[0] << 8) | buf[1];
+ if (service_id == sid) {
+ pmt_pid = ((buf[2] & 0x1f) << 8) | buf[3];
+ section_length = 0;
+ }
+ buf += 4;
+ section_length -= 4;
+ }
+ }
+
+ close(patfd);
+ return pmt_pid;
+}
diff --git a/util/szap/util.h b/util/szap/util.h
new file mode 100644
index 0000000..f4b7f12
--- /dev/null
+++ b/util/szap/util.h
@@ -0,0 +1,24 @@
+/*
+ * util functions for various ?zap implementations
+ *
+ * Copyright (C) 2001 Johannes Stezenbach (js@convergence.de)
+ * for convergence integrated media
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+int set_pesfilter(int dmxfd, int pid, int pes_type, int dvr);
+
+int get_pmt_pid(char *dmxdev, int sid);