#!/usr/bin/env python

# compressor.py
from subprocess import Popen, PIPE

def compress(value):
    """Compresses a string with the xz binary"""

    process = Popen(["xz", "--compress", "--force"], stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def decompress(value):
    """Decompresses a string with the xz binary"""

    process = Popen(["xz", "--decompress", "--stdout", "--force"],
                    stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def compress_file(path):
    """Compress the file at 'path' with the xz binary"""

    process = Popen(["xz", "--compress", "--force", "--stdout", path], stdout=PIPE)
    return process.communicate()[0]

# compressor.py

from optparse import OptionParser
from sys import argv
import base64
import cPickle
from cStringIO import StringIO
from os.path import basename

def load():
    ppds_compressed = base64.b64decode(ppds_compressed_b64)
    ppds_decompressed = decompress(ppds_compressed)
    ppds = cPickle.loads(ppds_decompressed)
    return ppds

def ls():
    binary_name = basename(argv[0])
    ppds = load()
    for key, value in ppds.iteritems():
        if key == 'ARCHIVE': continue
        for ppd in value[2]:
            print ppd.replace('"', '"' + binary_name + ':', 1)

def cat(ppd):
    # Ignore driver's name, take only PPD's
    ppd = ppd.split(":")[-1]
    # Remove also the index
    ppd = "0/" + ppd[ppd.find("/")+1:]

    ppds = load()
    ppds['ARCHIVE'] = StringIO(decompress(ppds['ARCHIVE']))

    if ppds.has_key(ppd):
        start = ppds[ppd][0]
        length = ppds[ppd][1]
        ppds['ARCHIVE'].seek(start)
        return ppds['ARCHIVE'].read(length)

def main():
    usage = "usage: %prog list\n" \
            "       %prog cat URI"
    version = "%prog 0.4.9\n" \
              "Copyright (c) 2010 Vitor Baptista.\n" \
              "This is free software; see the source for copying conditions.\n" \
              "There is NO warranty; not even for MERCHANTABILITY or\n" \
              "FITNESS FOR A PARTICULAR PURPOSE."
    parser = OptionParser(usage=usage,
                          version=version)
    (options, args) = parser.parse_args()

    if len(args) == 0 or len(args) > 2:
        parser.error("incorrect number of arguments")

    if args[0].lower() == 'list':
        ls()
    elif args[0].lower() == 'cat':
        if not len(args) == 2:
            parser.error("incorrect number of arguments")
        ppd = cat(args[1])
        if not ppd:
            parser.error("Printer '%s' does not have default driver!" % args[1])
        print ppd
    else:
        parser.error("argument " + args[0] + " invalid")

# PPDs Archive
ppds_compressed_b64 = "/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4FPrIE9dABQZCgMPj8dYIupuhXxusVnKHAuOIjxzE2qsfblGR3CmZ6sn/Fhgg1TFcoaWDe/hzNrgLcxTnXFAYb2ArBCf+AsawMcVj8yhwankzWUi/0mhSE21h7jQVoWEMB860A/dr5p7XcLGtiEesn+Jlb86x78HGmTA+ppYWjCEN8UC0F74itiCdyjN1NMDUX4XUH7yUH7toMHzIjp8wKUzLIn4P0ufahz7wZv/ajZtWylWEsopMVOzrNLbSaWydZVLwvRXIKVHQ2EHa12GO0XNm43BluosfcurzCI/jMWy8PbmMEL/ZxVh2CYVirt5X9aU4pssiMod26bCHlsBqv6fUvLAnO4uXBov6ycGzMxx2MezkPRgqUb1juguO3lMeaU6IGvEFRWKQ4LV4Erc2VUNoaTczPdP6wIOI1zRrMcsvGHiCQiO5GiIvcxGW5b58Eee7VxclwESznNwrGW1boO4zmc3AkdnslVFiO4TwSlLQaHAvWqLf+iyPxLXoI1RE7yYZyurno9cIEiT9WWEQj3Y24IRq2jOWboHxBjA5GAMx4AeZnR1jD+vh2q4VwvzyFjuRvkwB459dT31rc1/kp4txfYSNu5fXvYpGtXbUCuOaWdRWCOwv6/99ROUCQ18sazKM9a/HcvuJlSwL3gINnX6QFZ+rwfFH1CheVrb++w+ilTufNjC/VHlvR/4bJ8mnG8WbZHpj0K7gc10h4wsXfPlSRMrYADubkDPM6MDXef2lmEoeEaps4F8ISVDlS/D3OsL4VqMOpag1I05DXSRqYAVxqbcOAS7F5G47rhnv+LJWIu6cB6KY3dwDiVv7ta40vXzS3b2krBhbJwPlM+YDXwEjiFUTfWZ/x18m8R1UVRIdVNNi//9nlfWtuKahu8ewtC7/TewVWSX3zL1yzfSgRWR+Jms7ml9mcNpU7h52E/XUwzudQU6xSW55x6sOF0x+INci43ob7HqSQwIrUfV1HJ3roIWTr5lFPVHl7/6iQU4czAIhUaNJlhFYNMLWSofVHk4CFVWcGuRXa1i31hRPzNl1Vn9FvcRknLwqz57c4VKvnuWAICCm5Z3PmGn4+v5ZeryuPr7heLsHHSRoLwH9yYJCAnPkie23tynJsMwBwDrSgkNPcbHwI1FZEQSZxZXHDo2SGyVP6Cy9GfmkfHsMpf2VF+6DUaGf2Tp1o1RhYqLjhZx46/imaNWHoBxnPpSUqOTFt3iMav1/2Ej8c2Zwe4UR+Skiz3fBoLNcpElAGXqXDtXD2nvIE4PIMEkiki0AhhXR556yQxUKm1pwlmNwAROoIz3ayrntS4l8apUlQ6nQMXHk2Ffugf7LzuAA2UGSjax97LVdke+b0heWqElgqzo682e5rHHGxMsxSWhVb/e4urvCJSiKR9UuvNO+td7RprhOKHpNlzbhXszQv1pDdt0SqWMTxucdfZYlT2kQ+zSsoEOIeFz8h3kbJRJNEBIMI4XiXSwxybiYlGeOlxC1IDpsyGsleTjnXbuo6HpqnSEhOnTfx+p9i7ywI/+4521RCOVQ8Nkee5tXkmQUef8jG0nwcsFm8kg2LEJEp0qJF4vYgaTCrwwz1FNdYav58jOX+OMveL55IG6L2CLlVzQPV1pGh7JbAW/8pk4MDvw7sTDDncXRCs24ryzChYTWFZaRYgoPmhLLltESOIXhta6oqcWWlfgrnXlg07XjIH/z6IY5/8ZprIkdE6tU2s1YLKX/WrhMJE/mzdd3am67qPauaFRopkEK6VhE/vSVclDFasiYUtEobV6m+bV2px9NrDQtHCD7GIi2TGlii+N6b5dZQJiSritqBV4kuX7I2nqMwF1DPKZeROIfyY2A3yJlS0mUH755JgDNgHeqT8kHTIRKyMUPC0ZfIHoZldnnPZW/bS3eQBHAZO81Kv72iW0TA9RJ0SF7GEKlX9wIxRnCq9BkCA7Y/YoFl0erVxXJEqbKVJZp3dPPzDZ+WtL+Bi3XLpaWes/f8rRC/KwJfRbMFKHYMXMgVF7DbQVa+TjElz0rpIcFzAH93gvmyzcB5btbOkMQh7rIEA5jrkjUPm0SNqlPQc/o8ej5LLFtrc72DiepQVCUuFiNrk/OcWWoM2tmZD7fzTurlh1xflPGL8gAd4MsUVPKMn5jE6He2eo6PcXLpSeCE7osXQzTGOKOpi5CJCWZlmLtscSN598dzs+Yty1kz1ZGoduR9CdfoAniNoI6QAcInrDlFDyZlhKvPatTGf2eKt4Bq3RWXLjpoJVSiRwzZCCb6tbF2fgwCjeIi1zqLqS/AZqEPh3/xZw2L4OYHVJYPhXH3Z2/hXYzW7cWOKeTyPxRzodOJLqx2Z+OwQNzSBd7+BpdOueUEhdsOq7OG8CTmcWs9ckCp4FoOC1KxBixhzPD2Tj+EqWboqnS7sj859U8XTv+gM6PeeP61RjZvFBdxoi2yUVrm07PkXB/J2zp/+RGtw9eZmxQ12SmODFCXHKOAst9oghSHDUtJK6/wG+3oN6aEL3e8jC0sTZVQ/qKp2ex4KfpK6ry3wphgNHvfxu9lqszU1yoX9VTMYzc2URKeTBAjqt/jBmW01g7HaEEQ1CkN/WACo1JwSu12X6hueE0gePjdYbPjpB6BBdYiwzMaeVYaHZOTyDHJk+O5VZOo0fGa0l1ZIpsV07r++RethkHAogu4sZUyes9LuwP/6o3Sety2b2hZYe8wr4gBieMS+gcaTc5iiD26r+M+FYP3QQ/gIBXgdifRaD7Gks/5DNUBcWXwsp0tIlqOjgNuKlnyQvREFm+gnNX3ExfjTb5m4ttmZDymYDTKYQ2JXBM5c/tGPSmpDTVZguy2RvAUhH2UTAwgthJ0etQSyUdRpiGbDeaT5C9OLP5KQkKYxMkIxR0xJhoMjpqs0SsaEbUCBRCsRuhwjNZJGoJwUgIub5lkUZLJErBGCkH1QkKpM2zI1RYYmB8TwFzx8SiNLNYv2d7DCHtsfGCz0DdLgF5pg75n0Bbr3gvXTvXS3zX1ZBaHNi60RQrbyRGd8u3KVVriRYH5Oe5sCeTTvg9tfhbchlZ8Iy6N/4uG6TVmEXx3qJXr36eB9qa5GuACfIFPmk1hVcKlReehF3Jz2w05kD97xF0fnlFhg+3IXKg5toBSY6zQgexebg6PIIi7q7mpfpVJsCudrabsRIjiSXMu0oHlX/1bTEn4P5VpMPs169yMt13anvhGcpKitzNAXqIr8GumojvUcZJRm3oj5S1qRg8c9cFFlUWFdmKWYBxopTsOb2ADPRbBkKnGhGvQL71lJopTTxbpquUedXJotyBLPDyhGYF9JPZZfiEVZhjKKuVCYK3Yho+BzK3aQ+otU+k5b+YqBT3H2NptNoJmv/PiAZP6NSRNKQFcdbbVOlaVa0aNCmuqlyTvIbbX1UVJKjANL737fJByZsipgH3vF4zluYbN/ScLnwwtufCnvcgiaVr5Z+R7I4/23KO9R2mnCKOF2a7bciTCUV2Edl2K+f3x7nfDSWUTE2nDkliH5bfNhzcSuUlV24FwpyvKzWeQSesHIsAz+RdXqnwh6+JAg/bPwSHRHwfYfFaMmiKN4wekOEUXB0f7IzLGg4MSNNX0mProwX5FkMVENpjdiCM9YZWtH8Elj3xR4/1LYp2IsEh48rsNQU/qA+yGTgZByq0jMRTJv9HU7TyzRBWyDFXxzQQFjkuC86SoJxCudUmV7SPD/OTN2GzyZXeXK1dS4dwYXKyCgivILXm8OAcuCM2YIOjtv9pKaRz2fZ/VBTBJEpHTrtCrUko7pnkrSJT8tSoOndlmUzGYjzpVhLqw1fnukiOma/1U4c02Mosuenf9v/v+KsSavgnb6JhF3EZCXOK5gAO/hdmCVG4MosTn3oQwlE0BZhnG0Ojw59XwDA+KVMGCmdvdahslJ3z5iEKplaPU6aNnX7Y2Rw7gO6/Ub22v1tEJLs3yROB0AOV6kME1Sgfob1RPtXeBjsiKPIYg5ocso091FB01b2uND67lx12hPC6UzCLLP9xCcxk82cbZavDEAjUmxqZF3AjPDaPn1SB7Z8qaW/g9JJfWX/nI6+IHlq5RVozy4iZrVj3Xu3OQHmz/35MqmbSfeBu7CExp738wzIOTK+O56jezmF3UpozhjMpaI1X1tHn1xFDsBjH4fVlm70+IPuOw6hLDkE7QozaIsseoPPRtbfsYD20HneHtpPcIhm4P1tzsesTpSVqz4HeJkxBZWewOeWkz7d8XHhhqxZfFo83BOsgwhcHU2i1X9p4h3lf4KLe2e5OpMMbEHFaKwJR69oyFmDjYrYzswW+rG+qr+haKXWIesFg58/B4IM65tfh8uBp3SHM6SIGOtzuKymNwC1Yzr3s5+LCgnSYSc2vL4r/Hf4MQAPgFmhxIRcZ73uQp1vilZsreCoZAYVQAeiSCnQh6NXAQV85mJ5ChINqq2CXtRQZUMx8sliaCpEvhpsd9kScTSHGPkFVfFkwaJJ13xCqnbWSzc1yRxFoQUmUzIaJqEGkoeFXzWKCmQe/nG1H32bYeiTdpaBUO+3sEIBfFXmCXtOdFT6EyVVUOElUgICTWBQhdXbCiwLhVIFBBSdfTU9cNZqF2NHnsZKuIQe7YsMr92+fVybtGuf+GFHe+NK3OtoxZ8kQOGFYthggYKS86TNp4e9qIFTfj9b2WRiymk2WZaGEGTz6jW8NJIu3pEVF2DJl4kc5nMy7WyxRYx1ZHHtxwZ4y/XTFco0U/OzREHQiFwLapjLt2nEoA7fHscjwQmPCKr9bvaRM1iOfP/XBiSKZd3u6duYDChd9mwd2HkOBx3PHKJsjt1FjLgBVMjOUmR9zAICFdIgwTU2tuhdl5xxqCJvbVe6dP0GmiEd3cE9LKtt+a0sOU0th1WBoZJsy/d0B8t4KW8sSJ9c9gdxRt4AgX2xUy5btqFoJHLjVRnTRDr7WMMARY1ekKoIkyxQIz/mvpDrsDHN+Q8O95hSQS4L0lvMAjrXERWJWv1ppMsS8KoH2vlgBThBQlLCo/Qxj12aR4gbYJfAGL6DM+5lVgYzibsS2R27Yh675SxQC9Kpd9TPSJzbiP+ihw2R3/Q+gZO0fouMAFSQs3q065YGd//bKzTwMjJlmlTol6IXoFrgE6RoTJq4Dg1olBN14pCWp/L98YgbhYSgbkjwJgzT41DS8JThioiJqMv6abYuNsuF6N2shOlsiRdpjJ4IuhC4VkGGPWvleq2UHvFnT0IlS2yUyQUnAiC34HIhShDkrM9OdbJPrKD81IGW+aDW0s6WY2Kjrc+ipsKpGPne7ibw6l/FTEirmvwkvwdX8MU00BCNH25UwY2UKMofuEM9fAf2umtjGexjhTPIc6/iCW7+9GmSJ32tyirzvr4XGxIAdJsr0tbFq7d1JTu3RdD2C03c779+fAsIvr+iYDtsMMgz9s0shz92pHPtxTq1bh7KcBV7nOeCi8vDu55Wt1Y7JTkt1T8nHyz+5IWZXpG/Q7MSQNa1+fkIl/edQjRmCuOElOqkiwf+KY4Cg2shDewc+SMsASEe8kav7orRB7obgJEB5aY++iu8wLWs6IvaBqMSX4kuT0iOoyuEV48A3DdIIR00KeWGadtSKO+DzO4+lm6StpWokymK0GUw/QQ3DayJka7N1ZlgG+Q/b7X4pgBBTFYAJ5s1ni3pL4EZ+goW1ZN8mgI+ec2bMh2lGIwhK5gXb7u5k0MXqOVeNzpwKxvl7YRj4NzyHnS51K2qI/ERszg3Wq+nXvuqn3pxf4vVcnvGh+exAjcPhkUm2fMzZLWOv8jLiykwnnHknTdR7EsRKRhAum0mOAAastcjj7P5mwKq3BuM0+X2VKdbX5yIMsoHd79irs1bonvULlQ2ZQIT1WBn++oYxbPBMMU6nNIm+hrV6snoyskh3EVXKvRc3UjSwXE249ST9VqsYHZz/dcLYo1sWvFJL7eWGdKA6nxMHHai1d8SlThZ9PTiiNcj6ZqJTl7hBpT0DglEAdFduc1KTNLtm2B0zAhx+ZhJ8CXjaLTGjHHZtlrzKpa3EwJAs1PPlZzZSQaajNt4S3bdOmcA0HaRPI0kO026rogwbvFovT095odpC2YgTtkHgJJ7yibj0OYkWuptCRuWz2uLPr0D4RHqyW7SXWE3MX4Tj4BkY18yl858iOpJbbeSLVihR0NiBQJwKtCibRfd4oNo+WG5ppkx1rMQDzcPPo44AhqL+7v/AYpkQqH3l/C22UoGpQKjwa4SAMfnfZo0qAHyluTruWFG/7TBvcVoSmsMhrbCUdtr5lglCzrfFy2Ip+k4wP5F0BgBaoHXIsNEbPqno/bF3MfhXIbpPA0Dab9T4z9Wv5sDVhF+06obcpt3jOm3WyN2JTydBAOJUfuFL9k7zaum9BX3g+Vv1+g7UskPhIJQimkPkZqjHeeewr2hHi2YcoJTBSDoytjXhWdutUSnDTosQ+RoVg/t8BZBlFDcaujYSpGZ8ZFVdSXuHxpEEKx8cjwAzO4L3Epqrp5zZppqkKorEGIc0yvqR5q0Dksvg6rjYk5q5E0A7FRWdj2OC+P7nyiIIszM6jOyzzCJgd1jYWJfBlyZ6RMQq+XvmMhmavuV1BWrKFOxvFIsobpN/l0kE3FHJ6kCXP//PM6Mnqt7a8I7ulLIR8WQrnk2kBr2jFFCKxIX0Y2/bgMq/gjwhcMSfy9XrhZBWddVhwtVthdWgvSdnKnjx18B4yI013/wLXhb54CB/srJMMoPi3o7TPhYMDxarwFqdqvcb9vKPr05MiDMwC/oDmeFZsQcwYwhwzrtAeVJaQr6VvtcE9M1dP9FmdH5M63qSZ+1ZJ1CAOSGYEYEVc9UKw/sH5WSlkqBPKb7PyGGioQPxqB/aa+WOlG/K7JG/6jyqaP1fbpJL3ubGzyxvQpo/GmWsSAsReTdqJv7go4PaRuAd8Pxi2SHUtWXF6chIG0Cm1WUMnxbavSRZ+e+pFMBUtv4UT+qnP2o1njB2AvGkDmYDrPoKwjuIv4KJU2RstuiSa97IrT3sYXf+RvbLc2parUUVcFp4BtHvrwP2Ari6bmvUOCSdsoYYW/ywATG7tSApqeyH4w06B4JFegfIBemFl3aOvoXv9u1ejf5LB/QACTAcUsNRR+UL7btbUF6wUAebyQdhsWj/1Nz2scZSaGiwEJF2DeFFxZ5s5L8Eipz3h5g7DHkyhvkmieEW4giYL3UcRyDCpci84yg4J0MXR/0kezwe5ltGE9p2M8lTT8PQo6Ra+Scm0/mjNYJjvvgYzcRJxP7ekQYjBqHiMzrSG9TrU2RptC7kFvilCAzmg6AFzf5H1VAE25eYOegsN7hOlXnJQrBzOGU19Gy+K3VRdqHSzXpT2HoeWD6+y6VzjpWQeh0wgjZSUtJqi/9IBKxiljXS60rO6w7w4E5GX8WeAzy5+IoDXkc01QiRTLSmfS+rNxiwEkB7zCE0WH03gKo+HBaLegtzH4w6Tb1uStphTxilFcDui9ft6prdgozpmt/yl5smqjd1HASHi3ENvRzO6owb2d93FSwTpiyhiCklZt/mnyH/NdGNaM7h8N9B/qd9hrnUVgnHQRdvl8h6QJ5j3Z+ktMzqfzRWJNw/DgoZUfyXYsNi6aCL/PjKB71/9b9YkgPIYydwdhjP2/mBO5Yyhd6dB++IqiuODpy5BKpvhunKP7nMJAnKkiLbMO1ReVk4vrrfRqnugJcGBlQmO5sU2NroHgvVf8UoKt5It/XDWQN6GbUVGeXUiyccROFesBjoOfZMjAijjLWvpxNJkQnE+ZoJEyZ8Nn5Kg7hkY7YGO9b3Nvc2zApn5l40fS4DJQraYeXLPUXuctnplIXYsTHxDE8ewIkYYQnhUAxjAA3nv5L4N2e/iZibYyPkkbvWw1608Ss54kHf63yP4oT7XdM/RbMHiBmCmok3aqaNyC2Yg9ln7g/ULfVXPlxjIJ5ByREFlwWNU594EGsEzPmPvDrzYgImNe5+5ww4nS8DdlkjOb5tU6KxScbSi+ThcqWbpoZqyCX8eh7YR8AAZ/emOb+vRvY93difFG8eeZXPZbMlXV44fEg02PxN08q382Xm9SGQd8VNn+PaZ6wRcLfs7eqd4+5QVwmLdb253MG+s/dt5Xnb5Q3uv3YdJ8OiVf2avKTpghx7SHYFsvFNQl0C+pQox9NryoWjvMUwZH5lQW7zOikMwXSJmw8wk9fZcjXnwGrPn00B/24pdAblX7w4oaGYwGIBVtZdObuPrqTWCDUj2f6AUftk7Ii9bPuoAQBpNnqdzGiM9cvH8Jll1WIgFTSRz2l1/3MjaWhE7t8lL/nn2yeYySo7ppfa9K4YB90WklMtsl31a5cCaOUrGzcYiwyotW2vxqYEdYj1rn56uQCERwtroJ/yT7sIjvsTaHVKDoMGG8OD6O4uaMsyr/+TDujR7td+FGcviTvbiFuZeHUpRDN5ea37zTyZOe9yCLGu0hmcv/eSGPPV8Z9IX7FxUhd1VSi631c/dNzebQ/mwopSibfdR/NfJhdISSa/UFq+XSmjyRj15IKoDLHIDx3rgIPIgtaJQcXRjhKvIN/foa2Rzlk9+QJc6T+TTvfFP6IJGxEh1nWrLxwhmhio6XwMDkzof6WbTQVKBvLoMqUGMB8oZQ1V+HSKjbOdWQC9HjsVUFFDLFGydXvtGQpcgiPoKU5nauUOhkmgKCMrejvX8cv0KyKGWeg41Mztxx7g/l7Ct4MMgQ3SFxAYfZF3b8/WX0afVsh/TcfmFc6ObwlulCTkUBaLNbpurXpCmj65MBmMWxq8kO0L8hilvSx/G6IMPgsGLt9mrrPeJnZklMaLeg7mVZQQpgCxsn68+XQbV5Q5QR4OmzTXYn4aMXTEB710tLYfzPke1xAqgYOgx6NxQaq1WluubX2MnBlVbZzCbDtzpkRLeKU3bl29FTAQDPhcB8JB6hZgjlgUnt3u7HZmb6UcDBqXw5hOI5K7lP2lsUvcCfbtucQBcBPlVdu8mWgfdLWsRf3fL36NUyqM8ZeMuNQO8t0NlSoV2QjDPm7ouAcRx7G+TdrBlt5NFtJg2wLKkaq0L52G1tSKFR8E46aeJqq0SbI8gNO4kkoHSdD6eaP2llOg62/TZQYC5+zdmLn3itxDyhY1DcZerRUXV6ycKwaOImgpNmoYgv1hmyNPO3vW0azeUXxEVa8NcM2sXx1Q/NtUxMH9frcCH4NDv6VyNDtvq2/U7MSBAIfbRkhMcA09ai9qI8/E4f9HPeHESmQHL10NnlXBlCtt+0M3GEwCteZedu2ClHuT6mm1SPIteP5vX8xCSQ5WbyH2mVjwdShh5kujC7rz/pWxYwzaGm6uJEOzcIWpEf7Tp6d9SDv1ccWqwtAXsAoVZhl4uP2lJr4Mh8htAx9q0DUo2qJuOFIv7/wmIR2rpJ6abVIXGDx+ijtMEUqx97xWckB9LPVNwveyD0YTYxIe8qvaWskjgvJhv1H3D4wwhvHmFA5yl3o6c8LkkNq6HdZhffj0FGJNxED6UZvZ991iMhVv3oJ6hQcMzKpeysRgsa3+YsMVxlurkn9G/afPdJwR4XfLPbRyxdTc5fZEABkC5aQAiiKxQsAqiT+iimAQ5WV8cNYByEpN/+0Uwpny9NuPTin8HOerN4mamKVDOHnItZvZFevU7vzsHG2tjRndiWkmigJmu1T4rWVn7RDqQJ9obVbPo7KlU3Fh1ooMcMIF6XlbRVyh2jjphYC6Wctmw+8xXt1QDFrfhD73S7SVQoyRRoQMwVHqFrtvglS3uxCwFUZSs3kK/mRlyLPIrKGIINliSxvdZg0VGwc0F8udg/eN64p/4/jaCJ+EXCGeRx4r6XzgBR+VNrAk0fE/6I8pAJUu7l8ttei4M9RteomGmREGoKCOYa7peZs4g3qOK29rsEHHDEkAXosmUp9EMWVvZ3JP1WV+D3niUxoNgTn9Uy0W3+MYpJbyDi3Kd29VqBzcAFflJ8+8WKgOKcAvodaHQ+eMvxrXENIS31jx8I6nw1AiBlzk1x/N6l87aTuBA2ED8sgm3xe/8gaG4dVsADnYe9CVT9G/Xy67ehGYi0QprUqdWap9ioNTn+IQPXkynlx5Bj5Wr9lq5CsKVHe4lU+3ViJeWsL8FsOtrKartsyWG9brxwya0zb8+RXubiCiq6crfHbxKEMV2ceijh+uqr3t0AJVmlWWP29g0kjBRsLkUTjb8IgM7yVP1iEgWGT1F4P6HstE9q5JhkIYnYGBzApRkbJUxNE+4k83afEXpsFXbm7kN51dkfASC7B0sUul55/a7s4eNp9DUwRrQFUs9DLlgcjwzOqbYNwN8XiW1oiol98kKaZVVmdZxvwFiPQpzsthjgECXdih0c5B7u1T39PAognNcmqE8nYlVGZFqSQOixcUd42EhWuNZlDXtYLdwKoqQQoFHcMnlAKoz+P5mWH3icd/7SjY8fkJih6uwtWlL6hFFnibdFw7zZfhZbkr1WBDpdLd2I6yQ+zX8298PkUoi5rS0h/RPdiCLcDcA2MLwfjIq021Dm0L7YyKGXMUOuT0yI3WgNFMGKpR+9A6Paf7H0qJQ1oHh6A96yR6yBHEjWYOGqxGUG0+vH4x0nlAFnDECRPu+IVRqDRdOZc8mLm1RYF9ReiuEjove9lrAf1ZIVL3yz1RHq08KH6fDPlvI31saPQwzqsYQxqXxb1zqt4Oqx60BQrHBaw0+2D/WSWzyz67Ymma/aE9gx+yNAYmDyDajqz2/K/D4SJdXFY6jpEEu4DasfQUl3sLdBjv8oi11Q4UWLonzM2b4DfsAGf5fXADejkfTK/IyY3FfENesEjyV9q5bwLYkJX01Z4j5mFxzLUnR3hj5Kit5FbIz2Hu5f1IvdhB4D5/ZXE09hF/5Xw1XKjKOITqReSU+rxc5GIRlm5L2i9YmS8klecABq8tSQrpafmXyfFmKLnEcOOnTm7XU9/YDvKQh2cWsqmd3QTe4BfCSPGospSu3MWRwpCCZT4dwh9/mERXfjNwkqovsrIKf/RY/Pex2TlWbhRGJoVg1TczuF3rVfjXHWlwkPuysPzGcOKwVEJeZSwxgAA3wuJC52jJzUAAetA7KcBAPHjoL6xxGf7AgAAAAAEWVo="

if __name__ == "__main__":
    try:
        main()
    except (IOError, KeyboardInterrupt):
        # We don't want neither IOError nor KeyboardInterrupt throwing a
        # traceback into stdout.
        pass
