Blame doc/guidelines.html

Packit 21b7a2
Packit 21b7a2
    "http://www.w3.org/TR/html4/loose.dtd">
Packit 21b7a2
<html>
Packit 21b7a2
<head>
Packit 21b7a2
  <meta http-equiv="Content-Type" content="text/html">
Packit 21b7a2
  <style type="text/css"></style>
Packit 21b7a2
Packit 21b7a2
TD {font-family: Verdana,Arial,Helvetica}
Packit 21b7a2
BODY {font-family: Verdana,Arial,Helvetica; margin-top: 2em; margin-left: 0em; margin-right: 0em}
Packit 21b7a2
H1 {font-family: Verdana,Arial,Helvetica}
Packit 21b7a2
H2 {font-family: Verdana,Arial,Helvetica}
Packit 21b7a2
H3 {font-family: Verdana,Arial,Helvetica}
Packit 21b7a2
A:link, A:visited, A:active { text-decoration: underline }
Packit 21b7a2
  </style>
Packit 21b7a2
-->
Packit 21b7a2
  <title>XML resources publication guidelines</title>
Packit 21b7a2
</head>
Packit 21b7a2
Packit 21b7a2
<body bgcolor="#fffacd" text="#000000">
Packit 21b7a2

XML resources publication guidelines

Packit 21b7a2
Packit 21b7a2

Packit 21b7a2
Packit 21b7a2

The goal of this document is to provide a set of guidelines and tips

Packit 21b7a2
helping the publication and deployment of 
Packit 21b7a2
href="http://www.w3.org/XML/">XML resources for the 
Packit 21b7a2
href="http://www.gnome.org/">GNOME project. However it is not tied to
Packit 21b7a2
GNOME and might be helpful more generally. I welcome 
Packit 21b7a2
href="mailto:veillard@redhat.com">feedback on this document.

Packit 21b7a2
Packit 21b7a2

The intended audience is the software developers who started using XML

Packit 21b7a2
for some of the resources of their project, as a storage format, for data
Packit 21b7a2
exchange, checking or transformations. There have been an increasing number
Packit 21b7a2
of new XML formats defined, but not all steps have been taken, possibly because of
Packit 21b7a2
lack of documentation, to truly gain all the benefits of the use of XML.
Packit 21b7a2
These guidelines hope to improve the matter and provide a better overview of
Packit 21b7a2
the overall XML processing and associated steps needed to deploy it
Packit 21b7a2
successfully:

Packit 21b7a2
Packit 21b7a2

Table of contents:

Packit 21b7a2
    Packit 21b7a2
      
  1. Design guidelines
  2. Packit 21b7a2
      
  3. Canonical URL
  4. Packit 21b7a2
      
  5. Catalog setup
  6. Packit 21b7a2
      
  7. Package integration
  8. Packit 21b7a2
    Packit 21b7a2
    Packit 21b7a2

    Design guidelines

    Packit 21b7a2
    Packit 21b7a2

    This part intends to focus on the format itself of XML. It may arrive

    Packit 21b7a2
    a bit too late since the structure of the document may already be cast in
    Packit 21b7a2
    existing and deployed code. Still, here are a few rules which might be helpful
    Packit 21b7a2
    when designing a new XML vocabulary or making the revision of an existing
    Packit 21b7a2
    format:

    Packit 21b7a2
    Packit 21b7a2

    Reuse existing formats:

    Packit 21b7a2
    Packit 21b7a2

    This may sounds a bit simplistic, but before designing your own format,

    Packit 21b7a2
    try to lookup existing XML vocabularies on similar data. Ideally this allows
    Packit 21b7a2
    you to reuse them, in which case a lot of the existing tools like DTD, schemas
    Packit 21b7a2
    and stylesheets may already be available. If you are looking at a
    Packit 21b7a2
    documentation format, DocBook should
    Packit 21b7a2
    handle your needs. If reuse is not possible because some semantic or use case
    Packit 21b7a2
    aspects are too different this will be helpful avoiding design errors like
    Packit 21b7a2
    targeting the vocabulary to the wrong abstraction level. In this format
    Packit 21b7a2
    design phase try to be synthetic and be sure to express the real content of
    Packit 21b7a2
    your data and use the XML structure to express the semantic and context of
    Packit 21b7a2
    those data.

    Packit 21b7a2
    Packit 21b7a2

    DTD rules:

    Packit 21b7a2
    Packit 21b7a2

    Building a DTD (Document Type Definition) or a Schema describing the

    Packit 21b7a2
    structure allowed by instances is the core of the design process of the
    Packit 21b7a2
    vocabulary. Here are a few tips:

    Packit 21b7a2
      Packit 21b7a2
        
    • use significant words for the element and attributes names.
    • Packit 21b7a2
        
    • do not use attributes for general textual content, attributes
    • Packit 21b7a2
          will be modified by the parser before reaching the application,
      Packit 21b7a2
          spaces and line informations will be modified.
      Packit 21b7a2
        
    • use single elements for every string that might be subject to
    • Packit 21b7a2
          localization. The canonical way to localize XML content is to use
      Packit 21b7a2
          siblings element carrying different xml:lang attributes like in the
      Packit 21b7a2
          following:
      Packit 21b7a2
          
      <welcome>
      Packit 21b7a2
        <msg xml:lang="en">hello</msg>
      Packit 21b7a2
        <msg xml:lang="fr">bonjour</msg>
      Packit 21b7a2
      </welcome>
      Packit 21b7a2
        
      Packit 21b7a2
        
    • use attributes to refine the content of an element but avoid them for
    • Packit 21b7a2
          more complex tasks, attribute parsing is not cheaper than an element and
      Packit 21b7a2
          it is far easier to make an element content more complex while attribute
      Packit 21b7a2
          will have to remain very simple.
      Packit 21b7a2
      Packit 21b7a2
      Packit 21b7a2

      Versioning:

      Packit 21b7a2
      Packit 21b7a2

      As part of the design, make sure the structure you define will be usable

      Packit 21b7a2
      for future extension that you may not consider for the current version. There
      Packit 21b7a2
      are two parts to this:

      Packit 21b7a2
        Packit 21b7a2
          
      • Make sure the instance contains a version number which will allow to
      • Packit 21b7a2
            make backward compatibility easy. Something as simple as having a
        Packit 21b7a2
            version="1.0" on the root document of the instance is
        Packit 21b7a2
            sufficient.
        Packit 21b7a2
          
      • While designing the code doing the analysis of the data provided by the
      • Packit 21b7a2
            XML parser, make sure you can work with unknown versions, generate a UI
        Packit 21b7a2
            warning and process only the tags recognized by your version but keep in
        Packit 21b7a2
            mind that you should not break on unknown elements if the version
        Packit 21b7a2
            attribute was not in the recognized set.
        Packit 21b7a2
        Packit 21b7a2
        Packit 21b7a2

        Other design parts:

        Packit 21b7a2
        Packit 21b7a2

        While defining you vocabulary, try to think in term of other usage of your

        Packit 21b7a2
        data, for example how using XSLT stylesheets could be used to make an HTML
        Packit 21b7a2
        view of your data, or to convert it into a different format. Checking XML
        Packit 21b7a2
        Schemas and looking at defining an XML Schema with a more complete
        Packit 21b7a2
        validation and datatyping of your data structures is important, this helps
        Packit 21b7a2
        avoiding some mistakes in the design phase.

        Packit 21b7a2
        Packit 21b7a2

        Namespace:

        Packit 21b7a2
        Packit 21b7a2

        If you expect your XML vocabulary to be used or recognized outside of your

        Packit 21b7a2
        application (for example binding a specific processing from a graphic shell
        Packit 21b7a2
        like Nautilus to an instance of your data) then you should really define an 
        Packit 21b7a2
        href="http://www.w3.org/TR/REC-xml-names/">XML namespace for your
        Packit 21b7a2
        vocabulary. A namespace name is an URL (absolute URI more precisely). It is
        Packit 21b7a2
        generally recommended to anchor it as an HTTP resource to a server associated
        Packit 21b7a2
        with the software project. See the next section about this. In practice this
        Packit 21b7a2
        will mean that XML parsers will not handle your element names as-is but as a
        Packit 21b7a2
        couple based on the namespace name and the element name. This allows it to
        Packit 21b7a2
        recognize and disambiguate processing. Unicity of the namespace name can be
        Packit 21b7a2
        for the most part guaranteed by the use of the DNS registry. Namespace can
        Packit 21b7a2
        also be used to carry versioning information like:

        Packit 21b7a2
        Packit 21b7a2

        "http://www.gnome.org/project/projectname/1.0/"

        Packit 21b7a2
        Packit 21b7a2

        An easy way to use them is to make them the default namespace on the

        Packit 21b7a2
        root element of the XML instance like:

        Packit 21b7a2
        <structure xmlns="http://www.gnome.org/project/projectname/1.0/">
        Packit 21b7a2
          <data>
        Packit 21b7a2
          ...
        Packit 21b7a2
          </data>
        Packit 21b7a2
        </structure>
        Packit 21b7a2
        Packit 21b7a2

        In that document, structure and all descendant elements like data are in

        Packit 21b7a2
        the given namespace.

        Packit 21b7a2
        Packit 21b7a2

        Canonical URL

        Packit 21b7a2
        Packit 21b7a2

        As seen in the previous namespace section, while XML processing is not

        Packit 21b7a2
        tied to the Web there is a natural synergy between both. XML was designed to
        Packit 21b7a2
        be available on the Web, and keeping the infrastructure that way helps
        Packit 21b7a2
        deploying the XML resources. The core of this issue is the notion of
        Packit 21b7a2
        "Canonical URL" of an XML resource. The resource can be an XML document, a
        Packit 21b7a2
        DTD, a stylesheet, a schema, or even non-XML data associated with an XML
        Packit 21b7a2
        resource, the canonical URL is the URL where the "master" copy of that
        Packit 21b7a2
        resource is expected to be present on the Web. Usually when processing XML a
        Packit 21b7a2
        copy of the resource will be present on the local disk, maybe in
        Packit 21b7a2
        /usr/share/xml or /usr/share/sgml maybe in /opt or even on C:\projectname\
        Packit 21b7a2
        (horror !). The key point is that the way to name that resource should be
        Packit 21b7a2
        independent of the actual place where it resides on disk if it is available,
        Packit 21b7a2
        and the fact that the processing will still work if there is no local copy
        Packit 21b7a2
        (and that the machine where the processing is connected to the Internet).

        Packit 21b7a2
        Packit 21b7a2

        What this really means is that one should never use the local name of a

        Packit 21b7a2
        resource to reference it but always use the canonical URL. For example in a
        Packit 21b7a2
        DocBook instance the following should not be used:

        Packit 21b7a2
        <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
        Packit 21b7a2
        Packit 21b7a2
        Packit 21b7a2
                                 "/usr/share/xml/docbook/4.2/docbookx.dtd">
        Packit 21b7a2
        Packit 21b7a2

        But always reference the canonical URL for the DTD:

        Packit 21b7a2
        <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
        Packit 21b7a2
        Packit 21b7a2
        Packit 21b7a2
                                 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">   
        Packit 21b7a2
        Packit 21b7a2

        Similarly, the document instance may reference the

        Packit 21b7a2
        href="http://www.w3.org/TR/xslt">XSLT stylesheets needed to process it to
        Packit 21b7a2
        generate HTML, and the canonical URL should be used:

        Packit 21b7a2
        <?xml-stylesheet
        Packit 21b7a2
          href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"
        Packit 21b7a2
          type="text/xsl"?>
        Packit 21b7a2
        Packit 21b7a2

        Defining the canonical URL for the resources needed should obey a few

        Packit 21b7a2
        simple rules similar to those used to design namespace names:

        Packit 21b7a2
          Packit 21b7a2
            
        • use a DNS name you know is associated to the project and will be
        • Packit 21b7a2
              available on the long term
          Packit 21b7a2
            
        • within that server space, reserve the right to the subtree where you
        • Packit 21b7a2
              intend to keep those data
          Packit 21b7a2
            
        • version the URL so that multiple concurrent versions of the resources
        • Packit 21b7a2
              can be hosted simultaneously
          Packit 21b7a2
          Packit 21b7a2
          Packit 21b7a2

          Catalog setup

          Packit 21b7a2
          Packit 21b7a2

          How catalogs work:

          Packit 21b7a2
          Packit 21b7a2

          The catalogs are the technical mechanism which allow the XML processing

          Packit 21b7a2
          tools to use a local copy of the resources if it is available even if the
          Packit 21b7a2
          instance document references the canonical URL. 
          Packit 21b7a2
          href="http://www.oasis-open.org/committees/entity/">XML Catalogs are
          Packit 21b7a2
          anchored in the root catalog (usually /etc/xml/catalog or
          Packit 21b7a2
          defined by the user). They are a tree of XML documents defining the mappings
          Packit 21b7a2
          between the canonical naming space and the local installed ones, this can be
          Packit 21b7a2
          seen as a static cache structure.

          Packit 21b7a2
          Packit 21b7a2

          When the XML processor is asked to process a resource it will

          Packit 21b7a2
          automatically test for a locally available version in the catalog, starting
          Packit 21b7a2
          from the root catalog, and possibly fetching sub-catalog resources until it
          Packit 21b7a2
          finds that the catalog has that resource or not. If not the default
          Packit 21b7a2
          processing of fetching the resource from the Web is done, allowing in most
          Packit 21b7a2
          case to recover from a catalog miss. The key point is that the document
          Packit 21b7a2
          instances are totally independent of the availability of a catalog or from
          Packit 21b7a2
          the actual place where the local resource they reference may be installed.
          Packit 21b7a2
          This greatly improves the management of the documents in the long run, making
          Packit 21b7a2
          them independent of the platform or toolchain used to process them. The
          Packit 21b7a2
          figure below tries to express that  mechanism:
          Packit 21b7a2
          alt="Picture describing the catalog ">

          Packit 21b7a2
          Packit 21b7a2

          Usual catalog setup:

          Packit 21b7a2
          Packit 21b7a2

          Usually catalogs for a project are setup as a 2 level hierarchical cache,

          Packit 21b7a2
          the root catalog containing only "delegates" indicating a separate subcatalog
          Packit 21b7a2
          dedicated to the project. The goal is to keep the root catalog clean and
          Packit 21b7a2
          simplify the maintenance of the catalog by using separate catalogs per
          Packit 21b7a2
          project. For example when creating a catalog for the 
          Packit 21b7a2
          href="http://www.w3.org/TR/xhtml1">XHTML1 DTDs, only 3 items are added to
          Packit 21b7a2
          the root catalog:

          Packit 21b7a2
            <delegatePublic publicIdStartString="-//W3C//DTD XHTML 1.0"
          Packit 21b7a2
                            catalog="file:///usr/share/sgml/xhtml1/xmlcatalog"/>
          Packit 21b7a2
            <delegateSystem systemIdStartString="http://www.w3.org/TR/xhtml1/DTD"
          Packit 21b7a2
                            catalog="file:///usr/share/sgml/xhtml1/xmlcatalog"/>
          Packit 21b7a2
            <delegateURI uriStartString="http://www.w3.org/TR/xhtml1/DTD"
          Packit 21b7a2
                            catalog="file:///usr/share/sgml/xhtml1/xmlcatalog"/>
          Packit 21b7a2
          Packit 21b7a2

          They are all "delegates" meaning that if the catalog system is asked to

          Packit 21b7a2
          resolve a reference corresponding to them, it has to lookup a sub catalog.
          Packit 21b7a2
          Here the subcatalog was installed as
          Packit 21b7a2
          /usr/share/sgml/xhtml1/xmlcatalog in the local tree. That
          Packit 21b7a2
          decision is left to the sysadmin or the packager for that system and may
          Packit 21b7a2
          obey different rules, but the actual place on the filesystem (or on a
          Packit 21b7a2
          resource cache on the local network) will not influence the processing as
          Packit 21b7a2
          long as it is available. The first rule indicate that if the reference uses a
          Packit 21b7a2
          PUBLIC identifier beginning with the

          Packit 21b7a2
          Packit 21b7a2

          "-//W3C//DTD XHTML 1.0"

          Packit 21b7a2
          Packit 21b7a2

          substring, then the catalog lookup should be limited to the specific given

          Packit 21b7a2
          lookup catalog. Similarly the second and third entries indicate those
          Packit 21b7a2
          delegation rules for SYSTEM, DOCTYPE or normal URI references when the URL
          Packit 21b7a2
          starts with the "http://www.w3.org/TR/xhtml1/DTD" substring
          Packit 21b7a2
          which indicates the location on the W3C server where the XHTML1 resources are
          Packit 21b7a2
          stored. Those are the beginning of all Canonical URLs for XHTML1 resources.
          Packit 21b7a2
          Those three rules are sufficient in practice to capture all references to XHTML1
          Packit 21b7a2
          resources and direct the processing tools to the right subcatalog.

          Packit 21b7a2
          Packit 21b7a2

          A subcatalog example:

          Packit 21b7a2
          Packit 21b7a2

          Here is the complete subcatalog used for XHTML1:

          Packit 21b7a2
          <?xml version="1.0"?>
          Packit 21b7a2
          <!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
          Packit 21b7a2
                    "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
          Packit 21b7a2
          <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
          Packit 21b7a2
            <public publicId="-//W3C//DTD XHTML 1.0 Strict//EN"
          Packit 21b7a2
                    uri="xhtml1-20020801/DTD/xhtml1-strict.dtd"/>
          Packit 21b7a2
            <public publicId="-//W3C//DTD XHTML 1.0 Transitional//EN"
          Packit 21b7a2
                    uri="xhtml1-20020801/DTD/xhtml1-transitional.dtd"/>
          Packit 21b7a2
            <public publicId="-//W3C//DTD XHTML 1.0 Frameset//EN"
          Packit 21b7a2
                    uri="xhtml1-20020801/DTD/xhtml1-frameset.dtd"/>
          Packit 21b7a2
            <rewriteSystem systemIdStartString="http://www.w3.org/TR/xhtml1/DTD"
          Packit 21b7a2
                    rewritePrefix="xhtml1-20020801/DTD"/>
          Packit 21b7a2
            <rewriteURI uriStartString="http://www.w3.org/TR/xhtml1/DTD"
          Packit 21b7a2
                    rewritePrefix="xhtml1-20020801/DTD"/>
          Packit 21b7a2
          </catalog>
          Packit 21b7a2
          Packit 21b7a2

          There are a few things to notice:

          Packit 21b7a2
            Packit 21b7a2
              
          • this is an XML resource, it points to the DTD using Canonical URLs, the
          • Packit 21b7a2
                root element defines a namespace (but based on an URN not an HTTP
            Packit 21b7a2
              URL).
            Packit 21b7a2
              
          • it contains 5 rules, the 3 first ones are direct mapping for the 3
          • Packit 21b7a2
                PUBLIC identifiers defined by the XHTML1 specification and associating
            Packit 21b7a2
                them with the local resource containing the DTD, the 2 last ones are
            Packit 21b7a2
                rewrite rules allowing to build the local filename for any URL based on
            Packit 21b7a2
                "http://www.w3.org/TR/xhtml1/DTD", the local cache simplifies the rules by
            Packit 21b7a2
                keeping the same structure as the on-line server at the Canonical URL
            Packit 21b7a2
              
          • the local resources are designated using URI references (the uri or
          • Packit 21b7a2
                rewritePrefix attributes), the base being the containing sub-catalog URL,
            Packit 21b7a2
                which means that in practice the copy of the XHTML1 strict DTD is stored
            Packit 21b7a2
                locally in
            Packit 21b7a2
                /usr/share/sgml/xhtml1/xmlcatalog/xhtml1-20020801/DTD/xhtml1-strict.dtd
            Packit 21b7a2
            Packit 21b7a2
            Packit 21b7a2

            Those 5 rules are sufficient to cover all references to the resources held

            Packit 21b7a2
            at the Canonical URL for the XHTML1 DTDs.

            Packit 21b7a2
            Packit 21b7a2

            Package integration

            Packit 21b7a2
            Packit 21b7a2

            Creating and removing catalogs should be handled as part of the process of

            Packit 21b7a2
            (un)installing the local copy of the resources. The catalog files being XML
            Packit 21b7a2
            resources should be processed with XML based tools to avoid problems with the
            Packit 21b7a2
            generated files, the xmlcatalog command coming with libxml2 allows you to create
            Packit 21b7a2
            catalogs, and add or remove rules at that time. Here is a complete example
            Packit 21b7a2
            coming from the RPM for the XHTML1 DTDs post install script. While this example
            Packit 21b7a2
            is platform and packaging specific, this can be useful as a an example in
            Packit 21b7a2
            other contexts:

            Packit 21b7a2
            %post
            Packit 21b7a2
            CATALOG=/usr/share/sgml/xhtml1/xmlcatalog
            Packit 21b7a2
            #
            Packit 21b7a2
            # Register it in the super catalog with the appropriate delegates
            Packit 21b7a2
            #
            Packit 21b7a2
            ROOTCATALOG=/etc/xml/catalog
            Packit 21b7a2
            Packit 21b7a2
            if [ ! -r $ROOTCATALOG ]
            Packit 21b7a2
            then
            Packit 21b7a2
                /usr/bin/xmlcatalog --noout --create $ROOTCATALOG
            Packit 21b7a2
            fi
            Packit 21b7a2
            Packit 21b7a2
            if [ -w $ROOTCATALOG ]
            Packit 21b7a2
            then
            Packit 21b7a2
                    /usr/bin/xmlcatalog --noout --add "delegatePublic" \
            Packit 21b7a2
                            "-//W3C//DTD XHTML 1.0" \
            Packit 21b7a2
                            "file://$CATALOG" $ROOTCATALOG
            Packit 21b7a2
                    /usr/bin/xmlcatalog --noout --add "delegateSystem" \
            Packit 21b7a2
                            "http://www.w3.org/TR/xhtml1/DTD" \
            Packit 21b7a2
                            "file://$CATALOG" $ROOTCATALOG
            Packit 21b7a2
                    /usr/bin/xmlcatalog --noout --add "delegateURI" \
            Packit 21b7a2
                            "http://www.w3.org/TR/xhtml1/DTD" \
            Packit 21b7a2
                            "file://$CATALOG" $ROOTCATALOG
            Packit 21b7a2
            fi
            Packit 21b7a2
            Packit 21b7a2

            The XHTML1 subcatalog is not created on-the-fly in that case, it is

            Packit 21b7a2
            installed as part of the files of the packages. So the only work needed is to
            Packit 21b7a2
            make sure the root catalog exists and register the delegate rules.

            Packit 21b7a2
            Packit 21b7a2

            Similarly, the script for the post-uninstall just remove the rules from the

            Packit 21b7a2
            catalog:

            Packit 21b7a2
            %postun
            Packit 21b7a2
            #
            Packit 21b7a2
            # On removal, unregister the xmlcatalog from the supercatalog
            Packit 21b7a2
            #
            Packit 21b7a2
            if [ "$1" = 0 ]; then
            Packit 21b7a2
                CATALOG=/usr/share/sgml/xhtml1/xmlcatalog
            Packit 21b7a2
                ROOTCATALOG=/etc/xml/catalog
            Packit 21b7a2
            Packit 21b7a2
                if [ -w $ROOTCATALOG ]
            Packit 21b7a2
                then
            Packit 21b7a2
                        /usr/bin/xmlcatalog --noout --del \
            Packit 21b7a2
                                "-//W3C//DTD XHTML 1.0" $ROOTCATALOG
            Packit 21b7a2
                        /usr/bin/xmlcatalog --noout --del \
            Packit 21b7a2
                                "http://www.w3.org/TR/xhtml1/DTD" $ROOTCATALOG
            Packit 21b7a2
                        /usr/bin/xmlcatalog --noout --del \
            Packit 21b7a2
                                "http://www.w3.org/TR/xhtml1/DTD" $ROOTCATALOG
            Packit 21b7a2
                fi
            Packit 21b7a2
            fi
            Packit 21b7a2
            Packit 21b7a2

            Note the test against $1, this is needed to not remove the delegate rules

            Packit 21b7a2
            in case of upgrade of the package.

            Packit 21b7a2
            Packit 21b7a2

            Following the set of guidelines and tips provided in this document should

            Packit 21b7a2
            help deploy the XML resources in the GNOME framework without much pain and
            Packit 21b7a2
            ensure a smooth evolution of the resource and instances.

            Packit 21b7a2
            Packit 21b7a2

            Daniel Veillard

            Packit 21b7a2
            Packit 21b7a2

            $Id$

            Packit 21b7a2
            Packit 21b7a2

            Packit 21b7a2
            </body>
            Packit 21b7a2
            </html>