From 8b4521a4475cec12824ce8308a69f54135091a39 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Mon, 11 Nov 2024 15:22:09 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 + .pre-commit-config.yaml | 17 + oin_ha/__main__.py | 44 + oin_ha/display/__init__.py | 226 ++++ oin_ha/sensors/__init__.py | 129 ++ src/tom-thumb.bdf | 2353 ++++++++++++++++++++++++++++++++++++ 6 files changed, 2771 insertions(+) create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 oin_ha/__main__.py create mode 100644 oin_ha/display/__init__.py create mode 100644 oin_ha/sensors/__init__.py create mode 100644 src/tom-thumb.bdf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e73ce05 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +/env diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..4d8e2f2 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,17 @@ +repos: + - repo: https://github.com/PyCQA/isort + rev: 5.12.0 + hooks: + - id: isort + args: ["--profile", "black"] + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + - repo: https://github.com/PyCQA/flake8 + rev: "6.0.0" + hooks: + - id: flake8 + args: ["--max-line-length=88", "--extend-ignore=E203"] + exclude: "lyceedupaysdesoule/settings/|migrations" + diff --git a/oin_ha/__main__.py b/oin_ha/__main__.py new file mode 100644 index 0000000..0dff414 --- /dev/null +++ b/oin_ha/__main__.py @@ -0,0 +1,44 @@ +from threading import Timer + +import paho.mqtt.client as mqtt + +from .display import Display +from .sensors import Sensors + +dt = 10 +mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) +hat_sensors = Sensors(mqttc, "oin", "Oin") +hat_display = Display(mqttc, "oin", "Oin") + + +@mqttc.connect_callback() +def on_connect(client, userdata, flags, reason_code, properties): + print(f"Connected with result code {reason_code}") + + hat_sensors.publish_discovery() + hat_display.publish_discovery() + + hat_sensors.publish_online() + hat_display.publish_online() + + timer = Timer(0, send_data) + timer.start() + + +@mqttc.message_callback() +def on_message(*args, **kwargs): + hat_display.on_message(*args, **kwargs) + + +mqttc.username_pw_set(username="oin", password="n+Bi58l7LxbH5nEJ") +mqttc.connect("homeassistant.local", 1883, 60) + + +def send_data(): + timer = Timer(dt, send_data) + timer.start() + + hat_sensors.publish_state() + + +mqttc.loop_forever() diff --git a/oin_ha/display/__init__.py b/oin_ha/display/__init__.py new file mode 100644 index 0000000..829ed6a --- /dev/null +++ b/oin_ha/display/__init__.py @@ -0,0 +1,226 @@ +import json +from threading import Timer + +import bdfparser +from sense_hat import SenseHat + + +class Display: + def __init__(self, mqttc, uid, name): + self.mqttc = mqttc + self.sense = SenseHat() + self.uid = uid + self.name = name + + self.init_lights() + self.mqttc.will_set(self.availability_topic, "offline", retain=True) + + @property + def device(self): + return { + "identifiers": [self.uid], + "name": self.name, + } + + @property + def availability_topic(self): + return f"{self.uid}/display/availability" + + def init_lights(self): + options = { + "device": self.device, + "availability_topic": self.availability_topic, + } + + self.main_light = Light("LED", self.uid, "led", self.sense, **options) + + def publish_discovery(self): + self.main_light.publish_discovery(self.mqttc) + + def publish_online(self): + self.subscribe() + self.mqttc.publish(self.availability_topic, "online", retain=True) + + def subscribe(self): + self.main_light.subscribe(self.mqttc) + + def on_message(self, *args, **kwargs): + self.main_light.on_message(*args, **kwargs) + + +class Light: + def __init__(self, name, parent_uid, slug, sense, **kwargs): + self.name = name + self.parent_uid = parent_uid + self.slug = slug + self.sense = sense + self.options = kwargs + + self._switch = False + self._color = [255, 255, 255] + self._pre = "" + self._value = "" + + self.font = bdfparser.Font("src/tom-thumb.bdf") + self.timer = Timer(0, self.__init__) + + def publish_discovery(self, mqttc): + mqttc.publish( + self.discovery_topic, + json.dumps( + { + "command_topic": self.command_topic("command"), + "effect_command_topic": self.command_topic("effect"), + "effect_list": ["Low Light", "Normal"], + "effect_state_topie": self.state_topic, + "effect_value_template": "{{ value_json.effect }}", + "icon": "mdi:dots-grid", + "name": self.name, + "on_command_type": "brightness", + "rgb_command_topic": self.command_topic("rgb"), + "rgb_state_topic": self.state_topic, + "rgb_value_template": "{{ value_json.rgb }}", + "retain": True, + "unique_id": self.uid, + "state_topic": self.state_topic, + "state_value_template": "{{ value_json.state }}", + } + | self.options + ), + retain=True, + ) + self.publish_state(mqttc) + + def subscribe(self, mqttc): + mqttc.subscribe(self.command_topic("command")) + mqttc.subscribe(self.command_topic("effect")) + mqttc.subscribe(self.command_topic("rgb")) + + mqttc.subscribe(self.command_topic("value")) + + def on_message(self, client, userdata, message): + data = message.payload.decode() + print(data) + + match message.topic.rsplit("/", maxsplit=1): + case [self.base_topic, "command"]: + self.switch = data == "ON" + case [self.base_topic, "rgb"]: + self.color = list(map(int, data.split(","))) + case [self.base_topic, "effect"]: + self.sense.low_light = data == "Low Light" + case [self.base_topic, "value"]: + self.value = data + case _: + return + self.publish_state(client) + + def publish_state(self, mqttc): + mqttc.publish( + self.state_topic, + json.dumps( + { + "effect": "Low Light" if self.sense.low_light else "Normal", + "rgb": self.rgb, + "state": self.state, + } + ), + retain=True, + ) + + @property + def uid(self): + return f"{self.parent_uid}_{self.slug}" + + @property + def discovery_topic(self): + return f"homeassistant/light/{self.uid}/config" + + @property + def base_topic(self): + return f"{self.parent_uid}/display/{self.slug}" + + def command_topic(self, cmd): + return f"{self.base_topic}/{cmd}" + + @property + def state_topic(self): + return f"{self.parent_uid}/display/{self.slug}/state" + + @property + def switch(self): + return self._switch + + @switch.setter + def switch(self, value): + self._switch = value + if value: + self.update_value() + else: + self.sense.clear() + + @property + def state(self): + return "ON" if self.switch else "OFF" + + @property + def color(self): + return self._color + + @color.setter + def color(self, value): + self._color = value + if not self.switch: + self.switch = True + self.display_value() + + @property + def rgb(self): + return ",".join(map(str, self.color)) + + @property + def value(self): + return f"{self._pre} {self._value}" + + @value.setter + def value(self, value): + match value.split(): + case [val]: + self._pre = "" + self._value = val + case [pre, val, *_]: + self._pre = pre + self._value = val + self.display_value() + + def update_value(self): + if not self.switch: + return + + if not self._pre: + self.display_value() + return + + self.timer.cancel() + + pixels = self.to_pixels(self._pre) + self.sense.set_pixels(pixels) + + self.timer = Timer(1, self.display_value, kwargs=dict(timer=True)) + self.timer.start() + + def display_value(self, timer=False): + if (not timer and self.timer.is_alive()) or not self.switch: + return + + pixels = self.to_pixels(self._value) + self.sense.set_pixels(pixels) + + def to_pixels(self, text): + if text: + return [ + self.color if x else [0, 0, 0] + for x in self.font.draw(text).crop(8, 8, yoff=-2).todata(3) + ] + + return [self.color] * 64 diff --git a/oin_ha/sensors/__init__.py b/oin_ha/sensors/__init__.py new file mode 100644 index 0000000..1ca1595 --- /dev/null +++ b/oin_ha/sensors/__init__.py @@ -0,0 +1,129 @@ +import json + +from sense_hat import SenseHat + + +class Sensors: + def __init__(self, mqttc, uid, name): + self.mqttc = mqttc + self.sense = SenseHat() + self.uid = uid + self.name = name + + self.init_sensors() + self.mqttc.will_set(self.availability_topic, "offline", retain=True) + + @property + def device(self): + return { + "identifiers": [self.uid], + "name": self.name, + } + + @property + def availability_topic(self): + return f"{self.uid}/availability" + + @property + def state_topic(self): + return f"{self.uid}/state" + + def init_sensors(self): + options = { + "device": self.device, + "availability_topic": self.availability_topic, + "state_topic": self.state_topic, + "entity_category": "diagnostic", + } + + self.sensors = [ + TemperatureSensor( + "Température", + self.uid, + "temperature", + self.sense.get_temperature, + **options, + ), + HumiditySensor( + "Humidité", self.uid, "humidity", self.sense.get_humidity, **options + ), + PressureSensor( + "Pression", self.uid, "pressure", self.sense.get_pressure, **options + ), + ] + + def publish_discovery(self): + for sensor in self.sensors: + sensor.publish_discovery(self.mqttc) + + def publish_online(self): + self.mqttc.publish(self.availability_topic, "online", retain=True) + + def publish_state(self): + self.mqttc.publish( + self.state_topic, + json.dumps({sensor.slug: sensor.get_value() for sensor in self.sensors}), + ) + + +class SingleSensor: + def __init__(self, name, parent_uid, slug, get_value, **kwargs): + self.name = name + self.parent_uid = parent_uid + self.slug = slug + self.get_value = get_value + self.options = kwargs + + def publish_discovery(self, mqttc): + mqttc.publish( + self.discovery_topic, + json.dumps( + { + "name": self.name, + "state_class": "MEASUREMENT", + "unique_id": self.uid, + "value_template": self.value_template, + } + | self.options + ), + retain=True, + ) + + @property + def uid(self): + return f"{self.parent_uid}_{self.slug}" + + @property + def discovery_topic(self): + return f"homeassistant/sensor/{self.uid}/config" + + @property + def value_template(self): + return "{{" + f"value_json.{self.slug}" + "}}" + + +class TemperatureSensor(SingleSensor): + def __init__(self, name, parent_uid, slug, get_value, **kwargs): + super().__init__(name, parent_uid, slug, get_value, **kwargs) + self.options["device_class"] = "temperature" + self.options["icon"] = "mdi:thermometer" + self.options["suggested_display_precision"] = 1 + self.options["unit_of_measurement"] = "°C" + + +class HumiditySensor(SingleSensor): + def __init__(self, name, parent_uid, slug, get_value, **kwargs): + super().__init__(name, parent_uid, slug, get_value, **kwargs) + self.options["device_class"] = "humidity" + self.options["icon"] = "mdi:water-percent" + self.options["suggested_display_precision"] = 0 + self.options["unit_of_measurement"] = "%" + + +class PressureSensor(SingleSensor): + def __init__(self, name, parent_uid, slug, get_value, **kwargs): + super().__init__(name, parent_uid, slug, get_value, **kwargs) + self.options["device_class"] = "pressure" + self.options["icon"] = "mdi:gauge" + self.options["suggested_display_precision"] = 0 + self.options["unit_of_measurement"] = "mbar" diff --git a/src/tom-thumb.bdf b/src/tom-thumb.bdf new file mode 100644 index 0000000..3896c97 --- /dev/null +++ b/src/tom-thumb.bdf @@ -0,0 +1,2353 @@ +STARTFONT 2.1 +FONT -Raccoon-Fixed4x6-Medium-R-Normal--6-60-75-75-P-40-ISO10646-1 +SIZE 6 75 75 +FONTBOUNDINGBOX 3 6 0 -1 +STARTPROPERTIES 25 +FONT_NAME "Fixed4x6" +FONT_ASCENT 5 +FONT_DESCENT 1 +QUAD_WIDTH 6 +X_HEIGHT 3 +CAP_HEIGHT 4 +FONTNAME_REGISTRY "" +FAMILY_NAME "Fixed4x6" +FOUNDRY "Raccoon" +WEIGHT_NAME "Medium" +SETWIDTH_NAME "Normal" +SLANT "R" +ADD_STYLE_NAME "" +PIXEL_SIZE 6 +POINT_SIZE 60 +RESOLUTION_X 75 +RESOLUTION_Y 75 +RESOLUTION 75 +SPACING "P" +AVERAGE_WIDTH 40 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +CHARSET_COLLECTIONS "ASCII ISOLatin1Encoding ISO10646-1" +FULL_NAME "Fixed4x6" +COPYRIGHT """""MIT""""" +ENDPROPERTIES +CHARS 203 +STARTCHAR space +ENCODING 32 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 1 3 4 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 5 1 0 +BITMAP +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 2 0 3 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +E0 +A0 +E0 +A0 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +C0 +60 +C0 +40 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +20 +40 +80 +20 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +C0 +E0 +A0 +60 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 2 1 3 +BITMAP +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 5 1 0 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 5 0 0 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 2 0 0 +BITMAP +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 1 0 2 +BITMAP +E0 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 1 1 0 +BITMAP +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +20 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +A0 +A0 +A0 +C0 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 5 0 0 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +E0 +20 +20 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +80 +E0 +A0 +E0 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +20 +40 +80 +80 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +A0 +E0 +A0 +E0 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +A0 +E0 +20 +C0 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 3 1 1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 4 0 0 +BITMAP +40 +00 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +20 +40 +00 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +80 +80 +80 +60 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +A0 +A0 +A0 +C0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +80 +E0 +80 +E0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +80 +E0 +A0 +60 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +E0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +E0 +E0 +E0 +A0 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +A0 +A0 +E0 +60 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +A0 +E0 +C0 +A0 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +80 +40 +20 +C0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +A0 +A0 +60 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +A0 +40 +40 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +E0 +E0 +A0 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +40 +A0 +A0 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +40 +40 +40 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 1 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 2 0 3 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 1 0 0 +BITMAP +E0 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 2 0 3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +C0 +60 +A0 +E0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +C0 +A0 +A0 +C0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +60 +A0 +A0 +60 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +60 +A0 +C0 +60 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 -1 +BITMAP +60 +A0 +E0 +20 +40 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 5 1 0 +BITMAP +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 6 0 -1 +BITMAP +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +A0 +C0 +C0 +A0 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +E0 +E0 +E0 +A0 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +40 +A0 +A0 +40 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 -1 +BITMAP +C0 +A0 +A0 +C0 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 -1 +BITMAP +60 +A0 +A0 +60 +20 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +60 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +60 +C0 +60 +C0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +E0 +40 +40 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +A0 +A0 +A0 +60 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +A0 +A0 +E0 +40 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +A0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +A0 +40 +40 +A0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 -1 +BITMAP +A0 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +E0 +60 +C0 +E0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +40 +80 +40 +60 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 5 1 0 +BITMAP +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +40 +20 +40 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 2 0 3 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 5 1 0 +BITMAP +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +E0 +80 +E0 +40 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +40 +E0 +40 +E0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +40 +E0 +40 +A0 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +40 +E0 +40 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 5 1 0 +BITMAP +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +40 +A0 +40 +C0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 1 0 4 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 2 +BITMAP +60 +80 +60 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +A0 +E0 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 3 0 2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 2 0 2 +BITMAP +E0 +20 +ENDCHAR +STARTCHAR softhyphen +ENCODING 173 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 1 0 2 +BITMAP +C0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 2 +BITMAP +C0 +C0 +A0 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 1 0 4 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +E0 +40 +00 +E0 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 2 +BITMAP +C0 +40 +60 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 2 +BITMAP +E0 +60 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 2 1 3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +A0 +A0 +C0 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +A0 +60 +60 +60 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 1 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 0 +BITMAP +40 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 1 3 1 2 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 3 1 2 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +80 +00 +60 +20 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +80 +00 +C0 +60 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +C0 +00 +60 +20 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +00 +40 +80 +E0 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +20 +40 +E0 +A0 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +80 +40 +E0 +A0 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +40 +E0 +A0 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +C0 +40 +E0 +A0 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +40 +A0 +E0 +A0 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +C0 +A0 +E0 +A0 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +C0 +E0 +C0 +E0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 6 0 -1 +BITMAP +60 +80 +80 +60 +20 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +20 +E0 +C0 +E0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +80 +E0 +C0 +E0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +E0 +C0 +E0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +E0 +C0 +E0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +20 +E0 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +80 +E0 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +E0 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +E0 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +A0 +E0 +A0 +C0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +60 +A0 +E0 +A0 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +20 +E0 +A0 +E0 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +80 +E0 +A0 +E0 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +E0 +A0 +E0 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +60 +E0 +A0 +E0 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +E0 +A0 +E0 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 3 0 1 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +A0 +E0 +A0 +C0 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +40 +A0 +A0 +E0 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +40 +A0 +A0 +E0 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +A0 +A0 +E0 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +A0 +A0 +E0 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +40 +A0 +E0 +40 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +E0 +A0 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 6 0 -1 +BITMAP +60 +A0 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +20 +60 +A0 +E0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +80 +60 +A0 +E0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +60 +A0 +E0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +C0 +60 +A0 +E0 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +60 +A0 +E0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +60 +60 +A0 +E0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +60 +E0 +E0 +C0 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 -1 +BITMAP +60 +80 +60 +20 +40 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +20 +60 +E0 +60 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +80 +60 +E0 +60 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +60 +E0 +60 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +60 +E0 +60 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 5 1 0 +BITMAP +80 +40 +80 +80 +80 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 2 5 0 0 +BITMAP +40 +80 +40 +40 +40 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +C0 +60 +A0 +60 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +60 +C0 +A0 +A0 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +20 +40 +A0 +40 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +80 +40 +A0 +40 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +C0 +60 +40 +A0 +40 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +40 +00 +E0 +00 +40 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +60 +E0 +A0 +C0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +80 +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +20 +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +E0 +00 +A0 +A0 +60 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +A0 +A0 +60 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 6 0 -1 +BITMAP +20 +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 5 0 -1 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 1000 0 +DWIDTH 4 0 +BBX 3 6 0 -1 +BITMAP +A0 +00 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +C0 +E0 +C0 +60 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 4 0 0 +BITMAP +60 +E0 +C0 +E0 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +60 +C0 +60 +C0 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +60 +C0 +60 +C0 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +00 +A0 +40 +40 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +E0 +60 +C0 +E0 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +A0 +E0 +60 +C0 +E0 +ENDCHAR +STARTCHAR uni0EA4 +ENCODING 3748 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni13A0 +ENCODING 5024 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 1 1 1 2 +BITMAP +80 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 1 0 0 +BITMAP +A0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 666 0 +DWIDTH 4 0 +BBX 3 5 0 0 +BITMAP +60 +E0 +E0 +C0 +60 +ENDCHAR +ENDFONT