././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.1006663 python_barcode-0.16.1/0000755000175000017510000000000015053563204013623 5ustar00buildbuild././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.0953548 python_barcode-0.16.1/.github/0000755000175000017510000000000015053563204015163 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/.github/.kodiak.toml0000644000175000017510000000012115053563202017370 0ustar00buildbuild# .kodiak.toml # Minimal config. version is the only required field. version = 1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/.github/FUNDING.yml0000644000175000017510000000121715053563202016777 0ustar00buildbuild# These are supported funding model platforms github: WhyNotHugo patreon: WhyNotHugo # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/.github/no-response.yml0000644000175000017510000000130115053563202020147 0ustar00buildbuild# Configuration for probot-no-response - https://github.com/probot/no-response # Number of days of inactivity before an Issue is closed for lack of response daysUntilClose: 14 # Label requiring a response responseRequiredLabel: more-information-needed # Comment to post when closing an Issue for lack of response. Set to `false` to disable closeComment: > This issue has been automatically closed because there has been no response to our request for more information from the original author. With only the information that is currently in the issue, we don't have enough information to take action. Please reach out if you have or find the answers we need so that we can investigate further. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.0955622 python_barcode-0.16.1/.github/workflows/0000755000175000017510000000000015053563204017220 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/.github/workflows/publish.yml0000644000175000017510000000075415053563202021415 0ustar00buildbuildname: Publish on: push: tags: - v* jobs: pypi: runs-on: ubuntu-22.04 name: Publish package on PyPI steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: 3.7 - run: pip install build setuptools wheel build setuptools_scm - run: python -m build --sdist --wheel --no-isolation - uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_TOKEN }} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/.github/workflows/tests.yml0000644000175000017510000000162115053563202021103 0ustar00buildbuildname: Tests on: [push, pull_request] jobs: tests: runs-on: ${{ matrix.os }} strategy: matrix: os: [ ubuntu-22.04 ] python: [ '3.9', '3.10', '3.11', '3.12' ] variant: [ "py", "py-images" ] include: - os: macOS-12 python: "3.12" variant: py-images - os: windows-2022 python: "3.12" variant: py-images - os: windows-2022 name: python${{ matrix.python }} on ${{ matrix.os }} ${{ matrix.variant }} steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: ${{ matrix.python }} cache: pip cache-dependency-path: | pyproject.toml - name: Install test dependency run: pip install tox - name: Run tests run: tox env: TOXENV: ${{ matrix.variant }} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/.gitignore0000755000175000017510000000031515053563202015613 0ustar00buildbuild*.pyc *.bak *~ *.nja *.e* *.rope* *.dir* *.pdf *.kpf *.svg *.db .idea/* barcode/__pycache* build/* dist/* docs/_build MANIFEST barcode/version.py tests/index.html tests/test_outputs/ tests/test.py test.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/.pre-commit-config.yaml0000644000175000017510000000116515053563202020105 0ustar00buildbuildrepos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] - id: end-of-file-fixer - id: debug-statements - repo: https://github.com/pre-commit/mirrors-mypy rev: 'v1.7.1' hooks: - id: mypy - repo: https://github.com/astral-sh/ruff-pre-commit rev: 'v0.1.6' hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - id: ruff-format - repo: https://github.com/netromdk/vermin rev: v1.6.0 hooks: - id: vermin args: ['-t=3.9-', '--violations'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/CONTRIBUTING.md0000644000175000017510000000144015053563202016051 0ustar00buildbuild# Contributing to python-barcode ## Bug reports Please make sure that you take the following steps when reporting issues: Ensure that you are using the latest version. You bug may already have been fixed. Search existing issues to ensure that it was not previously included. Be sure to search closed issues too, your issue may have been fixed recently. In case that the generated output is not correct, please mention: - What input did you provide? - What output did you get? - What output do you think you should have obtained? In case of crashes, please copy the full stack trace and **at least** the line from your code that reproduces the crash. Trying to understand and debug any error is a lot easier if you provide a small portion of code that I can run myself to reproduce the error. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/LICENCE0000644000175000017510000000216215053563202014607 0ustar00buildbuildCopyright (c) 2017-2023 Hugo Osvaldo Barrera , et al Copyright (c) 2010-2013 Thorsten Weimann Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.1006474 python_barcode-0.16.1/PKG-INFO0000644000175000017510000000516215053563204014724 0ustar00buildbuildMetadata-Version: 2.4 Name: python-barcode Version: 0.16.1 Summary: Create standard barcodes with Python. No external modules needed. (optional Pillow support included). Author-email: Hugo Osvaldo Barrera et al License: MIT Project-URL: documentation, https://python-barcode.readthedocs.io/ Project-URL: repository, https://github.com/WhyNotHugo/python-barcode Project-URL: issues, https://github.com/WhyNotHugo/python-barcode/issues Project-URL: funding, https://whynothugo.nl/sponsor/ Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENCE Provides-Extra: images Requires-Dist: pillow; extra == "images" Dynamic: license-file python-barcode ============== .. image:: https://github.com/WhyNotHugo/python-barcode/actions/workflows/tests.yml/badge.svg :target: https://github.com/WhyNotHugo/python-barcode/actions :alt: CI status .. image:: https://readthedocs.org/projects/python-barcode/badge/ :target: https://python-barcode.rtfd.org/ :alt: documentation .. image:: https://img.shields.io/pypi/v/python-barcode.svg :target: https://pypi.python.org/pypi/python-barcode :alt: version on pypi .. image:: https://img.shields.io/pypi/dm/python-barcode.svg :target: https://pypi.python.org/pypi/python-barcode :alt: downloads .. image:: https://img.shields.io/pypi/l/python-barcode.svg :target: https://github.com/WhyNotHugo/python-barcode/blob/main/LICENCE :alt: licence **python-barcode** provides a simple way to create barcodes in Python. There are no external dependencies when generating SVG files. Pillow is required for generating images (e.g.: PNGs). Support Python 3.9 to 3.12. .. image:: example-ean13.png :target: https://github.com/WhyNotHugo/python-barcode :alt: python-barcode Documentation ------------- Full documentation is published at http://python-barcode.rtfd.io/ You can build the documentation locally using ``make -C docs html``. Licence ------- python-barcode is licensed under the MIT licence. See LICENCE for details. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/README.rst0000644000175000017510000000251115053563202015307 0ustar00buildbuildpython-barcode ============== .. image:: https://github.com/WhyNotHugo/python-barcode/actions/workflows/tests.yml/badge.svg :target: https://github.com/WhyNotHugo/python-barcode/actions :alt: CI status .. image:: https://readthedocs.org/projects/python-barcode/badge/ :target: https://python-barcode.rtfd.org/ :alt: documentation .. image:: https://img.shields.io/pypi/v/python-barcode.svg :target: https://pypi.python.org/pypi/python-barcode :alt: version on pypi .. image:: https://img.shields.io/pypi/dm/python-barcode.svg :target: https://pypi.python.org/pypi/python-barcode :alt: downloads .. image:: https://img.shields.io/pypi/l/python-barcode.svg :target: https://github.com/WhyNotHugo/python-barcode/blob/main/LICENCE :alt: licence **python-barcode** provides a simple way to create barcodes in Python. There are no external dependencies when generating SVG files. Pillow is required for generating images (e.g.: PNGs). Support Python 3.9 to 3.12. .. image:: example-ean13.png :target: https://github.com/WhyNotHugo/python-barcode :alt: python-barcode Documentation ------------- Full documentation is published at http://python-barcode.rtfd.io/ You can build the documentation locally using ``make -C docs html``. Licence ------- python-barcode is licensed under the MIT licence. See LICENCE for details. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.0967917 python_barcode-0.16.1/barcode/0000755000175000017510000000000015053563204015222 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/__init__.py0000755000175000017510000001026015053563202017333 0ustar00buildbuild"""This package provides a simple way to create standard barcodes. It needs no external packages to be installed, the barcodes are created as SVG objects. If Pillow is installed, the barcodes can also be rendered as images (all formats supported by Pillow). """ from __future__ import annotations import os from typing import TYPE_CHECKING from typing import BinaryIO from typing import overload from barcode.codabar import CODABAR from barcode.codex import PZN from barcode.codex import Code39 from barcode.codex import Code128 from barcode.codex import Gs1_128 from barcode.ean import EAN8 from barcode.ean import EAN8_GUARD from barcode.ean import EAN13 from barcode.ean import EAN13_GUARD from barcode.ean import EAN14 from barcode.ean import JAN from barcode.errors import BarcodeNotFoundError from barcode.isxn import ISBN10 from barcode.isxn import ISBN13 from barcode.isxn import ISSN from barcode.itf import ITF from barcode.upc import UPCA from barcode.version import version # noqa: F401 if TYPE_CHECKING: from barcode.base import Barcode from barcode.writer import BaseWriter __BARCODE_MAP: dict[str, type[Barcode]] = { "codabar": CODABAR, "code128": Code128, "code39": Code39, "ean": EAN13, "ean13": EAN13, "ean13-guard": EAN13_GUARD, "ean14": EAN14, "ean8": EAN8, "ean8-guard": EAN8_GUARD, "gs1": ISBN13, "gs1_128": Gs1_128, "gtin": EAN14, "isbn": ISBN13, "isbn10": ISBN10, "isbn13": ISBN13, "issn": ISSN, "itf": ITF, "jan": JAN, "nw-7": CODABAR, "pzn": PZN, "upc": UPCA, "upca": UPCA, } PROVIDED_BARCODES = list(__BARCODE_MAP) PROVIDED_BARCODES.sort() @overload def get( name: str, code: str, writer: BaseWriter | None = None, options: dict | None = None ) -> Barcode: ... @overload def get( name: str, code: None = None, writer: BaseWriter | None = None, options: dict | None = None, ) -> type[Barcode]: ... def get( name: str, code: str | None = None, writer: BaseWriter | None = None, options: dict | None = None, ) -> Barcode | type[Barcode]: """Helper method for getting a generator or even a generated code. :param name: The name of the type of barcode desired. :param code: The actual information to encode. If this parameter is provided, a generated barcode is returned. Otherwise, the barcode class is returned. :param Writer writer: An alternative writer to use when generating the barcode. :param options: Additional options to be passed on to the barcode when generating. """ options = options or {} barcode: type[Barcode] try: barcode = __BARCODE_MAP[name.lower()] except KeyError as e: raise BarcodeNotFoundError(f"The barcode {name!r} is not known.") from e if code is not None: return barcode(code, writer, **options) return barcode def get_class(name: str) -> type[Barcode]: return get_barcode(name) def generate( name: str, code: str, writer: BaseWriter | None = None, output: str | os.PathLike | BinaryIO | None = None, writer_options: dict | None = None, text: str | None = None, ) -> str | None: """Shortcut to generate a barcode in one line. :param name: Name of the type of barcode to use. :param code: Data to encode into the barcode. :param writer: A writer to use (e.g.: ImageWriter or SVGWriter). :param output: Destination file-like or path-like where to save the generated barcode. :param writer_options: Options to pass on to the writer instance. :param text: Text to render under the barcode. """ from barcode.base import Barcode if output is None: raise TypeError("'output' cannot be None") writer = writer or Barcode.default_writer() writer.set_options(writer_options or {}) barcode = get(name, code, writer) if isinstance(output, str): return barcode.save(output, writer_options, text) if isinstance(output, os.PathLike): with open(output, "wb") as fp: barcode.write(fp, writer_options, text) return None barcode.write(output, writer_options, text) return None get_barcode = get get_barcode_class = get_class ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/base.py0000755000175000017510000000676115053563202016521 0ustar00buildbuild"""barcode.base """ from __future__ import annotations from typing import TYPE_CHECKING from typing import ClassVar from barcode.writer import BaseWriter from barcode.writer import SVGWriter if TYPE_CHECKING: from typing import BinaryIO class Barcode: name = "" digits = 0 default_writer = SVGWriter default_writer_options: ClassVar[dict] = { "module_width": 0.2, "module_height": 15.0, "quiet_zone": 6.5, "font_size": 10, "text_distance": 5.0, "background": "white", "foreground": "black", "write_text": True, "text": "", } writer: BaseWriter def __init__(self, code: str, writer: BaseWriter | None = None, **options) -> None: raise NotImplementedError def to_ascii(self) -> str: code_list = self.build() if not len(code_list) == 1: raise RuntimeError("Code list must contain a single element.") code = code_list[0] return code.replace("1", "X").replace("0", " ") def __repr__(self) -> str: return f"<{self.__class__.__name__}({self.get_fullcode()!r})>" def build(self) -> list[str]: """Return a single-element list with a string encoding the barcode. Typically the string consists of 1s and 0s, although it can contain other characters such as G for guard lines (e.g. in EAN13).""" raise NotImplementedError def get_fullcode(self): """Returns the full code, encoded in the barcode. :returns: Full human readable code. :rtype: String """ raise NotImplementedError def save( self, filename: str, options: dict | None = None, text: str | None = None ) -> str: """Renders the barcode and saves it in `filename`. :param filename: Filename to save the barcode in (without filename extension). :param options: The same as in `self.render`. :param text: Text to render under the barcode. :returns: The full filename with extension. """ output = self.render(options, text) if text else self.render(options) return self.writer.save(filename, output) def write( self, fp: BinaryIO, options: dict | None = None, text: str | None = None, ) -> None: """Renders the barcode and writes it to the file like object `fp`. :param fp: Object to write the raw data in. :param options: The same as in `self.render`. :param text: Text to render under the barcode. """ output = self.render(options, text) self.writer.write(output, fp) def render(self, writer_options: dict | None = None, text: str | None = None): """Renders the barcode using `self.writer`. :param writer_options: Options for `self.writer`, see writer docs for details. :param text: Text to render under the barcode. :returns: Output of the writers render method. """ options = self.default_writer_options.copy() options.update(writer_options or {}) if options["write_text"] or text is not None: if text is not None: options["text"] = text else: options["text"] = self.get_fullcode() self.writer.set_options(options) code_list = self.build() if not len(code_list) == 1: raise RuntimeError("Code list must contain a single element.") code = code_list[0] return self.writer.render([code]) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.0975225 python_barcode-0.16.1/barcode/charsets/0000755000175000017510000000000015053563204017036 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/charsets/__init__.py0000644000175000017510000000000015053563202021133 0ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/charsets/codabar.py0000644000175000017510000000100315053563202020773 0ustar00buildbuildfrom __future__ import annotations # W = Wide bar # w = wide space # N = Narrow bar # n = narrow space CODES = { "0": "NnNnNwW", "1": "NnNnWwN", "2": "NnNwNnW", "3": "WwNnNnN", "4": "NnWnNwN", "5": "WnNnNwN", "6": "NwNnNnW", "7": "NwNnWnN", "8": "NwWnNnN", "9": "WnNwNnN", "-": "NnNwWnN", "$": "NnWwNnN", ":": "WnNnWnW", "/": "WnWnNnW", ".": "WnWnWnN", "+": "NnWnWnW", } STARTSTOP = {"A": "NnWwNwN", "B": "NwNwNnW", "C": "NnNwNwW", "D": "NnNwWwN"} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/charsets/code128.py0000644000175000017510000000656415053563202020566 0ustar00buildbuildfrom __future__ import annotations import string # Charsets for code 128 _common = ( " ", "!", '"', "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", *tuple(string.digits), ":", ";", "<", "=", ">", "?", "@", *tuple(string.ascii_uppercase), "[", "\\", "]", "^", "_", ) _charset_a = ( *_common, "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\t", "\n", "\x0b", "\x0c", "\r", "\x0e", "\x0f", "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", "ó", "ò", "SHIFT", "TO_C", "TO_B", "ô", "ñ", ) _charset_b = ( *_common, "`", *tuple(string.ascii_lowercase), "{", "|", "}", "~", "\x7f", "ó", "ò", "SHIFT", "TO_C", "ô", "TO_A", "ñ", ) ALL = set(_common + _charset_a + _charset_b) A = {c: i for i, c in enumerate(_charset_a)} B = {c: i for i, c in enumerate(_charset_b)} C = {"TO_B": 100, "TO_A": 101, "\xf1": 102} CODES = ( "11011001100", "11001101100", "11001100110", "10010011000", "10010001100", "10001001100", "10011001000", "10011000100", "10001100100", "11001001000", "11001000100", "11000100100", "10110011100", "10011011100", "10011001110", "10111001100", "10011101100", "10011100110", "11001110010", "11001011100", "11001001110", "11011100100", "11001110100", "11101101110", "11101001100", "11100101100", "11100100110", "11101100100", "11100110100", "11100110010", "11011011000", "11011000110", "11000110110", "10100011000", "10001011000", "10001000110", "10110001000", "10001101000", "10001100010", "11010001000", "11000101000", "11000100010", "10110111000", "10110001110", "10001101110", "10111011000", "10111000110", "10001110110", "11101110110", "11010001110", "11000101110", "11011101000", "11011100010", "11011101110", "11101011000", "11101000110", "11100010110", "11101101000", "11101100010", "11100011010", "11101111010", "11001000010", "11110001010", "10100110000", "10100001100", "10010110000", "10010000110", "10000101100", "10000100110", "10110010000", "10110000100", "10011010000", "10011000010", "10000110100", "10000110010", "11000010010", "11001010000", "11110111010", "11000010100", "10001111010", "10100111100", "10010111100", "10010011110", "10111100100", "10011110100", "10011110010", "11110100100", "11110010100", "11110010010", "11011011110", "11011110110", "11110110110", "10101111000", "10100011110", "10001011110", "10111101000", "10111100010", "11110101000", "11110100010", "10111011110", "10111101110", "11101011110", "11110101110", "11010000100", "11010010000", "11010011100", ) STOP = "11000111010" START_CODES = {"A": 103, "B": 104, "C": 105} TO = {101: START_CODES["A"], 100: START_CODES["B"], 99: START_CODES["C"]} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/charsets/code39.py0000644000175000017510000000251115053563202020473 0ustar00buildbuildfrom __future__ import annotations import string # Charsets for code 39 REF = ( tuple(string.digits) + tuple(string.ascii_uppercase) + ("-", ".", " ", "$", "/", "+", "%") ) B = "1" E = "0" CODES = ( "101000111011101", "111010001010111", "101110001010111", "111011100010101", "101000111010111", "111010001110101", "101110001110101", "101000101110111", "111010001011101", "101110001011101", "111010100010111", "101110100010111", "111011101000101", "101011100010111", "111010111000101", "101110111000101", "101010001110111", "111010100011101", "101110100011101", "101011100011101", "111010101000111", "101110101000111", "111011101010001", "101011101000111", "111010111010001", "101110111010001", "101010111000111", "111010101110001", "101110101110001", "101011101110001", "111000101010111", "100011101010111", "111000111010101", "100010111010111", "111000101110101", "100011101110101", "100010101110111", "111000101011101", "100011101011101", "100010001000101", "100010001010001", "100010100010001", "101000100010001", ) EDGE = "100010111011101" MIDDLE = "0" # MAP for assigning every symbol (REF) to (reference number, barcode) MAP = dict(zip(REF, enumerate(CODES))) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/charsets/ean.py0000644000175000017510000000153515053563202020155 0ustar00buildbuildfrom __future__ import annotations EDGE = "101" MIDDLE = "01010" CODES = { "A": ( "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011", ), "B": ( "0100111", "0110011", "0011011", "0100001", "0011101", "0111001", "0000101", "0010001", "0001001", "0010111", ), "C": ( "1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100", "1001000", "1110100", ), } LEFT_PATTERN = ( "AAAAAA", "AABABB", "AABBAB", "AABBBA", "ABAABB", "ABBAAB", "ABBBAA", "ABABAB", "ABABBA", "ABBABA", ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/charsets/itf.py0000644000175000017510000000042315053563202020167 0ustar00buildbuildfrom __future__ import annotations # W = Wide bar # w = wide space # N = Narrow bar # n = narrow space START = "NnNn" STOP = "WnN" CODES = ( "NNWWN", "WNNNW", "NWNNW", "WWNNN", "NNWNW", "WNWNN", "NWWNN", "NNNWW", "WNNWN", "NWNWN", ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/charsets/upc.py0000644000175000017510000000075615053563202020205 0ustar00buildbuildfrom __future__ import annotations EDGE = "101" MIDDLE = "01010" CODES = { "L": ( "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011", ), "R": ( "1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100", "1001000", "1110100", ), } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/codabar.py0000644000175000017510000000433215053563202017167 0ustar00buildbuild"""Module: barcode.codabar :Provided barcodes: Codabar (NW-7) """ from __future__ import annotations __docformat__ = "restructuredtext en" from barcode.base import Barcode from barcode.charsets import codabar from barcode.errors import BarcodeError from barcode.errors import IllegalCharacterError class CODABAR(Barcode): """Initializes a new CODABAR instance. :parameters: code : String Codabar (NW-7) string that matches [ABCD][0-9$:/.+-]+[ABCD] writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). narrow: Integer Width of the narrow elements (default: 2) wide: Integer Width of the wide elements (default: 5) wide/narrow must be in the range 2..3 """ name = "Codabar (NW-7)" def __init__(self, code, writer=None, narrow=2, wide=5) -> None: self.code = code self.writer = writer or self.default_writer() self.narrow = narrow self.wide = wide def __str__(self) -> str: return self.code def get_fullcode(self): return self.code def build(self) -> list[str]: try: data = ( codabar.STARTSTOP[self.code[0]] + "n" ) # Start with [A-D], followed by a narrow space except KeyError: raise BarcodeError("Codabar should start with either A,B,C or D") from None try: data += "n".join( [codabar.CODES[c] for c in self.code[1:-1]] ) # separated by a narrow space except KeyError: raise IllegalCharacterError( "Codabar can only contain numerics or $:/.+-" ) from None try: data += "n" + codabar.STARTSTOP[self.code[-1]] # End with [A-D] except KeyError: raise BarcodeError("Codabar should end with either A,B,C or D") from None raw = "" for e in data: if e == "W": raw += "1" * self.wide if e == "w": raw += "0" * self.wide if e == "N": raw += "1" * self.narrow if e == "n": raw += "0" * self.narrow return [raw] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/codex.py0000755000175000017510000002244015053563202016701 0ustar00buildbuild"""Module: barcode.codex :Provided barcodes: Code 39, Code 128, PZN """ from __future__ import annotations from typing import TYPE_CHECKING from typing import Collection from typing import Literal from barcode.base import Barcode from barcode.charsets import code39 from barcode.charsets import code128 from barcode.errors import BarcodeError from barcode.errors import IllegalCharacterError from barcode.errors import NumberOfDigitsError if TYPE_CHECKING: from barcode.writer import BaseWriter __docformat__ = "restructuredtext en" # Sizes MIN_SIZE = 0.2 MIN_QUIET_ZONE = 2.54 def check_code(code: str, name: str, allowed: Collection[str]) -> None: wrong = [] for char in code: if char not in allowed: wrong.append(char) if wrong: raise IllegalCharacterError( "The following characters are not valid for {name}: {wrong}".format( name=name, wrong=", ".join(wrong) ) ) class Code39(Barcode): """A Code39 barcode implementation""" name = "Code 39" def __init__(self, code: str, writer=None, add_checksum: bool = True) -> None: r""" :param code: Code 39 string without \* and without checksum. :param writer: A ``barcode.writer`` instance used to render the barcode (default: SVGWriter). :param add_checksum: Add the checksum to code or not """ self.code = code.upper() if add_checksum: self.code += self.calculate_checksum() self.writer = writer or self.default_writer() check_code(self.code, self.name, code39.REF) def __str__(self) -> str: return self.code def get_fullcode(self) -> str: """:returns: The full code as it will be encoded.""" return self.code def calculate_checksum(self): check = sum(code39.MAP[x][0] for x in self.code) % 43 for k, v in code39.MAP.items(): if check == v[0]: return k return None def build(self) -> list[str]: chars = [code39.EDGE] for char in self.code: chars.append(code39.MAP[char][1]) chars.append(code39.EDGE) result = code39.MIDDLE.join(chars) return [result] def render(self, writer_options=None, text=None): options = {"module_width": MIN_SIZE, "quiet_zone": MIN_QUIET_ZONE} options.update(writer_options or {}) return super().render(options, text) class PZN7(Code39): """Initializes new German number for pharmaceutical products. :parameters: pzn : String Code to render. writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). """ name = "Pharmazentralnummer" digits = 6 def __init__(self, pzn, writer=None) -> None: pzn = pzn[: self.digits] if not pzn.isdigit(): raise IllegalCharacterError("PZN can only contain numbers.") if len(pzn) != self.digits: raise NumberOfDigitsError( f"PZN must have {self.digits} digits, not {len(pzn)}." ) self.pzn = pzn self.pzn = f"{pzn}{self.calculate_checksum()}" super().__init__(f"PZN-{self.pzn}", writer, add_checksum=False) def get_fullcode(self): return f"PZN-{self.pzn}" def calculate_checksum(self): sum_ = sum(int(x) * int(y) for x, y in enumerate(self.pzn, start=2)) checksum = sum_ % 11 if checksum == 10: raise BarcodeError("Checksum can not be 10 for PZN.") return checksum class PZN8(PZN7): """Will be fully added in v0.9.""" digits = 7 class Code128(Barcode): """Initializes a new Code128 instance. The checksum is added automatically when building the bars. :parameters: code : String Code 128 string without checksum (added automatically). writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). """ name = "Code 128" _charset: Literal["A", "B", "C"] code: str writer: BaseWriter buffer: str def __init__(self, code: str, writer=None) -> None: self.code = code self.writer = writer or self.default_writer() self._charset = "C" self._buffer = "" check_code(self.code, self.name, code128.ALL) def __str__(self) -> str: return self.code @property def encoded(self) -> list[int]: return self._build() def get_fullcode(self) -> str: return self.code def _new_charset(self, which: Literal["A", "B", "C"]) -> list[int]: if which == self._charset: raise ValueError(f"Already in charset {which}") if which == "A": code = self._convert("TO_A") elif which == "B": code = self._convert("TO_B") elif which == "C": code = self._convert("TO_C") self._charset = which return [code] # to be redefined in subclass if required def _is_char_fnc1_char(self, char): """Whether a character is the FNC1 character. May be redefined by subclasses if required. FNC1 char is defined in GS1-128 specification and it is defined just the same for all encodings therefore this sign should be treated in a special way. """ return False def _maybe_switch_charset(self, pos: int) -> list[int]: char = self.code[pos] next_ = self.code[pos : pos + 10] def look_next() -> bool: digits = 0 for c in next_: if c.isdigit(): digits += 1 else: break return digits > 3 codes: list[int] = [] if self._charset == "C" and not char.isdigit(): if self._is_char_fnc1_char(char) and not self._buffer: return codes if char in code128.B: codes = self._new_charset("B") elif char in code128.A: codes = self._new_charset("A") if len(self._buffer) == 1: codes.append(self._convert(self._buffer[0])) self._buffer = "" elif self._charset == "B": if look_next(): codes = self._new_charset("C") elif char not in code128.B and char in code128.A: codes = self._new_charset("A") elif self._charset == "A": if look_next(): codes = self._new_charset("C") elif char not in code128.A and char in code128.B: codes = self._new_charset("B") return codes def _convert(self, char: str): if self._charset == "A": return code128.A[char] if self._charset == "B": return code128.B[char] if self._charset == "C": if char in code128.C: return code128.C[char] if char.isdigit(): self._buffer += char if len(self._buffer) == 2: value = int(self._buffer) self._buffer = "" return value return None raise RuntimeError( f"Character {char} could not be converted in charset {self._charset}." ) def _try_to_optimize(self, encoded: list[int]) -> list[int]: if encoded[1] in code128.TO: encoded[:2] = [code128.TO[encoded[1]]] return encoded def _calculate_checksum(self, encoded: list[int]) -> int: cs = [encoded[0]] for i, code_num in enumerate(encoded[1:], start=1): cs.append(i * code_num) return sum(cs) % 103 def _build(self) -> list[int]: encoded: list[int] = [code128.START_CODES[self._charset]] for i, char in enumerate(self.code): encoded.extend(self._maybe_switch_charset(i)) code_num = self._convert(char) if code_num is not None: encoded.append(code_num) # Finally look in the buffer if len(self._buffer) == 1: encoded.extend(self._new_charset("B")) encoded.append(self._convert(self._buffer[0])) self._buffer = "" return self._try_to_optimize(encoded) def build(self) -> list[str]: encoded = self._build() encoded.append(self._calculate_checksum(encoded)) code = "" for code_num in encoded: code += code128.CODES[code_num] code += code128.STOP code += "11" return [code] def render(self, writer_options=None, text=None): options = {"module_width": MIN_SIZE, "quiet_zone": MIN_QUIET_ZONE} options.update(writer_options or {}) return super().render(options, text) class Gs1_128(Code128): # noqa: N801 """ following the norm, a gs1-128 barcode is a subset of code 128 barcode, it can be generated by prepending the code with the FNC1 character https://en.wikipedia.org/wiki/GS1-128 https://www.gs1-128.info/ """ name = "GS1-128" FNC1_CHAR = "\xf1" def __init__(self, code, writer=None) -> None: code = self.FNC1_CHAR + code super().__init__(code, writer) def get_fullcode(self): return super().get_fullcode()[1:] def _is_char_fnc1_char(self, char): return char == self.FNC1_CHAR # For pre 0.8 compatibility PZN = PZN7 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/ean.py0000755000175000017510000001613215053563202016343 0ustar00buildbuild"""Module: barcode.ean :Provided barcodes: EAN-14, EAN-13, EAN-8, JAN """ from __future__ import annotations __docformat__ = "restructuredtext en" from barcode.base import Barcode from barcode.charsets import ean as _ean from barcode.errors import IllegalCharacterError from barcode.errors import NumberOfDigitsError from barcode.errors import WrongCountryCodeError # EAN13 Specs (all sizes in mm) SIZES = { "SC0": 0.27, "SC1": 0.297, "SC2": 0.33, "SC3": 0.363, "SC4": 0.396, "SC5": 0.445, "SC6": 0.495, "SC7": 0.544, "SC8": 0.61, "SC9": 0.66, } class EuropeanArticleNumber13(Barcode): """Initializes EAN13 object. :param ean: The ean number as string. If the value is too long, it is trimmed. :param writer: The writer to render the barcode (default: SVGWriter). :param no_checksum: Don't calculate the checksum. Use the provided input instead. """ name = "EAN-13" digits = 12 def __init__( self, ean: str, writer=None, no_checksum=False, guardbar=False ) -> None: if not ean[: self.digits].isdigit(): raise IllegalCharacterError(f"EAN code can only contain numbers {ean}.") if len(ean) < self.digits: raise NumberOfDigitsError( f"EAN must have {self.digits} digits, received {len(ean)}." ) base = ean[: self.digits] if no_checksum: # Use the thirteenth digit if given in parameter, otherwise pad with zero if len(ean) > self.digits and ean[self.digits].isdigit(): last = int(ean[self.digits]) else: last = 0 else: last = self.calculate_checksum(base) self.ean = f"{base}{last}" self.guardbar = guardbar if guardbar: self.EDGE = _ean.EDGE.replace("1", "G") self.MIDDLE = _ean.MIDDLE.replace("1", "G") else: self.EDGE = _ean.EDGE self.MIDDLE = _ean.MIDDLE self.writer = writer or self.default_writer() def __str__(self) -> str: return self.ean def get_fullcode(self) -> str: if self.guardbar: return self.ean[0] + " " + self.ean[1:7] + " " + self.ean[7:] + " >" return self.ean def calculate_checksum(self, value: str | None = None) -> int: """Calculates and returns the checksum for EAN13-Code. Calculates the checksum for the supplied `value` (if any) or for this barcode's internal ``self.ean`` property. """ ean_without_checksum = value or self.ean[: self.digits] evensum = sum(int(x) for x in ean_without_checksum[-2::-2]) oddsum = sum(int(x) for x in ean_without_checksum[-1::-2]) return (10 - ((evensum + oddsum * 3) % 10)) % 10 def build(self) -> list[str]: """Builds the barcode pattern from `self.ean`. :returns: The pattern as string :rtype: List containing the string as a single element """ code = self.EDGE[:] pattern = _ean.LEFT_PATTERN[int(self.ean[0])] for i, number in enumerate(self.ean[1:7]): code += _ean.CODES[pattern[i]][int(number)] code += self.MIDDLE for number in self.ean[7:]: code += _ean.CODES["C"][int(number)] code += self.EDGE return [code] def to_ascii(self) -> str: """Returns an ascii representation of the barcode. :rtype: String """ code_list = self.build() if not len(code_list) == 1: raise RuntimeError("Code list must contain a single element.") code = code_list[0] return code.replace("G", "|").replace("1", "|").replace("0", " ") def render(self, writer_options=None, text=None): options = {"module_width": SIZES["SC2"]} options.update(writer_options or {}) return super().render(options, text) class EuropeanArticleNumber13WithGuard(EuropeanArticleNumber13): """A shortcut to EAN-13 with ``guardbar=True``.""" name = "EAN-13 with guards" def __init__(self, ean, writer=None, no_checksum=False, guardbar=True) -> None: super().__init__(ean, writer, no_checksum, guardbar) class JapanArticleNumber(EuropeanArticleNumber13): """Initializes JAN barcode. :parameters: jan : String The jan number as string. writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). """ name = "JAN" valid_country_codes = list(range(450, 460)) + list(range(490, 500)) def __init__(self, jan, *args, **kwargs) -> None: if int(jan[:3]) not in self.valid_country_codes: raise WrongCountryCodeError( "Country code isn't between 450-460 or 490-500." ) super().__init__(jan, *args, **kwargs) class EuropeanArticleNumber8(EuropeanArticleNumber13): """Represents an EAN-8 barcode. See EAN13's __init__ for details. :parameters: ean : String The ean number as string. writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). """ name = "EAN-8" digits = 7 def build(self) -> list[str]: """Builds the barcode pattern from `self.ean`. :returns: A list containing the string as a single element """ code = self.EDGE[:] for number in self.ean[:4]: code += _ean.CODES["A"][int(number)] code += self.MIDDLE for number in self.ean[4:]: code += _ean.CODES["C"][int(number)] code += self.EDGE return [code] def get_fullcode(self): if self.guardbar: return "< " + self.ean[:4] + " " + self.ean[4:] + " >" return self.ean class EuropeanArticleNumber8WithGuard(EuropeanArticleNumber8): """A shortcut to EAN-8 with ``guardbar=True``.""" name = "EAN-8 with guards" def __init__(self, ean, writer=None, no_checksum=False, guardbar=True) -> None: super().__init__(ean, writer, no_checksum, guardbar) class EuropeanArticleNumber14(EuropeanArticleNumber13): """Represents an EAN-14 barcode. See EAN13's __init__ for details. :param ean: The ean number as string. :param writer: The writer to render the barcode (default: SVGWriter). :param no_checksum: Don't calculate the checksum. Use the provided input instead. """ name = "EAN-14" digits = 13 def calculate_checksum(self, value: str | None = None) -> int: """Calculates and returns the checksum for EAN14-Code. Calculates the checksum for the supplied `value` (if any) or for this barcode's internal ``self.ean`` property. """ ean_without_checksum = value or self.ean[: self.digits] evensum = sum(int(x) for x in ean_without_checksum[::2]) oddsum = sum(int(x) for x in ean_without_checksum[1::2]) return (10 - (((evensum * 3) + oddsum) % 10)) % 10 # Shortcuts EAN14 = EuropeanArticleNumber14 EAN13 = EuropeanArticleNumber13 EAN13_GUARD = EuropeanArticleNumber13WithGuard EAN8 = EuropeanArticleNumber8 EAN8_GUARD = EuropeanArticleNumber8WithGuard JAN = JapanArticleNumber ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/errors.py0000755000175000017510000000127215053563202017113 0ustar00buildbuild"""barcode.errors""" from __future__ import annotations __docformat__ = "restructuredtext en" class BarcodeError(Exception): def __init__(self, msg) -> None: self.msg = msg def __str__(self) -> str: return self.msg class IllegalCharacterError(BarcodeError): """Raised when a barcode-string contains illegal characters.""" class BarcodeNotFoundError(BarcodeError): """Raised when an unknown barcode is requested.""" class NumberOfDigitsError(BarcodeError): """Raised when the number of digits do not match.""" class WrongCountryCodeError(BarcodeError): """Raised when a JAN (Japan Article Number) don't starts with 450-459 or 490-499. """ ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.0976214 python_barcode-0.16.1/barcode/fonts/0000755000175000017510000000000015053563204016353 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/fonts/DejaVuSansMono.ttf0000755000175000017510000116376415053563202021751 0ustar00buildbuild FFTMSH,GDEFzbmHGPOSA8#8GSUBV.W:OS/2i?Vcmap @cvt  U0fpgm[kWgaspX glyfpAQXhead(P6hhea$hmtx Cloca1maxp'J8 name`JX!postkpugprep:eƼHƼH&'mnnopq~       ` arab&cyrl4dfltFgrekPlao \latnj SRB 4ISM 4KSM 4LSM 4MOL 4NSM 4ROM 4SKS 4SSM 4mark mark,mark4mkmk:rtbdB &.6>FPX`Rx | r457" p% h&0  c"c!$"]j]jbj $6HZl~ P|H 0 P|H <P ,  T`  P|H     %hhhn  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\Xd|dh0`tXtX <|00hL( Tplx`xDJPV]j]j]j]j]jbj]j]jh|  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| dt hd8|$|`HLD \t@4H(|XT(lt<0xx_` iFWW@TT[:B`LLL[Z[IWTL4K]l8@^  @bXXXXoM!TxxTT&~O[ XPXD,aDf\Ph< \\\0,0@, d `|tL`00@\  T`@L845D80H <D<x(LX$Tt0TLh0pLh<pl$d`0h8< PLdhx8TR m$v2z`M;)RDhp_)I R|o~4@@#CF$  S( V Yd \ _h o ol r um x q U U Z Z \ \ ^ _ !"#$& &,28>DJPV]j]j]j]j]jbj]j]jh6  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $DhxzOhDh*hDhhhhDhhhvhhVhYDxhVVhxhhsDVhDDDDDDzzzzhhhh6hhhhhhhhhhh46vvvvhhhhhhhhhhhhhhhVVVDD6h6hzvzvzvzvhVhVhVhVhhhhhhhhYDxxxx9hVhVhhhhhhDDhhhhhhhxhxhhhhhhhhhhshVhhhhhhhhhhh 66hhhVVh"VhVhVhhhDDxVhhXVVjhhhhDDVhhVhV$=D]4:IWfoqr "#&36k    |j  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|hhhh66zzhhhhhhhhhhhhhhhh66hhhhhhhhhhhhhhh`hhh`hhv`vhhh`hVhhhhV22h`hh`hh`hh`hVh`hVh`hh`hhhh`hh`hh`hh`hh`hVh`hhhhhhhzzzzzzhhhh66hhhhhhhhhhhhh6666hhhhhhh`h`vvvvhhhhhhhhhhhh`hhhhhhVhhVhVhhhhh`6h66hhzvzvzvzv`zvhVhVhVhVhhhhhhhhhhhhhhh`hhVh`2222222hhhh`hhhhVh`hVhhhhhhhhh`h6h6h`6h`hhhhhhh`hhhhhhhhhhhhhhhhhhhhhh`hhhhVhhhhhhhhhhhhhhhhhh  `6666hhhhh`hVVVhhVhhVhhVhhhhhhhh22hhhhhhVh`hVhh`hhh`hVh`hV66Vhhh`hhhhhh`hVhh66h`hh`hh`hh`h)`)`YYhhv`vv`v`v`vZ`Zr`rv`v`V>>Vh`hV`n`nVh`hh`hVooooVD`Dh`h88PP>>Vh`hh`hVh`hV`Vf&Vh`hh`hh`hh`hhhVh`hhh6`6Vh`hVh`hVc`ch`h``h`hVssVssVx`xVssV`VhhVh`hh`hh`hh`hh`hhhh`h`Vh`hh`hVh`hV$$$$h`h ` >`>h`hh`hVh`hhhV$$h`hh`h`h`v`h`h`h`h`h`h`h`h`h`h``h`h`hh`h`h`h`h`h`h`h`5`h`h``h`''}{}hhRREE^^rrhhhh??aaiihhhhhhGGhhhhhh6h\aadd55g'ee``66LhViihhh`hhhVhhVh"$=D]4Kjsxk 4;9=AaCGffnkptVV!#%%     R R"+12 $*06<BHNTZ`flrx~h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`hhhhhhhhhhhhhhhhhhhhhhhhhhh`h`h`/-3 ntz "(.4:@FLRX^djpv|Qknnq~>DJPV\bhntztwwwwt`~~`~`/nnq~ Parab&cyrl:dfltVgrek`lao llatnv SRB 4ISM >KSM >LSM >MOL JNSM >ROM JSKS >SSM > ccmp>dligDfinaJinitPligaVlocl\loclbloclhmedinrligt   (08@HPX`hXjn  ~  ~  !$% F $$XLMLM&   gp5 q s u w y }  - %   ) ! = 9 A E K I 1 M Q W ] U6F# ] ]4T' { [ / '   + # ? ; C G 3 O S Y _6?BF"T' z Z . &   * " > : B F 2 N R X ^6?BF"   }  } > $  w  s  q  w  s  q  O LI LM33f  "(PfEd@ m`,, ~!AEM?CXauz~_cs  :UZmt{ .<[ex{-McyEMWY[]}  # & 7 : > I _ q !!!!!!!"!$!&!+!.!_" """" "-"="i"""""""####!#(#+#5#>#D#I#M#P#T#\#`#e#i#p#z#}#####$#&/&&&&'' '''K'M'R'V'^'u''''''))*/+,d,o,w,z,}..%..'t $DLPCXatz~br  !@Z`ty~,0>bw{0Th| HPY[]_   & / 9 < E _ p t !!! !!!!"!$!&!*!.!S!"""""'"8"A"m""""""#####%#+#5#7#A#G#K#P#R#W#^#c#h#k#s#}#####$#%&8&&&''' ')'M'O'V'X'a''''''))*/+,d,n,u,y,|.."..&RpvnfTPMHGFED64& zWpnePO qonc e_SN>=;964+*(&%#" HGEDCB?><އ~yxwccccPr`  ~b!$ADELMP_fjlpy?CCXXaatuzz~~_&bcrs    !:@UZZ&`m'tt5y{6~9<>@ABCDEFGQSTVWX\cfghjwy ,.0<>[bewx{{-#0M9TcWhyg|y EHMPW YY[[]]_}7l{     # & & / 7 9 : < > E I _ _ p q t   !!!!! !!!!!!!!#!"!"$!$!$%!&!&&!*!+'!.!.)!S!_*!" 7"""""""" "'"-"8"="A"i"m"""""""*"",""-""=##>##E##S##!U#%#([#+#+_#5#5`#7#>a#A#Di#G#Im#K#Mp#P#Ps#R#Tt#W#\w#^#`}#c#e#h#i#k#p#s#z#}#}##########$#$#%&/&8& && 8&& E&& G'' I'' M' '' Q')'K m'M'M 'O'R 'V'V 'X'^ 'a'u '' '' '' '' '' '' )) )) */*/ ++ ,d,d ,n,o ,u,w ,y,z ,|,} .. .".% ....   &'    R  H T V Z \pt `v e p֣  &   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpk$vjsgwl|cnTm}b ~:  yfvqrstzwugf 7X!uu9!{Xm{o{RoZ!=fs +b#1N {T\q#w`j#fy```{{w`b{!{RNNfffHF?{L'oo5jo{-{3=foD7f}s, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,%%I%%I` ch #:e:-hh/10!%!!hsr) @ <2991/03#3#qeR@1<20###Ѯ++J@0     91/<<<<<<<2220333!3!###!5!!5!#3hiiThiih)T/hTaabbNZ /d@9($)%/%$(!$, ( 0<2<1/299990>54&'#.'5.546753.'n|phumdfbdcӿdOTUPDNtd]gp^Vd-.)>B+/Qš ! *9V@/7(" "7(.+  % 4  + :99991/9999032654&#"4632#"&'%32654&#"4632#"&iNMklLNi@s..2H#)iOMllMMk@u--1?NjkMMljO0./t?``OikMMkjN0--uA9*7@b  -,.+2345617B7 1 +"1"!% (! 7+!(!(! .899999991/9990KSX999Y" >54/3#'#"5467.54632.#"3267>7#'&JKNSj抋20ǭAF;}Eap:6\[ț*\,#1h F'XmFD ̉dHG'%[M;I\ 10#+u @  29910#&547u;:\' @  299103#654\<<J+N@,       <2<2991<22990 %#'-73%+f9s9f9PsPbybcyXqy '@    <<1<<0!!#!5!CDDD/@ 103#Śc/dm10!!d 11/03#1fB7@ 103#ymL # @  $!"!$10@////////// / / ?????????? ? ? OOOO O ____ _    F////////// / / __________ _ _  $]]4632#"&"32'2#"M68PO98K7PP78NL0670xx~F &@ ## 1/20%!5%3!!:P6ȪuLJժ#Q@)%%B   "$91/20KSX92Y"%!!567>54&#"5>32uu5dF[pga Yd8ժ.>zO}BC12`tA7(G@)  #)&" )9190#"&'532654&+532654&#"5>32ggfbYhyI'Ǖ&$54zms{(( ۵{fo B@   B    $<291/<290KSXY" !33##!5)!3d-=@"   "190!!>32#"&'532654&#"+W,wN\aQFժ 21%%L$=@#  %"& "%190.#">32# !2"32654&?M0n#J݁%'dkuzl75@%%B"991/0KSXY"!#!5V+N #/C@% '-'0 $*$ "!0991990"32654&%.54632#"$54632654&#"hʁ򑁖Myz{yŗT!Ѳ!!ȟɠbx~~xzF $;@" ""%"  &%1902654&#"532#"543 !"&T?M/nI%'!dk  os'@ <21/03#3#'9' %@  103#3#Śc /Xyw!@('29190 5yR!÷X`y@ <210!!!!X!! BXyw!@('<919055X!R^^="{@B  %%B !    ) #99991/9990KSX99Y"#546?>54&#"5>323#=TZ>/mNb^hC^XE&bRY;X1YnED98L\VBT=/s 4p@1(+$ 4 '$+1+5' ( + . !+ -.5<991999990@ ]4&#"326#5#"&5463254&#"!267# !2kkkk%RӡP$J6l90?{:]x<!o?DF=?z% @A%%%% % % %  % B   / 91/<90KSXY"]@    ]]!3#!#hnl#+{q =@#   21 0!29991/9032654&#32654&#%!2)qﰖ뒃JF{f>p}qdƵϠ1.@  2 10210%# !2.#"32671M[?[MJVXI5))pn))=@@=R(@  2 1099991/0% 6&!# )`dVDѦHKw/N )@  13 21/0!!!!!!vTrwժFX $@14 21/0!!!!#o\eժH7fP<@!   6251990%# !2.#"3267#5!PQv@^PQ_ſCe){KMon56MI!H &@ 1 0 221/<203!3#!#)d+9 %@ 77 221/220!!!!5!!=99ժm,@    51990753265!5!#"&m[hqG`=QQD, @!% %B  0 291/<290KSXY"]@L&&6FUWX dzy{ ',+&:IGG[WXXWkzx]]33 ##wVhs@ 141/03!!dժVy @,  B    / 0 91/<290KSXY" ]@$  &)&) 6968  ]]! !###V+'F m@B10 991/<2990KSXY"]@&)&8Wdjuz &)FIWgh]]!3!#3+3u\ #@ 2 62510#"32#"32IIz~u+@  2 8 3291/032654&#%!2+#ꌝL/ϔu\=@   2 625999919990"#"32#"32ȗyHdIj@8  %%B     21  0299991/<9990KSX9Y"#.+#!232654&#NnRٲM{cݑohy]ҔYJ'@=  %  %B %( &919"0(9999190KSX99Y"]@ ]].#"#"&'532654&/.54$32\^mjikshulм V;53#"&'.  yVWx! 9FBjiCE:= m];<<;\lh?;::;>9L@)%%%%B/091/290KSXY"%3#3h_KKѪ++ @D    %%% % B    /91/<<90KSXY" ]@^ //+ ??8 ZZ  &*%*(+ % & 5:5:;: 4 6 TTZXWV[[RW X ] gh yvy v #]]333# #ŏӬ߿ʿD"+w @K % % % %%%% % B   ;/; 0 91/<290KSXY"7]@8  '()& X xyw !%+% 5UYX es]]3 3 # #VHNAu3B}%Y@.%%%%B<< 9991/290KSXY"3 3#%lk!mb E@%%B/0 991/0KSXY"]]!!!5!" ՚ow@=210!#3!XfB7@ 10 #%mZ@=210!53#5XޏH@ 91290 # #Ȳu-m/10!5/mPPf%@ <1K TKT[X@8Y0 #fx#{ )n@*  ! $   D >*22991/99990@00 0!0" ]#"326757#5#"&546;5.#"5>32=zl;^[fX=& 3qpepӺ)Ld_y64''RR2X 0@  G F221/9904&#"326>32#"&'#3,fd./xRXWS%{/@   F210%# !2.#"3267%JR%QNI]`A9++88*,A:;>{0@G H221/9903#5#"3232654&#"Z.deCSW;7W {X{E@&    IH991990!3267# 32.#"X㿮Xmi[ ^Z89++9 @Ţ'4@     <<2991/22990#"!!#!5!5463'cM+Qgc/яN{H{ )H@' '  $(*' G!H*221999904&#"326#"&'5326=#"3253ZLSbC,ml/9.,}^\::VZ,@  J  F21/<990#4&#"#3>32jq1sJ`cD .@ L LK <<1/20!!!5!!3#mnm`/BCV 8@   <2991990!5!+53263#XZZӜ} @:  B  DE 291/<90KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb{ZFB?  &@   L 991/990;#"&5!5![Y饵|~mo{"@'  MNMNME#K TKT[X8Y<91/<<<299990@G000000 0 0 ????????? #]>32#4&#"#4&#"#3>32"iJo5FP;9JI9!c?LeHEws{p{``32jq1sJ``cH{ #@  D>10"32654&'2#"hڜ-.VT{3@ GF221990%#3>32#"&4&#"326w.df SWWRw 3@   G>22199032654&#"#"3253#L-ed.+SY7:WSj{O@   21/990@%  0030@@C@PPPP].#"#3>32;zI.Dv6y.*`w"${'u@@    B %( OI"E(99991990KSX99Y".#"#"&'532654/.54632OS}{\JSjgTzEZ9..QSKJ#}##55cY1!1@  <<2991/<2990!!;#"&5!5!f^^uϪ+|b`>^,@    JF21/2990332653#5#"&økp1qJyaddm`e@)BIE91/290KSXY"']@%]]3 3#dEFr`T` @E      B    /91/<<90KSXY" ]@      &&)&))#, 96993< EI F J VX W Y fifij e vzx| r -   ++>>< H Y jih {yz|  ]]333# #àö`wBfL` @H      B  IE 91/<290KSXY" ]@ fivy  :4 ZV ]] # # 3 ^oo)'`?HkhV`@E       B   IE9129990KSX9Y"8]@v  &&8IIY ]]+532673 3Z.Gc".\mQ\GOLGhu:NN^Nlb X@BIE 2991/0KSXY"8]@68EJWXejuz ]!!!5!-}bܖ%$f@5 %   !  % $  = %<<29999999199999990#"&=4&+5326=46;#"3@k>>j@FU[noZUtrݓWV10#$j@7%   #%#= %<2<9999999199999990326=467.=4&+532;#"+DVZon[VD>k@@k>XXrtݔXy &@  '1<2990#"'&'.#"5>32326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7= @ <2991/0533)eq%!N@*   " E"<<<2212<990.'>7#&5473%C??BI9gg9ބ5(,-("9="+` 츸X>@     <<1/2<2990.#"!!!!53#5354632D>Cs3A,,ُ/яLB /@ (-  * -'! @') -0)$ !'$* xyx( $02299999999912299999999904&#"3267'#"&''7.5467'7>32d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_%@D% % %%B  < e e<<2<299991/2<2<290KSXY"3 33!!!#!5!5'!53%lkVoqZmo#o o#o!<210##  = 2>j@<#$93 $*0?#54&S9akԂ[]=:̭IWW9fqր][<;ȧH>=><''PGZsweZ54m@''TLf{xf[1,pE-Z/L-Z/L?F@aa1<203#%3#?}N1ID@'  &>>2J\ ^,8 8YD/210.#"3267#"&54632'"3267>54&'.'2#"&'.5467>`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZ %)d@6  (&&  #*& (' j kji*22999199990"326=7#5#"&546;54&#"5>32!!|WHi1Rwu3}CD?kdPDN@Ms=@pABtZ\#! {w# /@    v v<2991<2990 5 5L-+-+#RRXsy^@ '10!#!X!^?dm10!!d }N4L@I  ] ] B   A)5)M  \\ [G#X;#Y//29999129990KSX9Y"2#'.+##32654&2#"&'.5467>"3267>54&'.XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJ=b10!!=V+u @ STS 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOpXy.@    <2<21/<<07!!!!#!5!X!dCDLIB}a@WWBA     @9991990KSX9Y"!!57>54&#"5>32eQdR1q?Ay;Jwrnaz3=L$$}k9wuF(\A          @#) & )99190#"&'532654&+532654&#"5>32^c:r;Eq-evnmBJ]b`W,p;Eu2X`lP|yQDJLl?<8?yvcG]f%@ <1K TKT[X@8Y03#fT` L@*  !   JF!99912<9903326533267#"&'#"&'øxo ! &D">K .Y\,T H;8 OOPNLPj; #@WW1 9120!###.54$FfNݸ/`103#`u)X 9A      @  aW}a 12035733!j c)t'+n 3@   jkji9910"32654&'2#"&546!!hfssfeusgʫ˫\{u༻߻`{\# /@   vv <<991<2990 5 %5 +-:+-#^R^  ^R^  Z{'V'{ 7Z{'{& 7tVZ'V'u 7!%@G  %%B! "$ $&# # )"#&999919990KSX99Y"33267#"&546?>54565#53%=TZ>/mNb^hC^XC&DbRY;X1YnED98L\V@T?%k&$ 4u@O ]1%k&$ 2u@O ]1%m&$ 5u  +@ /  ]1%^&$ 3u# +@O#@]1%N&$ 1u +@p0? /]1%m !@W % %%% %!%! %!! % !B     !  PPK/K!"2299999991/<9990KSXY"]@  ]]4&#"326!.54632#!#Y?@WX??Y:Arr@;nlZ?YWA?XXP!yIrrIv${g@7 % %%%B    c /<291/<20KSXY"!!!!!!#!3eex5ժFժu1&d&Nk&( 4uNk&( 2uNm&( 5uNN&( 1uk&, 4uk&, 2um&, 5u  Ic:1N&, 1u+1N ;@!    21 0 0<291/220 )#53 6&!#!!VD}}/`ŕ{HK+Fb&1 3y"+@O"@]1u\k&2 4u@O]1u\k&2 2u@O]1u\m&2 5u +@ /]1u\^&2 3u 0!+@O0@!]1u\N&2 1u +@p0? /]1;T .@     <91<290 7   ^t^_t\t%\^u^uw^ +k@:+)&  *&&, #* #)+262#5,999999991/9999990324&' .#"#"&''7&5327sT sV)+y=g %s9d/NZIn-QUPeQzQQFIRPJ=k&8 4u@O]1=k&8 2u@O]1=m&8 5u $+@ $/ $ ]1=N&8 1u$!+@p!$0!?$ !/$!$]1%k&< 2u@ ]14 @  28  32299991/032654&#33 !##ꞝL!󄃃}/V@1-'!  **.  !' $'$-DF099991/9904632#"&'532654&/.5467.#"#7C:oEBL;lAxC\[yqyrq|d1M*%]taQG_J'8O#kr#f&DC#f&Dv#f&Df#7&Dv#&Dj#&Dt){ C@I=70 6 %C "76. 3@:("D%=/.M/u MCM6+sD299912<2<2<999990@ 05060708]5#"32654&#"!3267#"&'#"&546;54&#"5>32>321xYS\JMWWLepO27Gn 'aȿuc^8>M<[|%!YHZqYa4+#"33)+RNPPXx+'#!?@=Bu%{&hF{Xf&HC{Xf&Hv{Xf&Hf{X&Hj@@]1Df&CDf&vDf&f @@ 0 ]1D&j +1H)@O B $ *'! !'D! >*999999199990KSX9Y"#"32.''7'3%.#"32654&Ŷ"#!H&!!#R-:/(  (-Y,\bPȑ^b n7&QvHf&RCHf&RvHf&Rf+@]1H7&Rv. +@ 0 ?. /. .]1H&Rj +@ p_PO@]1Xyo '@ w <<103#3#!!j!/ +s@>+,&  )&  *&& &,+,* # )#D>,99999999199999990 32654&'.#".5327#"&''m1$eA H#cC')d<]*,g9\ //4o0.0tGGq.78MBz;32#"&4&#"326w.dfSWWhV&\j%0& >$ +@ @O /]1#&D%m& 9$+@ _PO@/ ]1#H&D%u'u$ur{'uYD1k&& 2Zu%f&FvZ1t' 5~|&%f&fZF1P& :K&%&KF1m&& 6Zu%f&FgZRg&' 6o{ ' 0:G @8@]1N{$H@ "  @"   GH%<<1/<2990!5!533##5#"3232654&#"Z1.de5yySW;7W N0& >({X&#HNm& 9({XH&HNP& :({X&HuN'u1({uX{'uHNg&( 6$o{Xa&Hg#fPm' 5u*{Hf&fJfPm& 92*{HH&JfPP& :2*{H&JfP'*{HN'.JHm' 5u+ +@ /]1m' 5uKKQX@8Y@p`O]0?@!     1 0<22<221/<2<<2203!533##!##53!5*ʇʆ*9QF?@"   J  F<221/<<2990#4&#"##5353!!>32jq}}a1sJzz`c^' 3u, +@ O@ ?0 / ]1D7&v0& >,+@O@]1D&m& 9,+@O@]1DH&u&,uFuD&LuPP& :,D` "@LLK 1/20!!!5!!mnm`/B =@!   "!221/2<220%532765!5!#"'&!#3!53#=Ga'&HHAA@-]@QQJKDuuêK I@&  ! <<<<1/22<220!5!+53263#!!!5!#3#ZZi,+뗗Ӝ}/BCmm' 50u-Vf&f&j.'N` @9  B  DE 291/<290KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb`/ZFB?sl' 2v/@ ]1 l' 2vOKQX@8Y@O]0s&f/ &Os' 0m/' 0Os'y`/'yOs 7@   1 4<2.9991/903%!!'7;NwdPo;jnL >@!    <<2999991/9990;#"&5'!5!%[Y饵P{;Pu|~$o/nFk' 2!u1m&vQF&*1{&0QFm&1 6*uf&Qg&Q{`IV=2@  1021/90+5327654&#"#3>32=YZͧZ-,t|6~ij>>WotV{ 2@  JF!21/90+5327654&#"#367632YZ͹Z-,jqFE1TTsTU6ij>>~ʗ[\``21qpu\0& >2+@ O@/ ]1H&R+1u\m& 92 +@/ ]1HH&R#+@]1u\k& ;2Hf&RH;@     -299991/220%! )!!!";(RH=MKF{ 8i@92/ & 8   #5/)#92& MuMCM,s9299912<229999904654&#"265&#"!3267#"&'#"32>32PVWMfRPhgPPcpP/;}Jb04TY/%W & +#T53+)CBDA88>A>Ak' 2u5jm'vU&r5 {&Ug&5 6ojf&UgZJk' 2u6m&vVJm' 5u6f&fVuJ&6u{&VJm&6 6uf&Vg/u&7u&yW/m&7 6u +1~&W 0/-@  : : <<1/2<20!!!!#!5!!/s-  +ժA@B@!    <<<<2991/<2<2990!!3#;#"&=#535!5!f^^uϪ+|b>=^' 3u8/ +@O@ ]17&vX'+@/ ]1=0& >8+@ O@/ ]1&X+1=m& 98+@/ ]1H&X+@]1=U&8t O&Xt=k& ;8f&Xe=&8uu^&Xut' 5|:+1m&fZ+1%t' 5|< +1hVm&f \%N&< 1u +1k' 2u=m&vV]P& :2=&]m&= 6uf&]g',@   <991/990#!5!546;#"+cM=яNQFX%>32#"&'##53533!!#&#"32y,fd.{{aRXWSzzc)?@$   2 !$'+9291/9032654&#32654&#%!2)"#546xxtB>d{f>p}qdƵϠ/Wp1FqGX>32#"&'#!!&#"32y,fd.RXWS0 327654'&#'3)'KKOO{e5Fq>=DEdgh=< !&#"32>32#"'&'#'҈FDDFl,fttttdLL.zYmnnnRRX랝+,S|1/@21 <1@   0>3 !"&'532#"M[?[MIXVJ))gj))=@0230@=<g"%# !2676;".#"3267M[?ZO*ZT3,JVXI5))p*32j>5F=@@=^s!%# !2676;".#"3267JR%FC=ZZ-,I]`A9++8(8rGj>>~A:;>N3 !#"#546 6&!#FVD6<0c//&r1FHKwN#";5!! $5476%3羽EF5e{ɉ{+ˡd4 32654&#"5!#5#"32_.df,T}SW;7XR=G{ 7%2654&#"#"/532376?654'&'&'&'&32h(>vwf2BFKI I<' )iy|{L (=\RR $+.! -&N +@ 1 3 21@  /0!5!!5!!5NwrT+u\=@ 26 25991@  9905!54#"5>32#"327uVJM[׌~ S@=))yz~#7(>@  22&0)1@ )) #)90.54$32.#";#"3267#"$546IyhYbfgg"{ (({smz45$&Ε?V!!!!+532765| YZZ-,ժH#ij>>~V'$+"!!+532765!5!547676;'a'&QRF1i&&(W%6MI!RI ! 5 3 3325D`H&0tt?uo+EA&#767653#"'&54&#"#367632"&76/JI_BG}MKUv14IBe``  1:!5!!;#"'&5=,-Z٪\Y+z=>jf!!3!!#!!5!!5!!= 99ժi@n67632'&#"##3i~\/j!-<BmV c3r%3sh5476;#"33 ##YZ͹Z-,Gbij>>~ZFB? ;#"&=#53!5!;+[Y饵 |~ĎɎ1m% # #''3C\P"Pn@Jo |mo"%#"&33265332653#5#"&8"iJo5FP;9JI9!c?LerHE! s{ p{+`=R{#4&#"#3>32jq1sd``cu\  32'&#"32767\:DC; 9CD8 z~{{vu'y2 {'R-%63273# &#"327-N5>o毴o8=yy=Y+͠v~^VR{ 763273##"'&7327&#"VPeo~簵noVAA( /s%+n+͝u"mmB8!+#"#54763! 27654&+Vn]6<0``~'R@]M//&r1FRQE8DVT*3265'"#"67232#"&'#76;#"w" . [f,?N͹ /2FIWS.O#.+#33232654&#N76SٲM{cݑ77hy]ҔYJ'>323267#"$546?>54&#"iV luhskijm^\''Ƞ/ vp{DI--յ1#hcq<;{'>323267#"&546?>54&#"PZڒEzTgjS썉J\{}SO9!!1Yc55##}#JKSQ..xmvV[!&'&#"3;#"'&5# 54!238!n|wx'%dQW/R5-0A3=g)(V\`@oV !!;+53276=#"&5!5!f^^uYZ͹Z-,(Ϫ+|bij>>~`>/&#5463!!#ŃF1-/7&r1F+!!;#"&5!5!5476;#"f^^uϪ*YZ͹Z-,`|b`ij>>~/V!!;#"'&5!/s-,-ZߥZY+ժ~>>ji? '8v'q'|XdJ##"47#5! 54'5{no{x4xn8!L IL*!"'&533254'3\Z,,Zxznjf?~>> ILɸ#367632'&#"kSHcm.-PKG "(3t*b7m*9 Vm+5326?3 67632'&#"nQGJ|lLT3!;^2Q+31705+h:=HTN~) )!3!#!!5#5!!uP" "v՚i@5b!!!#!!5!5!!-8YbҖg 7654'&+5!5!2! $5dc{dd\^rhbVPKKKKIJG8+lh3! $54767635!!#" 76RUci r\\dc{dd݊hl+8GJIKKKK}LT` 5!!#"3267# $547676peje]\dcmTjdc^QVbܨ JKKK21%݊hm*8V$` 2767# 4%$54#0!!5! TMOQWPVa ejo0, 5%b|8d1a# 6323#!!5!5!67654'&#"п -"BP8u~i9Dc``JU?T<>< % 7654'&#!!!!2! &53h<= \^G/"icUPRz,ʞ[+3IJ I8+le[tG)}LT` 7654'&#!!!76!"'57?\]ȨgcUQԪ-5IJ,39+lhJc 4'&+#5333#!"'53276MJY>lunc9rO_}nw~FVrA}Vg{#36763254'&#"64QҸMNr98xܭz BR1pqWBA3#+9'6-3!!!!#!5!5!5!^^``l%m&$ 6u#f&Dgm&, 6uDf&gu\m&2 6uHf&Rg=m&8 6u#+@ /##]1f&Xg=' 1&8i2&&Xq<=' 1&8 2&&X<=' 1&8 6&&X<=' 1&8 4'<zW{%' 1'i$#2'q<%'i& :$#2'q<0' >)&fPm' 6u*{Hf&gJm' 6u.m' 6uNue\&u2eH{&uRue\0& >eH&m' 6uy}LTf&g7Va&g#fPk' 2Zu*{Hf&vJ=%2763#"'&5!#3!3m6!h9Hն+ROf'MSb9du'Fk' 4u1f&CQk' 2u)f&vk' 2u/f&v%k& <$#f&D%m& 8$#H&DNk& <({Xf&HNm& 8({XH&Hk& <,Df&m& 8,DH&u\k& <2Hf&Ru\m& 82HH&Rk& <5hf'Um& 85jH'U=k& <8f&X=m& 88H&XJ&6{&V/&7&YW}RT. 56$>54&#"57>54.#"5632 4o1\}p_s54&#"57>54.#"5$32Fp>!BlJc(v];?"AW?-1CA#E ptgDZX%KlaF='.`[b[3XpVU 32=t|6~kWotl(1%7276"'676#"'#7&/'&'&3232654&"m B{ rhG0wD &8Md\]P{#looԐ>>t#O9 Y%Z5H7WSCTV!!3+53276=!5!"YZ͹Z-,՚o*ij>>~Vb!!#+53276=!5!-}YZ͹Z-,|bܖij>>~%%P& :$#&DuN&2({uX{&2Hu\' 1'i2H2'q<u\&2' 3iH2'q<u\P& :2H&Ru\'i& :2H2'q<%0& ><hV&\l %7276"#7&'&5!5!676#" B{wD3' rhF>O9aJwt#jlf{.%7276"'676"'#7&'&=4&#"#3>324 B{zgG1wD3'5ZI9!c?98>>r.O9aJs{``>t#O9aJ;>V` ,@   991990!5!+5326XZZӜ}xY12654&"&#"32>32#"&'#5#"323QSSQPQRRQP]=zz<\o\32#"&'#QSSZQPPSSPP]=yz<\o\GJR\D%QM((_]q"! ^`A7S]++ L8 rMq;> 3!!!!!5! d iA!#!5!7##'-.d'Jug[|BJ8jF{5.#"3#"'&/&/5632654/&'&54632OS}{\Jvh*L'TrGY3e2{zD>zEGIZ9..QSKJ#}^R ~$=&[5#`cY1!GJ!b!;#"'&/&#=!-j1 *L4[TrGY=Zb ~$=&[?%7"#5463!2##326&#v6<0~'ʌ//&r1F )533!33##"&'.=)3267>5~9FBjiCE:  yVWx! A?;::;>`m];<<;\l9 #3#i++!!2#.+##5332654&#LN76SٲM{cmˉҔ77hy]w{.#"!!##533>32;zI[M ܹ.Dv6y.*l\<Ĥw"$8{ )32654&#"3>32+3267#"&'.>zl<^\fX<& +qpepӺ)Ld_y64''RR2{{0@G H221/99053#5#"3232654&#"Z.deэSW;7W Wy 0@  G F221/9904&#"326>32#"&'#3.de,-xSWWS^X $9@  !G! F%22991/04&#"326>32#"&'#46;#",fd.̸ZZ/xRXWS~Ӝ}}{0@ <1@   0>3 !"&'532654&#"JR&PNH\`@%++*,A:;>s:{!)47&'&!2.#"63 !"'3254#" 90%QNI]cU-RG+>jiáS,+;7W{7 &32654&#"%5476;#"#5#"32;mjkookjDGH8H$#${PϳQ{#T ij>>~SW;7WSzW{432!"&'5326=!7!.#"z [imX^^"++98ȷzW{?@ I H991@  9905!54&#"5>3 #"73267zXmi[&Z89++"Ƣ{ )%654'2273;#"&5 '&'&'& 56BL+>w9P!1jcGF:“֊>8E#ZuaQ`vg("chV({09@ 22&%!*2 &.F110&'&54632&'&#";#"32767#"'&546wA@Q[\ihWVLHHZ[c[[MaZ[V_A@^  VJ=+,nQb54"[\m({(<@! #)) )& )190#"&'532654&+532654&#"5>32U`LdKhiP_m"#ibQnW=JV^8{B#"&'5327654'&+5327654'&#"56763273;#"'&55c88hh@H9DDKCE@?qv|f6688h8AANODE<[KO 0A=1_JJm\["45bQ77,+=J++  OAf10`ZȢA"y( !27654'&+532764&%632#"'$Sv<;;!!;yUkbbkˠU^A;;LL67ss.gg=XVq^!+53265!5!!5!qZZh(Ӝ}}ؤg {H4&05476;#"#"&'5326=#"43#"326HH1:hh>CO6xn#{XЮmssngn^ ij>>~.,}^\:<bH4^ $!"326#"&'5326=#"4763!|LSbC,muq9b.,}^\:ᥟzX %#5!#"!2&'&#"32BHXN,>hhxpVHdbbd">:KMrqfqrfQk^".5 3 3265+]ܞ^+ r.$a32#4&#"#5476;#"}2rjrZZκZX `cJij|~V(>32+5327654&#"#5476;#"}1rX[̸[-,jrZZκZX `c6ij>>~ʗij|~23#!!!!!5!!5!! bnnl~ ˏ5i ^!#"'&5!5!; ̦ZXXZjf;8~|2^ !!!!5!!nnl^BXy&;#"&=&#"5>32!5!3267#"'.H>ꤶ./OINS)&r\FJKOUi(? ;?<65=>;7-4 ;#"&=# 5432!5!3#'&#"3[Y襵>5*GN\|~ܽ󠠄K9V  ;#"&5!5![Y饵|~(L-;#"&5#5!!2#"'&'532654'&+5!HHTgOE@KOPUCWJJX|~A$8+lh%12KJhj{!%#"&3326532653#5#"&2"hJn4FP<88 d>LfHE!s{p{`LfHE!s{p{)32+532654&#"#4&#"#3>32"iJoSN5FP;9JI9!c?S,5HEcԜ|~s{p{^^@;#+VM{+532765367632#4&#"{5D1DCWVV\^oA@01re22wx\__V{ 4'&#"#3>32;#"'&./]p@A2XVV?4<>OO__^edwxH10``A{ !3!##{yyH{  #"%"!&'&!3276ߌH?7?H4HH4{-m__mOmmOE`!!!!!"'&763#";d~~~~ KKKK`hghi&{.4'&#"3276=332#"'&'#"'&57!29PHJ|")u) }07_CC_vD8@jxZqosO++Oz2ee2z| VH&/#5!#3!535&'&76767654'&_|{_hd{{dE,HH,O1HH1ouu{{BnmBHImnI^732653#5#"&';zI.Dv6.*+w"$732653#5#"&';zI.Dv6.*w"$fV^;#"&=#"&'532653YZNb.Dv6;zI}}w"$.*+jV{.#"#3>32;zI.Dv6y.*)w"$jV{;#"&53>32.#"#,,[.Dv6;zI[[}?>rw"$.*ll2{476;#"!!5!RRҼj&$pnhb`022{!!5!4&+532jnnHlдRRV``bzW^!#&'&+#!2327654'&#7545â?;;alkpw?@@?w 66^q$%'^NMi++ST**zW^!#!3327673327654'&+jpkl|a;;?î545(w?@@?wSiQP^)%$q^667**TS++V{8.#"#"';#"&=327654'&/&'&54632N[DF20@RRz|hj&"nfdbbFF24@LLf?((**T@%$!*MLZ[705-,QK((%$JK}VT+5326546;#"ӳZZcMӜ}}¸Qg}VT!+53265!5!!5!546;#"4ZZ=cMh(Ӝ}}ؤiPQg}VT^;#"&54'&+532'&cݳ--Zg() |@>vV[!#"327673## 54!3476;#"8tn!ʷ5RWQîd%'3A0Ǜo@`\V()g+`!5!4&+532!!H^^uϪ+>`|bW!!;#"&5!5!f^^uϪ+|b >`!533!33##5#"&=)3276:CYYu>>|WMĤ45wEioabdo?ܤdqnܑkmhAw` !+"'&5#5!?27654'&'&UBr86FRQS&(g3XXBO\Ldqn``;612abdw7,H`!# #3T`` !# # #33”­jj`jH >;#"# #4N|lLT2"zHTlfk}3 3#f%.]}8 V`!!;#"&=!5!;4z `ۧ10%*`!#47!5!5!332!'3254#ejL<FX3<;4% 6[}LT` 2!"'&'5327654'&+5!5!ajbVQ^cdjTmcd\]ej8*mh%12KKKJiLh`$- 76654'&+5!5!2#4'07&#"327* \^ejeidTQ'd( }ŃcL;*1JJ$8+lgqUeR8y*K/K327654'&#"56763 #?W::fPONNLQQUmlprLbAr+#}swt#&'&5476!2&'&#"3ʪplnUQQLNONPc9:Vws}#+rAbLr3!"'&'5327674'&#˪plmUQQLNNOPc9:Vtws}#+rAbLrJ#476!2&'&#"32767# '&5nUQQLNONPc99cPNONLQQUn>}#+rAAr+#}_-sB (47632 7 654'&#"47632"'&_ԚO̵eddede"!/."!B^!"5Ԝ0ٍccƍffff.""""./B!!} -@   F!21/9032654&#32654&#%!2#!]_Z^UTTVeb`sci?\dU?.Vi}u"y+";#"3$''"'&5467.5476322s9@< <@7uTxVddjbbjdd6=76NJ@6sx>WVggWV6l0%#5!#"'&76325476;#"#&'&#"32t:{}|3H >ws}#+rAbLr #26&"3!!!+5#"32deen a^!;8NN8:j+^Lۓa31DD10ML C3276'&#"%#5#"'&76323!2#"'&'5327654'&+5!22XW3223WX2o#55JzLMMLzJ55#o ?M;319;<@3xAr;<78chqjtssttss_3d0110d^L$8*mh%12KKKJ6 ,326&"!5!332+#47'#5#"3233254#dees ai$\\#jKyyKj#n0 h*5j 3.#"#"'&'#"&5#5333#;532654'&/.54632/e6RR;Y%w026:8>qaQQo-Ek>v;NTj&g[{=l?((TT@I!,KL!&`>NM55YQK($)$V4%.!5476;#"+53276=#"'&5#53!3A &'p.6@3632&'&#"632#"'47&'#"&5#533254#"&57#3uZ310.///0l;;;2v1+\!raQQ$-WO=MT-E‚#+qrfr9DhT"2`>9KiNVH3+5327654&#"####53546;#";67632G11l?KJYhonjjhqij;/m(56Ft<;H``01/яNPhce22wx%7&'&#"#"'&'#367632327654'&/&'&;>ABgf$&n/<>][ALODKTLDCKEJIa54%"092?)TT?&$!,KL\[&:MV3-+RK(#*$JA 3!!!+ۊqvLۓB 333# #333# #ttttU=B!#!#!#!#kkUXrXJ 4&+53232653#9O%5zpcęaBþybV "32653;#"'&'5#"4'&+532Zgo0>*m/2O?*mbþyf\gę10A @ 32tNN^luu)qJy}wYYk\g88A3>32#4&#"#5476;#")qJy}tNN^lu43rB98wYXj\1Sw66WU 3+532653#wtgr,B0ttxlX6Vr8.#"#3>327.bjtt%uT  qksa97832653#5#"&'.bjtt%uT  qkJa97Q32653;#"'&=#5#"&'Q.biuB-r33$vS  qkJH VX66x a970!+33276?3327654'&+CGDDuj=%%(f{n!!!|K((((K|N;[--s?5/.B 333# #tt+5326?331]O\D05 {{bpEW(K/itf--452654DŽ@XX@rPPPP=>X@?X=>POPP"'&4763"3tPNNPt@XX@PPOP>=X?@X>^s327654'&#"567632#(y6$$>q31210336WEDGkM@*7K$@ ` XFh_@C^s#&'&547632&'&#"3kGDFV63301213q>$$6yMAmC@_hFX ` @$K7*@)f7@  91290K TKT[X@878Y3#'#f)f7@  91<90K TKT[X@878Y373x$@1@0#+=b$@1@0%#+=/#!!heJ'#!heJ#b#c>U 533##5#5uJu!5!J>ߖ/)HDV{ W @  P{P10K TK T[X@878YK TX@878Y#"&546324&#"326{tsst{X@@WW@@Xssss?XW@AWXu"  @  |1/90!33267#"&546w-+76 >&Dzs5=X.. W]0i7@!   PP99991<<99990K TK T[X@878YKTX@878Y@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@Z7JQ!7JQXfs%3;!"'&5k&&iWRd10`ZȢ% '&73733256/MMV| ;#"&5#5!88hr.EGWwl:Q[v/).#"#"&'532654'&/.54632P1j8WV>](}248{D@}=RX o)k`@q a//$)*+MWfk2-*SIXa #'#37 ͉H+^s#&'&547632&'&#"3kGDFV63301213q>$$6y[AmC@_hFX ` @$K7*@,X!!5!yЈ,X!!5!34,X3#!5hh,X3#!54,X%3!5 DfCfv)ff7v=b10!!=V /)H @ PP1<0332673#"&/w `WU`w HLJJLD@ a103#?Fj82#567654#"56J24C1xZ@Vƪ@$C!Xl05^ V{tXf%@991<203#3# fx)fg"#DVv'4f#!#͇fxx/)'sr/)H >32#.#"/ w`UW` )LJJL" #3ﻒY#55#53pp{53#3"pp{f3# qfyX0CbyX0v53#5#5L:#33T걈s^p!5!#.q532654&'3#"&=X.. W]0ihw-+76 >&Dzs5  "&463"]]3GGlbbG23GbL3!5353:^H#5!##걈c_I #53533##sc^5!tcV %+53276=YZ͹Z-,ij>>~V 73;#"'&5,-ZͥZY~>>jic/@a103#?d.@ aa1<203#%3#@ D  1  0#"&546324&#"326D]\\]bG33FF33G\\\\2GF34FG;@103#ﻒu)8  @ |1/90@ IYiy]!#"&'532654&'85xv-W,"K/:=,,>i0Y[ 0.W=u#u $s/#DU|/#5!#|J9X#"4533273273"h;tv gfv ifvtR)@  91<90373x)@  912903#'#m/8 @ PP1<0332673#"&/w `WU`w LJJL/: #.#"#>32w `WU`w LJJL5@!   PP99991<<99990@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@X7JQ!7JQ=/10!!>VєmB]Xy a&h!5&hhh5!Ĥ/'\ ]`LM'ogDdFFJ  26544#3GG3]]lG32GbU|3!53UJU |/!!|&b9X632#&#"#&'"#72h54'&' RJ 6"RH 0PQn +0PQn  &Ds7"#4%62#&%n~vv<<tf3AntVH%#AnHV #"=3;X3Vh'fv?F&jrf&>/`yNf&DHf&f&D\f&pf&f&6&%$q%sI%1/01/0@%%%%% !3yyN(=H+u\6@ 26 25IJ]1@ 0!5!#"32#"320qYǪIIz~,.%0/01/<0@%%%%3#3#+#Vy0F1H (1  <<1@   /0!5!5!!5HA)Aժ9u\2HUu3xm < 1 <21@ /220@% %%% !!5 5!!9" :A@/7%<uZ&/M@"2  &,2(0<<2<<21@&( '   /<<2<<203!535&'&547675#5!67654'&'Ͱa|{aa{{bL+CC+LL*DD*+v[ssZttZss[v*DD*7*DD*;uZ9@  <<1@   /22<<2067633!535&'&3I.K{bb{L-I["WDWx ֪ WW"J@@qqro prol 991@ /<20353&5323!5654#"J{n !o{1xx 7oȼ߅LI LN' 1u%N' 1uFf&(f&Vf&6f&3i& Fy *'&'&3273;#"'&''&'&767,-b=MJMUHi;c( #) Xn^T).\-rv~ oik*%1)0T*XmY*)Va!%#54'$QQ 0kEb6=q'0  Vm`&+532 3#-^1FAF[D~S]VH" 4"32654&%&'&54632&'&#"76hY(>f2BFUR I<' )iy|{L (=\ $+.! -&({R&%#457654'&# !5!OTJPE* :Lf.,KOxsPWKL,#%5,*3eaZiV{.@ J  F21@    /90#4&#"#3>32jq1s```cH9@ D >221@ @]0&'&#"!32762#"?HH?5@HH@<⇙8wyvs6`@ 1@ /0;#"'&'#5"$lYoRQ`+.0`b;`D # #'&#5~J/1Fe<2T`wtB`!367676'&'31!xdLjE.*{`T|p5dwY|rNįtR8&%#457654'&# 4%$47#5! OTJPE* 9MKOxsPWKL,#%5,*p$Rݿ &H{RP`!#3267#"&5!##P117,#J%q\T`PH? XVT{.@ G  F21@  906#"&'#764&#"326ttf,n䇅{WS<R%{$%#457654'&# !2.#"OTJPE* :%QNI]]^KOxsPWKL,#%5,*8(8*,A:nok` 2@  D>ij991@ 20"32654'&7'"763!aFH<Ηr{sPSے-- 2^!@  1@ /20%;#"'&5!5!!$lYoRR0`b3i`%27676'&'31%"'&5#5!tZ;jF-*RR"#vfwZ{s`b;+.0LVh )O@ '#* KQXYԴ0'']<<Դ0]1@' *2<220"27654'&'2##"'&7673A\VMMG*w|~~hA1LLNeˑRh]c[斘n,mKseg.YVx`#&+53 3;# t/1FC /1Fz ~,~VN`%67653#&'&533?>TyyT>?@WxؑoW@F`&#"&'#"'&37676376' 2KUXK2~)@V""V@)~`{gLHk{A>oRyRo>6&j3i& jHf&3if& Ff&$ # 76'&%$'&763 '7676] NI5|utf M2C6R6WpA{z Ʋ itR$ $6'&'&'&7!2#"'&32765JgNn-R Nr^ydPpw{A K~}Sj~"#4''&5676'&qO**d\txLJso@z8 vVOv~*+40r51_Tpf&"N& 1umVd'#&'&7673567654'&'ĸh]i^V5RR*aW4QQ(VyvaxxGnռFCImֹD9` !32376&7%&# 67#5!'TQ0'( 0A_+T3 4`/&'&7'&7676'&#"56776327'5!`ȍ=`[+9[R~!*`ȍ=`[+9[&͘7 cl|YDT|˩hl="pl |YDT|˩hlfMZuV\ #"32&'&32_{|^"y|•"jVH{ "32654&#&'& h1`{{_ mw.vRL#"32#457654'&#"'&76)MbzYTJPE* 9{2e+wTOxsPWKL,#%5,*˞nͱR)`#!"#457654'&#"76))I]]_bNTJPE* 9ۓ eUlnoJOxsPWKL,#%5,*8(X)V#!47632.#"!!#"&'53276`1c3$R,x:KAb9f.1d0W@Rd>Qoɏ?s!K_`7"'&76'&52n 'BQ_'BQ_[~,`*l#FR`*l#FRM #!3M&pM]!V!#56#'0#0?&'&bTB9[@[`7"7>9[@[|"O z:6hl0%[Ml |"Oz:6hl0%?[MVT{ 7636#"&')! $&#"32nttf,hՇ<WSs)%{FVMu\&'&#"!3276 32 5DC6 >BCD@qopުՈOz~ {!&'&#"!!32?# '&76!2 %%cjf_[_fMJOhk en(' c\\c(  {"056763 !"/532767!5!&'&#"'(ne khOJMf_[_fjc% ؜c\\c VT1&Vy ! !###V{+'`VO` !!###`{`UVT{##5#537636#"&'!&#"32wiinttf,;pp>WS17532#"5>3 !"&IXVJM[?[5=@0230@=))gj)1&/y1'yc3Nk' 4uKNN' 18uK*o/32654&#"##5!!676767632#"'4=N qjqjW.E~C%0"@X UkiS*\o-* % T pFwusk' 2HuI1L@!21 0221IIPX@8Y0327# !2&#"!^?s}RooR}J6,N&< 1u+1m-%326&+32+##526!Z}y^ϬvH+W"%32654&+!#3!332#!Z}x_uwg)9dqco"676767632#4&#"##5!%0"@X UjqjW.E~-* % T pΗ*\o-k' 2uPFk' 4uNhm& 9YH 33!3!#)v++B%$q2@   21 0291/032654&#!3)!qﰖE{e5F{f>dghq%s141/03!!/ժ!0@  1@ /2220%3#!#32!!3!7yŪM0'TB /ѪBL ҪN(x@   <<91@ B /<<2290KSX@ % %Y@ I:I:I:I:I:I: <<<<33 ##'# 3 0YY0S0кv{Z7F <@  B 10 991/<2990KSXY"33!#3+3Fm& 9N.F$@  1@  /<0#526!#v.+W++Vy0H+u\2H@ 101/<0!#!#++u31&/7h?@ B120KSX@%%%%Y+532767673 3;E,LE\mQ.-"X74oJ+'/.M *5>Bg@2  2 <<<<1@ /<2<20 KTKT[KT[KT[X!  @868Y3#5&%>54&'II Ǹ ˥II<{z WS ;P $@   1/22033!33#P)ˆ+BD @   021/20332673##"&nmuz[v~PEx+:r` &@   1@ /2<<0)33333`++</@   1@   /22<<03333333#<ຆ++B u*@ 2 2/1@  /0%32654&+!5!32#ϊ)+An ,@  22/1@  /<20!3%327654&+332#[fN+1@"#( +0! 3 632#"6/&4767676%67䐌x$[3#F#3bJ/P{3-wRIUA   +t` -@   F!21/9032654&#32654&#%!2#!_eUkUTTVe_cmcpPO^UCCVpou`@ 1/0#!6`ih`0@  1@  /2220%3#!#325!!3y-C7 "Ld64d!{X{H;`x@  <<91@ B /<<2290KSX@  Y@ I:I:I:I:I:I: <<<<33##'#3hh`Pl4_P({` =@ F 221@B /<2990KSX@ Y #33#b縸)`)H&n``"@ 1@ /<0!#!+53265 _7#U^`v=` N@B      221/<290KSX@  Y3 3###=ww`M` $@   F 221/<20!#3!3#b縸`9H{R`@F1/<0!#!#bW6`VT{S%{F`@ 1/<0#!5!и&6ʖhV`\cVec@    <<<54&xjjx޸ܸxjj ++ gsL`[|^` $@   1/220%#!3!3^渖L`66b!@   F21  /20332673##"&øknXrE5od]'+}U` $@    1/2<0)33333U(`66P`-@   1@  /2<0)333333#".𨐖`666L`)@  2/1@  /0%32654&+#5!!2#|y֜XZZZʖ;hi` +@   2/1@  /<20!3%32654&+332#S|yS[`Y[[[`;8`*@    F291/0%32654&+3!2#{֙YZ^X`;%{K@  <21@   IIPX @8Y07532767!5!&'&#"5>3 !"&A`^S E^]INQ%R9>;qdRp:A,*윜+N{ ?@#    221/904&#"726332#"'##3pLLqjUUe9ҝ暙?``B@  291@ B  /<90KSX  Y;#".5463!##r78r5ܖaUmV9{Xm&kC{X&kj##VT533!!>32564&#"##@1|yj{яLs`c. m&ivQ%{L@    F 221IIPX@8Y0%# '&!2.#"%!3267%JR%QNI]]E S^`A9++8*,A:pSdq;>{VDLD&j +1VM `%2+##+53265!327 RC'#U^5iрiv;A`%254+32+!#3!3 褽l`9#9533!!>32#4&#"##@1sjqяLs`cBm&pv0m&nC@hVH&y` 33!3!#ø`6 u%326&+32#!!5!53!q zQ533!!!2#!3264&+WH|y͓LΧXZu\aH{s@141/03!3!/2$@ 1/0#!38X`:Us 3!!!!##U/#˂>` !#53!!!!`¸ fs#!!!2+5327654&#/7qohfL>87||9ժFwr|zKK"VR`#!!3 +5327654'&#HRRQn!&&1`GQ``07 )3 3333###'0:YY{ZSS/B0кv;`33333###';M4hhPPlL_u7&Mu({&m%3###33VrwBh`%3###33,bG*B?`/Z%3##!#3!3)˪B9db|`%3##!#3!3ø縸*`Cu1&dWu%{&hw/ %3##!5!!+s-B+` %3##!5!!ø&ɸ*%<\Vt`3 3#\IIT`lD%3 3!!#!5!5%lk! mP\P\Vt`3 33##5#535\IIT`l55%3## # 3 3XfuPHNAB}3BL`%3## # 3 3o)'o*?HkG#4&#"#36?6?2GjqjW.E#20@0X U ڗ*\cU'% T pK,m& 9L;H&lf32+5327654&+#33stohfL>87||wwqwr|zKK"hVm`3 +5327654'&+#33j:HRRQn!&&1'wGQ``07 )&?`/fH%+532765!#3!3HhgL>87)hzzKK_9dV`+532765!#3!3RQn!&``07 `CG %"'&'&5332767653##|#3/@0X TjqjW.Fժ$'% T pI*\z)b%6#"&53326=3##c<1Tsjqø~3$2 #%m& 9F+@ _PO@/ ]1#H&f%N&F 1u +@p0? /]1#&jf){Nm& 9K{XH&ku\QzW{u\N' 1uzW&jN' 1uL;&jl7N' 1uM(&jmy}LT`7F0& >N&nFN' 1uN&jnu\N&T 1u +@p0? /]1H&tj+@ pO@]1u\*H{u\N' 1uH&j1N' 1uc%&jh0& >YhV&yhN' 1uYhV&jyhk& ;YhVf&yDN' 1u]&j}s %3##!!/Bժ` %3##!!øȸ*`AnN' 1uahi&j7R({u\4RwT:`Z1"$/#4'&'3767653653#"''##53 ra{ .r &q,bS !/#12j{@E#$]|0q!<"5DAb1)*5"32767#"'&54767&'&'&76'##53|LAV:218UG&/=8O6-N@?_F?D(7-"Gq/#)^ %$ \*$@.!* n F?\KH* #TH#5DAbZw %3#%3#3#%3#ô ^ %3#%3#%3#3#%3#̠&!#53ӤR@dm 327654'+53367657M593pQf$h?FA@6b !eI(R[2* #53 3#ӤR%@-$%#5754&'./.54632.#"'/XZH߸g^aOl39ZZ8{4<5/VVL89CFnY1^5YVeU-"%56767&'&54767632&767/SD435gcbnZdF31`9:H:ZU!LOTAKv?=0ps2# &%[&$r 3# E' D, S' EqE ' E SE' F SX f' D X f$$27'&5767&X$JԖ`e_'@5 ^vbĘe4)X ' Dj%67654'&'3#"'532T! D' DU $?%#"'&7673327676'4/37653323#"'&' &!UNBAE3I0<^yM\dsቬ+;H2zm^\꜑#P}g£x&R" C~m8($' Fc  =%327654'&#"67632+"'&5#"'&5473767654'&'3HIj($@GgLK1ZX%5,0.3cM[|dh<2=B%A !  .DF-%!mNH7(M' DO   %327654'&#"!#53367632,Ij($?GhKL1[W~.DF-%!mNظ\wLR! Xn*' X &/.Q&+8O\79LK5:,]-#4CK%63#"'&&733276u2lecw@A(IiTcI9(jzG1H*V\ss~B")T.327654'&'&#"&#4763&547632#XzL,5;(.;Dn2KxAZM\MObxX'*9:X DD(NOf7*(?$S-8AP6`' D ]"327654'&'2#"'&5476B!799[]KB{ƶ`Q%T*WE{R,,9.UMAx|KU#JNL 3 &"4'&!5 767&'&'&547632?,3/V%.-js1v-3t9>YH9!$7+(;ڮ.TVLh+bZ3[f5%#"'$47332767654'&'&767632#4'&y]H?BKSxlkA;"b^M`72'#}[7 0&huqc-##NG".*3:,=2IB="9), g:^M ' Er D5%5%DHHnnnnD&567&'&54763233"/#"'&5332767654&#"t$!lD?I'8 .4LT^s7Z $08 " ,d$* 9^W4'6O'&n=NV)qaK" %D5%%5%DHHnnnnnD5%DHnnD/&'&54763233"'&'#5276767654'&#" lD?I'8" +EɓV  , 8_W4'6O -n=*{nmp" %D5%DHnn0('&54737676537654'3'&x!9EO)"a 2=`KG g&ZGM'DA2omb}8T"RY$6s9It6X !Vz 4&"2>#"&4632XXXXztrrt?XW@AWX栠732767#"&'gC*6:*kWZZB6"D6{S )L}@"Fw5 5\v4373ŠF3#< !#'3<&1yI !n8#'337673#" &1CRz6 *boajr!nUPymL%#'37676537653#"' &1/(0H/<(F!34.5WY9!nr|> @2%,*;l>3  *"2767#"'&54767&'&'&76`yg\NNYp0.VhG hRcpl?AOXj<9U9iDGTOA7.?#ou\N/ b \^xH a8' OC&6F('&5473327&'&5476&'5#"'767654'&#"%327654'&Cv-(;G--0M,Q;(J$"':AGb 41~!$@K5:,+  iEN@TSZ 'C49g=ql@H=.%4-+#%v%'r.C!0B7,g`o6oU%m`m!3/AbM3))I~R.~R/00>d{*>@ #% +BA?>pпQQ9l,"2"54767$32632&#"# '4%7654DҼJPi?3k]KM?oabu;\SfaƎ:F78UyP8327&'"'&#"%47&76$#&67 #"'632Y60I616*, !*:9u`0'"/6OAK %[9.ȵ!463 #"&'7325#'&&7'6et !yCBBquЍ h! ACBB|U )"32654&24''&5432#5476n$ % *|{e6Lj` %"%:yx~)RhKK>a 9"32654&&5456767$ 3276320! 54-6546$ % #vdz]#x.>r>>$o %"%}@~Y9peDQcFlWNn-7Vs\ ,2654&'&! 3%$4567&7'7$!% /@l~.ZA $! $?=Qm.uG4 {V{,@ //1@ <0%"32544$#"54$76f@@@)@@@@Pyxo *%"32654&"#" #"5323272#4#"$ % zw6^"$J7f %"%&PW0>{#$"2"22#"5#&567663 #4#"&퀀!7y{^܀ݹIedm%jh{'>@ $/<@ )1@")<@ & )<0&7'64323254#4%$7"6CBCbRBCACKؼJjeh0KT 24#"53265$54767653!"'#@>z]U]xTrs@0egu/ss}T|"247&76% 3%$Զ%< &Ѩ'LB}T"247&76! 3%$Զ%< &Ѩ'hBc J"32654&"32654&+&'#"'&5432'3253765&7465&'7$ % $ & cge~PLfrtгJwT\U &"$ %"%IJTObo;4ˋP6A^g[oPIcb$0+&'#"'&5432'32537653"32654&b\U{cge~PLfrt$ & ,PIIJTObo;4ˋ %"%el} ,"32654&2537653%&'# 47&76b$ $ 0nuhigeޘ %"%4ˮ/IJ=%ۏel ,"32654&2537653%&'# 47&76b$ $ 0nuhigeޘ %"%4˯IJ=%ۏ``3323!"'#"543225cиx)3Ɯ)`,88{s\ ,2654&'&! 3%$4567&7'7$!% /@l~.ZA $! $&=Qm.uG4 dm +"32654&&! ! &%$&7676=$ $ W6tm2JX $ $8${{N&ap .%"32654&%&'&'&7!2765!"'676F% $ WD NbfP'G!$ $TrJco<ob{"326! %&$'423 54! P@@<)"FTY=Ib" 2:%"32654&%!$76! 6'&'7%&'&'&7!276 54! H& $ JF r cXD NbfPt!$ $=1TvTEmMd 6"327$"327$7&76365+&7632676#4#"A?A?`ƾ5@VC?/@@@L@@@E>/} cbWZwj %-"32654&7$%&'&763 54\$ %  ʪ=A8)SUB<S %"$36H9G)#$67U 6"32654&$'&%$76!232'&#"%$'&762$ % T\oEh@MqKUPn^ %"%+DYl0yP^d6Qqt^}]F0&$"2''&'$! '&5"32?6*ʁ+=x #esZh N)=md[d'nnu ! &7623$54'74"m#!AVB8?kP$U.F~>=!{ ##"2#"5324#j=;C>{jVnn!r&o~/S~i! ! !5 74! $&>%~?>~Si! ! 3!= 74! %&>%~?>wJ~S~i! ! !5 74! #5$&>%~?>~NSi! ! 3!= 74! #5%&>%~?>wJ~T3"36654'#"5432AA\(DeN[̼o[$N[ux"325"547&5423253,r>Jm,Ws> [yu?{EBXFE '656%"'&76! 4"3VA!. {x9f>.`h>4A?~= h\$kb8:;-F_Zkf2)I 53533##5J؎؎؎xP;r 432#"324ЄLT3z! 473! 4'$331=PU~iibcWOJf34! %56'&53!! 4<1~k  !TxY9vwsknWa!%! %674#"&5! % %a lշ._z-FH+,S.+RLo ۤTnB7W !,6752363 ! 54+"&$54+"32(TX[P<fI+yhZtԕGw, bb+]mLVW3! 473! 5 &5 3I%$&>8 wjs oeKrdW2'! 673! =4+5374# #&5! 24:ip II-<-]mxRbXxR~X{\+2 ! 75&7!  4'"6258TW\F ;IJ:QU-\p!7 %#65+"! 5!2363 6#&32Ԅ!S}GJtAFWHCBuccyi2#! #&! 2Ɣ#cZY4! 473! =+53254!5 4C(pbAAZZwfq211W2 #&$'6?! &65l_$^M>p v\Y1xOh_[ )euG4! !234!#5!  ! 4E%D˼  }>>&T2! )!"363! %22:M#@͹$[ڀ g7 ##654#"#4+"#&=!2363 K@BM{hIF`fhh&4!! 473! !#53274%$534D'e[?RܬW&Z~IJȕ!6G))=iY32! 3! 5 '%5%30>'Mhko 4>>HS2>+3|'! %!5!$! 3#3%! ! 5)54!  I8<rrr OfkQؔc7X!,!"'#!52'4#&3$5!23634+"32~ Mas1D>3LIvjt| ٔxukYf!! %$54#"'! ! 4'7fGD `U6I@bYsrg8A:ԃM){6\lY4(3! 4%7%#"'#% 3! #>U&;3̿0?7YpnWc$!6=3! 47$$5! nڞòd?;kHuLL8TWJ&)*y54&#"'675&%'% t_CCty`^q|ytJfI8=\ ۣb*#2 3#3#3##Ѻ/㰽;2"4;%"4#"32lѹF|pux$LRQ´){ B32654&#"26=%!>54&#"5>32>32+3267#"&'#"&1xYS\JMLepO27Gn 'aȿuc^8>M<[|%!YHZqYaq4+#"33)+RNPPXx+'#!?@=B2({0#"'&'532654'&+532654'&#"567632wA@Q[\ihWVLHHZ[c[[MaZ[VA@^  VJ=+,nQb54"[\mPDd %!!5!!!#53)Ḹя{ 6326="326&!54&#"5>32>32#"&'#"&PVWMZfRPhgPPTcpP/;}Jb04TY/%W & +ݮyT53+)CBDA>A>A2/H{  #4&#"Ð/.G/  33265G.Ð/.+[%!5!2654&#!5!#J^adlp2r?W75353!5!2654&#!5!#?idxEvDFzlp2r+")5!2654&#!5!2654&#!5!#HEws{p{``pU?32654&#%!2+#XcbYSJKR]#'.+#!232654&#1E4p1M>ze\Y_[' ?]Z4D|vShPIKHM!!#!ڀ_A33267>53#"&'.A L67K $,*kCBk*,$=4!!!!4<8l$! !#n 333# #|ZkmZ|xyY>E )#"326757#5#"&546;5.#"5>32&ffMD_ntt&pQlT];y:Av7X|&??8?vh+]85l[hmKDg..RE )32654&#"3>32+3267#"&'.&&ffMD_ntt&pQlT];y:Av7X|&??8?vh+f]85lZimKDg..RG53#5#"&546323264&#"tt`??aVTSXXSTNO/00z{{ B32654&#"26=%!4654&#"5>32>32+3267#"&'#"&5kK84:/0n06@F2Q #S-E^T=bg~yI>;#T'1S&9NT8m\)3?26JUJLXP ZQ`.+-,`\`d1CH^#$"%G4&"2>32#"&'#3VWWaA?`tt]z{{.10/OgG3#5#"&546323264&#"tt`??aVTSXXSTDO/00z{{1!3267#"&54632.#" xn7yEB{9t\UTm 2gp fnZ_cW15!54&#"5>32#"&732671xn7yEB{9t\UTm 2gp fnZ_cWO(.54632.#";#"3267#"&546KQ3sCBm0W][Uhd^jrm>s0=r6]H5KX ]0*"0Q>-7;af]=SO(#"&'532654&+532654&#"5>32KQ3sCBm0W][Uhd^jrm>s0=r6]H5KX ]0*"0Q>-7;af]=SG '4&#"32#"&'5326=#"&5463253UQUZZVPɖ0i4>d+]V_E||D^tgxxz)f[bF5302QI !#5!#3#53W?浵ss#PP-8 33##8x0BVxyDI%">32#4&#"#4&#"#3>32B/UFj",2%j$/.#jj?'0@)&ug@Eg?Es6"#'[v+5327654&#"#367632v89hu9CGR,+tt54Ilj!pm;32#"&'53264&#"X.c43a1.\;muvl=_)ʮl$!~~!#: 46 #4&#":&{[YX[ՠxzzx:  &533265ڜ{[YX[ՠxzzxG#3>32#"&$4&"2uu`?@`8UWWbP/00z{{M!!;#"&5#535};JkPF7R]rTP[v332653#5#"&[tCGRWttkGlj{TPg`b^68~}!5!2654&#!5!#K`Yslqj=?g32#"&'#3LSbC,ml/#.,}^\VZ:5`!!!5!!5!!5!!5nnlphˏ5iV ;+53276=#"&5!5![YYZ͹Z-,0|~ij>>~G#3>32#"&$4&#"32tt`??a9VTSXXSTNqO/00z{{Xy#"&632.#"3267y.c43a1.\;muvl=_)6l$!}ut~!#QI+325&#"47&'&547632.#"632#"d&/\R@5a$^`^63302b3q>>>5|4 * &:/ZXX `@?@bj:)#"&54632.''7'37.#"32654&|s .sPm4\a^UV^%wp237,pQ57vonwwn=rO(#"&'532654&+532654&#"5>32T]5sQ0"*0] XK5HWz#"3###535463z>1tkqU.98P#P,gabo53#5!3#+53276=Ι<98h9\P\ m;d+]V_E|~4wuxzzf[bF53[v332653##"&[tCGRWttkGlj{TPg`bO68~C3#!3#3!535#535#4tt)r\PP\ap #"&5#5!;phq)99uun@PpFFI !#3!53#I?P-PPG#3!535#535#5!#?\PP\PPdm3#"54;33#'0#"3276ttdytrx !3rJMB ,|ssW?#5$ U| ;#"&5#5!98dv.FFXtp(QU| ;+53276=#"&5#5!9889ht9hr.EGbm;32+53276=14&#"#4&#"#3>32B.V"#23_uj3",2%j$/.$ii>(0@)&:;Sm;32#4&#"MU!1$XT8[]V;;FQxlX6V~a88wYYk\U|$54'&#"#367632;#"'&5:G()WW*+7[//$1!U&'H/Y,-56\sa8BDH V6X66x? 33##?-{{~: #"'&547"!&'&!3276&NNNMMNNX-(e(-W !-XY-!TUTTTTU=5cc5=J,==,:&/#5!#3!535&'&5476767654'&3fwx=%; )=xw>)[v<.#"#"/;#"'&=32654'&/.547632P1j8W*,]({44MN8> 0Br34@>?=RX!k)k`FG@98b/$+*MW33 V6X66x"192-*TIX00xY46;#"+5326 j{mo>1gr,B0]MecU-:JxlX6M!!!;+53276=#"'&5#535}J88hu956PF]m;T_^s!!#;#"'&=!5!jG$2!V&'G^=R V6X66x ^M^#47#5!5!3632#'03254#a\'Ln& m,8!!^R^=jR332#"&'532654&+5!5!dCP>i;}C5~Dx~uhn\' xM|mTPJS]R^: .#"!326 #"&54UYXUcVXYV&l~~g~]% &$ #{&DqP& :%X&2Ecq&%cX&Eq&%X&Eu1k' 2Zu&d&u%f&vZ&hFRP& :'{&GcR&'{c&GR&'{&G}uR''{u&GR&'{&GN&({X{&HN&({X{&HuNm& 9&(2{uXH&&H2XP& :6)'P& :IfP0& >2*{H&JHP& :+P& :KcH&+c&KH5' 1\+X'jHKuH'+7u'KH&+&K&,D&Lk' 2u.k' 2%uNc&.c&2N&.&2Ncs&2/c &Ocs0& >?c 0& >@s&2/ &Os&2/ &OVyk' 2u0mof&vPVyP& :0mo&PVcy&0mco{&PFP& :1&QcF&1c{&QF&1{&QF&1{&Qu\&2' 3 22H'&Rvur' 2w|3VTf&SuP& :3VT&SP& :5j&Uc&5jc{&Uc0& >]=c&^&5={&UJP& :6&VcJ&6c{&VcJP& :&6c&&V/P& :7P& :W/c&7c&W/&7&W/&7&Wd=&8d^&X=&8^&X=&8^&X=' 3' 228'&vX9E' 3\9dm&vY9c&9dcm`&Yr' 4|:m&CZr' 2|:m&v@Z4'j$:&jZP& ::&Zc&:c`&ZP& :;L&[5' 1\;L&j[%P& :<hV&\t' 5.|=m&f]c&2=cb&]&2=b&]&K'jW&tZhV&t \'P& :AH"%c&$c#{&D%ct' 5|c#m&f%& 9&$ 4#'<%cm& 9c#&rcN&({cX{&HN^' 3*u({X7&vHcNt' 5|{cXm&f"c&,cD&Luc\&2cH{&Ruc\t' 5|cHm&fk' 2ub f&vck' 4ub f&Cc^' 3ub 7&vcc&b c{&cc=&8c^&X k' 2vuq'f'vdr k' 4vuq'f'Cdr ^' 3vuq'7'vdr c'vq'cq'dr%r' 4|<hVm&C\%c&<hV`'\%^' 3u<hV7&v\Fr&uFr&Fr&Fr&Fr&Fr&F&F&%r&u%r&pkr&vkr&vr&r&&&p(r&u(r&(r&(r&(r&(r&~Nr&u~Nr&Nr&Nr&Nr&Nr&Vr&uVr&Vr&Vr&Vr&Vr&V&V&LHr&u]LHr&]?Hr&J?Hr&JHr&|Hr&|cH&DcH&D6r&u6r&r&r&'r&r&&&~r&u~r&r&r&r&r&&&Hr&uHr&Hr&Hr&Hr&Hr&\r&u~\r&\r&\r&\r&v\r&v3ir& u3ir& 3ir& 3ir& 3ir& 3ir& 3i& 3i& r&?r&JDr&1&Fr&uFr&Fr&Fr&Fr&Fr&F&F&r&uer&vr&r&r&r&&&Ff&CFf(f&C(fVf&CVff&C6fHf&CHf3if& C3ifFf&CFfFVr&ʜFVr&ʜFVr&ʜFVr&ʜFVr&ʜFVr&ʜFV&ʜFV&ʜ%Vr&t%Vr&tkVr&tkVr&tVr&tVr&tV&tV&tVr&Vr&Vr&Vr&Vr'Vr'V&V&LVHr&tLVHr&t?VHr&t?VHr&tVHr&tVHr&tcVH&tcVH&tFVr&FVr&FVr&FVr&FVr&FVr&FV&FV& Vr&!teVr&"tVr&#tVr&$tVr&t%Vr&t&V&'tV&(tFH&F&FVf&)ʜFVy&ʜFVf&ʜF7&vFV7&lʜ%m& 9%0& >f&pf%V&truVr#525#53d7vF&jvTVf&-V{&Vf&V7&vV7&{Nf&vNf[Hf&DHfVH&tr'u'r'u8d&uv/H&6&&67&v&wm& 90& >f&fr'r'$d&v3iH& 3i& 3i& 3iVTr&uVTr&3i7& v3i& w%m& 9%0& >[f&Dpf~ur&F&jr?FfCFVf&5FV`&FVf&F7&vFV7&\f&\ff&fJV&tfvr53#3"ïddm10!!d dmy/10!!/yy/10!!/yy/10!!/yy/10!!/y]&BB-@ 10#53Ěb~-@ 103#1řb/103#Śc/-#5b %@   1<20#53#53Ěb5Ǚb~~ '@   1<203#%3#řb5Ěb/ * @  1<203#%3#řb5Ěb/ #5!#5bb;/ '@  RQ R <<1<203!!#!5!nn\];/<@  R Q R <<2<<212<220%!#!5!!5!3!!!/nnnn\\?!   V 104632#"&?}|}||{|?q?P1 #@   1/<<2203#3#3#P3f111'3?Kt@%1= 1%+C@&7IF:4(:PFz4P@ PzP"P.zP@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy DP\h4632#"&62654&#"'4626763267632#"'&'#"'&'#"&732654&#"32654&#"32654&#"yxxyyaacCE%'E FedE  FeddeF  EdeF FceeO:8RR8:OxQ::PR8:QzQ::PR8:QyxxyaaECca`JyS  SS SxyT TT  T{GacECcaEGaaGCcaEGaaGCca`$3`u`'j`P','`$#3$V`u`'j`P&',Z/#@ v29190 5/-+#Ry#@ v<9190 5 +-#^R^  '4%#56763253767654'& Yb^`_hon"!^XE&->B% #D9``LAB\VBT=BR-;,,1Y7 Bw !#3#3!XEFZ !53#53#5Xޏ!' = =!' =4' == ,47632""327654'&'2#"'&5476"%F$W+,,+WX+,,+XLLLLJKKL @ !UUUUUUUUYnmnmmnmnH !3!53#3#z(洴ttPPD  5   @  W <291<29033##5!5 !wtt}oyc?}!!!>32#"&'532654&#"f6TTXYJz04?9= 25DIJLL...P\\PS****hQQ;JJKJ hh2112=!#!=HCD0;.="327654'&'&'&547632#"'&54767327654&#"hT-../RU-../P--KKKK--P]12PPPP210'(KL('NMK(')+*++*+NM*+/23Gc;::;cG3288Yq?@?@pZ88C#$$#CDH$$0.27654'&#"532765#"'&547632#"'&SP-..-PS+***(X/x==jDHIKLKKZ[-..44]\4421ab21hQP854&e_]]_eTSS}~A @ 32tNN^luu)qJy}wYYk\sa88=TdXC{dB}TtdFTud Cd?}CdITd=Cd;Rd0Td?d8d difdifdEd1d:ds|d1d ##"32.#"3267!!!!!!;JܾL:9II9^o78?*?77IG8GI`{c9'.473&'3267#"'#7&'#7&'&76?3&',;8+$"5:lUXn;4";τPqJ8=0;i<)^_HH?WgjιKp(_Y,%6767# !2.#"3>32.#"YQbUYoHqWUnrV,e#7!v'/_HGghGG_^ٜu]\YC!!!!3###5ZpP~WHE9El#!!53#535#535632.#"!!!?-쿿=OL=tyB_))HmBo)632#4&#"#5#4&#"#3>323 0?o5FP;]i9JI9!c?L3!Bjbws{Ep{``N#55YQKP%$((TT@I!*##` E326&##.+#!232654&/.54632.#"#"'&]``]z/YM$TP*N(:?>?>SZAm)naAt02k:WX?^)}j9>/b؍$~3YQKP%$((TT@I!* *-037#!3!73!733#3#####53'#53'33ٹpg1 2CYȿYD2FIn$uumuuwugu* %2#4&#!#)"33!3*ԕ|aԕ~V*$oN{&kz%%3p@< 1& (# #43('1)-&- 2'-4229999999999122<2032.#"!!!!3267#"#73&'&54767#70TJBN1Fi1OCHU,1u1!(*=Dl-.&nC>*( n -/ l*33!!###5<~rTws1s/!5!!77#'%5'+s-PPMMo؈onوn9-bw'67>32#"'&'"326767654'&'&67'>7632#"'.'&/#"'&54632326767654'&'&&#"32fbU!O3'A"+0.!. !  _ \5#?\k2,,#2!$(2( 4" )1>((E8&^ ,9Q F 9)ЗiRm:3Xwdg7? 2j7#=5(6$ 629T/ (2M !:5S}$@{mbq~Es/4 -& "TAB`]|@8nRkcd]aC".)5'632327&547632#527654'#"'&#"%654'&#"o|@X"07PYtaTk~j[IwmqJ2530D#24!`NkBX``S㫣†qJ`R{{{{{A667654&#"5>323#!!3267#"$547#536767!5? 7^\iV ^':,hski HE 4cq<;''K={[/ {9b{DI--N@{ O/{O!,&'&#2767#&'&576757O[TUeeUT[Y\Y[dsye]Y\[CvlCi----iH$"u9Bt"#BuflC1 %3267# !2."_|dT ȄE}=[~oi 7@,L]r4*:0N̾ (2.#"3267#"&54632%3#"326.2"&54:F#KVVK#F:-Q.~*Pʇ=II=323]W!{/tKb J G'QWab ^TH632#64&#"#'?3%Ǘŋ]W!{ 1$ÑEmJHWEbOYbcJ %# !3!# GHMZMd q+  #  "32!!3463"##526eb223b WU&WU&  1Q~>;\>}N*3>"32>54.'2#".5467>32654&#%!2+#hjMMKLijKLkZZ\[~}ڶ[\ZZ&RXXRuJjhKLLLijJgZZ[~}ڶ[[}~[ZZICBISqmopB 33!27&#%!2+!67654'&` `s1:+YX*q jdZ)VV) (%#'#  %27&"676'&\ӿ,F E]]]][{ab[ 2222jT%%5$c$% &.2&'&+3!.+!!2!27&#676'&%3A::f&AVy-`5?vfAd)7%LK$201/O~hbb)j)V>U)- fh@6    B     ` `_`_/91<<2<<90KSXY"###5!3###r}r7q^^-B0 %#!!!5!bJZCJ]d qddd J.%m -)7 7673 $54$32!"53!25&'&#"6Ky {U>ZLtࠢ""38M{{M7M3TT<`xGZAEIpP3RQ4Oe{'uV& 7{e'uV& 7tZ{'V& 7{Z'V& 7tZ'V& 7u Z{'V& 7j{'V& 7{j{'V& 7_{'V& 7{_'V& 7u_{'V& 7_{'V& 7Z{& 7{B} 5!!B#ZpZR#ZZM '#'"ZZ$MZpZ#B} '7!5!'7ZpZ#ZZM !737@ZZ#ZpZB}!5!'7'mZ#ZZ#ZߠZ#R#ZZRZM%7#7'3'ZRZZ$R"ZݠZ#ZZ#Za 7!##:nt':tna #5'#5!tn'dtna )53753dtnntda 733!ntd:ntB}3!'7!5!7ѓc}Z#Z㔎RZ#R#ZRB}#5!7!'7'7!'/cZ#ZߤRZRZRYxa532767676767632&'&'&#"#"'&/#7!$f ! +!3-68+2",j!!!3 .6+85.0$m: w '07)(6;C+ : ,:'+:Yxa5!5!#5#"'&'&'.'&#"'6767632327676:m$0.58+6. 3!!!j,"2+86-3!+ ! f:d+':, : +C;6()70' wB}!!'#537i&ڠZZ#ZZZZ#R#ZZM'75'3''#ZZ$R"ZZ&ZZ#ZZB}'73'7'7#'7!5hZZ#ZZZZRZZM77#75'73ZZRZZ'ZZ#ZZ&B}'!5!7ZZ#ZZ1ZZ#R#ZZB}'7!'7'7!'4ZZ#ZZ1ZZRZZB} 53#5!5뤤4Z#ZhZ#R#ZM %'3'3!5Z$R"Zh̠Z#Z4B} !'7'7!#3̠Z#Z4ZRZM 7#7#5!ZRZ4Z#Z̤M%'7'3'73!5ZZ$R"ZZhZZ#ZZB#(276767654'&'&'4#!5d >b-*,%:0Z#Z  *+(54<852.&Z#R#ZB#)!'7'7!"'&'&'&547676763"mEZ#Z0:%,*-11> ZRZ&.258<45(+  B#$>2+#5!5!54767676"3276767654'&'&'&l>b-*,%:0ΠZ#Z2)-019 o #*+(54<852.&ՠZ#R#Z};47(+ }  B#%?!'7'7!#5#"'&'&'&54767676";54'&'&'&e910-)2Z#ZΤ0:%,*-11> o #+(74;}ZRZ&.258<45(+  } B}X3267676767632267676?'7'7#&"'&'&'&'&'&""'&'&'&#5! ! Z#Z  > >  Z#Z" *!#$' * ZRZ %  '%  %' " Z#R#ZB!'7#5!3'7'<2Z#Z<2Z#Z Z#R#Z ZRZq` %7'7]JQgz=Zӄh PJV}e 5!#Z"ZǠZ#R#Ze !#!'7'< Z$Z9kZRZe !3!5zZ"ZZ#R#Ze '7'7!354'&/#7!J%%%'HD_SlhX[HJ%%%%Jw422-A8;>112-!:zJZ[ghX\HC+%%'GKY[eg[WMs2=>FD{2,/2{DF>H':Xy6#5!#52767>54'&'7#"'&'&'&54767<:!-211>;8A-224wJ%%%%JH[XhlS_DH'&&&Iz:d'H>FD{2/,2{DF>=2sMW[ge[YKG'%%+CH\Xhg[[IB}5!B#Zp{#ZB!!BMZZ#M3'#|"ZMZM#'Z$MpZ#B}!5!'7pZ#ߤZB'7!5Z{ZM!37ZMZGM!#73{Z#ZpB|  '7!5!'7 5!!ZpZ##ZpZZZR#ZZ*M !737 3'#'2ZZR"ZZ#ZpZMZpZB| '7!5!'7%!!ZpZ#ZpZuRZZ#ZZ#B|'5!!!!5 #ZppZ>R#ZZ#R*M73'#'#'3hR"ZZ$RZppZ#B|'7!5!'7!5!'7ZppZ#>RZZR*M%#73737#hRZZR#ZppZBA! '7!=!Z#Zp{Z{#ZBA! !! !5!'7BMZMpZ#ߤZ#ZB}!73!!!'7#5!!qVa6ZEV`6NZ#Z">RRjը;mRR:lNZ#R#ZRRB!!373'7'7#'7#537!7'!RRȚNZ#ZN|NZ#ZN.9#!RRRRNZRZN ~NZ#R#ZN RRB}!'7#5!7!5!73'7'%!7'!`]Va6.ZxV`6NZ#ZRR;mRR:lNZRZRRB}!!5!RRpNZ#ZNRRRNZ#R#ZNRM#'3'#'RNZ$R"ZNRSpNZ#ZNpRB}!5!'7'7!5!7NZ#ZNpRRNZRZNRRM%37#73RNZRZNRRpNZ#ZNRB}!!7/7'7!5mRRRNZ#ZNNZ#ZNRRRNZRZNNZ#R#ZNM'77#7'3SRRSQNZRZNNZ$R"ZpRRmRRANZ#ZNNZ#Z6a##7!#tn::n3:t:5p::6a '#5!#5'5C:3n::n:4:dp:nt6%753!5373:4:dp:ntn:nd:4:6%3!'3n:nd:4:n::p5:tB}5!!!!!Z#Zwgw"?Z#R#ZRwRwRB}!5!7!5!'!5!70"wgwZ#?RwRwRZRB}37773'''#5:;!\[`Z#ZCCjjZ#R#ZB}'7'7#'''53777Z#Z`[\!;:ZRZjjCCM%#5#535#535'3'3#3Z$R"ZtZ#ZtM533#3#7#75#535#5ZRZtZ#ZtB} !553353!Z#Z{Z#R#ZM '3'#7#7Z$R"ZnZ#Z}ʻB} !'7'7!+53#53Z#Z}ʻZRZM 7#77'3'3ZRZZ#Z}6B} !!#3#Z4ZݤZ#ZZ#B} 3#'7!5!'7뤤Z4̠ZZ#h#ZZ 5!5! !!? Ou]%uuv 333'#!#\^vtP uB !!75!!5 t]]Xv ###3!3,^\X& v 3'335%!!# #^\XtvpFguv %3'3#!5%# #3!^\^$tv~Fuv #3#!5#3/# #3!J\^^|HGetvJ~{GGMuv 3#!!5#3# #3!F\ F ^tvW~uv 3'333'37# ##!#^\fd^tv ^u9v #!5#3'%3'37#7# ##3!3^^ fd^tvJ^uB '#35!7'!!!5 5~t]]EF 7!##!#*:ntaI':tnIFEF %!53753!5!ldtn~ntd&Iv #7#3'# #3 3\^^tvP*OutuB}'0#"'&'#53676323'7'7%&'&#"!32764RvxN1kk2Ow9g' Z#Z 0GD2 & +JD5@3PO2BB4R,( : ZRZ11/0*M !#737'#'RZZ"ZZ$#ZpZ*ZpZ#Ba7!5!'7!5!'7'7!5!ppZ#Zp?ZRRRZB}#5!5!53!Z#Z[qZ#R#ZB}!5!53!'7'7!#p\Z#ZߤZRZB}#53533'7'7##Z#ZZ#ZߠZ#R#ZZRZB}#5##5#53533533ҤtZ#ZtZ#R#ZB}#53533533'7'7##5##tZ#ZtߤZRZB}53533533'7'7##5##5Z#Z8Z#Z8ߠZ#R#ZZRZ !! ?OuuuB 7% !5uzR##7 ! ?S:uuzRuu##% %!3!3hV[7l n7R{+u\ #&'&#"327673 u B!OO!B ocI7͙7IcL 0"'&547632654'&#"563 3276767&#" \m`cu\6% GGnth r5?,/H@3H5,Y:$UeI+HQ\N,tqzSd69->eSY׮l 7!!5!!5!!LLk+5!#7#53!5!!5!733!ZD2/+^^``kIb!0?"'&''7&'&54767>2"&'2767>54'&&cv-'''OO_@8vcu-'''OO_A:GE:;9($(#&GFF:;9cv8@_pm__ONP(-vcu:A_mp__OOP(-9;SPF($(9;PSF'O@*iiiiB91/90KSXY"#3 !q!#7!hqqP3!!"&63!!"!0",Z(膆(\JN*"f_QQĪKM_fOPi%+%3!!"''7&'&6;73#!!#"!#L(0,:CyEB航6'|>v\JK-".4"$: 1cQı2#KK_ff_lFO]B/ 3 3ް2ް2201!3!!".>3!!"N=c(憆(c=֪I9[[9IP&'.#!5!2#!5!276767!5 ,Z(؈膆(\JL, 1f_rĪKM_fOPi%+&#!5!27+'7#53!5!3276767!73&'&'(/-9CyDD舫6'{rx\JJ. 4 %:  1crı2ݪyKK_ff_lFO]5!&'&#!5!2#!5!2767>b(؈憆(؆b>,I9[[9IL9@ 120!#!L^L= 7   @  <91990!!5 5!!LR%# Չ\P_X-y10!!X!תXy!5!!5!3!!y!DCmILfB7+U e+Gr?; /@     99190'%3##d)#Ӕ/}b%9;v'ue;e'e %.#"326"&'#"&54632>3"38\32#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥s}T!3!T*,}T!3!T*p,33# NM^T,3 3#T^,$476767632#4'&'&'&#"#;9_UijB9 KGLV32326yKOZq Mg3OINS5dK t]F;73 ";@<7  6<Xy32767>32.#"#"&'XJF]t Kd5SNIO3gM qZOK?<6  7<@;" 37;XyG&'&#"5>323267#"''43OINS61-NSXIFJKOQdSP  ;@<7 W"323326X!!KOZq!Sc1NJOR`!t]D;83$777=X`y!!#"'&'.#"5>32326X!!KOZq Mg3OINS5dK t]F c;73 ";@<7  6<Xbz'767#"'!!'7#5!7&'&567676ǧfYUE5kIQ%\n*xrYQMoIF\<[ETFR q$"B2(d%(9L5XXy$!!!!#"'&'.#"5>32326X!!!KOZq Mg3OINS52'V t]Fجϯ;73 ";@<7 " 6<X1y0%#5!7!5!73!!!'#"'&'.#"5>32326Qu{hq,gqTKOZq Mg3OINS52'V t]FR=R ;73 ";@<7 " 6<Xy.1%!5!7!5!7&'.#"5>3273267#"'!!!!'hMEnK Mg3OINS523J:VQ FJKO!8!E$F";@<7 832326#"'&'.#"5>323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=X0y8&#"5>327&'&#"5>323267#"'3267#"/'00NJOR:G67'43OINS520N]a91FJKO?J4r[DKKOdgb 7 ;@<7 !7)32326#"'&'.#"5>323326!!yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D*!;73 ";@<7  6<а;83 $77 7=Xy7S#"'&'.#"5>323326#"'&'.#"5>32326#"'&'.#"5>323326yKOZq Sc1NJOR` t]DKKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D;83 $77 7=;73 ";@<7  6<а;83 $77 7=Xy$!5!53276767632.#"#"&'y!JF]t V'25SNIO3gM qZOKج#?<6 " 7<@;" 37;Wy' %52% $'"51pZV(IٜXDz;%76767!##"'&'&'#5!!5367676323!&'&'&i1*+V WJRNMR  W,!::!,\HSLPM% +*%'H:^2:A<336G84^:H'@'H?Y L=@33/N0<^:H'%X`z!!5367676323!&'&'&!!i:!,\HSLPM% +*!#'H?Y L=@33/N0<^:H'%X`y& *Xy& '*'**Xy'*& *oWz'*& *nJ. 3#3#!5!5J=>𹬬J. ##!!!!>7BX`y 365&'!!5!&547!5!!%43448>!0IG00GG2?8>;_8X`y !!!!"264&'2#"&546X!!IdddeH:l'**z{ BbFE``bq+((d:svvX`yK!!!!2&'56X!! BS X`yD!!!!73# X!!鏫 BZVX`yD!!!!33#X!!֕ BLVX`y!!!!!!'X!!߰ TU UT BX`y !!!!!3!X!!-e Bz(iE`07GO!!!!#"3###535463!3267#"&54632.#"'53#5#"&4632264&"X!!4@#mmC???DJB&G$$K&aqk[Q_B;18BCC?-I\\I-?p`ctiF6A?9i=$#tu#gSSSX`y*!!!!>32#4&#"#4&#"#3>32X!!."]?T\Y88EQY7:DQYYU;;R B=:xoHOM]QHPL^P%U20=X`y ,!!!!3#7#546?>54&#"5>32X!!ffc`--A6(Y1/a3\p$-, BiN2A+,/-7#!^aO&E++ X%y<@     <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬXyB !!!!!!X!!!جX y%#5!7!5!7!5!73!!!!!'G=XkXU7Y Z:wSAw@Xy 7!!!!!!!!X!!!!߬Xy? (@( ' <2291/905!5y!!LK Xy? (@ (' <<291/90-5!!X#!!VVTw 3!!5!5V!!!!߬¶LK VTw 3!!-5!5V!!!!߬VVw#5!7!5!73!!!'5 p[5m{*[y~!߬`u,`vLKVw#5!7!5!73!!!'-5 p[5m{*[y!!߬`u,`vWy&%5767$'5674[šzآb|۠M)Ig#M(Jh#Xy %5%%%'w2rK/dtm0x0oVXy '75%%5%'rKnd.t'o0xEu0#oVX y!5!%5%%%!!'XC_^?sMN#N+PJ>`5Yd|5X y!!'7#5375%7%57'NEO>:fLNtt5\h}a5H<Vw?#%#"'&'.#"5>323265wKOZq Mg3OINS52'V t]FJ!;73 ";@<7 " 6<LKVw?!(%#"'&'&'&#"5676323276-5wKHGOZq M343OFGINIIS52'V t]FDE)!!;3 " @< " 6V w+.%"5>327%5%%%3267#"'&'&''}QINSE^AsMP#Bt]FJKOZq _4O;@<7փ_5Xc|6V w27'732767#"'&'&''5676?5%7%53;L t]FDEJGLGOZq P32326&%&%5$7$7wKOZq Mg3OINS5dK t]FJl#a;73 ";@<7  6<RO]ɗ9=}Vw*%#"'&'.#"5>3232655%$wKOZq Mg3OINS5dK t]F)a#l;73 ";@<7  6<R˖}=9"]OV[w67&%'&'5$774hmU֠Gc _eT2wnw2"O0Bj%V[w'567&'567&hmU*c _eT2Vwnw 2O0BDj%Xy_%!"'&54763!!"3!yɊD_`Dƍ^`Xy_75!27654&#!5!2#XD`_DȊɣ`^ȋXy> #"&'&5476;7!!!!"#'J_+30TD~K9# K^+#Eƍ5p5Xy> 32654'&'7+'7!5!!5!237RJ_+30TD~K9FC K9^+#Eƍ55Xy%!5%!"'&54763!!"3!y!ɊD_`Dƍ^`Xy%!=!27654&#!5!2#yD`_DȊɪ`^ȋX,y&%!!'7#5!7&'&5476;73!!!#"$UrG6:qYȲG5^_=R5 Yƍ5p&`=X,y!++!!'7#5!7!5!&#!5!27327654'&'92D4VqF53 D&#I`__ 2ȋ559`^`X0y!%!'7!5!7#"'&54763!!"3!!yR|ɊD_aDAQjfƍ^`5eX0y"%!'7!5!7#!5!27654&#!5!2yR|Da_DȊ]zTQjf`^nj^DeXwy1/3ް2/301!!!!X!w@Xwy1/3ް2/301!5!!5ywXy H/3 ް 2 ް2/33 3017!!!!!!X!!w߸Xy J/3ް2 ް 2 / 301%!5!5!!5y!w54&'&'3!!#!5!ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FތPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi372"&'&'&547676"2767>54&'&'!5ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FMPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ՌOi3?2"&'&'&547676"2767>54&'&'77''7ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FBccccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ccccOi372"&'&'&547676"2767>54&'&''ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F,ccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9KccOi73#2"&'&'&547676"2767>54&'&'ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi2L2#"&546"326542"&'&'&547676"2767>54&'&'h7b%&'qqnNL88OݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F)'%`8nqqMpLM77POO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi!'/7=E2"&'&'&547676%&'&'& 654'67676-ݾOO''''OOݾOO''''OOf:F-T1-F::E.S1.E:POO__pm__ONPPNO__mp__OOAϚ9FPQ9.9떖EQPD19Oi!;!!!!2"&'&'&547676"2767>54&'&'+{{ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F;gZfPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi372"&'&'&547676"2767>54&'&'!5!ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F2mPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9IPi%!!!3!!#!5!3Ҍ8Ȍ7nj6Pi %!!!!53rM_Pi%!!!7   '3ͬc  ccc #c ccc Pi 3#!!! 3/`103#`7 !!'  TS TS8X`y!532767>32.#"#"&'yJF]t Kd5SNIO3gM qZOK ?<6  7<@;" 37;XAy 755%5!5X!#!!ʶLK XAy % 5 -5!!y#!!!!KL VVw?  55!5!w!!!KLVXy? 55%5!X!#!Vw $75$&%&%5$7$7"nWlܜ86s˖}=9]OVw $'$'5%$5)n˱#lݷW680O]"ɗ9=}Vw)%*67&'&%&''&'57&%5$?7dMjTVʥ3˱!3a4m"cjX)3S][e﹏3N@%HZ-=}k$Vw)$(6%'56?56%7$'57&%D>WwZN(۷+/m")33 +Si063hiyje˖X[y3!!!'7#! !PYBzrYh?ݪ@?@X[y3!'7#5!!5!!PYzrY(s??ݪ@X>y!!!!!!'7!5!7!X!w R`RgfjfX>y%!'7!5!7!5!!5!!yRgw! RjfhDfVw?%%&'&#"5>327%5 %3267#"''43OINS:Z0!!x2XIFJKOQd>3  ;@<7 ҧK{"327V!!?E>XIFJKOQd>C43OINS:Z0"323267#"''&%&%5$7$743OINS61-NSXIFJKOQdSl#a  ;@<7 W"323267#"''55%$43OINS61-NSXIFJKOQdSa#l  ;@<7 W" # #h֣ͣG9> 3 3h*338> !!# #g֣ͣrcG9> !!!!# #gg֣ͣrrcG9w!##mZ##5w33ϸ"mZ!533X%C!!3#CrrCr[  C!!3# CrrCr[ %~!!3#CrrCr  ~!!3# CrrCr Xsy^!#y^ap$%%$~  %6 %!&'&"112*zz`XXroGGnY  67" ,J5PP5JX*77*#L8P"2642#"''7&546Ċnji56؝]QBɉLJo3NEQ\|G+-7AJT35#"&546;5#"&46235462+32"&=54&#"3#"2653264&"2654&#ςYxxYςZxxZE1/EE0uu0EE`Ev/EDaEEaDE/wZ\ZЂZwwZЂZ\Zwu0EE`E`E/1EE0E`EE0u0EE1/EXsy^!3!yߨys+~!#!r ~5!#r rS;+;!!3vrr;)3!rv;SL4732#"'&'.#"0 Pd@7* h$TA6?&H|( #"&546323250 Pd@7* h(V$DTA6?&Hk- hi !!!#%!!h\roa`޾"(I  !! #37!#3'Q''Ho99Ƀo!p=⻻}(TI #!!7!#3'l)okkɃ=r!r⻻+2" #/;GS_kw+7CO[gs!2#!"543!254#!"+"=4;2+"=4;27+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4"=43+"=4;2+"=4;2"=43!2#\\K\=Kl]\\\\]ii\][]\\\\\\\\]\\]\\\\\\x::f>]Y"\I\\\\I`LLMK\y>>(I !! 3#)%3!'-''96=ûHJ7 hHH--JJ4!!!rrZm4 !%!!5!5!5!!mr4 3#3#!%!!5!!omrX4  ! !! !ZS;Z$m4& B4 '3276'&#"!#"'&'!!67632!zzzzzzzzIwwHS;HwwI΍GG2GG$_EXXE^m_DXXE_3#%673#&'%676'&1rsrs2srsrTTTT@TTT|B B@B)B)΍11@4121tD& B 4 !%!!Ybm5A4 !!!!;rbmY5A4 !%!5!mrXae4 !%! !2mrx1x4 !%!!5!!ZZmrϠZnZ4 !!'7!!!'7;rZZmZ1X1Z'327#"'$%'3632# 6'&#"zz=>lWWsPYX2灾vzz>GjX`OXG%3 33!#!!3/ .^+^kk4 7!!#xr;rc/Krmu4 % !%!50!53!ymrZ[z4 !!%!!''!;GZZHrZEZw%3 !#!3!###.77/^+kk4! !! 3!xS;ZK{mu4 ! !%!#5!5!"~~+mrz[Z4 !7!)!7ZbZmEZwZ4& A 4& @4?& @ {4& A B4D& @ 4& Z^' +4&' C+?H' C8 Bt' C XyH' C8aXyH' C8!% *!%#567!676&'&'&'&|z*(2J E<iKH#&GIJE E|-2 M3 +O  ! r; ?9y?p  ! Xy*= 67 '&5677%"632327'&32767#"'&'.#"y{h p{"zi piE5 5dJ t]BFZCEF4 Zq Mg3ħĨ1P$s 7%ےs3 !Xy3#"'#&'&#"5>323326yKOGU43OINS52^NFz;7 (  ;?<6 '='3#3!!#7#537 `?+0'7ϺrSSr4!!!!3!!!'7#5!7!xrddeZmn;fժhӬ4&"6`VT{F`4y& @45{& ?+4`& A4`& @Fy. ! //1 /<20#5!!!#oo.ڭ%ۭ&H:07 %#"326=7#5#"&546;54&#"5>32hHH#[]E>Vcii!fHatLT5m4:j2O85%--JJ??8?vh+]85l[hmKDg/R: 935#35#35#!5!#"326=7#5#"&546;54&#"5>32assssss;#[]E>Vcii!fHatLT5m4:j2Op"r??8?vh+]85l[hmKDg..R:1=[%5!!5!#"326=7#5#"&546;54&#"5>32#"326757#5#"&546;5.#"5>320;0#[]E>Vcii!fHatLT5m4:j2Op""[]E>Vbii"eIasLS5m4:j2Op"rrrr??8?vh+]85l[hmKDg..R}??8?vh+]85l[hmKDg..Rk*.26:>B#5#"&546;54&#"5>32#"326=%=!!%-!!%qi!fHatLT5m4:j2O85%#[]E>Vc,,,,,]85l[hmKDg/R}??8?vhyyrDyyyYrJyR8~4<DLTZ`%#5&'&'&''7&5475'7676767537'5676767'7&'&'&'5'7'%654d3/D9229D/3d4.E9229E.42*  *22*  *2*88fWfEOPDfWg88fWeDPOEeWf8g * apa *  * aa * ba.43ab-45F^'04>2".33&'."#67>76#FVʓVVʓ"vv"Z83Pv"Υ"vP3ʓVVʓVVnh<8PvDDvP8"vP9~?9Pv"F^&0!4>2".7!&'."67>4'&hVʓVVʓDvP479;;74PvD"MʓVVʓVVv"i c;DD;g"vP F^ %7'32>4.#52".VFoDvvDDvYoʓVVʓVSwVF_YvDDvvDoVʓVV4!!!xrZm #53àZ03#s #5ˠАWeE%3 53Zz i#0s  3#àР˓[m#!!# q3#s!!`N um!5!#z3#zz3!5!`z m #4763!!"ƺoyeD9uߑfW#'&%'53 763:*enK==Mne( =C _AEc H<  3!!"'&59De{oVfd #3ƺ m 4'&#!5!2 9Deyo}Wf &'&3!3#76<(enM==Kne*!<McEA_I= 3#!5!2765 o{eD9ᏞfV(3(v% !!!!55!#uX ̼uu]]e! !!;bc;$<.: 1/<03!3T.%y5!!X3 2!@ 2 5!!5!!5!4)4𬬬 !!!!!4)4XXX 333 Nf  !!!@@@ Nf  53353353353𬬬 3333333XXXX 333322s's' !!!!@@@@22s's'!!!!\!!#!!#\!5!Z!!X!5!$Z!!$X3!-Ԭ3!-.*!!@Ԭ!!@.*5!3,,(!3,X5!!@,(!!@X3!!- 2Ԭ3!!- 2* #!!!P@ZԬ 33!!P-#,Ԭ!!!@# 2Ԭ #!!!P@.* 33!!P-#\*!!!@# 2*!5!3,Z,!!3,X !5!!#@PZ,( !5!33$,PZ,!5!!$@Z, !!!#@PX !!33$,PX*!!!$@X!5!!Z !!!!-XV !5!5!!,ZV!!!X!5!!$#Z !!!!$#XV !5!5!!$#ZV!!!$#X5!3!,-,Ԭ !3!!,-XԬV 5!3!!5,-3,*V!3!,-X*5!!!@,Ԭ !!!!@#XԬV 5!!!!5@,*V!!!@X* #!5!3!,-Z,Ԭ !!3!!,-XԬ !5!3!!,-Z,* !!3!!,-X* !5!!!!@Z,Ԭ !5!3!!$,-#Z,Ԭ !5!!!!$@#Z,Ԭ !!!!!#@#PXԬV #5!5!!!!P$@V,* !!33!!$,P#X*V !5!533!!$P-#ZV* !!!!!@X* !!3!!$,-#X* !!!!!$@#XԬ !5!!!!$@#Z,* !!!!!$@#X*5!35!,-𬬬!!!-,XX33*!!@@*DH5!5!xX333x 2 2H !!!!-Rx !!##xmsZxH !!3!!xm3-sZRH !5!5!5!,NX 5!###lZZXH !5!!!5!4l t,ND 3!!!--Dx 333!x,ԬxD 3!3!,(D 5!5!5!3,,D|X 5!333,,(DX 5!35!3̠| 3!!!!-- 2Rx 333!!xs 2 2Ԭx 3!33!!-s, 2ZR !5!5!5!3,,X !5!333xtZ, 2X 5!3!5!33t, 2H !5!!5!4R 5!!###sZZH 5!!5!3!!t,-sZRD 5!5!3!,-DX 5!333!,,ԬD 5!5!333!DX,!5!5!5!3!!!!,,--R5!333!!###s,,ԬZZ !!!!5!5!333!-s t,ZR, 4763!!"Q[yY[`~| 4'&#!5!2.-Yx[Q`~=?x 5!2653#xY[Q[~|2Ψx !"'&533![Q[Yyx2|~>3m 2>#3> 2> # # 3 3>ݲ}#$cc|5!F3F~|5!|iF3P|!XF!@F~|!|iXF!@P5!5!!5iVV333PP~P!!!iXVV#!#P@P~P( 8! ! !!!!#!#(!(F(!Z((!((!(h(!|((!(*(!>((3(i( @} F( #'+/3!33!33!33!33!33!3䟟䟟䟟mnmnm( '/7?GOW_gow3##3#3#3#;##;##;##;##;##;##;##;##;##;##;##;##>>>(!%)-13#3#3!3!##!#3#3#3#3#3#3#ޟޟ#|ŸŸ|Ÿm#( 5#E( CZh!|i J}h( J(& J& K L(& K L(& J& L Q(& K& L Qi( J}(& J Q(& J& K Qw!N<w7!!!xr$<w 3!254#!") ) xrVVVw& ^ Uw !%!5!5!5!5!5!5!5!5!5!N?:IILII޸[["[[w !!!!!!IIN< w !%!!5!!!I) N"-?33 #&'&+"'&#"/573;2?"#'57#&'#"#567635a)8)kOkaKA-'= //G),Y=  !H$ /+HDH)+) $., fYYx !=Z Lx73&'37&'67&'67&'67'32654'&'7654&#"3672 $54767&'&47'&27632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5430'&327632#"/#"?#"54?'&5432&5432&56327&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432PO~ )*+')+(@&'$||e?/A}]\B-71SLoWj\vLLr%%,* #$ )*n$ % +) $ #*+    ? '+&()&(+&p   % % +) $ $*+*EC*Z*,)-)-*,%&%&fБfU 5HhfeefhH2pu^QFs棥sKQG4 4  22044 22 9       L%('*%)(*%)(*t     144 22 0r!2CTev+&'&54?6?6/&2#"/547672#"/547672#"'=47672#"/54762#"/54762#"'=4762#"/547672#"'=47672#"/54762#"/547672#"/547672#"/547672#"/5476l=.%G\&#- Lj.N 0d&K4i    }    g    s            &                            H5-V"*2-.T<:U'EGE'DN-ֈU]\`CDcbF]WWZA@ZZ@AZZA@[[@AZKPrqqrPGeޝdMP䠠P }2ٛk A4&#"26%4&#"326#"547&'&4632 $54'&'&4632XP79NNqO.N97OO79N']EacDC_\n\U>DbcEXFDbbDEaaEEaaEDaa+G詄UUSj멏i LVV6 "32654&7#"32?ɏǾ/`TcȐɎ;P12Y.1"264&"3264#"54327&5432#"'&'@KjjjiOiiLKirqrtPssrqQܩZTdIU )5AMYdp{3/&76'!'47653!476=332654&#"#"&54632'#"&54632#"&54632&'&676&'&676'.7>'.76$6&'&%6&'&6>'.>'.f<;.=+,>/;Kyz~LZ|WX{{XX{IE11EE11ET    m       ;   R       s@dd@s}>}=/NnN/=}>@MllMNkk& % I% % "!$# "! "!! & % % & %-5AMYdp|5#!4'&'5#2#"&546"264&"264"2647>'.7>'.%676&'&>&'&7>'.%7>'.676&'&676&'&753!476=3''676%27/&76'77&'&/#?6'&7liilYz{XW|{bEEbEd      8    @     .HxttxH%?%5E$6  6$D5%?%-5!!1(~(1 5,4t4(4N4(4t4;hhh%%#%% $ %_ $ $!"!$!/!!!" $ $ $ %:-,GtG,-: XLRqqRLX ![$n[ii[n$[!ob !!'!tKZGkcn "!!'!##&+572367676hNn_5, S Grj3#-EmDJ~o.(*!4\tR~UL !!'!  ##' CI3Z  > << 5DCX << ; YD36273 ##'5&< +Z@\\DC ZY\5#,5>~3+&=4%3+&=4%3+&=43+&=4%3+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#567635@)A({@(@){A)A(@A(^)4 'iOj_J@,&< //F(0'&&'ܐ'J&(lN5  >! )&V?<?$&$ '& ZN N />Eqw!674#!!6?676'4#'323276767654#3#&'&'&6%67!672!&=75$/563&43!32+'!67#>54&53 *,  3)="(&)09$) L&TE` MPA[MH Y $ ;&&e=O%/ N ,8(.7L1Rf~H8SQ,zH%9D6 )jGP@4Rjd_*KfsDIR 9! O  -]&C+/3#"'43727&'#"$472776725676&5&U8)$ tJ .; d3f,"3' VD ( GL/7;;,g t^F$< LD&?>X4R !/# I ? P?D!)Mv>/z2!"&54676737#&'&54>;7#"&546767!7!"&54>3!6763!2h!.)g$'30!/&j ! /:(/  )/ 9)/  9)0:*/z2463!2!2#!!+32#3#i9/ ! j&/!03'$g).!*:0)9  /)9 /)  /(:!!C4&#!"!&3!!"3!#";#"3&'6737#&'6737!"'67!7!"'63!67!2e;'+pCCo CCCC2CCKK<LLKK%JJ60"2=2).=<==<@=:>=;TT USUT UT83$QE!D72654'6#"'4#"'54#"'54#"'675674767#%$4:JILLHOKHLKIhghgighgD>-sJ1 b6'SS cRR SS?SS\\K\\;\\]]!A*>K!!D!254+'3254+'!254#!'!254!&#!"0!463!!2#!!#!3#3lCC2CCCC oCCp+'q=2"06JJ%KKLL:=@<==<=.)g$38TU TUSU TTE!C32=732=7325732'654&#'%2&'&5&'5&'IKLHKOHLLIJ:4$N->DghgighghSS=SS SSb SS'6a!0J)K>*B \\]]:]]J]] O!%)-1523656;2#'7+"/#"'+"5&54775'"'5476;25'7&567635&56;374765'75'76=4'&+ '"'4!#"'&36365&5&#%#754'&5&&547'5367&7+&'&'735&2?"5775537'7'3533553535'32767&5%2?&#%55'575775775uo,Mz"060D/5I:2'5:6&" *:D:S46$.e QN5  u4MDa 6bUP+ ,H;`I23N5( (#I0M '^5%#!:X+ "*  6W}W:uW4 5vT & /H3V XD9\SL+&31.d+%X!Q $2``KPPPG[6%# Qy- 6[[3GK[O`_A[-)$t7 L-$ L6=" (CJ#R"0 :~GB{~Eoj<4S[Za LC5 ) .U%+Z&)͢ 7e<ILAaMoK33K@G6 $$(& (''&1/----2)( (-((d.'-T?OK8T$ !T3(-<((')))())( &2%2#"'&=477654'#"'5473t\*e O@UCXq P S. P ӍMOb>YaYƮ58l7P P@ $0<FX + &=%6&#"3 6=%&#"';27!54767%!&'&'2+"'&=476^7\Pg㑵Hr'.)%sM M#fC-7!%A.; ӎw:kKqz +H*G;M tu/&((AA&:+C;."/ 8Pi>'67&&&'6.7#"'&'#"'676'773.#'6'5676&&5476'&'67&&07 ^< 1x,B5@2 JVMv!#uA+UBDX[f*;-10)..C,sB#HKU P]12<0VQ }%'H6-T}^$k7 R2'7f!A\;y?1!50BEt"!zkQ;0qu0\oi:5oPZjsXFaPJGl;4ejN^1F[q7&&'7'6&'$#&7'&#"'5&767#&''5$'67'6'6'5$'67'656&'67&'6'&'''5$7676'&&'6'63&7"7&'7&'7&'7&'6'6%676767&77&77&''5&"'6%35&'.54>23#67#&8 p +WDTc'H @XO`= ;*)8 kDv/Pk-J KDhGa D`gBD6DDD =3dTDW, :g j)Yi#'WtI-9w18$^8;./7-I)jS)'#i\-IM91D;8%a7/.D=uRNBR&'%QBNRq d2 D s98C ["|44&3, '2^3R T(B?#'9C- !y ~#Z10>N?$%Y4 )%FN? ({ usis< 3(&^T05<>7;,#4[:O(vAfGEtYB z^~4j #,;b:['~Av@~EQ Bak4~_H#T2 $$$$ 2T"`q$&'6&'67327&#!65#&3jjdnh wWVݱqZre[c7 7 cyX ,35'533#3!'#'5!5!5#53!5!5#!!ʶ~~ blvF F A<<3ffX苜qXGccGap 3264&#!2+73 #'#5# 3m`hh`2`Ĉѳh|;vvʷ}f33#!!#'!'57!5#'5735 64pzp7d+!#!573#'5!3!'573!#'73!#'5IxOOTxSVVdY\yvVPPvIyY',32#' 37+ &5%6323'#57'53mJl{~m@+ݼh4144'0>,_ vNknmmnObs32732753"'#"'432364'5;+"'#"'53275'&'&54?5572'#&'&547634%476='4&#68$$B )Z>&A_;i88u-o1bFGfQ_M5mwLbkjI,K=''8 0##Rm4 ڹ+ܴ5!PP"4\=ѻ"8Qý32#"&546324&"26%#"5432itvxsq1"00" 0/B//B/#a`ir|H!//!"00""00"!/0 _b #>DJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'&$h%$%%34$&1++XSA N@`==k>P CRX++XYC P>k==l?L ?Q oL+ Nn;P?;@  nMNn3%%%%34%&&%s==`?J >PW,,WW? K?_==f?H?PW,,WU?H?^<=Ke+cL mCP`k<<!4(0847632#"'&7327654#"&#%#&7&'67&'67!󫪪vӤ=6 5N'V[S.U[R󫬬񫪪񿉊 ʯX[V[X[V[!4(0847632#"'&7327654#"73$3&'67&'67!󫪪vѦ=63QNV[S.U[R󫬬񫪪񿉊w  'X[V[X[V[!4!)47632#"'&%#$''&'6%&'6!󫪪4>;D@KDzcngk?dnhk󫬬񫪪I kpinipi !4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==,/0#H 8&O6 |7iY06./==e6a&i1r4z012+KN2HQ>>>>f^2"/1]8`1"Y 4f2y5+ +"'5$76%&'547327676=&#; hz0/O{[(*TQ~`NO =tR[\ 8d<+% &56;2'5$%75#"3vh0.P~N^(8P,VRZycOpO >S\^ f`1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|fzg}}"&&"}UQn$mQU}"$nQUVV{xVVUQ<"{u^^\ _u{"#| zUOOUz |#YOT{zQPPQz{TO@>)4'&#"3276&5476327#'#53'&`____`oŠqk]^^]YYňÁhgf@> '"3276'&'7#5373'#"'&5476j___``_ߓqŊqYX]]XYfhhĈÁj0 '&'&376&+"'&5'476%7!Z{z[ZZ[~\YWmpN#ZX[[YZ[PQmp#TG*52764'&#"#463233#!5sPQPPtrQPyzg֏LQQQPPQr{{t|g*#"#53533#632#47654&#"#ddiqqCBigIIugzyUr}ppDtPQs_CS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3|}}! -/@ /- !^'?XY??~YX?(F}R}hh}}hLS<#5#535&'&'5'73'3#'73'676=35'73'13|e{vw}wwUATwx|xxS@Wwx}vv|d|re{Eus~~suE|VAKtrrt@X{Ius~~suI{dr|*! #!!!'!27674'&#_82V)3{D#MHZW{s{?zK8! %#"#&5463 67!2#6#";z\)MaBuh __ itBaM(]y tt[+##+tt\5."264&'67>3"#"&54767&'&#52hq៝rd:BJ|^d#!p⡠q $c]7A;{26XY "zz" YX62 &'5 %$ 56?6'.j拈|*xIIz'&|JJx, F42$8"3264,'5'&54632264&" &$#"&547>ȜmmNMm} lyzU<Mnnnm+}7 lyzU<|||,&(uO#eaHG||||Q'(sO#e‹`IH=! <>'.463227#"&5454&#"&'&5476766&D9BB8Ğv?W:pbW~tp) "-ff)-gtpQ@3AA:ACj›GmN?ijbvr56WGe((Wi0154d)-?/6?2>32>32#&'567'6'#4&&#4'3>64&"-S5,9"\0+Fgv!4u|W")^,k ikdS!eb[_[H|NYC:RHB=G`SnU|#!!!53&54632!!5#67654&"U't00Z =yy= :]ZssZ JjkkjJ 2f4%353'5#"'&''#&&#4'3>32>32YE;<<-!&Y*dx cf_Oz.*O2)7Ze``b<`WuALh`8!5!1##'!5!_drrPk^K{U_W{'/27632#"'#576&#"4'5267>327&'"2XCZd}uud$gq~dV)40tlx!&%"dLk}:Uwma4 sOHK{wY@x A63276327632&"'&#"'&#'6327627632&#"'&#"'&#'YR #{=('%{XNCEz>O&z>'(#&R #{=O&{YNCEz>'(%{=('#&ee22ee$l66kd23dEPdd33dd$l76kd34eE^s#!5!37!!'  L34((C $Td67&'&"!3!67>54.#"!5&'.54>325467675#53533#63232>54.#"3'8xpA?9l9>@q<;9'D} 5RTP=: SSPSS ;r>>p  p>>r> !A% )RSQ1 )6BB6) 1QSR) p  ""V{zHNRh|&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32367>4.#"323732>4.#"327>54.#"732>54.#"I )),(?)(#!3()3$))BG!(( K{mg,;h IXI L$  P   H''1|G''#s%'')7$ ''A  ''HTݬ9.%~~ rF)~ wpa!'-23353#3!53573#'5#5335!75!!5'57!ePPeeQQeDpH>H@A~}}~00mrTTreppe-!7CQ^&54767&'&'5676767&'&54>32!535#5##3654."!2>4.#" 1""#@%@#!@% ?$##0 ܍a1%?E?%4,/--+D,/1+ 4;AB<>"  "#>"">#"  ">#10$ITNnVB, n ?%#Naji-/4^t&AYcgb3%' + ((NV8OQĿ>:<uyg**5 k5h P[32>4.#"732>54.#"!5&546767&'&546767&'&4>32'&'.#"+L)+L*+M)(LH     > |n @: !:;! 8An} E04`a30TL**LTM((     ++x: 8>>q ?9 9? q>>8 :x++c^UZbbZU^jg% $Tdhy47&'&";67>54.#"!5&'.54>325467675#53533#63232>54.#"!57#&'.54>3234'67632#7$5oh<:5d4:;i865%1MNJ96 MMJMM 68JNM0v    +0 +/0U-,,+,.T1/, 9j9:h  h:9j9a &LMK- '2==2' -KML& 1  V//X//X//V6HLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!M ,,.*C,+%#7+,7%,+ FK#++ PDNAM**4d;K))$'**,dY&"**E #**L:ƥ??@@=%)5!5!3353#3!53573#'5#5335!mD^JJ^W^KK^׋LLZZ,}}uz%yuu{{u}--4@4767&'&'5676767&'&54>32!&7535#5##3 1!!#?%?#!?% >$""/ _1+ 4:AA<="  !#=""=#!  "=![1=%T e >6.HC'L"'G 12h[FH`[$%ok+*8d .Ncv[.7&546767&'&546767&'&4>32 w "E> #@!!?% =E!w ./@ =CDz" E>"">E "zDC= @/.QO##"'##565'##"/547?kM ,4N"DF &Fi?JO/FB!O {|Im<&=M2227632#&547636=4'&#"#4'&#"=` ]d2 cBU;/G;SXMB:@B ս;7hf% #>|\@9@O &&5 iC n:^O G  %2O7236;2"'##'65##"'&5476;235&'&=476jS c1=EO ;SCFRʝT6*F@E1;O+.`162V Yi8/D ;8[B VRP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F(wQ"DG".FWCNfBy" bODUq5u4  Pro@ |S`64 '4'&'~ v '  w (  w ' $k=F F>jG3~Pjb^*IerN{̑?qJAe}Ωv6\~x(ONPPNO(!8?|EE|?8!r!_3#"/4?23D-!]UF+}{<!/3#'654'&'#"547326Rs9W5[S%3;B[/OBC'*|<j_g#"=4?2%#"=4?23ɧ%QM?ˠ)TK7(w7џ5s ?|O"'4723!#"5472!5YA>RHIOq 1 ӫg 4D% 3363'$6'"I+4 puoS^*  3%#'#3%#';&2 IʗHj7*(,377#'#'547#5773%%,ppsr,'zzxz'984?/99e5>:_`qE#&#"'5654'5673;54'56732733273+&##&"#&'565*G1 VV2Is3'{'3sI1VV 0Gs3'{'3sP3+1='3sH1WW1Hs3'=1+3PH2WW2H. ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5*)SR))&*&';((:'&)'ȶkkn\\[[nȶ kk n[[\\n`ff/ee.((&(;((:(&((@))SS**n\][[o jj |o[\\\n jj e(P( /N#.6CMhw!2732!'5675&'&=32#&'567637&/7&+"+&'532?4/%32#'#&'&=4?#'57335'3!273+#&='#"/547354;2?!&=35-,;K> #WU* y "њHV ηz/;@"q=o )we)$IY'L ALaXwH >X%CII$PC/DN6g+  b% #  jnN :3 O+5{bQ< ,d-  X] f '^ JJA!< 8 2E35733!&54?'7'7!!"'&%#'73676'77'7'&'676}]} =--HW(7*! >y*1c{F=.,H-.'d(#Y+GC8957jN})%%tGl5nm3(,H:0/(_kiN}!N920K 1DW3!5>7>54&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676@.#5*"I?6O"[m" c<,+GU 5) <|w)/ayD<,+G,,&a(!>B<#q'%NG91 M7835hL{'$$qEh3kj2'+G8/.&HghL{ L8*/D *(=Pc#"&'532654&+532654&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676D|q%N24H'CB=9PS3464E>6O#]o 32EX!#2632#"&'532654&#"&54?'7'7!!"'&%#'73676'77'7'&'676Hevyn$L27C'y*1c{F=.,H-.&c)"ERUHHS S /(*. 8956jN~(%%tGk5nm3(,H:00'\jiN}!N91/K "7J]"3264&7.#"632#"&54632&54?'7'7!!"'&%#'73676/77'7'&'676]'00'*//l+2>AB(S`dT^dyg7<,+GU 5) <|w)/ayD<,+G,,&a(!.T--T.H D&RECSukf{7835hL{(#$qEi4lj2'+G8/.&HhgLz L8*.- X.A!#!&54?'7'7!!"'&%#'73676'77'7'&'676n!?/.JY08+"(@},2fH?/-J.0'f*#&K:;68nP*%'wIn7rp5).J<21(vmmQ"P;:1-K':7&54?'7'7!!"'&%#'73676'77'7'&'676N!?/.JY08+"(@},2fH?/-J.0'f*#:<68mP*&&wHn7qp5 ).J;11)wnlP!P;;199'9HR!273!567&#2&'676+&'67'#'6765'533!273+#/#"/47$,7Jv I MO $p%|I ^ [T<K"(~GW$?8?])( EAs#L, T 0 ` +WVۄ`$$a.|%2<J\e3 + &=762367#&'&#367&#&#"3274/"34?3'35732?5#+'535^-J|@h'\-e@<r2&H); uZJM =9jl:jgb.Qi2Q|酝:*}( dpR!h j `]_i$x:-(^%,3"ؿEa HMP E7g /:BR`j # &5%6; 65%&# 327#57&/#2#&'676+'%3#'#&/47'3327##'%3#"/6j1M{ǮG&z v$ExݨE(+=R:n:D!s Y!gQKum;} uA;>e=g¯Cy??ԢB|*>w4I ' 5@` bC$ j$H?iM!%.|7H27&' # &5%6367&#'.7&67263'#%; 65%&# mJB|e6O}°I+o|BJn^jaygwaaygxaj^w$FyتFG퇢D{C?` B]ww]B JХC}.?yP%.232#!7&!"4#".54767267p   {u*_ Jcllm8*#I%<($|ʀX#{Nwt7mnld4)5:IIIB,<_4767632#"'&'&!%!!  >W$`4 Z|b<_/374767632#"'&'&4767632#"'&'&!%!!    UW$`H    Z|b<_/GKO4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!      UW$`H      Z|b<[/G_cg4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!    /    UW$`  K     Z|b<_/G_w{4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!    /      >W$`  L      Z|b<V/G_w4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!  0      /    UW$`+    .      @  Z|b.t )2 $$ >54.#"4>32#"&h..--t*Ƅ2..2/.y )62 $$ >54.#"4>32#"&$2#".46h..--1.-.y*Ƅ2..2//2..2/.t 2 $$2>4.#"h-..-t*f/2..2/.j '2 $$2>4.#"$32>4."h-..-q.-.1-j*f/2..2/y2..2/R7!!R-ӖR7!!%!!RMzM; 67'&/#'3#67$#%ׯP==Ͱ̼bN+#!f"K++!|o554.#"##"'5##"&'&'0!5!5&'.4>32!!676767'7' :!9!"9 :! F GF;kY_1278e56d:81)RLk<GG E~^ : : ; ;NG 5 e4G( Li) enf77fne )i (G4e5 G( Pm 9Y%&'%67&673&/'67'&'"&'4?&'37' '7 &/7&'#>7$%88EFu/- 6uNDL22LENu/80uFD8jU45B%y\A@Yy$F 0=/0 ,-X70 ;~*2 %% 2*~697X-,oo  +F9d1 ) ( 1d9C1*CT'&#"'5&767#&$'&%'6'&'''$'676'&5$'6%'.54>32D$ "@F,NNNvF8p^Lb2  N**+ B@0"AR/0?wA%od/D&3.YaQ/5#3$"uI' @3/u= =#n- .... w3% % 32+#".7!"&'&'#&=4;73737D*$#GFHH%#Ι+(&aa'm99m9 3.055_4i4_550.3k  #tttk"632&'.'#####֊v)%8 _^>:k{ZG_?g@`H,>|:=+,j,,<6O/233<bbJ 132>4.#"367#&7&$735&'.4>2,P*+P,.N+)PƗd"/%(MM~95DLMNMD2)WN,,NWP**g!ʇw֜s~  &JJ&?GO277''"/&'&'7&'&'7&47'6767'676?  6"&462EG#96\>42(p __ p(24>\69#G#:5\>42(p __ p(24>\5:'NmNNm U%4m+3 EJ5:6JE 3+m4%T  T%4m+3 EJ6:5JE 3,l4%T '\nMMnM* ? !&+05:?DP3&7"7&'7&'7&'7&'6'6%676767&77&77&'"32654&'5&'.4>323#67#&#"'5&'&547&"'6%6761a$O` "NiB*4l,4"U47),3($aM#"aT*BF 4,=44#Y3,)0BB0/CBO"!-$F$FJF1.#- -#-2MJF$G# 8<g7*!2U6J%n=_CBnT> rYw0d "*7]6U$u=n;wBLz >\e0wZ3C.1BB1.C(N "%""%" M#p.PA.$;QW$.AP-{ "R &.FR2#".54>&'767&%76'&''67&'&'&'67676547676'&7>3263'##"'&'&'&54767&'&547676&'&#"6&%6767&'&'&676&5467&'&6732767&h@9h),)RP|  |PR-*g:>/**Y&()((')&&)')(()% @9f+.TR"`33`\_ .np, 00441/ ,pn, ]]&&()&&EEEJ032WyQT.,d9@.**..1230IDE%&**%&F+.SEFE.IMMI."#FES. !  ";-0.--.0IM+.REF$$1.%2S_`Q2%-1OQQO2-$3Q`_R3&.>GIIG"" 7447#.$$FER/+L"  !75/57%"IJJI* )p~67&'67&'4&6%67.'4'6&&'6767&54?67&'&#&'#&'5&'"'67&'&47632>4.#"72#".4>"0'-, )*#'05%"*%%, ),,"GNYI'+""$(JYNO21, 9,4=SM:7,: -12-[[Z[]WXIOMKLMN2 Y{\ bCWDJgABcp7L^BML0b \u]! @R%KlhhO+ww+O hhlK$PZX'@D 0:)ww*;0 EA&XZw[[[[GJMMJ"( %3!'#!52#"62#".54>o:5(67%'$(n H0L*I"33'554#$/* PR 6h"&>I > >A>!!ua!&5476'#5!+{h_a66mHHm.rZy'#"'&#"'&'&'&547676763232767676'&'&'&/&'&'&547676762!2!%3276767654'&'&'&#"&#"3276767654'&'&˗Pz  ,D@   7;+  23  M98G ):               r         0   L:5U        .\ r26767654'&'."#"'%"'&'&'&54767676;27>764'.'&+"'&'&'&547676762%632$"26767654'&'&#  #  @!R763276;%326767654'&'&'&#"6767654'&'&'&#"32ɓ E79E"  21 +96  >B+  # zOo              49D   /    "    :           =JZx-4H67&'&'&+"'&'&'&4767676327632 #"/#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&4767628?.  !  !a=?^'_)\?=a! !# "!.8?""  "  "  "   f  2 .?E S@6f G=. 2  ŕ6@  B   )_>9 9>_)  % I        ? *        ;d.      ?P   !-  @( ,#%>  NpNM&_*# (! &) ,,f&  ! (K_  Z0-  Yi D   cp-)L &gK1 [N3$ n/ "!0{I"H#fmt2>,7HBI.;/8[, Q[z)  .)S9L *E   '+(4%(4  *X >  7A) 0'-570+I;-% *#%(0  ]'5.  U-9Lp{7654'"'&#"+"'7&54?67676763276323273#5%6767'&#"6%"/67#"27632327654'73654'676547& t!M#l5G;@\ 2BX-0%-m * '?,N ?'!&R;-> <\-R5-6E!"$b$6$!q",; t@P"#C  *FS "DX@! %z$(`]jMP   &O/+@ p_u<  3  DMKZRdYL6D_YBI5.!!''kGWz")3SZ67654/##3276?7%754'654'36767632#"'&54767632'0,,; (| w| ki5.U,\\    %g .  ;,-0j{w {w3V. T, \[^     -5& '-EL4'&'&/767675'7! !'7!654'!4'!!$4767>2"&'&'!654'$$CCC||]V|V#u    9Z(f(Y7%$66%"'&'&'&47676762%'b&I    )^tN/  /dIW?    @ViDV /  V%&%$64'%%&'&'&"27676@))< "  " ]NO]    9|23277632#"'&'&5476"# 6v>? (-=%P8j?  #j<  y"$"JrB23277632#"'&'&5476"" YTo k%,02?=V8jiA{C {u+'qP?  ' 7 sssssstsXrsrtsssr@Q  ' 7 5NB2632#"'&'#"'&547677&'&54763267632676   Bt  ah>) c!  ,Hs *ܡ   },"2A "  {3+Q26#"'#"'&'#'&'#"'&547&'&54767&'&54763267632676  ΂    NjM  rkW* & \ *3 #ﳎ*3 Tv! ( 5+" , @V #!!!!!%!!!!!!!!#!5!3 ;E;JEJJJ<;E;EJK!IKV{ !!!!!!||uv9f !!#!5!335#*+մ*ִw0r!!%!!!!!!/0``1/`1) !!#!5!3^^^~S3!!'#'!!#!!3!5LDʃDMA #5!#3!3'3#!#35!3###5353;9nj#5AI##0vQ#"#3;54'&'&'!"3276767653#4'&'&'&+3!52767>5/]LED73!&&54GBO]63H>SkS>H388]OBG45&&!35FEL]63H>SS>H38882I32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675&% >#"? ?"#>    G   >#"? ?"#>  G     F  >##> >##>   F    ?#"> >"#?4'&'&'&'.54767676322767676767632#"'&'&'&'&'&#"'&'&'&5476767676765"#"'&'&'&5476767632B ,#,+%) 3!, &&*-#''#-*&& &$0 )$W$) 0$' L+,$&&$,/"&&$b3") M*,%&&%,."'%%0 )$W#) 4!, &&+,$''$,+&& &$1 ,#,+$)0267632#"'&'&'3&'&'&54676763267632#"'&'#"'&'&'&5476767#6767632#"'&'"'&'&'&54767#"'&'&'&54767676325##"'&'&'&54767#"'&'&'&476767632&'&547676763235#"'.'&5476767632&'&54767676h             -  (                  '    *             .         +j276767653"4'&'&'&+sidUS+*+'WPihtthiPW'+*+SUdi),)URhexuhbXR,,,,RYaitwfgSU),%t?247676763"'&'&'&5!276767653"4'&'&'&LEA86:4DDMMDD4:68AEtjdVT,*+(XQjhvvhjQX(+*,TVdj-76DCOME@:66:?FLOCC67-*UShgyvjbYS,-,-RZbjvyghTU*,(8 %%! !)ttJHcdecH]F]~]^C5 )!%%!2#"'&'&'&54767676hzt@z@Az@t{ne_RP)((&SNcdome_RP)((&SMdd0x}*(QObbrle]TP)**(QObbooe]TN+*(.'"276767654'&'&'! !_)(""""()_)(""""(Y$(*/.*(#  #(*./*($]^#< '1%%2"'&'&'&5476767! !#xxa)(#""#()a)(#""#(YDgghgD^I^W $(*0.+($  $(+.0*($ YZ(8 3'7'3!%%!! !hE۱CCDe g  g f ҁссi:]^= 3'7'3!%%!7!7'7!hTDEDDTNPPIQ2P11P2#mm(? -5%7'%!! !] P  gfeer­696ƌ]^^. /'%!!%!77!yrryyqm"_^^l%%tu%ߴ߳!63% %#'-7:|:||9|kֵֵkֶWz`37'%7% %#'ZZZZZ]^Z^ZZ˛ʜm˜˜mʜ0o #'!5!73!P6M6P$6PMP66R#6QLR6$Q6L$z     - h<_K <; L_zK <; J`;<_  '!'/7'?!7% % -[9^[[ZG^ZZz'}*}zy}*}'q^\\ZG^ZZ:\O}zy}*}'yz(}2 % %  h_y(_^(zFGs% % -hVHzVUzHrVU{HUVH% % -hhhႁhhhႂhhh$h7% %' 7-'hX5 5XV6 6g5VW6 6WV5 0t/37%!!%'#''7'%!5!%7'77;[TA:#T8#AT[TA#9T#8AT T8#AT[U@#7S#9@U[TA8#154'&5476276767632#"#"#"327232#"'&'&/"'&5476=&'&'#"'&'&54767632332?&547'&#"#"#"'&'&54767632676?>$,.c.,$> ]5 71+: H3> kR  Sk >3H :+17 7Z  >$,.c.,$? Z7 71+: H3> lR  Rk >3H :+17 9X  ib9@R'))'R@9dg  8d< +$;)01):$* \570+9 F3= kQ  Sj  =3F 9+077Y  >$,.a.,$? Y770+9 G3= kR  Qk =3G 9+079W     > h`9@Q'(('Q@9bf  7c<+$:)/0(:$+HH#:.'W4,CEH@,4W'*>&DL:Z##KGW,f ',;[;;+*Q--}KOW*AA*WSGu5-U&+;;[;,)  '+;[<>**Q--}KNW+@@-USFu5-S(+;>Y;+* !67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"i/)F)/,UK:M $\/8E(5>H6-EFJA-5H;8)D7.\# L;KU,*UK;K #\.7F'5>H5-DE-6H<7*C8/\$ M:K U+:6-21 4 $:<;$ 4 22-6 O;(A7##7A(; !*:#.#;&Rm!CcJMU)??,RMJcCoS%9#.#;)!  );#-$:'Qn!DcIMU*??*UMIcD oS%;#.$:* f /D;;D/ $i"276767654'&'&'767632#"'#"'&'&'&'#"'&'&'&5476767#"'&'&'&5476767632&'&5476767632o00'))'00o00'))'0]0+)*+%# #+%0%##&&.0%+%   #%'.0$,#0%-# #%'.0$.  #%'-1$,#$%*/0961/*%%*/1690/*%) "*&0-(%$$$)-0&*!&"*!$$)-0&-#%(-0&*"" (-0&*"$$(./& n%#"'&'&'&5476767#"'&'&'&5476767632&'&54767676267632#"'#"'&'&'&27654'&'&'&"67&'&'&'276767&54767'&'&#"276767654'&/?676767654'&'&'&#"h &,&1/(&#!$&1%-$!&$/'.)2$-%c%-$2-*++&$!$-%1&$!#&(/1&,& =s0 9 55%R 9 !_  , 9 R%5s  _!#'"+'0/)&$%%).2'+$ * '1.*%%%%*.1' * "+'2.)%%$&)/0'+"'#L% %L %#M L:2(&6  _ M#%   6&(2: -[3b &'#"'&'&'&547676763267'&#"327%327676764'&'.#"7632#"'%&'&54767676324676762676322##"'&'"'&'.5#"'&'&'&54767"'&'&'&54767676&'&'&'&'&'67676?&'32767677676765&'&'.#"7676767&'&'&/326767674'&'&'67'&'&'&#"67'&'&'&'67676767"276767654'&'&'"'&'&'&54?&'276767654'7654'&'&'&"67'&547676762    (  b  (       #!"G"!# * " ' ## G!""  '  Y m    ( y   ( O k  w  m Q (  O (     ? ?   + / L* / *   +. M+ .*   !!!! '? ?' "#& #'"!!  '? ?'  !"!  $&  m P    O        m     y    O k         b       %j<\l"276767654'&'&/2#"'&'&'&47676762#"'&'&'&54767676% %-[''!  !''[&( !! (TB39)+,+76?A3:(+,+76>tjeVT,++(XRiiuskdVT,**(XQijtuz"z!uv!z"z#&(,-''""''-,(&#e)*:6?;97,+)*97z88,+,*UThgyricYT+,,*USigtvjbZR-,zvvz"z vv!z29"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"27654'&%&'&#"327676%327632 654'&'&#"#"i"(-+S I9K #Y.6C&4<F4,CDH?,4F96(B5-Y" K8IS*)RI8J "Y-5D&3<F4,CC,4F:6(A6.Y# K9I R*"(-62 #9~3 #9; 01+56 00,5`%;G,A $.?'!3&@!*Yx$ ImPT]-EE0ZTPmI "zZ)!?&3!'@-$ #,A'!2'?!*Yx$ImQT\.EE.\TQmI#yZ)!A&2"'?.#~&41%%14>3t-3>41%%14>3f^CC^B%@#@@%@#-4>41%%14>4-3>41%%14>3+  V  ++  V  !r +?Sg"&46277''"'&'&476762"'&'&4767622"'&'&4767$2"'&'&4767eeeBABA#U##U##U##U#V%**%V&**KV&**&V%**~ffeAA$AAV%**%V&**V&**&V%**#U##U##U##U#  &3@MYam+%5%32476;#"'&'?632&54?#"632/&54#"/72#547"&462"'&=3?_?6 6  6] 6'?&M&C_CC_?&M&< 'L&&L'!6 6^6!6 >_CC_D<>"l267632%632#"'%3#"'&'"'&547#"'&54727%#"'&47632%&'&54763&5476h!#;'&1'h 9##8)'1!, ;#A#; '&1')8##9 h'12;# 4%.&! 6 = 6%".% 3 3 G%.56 = 6 %".G 4 $8 ! 54."#"54$32632#"_ ɀ~~a>E  %!#!3!p EE?p9E=V %!%!35!cE:d FF8 %!!![:F:\;[0q %!!7!N]<N;)G+t  ,o9; #q !rQk!k`!733}b>v!#7#)iC~'  #'  #g]jOS2#"327676765#"'&546;57!##"'&'&'&54767676%#     42;%-n`Ԯrr#26A@:V7:$)&7.Yq   % $.277g[(dVDQ49%*,04?()-#52&'&547676762"'&'&'&5476767hc"$njln(Lfe*+$$$$+*e*+$%%$+! #'(*dRjjSc*('!"%*,20,+%""%+,02,*%"%C&'&547676762476767622"'&'&'&5476767hcn(%X%&&&W%(nؖe*+$$$$+*e*+$%%$+,Dj*('(&,,&('(*kC"&*,11,*%##%*,11,*&".i%%&%&54767676247676762hhÔ*(42u24)(()42u24(*i\=97,*+*96@@69*+*,79=Zr_'#"'&'&'&547676763"'&'&'&5476767632_dA=;0-/.=:DD:=./-0;=Abx1.=8DC9() 1F="%".4"tNa5&$4! /.r<@6B2L_0>Q#kI|"rz7&)?),%=^K=.C26F@13.!9+cM313N676 547&'&327#"'#536767&'&'&5432&5476323254'&543253%5@26`', =NR6#!vWR>4 2:O t51"".1&X.RO A5ȏ )T/186,FAS :#(=:tA0 9SD 'A#5}11BO9 "'&'&'&547676763"3ᗊpm8884qlYTN! !C@RP]e:6pltm9:'62~~jf77"05276767654'.'4]PR@C! !NTYlq4888mpe'67fj~~27&:9mtlo7:fkR !&547jljjlyyxzQqpnc$0!!676n wu;;vi43f$lcC}U# 3tD}U 3 DutV.! !JV. ! JA! !m^\GHB ! ^^HHv!'7DWWWW|'7'7WWbW>W^$#"&=4&+5326=46;#"3xMe,,fLx1d=AOOA=dƂ׈ihDŽOߍOi(326=467&'&=4&+532;#"+5nCFVU$#Cn5BB*)p//oTBB¥P⎁AAPDBۇ45iDCS/~ #!5!3}t]} 7%d^=]d>S~5 /%0~##t] '-f\=]d]>-!'7!. (``I)=2"&'&'&5476?!".'&47>3!'&'&54767>2 '!  `!!  !' ,&   &   S~&!5! F78-x!5!5 V(Mr6u #3#3#3!!5 鴴ZZ---I(,,,,S~  55!#3#3#3F9UU**b]^bUUUS~!!5 F7.`tq!%  qR{V$%! S%@{V t%226=3!5 5!"'&'&'&6  $hI$  h$   6<47676763!5 5!"6  $hI$  $   $O!! e 6n55!lMlTwccwekl!5!!53 ' !_[y"kd""e/l5!!53 ' !_["/d""5 !73#57!%!6UcGjbzbdǩ""ap 5!'53#'!!!7%acߎA[؁(ZqZ{{{ĒҒ}TM %'!'!53 !;qKRnKa26wwIw22wT}> 3#5!7!!! ZQtZQ0L>ssjLK2Nu '!53#'5!'7! !pSn%R&%Ua2wKJ,Lw22w)1 '7!573#5!7! !r&j&St&SpWl6qM,LLyy77y@!6767632#"'&'&'!  6IYZgb^UMI%&&"LF\Zfc^UM3!t:6I&&&#LHZZhc\UMH'&&#L2<tt XNy "&*.37#37#37#37#5'!!55!!3'#3'#3'#3'#r+qr*rr+rr+rV{{*q+*r*+r++r+9Ɔ\]t] 7&#"7'7 #%5#t69.wZY96t".*X/S~k 55!5!!7'!nnUVGG8:ȏu\j '327'' #395t".Y/Y"u69.xXXN2%&#"6767&'&"67632&'&547676767}:"  s %*&*(&"!#!"O>>;*E/4767!"!47676763"'&'&'&5!3!&'&5v  5 $ %% $  H vgMME %!#"!% EMu\2&'&'&'&54767#"'&'276?&'&'32\":  #'$'$#Y@I:86s6::I  #&'#'" X  :5*+B67"'&'&'&547676$47676762"'&'&'%&'&'&547676762$[ /  H =a=   / ZI=X  q> d(*c     XJn.676767632#"'&'&'&%&'&54767&'&54765 #&+*1)F-Y)) .EOO/3S>>S&/ #$))%#]]#%))$#&e"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 I ]]I    Q      Q  %eg"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 GKa u~iKG E     2 +#76767&'&/3#6767!5!!5!&'&'g?j7R=y66y=R6k?VO S+ +Sd _8=eyu'&utj>jiVVy ##! !+532765YZͷZ-,'ij>>% %!#3!3iVO7n lѲR{H3!!# 9`#3!{`9Lh '"27654'&'2#"'&7673A\VMMG*w|~~hA1LLNeˑRh]c[斘,mKseg.!#5#"&'532654&+532.Dv6;zIMcݳw"$.*gQH{"264   676326^\`s-!\[^[]-=P@7'"]_$5hWd3#3h݄D%36767#"'&5476?>5#5% Yb^`_hon"!^XE&->B%DS #D9``LAB\VBT=;-;,,1Y7:w!##Z:#5!#J&w3!3XZ!533XK,X3#3,X0X,X3#3,$dX,X3#3,X,X3#3,X,X%3#3#,񈈈X,X3##3X0X,X3##3$dX,X3##3X,X3##3X,X%3#!#3X,X!#!!yX,X!#3!!Ẍ,X!#3!!X,X!#3!!Xd,X%!!3XT| 3'#'L:LjLCUCT| #'737:LjLCUC( 3#3#'( f*D( #53#73 fRo(D dVH#!#3!+32765H),-ZͥZYd+9>>jiV4&#"#3>32+532765bjq1sYZ͹Z-,`c6ij>>~'IJ !5!5!5!J>>I3#qe10#+H %"32654&'6#"467.5463%!"h{1PAž(rڜ-*/1|I5#7N@*        JEE<2<2991/<299903#'#"!#!##535463wcM%ɩQge/яN#7B@#    JE E<<991/<29990#!"!!##5354637cM%۸ɩ{Qge/яNE & S ME & G M X& Z M  X& [ M E & S LE & G Lx X& Z L X& [ LE & S NE & G Nr  X& Z Nz X& [ NE& S M7'E& G M-x& Z Mm& [ ME& S NE' N Gy& Z N|& [ NEW& SLfEH'4W G& ZK& []r& [ Ftj' Fv K?' F,~ H' F I~& [ Nj ' Nt K?' N,x H ' N IX f& M{X f&  M/}>\/' Ma8 >/' M 8 X f& EX f&  E&8\/' E8 8/' E8 X f& L*X f&  LB\/' L >/' L8 X f& N2X f&  N^\/' N >/' N8 a7& F` D' F\ 'U` ' ]C2%#"'$4733267654'&54767;#"'&'0Qcpl?AOL64)>.VhFd((&*=#>2(I=/ b \^xHj<9"1B,f%TOA7.N?+  cG&C OJ' OT M+9' P N9' P O6 ]  &#"'&47332767654'3;#"'G{579T?:!e#"#V4^Wt<;?xC3^w3UT8@0E&6D%3!"''&5473327&'&5476&'5%67654'&#"%3276'&'&bJDv-(0g:-0M,QG$"':AG 5' 343%@K5:,+ CfN@TSZ 'AO@H=.%4-+#%v_U[1C "&_ ,:%&'&5476&'53!"'+532767654'&#"%3276'&'&\:-0M,QG JF$"':AG 5' 3CfN@TSZ 'AO844U@H=.%4-+#%v_U[1C "&_X %!#53 76=3`H՞,1VV,1jٻX%#!5!276=33!!"^L,02,*VV,1jj1,| X' E ZX' E [D&D"k ;#"'&=31,cK\WL71,\W+DD&D&D & 0!&!Vz"&"U-&#'# } 9&$9'$' }L 3&$`>Z '$2>   &% &%V }V&$Y|_'$ '$p Z'$p [ L 3;!"'&L2,PXskj1,\eE& S DE' D GX& Z DX& [ D& Ej' E E & S EE ' E G#' ER Z' ER [E& S FE' F G,& Z FR& [ F,X f& DX f' Dp \/' D  /' D  X fX f.%3#"'&'&'27'&5767&5$(1{R=IrbJԖ`e_$m3HZdP]vbĘe4)@5 [_w\/&'&'&5672+5327676SSgURHKLXJKݣdht^#4b4bBPH:jV/);#"'&'+53276767&'&'&5672~AI2h6:H~D& D] ` ' D  $F"'&''#"'&7673327676'&/37653323;#"'4A@E2J/1%=Gq_evh+&%*TdOvG#%,9?#@*8m~C "RVxgt7323;#"'#"'&'#"'&'+53276=32765!5d*,""@e;6:HO7* F35C%&F:DF*7@`*%Rx&),`X I6[m8*6759,%#GvOdTtg$& F6 ' F  ' F  ' FR    G%327654'&#"%;#"/+"'&5#"'&5473767654'&'367632Ij($?GhK=.';4f&4-//3fJZ}eh<2H7(28`@%(jm=vbw $A7. *727&'&5763"327%+5=K4X}ں>SF8I \Y];d}M4F!Ť$/%+532767&'&5476762;#""654'hkB;(aD hYYf MXD=pʨ4/gg/($'UZ'-)74--38)-'bM,(U __ z F& Dw L' D F' Dw L' D & [ D*jL' D K?' D~ H~' D" I}t& T E]~' ENk J?& H E,~~& I E!D#"'5327654'&'&7676##"'&547#76767;5#"'&5J&P DfXRNB8D-<9_h$$EB|=Q&v+6(  %z|qe))5!27654'&54767;#"'&/P/62 hF F&,@XB:f"``h$$EB|=Q&v+6(  %?+)x.CK $##"'&547#3276767;5#"'&5EcTiI(A@wc}^h3N8K+,19)"B~ss\V*"/~?]3,1j )5!27653WP,1se\,1j%)5327653;! hL,02,VV,1jkj1,TGt4%327654'&'&#"#"'&#4763&547632;#" zL,5;(.;D Kp#IxAIM\HT(RfV*9:X DD(PNKOmf7*(?$G@^m*%'+53276767632%327654'&'&#"d`p@ht4,+^]EE>/4:''5)24ed0$#1P8O$*ME5EX !a%m/%#"'+53276767632;#"%327654'&'&#"|an@h4,+^]HB3&id>/4:''5).4fb0$#1P8S1>/E5EX d%6& ] D ' Dw U& Z DR& [ DR $&'&'&'3;#"'&'#"'&5476 xRot$8pqZI-&8:m*12e CY>)2'+eO,3;I0D-=67654'&#"27&'&5476&'5#"'+5327654'&$"':A4N--0M,Q;(Jxb 41~! @H=.%4-+#%v iEN@TSZ 'C49g=ql)D%'r.C!v-3j  ;AWE L9P)8K6(S/VL_+Y9K1\S|7%&'&'&54767632;#"'&##"'&'&73327676 ,)MW,.@"##C@"*5NhLy $Eq:<3, $.=N/[ EW3235huFX^"!ݺh^bNm/>ZUb=*(DV\BAL89DEnY1X;YTBEb%$q%1&R'N(X)fP*H+,m-.s/Vy0F1u\2u3u\45J6/7=899:;%<=#{DXE%{F{G{X{H'I{H{JKDLVMN Omo{P{QH{RVT{SRwTj{U{VW^Xdm`Y`ZL`[hV`\b]LF#7fo-L7NFf@103# qf?Q@ aa1<20KTX@878YKTK T[X@878Y3#%3#?Zk10K TX@878YKTX@878Y@&  //// //]]3#@   99991<<990KTKT[X@878Y@t        !      ]]'.#"#4632326=3#"&d9 #(}gU$=19#(}fT"<9! 2-ev 3)dwyi10K TX@878YKTX@878YKTX@878Y@ //]#1Ś7]@ 91<90K TX@878YKTX@878Y@ //, ]3#'# ӌ7i@ 91290KTX@878YK TX@878Y@ //*//]373 ӌ Zj@ 9910'3$ll/{m > #.#"/  waSRd {xz{w8796/{m @ PP120332673#"&/w dRSaw m6978w{zPa103#PXck@ 1<203#3#\zkcyk#!#uŚŚkf$(#5476?>54'&'&56763#7:)*%>8'9@B9Q[~CG=9. bEBTY;X1I*%#D>"Y`LAB\VE'*==010!!=V045!5!5gr4!5!;r4!5!/r^s 2"&46"264hrL&'◚vURyVP%`8n|TyRTv?F3#%3#?53#73#'3# 3#3#'3#}}dE&"'&547332767654'3;#"'&')+ubEW-7!K4/+X`t8A>|0l7%5A8>7KZd3(,*OQ/9?0654'&323276767'&54767632#!V)B,4((7(*HTO<?aNbNLZB`.NJ|m+M;3*)3P& ]027EW4,E$2Hf3Џ,' 3;!"'#!5327&'&5476762"67654'&'ȷ$&ň($28 D@$ 8P2*I1C299(M.L,0W 5+5DE2.4!.@%&'&'&54767632;+'$'&547332766'&'&#"B.y9()Wp8c2X]0Lh^E>>:lu{/"'"5 9Ld/  #+m=E2X:SmJN}`kI="'&4762<R8R8z?@?@@?@(8)*8@@@@@??V<D@!B  10291/<2990KSXY33+532765#5YZ͹Z-,˹iij>>iE'&5473327654'ߚ)+ubj{G{yo9;>|0lALj@G}t8654'&32676#"'&54767632'&'&5473)B,4((7(*H[b?zKbNLc9g'!.9ΊMRVV+M;3*)3P&;f4KCW-3E$2Zwfj}ػH(E  ' Q & S EE' L  SX '$8X ' MX ' FT&&>x9654'&"32#"'&&733276767#"'&54767632)B,4P7&,Hir$$xZT0A&?zKbNLZB`.,L95T2R$T&()X\^-"2(hLDV,4D$2Hf3C'&6#"'&47332767654'3dG{579T?:"FHt<;?xC3b`L 3H'&p'&(L̜_<ƼHƼHUmhR!9\XdffXXX%fmVuu/9%fZH{{{mjdLhX%?wXd=+XBFjX%%%%%%uuuuu%){{{{X/hh%%%{{{{{{{f{f{f{f{FmLuuuHj j///%h%F0<<^u?4An1mu -V8xv// 'J}}}9%uz%%)f{uu}f{=)/%%{{uuhj/}%{uuuu%hjxx/!79{{{zz8{zffX(hhgEfjjzz}}}v_AHHf}i_6w#6AAQ0^^))$=$=>/VX%V[^,,,,,)=/?VX)"V//yysb^_s?$U))//=X/UU?p6%%u%Vux/%uuJ%F63F 6DtP3LYF633Ft"p"m94u`!Y4uVUm"h%!Vu/hBPr< A<L}i{;=hcL|}PhN{{# A#h uU;b/%\%\L;%%){uzuz;}uuuhhhhhhAhu11ZdL EEEXXX$$ zzC6LDDDDDD0V\~~6EEEEEEXXXX ~~>ly|as{jK}}cceesdaobwU0[SSSSxEV_In7777-7777Vv7kn#)+?+77LL,:d^E<<.?AEEGGG11OOGI8%[:X::GM[%#H[#{:GXQ:OWbG[CaIGdUU~%%UU?::[xM Fa^M3:%{{{}{{{{{f{7VmVmVmujj==////9d9dLL%hh%%%%{{{uu    ' ' ' '%h%h%hFFFFFFFF%%llMM@@cc66'33333333@EFFFFFFFFfFF633FFFFFFFFFF%%llMM@@ccFFFFFFFFfFFFFFFF%%%['/66333333%%[p?FFFFFJdd??PZZ!!=H ?I=;0A=XBF ?I=;0E1:1 {_m *{%*/.j5':TTJ B%0J%  BBBBBYYBBBBBBBBBBBBq?QQ2BXXBBBBGB*BB*B*BBBBBBBBBBBBBBBBBBEEB*BBBBBBBB%uIXXf+?;;;)}}?5XJWXXXXXXXXXXXXXXXWXXXXXWJJXXXXXXXEXXXXXXXXVVVVWXXXXVVVVVVVVVXVVVVVVXXXXXXXXXXXXXXOOOOOOOOOPPPPXXXVXVVVVXXXXVVVVPIrZZ% % XaGX++|h}2H%%?XX%XX6FFHRFFF    xxxxxxx||iEiiDDu777777?aa"2"Y::;+6.ocN8/&/// "N`ya7g!!!!GCL54=/U28Y^CVpj6gv2 1.rjD7`./<KD$>K--9.7.P<<<<<<....RRs'J*R*"..:=4%=?D-W&W;%J@3@V90~0G+%(C(#(=(.6W0$2$0174!$%2 02)!"$E=80+Qg.rA1fnCDStSt-IS-6SS`{{66O6ee5a}T2)XtSuN*u5&%287uuXXV%LZZ,,,,,,,,,,,,,,,TT(((##EEEEEEEEEEEEjjXXXXXXXX`` 6|DD"DDDD0VLZ| LEEEEEEXXXXXX``$$  zzjC G6LZ||@S__R%fmVuu/9%{{{mjdLhf?y77//Xf=^?EjEEEXXXC6LLLLL,x 8d x ( d  4  ,(PD  !!T!!""@"#p$$%%&8''p'(P)L)*+ +,,,-P.<./ /0123X4$4T5$55567L8d989::<<=`==?,?X?@<@ABBCC@CPCDHDDEE FF8F\FFFH$HHI I$I<ITIlIIIJlJJJKK<KtKLMM4MdMMN@O$O<OTOlOOOQQQ4QLQdQQQQQS S$S<STS|SST8U<UTUlUUUVpVVVVWW,WDW\WtWWWWWXXXDXTYY(Y@YXYpYYYYYZZZ0ZHZ`ZxZZZZ[$[\D\x\\\\]](]@]X]^P___0_H_``\`````aa,aDabHb`bxbbbbbcddDdddddde|fffffg g$g<gTglgggggghh8hPhiLixiiijj<jTjljjjjjkk4kLkpkkkkklldlmmn ndno`op@pPpqqlrrtsst txtuXuvv\vw wTwxxLxxyy,yyzlz{\{|L|\|},}h}~~ ~<~~TH d0 dt4Ll ,DTt $<Tl, 8Ph(@Xp0H`xLTD,Ld|``\XxDX(H|pLt<,txP@8h<p`H < 4p< |0x d<Hxp0(HlH(pP D$t@X$\œ¬¼Tð h4DlňŜŰƼ 8HȄ Ɉ<`ʈʰ 0\lHX̸̨4l͈Ͱ<`΀<hτϴPмdtѐѴ<x ,<XpԌԨ(pդ,@րּ֠4D\t׌פ׼ |،؜جL\lDTdtܜD\t݌ݤݼ|,H`h@D8p( $4Th4(dtx4< 8P(`H`pHXhxHh\x(8pPhxd ,pXh t L  8   ( @ X       @0` 0t |8DL\ T 4LX\x 0H`p 0H`x,D\t4` dl  |     !!(!@!X!p!!" "`"x""##$`$x$$%t%%%%&&'x''(x))4)`**,*H**+x+,,,$,L,h,,-l-.\../D//080\0011101H1`1x1111122 223333334`45L5\5l5|6<6778t9(9:H:;8;<`<=$=>???@A AB,BCD4DElEEF4FLFFG,GGHHHHIPIJJ,J\JKKLLxLMpMN4NOOdOP4PQQQR,RSPST@TUUVVTVWhWX$XY\YZ0Z[,[\(\\]`]]^_0_h``D`x`aaaabdbbcc`ccdd8dXddde8e|effhfggghhiTij jjkhkkl@llm<mlmmn0ntno oHo\opoopp$plpqqdqrhrssdsttXtttuTuuuvvw<wwxHxyyz4zz{L{t{{|L|}}}0}H}`}x}}}}}~~,~D~\~t~~~~~4Lh,D\t4Ld| $<Tl,D\t,D\t4Ld,D\t ,D\t4Ld| $<Tl$<Tl4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld|$<Ldt $<Tl,D\t4Ld| $<Tl,D\t4D\l|(@Xh $<Ld| 8Phx 0H`p 8H`p(PxDh  DD8Tt (D`` xX0X$8L`t(<Pdx(h`000dt ˆHpŸlƬƼdDŽǤ$DdȄȤ,`ɔ Tʄʴ T˜D4| LΌ@|PѠhӀ$\Ԕ<t֐4؄ب Hpٔٸ `ڴDیPܴ0ݔTޔLߌ L x`@|4pTl0tT4<p, P,0 0DT`$Hp4 ,PD8TDTh(\ X   8   d   t  P x$h0, 8|Tth,Hx( t  !\!!!"\"##8#l#$<$%h%& &X&' '(H(() )8)p)))*4*T*t***++,+T+t++,,`,---..(.H../0//445$5P556@6X67h77788889 9::H::;4;;< <8?(?h???@@@0@H@`@x@@ApBCCEEFlFGGPGlGGGH0HPHlHHHHI$I|IIJJ`JJJK(KlKKKKLLHLLLM4M|MMNN4NXN|NNNOO,OPOtOOOOP PHPtPPPQ$QLQtQQQRRLRxRRRS SHSpSSSTT@TlTTTUU<UlUUVV<VpVVWWLWWWX XTXXXYY0YXYYYZ Z8ZdZZZ[$[P[|[[\\X\\\]0]`]]^^D^^_,_`___``8`x````aa a<aXa|aaabb b<bXbtbbbbccc8cTcpcccdpefffffg g(g@g\gxgggghh\hthi(j\jklm m(mTmpmmmnn4nPnxnnnoo$oPoloooop p<phppppqqDqrrhrstxu,uduv vdvw wpwwxxtxyyHytyyzzTzpzzz{{4{`{{{|8|d||}0}l}}~`~L<hP``((\8$|lxl4,<@(h$XDX`$p@0hxX|ĘŬƼH@ʄLL4Θ< `Ѽ Ҁ ӴtXP4DlXh݈d$(X0XPp(8`thXtt@Px <h   P| p\$L|L4  !L!"D"#$$$%d%&&t&'|'((`()t+(-(.h0245:?h@ @BdCE4FGH@HtHHII`I|IIIIJJ4K,KLM(MNOPPPQQ(QPQxQQQRR@RSSDSpSSSTTTU<UUUVV8VVW W8W|WXX\XXYHYZZ[[L[\L\]^d_`,a`abXbbccDcdccd d8dddddeeDetfffg gDglgh<hhhihiiiiij jHjpjjjkk8k`kkkkll0l\llllm<mmmmn$no<ooop p$p<pTplppppppqq,qDq\qtqqqqqrrr4rLrdr|rrrrrs s$s<sTslsssssstt,tDt\tttttuPu`upuuuuuvXvhw8wHwx0xtxxxxxxxy0y@yPyhyxyyyyyyzzz0zHz`zxzzzzz{{ {8{H{|{{{{{| |$|<|T|l||||||}},}<}~<~~~ 00H`pDt84D  ,D\tH<Ph8(8 $<Tl (8HXhx(8HXhx(8HXhx(8HXhx$$PX TD,H$4L|hH0H`x@X a +kW_B]  @  4     S  b     " :R & hhCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoBookBookDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoVersion 2.30Version 2.30DejaVuSansMonoDejaVuSansMonoDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License~Z a  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0244uni0245uni024Cuni024Duni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02D0uni02D1uni02D2uni02D3uni02D6uni02D7uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EEuni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni0510uni0511uni051Auni051Buni051Cuni051Duni0606uni0607uni0609uni060Auni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni0674uni0679uni067Auni067Buni067Euni067Funi0680uni0683uni0684uni0686uni0687uni0691uni0698uni06A4uni06A9uni06AFuni06BEuni06CCuni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Buni1E9Funi1EA0uni1EA1uni1EACuni1EADuni1EB0uni1EB1uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015 underscoredbl quotereverseduni201Funi2023uni202Funi2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni2045uni2046uni2047uni2048uni2049uni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni2102uni2105uni210Duni210Euni210Funi2115uni2116uni2117uni2119uni211Auni211Duni2124uni2126uni212Auni212B estimatedonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni2213uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangle logicaland logicalor intersectionunionuni222Cuni222Duni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Funi2290uni2291uni2292 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1dotmathuni22C6uni22CDuni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni2341uni2342uni2343uni2344uni2347uni2348uni2349uni234Buni234Cuni234Duni2350uni2352uni2353uni2354uni2357uni2358uni2359uni235Auni235Buni235Cuni235Euni235Funi2360uni2363uni2364uni2365uni2368uni2369uni236Buni236Cuni236Duni236Euni236Funi2370uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26B0uni26B1uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27C5uni27C6uni27E0uni27E8uni27E9uni29EBuni29FAuni29FBuni2A2Funi2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C64uni2C6Euni2C6Funi2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Cuni2C7Duni2E18uni2E22uni2E23uni2E24uni2E25uni2E2EuniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA726uniA727uniA789uniA78AuniA78BuniA78CuniF6C5uniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBAAuniFBABuniFBACuniFBADuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D670u1D671u1D672u1D673u1D674u1D675u1D676u1D677u1D678u1D679u1D67Au1D67Bu1D67Cu1D67Du1D67Eu1D67Fu1D680u1D681u1D682u1D683u1D684u1D685u1D686u1D687u1D688u1D689u1D68Au1D68Bu1D68Cu1D68Du1D68Eu1D68Fu1D690u1D691u1D692u1D693u1D694u1D695u1D696u1D697u1D698u1D699u1D69Au1D69Bu1D69Cu1D69Du1D69Eu1D69Fu1D6A0u1D6A1u1D6A2u1D6A3u1D7F6u1D7F7u1D7F8u1D7F9u1D7FAu1D7FBu1D7FCu1D7FDu1D7FEu1D7FF dlLtcaron DiaeresisAcuteTildeGrave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbols arabic_dot arabic_2dots arabic_3dots uni066E.fina uni06A1.init uni06A1.medi uni066F.fina uni06A1.finaarabic_3dots_aarabic_2dots_a arabic_4dotsarabic_gaf_bararabic_gaf_bar_a arabic_ringEng.altuni066Euni066Funi067Cuni067Duni0681uni0682uni0685uni0692uni06A1uni06B5uni06BAuni06C6uni06CEuni06D5]A GA% } % 2  %%@Y}2}Y&Y@&//2G@Gddkߖږ؍ }:Ս :  ϊ̖ˋ%}Ś   ]%]@%AA dd@2(-}-d   ..A]%]@%%%A  %d%BSx~}~}}|{zwvut uu@t tss@rqponSonm(nSm(lk2ji2hgfedcbcbba`_^Z ^]d\[Z [Z YXWVUU2TSRQ}PONM-MLK(JIJ7ICIHEHGCGdFEFEDCD7CBCC@@ BABB@ A@AA@ @? @@@ ? ? ?@@d>=-=<;(:9B9d818K76-65K404K3032B21-10/-/. .-,--@ ,,,@@+*%+* *%):)('&%B%E$#""! -!} -KBBF-B-B-B@  @   @    @  @7    -:-:-d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/isxn.py0000755000175000017510000000714715053563202016567 0ustar00buildbuild"""Module: barcode.isxn :Provided barcodes: ISBN-13, ISBN-10, ISSN This module provides some special codes, which are no standalone barcodes. All codes where transformed to EAN-13 barcodes. In every case, the checksum is new calculated. Example:: >>> from barcode import get_barcode >>> ISBN = get_barcode('isbn10') >>> isbn = ISBN('0132354187') >>> isbn '0132354187' >>> isbn.get_fullcode() '9780132354189' >>> # Test with wrong checksum >>> isbn = ISBN('0132354180') >>> isbn '0132354187' """ from __future__ import annotations from barcode.ean import EuropeanArticleNumber13 from barcode.errors import BarcodeError from barcode.errors import WrongCountryCodeError __docformat__ = "restructuredtext en" class InternationalStandardBookNumber13(EuropeanArticleNumber13): """Initializes new ISBN-13 barcode. :parameters: isbn : String The isbn number as string. writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). """ name = "ISBN-13" def __init__(self, isbn, writer=None, no_checksum=False, guardbar=False) -> None: isbn = isbn.replace("-", "") self.isbn13 = isbn if isbn[:3] not in ("978", "979"): raise WrongCountryCodeError("ISBN must start with 978 or 979.") if isbn[:3] == "979" and isbn[3:4] not in ("1", "8"): raise BarcodeError("ISBN must start with 97910 or 97911.") super().__init__(isbn, writer, no_checksum, guardbar) class InternationalStandardBookNumber10(InternationalStandardBookNumber13): """Initializes new ISBN-10 barcode. This code is rendered as EAN-13 by prefixing it with 978. :parameters: isbn : String The isbn number as string. writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). """ name = "ISBN-10" digits = 9 def __init__(self, isbn, writer=None) -> None: isbn = isbn.replace("-", "") isbn = isbn[: self.digits] super().__init__("978" + isbn, writer) self.isbn10 = isbn self.isbn10 = f"{isbn}{self._calculate_checksum()}" def _calculate_checksum(self): tmp = sum(x * int(y) for x, y in enumerate(self.isbn10[:9], start=1)) % 11 if tmp == 10: return "X" return tmp def __str__(self) -> str: return self.isbn10 class InternationalStandardSerialNumber(EuropeanArticleNumber13): """Initializes new ISSN barcode. This code is rendered as EAN-13 by prefixing it with 977 and adding 00 between code and checksum. :parameters: issn : String The issn number as string. writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). """ name = "ISSN" digits = 7 def __init__(self, issn, writer=None) -> None: issn = issn.replace("-", "") issn = issn[: self.digits] self.issn = issn self.issn = f"{issn}{self._calculate_checksum()}" super().__init__(self.make_ean(), writer) def _calculate_checksum(self): tmp = ( 11 - sum(x * int(y) for x, y in enumerate(reversed(self.issn[:7]), start=2)) % 11 ) if tmp == 10: return "X" return tmp def make_ean(self): return f"977{self.issn[:7]}00{self._calculate_checksum()}" def __str__(self) -> str: return self.issn # Shortcuts ISBN13 = InternationalStandardBookNumber13 ISBN10 = InternationalStandardBookNumber10 ISSN = InternationalStandardSerialNumber ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/itf.py0000644000175000017510000000434315053563202016360 0ustar00buildbuild"""Module: barcode.itf :Provided barcodes: Interleaved 2 of 5 """ from __future__ import annotations __docformat__ = "restructuredtext en" from barcode.base import Barcode from barcode.charsets import itf from barcode.errors import IllegalCharacterError MIN_SIZE = 0.2 MIN_QUIET_ZONE = 6.4 class ITF(Barcode): """Initializes a new ITF instance. :parameters: code : String ITF (Interleaved 2 of 5) numeric string writer : barcode.writer Instance The writer to render the barcode (default: SVGWriter). narrow: Integer Width of the narrow elements (default: 2) wide: Integer Width of the wide elements (default: 5) wide/narrow must be in the range 2..3 """ name = "ITF" def __init__(self, code, writer=None, narrow=2, wide=5) -> None: if not code.isdigit(): raise IllegalCharacterError("ITF code can only contain numbers.") # Length must be even, prepend 0 if necessary if len(code) % 2 != 0: code = "0" + code self.code = code self.writer = writer or self.default_writer() self.narrow = narrow self.wide = wide def __str__(self) -> str: return self.code def get_fullcode(self): return self.code def build(self) -> list[str]: data = itf.START for i in range(0, len(self.code), 2): bars_digit = int(self.code[i]) spaces_digit = int(self.code[i + 1]) for j in range(5): data += itf.CODES[bars_digit][j].upper() data += itf.CODES[spaces_digit][j].lower() data += itf.STOP raw = "" for e in data: if e == "W": raw += "1" * self.wide if e == "w": raw += "0" * self.wide if e == "N": raw += "1" * self.narrow if e == "n": raw += "0" * self.narrow return [raw] def render(self, writer_options, text=None): options = { "module_width": MIN_SIZE / self.narrow, "quiet_zone": MIN_QUIET_ZONE, } options.update(writer_options or {}) return super().render(options, text) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/pybarcode.py0000644000175000017510000000655615053563202017556 0ustar00buildbuildfrom __future__ import annotations import os from argparse import ArgumentParser import barcode from barcode.version import version from barcode.writer import BaseWriter from barcode.writer import ImageWriter from barcode.writer import SVGWriter IMG_FORMATS = ("BMP", "GIF", "JPEG", "MSP", "PCX", "PNG", "TIFF", "XBM") def list_types(args, parser=None) -> None: print("\npython-barcode available barcode formats:") print(", ".join(barcode.PROVIDED_BARCODES)) print("\n") print("Available image formats") print("Standard: svg") if ImageWriter is not None: print("Pillow:", ", ".join(IMG_FORMATS)) else: print("Pillow: disabled") print("\n") def create_barcode(args, parser) -> None: args.type = args.type.upper() if args.type != "SVG" and args.type not in IMG_FORMATS: parser.error(f"Unknown type {args.type}. Try list action for available types.") args.barcode = args.barcode.lower() if args.barcode not in barcode.PROVIDED_BARCODES: parser.error( f"Unknown barcode {args.barcode}. Try list action for available barcodes." ) if args.type != "SVG": assert ImageWriter is not None opts = {"format": args.type} writer: BaseWriter = ImageWriter() else: opts = {"compress": args.compress} writer = SVGWriter() out = os.path.normpath(os.path.abspath(args.output)) name = barcode.generate(args.barcode, args.code, writer, out, opts, args.text) print(f"New barcode saved as {name}.") def main() -> None: msg = [] if ImageWriter is None: msg.append("Image output disabled (Pillow not found), --type option disabled.") else: msg.append( "Image output enabled, use --type option to give image " "format (png, jpeg, ...)." ) parser = ArgumentParser( description="Create standard barcodes via cli.", epilog=" ".join(msg) ) parser.add_argument( "-v", "--version", action="version", version="%(prog)s " + version ) subparsers = parser.add_subparsers(title="Actions") create_parser = subparsers.add_parser( "create", help="Create a barcode with the given options." ) create_parser.add_argument("code", help="Code to render as barcode.") create_parser.add_argument( "output", help="Filename for output without extension, e. g. mybarcode." ) create_parser.add_argument( "-c", "--compress", action="store_true", help="Compress output, only recognized if type is svg.", ) create_parser.add_argument( "-b", "--barcode", help="Barcode to use [default: %(default)s]." ) create_parser.add_argument("--text", help="Text to show under the barcode.") if ImageWriter is not None: create_parser.add_argument( "-t", "--type", help="Type of output [default: %(default)s]." ) list_parser = subparsers.add_parser( "list", help="List available image and code types." ) list_parser.set_defaults(func=list_types) create_parser.set_defaults( type="svg", compress=False, func=create_barcode, barcode="code39", text=None ) args = parser.parse_args() try: func = args.func except AttributeError: parser.error("You need to tell me what to do.") else: func(args, parser) if __name__ == "__main__": main() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/upc.py0000755000175000017510000000615315053563202016371 0ustar00buildbuild"""Module: barcode.upc :Provided barcodes: UPC-A """ from __future__ import annotations __docformat__ = "restructuredtext en" from functools import reduce from barcode.base import Barcode from barcode.charsets import upc as _upc from barcode.errors import IllegalCharacterError from barcode.errors import NumberOfDigitsError class UniversalProductCodeA(Barcode): """Universal Product Code (UPC) barcode. UPC-A consists of 12 numeric digits. """ name = "UPC-A" digits = 11 def __init__(self, upc, writer=None, make_ean=False) -> None: """Initializes new UPC-A barcode. :param str upc: The upc number as string. :param writer: barcode.writer instance. The writer to render the barcode (default: SVGWriter). :param bool make_ean: Indicates if a leading zero should be added to the barcode. This converts the UPC into a valid European Article Number (EAN). """ self.ean = make_ean upc = upc[: self.digits] if not upc.isdigit(): raise IllegalCharacterError("UPC code can only contain numbers.") if len(upc) != self.digits: raise NumberOfDigitsError( f"UPC must have {self.digits} digits, not {len(upc)}." ) self.upc = upc self.upc = f"{upc}{self.calculate_checksum()}" self.writer = writer or self.default_writer() def __str__(self) -> str: if self.ean: return "0" + self.upc return self.upc def get_fullcode(self): if self.ean: return "0" + self.upc return self.upc def calculate_checksum(self): """Calculates the checksum for UPCA/UPC codes :return: The checksum for 'self.upc' :rtype: int """ def sum_(x, y): return int(x) + int(y) upc = self.upc[0 : self.digits] oddsum = reduce(sum_, upc[::2]) evensum = reduce(sum_, upc[1::2]) check = (evensum + oddsum * 3) % 10 if check == 0: return 0 return 10 - check def build(self) -> list[str]: """Builds the barcode pattern from 'self.upc' :return: The pattern as string :rtype: List containing the string as a single element """ code = _upc.EDGE[:] for _i, number in enumerate(self.upc[0:6]): code += _upc.CODES["L"][int(number)] code += _upc.MIDDLE for number in self.upc[6:]: code += _upc.CODES["R"][int(number)] code += _upc.EDGE return [code] def to_ascii(self) -> str: """Returns an ascii representation of the barcode. :rtype: str """ code_list = self.build() if len(code_list) != 1: raise RuntimeError("Code list must contain a single element.") code = code_list[0] return code.replace("1", "|").replace("0", "_") def render(self, writer_options=None, text=None): options = {"module_width": 0.33} options.update(writer_options or {}) return super().render(options, text) UPCA = UniversalProductCodeA ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292740.0 python_barcode-0.16.1/barcode/version.py0000644000175000017510000000131215053563204017256 0ustar00buildbuild# file generated by setuptools-scm # don't change, don't track in version control __all__ = [ "__version__", "__version_tuple__", "version", "version_tuple", "__commit_id__", "commit_id", ] TYPE_CHECKING = False if TYPE_CHECKING: from typing import Tuple from typing import Union VERSION_TUPLE = Tuple[Union[int, str], ...] COMMIT_ID = Union[str, None] else: VERSION_TUPLE = object COMMIT_ID = object version: str __version__: str __version_tuple__: VERSION_TUPLE version_tuple: VERSION_TUPLE commit_id: COMMIT_ID __commit_id__: COMMIT_ID __version__ = version = '0.16.1' __version_tuple__ = version_tuple = (0, 16, 1) __commit_id__ = commit_id = 'gcf58852b0' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/barcode/writer.py0000755000175000017510000004251415053563202017117 0ustar00buildbuildfrom __future__ import annotations import gzip import os import xml.dom.minidom from typing import TYPE_CHECKING from typing import BinaryIO from typing import Callable from typing import TypedDict from barcode.version import version if TYPE_CHECKING: from typing import Generator from typing import Literal from PIL.Image import Image as T_Image from PIL.ImageDraw import ImageDraw as T_ImageDraw class InternalText(TypedDict): start: list end: list xpos: list was_guard: bool class Callbacks(TypedDict): initialize: Callable | None paint_module: Callable paint_text: Callable | None finish: Callable try: from PIL import Image from PIL import ImageDraw from PIL import ImageFont except ImportError: import logging log = logging.getLogger("pyBarcode") log.info("Pillow not found. Image output disabled") Image = ImageDraw = ImageFont = None def mm2px(mm: float, dpi: int) -> float: return (mm * dpi) / 25.4 def pt2mm(pt: float) -> float: return pt * 0.352777778 def _set_attributes(element, **attributes): for key, value in attributes.items(): element.setAttribute(key, value) def create_svg_object(with_doctype=False) -> xml.dom.minidom.Document: imp = xml.dom.minidom.getDOMImplementation() assert imp is not None doctype = imp.createDocumentType( "svg", "-//W3C//DTD SVG 1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd", ) document = imp.createDocument(None, "svg", doctype if with_doctype else None) _set_attributes( document.documentElement, version="1.1", xmlns="http://www.w3.org/2000/svg" ) return document SIZE = "{0:.3f}mm" COMMENT = f"Autogenerated with python-barcode {version}" PATH = os.path.dirname(os.path.abspath(__file__)) class BaseWriter: """Baseclass for all writers. Initializes the basic writer options. Child classes can add more attributes and can set them directly or using ``self.set_options(option=value)``. :param initialize: Callback for initializing the inheriting writer. Is called: ``callback_initialize(raw_code)`` :param paint_module: Callback for painting one barcode module. Is called: ``callback_paint_module(xpos, ypos, width, color)`` :param paint_text: Callback for painting the text under the barcode. Is called: ``callback_paint_text(xpos, ypos)`` using `self.text` as text. :param finish: Callback for doing something with the completely rendered output. Is called: ``return callback_finish()`` and must return the rendered output. """ _callbacks: Callbacks module_width: float module_height: float font_path: str font_size: float quiet_zone: float background: str | int foreground: str | int text: str human: str text_distance: float text_line_distance: float center_text: bool guard_height_factor: float margin_top: float margin_bottom: float def __init__( self, initialize: Callable | None, paint_module: Callable, paint_text: Callable | None, finish: Callable, ) -> None: self._callbacks = { "initialize": initialize, "paint_module": paint_module, "paint_text": paint_text, "finish": finish, } self.module_width = 10 self.module_height = 10 self.font_path = os.path.join(PATH, "fonts", "DejaVuSansMono.ttf") self.font_size = 10 self.quiet_zone = 6.5 self.background = "white" self.foreground = "black" self.text = "" self.human = "" # human readable text self.text_distance = 5 self.text_line_distance = 1 self.center_text = True self.guard_height_factor = 1.1 self.margin_top = 1 self.margin_bottom = 1 def calculate_size(self, modules_per_line: int, number_of_lines: int) -> tuple: """Calculates the size of the barcode in pixel. :param modules_per_line: Number of modules in one line. :param number_of_lines: Number of lines of the barcode. :returns: Width and height of the barcode in pixel. """ width = 2 * self.quiet_zone + modules_per_line * self.module_width height = ( self.margin_bottom + self.margin_top + self.module_height * number_of_lines ) number_of_text_lines = len(self.text.splitlines()) if self.font_size and self.text: height += ( pt2mm(self.font_size) / 2 * number_of_text_lines + self.text_distance ) height += self.text_line_distance * (number_of_text_lines - 1) return width, height def save(self, filename: str, output) -> str: """Saves the rendered output to `filename`. :param filename: Filename without extension. :param output: The rendered output. :returns: The full filename with extension. """ raise NotImplementedError def register_callback( self, action: Literal["initialize", "paint_module", "paint_text", "finish"], callback: Callable, ) -> None: """Register one of the three callbacks if not given at instance creation. :param action: One of 'initialize', 'paint_module', 'paint_text', 'finish'. :param callback: The callback function for the given action. """ self._callbacks[action] = callback def set_options(self, options: dict) -> None: """Sets the given options as instance attributes (only if they are known). :param options: All known instance attributes and more if the child class has defined them before this call. """ for key, val in options.items(): key = key.lstrip("_") if hasattr(self, key): setattr(self, key, val) def packed(self, line: str) -> Generator[tuple[int, float], str, None]: """ Pack line to list give better gfx result, otherwise in can result in aliasing gaps '11010111' -> [2, -1, 1, -1, 3] This method will yield a sequence of pairs (width, height_factor). :param line: A string matching the writer spec (only contain 0 or 1 or G). """ line += " " c = 1 for i in range(len(line) - 1): if line[i] == line[i + 1]: c += 1 else: if line[i] == "1": yield (c, 1) elif line[i] == "G": yield (c, self.guard_height_factor) else: yield (-c, self.guard_height_factor) c = 1 def render(self, code: list[str]): """Renders the barcode to whatever the inheriting writer provides, using the registered callbacks. :parameters: code : List List consisting of a single string matching the writer spec (only contain 0 or 1 or G). """ if self._callbacks["initialize"] is not None: self._callbacks["initialize"](code) ypos = self.margin_top base_height = self.module_height if len(code) != 1: raise NotImplementedError("Only one line of code is supported") line = code[0] # Left quiet zone is x startposition xpos = self.quiet_zone bxs = xpos # x start of barcode text: InternalText = { "start": [], # The x start of a guard "end": [], # The x end of a guard "xpos": [], # The x position where to write a text block # Flag that indicates if the previous mod was part of an guard block: "was_guard": False, } for mod, height_factor in self.packed(line): if mod < 1: color = self.background else: color = self.foreground if text["was_guard"] and height_factor == 1: # The current guard ended, store its x position text["end"].append(xpos) text["was_guard"] = False elif not text["was_guard"] and height_factor != 1: # A guard started, store its x position text["start"].append(xpos) text["was_guard"] = True self.module_height = base_height * height_factor # remove painting for background colored tiles? self._callbacks["paint_module"]( xpos, ypos, self.module_width * abs(mod), color ) xpos += self.module_width * abs(mod) else: if height_factor != 1: text["end"].append(xpos) self.module_height = base_height bxe = xpos ypos += self.module_height if self.text and self._callbacks["paint_text"] is not None: if not text["start"]: # If we don't have any start value, print the entire ean ypos += self.text_distance xpos = bxs + (bxe - bxs) / 2.0 if self.center_text else bxs self._callbacks["paint_text"](xpos, ypos) else: # Else, divide the ean into blocks and print each block # in the expected position. text["xpos"] = [bxs - 4 * self.module_width] # Calculates the position of the text by getting the difference # between a guard end and the next start text["start"].pop(0) for s, e in zip(text["start"], text["end"]): text["xpos"].append(e + (s - e) / 2) # The last text block is always put after the last guard end text["xpos"].append(text["end"][-1] + 4 * self.module_width) ypos += pt2mm(self.font_size) # Split the ean into its blocks blocks = self.text.split(" ") for text_, xpos in zip(blocks, text["xpos"]): self.text = text_ self._callbacks["paint_text"](xpos, ypos) return self._callbacks["finish"]() def write(self, content, fp: BinaryIO) -> None: raise NotImplementedError class SVGWriter(BaseWriter): def __init__(self) -> None: super().__init__( self._init, self._create_module, self._create_text, self._finish, ) self.compress: bool = False self.with_doctype: bool = True self._document: xml.dom.minidom.Document self._root: xml.dom.minidom.Element self._group: xml.dom.minidom.Element def _init(self, code: list[str]): if len(code) != 1: raise NotImplementedError("Only one line of code is supported") line = code[0] width, height = self.calculate_size(len(line), 1) self._document = create_svg_object(self.with_doctype) self._root = self._document.documentElement attributes = { "width": SIZE.format(width), "height": SIZE.format(height), } _set_attributes(self._root, **attributes) if COMMENT: self._root.appendChild(self._document.createComment(COMMENT)) # create group for easier handling in 3rd party software # like corel draw, inkscape, ... group = self._document.createElement("g") attributes = {"id": "barcode_group"} _set_attributes(group, **attributes) self._group = self._root.appendChild(group) if self.background is not None: background = self._document.createElement("rect") attributes = { "width": "100%", "height": "100%", "style": f"fill:{self.background}", } _set_attributes(background, **attributes) self._group.appendChild(background) def _create_module(self, xpos, ypos, width, color): # Background rect has been provided already, so skipping "spaces" if color != self.background: element = self._document.createElement("rect") attributes = { "x": SIZE.format(xpos), "y": SIZE.format(ypos), "width": SIZE.format(width), "height": SIZE.format(self.module_height), "style": f"fill:{color};", } _set_attributes(element, **attributes) self._group.appendChild(element) def _create_text(self, xpos, ypos): # check option to override self.text with self.human (barcode as # human readable data, can be used to print own formats) barcodetext = self.human if self.human != "" else self.text for subtext in barcodetext.split("\n"): element = self._document.createElement("text") attributes = { "x": SIZE.format(xpos), "y": SIZE.format(ypos), "style": ( f"fill:{self.foreground};" f"font-size:{self.font_size}pt;text-anchor:middle;" ), } _set_attributes(element, **attributes) text_element = self._document.createTextNode(subtext) element.appendChild(text_element) self._group.appendChild(element) ypos += pt2mm(self.font_size) + self.text_line_distance def _finish(self): if self.compress: return self._document.toxml(encoding="UTF-8") return self._document.toprettyxml( indent=4 * " ", newl=os.linesep, encoding="UTF-8" ) def save(self, filename: str, output) -> str: if self.compress: _filename = f"{filename}.svgz" with gzip.open(_filename, "wb") as f: f.write(output) f.close() else: _filename = f"{filename}.svg" with open(_filename, "wb") as f: f.write(output) return _filename def write(self, content, fp: BinaryIO) -> None: """Write `content` into a file-like object. Content should be a barcode rendered by this writer. """ fp.write(content) if Image is None: ImageWriter: type | None = None else: class ImageWriter(BaseWriter): # type: ignore[no-redef] format: str mode: str dpi: int def __init__(self, format="PNG", mode="RGB", dpi=300) -> None: """Initialise a new write instance. :params format: The file format for the generated image. This parameter can take any value that Pillow accepts. :params mode: The colour-mode for the generated image. Set this to RGBA if you wish to use colours with transparency. """ super().__init__( self._init, self._paint_module, self._paint_text, self._finish, ) self.format = format self.mode = mode self.dpi = dpi self._image: T_Image self._draw: T_ImageDraw def _init(self, code: list[str]) -> None: if ImageDraw is None: raise RuntimeError("Pillow not found. Cannot create image.") if len(code) != 1: raise NotImplementedError("Only one line of code is supported") line = code[0] width, height = self.calculate_size(len(line), 1) size = (int(mm2px(width, self.dpi)), int(mm2px(height, self.dpi))) self._image = Image.new(self.mode, size, self.background) self._draw = ImageDraw.Draw(self._image) def _paint_module(self, xpos: float, ypos: float, width: float, color): size = [ (mm2px(xpos, self.dpi), mm2px(ypos, self.dpi)), ( mm2px(xpos + width, self.dpi) - 1, mm2px(ypos + self.module_height, self.dpi), ), ] self._draw.rectangle(size, outline=color, fill=color) def _paint_text(self, xpos, ypos): assert ImageFont is not None # check option to override self.text with self.human (barcode as # human readable data, can be used to print own formats) barcodetext = self.human if self.human != "" else self.text font_size = int(mm2px(pt2mm(self.font_size), self.dpi)) if font_size <= 0: return font = ImageFont.truetype(self.font_path, font_size) for subtext in barcodetext.split("\n"): pos = ( mm2px(xpos, self.dpi), mm2px(ypos, self.dpi), ) self._draw.text( pos, subtext, font=font, fill=self.foreground, anchor="md" ) ypos += pt2mm(self.font_size) / 2 + self.text_line_distance def _finish(self) -> T_Image: return self._image def save(self, filename: str, output) -> str: filename = f"{filename}.{self.format.lower()}" output.save(filename, self.format.upper()) return filename def write(self, content, fp: BinaryIO) -> None: """Write `content` into a file-like object. Content should be a barcode rendered by this writer. """ content.save(fp, format=self.format) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.0985684 python_barcode-0.16.1/docs/0000755000175000017510000000000015053563204014553 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/Makefile0000644000175000017510000000117215053563202016212 0ustar00buildbuild# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ././@PaxHeader0000000000000000000000000000003000000000000010206 xustar0024 mtime=1756292740.093 python_barcode-0.16.1/docs/_static/0000755000175000017510000000000015053563204016201 5ustar00buildbuild././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.0986688 python_barcode-0.16.1/docs/_static/images/0000755000175000017510000000000015053563204017446 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/_static/images/pybarcode.png0000644000175000017510000000733215053563202022127 0ustar00buildbuildPNG  IHDR1qIDATx[egvus=eE(YEy6:`If'P7*Q-&(;(HvaA02)$fe<:;wggٛ}>W|?sB!L?=A4! @hBD" D4!5߮s\JůnvVv g5Oȓ^ų[aF8dZ;ɴskÏ&> kܵ}s<ҳڰSݦ}GMi嗻SP+;~E^Z(=Yadsoqm G D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD"\P 8 D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4! @hBD" D4!3\HUUU׮]O߿?p7r{sO.8qb.͡xҥKGեK.]5jҥ/BPy?Ԝwywqdž ZaÆlW_}Ua?m8hР3fl߾BxqƝs9w߾jժ֮=]p'N\p'ͧw)=_~gP駟:묔Қ5k/zYge˖Ccs^|޼ys^bEmW. /dΝ {qƦa;vlk/vWn۶ig'm۶-\w)z(>k֬?mihh0`@Jiٕ?smmm.7o޽{;o޼\.W[[uݻw?~|d744l޼J) 6tpq*'o߾}_~yJnh.z뭷vаu \uU]{P8z֭[|́Fv;3\O0}QJO>ɣG^|ũ=z4ٳgw_Jg-?u\.yvJ)5yرN:eN~!ԩSg}Rٳg!fk/p Nih);wf';vꫯfΜo۶-;ꫯvر}z͚5);Sxcv2{Aɔ)Sr\6rєRnݚm_~Ç/첁:t(+jjjRJݻwN.\04mڴ>}H|MRzN:ySJg}vӖcvm6mڴi<8yoݯK)eܛd'7o\_~7t… 8pаiӦ~8t-4;?N)3f̘1)+WOPسgϪU';۾nݺ+!fҗ_~Ya p:Ӈ:U|?ollKӐ_kd+?ֲW9R|ÇgWl(ϯ|YGSL9tP#GL)}˗/O)5޽ӛ^Ɏ^߿|ZbG]uVa>~vNrǥ駟{3fdxG+Sx61WUqꪪ|>_B0`o{1[:ѣGϙ3gСM8УGҞ={RJ=zr{ܹsr|puuuٖ|>ĉriڋ/kjj^Fn:8u^࿥s΃ z'7lЬRJk)S*JۼYxcRJ'?r)Sl޼9;P*~^{mӦMG^ɬ]ĉC;;aȐ!Ǐ_vmcǎڵkٲe믿ؑ #;lPN^ȑ#MWl]nқw9 '4=8p`Æ 3g,}3`JCO14ޒٳgw_׮]ϟۡC ._h{챦w0dfhG.bUUU={[/_^SShѢo SJG*iڛ/)N3ե^Rڸqco&t%ܹ<~V8QΈ#RJ Y³FVx/dJiРA;ByݮX¥Z&|IJi4SzJ8暔Ғ%K7f&k[#x$~_nLd-[:t^z}۷_,MƏߥKSYK>߽{+?'MmSɷ@fP;5}҄ &MJ)w;w<~oo : k?vXWs6ĉS[4 {4ߋLJoZJ<)^xsIEI-w;wRfݺuB᯿Z֮+Un݀r<8õ퉶mc}Ç׏1bɒ%7666]}r޽!Czݻw7۷oJ/(R۷ou 'x"tg'EƌӫW޽{O=8.0.0``. v0.11.0 ~~~~~~~ * Added basic support for multiline text. * Dropped lots of older compat-only code and other cleanups. * Fixed a bug in the API when combining certain barcodes and writers. * Published documentation again and updated all project references. * Fix python_barcode.get mixups between `options` as `writer_options`. Previously, some writer/barcode combinations worked fine, while others failed. Now all work consistently. * The cli tool has been fixed and should now work as expected again. v0.10.0 ~~~~~~~ * Added support for GS1-128. v0.9.1 ~~~~~~ * Officially support Python 3.7 * Refer to Pillow in the docs, rather than PIL. v0.9.0 ~~~~~~ * Removed buggy ``Barcode.raw`` attribute. * Various CLI errors ironed out. * Make the default value for ``writer_options``` consistent across writers. v0.8.3 ~~~~~~ * Fix pushing of releases to GitHub. v0.8.2 ~~~~~~ * Fix crashes when attempting to use the CLI app. * Properly include version numbers in SVG comments. v0.8.1 ~~~~~~ * Improve README rendering, and point to this fork's location (the outdated README on PyPI was causing some confusion). v0.8.0 ~~~~~~ * First release under the name ``python-barcode``. Previous Changelog ------------------ This project is a fork of pyBarcode, which, apparently, is no longer maintained. v0.8.0 is our first release, and is the latest ``master`` from that parent project. v0.8 ~~~~ * Code 128 added. * Data for charsets and bars moved to subpackage barcode.charsets. * Merged in some improvements. v0.7 ~~~~ * Fixed some issues with fontsize and fontalignment. * Added Python 3 support. It's not well tested yet, but the tests run without errors with Python 3.3. Commandline script added. v0.6 ~~~~ * Changed save and write methods to take the options as a dict not as keyword arguments (fix this in your code). Added option to left align the text under the barcode. Fixed bug with EAN13 generation. v0.5.0 ~~~~~~ * Added new generate function to do all generation in one step. * Moved writer from a subpackage to a module (this breaks some existing code). UPC is now rendered as real UPC, not as EAN13 with the leading "0". v0.4.3 ~~~~~~ * Fixed bug in new write method (related to PIL) and updated docs. v0.4.2 ~~~~~~ * Added write method to support file like objects as target. v0.4.1 ~~~~~~ * Bugfix release. Removed redundancy in input validation. * EAN8 was broken. It now works as expected. v0.4 ~~~~ * Removed \*\*options from writers __init__ method. These options never had effect. They were always overwritten by default_options. * New config option available: text_distance (the distance between barcode and text). v0.4b2 ~~~~~~ * Basic documentation included. The barcode object now has a new attribute called `raw` to have the rendered output without saving to disk. v0.4b1 ~~~~~~ * Support for rendering barcodes as images is implemented. PIL is required to use it. v0.3 ~~~~ * Compression for SVG output now works. v0.3b1 ~~~~~~ * Writer API has changed for simple adding new (own) writers. * SVG output is now generated with xml.dom module instead of stringformatting (makes it more robust). v0.2.1 ~~~~~~ * API of render changed. Now render takes keyword arguments instead of a dict. v0.2 ~~~~ * More tests added. v0.1 ~~~~ * First release. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/conf.py0000644000175000017510000000443415053563202016055 0ustar00buildbuild# noqa: INP001 # Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full # list see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # from __future__ import annotations import barcode # -- Project information ----------------------------------------------------- project = "python-barcode" copyright = "2017-2023, Hugo Osvaldo Barrera, et al" author = "Hugo Osvaldo Barrera, et al" # The short X.Y version. version = barcode.version # The full version, including alpha/beta/rc tags release = barcode.version # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.graphviz", "sphinx.ext.inheritance_diagram", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "alabaster" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] html_theme_options = { "github_user": "WhyNotHugo", "github_repo": "python-barcode", "github_banner": "true", } graphviz_output_format = "svg" # Include constructor in API docs. autoclass_content = "both" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/contents.rst0000644000175000017510000000177315053563202017150 0ustar00buildbuild㊙️ python-barcode ================== .. image:: _static/images/pybarcode.png **python-barcode** is a pure-python library for generating barcodes in various formats. It's 100% pure python. There are no external dependencies when generating SVG files. `Pillow`_ is required for generating images (e.g.: PNGs). .. _Pillow: https://python-pillow.org/ Contents -------- .. toctree:: :maxdepth: 2 getting-started supported-formats writers changelog Help ---- If you think you found a bug, or need help with something specific: - Please check existing issues for similar topics. - If there's nothing relevant, please open a new issue describing your problem, and what you've tried so far. Issues and source code are all in `GitHub `_. Donations --------- Donations are welcome. See `here `_ for further details. Licence ------- python-barcode is licensed under the MIT licence. See LICENCE for details. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/getting-started.rst0000644000175000017510000001070615053563202020414 0ustar00buildbuildGetting started =============== Installation ------------ The usual way is to use pip: .. code:: shell pip install python-barcode Don't forget to add this to our app's dependencies. If you'll be exporting to images (eg: not just SVG), you'll need the "images" extras: .. code:: shell pip install "python-barcode[images]" # Note: keep the quotes, most shells don't play nice with square brackets. Usage ----- Let's start off with some code samples. Keep in mind that checksums are calculated automatically -- you don't need to do the math before passing the value for the barcode. In some systems (Code 39) the checksum is optional. For these, you can provide the ``add_checksum=False`` keyword argument. Generating SVG files ~~~~~~~~~~~~~~~~~~~~ .. code:: python from io import BytesIO from barcode import EAN13 from barcode.writer import SVGWriter # Write to a file-like object: rv = BytesIO() EAN13("100000902922", writer=SVGWriter()).write(rv) # Or to an actual file: with open("somefile.svg", "wb") as f: EAN13(str(100000011111), writer=SVGWriter()).write(f) Generating image files ~~~~~~~~~~~~~~~~~~~~~~ .. versionadded:: 0.4b1 .. attention:: Keep in mind that SVG files are vectorized, so they will scale a lot better than images. It's recommended to use images only if your medium or target usages does not support SVG. .. code:: python from io import BytesIO from barcode import EAN13 from barcode.writer import ImageWriter # Write to a file-like object: rv = BytesIO() EAN13(str(100000902922), writer=ImageWriter()).write(rv) # Or to an actual file: with open("somefile.jpeg", "wb") as f: EAN13("100000011111", writer=ImageWriter()).write(f) Interactive generating an SVG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Using an interactive python interpreter to generate SVG files. .. code:: pycon >>> import barcode >>> barcode.PROVIDED_BARCODES ['code128', 'code39', 'ean', 'ean13', 'ean14', 'ean8', 'gs1', 'gs1_128', 'gtin', 'isbn', 'isbn10', 'isbn13', 'issn', 'itf', 'jan', 'pzn', 'upc', 'upca'] >>> EAN = barcode.get_barcode_class('ean13') >>> EAN >>> my_ean = EAN('5901234123457') >>> my_ean >>> fullname = my_ean.save('ean13_barcode') >>> fullname 'ean13_barcode.svg' >>> You can check the generated files (e.g.: ``ean13_barcode.svg``) by opening them with any graphical app (e.g.: Firefox). Interactive generating a PNG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Using an interactive python interpreter to generate PNG files. .. code:: pycon >>> import barcode >>> from barcode.writer import ImageWriter >>> EAN = barcode.get_barcode_class('ean13') >>> my_ean = EAN('5901234123457', writer=ImageWriter()) >>> fullname = my_ean.save('ean13_barcode') >>> fullname 'ean13_barcode.png' >>> from io import BytesIO >>> fp = BytesIO() >>> my_ean.write(fp) >>> my_ean >>> with open("path/to/file", "wb") as f: ... my_ean.write(f) # Pillow (ImageWriter) produces RAW format here ... >>> from barcode import generate >>> name = generate('EAN13', '5901234123457', output='barcode_svg') >>> name 'barcode_svg.svg' >>> fp = BytesIO() >>> generate('EAN13', '5901234123457', writer=ImageWriter(), output=fp) >>> You can check the generated files (e.g.: ``ean13_barcode.png``) by opening them with any graphical app (e.g.: Firefox). Command Line usage ~~~~~~~~~~~~~~~~~~ .. versionadded:: 0.7beta4 This library also includes a cli app for quickly generating barcodes from the command line or from shell scripts: .. code:: console $ # Save a barcode to outfile.svg: $ python-barcode create "123456789000" outfile -b ean --text "text to appear under barcode" $ # Generate a PNG (Require Pillow): $ python-barcode create -t png "My Text" outfile $ python-barcode --help usage: python-barcode [-h] [-v] {create,list} ... Create standard barcodes via cli. optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit Actions: {create,list} create Create a barcode with the given options. list List available image and code types. Image output enabled, use --type option to give image format (png, jpeg, ...). $ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/index.rst0000644000175000017510000000177315053563202016422 0ustar00buildbuild㊙️ python-barcode ================== .. image:: _static/images/pybarcode.png **python-barcode** is a pure-python library for generating barcodes in various formats. It's 100% pure python. There are no external dependencies when generating SVG files. `Pillow`_ is required for generating images (e.g.: PNGs). .. _Pillow: https://python-pillow.org/ Contents -------- .. toctree:: :maxdepth: 2 getting-started supported-formats writers changelog Help ---- If you think you found a bug, or need help with something specific: - Please check existing issues for similar topics. - If there's nothing relevant, please open a new issue describing your problem, and what you've tried so far. Issues and source code are all in `GitHub `_. Donations --------- Donations are welcome. See `here `_ for further details. Licence ------- python-barcode is licensed under the MIT licence. See LICENCE for details. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/supported-formats.rst0000644000175000017510000000532115053563202021002 0ustar00buildbuildSupported Formats ========================= The following are the supported barcode formats. PRs for other code formats are welcome! Codabar ------- .. inheritance-diagram:: barcode.codabar.CODABAR :parts: 1 .. autoclass:: barcode.codabar.CODABAR :members: Code 39 ------- .. inheritance-diagram:: barcode.codex.Code39 :parts: 1 .. autoclass:: barcode.codex.Code39 :members: Code 128 -------- .. versionadded:: 0.8beta1 .. inheritance-diagram:: barcode.codex.Code128 :parts: 1 .. autoclass:: barcode.codex.Code128 :members: PZN (aka: PZN7) --------------- .. inheritance-diagram:: barcode.codex.PZN :parts: 1 .. autoclass:: barcode.codex.PZN :members: EAN-13 ------ .. inheritance-diagram:: barcode.ean.EuropeanArticleNumber13WithGuard :parts: 1 .. autoclass:: barcode.ean.EuropeanArticleNumber13 :members: .. autoclass:: barcode.ean.EuropeanArticleNumber13WithGuard :members: EAN-8 ----- .. inheritance-diagram:: barcode.ean.EuropeanArticleNumber8WithGuard :parts: 1 .. autoclass:: barcode.ean.EuropeanArticleNumber8 :members: .. autoclass:: barcode.ean.EuropeanArticleNumber8WithGuard :members: EAN-14 ------ .. inheritance-diagram:: barcode.ean.EuropeanArticleNumber14 :parts: 1 .. autoclass:: barcode.ean.EuropeanArticleNumber14 :members: JAN --- .. inheritance-diagram:: barcode.ean.JapanArticleNumber :parts: 1 .. autoclass:: barcode.ean.JapanArticleNumber :members: ISBN-13 (aka: GS1, ISBN) ------------------------ .. inheritance-diagram:: barcode.isxn.InternationalStandardBookNumber13 :parts: 1 .. autoclass:: barcode.isxn.InternationalStandardBookNumber13 :members: ISBN-10 ------- .. inheritance-diagram:: barcode.isxn.InternationalStandardBookNumber10 :parts: 1 .. autoclass:: barcode.isxn.InternationalStandardBookNumber10 :members: ISSN ---- .. inheritance-diagram:: barcode.isxn.InternationalStandardSerialNumber :parts: 1 .. autoclass:: barcode.isxn.InternationalStandardSerialNumber :members: UPC-A ----- .. inheritance-diagram:: barcode.upc.UniversalProductCodeA :parts: 1 .. autoclass:: barcode.upc.UniversalProductCodeA :members: EAN14 (aka: GTIN) ----------------- .. inheritance-diagram:: barcode.ean.EuropeanArticleNumber14 :parts: 1 .. autoclass:: barcode.ean.EuropeanArticleNumber14 :members: GS1-128 ------- .. versionadded:: v0.10.0 .. inheritance-diagram:: barcode.codex.Gs1_128 :parts: 1 .. autoclass:: barcode.codex.Gs1_128 :members: ITF --- .. versionadded:: 0.8.0 .. inheritance-diagram:: barcode.itf.ITF :parts: 1 .. autoclass:: barcode.itf.ITF :members: UPCA (aka UPC) -------------- .. inheritance-diagram:: barcode.upc.UPCA :parts: 1 .. autoclass:: barcode.upc.UPCA :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/docs/writers.rst0000644000175000017510000000701215053563202017002 0ustar00buildbuildWriters ======= Common Writer Options --------------------- All writer take the following options (specified as keyword arguments to ``Barcode.save(filename, options)`` or set via ``Writer.set_options(options)``, where ``options`` is a dictionary where keys are option names and values are option values to be set). .. note:: See the documentation of the specific writer for special options, only available for this writer. :module_width: The width of one barcode module in mm as *float*. Defaults to **0.2**. :module_height: The height of the barcode modules in mm as *float*. Defaults to **15.0**. :quiet_zone: Distance on the left and on the right from the border to the first (last) barcode module in mm as *float*. Defaults to **6.5**. :font_path: Path to the font file to be used. Defaults to **DejaVuSansMono** (which is bundled with this package). :font_size: Font size of the text under the barcode in pt as *integer*. Font size zero suppresses text. Defaults to **10**. :text_distance: Distance between the barcode and the text under it in mm as *float*. Defaults to **5.0**. :background: The background color of the created barcode as *string*. Defaults to **white**. :foreground: The foreground and text color of the created barcode as *string*. Defaults to **black**. :center_text: If true (the default) the text is centered under the barcode else left aligned. .. versionadded:: 0.6 .. note:: Some barcode classes change the above defaults to fit in some kind of specification. BaseWriter ---------- Both ``ImageWriter`` and ``SVGWriter`` are subclasses of ``BaseWriter``: .. autoclass:: barcode.writer.BaseWriter :members: SVGWriter --------- Renders barcodes as [optionally, compressed] SVG objects. In addition to the common writer options you can give the following special option. :compress: Boolean value to output a compressed SVG object (.svgz). Defaults to ``False`` ImageWriter ----------- .. versionadded:: 0.4b1 Renders barcodes as image. Supports all the image formats supported by Pillow. In addition to the common writer options you can give the following special options: :format: The image file format as ``str``. All formats supported by Pillow are valid (e.g. PNG, JPEG, BMP, ...). Defaults to ``PNG``. :dpi: DPI as ``int`` to calculate the image size in pixel. This value is used for all mm to px calculations. Defaults to ``300`` Custom writers -------------- It's possible to create your own writer by inheriting from ``barcode.writer.BaseWriter``. In your ``__init__`` method call BaseWriter's ``__init__`` and give your callbacks for: - ``initialize(raw_code)`` - ``paint_module(xpos, ypos, width, color)`` - ``paint_text(xpos, ypos)`` - ``finish()`` Now instantiate a new barcode and give an instance of your new writer as argument. If you now call ``render`` on the barcode instance your callbacks get called. Creating compressed SVGs ------------------------ Saving a compressed SVG (SVGZ): .. code:: pycon >>> import barcode >>> ean = barcode.get('ean13', '123456789102') # Now we look if the checksum was added >>> ean.get_fullcode() '1234567891026' >>> filename = ean.save('ean13') >>> filename 'ean13.svg' >>> options = dict(compress=True) >>> filename = ean.save('ean13', options) >>> filename 'ean13.svgz' Now you have ``ean13.svg`` and the compressed ``ean13.svgz`` in your current working directory. Open it and see the result. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/example-ean13.png0000644000175000017510000000777715053563202016711 0ustar00buildbuildPNG  IHDRP bKGD pHYsFF&2[tIME (zIDATxiLTgƯYa؆eEP,Yd@U 66.`Elq_ZkjM[BYT2300iNE۾Ҽ }?sssfd$ ` E*V^z,={@DDv^/ieeeݍ(|嗈ݻ VcϞ=8ujjj /@P>Dhh(ߢ?<ꊞlڴ gΜӧQWWXT*`ݸ{.c?~'O';zaΝ@mm-"##qQ466jСCǶmp TUUAP`hii?lݺ8y$7oHNNƦMp :u 6 'NDkk+v܉Xٳ+`IIIؼy3N8 """mmmشiRSS~>|P(l0}td2l޼uuu~:&M4&n6lq͛TNڊ+:F#֭[j,**"Iܹh$I\~=IԩSTT˗/399 <P(xmvL{LJxEŋ9sLQTr9/\W_}-}GDiduu5x5* I߻w/I!IIG}DsII0}}}%}ҥ$ɳg L"W#G" VbΛ7o֘xa.J* 2 jIsqqJrP*RwwwwWWWIS(RL&JBBpOVC&9ussL&rr)4rnnnpqqB62ޑrď6GZvȹQuddpsssW(NsrU_d da20@ L&& da2@L L&&da2@L L& d0@L L& a20@L & a20@ L&& da20@ L&&da2@L L&&I j$,644lOՊa)ށj~lR#fhh$188 Empp$v]oٜ4.wF;>r GmF[c?ǜG> Ii#k;<<,{,An2_|F999dee!%%0HOOGpp0f3r9L4BT l6͆dSNEbb"Ґ Z Ȁ^Goo/!$$IIIX,v; www &MBJJ ),F!&&999 bRDff& &MD̘1111lZxW`4Xdgg#,,Lʟh㥗^Bll,l6F#ׇ0I0av;rssGFFj5{AFѓ a20@L &Ϣ, R}  F2 ~~~5F# >:Bv;:::`X!V===~Pգahhlh4sM&wK{CC)EM&a9w/AAAܽ{SZQQAVĶ_{N-hܸq:˖-󟺯^L&COOa4N'f̘QヂU%$$@.;=SQUUέyyyvTTT*aaap PjBT:ϟ?V FzM$%%Ò%K:׬,( tttqaAHc[V\t & 5HNNvtw\zzz0yd9iׯ_G[[ۨjx{{#!!'ũ^^^PTҧQH7IMMMsΟk7cr0@ L&& g7xuIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/pyproject.toml0000644000175000017510000000403215053563202016534 0ustar00buildbuild[build-system] requires = ["setuptools>=61", "wheel", "setuptools_scm>=6.2"] build-backend = "setuptools.build_meta" [project] name = "python-barcode" description = "Create standard barcodes with Python. No external modules needed. (optional Pillow support included)." readme = "README.rst" requires-python = ">=3.9" license = { text = "MIT" } authors = [ { name = "Hugo Osvaldo Barrera et al", email = "hugo@whynothugo.nl" } ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Multimedia :: Graphics", "Topic :: Software Development :: Libraries :: Python Modules", ] dynamic = ["version"] [project.optional-dependencies] images = ["pillow"] [project.scripts] python-barcode = "barcode.pybarcode:main" [project.urls] documentation = "https://python-barcode.readthedocs.io/" repository = "https://github.com/WhyNotHugo/python-barcode" issues = "https://github.com/WhyNotHugo/python-barcode/issues" funding= "https://whynothugo.nl/sponsor/" [tool.setuptools] include-package-data = true [tool.setuptools.packages.find] exclude = ["tests"] [tool.setuptools_scm] write_to = "barcode/version.py" version_scheme = "post-release" [tool.ruff] select = [ "F", "E", "W", "I", "N", "UP", "YTT", "BLE", "B", "C4", "ISC", "ICN", "G", "INP", "PIE", "PYI", "PT", "Q", "RSE", "RET", "SIM", "TID", "TCH", "INT", "ERA", "PGH", "PLE", "RUF", ] target-version = "py39" [tool.ruff.isort] force-single-line = true required-imports = ["from __future__ import annotations"] [tool.coverage.report] exclude_lines = [ "if TYPE_CHECKING:", ] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.1002543 python_barcode-0.16.1/python_barcode.egg-info/0000755000175000017510000000000015053563204020315 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292740.0 python_barcode-0.16.1/python_barcode.egg-info/PKG-INFO0000644000175000017510000000516215053563204021416 0ustar00buildbuildMetadata-Version: 2.4 Name: python-barcode Version: 0.16.1 Summary: Create standard barcodes with Python. No external modules needed. (optional Pillow support included). Author-email: Hugo Osvaldo Barrera et al License: MIT Project-URL: documentation, https://python-barcode.readthedocs.io/ Project-URL: repository, https://github.com/WhyNotHugo/python-barcode Project-URL: issues, https://github.com/WhyNotHugo/python-barcode/issues Project-URL: funding, https://whynothugo.nl/sponsor/ Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENCE Provides-Extra: images Requires-Dist: pillow; extra == "images" Dynamic: license-file python-barcode ============== .. image:: https://github.com/WhyNotHugo/python-barcode/actions/workflows/tests.yml/badge.svg :target: https://github.com/WhyNotHugo/python-barcode/actions :alt: CI status .. image:: https://readthedocs.org/projects/python-barcode/badge/ :target: https://python-barcode.rtfd.org/ :alt: documentation .. image:: https://img.shields.io/pypi/v/python-barcode.svg :target: https://pypi.python.org/pypi/python-barcode :alt: version on pypi .. image:: https://img.shields.io/pypi/dm/python-barcode.svg :target: https://pypi.python.org/pypi/python-barcode :alt: downloads .. image:: https://img.shields.io/pypi/l/python-barcode.svg :target: https://github.com/WhyNotHugo/python-barcode/blob/main/LICENCE :alt: licence **python-barcode** provides a simple way to create barcodes in Python. There are no external dependencies when generating SVG files. Pillow is required for generating images (e.g.: PNGs). Support Python 3.9 to 3.12. .. image:: example-ean13.png :target: https://github.com/WhyNotHugo/python-barcode :alt: python-barcode Documentation ------------- Full documentation is published at http://python-barcode.rtfd.io/ You can build the documentation locally using ``make -C docs html``. Licence ------- python-barcode is licensed under the MIT licence. See LICENCE for details. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292740.0 python_barcode-0.16.1/python_barcode.egg-info/SOURCES.txt0000644000175000017510000000237615053563204022211 0ustar00buildbuild.gitignore .pre-commit-config.yaml CONTRIBUTING.md LICENCE README.rst example-ean13.png pyproject.toml setup.cfg tox.ini .github/.kodiak.toml .github/FUNDING.yml .github/no-response.yml .github/workflows/publish.yml .github/workflows/tests.yml barcode/__init__.py barcode/base.py barcode/codabar.py barcode/codex.py barcode/ean.py barcode/errors.py barcode/isxn.py barcode/itf.py barcode/pybarcode.py barcode/upc.py barcode/version.py barcode/writer.py barcode/charsets/__init__.py barcode/charsets/codabar.py barcode/charsets/code128.py barcode/charsets/code39.py barcode/charsets/ean.py barcode/charsets/itf.py barcode/charsets/upc.py barcode/fonts/DejaVuSansMono.ttf docs/Makefile docs/changelog.rst docs/conf.py docs/contents.rst docs/getting-started.rst docs/index.rst docs/supported-formats.rst docs/writers.rst docs/_static/images/pybarcode.png python_barcode.egg-info/PKG-INFO python_barcode.egg-info/SOURCES.txt python_barcode.egg-info/dependency_links.txt python_barcode.egg-info/entry_points.txt python_barcode.egg-info/requires.txt python_barcode.egg-info/top_level.txt tests/__init__.py tests/test_builds.py tests/test_checksums.py tests/test_ean.py tests/test_gs1_128.py tests/test_init.py tests/test_manually.py tests/test_writers.py tests/test_outputs/.gitignore././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292740.0 python_barcode-0.16.1/python_barcode.egg-info/dependency_links.txt0000644000175000017510000000000115053563204024363 0ustar00buildbuild ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292740.0 python_barcode-0.16.1/python_barcode.egg-info/entry_points.txt0000644000175000017510000000007215053563204023612 0ustar00buildbuild[console_scripts] python-barcode = barcode.pybarcode:main ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292740.0 python_barcode-0.16.1/python_barcode.egg-info/requires.txt0000644000175000017510000000002115053563204022706 0ustar00buildbuild [images] pillow ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292740.0 python_barcode-0.16.1/python_barcode.egg-info/top_level.txt0000644000175000017510000000003015053563204023040 0ustar00buildbuildbarcode dist docs tests ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1756292740.100912 python_barcode-0.16.1/setup.cfg0000644000175000017510000000021615053563204015443 0ustar00buildbuild[tool:pytest] addopts = -vv --cov=barcode --cov-report=term-missing:skip-covered --no-cov-on-fail [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.1000578 python_barcode-0.16.1/tests/0000755000175000017510000000000015053563204014765 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/__init__.py0000644000175000017510000000000015053563202017062 0ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_builds.py0000755000175000017510000000100315053563202017653 0ustar00buildbuildfrom __future__ import annotations from barcode import get_barcode def test_ean8_builds() -> None: ref = "1010100011000110100100110101111010101000100100010011100101001000101" ean = get_barcode("ean8", "40267708") bc = ean.build() assert ref == bc[0] def test_ean8_builds_with_longer_bars() -> None: ref = "G0G01000110001101001001101011110G0G01000100100010011100101001000G0G" ean = get_barcode("ean8", "40267708", options={"guardbar": True}) bc = ean.build() assert ref == bc[0] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_checksums.py0000755000175000017510000000240615053563202020366 0ustar00buildbuildfrom __future__ import annotations from barcode import get_barcode def test_code39_checksum() -> None: code39 = get_barcode("code39", "Code39") assert code39.get_fullcode() == "CODE39W" def test_pzn_checksum() -> None: pzn = get_barcode("pzn", "103940") assert pzn.get_fullcode() == "PZN-1039406" def test_ean13_checksum() -> None: ean = get_barcode("ean13", "400614457735") assert ean.get_fullcode() == "4006144577350" def test_ean8_checksum() -> None: ean = get_barcode("ean8", "6032299") assert ean.get_fullcode() == "60322999" def test_jan_checksum() -> None: jan = get_barcode("jan", "491400614457") assert jan.get_fullcode() == "4914006144575" def test_ean14_checksum() -> None: ean = get_barcode("ean14", "1234567891258") assert ean.get_fullcode() == "12345678912589" def test_isbn10_checksum() -> None: isbn = get_barcode("isbn10", "376926085") assert isbn.isbn10 == "3769260856" # type: ignore[attr-defined] def test_isbn13_checksum() -> None: isbn = get_barcode("isbn13", "978376926085") assert isbn.get_fullcode() == "9783769260854" def test_gs1_128_checksum() -> None: gs1_128 = get_barcode("gs1_128", "00376401856400470087") assert gs1_128.get_fullcode() == "00376401856400470087" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_ean.py0000644000175000017510000000311215053563202017134 0ustar00buildbuildfrom __future__ import annotations import sys import pytest from barcode.ean import EAN13 def test_ean_checksum_generated() -> None: ean = EAN13("842167143322") # input has 12 digits assert ean.calculate_checksum() == 5 assert ean.ean == "8421671433225" def test_ean_checksum_zeroed() -> None: ean = EAN13("842167143322", no_checksum=True) # input has 12 digits assert ean.calculate_checksum() == 5 assert ean.ean == "8421671433220" def test_ean_checksum_supplied_and_generated() -> None: ean = EAN13("8421671433225") # input has 13 digits assert ean.calculate_checksum() == 5 assert ean.ean == "8421671433225" def test_ean_checksum_supplied_and_matching() -> None: ean = EAN13("8421671433225", no_checksum=True) # input has 13 digits assert ean.calculate_checksum() == 5 assert ean.ean == "8421671433225" def test_ean_checksum_supplied_and_different() -> None: ean = EAN13("8421671433229", no_checksum=True) # input has 13 digits assert ean.calculate_checksum() == 5 assert ean.ean == "8421671433229" def test_ean_checksum_generated_placeholder() -> None: ean = EAN13("977114487500X") # input has 13 digits assert ean.calculate_checksum() == 7 assert ean.ean == "9771144875007" @pytest.mark.skipif(sys.platform == "win32", reason="no /dev/null") def test_ean_checksum_supplied_placeholder() -> None: ean = EAN13("977114487500X", no_checksum=True) # input has 13 digits assert ean.calculate_checksum() == 7 assert ean.ean == "9771144875000" with open("/dev/null", "wb") as f: ean.write(f) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_gs1_128.py0000644000175000017510000000753515053563202017472 0ustar00buildbuildfrom __future__ import annotations import pytest from barcode.codex import Gs1_128 FNC1_CHAR = "\xf1" FNC1 = 102 START_B = 104 START_C = 105 FROM_AC_TO_B = 100 FROM_AB_TO_C = 99 FROM_BC_TO_A = 101 CODE_BUILD_TEST = ( # '(01)01234567891011(11)200622(17)240622(21)88888888' # noqa: ERA001 ( "010123456789101111200622172406222188888888", [ START_C, FNC1, 1, 1, 23, 45, 67, 89, 10, 11, 11, 20, 6, 22, 17, 24, 6, 22, 21, 88, 88, 88, 88, ], ), # '(01)01234567891011(11)200622(17)240622(21)888888888' # noqa: ERA001 ( "0101234567891011112006221724062221888888888", [ START_C, FNC1, 1, 1, 23, 45, 67, 89, 10, 11, 11, 20, 6, 22, 17, 24, 6, 22, 21, 88, 88, 88, 88, 100, 24, ], ), # '(01)01234567891011(11)200622(10)12345(21)1234' # noqa: ERA001 ( "0101234567891011112006221012345" + FNC1_CHAR + "211234", [ START_C, FNC1, 1, 1, 23, 45, 67, 89, 10, 11, 11, 20, 6, 22, 10, 12, 34, FROM_AC_TO_B, 21, FNC1, FROM_AB_TO_C, 21, 12, 34, ], ), # '(01)01234567891011(11)200622(10)1234(21)1234' # noqa: ERA001 ( "010123456789101111200622101234" + FNC1_CHAR + "211234", [ START_C, FNC1, 1, 1, 23, 45, 67, 89, 10, 11, 11, 20, 6, 22, 10, 12, 34, FNC1, 21, 12, 34, ], ), # '(01)01234567891011(11)200622(10)240622(21)888888888' # noqa: ERA001 ( "01012345678910111120062210240622" + FNC1_CHAR + "21888888888", [ START_C, FNC1, 1, 1, 23, 45, 67, 89, 10, 11, 11, 20, 6, 22, 10, 24, 6, 22, FNC1, 21, 88, 88, 88, 88, 100, 24, ], ), # '(01)08720299927469(11)240621(17)250621(10)20240621/0001(21)xyz' # noqa: ERA001 ( "010872029992746911240621172506211020240621/0001" + FNC1_CHAR + "21xyz", [ 105, 102, 1, 8, 72, 2, 99, 92, 74, 69, 11, 24, 6, 21, 17, 25, 6, 21, 10, 20, 24, 6, 21, 100, 15, 99, 0, 1, 102, 21, 100, 88, 89, 90, ], ), ) @pytest.mark.parametrize(("target", "answer"), CODE_BUILD_TEST) def test_code_build(target, answer): gs1_128 = Gs1_128(target) assert gs1_128._build() == answer ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_init.py0000644000175000017510000000260515053563202017342 0ustar00buildbuildfrom __future__ import annotations import os from io import BytesIO import pytest import barcode from barcode.writer import SVGWriter PATH = os.path.dirname(os.path.abspath(__file__)) TESTPATH = os.path.join(PATH, "test_outputs") def test_generate_without_output() -> None: with pytest.raises(TypeError, match="'output' cannot be None"): barcode.generate("ean13", "123455559121112") def test_generate_with_file() -> None: with open(os.path.join(TESTPATH, "generate_with_file.jpeg"), "wb") as f: barcode.generate("ean13", "123455559121112", output=f) def test_generate_with_filepath() -> None: # FIXME: extension is added to the filepath even if you include it. rv = barcode.generate( "ean13", "123455559121112", output=os.path.join(TESTPATH, "generate_with_filepath"), ) assert rv == os.path.abspath(os.path.join(TESTPATH, "generate_with_filepath.svg")) def test_generate_with_file_and_writer() -> None: with open(os.path.join(TESTPATH, "generate_with_file_and_writer.jpeg"), "wb") as f: barcode.generate("ean13", "123455559121112", output=f, writer=SVGWriter()) def test_generate_with_bytesio() -> None: bio = BytesIO() barcode.generate("ean13", "123455559121112", output=bio) # XXX: File is not 100% deterministic; needs to be addressed at some point. # assert len(bio.getvalue()) == 6127 # noqa: ERA001 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_manually.py0000755000175000017510000000603315053563202020223 0ustar00buildbuild"""Generates barcodes for visually inspecting the results.""" from __future__ import annotations import codecs import os from typing import Iterator import pytest from barcode import get_barcode from barcode import get_barcode_class from barcode import version from barcode.writer import ImageWriter PATH = os.path.dirname(os.path.abspath(__file__)) TESTPATH = os.path.join(PATH, "test_outputs") HTMLFILE = os.path.join(TESTPATH, "index.html") HTML = """ python-barcode {version} Test

python-barcode {version} Tests

{body} """ OBJECTS = '

{name}


\nSVG {name}\n' IMAGES = '

As PNG-Image


\nPNG {name}

\n' NO_PIL = "

Pillow was not found. No PNG-Image created.

\n" TESTCODES = ( ("ean8", "40267708"), ("ean8-guard", "40267708"), ("ean13", "5901234123457"), ("ean13-guard", "5901234123457"), ("ean14", "12345678911230"), ("upca", "36000291453"), ("jan", "4901234567894"), ("isbn10", "3-12-517154-7"), ("isbn13", "978-3-16-148410-0"), ("issn", "1144875X"), ("code39", "Example Code 39"), ("pzn", "487780"), ("code128", "Example Code 128 998866"), ("itf", "12341234"), ) @pytest.mark.parametrize(("codename", "code"), TESTCODES) def test_generating_barcodes( codename: str, code: str, gather_image_elements_into_html: list[str] ) -> None: os.makedirs(TESTPATH, exist_ok=True) image_elements = gather_image_elements_into_html def append(x, y) -> None: image_elements.append(OBJECTS.format(filename=x, name=y)) def append_img(x, y) -> None: image_elements.append(IMAGES.format(filename=x, name=y)) options = {} bcode = get_barcode(codename, code) if codename.startswith("i"): options["center_text"] = False else: options["center_text"] = True filename = bcode.save(os.path.join(TESTPATH, codename), options=options) print(f"Code: {bcode.name}, Input: {code}, Output: {bcode.get_fullcode()}") append(os.path.basename(filename), bcode.name) if ImageWriter is not None: bcodec = get_barcode_class(codename) bcode = bcodec(code, writer=ImageWriter()) opts = {} if codename.startswith("i"): opts["center_text"] = False else: opts["center_text"] = True filename = bcode.save(os.path.join(TESTPATH, codename), options=opts) append_img(os.path.basename(filename), bcode.name) else: image_elements.append(NO_PIL) @pytest.fixture(scope="module") def gather_image_elements_into_html() -> Iterator[list[str]]: image_elements: list[str] = [] yield image_elements # Save htmlfile with all objects with codecs.open(HTMLFILE, "w", encoding="utf-8") as f: obj = "\n".join(image_elements) f.write(HTML.format(version=version, body=obj)) print(f"\nNow open {HTMLFILE} in your browser.") ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1756292740.1001563 python_barcode-0.16.1/tests/test_outputs/0000755000175000017510000000000015053563204017547 5ustar00buildbuild././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_outputs/.gitignore0000644000175000017510000000006315053563202021534 0ustar00buildbuild# This directory contains all the tests outputs. * ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tests/test_writers.py0000644000175000017510000000307115053563202020074 0ustar00buildbuildfrom __future__ import annotations import os from io import BytesIO from barcode import EAN13 from barcode.writer import ImageWriter from barcode.writer import SVGWriter PATH = os.path.dirname(os.path.abspath(__file__)) TESTPATH = os.path.join(PATH, "test_outputs") if ImageWriter is not None: def test_saving_image_to_byteio() -> None: assert ImageWriter is not None # workaround for mypy rv = BytesIO() EAN13(str(100000902922), writer=ImageWriter()).write(rv) with open(f"{TESTPATH}/somefile.jpeg", "wb") as f: EAN13("100000011111", writer=ImageWriter()).write(f) def test_saving_rgba_image() -> None: assert ImageWriter is not None # workaround for mypy rv = BytesIO() EAN13(str(100000902922), writer=ImageWriter()).write(rv) with open(f"{TESTPATH}/ean13-with-transparent-bg.png", "wb") as f: writer = ImageWriter(mode="RGBA") EAN13("100000011111", writer=writer).write( f, options={"background": "rgba(255,0,0,0)"} ) def test_saving_svg_to_byteio() -> None: rv = BytesIO() EAN13(str(100000902922), writer=SVGWriter()).write(rv) with open(f"{TESTPATH}/somefile.svg", "wb") as f: EAN13("100000011111", writer=SVGWriter()).write(f) def test_saving_svg_to_byteio_with_guardbar() -> None: rv = BytesIO() EAN13(str(100000902922), writer=SVGWriter(), guardbar=True).write(rv) with open(f"{TESTPATH}/somefile_guardbar.svg", "wb") as f: EAN13("100000011111", writer=SVGWriter(), guardbar=True).write(f) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1756292738.0 python_barcode-0.16.1/tox.ini0000644000175000017510000000025115053563202015132 0ustar00buildbuild[tox] envlist = py,py-images skip_missing_interpreters = True [testenv] deps = pytest pytest-cov images: Pillow commands = pytest --cov barcode usedevelop = True