<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.8 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-irtf-cfrg-cryptography-specification-01" category="info" submissionType="IRTF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.1 -->
  <front>
    <title abbrev="Crypto Specs">Guidelines for Writing Cryptography Specifications</title>
    <seriesInfo name="Internet-Draft" value="draft-irtf-cfrg-cryptography-specification-01"/>
    <author initials="N." surname="Sullivan" fullname="Nick Sullivan">
      <organization>Cryptography Consulting LLC</organization>
      <address>
        <postal>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>nicholas.sullivan+ietf@gmail.com</email>
      </address>
    </author>
    <author initials="C. A." surname="Wood" fullname="Christopher A. Wood">
      <organization>Cloudflare, Inc.</organization>
      <address>
        <postal>
          <street>101 Townsend St</street>
          <city>San Francisco</city>
          <country>United States of America</country>
        </postal>
        <email>caw@heapingbits.net</email>
      </address>
    </author>
    <date year="2024" month="April" day="10"/>
    <abstract>
      <?line 36?>

<t>This document provides guidelines and best practices for writing technical
specifications for cryptography protocols and primitives, targeting the needs
of implementers, researchers, and protocol designers. It highlights the
importance of technical specifications and discusses strategies for creating
high-quality specifications that cater to the needs of each community,
including guidance on representing mathematical operations, security
definitions, and threat models.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Crypto Forum Research Group mailing list (cfrg@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/search/?email_list=cfrg"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/cfrg/draft-irtf-cfrg-cryptography-specification"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>High-quality cryptography specifications are critical for the for development
and deployment of secure cryptographic protocols. This document provides
guidelines for specification writers to follow to help ensure that their
specifications are of high quality and are useful for their intended audience.
This document provides guidelines for writing clear, precise, and consistent
specifications covering topics such as representing mathematical operations,
defining security definitions, and describing threat models. Adhering to these
guidelines helps ensure that specifications are easier to understand,
implement, and analyze, leading to high assurance and interoperable systems.</t>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="goals-and-requirements">
      <name>Goals and Requirements</name>
      <t>The primary goal of these guidelines is to help guide the authorship of
cryptographic specifications so that they are as useful as possible when
creating high-assurance cryptographic software. Specifications that follow
these guidelines should be able to be easily understood, implemented, and
analyzed by different audiences, including the engineering community, research
community, and standardization community. By addressing the unique needs and
expectations of each group, these guidelines aim to:</t>
      <ul spacing="normal">
        <li>
          <t>Minimize ambiguity and misinterpretations, leading to clearer specifications
and more accurate implementations.</t>
        </li>
        <li>
          <t>Ensure consistent and correct implementations by providing a clear
description of both algorithms and their underlying mathematical foundation.</t>
        </li>
        <li>
          <t>Facilitate review and analysis by the research community, allowing for the
verification of security properties and the identification of potential
vulnerabilities.</t>
        </li>
        <li>
          <t>Enable interoperability of implementations of these specifications, promoting
collaboration and compatibility between various systems and protocols.</t>
        </li>
      </ul>
      <t>Each of these stakeholder groups contributes something different to the overall process of deploying software:</t>
      <ol spacing="normal" type="1"><li>
          <t>Engineering community: This community identifies technical problems to be
solved and have the skills and resources necessary to build solutions using
computing tools. Engineers focus on why certain problems should be addressed,
producing requirements that define the problem and solutions that meet those
requirements. Their ultimate goal is to implement and ship software or hardware
that effectively tackles these challenges.</t>
        </li>
        <li>
          <t>Research community: Researchers
are experts who explore the design space of different subject areas and
evaluate potential solutions to problems with the goal of better understanding
a topic. This group develops methods for designing tools and performing
experiments to validate hypotheses. The research community concentrates on how
problems should be solved, creating artifacts that help describe solutions.
These may include academic, peer-reviewed papers or software that studies or
supports the shipping of software.</t>
        </li>
        <li>
          <t>Standardization community: This group is responsible for developing
technical specifications of protocols that others can implement, analyze, and
verify. The standardization community produces technical specifications that
capture the details of a solution. These specifications serve as a foundation
for creating interoperable systems and ensuring the correct implementation of
cryptographic algorithms and protocols.</t>
        </li>
      </ol>
      <t>By following these guidelines and addressing the distinct needs of each
stakeholder group, specification authors can create well-structured,
informative specfications documents that facilitate the development, analysis,
and implementation of high assurance cryptographic solutions.</t>
    </section>
    <section anchor="guidelines-for-cryptographic-specification-presentation">
      <name>Guidelines for Cryptographic Specification Presentation</name>
      <t>Technical specifications do not stand on their own. Their value is derived from
their usefulness to the various communities that rely on them. A specification
can have amazing content but without the appropriate presentation, it may not
be as useful as intended. The guidelines in this section are a baseline set of
recommendations for authors to consider when writing a cryptographic
specification and are applicable beyond just cryptographic standards and are
general good practices for specification writers.</t>
      <section anchor="simplicity">
        <name>Simplicity</name>
        <t>Complexity is one of the main causes of software bugs. The opposite of
complexity is simplicity, which is a key aspect of creating effective
cryptography specifications. By striving for simplicity in problem statements,
technical content, and presentation, specification authors can make their
documents more accessible to a wider audience, including implementers,
researchers, and protocol designers. Simplicity reduces the cognitive load
required to understand the specification and minimizes the risk of
misinterpretation, which can lead to incorrect implementations and security
vulnerabilities.</t>
        <t>To achieve simplicity, specification authors should focus on:</t>
        <ul spacing="normal">
          <li>
            <t>Clearly defining the problem: Start by presenting a concise and easily
comprehensible description of the problem that the specification aims to
solve. Avoid unnecessary jargon and strive to make the problem statement
accessible to readers with varying levels of expertise in the field. Ideally,
each specification addresses precisely one clearly defined problem.</t>
          </li>
          <li>
            <t>Reducing complex concepts to component parts: When explaing with multi-step
cryptographic algorithms or concepts, break them down into smaller, more
manageable components. This will make it easier for readers to understand the
individual parts and their relationships to one another.</t>
          </li>
          <li>
            <t>Using straightforward language and terminology: Write the specification using
clear, concise language, and consistent and broadly understood terminology.</t>
          </li>
          <li>
            <t>Avoid overly technical jargon, and define any terms that may be unfamiliar to
some readers.  Limiting scope: Keep the specification focused on the primary
problem or use case, i.e., avoid feature creep. Avoid introducing unrelated
or peripheral topics, as this can create confusion and detract from the
primary focus.</t>
          </li>
          <li>
            <t>Providing clear examples and diagrams: Include examples and visual aids, such
as diagrams or visualizations, to help illustrate complex concepts or
processes. These tools can greatly improve the readability and understanding
of the specification.</t>
          </li>
        </ul>
        <t>By focusing on simplicity in document structure and prose in the specification
writing process, authors can create documents that are more accessible and
easier to understand, ultimately resulting in more reliable and secure
implementations of cryptographic algorithms and protocols. Focusing on
simplicity in writing does not imply imprecision or brevity. Even long
documents can embody simplicity with the right attention to detail and
structuring of prose.</t>
      </section>
      <section anchor="precision">
        <name>Precision</name>
        <t>Precision is a crucial aspect of writing high-quality specifications,
particularly for cryptography, where small deviations or ambiguities can lead
to severe security vulnerabilities. A precise specification ensures that
resulting implementations are consistent and correct, and that any analysis
done matches the specification.</t>
        <t>To achieve precision in your specifications, consider the following recommendations:</t>
        <ol spacing="normal" type="1"><li>
            <t>Use clear and concise language: Write your specification using
straightforward and unambiguous language. Avoid jargon or colloquialisms that
may lead to misinterpretation. When introducing technical terms or concepts,
provide clear definitions or explanations to ensure that all readers are on the
same page.</t>
          </li>
          <li>
            <t>Provide explicit instructions and avoid undefined behavior: When describing
algorithms, protocols, or procedures, provide step-by-step instructions that
can be easily followed by implementers with minimal or zero risk of
misinterpretation. This will help ensure that all implementations are
consistent with the intended design and minimize the risk of errors or
vulnerabilities.</t>
          </li>
          <li>
            <t>Provide test vectors. Test vectors help check for correctness of all
behavior in the specification, especially those near edge cases. For example,
if a specification involves a branch or condition, then test cases should
ideally be written to exercise both paths of the branch. Sometimes this is
infeasible, e.g., if probability of a particular branch happening is
negligible, though more often than not branches can be adequately covered.</t>
          </li>
          <li>
            <t>Employ formal notation or pseudocode: Using formal notation or pseudocode
can help provide a precise description of algorithms, data structures, and
protocols. This will ensure that implementers, researchers, and protocol
designers can accurately understand the intended behavior and interactions of
the components within the specification.</t>
          </li>
          <li>
            <t>Specify data formats and encodings: Clearly define data formats, encoding
schemes, and serialization methods for all data types used in the
specification. This will help ensure that different implementations can
interoperate seamlessly and reduce the likelihood of incompatibilities or
communication errors.</t>
          </li>
          <li>
            <t>Document assumptions and dependencies: Clearly state any assumptions or
dependencies on external components, including other specifications or protocol
descriptions. This includes common dependencies like that of a random number
generator. This will help implementers and researchers understand the context
in which your specification operates and any potential limitations or risks.</t>
          </li>
        </ol>
        <t>Precise specifications minimize ambiguity and reduce the likelihood of implementation errors or inconsistencies.</t>
      </section>
      <section anchor="consistency">
        <name>Consistency</name>
        <t>When a document is self-consistent and consistent with the expectations of
documents of its type, it helps reduce ambiguity and is easier to consume.
Ensuring consistency across concepts, vocabulary, language, and presentation
helps lower the cognitive load necessary for readers to understand and work
with the specification. To achieve consistency in your specifications, consider
the following recommendations:</t>
        <ol spacing="normal" type="1"><li>
            <t>Establish a consistent terminology: Develop a clear and consistent set of
terms and definitions that will be used throughout the document. Avoid using
synonyms or multiple terms for the same concept, as this can lead to confusion.
When using acronyms, always provide their full meaning upon first usage and use
the acronym consistently afterward.</t>
          </li>
          <li>
            <t>Maintain a uniform style and tone: Write the specification using a
consistent style and tone to ensure that readers can easily follow the content.
This includes consistent use of grammatical structures, punctuation, and
capitalization. If your organization has a style guide, adhere to it when
writing the specification.</t>
          </li>
          <li>
            <t>Use a logical structure: Organize your specification in a logical manner,
starting with an overview and then progressing through the various components,
algorithms, and protocols. Make use of sections, subsections, and other
structural elements to break up the content and make it easier to navigate and
comprehend. Use forward or backward references to make navigation of the
document simpler.</t>
          </li>
          <li>
            <t>Provide consistent formatting: Ensure that all elements within the
specification, such as tables, figures, pseudocode and equations, are formatted
consistently. This will help readers quickly identify and understand these
elements as they progress through the document.</t>
          </li>
          <li>
            <t>Be consistent with conventions and notations: When using mathematical
notation, programming languages, or other conventions, apply them consistently
throughout the document. This will help prevent confusion and allow readers to
focus on the content rather than deciphering different notations.</t>
          </li>
          <li>
            <t>Reference external documents consistently: When referring to external
documents or resources, such as other RFCs, standards, or research papers,
provide consistent and accurate citations. This will enable readers to locate
and review these resources as needed.</t>
          </li>
          <li>
            <t>Keep the broader context in mind: Try to adopt the same terminology and
conventions as other related documents the reader may be familiar with,
especially for specifications that are developed based on peer-reviewed,
published work. Consistency across audiences is important to help lower the bar
to successful collaboration and effective communication. If the specification
is intended to be part of the RFC series, reuse conventions from other
documents in the series.</t>
          </li>
        </ol>
        <t>By focusing on consistency in your cryptography specification, you will make it
more accessible and easier to understand for implementers, researchers, and
protocol designers. This, in turn, will facilitate the development of correct,
secure, and interoperable cryptographic systems based on your specification.</t>
        <t>Cryptography specifications are often unique in their use of mathematical
objects to define protocols. As such, presenting this content requires special
guidance.</t>
        <section anchor="representing-mathematical-operations">
          <name>Representing Mathematical Operations</name>
          <t>Mathematical operations are fundamental to cryptographic algorithms and
protocols, and their clear and precise representation in specifications is
crucial for correct implementation and analysis. This section provides
guidelines for representing mathematical operations in cryptography
specifications in a way that is both comprehensible and unambiguous to the
target audiences, including implementers, researchers, and protocol designers.</t>
          <section anchor="notation-consistency">
            <name>Notation Consistency</name>
            <t>Consistency in the notation used to represent mathematical operations is
essential for avoiding confusion and ensuring that the specification is easy to
understand. Specification authors should establish a clear notation system from
the beginning and use it consistently throughout the document. This notation
should be introduced with a comprehensive description or a reference to a
well-known notation system to ensure that readers can easily follow the
mathematical expressions. For example, exponentiation can be represented by
superscript or by a carat, but not by both.</t>
          </section>
          <section anchor="use-of-standard-mathematical-symbols">
            <name>Use of Standard Mathematical Symbols</name>
            <t>Specification authors should use standard mathematical symbols to represent
mathematical operations whenever possible. This approach promotes clarity and
reduces the risk of misinterpretation. It is important to remember that some
symbols may have different meanings in different contexts or disciplines. In
such cases, specification authors should clarify the intended meaning of a
symbol within the context of the specification. For example, when describing
group operations using multiplicative notation, the multiplication symbol *
should be used instead of the x symbol.</t>
          </section>
          <section anchor="explicitly-defining-custom-operations">
            <name>Explicitly Defining Custom Operations</name>
            <t>When a specification requires custom mathematical operations or notation, these
should be explicitly defined and accompanied by clear explanations and
examples. Specification authors should take care to minimize the use of custom
operations to avoid creating unnecessary complexity and potential confusion.
When using custom operations, it is essential to ensure their definitions are
unambiguous and easily understandable to the target audiences. A glossary of
terms <bcp14>MAY</bcp14> be useful when there are multiple custom or uncommon operations
introduced in the specification.</t>
          </section>
          <section anchor="pseudocode-and-algorithmic-descriptions">
            <name>Pseudocode and Algorithmic Descriptions</name>
            <t>Providing algorithmic descriptions or pseudocode alongside mathematical
expressions can greatly improve the clarity of a specification, particularly
for implementers. Pseudocode should be clear, concise, and closely resemble the
structure of actual programming languages. Including comments and explanations
within the pseudocode can further enhance its readability and ease of
understanding. Consistent notation for describing loops or if/then statements
should be used throughout the document.</t>
          </section>
          <section anchor="visual-representations">
            <name>Visual Representations</name>
            <t>Visual representations, such as diagrams, tables or visualizations, can be a
valuable tool for conveying complex mathematical concepts or relationships in a
more digestible form. When including visual representations, specification
authors should ensure they are clear, accurately labeled, and consistent with
the overall notation system.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="guidelines-for-cryptography-specification-content">
      <name>Guidelines for Cryptography Specification Content</name>
      <t>In addition to cryptographic specification clarity and accessibility through
presentation format, the content of a specification also influences the overall
value of the specification. The syntax of cryptographic objects introduced and
their interfaces, as well as the way in which the object is structured for use
in applications, is important for reliable and secure implementations of
cryptographic algorithms and protocols. In this section, we discuss factors
that relate to the content of the specifications and their impact on overall
quality.</t>
      <section anchor="reusability">
        <name>Reusability</name>
        <t>Cryptography specifications that rely on bespoke sub-algorithms or lower-level
components tend to be brittle and invite implementation issues. To create
efficient, interoperable, and widely adopted cryptographic systems, it is
preferable to reuse existing components or primitives. Reusability allows
developers to build on existing work, reducing the time and effort required to
create new implementations while leveraging established security properties and
analyses. This section discusses the importance of reusability in cryptography
specifications and offers guidance for incorporating reusability principles
into the specification development process.</t>
        <section anchor="build-on-existing-specifications">
          <name>Build on Existing Specifications</name>
          <t>When developing a cryptography specification, it is advantageous to build upon
existing, well-established specifications, protocols, and primitives where
possible. By doing so, specification authors can capitalize on the collective
expertise of the community, as well as existing security analyses,
implementation experiences, and best practices. This approach reduces the
potential for introducing new vulnerabilities and inconsistencies while
promoting interoperability between different systems.</t>
        </section>
        <section anchor="modular-design">
          <name>Modular Design</name>
          <t>Emphasizing modularity in the design of cryptography specifications allows for
greater flexibility and reusability. By breaking down complex algorithms into
smaller, self-contained components or modules, specification authors facilitate
the reuse of these components in different contexts or applications. A modular
design also simplifies the process of updating or replacing specific components
without affecting the overall system, making it easier to incorporate new
research findings or technological advancements. An example of a modular design
is the prime-order group abstraction. Algorithms that use this abstraction
admit a modular design where the group implementation is described in a
separate document dedicated to the details of the implementation of the group.</t>
        </section>
        <section anchor="clear-interfaces-and-abstractions">
          <name>Clear Interfaces and Abstractions</name>
          <t>To promote misuse resistance and elegant higher-level designs, cryptography
specifications should provide clear interfaces and abstractions for the
components and primitives they describe. Well-defined interfaces enable
developers to understand and interact with a component without needing to know
the details of its internal implementation. This approach allows for the
replacement or modification of components with minimal impact on the overall
system and encourages the development of interchangeable components that can be
reused across different applications and within protocols. Cryptographic
objects typically have a set of functions associated with them that make up the
interface. Structuring the functions to fit well-understood and existing
abstractions help make the job of using the object in higher-level algorithms
easier and less prone to code duplication.</t>
        </section>
        <section anchor="completeness">
          <name>Completeness</name>
          <t>The operations defined in a cryptography specification should be complete, with
defined behavior on all inputs. This includes error handing, and edge cases
which would otherwise not impact the algorithm's cryptographic properties.
In particular, when deserializing a byte string, the behavior on all byte
strings should be defined, including cases which would not be valid outputs of
the corresponding serialization function. A complete specification help avoids
implementation variations. These variations can lead to interoperability
failures, gaps between formal analysis and real-world practice, or security
vulnerabilities.</t>
          <t>Avoid defining multiple implementation behaviors as valid. Leaving multiple
options to implementators leads to compounding complexity: downstream
specifications may need to profile the algorithm to pick the preferred option,
and validation tools must be configurable to assert either case.</t>
        </section>
        <section anchor="documentation-and-examples">
          <name>Documentation and Examples</name>
          <t>Thorough documentation and illustrative examples play a crucial role in
promoting reusability. By providing comprehensive explanations of the
specification's components, interfaces, and intended use cases, specification
authors make it easier for developers to understand and implement the
specification correctly. Including examples of how components can be combined
or applied in various scenarios further clarifies their usage and encourages
their reuse in different contexts.</t>
          <t>By focusing on reusability in cryptography specifications, authors can help
create secure, efficient, and adaptable cryptographic systems that can be more
easily integrated, maintained, and updated, resulting in more robust and widely
adopted solutions.</t>
        </section>
      </section>
      <section anchor="defining-security-definitions-and-threat-models">
        <name>Defining Security Definitions and Threat Models</name>
        <t>Cryptographic protocols are always used within a context of a broader system
whose security relies on an understanding capabilities of potential attackers.
An incorrect definition or assumption about the threat models to a protocol can
make a protocol that is safe in one context unsafe in a different context.
Precise definitions help researchers assess the security of the proposed
algorithms and protocols, while comprehensible threat models enable
implementers and protocol designers to understand the potential risks and
limitations of the specification. This section provides guidelines for defining
security definitions and threat models in a way that caters to the needs of all
target audiences.</t>
        <section anchor="defining-security-goals">
          <name>Defining Security Goals</name>
          <t>Specification authors should explicitly state the security goals that the
proposed algorithms or protocols aim to achieve. These goals should be
comprehensive, covering all relevant aspects, such as confidentiality,
integrity, authentication, non-repudiation, and availability as well as
resistance to implementation flaws such as side-channels. Furthermore, authors
should clarify any trade-offs or limitations associated with the security
goals, ensuring that the target audiences understand the intended balance
between security and other factors, such as performance or ease of
implementation.</t>
        </section>
        <section anchor="formalizing-security-definitions">
          <name>Formalizing Security Definitions</name>
          <t>Formalizing security definitions is essential for researchers to rigorously
analyze the algorithms and protocols described in the specification.
Specification authors should strive to express security definitions in a formal
language, using consistent notation and terminology. The formal definitions
should be accompanied by clear explanations and examples to make them more
accessible to implementers and protocol designers who may not be familiar with
formal methods.</t>
        </section>
        <section anchor="describing-the-threat-model">
          <name>Describing the Threat Model</name>
          <t>A well-defined threat model provides an overview of the potential adversaries
and the risks they pose to the security of the algorithms or protocols.
Specification authors should describe the threat model in detail, including the
capabilities, resources, and motivations of adversaries. Additionally, authors
should identify any assumptions made about the adversarial model and explicitly
state them to help the target audiences understand the intended scope and
limitations of the specification's security guarantees.</t>
        </section>
        <section anchor="addressing-known-vulnerabilities-and-attacks">
          <name>Addressing Known Vulnerabilities and Attacks</name>
          <t>Specification authors should discuss known vulnerabilities and attacks relevant
to the proposed algorithms or protocols. This discussion should include an
explanation of how the specification addresses or mitigates these issues, as
well as any residual risks that remain. This information is valuable for
implementers and protocol designers to understand the potential threats and for
researchers to assess the robustness of the specification's security claims.</t>
        </section>
        <section anchor="providing-guidance-on-secure-implementation-and-deployment">
          <name>Providing Guidance on Secure Implementation and Deployment</name>
          <t>To help ensure that the security definitions and threat models are effectively
realized in practice, specification authors should provide guidance on secure
implementation and deployment of the proposed algorithms and protocols. This
guidance may include best practices for avoiding common pitfalls,
recommendations for cryptographic parameter selection, or considerations for
securely integrating the specification into existing systems.</t>
          <t>By clearly defining security definitions and threat models in cryptography
specifications, authors can facilitate a better understanding of the security
properties and limitations of the proposed algorithms and protocols among
implementers, researchers, and protocol designers. Following these guidelines
and the recommendations from <xref target="RFC3552"/> help make for a robust security
considerations section for the specification. Having a complete discussion of
the threat model and security definitions helps prevent the use of
cryptographic algorithms in insecure contexts.</t>
        </section>
      </section>
    </section>
    <section anchor="catering-to-target-audiences">
      <name>Catering to Target Audiences</name>
      <t>When writing a specification, it is important to consider the needs of the
three primary audiences: implementers, researchers, and protocol designers.
Each group has unique requirements and goals, and the specification should be
written in a way that addresses their specific concerns.</t>
      <section anchor="catering-to-implementers">
        <name>Catering to Implementers</name>
        <t>Implementers require a clear, concise, and unambiguous specification to develop
production-grade software. To cater to implementers:</t>
        <ul spacing="normal">
          <li>
            <t>Provide step-by-step instructions for implementing algorithms or processes,
ensuring that all required inputs, outputs, and intermediate steps are
defined. Where exceptional cases occur, those should be noted and recommended
error-handling steps should be given.  Include test vectors to help
implementers verify the correctness of their implementations.</t>
          </li>
          <li>
            <t>Describe best practices for representing components of the specification in
code, addressing exceptional cases and recommended error handling procedures,
as well as aspects of the specification that are difficult to implement
correctly (e.g., where side-channel attacks might be possible).</t>
          </li>
          <li>
            <t>Clearly indicate any optional features, variations, or extensions, specifying
their impact on interoperability and security.</t>
          </li>
        </ul>
        <section anchor="test-vectors">
          <name>Test vectors</name>
          <t>Test vectors ideally cover all branches of the specification, with reasonable
exceptions, such as branches that occur with negligible probability and as such
are computationally infeasible to reproduce. To facilitate writing tests, where
possible, all functions should be written with determinism in mind. In
particular, this means that functions that produce random outputs, such as a
function that produces random elements in a prime-order group, should accept
randomness as input and test vectors should specify this randomness as an input
to the function. Specifications should minimize internal calls to PRNGs or
similar and emphasize determinism.</t>
          <t>Finally, specifications should make the connection between specification and
test vectors clear by including explicit reproducibility steps that describe
how test vectors were derived for parts of the specification. This might mean
pointing to a reference implementation with instructions for how to run it,
where the reference implementation is written in a way that is clearly
consistent with the specification.</t>
          <t>It's possible to include too many test vectors in a specification, which
increases document length and decreases readability. Authors should provide
test vectors that cover:</t>
          <ul spacing="normal">
            <li>
              <t>Typical test cases that exercise all logical pathways within an algorithm</t>
            </li>
            <li>
              <t>All valid but degenerate cases that result in error or early exit of an algorithm</t>
            </li>
            <li>
              <t>Exceptions that can be reached by attacker-controlled inputs</t>
            </li>
          </ul>
          <t>It is NOT necessary to include test vectors for cases that are statistically
improbable to be triggered, even by attacker-controlled input, based on the
underlying cryptographic assumptions. For example, if an error case is only
reachable when an intermediate data point matches the pre-image of a hash value
that was randomly generated, finding a test vector to trigger that case would
require the ability to compute a hash pre-image, which is deemed unfeasible for
sufficiently strong hash functions. Exceptional cases that don't have test
vectors should be explicitly noted in the algorithm description.</t>
          <t>Lastly, specifications should provide references to machine-readable test
vectors (e.g., in JSON format) that persist alongside the specification. This
helps avoid possibly error-prone parsing in translating test vectors from a
textual specification to test code inputs.</t>
        </section>
      </section>
      <section anchor="catering-to-researchers">
        <name>Catering to Researchers</name>
        <t>Researchers need to understand the syntax and functionality of the
cryptographic protocol or primitive to ensure its correctness and analyze its
security properties. To cater to researchers:</t>
        <ul spacing="normal">
          <li>
            <t>Clearly define the underlying mathematical concepts and notations used in the
specification, ensuring that all symbols, functions, and variables are
consistently and accurately represented as explained in the section
Representing Mathematical Operations.</t>
          </li>
          <li>
            <t>Provide detailed security definitions, goals, and threat models, including
the capabilities and limitations of adversaries and their impact on parameter
selection. In general, authors should make input requirements that are
important for the security of the protocol or construction maximally clear.
See: Defining Security Definitions and Threat Models.</t>
          </li>
          <li>
            <t>Describe any assumptions made about the underlying primitives or protocols
and the justifications for these assumptions. Such assumptions should include
references to external documents that describe these underlying primitives or
protocols where appropriate, unless there are gaps between how the underlying
primitive or protocol is used and how it is described externally.</t>
          </li>
          <li>
            <t>Clearly present any security proofs, analysis, or references to existing
literature that support the security claims of the specification. If there
are gaps between the specification and formal security analysis, these gaps
should be noted, along with rationale that justifies the gaps.</t>
          </li>
        </ul>
      </section>
      <section anchor="catering-to-protocol-designers">
        <name>Catering to Protocol Designers</name>
        <t>Protocol designers in the standards community use specifications to understand
how to safely use the cryptographic protocol or primitive when designing a
higher-level protocol that depends on it. To cater to protocol designers:</t>
        <ul spacing="normal">
          <li>
            <t>Clearly define the interfaces, APIs, or functions exposed by the protocol or
primitive, indicating how they should be used and any potential risks
associated with their misuse. For example, for each input to the protocol, it
should be made clear whether or not these are attacker controlled and, if so,
describe what steps must be taken to validate that input.</t>
          </li>
          <li>
            <t>Describe any corner cases or situations that may impact security, providing
guidance on how to avoid or mitigate potential risks. This includes
explicitly stating the probability of an algorithm failing due to invalid
operations occurring (such as divide-by-zero) both in the typical case and
under attacker-controlled inputs.</t>
          </li>
          <li>
            <t>Explain any dependencies or interactions with other protocols, primitives, or
system components, highlighting potential compatibility or interoperability
issues.</t>
          </li>
          <li>
            <t>Provide guidance on configuration, parameter selection, or deployment
considerations that may affect the security or performance of the protocol in
real-world scenarios. This includes the impact of new discoveries that weaken
the security assumptions of a primitive.</t>
          </li>
        </ul>
        <t>By addressing the specific needs of implementers, researchers, and protocol
designers, a specification can be more effectively understood, implemented, and
analyzed, leading to more secure and interoperable systems.</t>
      </section>
    </section>
    <section anchor="general-recommendations">
      <name>General Recommendations</name>
      <t>Developing effective cryptography specifications often requires collaboration
between multiple stakeholders in the target audience, including engineers,
researchers, and standardization organizations. Engaging in a collaborative
process helps ensure that diverse perspectives and expertise are considered,
resulting in more robust and widely applicable specifications. This section
discusses the importance of collaboration and compromise in specification
development and offers recommendations for fostering a collaborative
environment.</t>
      <section anchor="encourage-open-communication-and-feedback">
        <name>Encourage Open Communication and Feedback</name>
        <t>Effective collaboration relies on open communication and an ongoing exchange of
ideas and feedback. By creating channels for communication, such as mailing
lists, pull request threads (as described in <xref target="RFC8874"/>), or regular meetings,
specification authors can facilitate discussions, address concerns, and gather
valuable input from various stakeholders. Encouraging an environment where
feedback is welcomed and valued helps ensure that the specification benefits
from diverse expertise and experiences.</t>
      </section>
      <section anchor="seek-external-expertise">
        <name>Seek External Expertise</name>
        <t>Involving external experts, such as researchers or engineers from different
organizations, can help identify potential issues, uncover new insights, and
provide a broader perspective on the specification. Engaging with experts such
as those in the IRTF Crypto Review Panel who have different backgrounds or
areas of expertise can also help identify potential gaps in the specification
or highlight areas where further research or clarification is needed.</t>
      </section>
      <section anchor="recognize-and-address-conflicting-interests">
        <name>Recognize and Address Conflicting Interests</name>
        <t>Collaboration often involves addressing conflicting interests or opinions among
stakeholders. It is essential to acknowledge these differences and work towards
finding mutually agreeable solutions. This may require making compromises or
revisiting previous decisions to ensure that the specification meets the needs
of all involved parties. By maintaining a flexible and open-minded approach,
specification authors can build consensus and develop a more robust
specification.</t>
      </section>
    </section>
    <section anchor="examples-of-well-written-specifications">
      <name>Examples of Well-Written Specifications</name>
      <t>To provide a better understanding of how to write high-quality cryptography
specifications, we will analyze specific sections from a well-written example:
ChaCha20 and Poly1305 for IETF Protocols (<xref target="RFC8439"/>).</t>
      <section anchor="chacha20-and-poly1305-for-ietf-protocols-rfc-8439">
        <name>ChaCha20 and Poly1305 for IETF Protocols (RFC 8439)</name>
        <t><xref target="RFC8439"/> is a specification that describes the use of the ChaCha20 stream
cipher and the Poly1305 message authentication code for IETF protocols. It
demonstrates how to write a clear, comprehensive, and precise specification
while catering to different audiences.</t>
        <section anchor="introduction-and-overview">
          <name>Introduction and Overview</name>
          <t>The introduction in <xref target="RFC8439"/> clearly defines the purpose and motivation for
the specification. It provides context on the origins of ChaCha20 and Poly1305,
and how they are used together to provide confidentiality and data integrity.
By presenting a concise and informative introduction, the specification sets
the stage for the detailed technical descriptions that follow.</t>
        </section>
        <section anchor="algorithm-descriptions">
          <name>Algorithm Descriptions</name>
          <t>The specification provides detailed and precise descriptions of the ChaCha20
and Poly1305 algorithms, including pseudocode, constants, and mathematical
operations. This section caters to implementers, ensuring that they have all
the necessary information to create consistent and correct implementations. The
mathematical operations are expressed in a clear and unambiguous manner, which
helps both implementers and researchers understand the algorithms better.</t>
        </section>
        <section anchor="test-vectors-1">
          <name>Test Vectors</name>
          <t><xref target="RFC8439"/> includes test vectors for both ChaCha20 and Poly1305, providing
concrete examples of inputs and expected outputs for the algorithms. This
section is invaluable for implementers, allowing them to verify that their
implementations are correct and compatible with others.</t>
        </section>
        <section anchor="security-considerations">
          <name>Security Considerations</name>
          <t>The specification dedicates an entire section to security considerations,
catering to researchers and protocol designers. It discusses potential attacks
and their mitigations, recommendations for nonce usage, and the security
properties of the algorithms. This section also provides references to academic
papers and other resources for further reading, enabling researchers to delve
deeper into the security aspects of the specified algorithms.</t>
        </section>
        <section anchor="iana-considerations-and-references">
          <name>IANA Considerations and References</name>
          <t><xref target="RFC8439"/> concludes with IANA considerations and a list of references,
ensuring that the specification is well-integrated with existing IETF processes
and standards. The IANA considerations section is essential for protocol
designers who need to register new values or coordinate with existing
registries.</t>
        </section>
        <section anchor="problematic-aspects">
          <name>Problematic Aspects</name>
          <t>A criticism of this document is that it does not cater enough to protocol
designers in that it does not explicitly define a decryption algorithm.
Researchers familiar with the concept of a stream cipher understand that
decryption and encryption are identical in stream cipher constructions, but
this may not be clear to implementers.</t>
          <t>In summary, <xref target="RFC8439"/> serves as an excellent example of a well-written
cryptography specification, providing clear, precise, and comprehensive
information for implementers, researchers, and protocol designers alike. By
studying and emulating the structure and content of specifications like
<xref target="RFC8439"/>, authors can create high-quality specifications that cater to the
diverse needs of their target audiences.</t>
        </section>
      </section>
    </section>
    <section anchor="examples-of-specifications-that-could-be-improved">
      <name>Examples of Specifications That Could Be Improved</name>
      <t><xref target="RFC8032"/> is a specification that describes the Edwards-curve Digital
Signature Algorithm (EdDSA). This specification had several errata filed
against it for corrections and has had documented criticisms published online.</t>
      <section anchor="test-vectors-2">
        <name>Test Vectors</name>
        <t>The test vectors included in this document were not comprehensive and did not
cover all the cases described in the algorithm, resulting in multiple
incompatible implementations. There were also issues with a "greater than"
comparison which should have been a "greater than or equal to" which were not
explicitly covered by the test vectors.</t>
      </section>
      <section anchor="unnecessary-branching">
        <name>Unnecessary Branching</name>
        <t>Some components of the cryptographic algorithms in EdDSA had branches that
sometimes led to different implementation behavior. In particular, in the
verification step for Ed25519, the following text exists: "Check the group
equation [8][S]B = [8]R + [8][k]A'.  It's sufficient, but not
required, to instead check [S]B = R + [k]A'." This alternative branch has
led to disagreement between what signatures are valid or not, which has a
profound effect on applications. Minimizing and removing similar branches -
especially those that exist in the name of performance - should be a goal of
all cryptographic specifications.</t>
      </section>
      <section anchor="compatibility-and-modularity">
        <name>Compatibility and Modularity</name>
        <t>EdDSA is a variant of the Schnorr signature scheme, but with some small
variations that make it incompatible with other related Schnorr signature
schemes. This includes a "clamping" operation that makes EdDSA keys and
operations incompatible with x25519 (<xref target="RFC7748"/>). Many of the issues in the
specification derive from the fact that the specification was written to match
an existing implementation rather than define an algorithm. This limited the
authors from focusing on compatibility with other related standards and
primitives, resulting in numerous issues.</t>
      </section>
    </section>
    <section anchor="conclusion">
      <name>Conclusion</name>
      <t>This document provides guidelines for writing effective cryptography
specifications, emphasizing the importance of catering to different audiences,
such as implementers, researchers, and protocol designers, with the end goal of
enabling high-assurance cryptographic software. By focusing on simplicity,
precision, consistency, reusability, collaboration, and compromise,
specification authors can create documents that are easier to understand,
implement, and analyze.</t>
      <t>We have also discussed the representation of mathematical operations and the
importance of clearly defining security definitions and threat models. These
elements are critical in ensuring that specifications are not only technically
accurate but also convey the necessary information to properly assess the
security properties of cryptographic algorithms and protocols.</t>
      <t>Finally, we have examined a well-written example, <xref target="RFC8439"/>, to demonstrate
how these guidelines can be applied in practice. By highlighting specific
sections of this specification, we have shown how authors can create
high-quality specifications that cater to the diverse needs of their target
audiences.</t>
      <t>In conclusion, the process of writing cryptography specifications is both an
art and a science. The guidelines presented in this document should serve as a
foundation for authors, but it is essential to remain open to feedback and
collaboration with the broader community. By doing so, we can continue to
develop and refine the specifications that underpin the secure and reliable
communication systems of today and the future.</t>
    </section>
    <section anchor="security-considerations-1">
      <name>Security Considerations</name>
      <t>This document discusses best practices for writing and editing cryptography
specifications. It does not provide any guidance for the semantic contents
of those specifications.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8439">
          <front>
            <title>ChaCha20 and Poly1305 for IETF Protocols</title>
            <author fullname="Y. Nir" initials="Y." surname="Nir"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This document defines the ChaCha20 stream cipher as well as the use of the Poly1305 authenticator, both as stand-alone algorithms and as a "combined mode", or Authenticated Encryption with Associated Data (AEAD) algorithm.</t>
              <t>RFC 7539, the predecessor of this document, was meant to serve as a stable reference and an implementation guide. It was a product of the Crypto Forum Research Group (CFRG). This document merges the errata filed against RFC 7539 and adds a little text to the Security Considerations section.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8439"/>
          <seriesInfo name="DOI" value="10.17487/RFC8439"/>
        </reference>
        <reference anchor="RFC8874">
          <front>
            <title>Working Group GitHub Usage Guidance</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <author fullname="B. Stark" initials="B." surname="Stark"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document provides a set of guidelines for working groups that choose to use GitHub for their work.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8874"/>
          <seriesInfo name="DOI" value="10.17487/RFC8874"/>
        </reference>
        <reference anchor="RFC3552">
          <front>
            <title>Guidelines for Writing RFC Text on Security Considerations</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="B. Korver" initials="B." surname="Korver"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>All RFCs are required to have a Security Considerations section. Historically, such sections have been relatively weak. This document provides guidelines to RFC authors on how to write a good Security Considerations section. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="72"/>
          <seriesInfo name="RFC" value="3552"/>
          <seriesInfo name="DOI" value="10.17487/RFC3552"/>
        </reference>
        <reference anchor="RFC7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="M. Hamburg" initials="M." surname="Hamburg"/>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <date month="January" year="2016"/>
            <abstract>
              <t>This memo specifies two elliptic curves over prime fields that offer a high level of practical security in cryptographic applications, including Transport Layer Security (TLS). These curves are intended to operate at the ~128-bit and ~224-bit security level, respectively, and are generated deterministically based on a list of required properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
      </references>
    </references>
    <?line 856?>

<!-- # Acknowledgments
{:numbered="false"} -->



  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA61965LcxpHu/3oKLPVDlre7j6jLkTzh9e5oSNrcFSUuSdnh
sPwD3ajugYkG2rjMsOXQu5xnOU928lqVVUAPKe9RSKGZngZQqMrK/DLzy6z1
eu3Gemz8VfHo91Nd+aZu/VDsu774U1+PdXsobvrzaewOfXm6PRevT35X7+td
OdZdOzxy5Xbb+zu4mL9Ff4ePq27Xlke4adWX+3Fd9+N+vdv3h/XO3Gw92Jut
P33s4Cd/6PrzVVG3+87t4BG+HabhqtiXzeDdMG2P9TDAt8fzCe7+/NWbZw6e
/rlz5TTedv2VK9augH/qFi76blO8npqmvitb+pCH9F29e5t+3vWHq/Q1b+DJ
U0Ov/+23N/SlXT3CuF6XbfGsL9tdPew6/ryb2hGH/ENbj74qXo/wEkPR7Yvr
o+/h5ehb/ljWzVXR1rvbrimHzSDP/9faj/v/OOBfN7vumAz/ZlNcb4o/dV1l
Rn9z29fD2J1ufZ/8ld+h6aZq35S9XxXP292G/jKMvffjVfH408fFm+4epxRH
+f/vpXbl/X/c+vIEs7Wtx2HT+tE5XMD+CCt752FRilfPbr7+4vPf6I9ff/WF
/Pj5l19+Jj9+9dUXXy9899PP4QvOrdfrotzCy5Q7uP2b23ooQMqmo2/H4tR3
dyC7Q3GIIlzCW279gH+EK+qdSPW9SPXod7ewGmXjEinkL1kpxZuP3a5r+Jan
vj7W+FbDqhjL/uD5bre+aL2vBgdTVB9Pjcdx+R6+1PvBl/3uln7hO/D9Chhw
fWjh803xfCxu68NtA/+NA97NwU26foQ18TjrYbRFNlq8YQXLNg0DvCDODuyg
2utr+BKH5/De679PZQPLnd9hvC3HAjdeX8D+DS+CT/Xl7hZE4XicQArOK1jT
XTNV+L44zzy2Fl7whO/Y0kTAit96XHYca3fyPT9lVQx+N8HUn13l9zXcjj/F
4Y+3OMzi2MHKDRte6GNdVY137iMQ47HvqmmHFzj3B/siySrl89J7+HvN48C5
wBfD/1f+zjfdCZfH0eT5U9OdSYrgjWmU3t653kUB2BTLYucOqeZMxkISB4uM
s7vvmqa7x59ufXMqULfB02gFYHx1n8sivgWMCpev0LfGQePn0+D3U3i3uged
McLOhs1awhp5WJzNB+wSuyV2DQjqCr4GYxg8Lw6qYNA3OFvZ2HbdHWgClP3u
VO9A9iYQlnL4MHEQKYBvqFwUM7mAkcIKbnl7WREprqtbfTS+OxgG80Y4s0My
tQuT6suhZoGfYMr6ATZatXJh4/IAyrZszj/BRMC8VPI4WopygJuT+OPXcN57
erdt44vhDLN1RDl+AxL31p+L+66H7fToxQ+v3zxa8f+L776nn189/e8fnr96
+gR/fv2H62+/DT84+cbrP3z/w7dP4k/xypvvX7x4+t0Tvhg+LZKP3KMX139+
xO/x6PuXb55//931t49grDAlViZwMuC1tp5fA5YO1X05OJl9j+9XfHPz8v/+
n8dfFP/4x7+ARv7s8ePf/Pyz/PL146++gF/ub33LT+va5iy/wtqcXXk6gVjh
XcqmAUVzqkew5SsUleEWzBEsWA+i6n79F5yZv14Vv93uTo+/+J18gC+cfKhz
lnxIczb/ZHYxT+LCRwuPCbOZfJ7NdDre6z8nv+u8mw9/++8opcX68df//juH
+u33XSmW5ZX/+1T3JH8DSw/amrI/F4cOd8+eZd3u3noIuoQ+JS3HSGi4rU9w
jUtVWbYVhi4onzOJAiyK6BX46dQB1EKZxtV0akxoC6zjFsge0O3He7jTJkOK
/BzWf272HiAIU4PmuqA9xAKJexRESTYo4JyVsawVCZuTLQqXggKp93sQJRRq
UYAgZdFk4dT49gDPY90R7Vow0c58hitCaqHsq/on1uThz5viG5ivqoILB703
/OHvkxpPHJt/BzMwyuurNT303XRazVeyrI/w2oBzfl28ADV4rH+CuThua/iK
6HwAvmGLqlE1iomUt89sz0Am7tjhyu5Az4KVj3PI39jAE5+ysoy6XlR/D5Zg
zC/AqWZLgk8u+cGiLk40TfCu224ENdkAlq/H2+Mgdh6tFC1nc54Zhz0gzoqe
gCN6Vu5qsHY4XnAvan8fFTIMEYeAU67rZteyRAnDu4thdGilgi1WE4+TeiKl
PdY+DK+A5QC7Zb996nA+aoCJd1PToo7HccE1PG8krsYA1GSiLQaM689rnq4P
Wtvu2BFIA4TRlNuOTaSswPEEv8ldt368974t7sq+7qZBLU2CKdHuPEU5i88b
y7cefA6YdRY+tNyAqerthIh+6I4eLALMV9w+AgPRvqPKhnvDVqJXYLBEZlv2
OUjs4w1MxMK+umK0FH4PswuPjXgW7g5zeBx407uha+7QAME73ZZ3rNCGt3Uj
OhJWvJt6xPKtx0GhdsQLpxrUB1w78WxPA0/o8TQxPO8IvekwEfYAYkbweg/Q
cQdSUIJ9CkMx6oj3OKgbdyIYinfrjaJmvUbYhQcrN2H9EQZE3zqCGwY/dYBX
7C0QVdLOAH/ziBJP6p5VexAjvh/qdJ158PhgivoKf3Z0fw8LuEPXBLTmWO7e
Nn4QIdjdwkKC8kOx/WwDlibfN1fhM5gdRwjpHW6OASaow5+bruf3Y6cFxLhk
zySKDTjnf0N9AVeXogHvymbCNwq7yE5JFyf8HrQE3V0tHcg6OiQRnOF6lgw1
BYWTMCucHwoU464aBOPjGMPC8w7xPTqkeB96tVqWr4P91IAzA6O8PcM4cb54
SRbUC26dHVzXszcM2AWs2YLYsBSvggMGcwKCD26oSAJZbEVYcU4QsONyHcuz
GC7U22Xlj/UONAVI7pq1IeyQU3lCQUZvQwWCwe6Ixg//4IbphD7kwJsIZAc9
dFKBaqTd5xt07ZeN3JWd5xqB/XBCC4Eqz3hSOKMX3VPUoMF9pvHhDMO4d2Vb
JHBboDaKDWnsM6/BRRNc8H5MdMmCZ+sAcI5TkF3Y5w2NqgyzTs+ZKWYwE/0d
4aHSmCZnvepl4E/CRt6HAoNlOzrHZpm5tCod0AZDJ7lnhh3QNKZgpAI7DhI0
pr68mxmDVearCnak5aH3BPDnm2Y9jD244DCP6CXFyA5dHedMvQpFe9GI8+wH
z3sVTPmKEMpsanI/KweZYcMQhE7d2ZvkuwkMLV6ya8qL6d5ckpyqK9puZOHD
bc7QBZwV1dWo2DxuCpjJGg3WHsy4E4RDALpFkymWVC22Ci9ZQJyhHlU13/8I
bm06DIeLQEawPJY/sWltCZ2B6SaV2U0jI/4TYpm+JlVr3hDg70jKBF7GbTN0
r+EC3mfWqRAfcfA7lglEj8W2HOjv8DFGSsCC4dt42Rg88yo9CEdRU6CYoe8Q
IgxlupAuEz6JbMDrNPAZbqqtP3fw6d+mYcxlQBTDoJe5g0d81oAN6aos6LcY
kCHh+ah4jcJXYyDUuZsOBfEdgRXU715wFEwizMqunAYOggaVu50OYiw60LUD
3Jf2dXKbITxgBbNRgz2pUatgaKDEgVHgKSiVYMTdA+Et8j9gT9Z3inTjQ4qI
ZHCSRgYZK6OjRYw0Gmnl5bI2OILmkCBV3ObqWXhxFGHhS5BMXHf1wawLlgRG
3QcFRuPqwGYRfU869dBSFLZourJSOFWlAR22ezMRO4p/xXfq6+EtrtnMvdLF
wpdHP4vgWHvJKSJ4piHOmavg3sDE7G5rjyrTiMPydAuOUIxKTuENelmNRslE
y8syX6EN70d2zELorSSwUg8cpGJnmiSz97Aleb0yr83iV40L5GOsCaozTgeV
ddfVFUx5RON/K/uDTDQJKAmFCs9cMF0qPbALcPUYEILaJF+jQcPBRoxAKb4T
KSnAIbVvQIM9rzwA3PPKkY+djVgg/KCBTVK5nv1WnVFf6dDQr3vlBenLRmbY
dxpFsx0BBlE8FSZ9uCr+hBoOIXKJl9DIj4jlwWj602Ubj0hCbrsqtvDib8kM
gO25b1E5d8VwRNTer2ibuSOYzIMnrRiGoBHpe3CQeJJB4UtsE7WCTudsW4AR
r0B5VBN6YPgaxkMHo8RCDYiRLsXZKlsCbjg7PxDKwFQDZivgMaAJq6Ip28ME
A+QbeUTaXdMdAEViHtEviJI4aRx0VlnV2+TRZ07n9LDZk5CQfRKOjeURPVf0
gYLGY6HUsDL5amV7povVNyvRwYY778sjbNuyZyE/ep3DTVF8S5kffPddh9nH
//L+tPBetG+94gYN4qmbgOs+oUtWYoi93vgNDItGvQcLwMkHuK9urVrSH/jY
qaWl8ZWDe6ALg0lAeDsOwFNElQy3AW8wgftpUM0H+BfNIoEVkgINMNKQcf5e
hsAOrQuIdYk7QPNMJcjxEUT+uTgnyZ/v6gHFqawrTPdMADdhQHoNvjZ/QZA8
ps8kdAnCO3Hmar7hwI2R+IN4ZYMXpw7f8oBvCSsNKhUG7iUoVFYaiMFhpT6k
aLlkxRRg70gicd1SaxqC5QEFq7mKiihFbop3ZOirJVydgWVEE7k5JR96KVMR
YgUNmkXNVMNQ6A4gJXUp10tGyy3Eoz7Q+yiexYlx6cToa1YdBmQ6toq8Gqhp
yar0qNvuKGb69A4UZdPBKsR3xwnxx21Xne2kh3hAjyqmKEcKH+CG6sSJo7nR
9RC3lhZEUN1LHYFz4UfGXTu4BiMREXvpazyQJV051JL1bmrIZuQ5YsQKHmae
NDY6OrVOcx+iuAj6FUs41O5g1fASDUfmoAHcATFYmX7h1Ja4t2b1c0RyMaKr
aVeUuvYcXDFYlRaR7giQbFjcJQbFxBUGOTh3Ux54XkUPgDOv6r1mfgPHD38Y
xB6r1k9sgZqQ+WPEhuS2iLc9Tzz6XXojVaqCUcgCw7gAO8KaD2IKHJoCBXwz
VLhhc2/VcjQzbE+sYXeSc5W3MzlO/BqBhlajFV2StERBUvNN0T7SM24owSSd
8F0wkPdS7o43wp2DvBHaEwGTlgLQFOVsPXiUddcLbIk5VhcVwCru/hUOk7RY
hTK30hxygdhmvT0TxkmfKlGX1qRwePU5S2N9AAFLiMcx7NcXP/m+u4zILdiZ
5c9xvha2gDNbIGiVkCmXYKb1CqxTUPi+7yjINof0n8fZH5Flcgcbq0OY8Mb8
xsOE/bR7yzqDN2Ar4XQYs9MFWTQkq8LT7whuOXJctGSWqwMjCFLPwUyvXE2R
rWSL1O0dYnVUfVsMptyKgFY1P2FEOaBXoBuK9+FqhtS4iqgfR0/K17/zPe1N
SvCcyvFWUxtyc/DYMKNQH72AEdArdbtHQQCLBO+zOQDgqUlZb02+pCyigtVx
3mLqmJwduEnrD0194Jtg5ONwy8YOPHEc2i0IHFogvlRULQXwwTVkQ0mEBV9t
3Bdgio6YyCgokNXghRJ4AmEf/ATmqatA7TDSffBLHKTBVdadUQa1nXlXdoOB
9isjnGD/1+U8ExJ0K+MfSCxywX+mWdDMXwTOId2l+yAIYeAzlDvFCY79bfU4
aBctyerGfalJ3zO/H4cJNSIKswWzibS2xPFKvroK33MDvNhRZgaDsXVAjkmo
n+wt3gEJgRTeqmQnpcGlB3VHzGHkGgTmz8Uw74jmujwC4B2as+SjMCZBk9HU
bwF33aJTgvm/1ibvJCAv8T+146RcNu5/b4ongY4xDNPxZKhd/oQrBPbQm5kj
75ltt/l+h1nY+HW0GP4dDL2lkI+un43HkEs3C9n3iSCpBKtQSl6Cg5ldm4yQ
5kDC/LilYS9W4Gm003Hre4nPgVqcrUViEyTNp6KdyywFr96NDuEnxWcWUIEs
llhAmKaYf2rQh4tviooe4zMvl5DWEI1Cmoq/vOppHDuYDxIHsUM7jgghSL0J
n52dI3tcRmeDIrDNfj3DcHN7ljENDLzGMaGHAZuDgsFMjpLxpy8Fz4u+Bj4F
brFxTzWTEccPX98B0h5M+OKu25VbVN2AhFMP3oYXHT8doUC/EMUzKd3LsQv8
777r37rw8vk2jxjVDvl9KNV9AEp9CkPYAlC85diaLkMS7HjCSQ7lReRLJsFz
BoohGlGbJDHtiq1nTTbe9mjpNM6v6xribox+z23Xnhl4UuDphLE0eoISHwk1
ynKlcQIFuiFQsGFBZI8PFxpvjbSK+/I8BCPHkaL9hGEnX5KNnk4Y+6hhneBi
DQTBW9DMyo3MVKACBdNNgJ2w7IsSFC2G2Uuk0qBBAD13Fi92BOX1nkhSUVqs
l16ag2uVLfI+LUaNKgZm2eUKL9wdAziwtTCyofwVa8xPUws/CoJDyy6sNzFg
m+L5nqWx6w8weWLWbinZyAOndAxcW5FbiZHnkVlYgb48N7+fsx9VwmY6pEO6
Kr7nBy36UDTles2xbEFLrzBT2I8hngnThOApEHEIM4IsHGLOkQQ1z3apzUmc
iyy88ALDljKhknKi+NE2/kJZOLRVweOHkfrGhxQ+h0+nk10+RvVpTBS+2gLQ
ObD5rGI4vOK5UwcSoxbl7i393HvCBpR5kEi23CNGzV0MEZEJ6Alkqn9gBIdx
Dk7slbKugvcSXigiLJd5A8qxRT2EgrYH/c0SFwApo62/T6rg0HeUp/rK2f03
M8O6K8Af3r1tAl8nD6MJ5TYMl9SJPwd5SIQhqCxEh9/4mfmC3+84tsP6UFG2
xtV5a1ummNOvrPiJsAUpSSBmh11WRjbm5ivKKp45xG5nwV3UsdnsgKDgzbKQ
KtHNjK1ygVlkRbEvaTzkpVSwoifhL0fgGd6b8OArlbmI4EzIzIxeZolkVBnR
eomFAX1kTkUp4kl69ewGP9N06kq+zMwXZpmYMEYKRgKpcKegKnVdKAppDHnT
YaGBYwxF2oTJDJHWVQ5EWUA37atNjLBT5J9XFNEfhTrrtroq3jABrKy60xhN
nTHJss+NlOmLSzA9CcTqaDUfELIBKKwrZ7zxWVrZxHGF6YCOVSmZgIS8A/M5
EZDwDGY2FgkqugokVkRmWg0yhqB5RFHbsqd44kSBY8zuz5mEIatcJD4IWaJ5
+LqO7ADh4qJzro4+CAw5ZJ58UMplmOml3AIr6zix6i/SVfNw+xJQu5z9XuEX
kpSXWwicL1L8adUe9qLdUhYaZXpFbzH1mBjGZ19mt1BwXUKtjuPvq4VKgYzP
IPShIDFzSw0Td/OekheOhggVuVbiiljXRIt2RNYbOKJOjrixyddczrGy+WSG
jKrQOOE+FLIhnBYEsWfzEWgwc+kLS/T9PlSBOPdiuTyEjRaSrsiXagigPpCt
cCZeGfOYEYBrQCaUpgTgk01hPThND5hwXe7WWSqy6DvlylyqCPqQohgcj5X6
vOCGcBqgcIkFDRyDyzL6eeibGUiOK9WWifG/vFyN1/ij4jsNiSWO7E26m3Fz
hNgZezVdnI/LkzE4TPqx106RHnR5xBM1BthQ7RYJC+zWopFwUQ9k1Qk588Jb
R4+kKLwAb9NA9wLdeKhb8n/E3UG0mXg5D+MLvbGL5FHNLaBxIPBt1/guCyv2
GGYJaAEtoSPC3tsWaQT5sH+JG+SSlfHvToT1ycTbkDP+hVB+LQRNjruGBaao
P1JR4UE0bALXZ3yrEtZ6RWQ2ityeSaCDcP3ASkvpqakSeX0+bmG7O/fgOk5D
JJCmgjbw9YkoukuiiI4XJutCQYysHdHukHDCHH50EZuyl3iKs3QlzScspDSe
jzP7jrxwjJgJobc7gh8g40VYQpTAiBzF/yb9ED8VoETQD+tD6xMpI3geiNpE
tKaBsOBD80evsz+nsWL19zHCJ+OyMWFFaIuJ9lRy7rMMFDONzcQL+OeYBt3j
LuqSFRPzzB9Jzmk8vzbbSULCIP9lpaN6J18MwvZUEmiwA54ow+pmGkbAMtZe
SYwunbRgC3d8wSUx6vp07FjPHkbp4wA0VScAG8PIbc3JMyVlmLQhVxoxDeM9
ag3Jv7jrmJJl810CEPgFnBkzKhQKNQV+ouV6GZ4jWYoQZV2OJsn82KrgmqQ/
KnqroNCG2/AYZvOsaYu0NoPwtH4M3yo3ephSPzQdjz1E4V5c/1nEBKEzyeRI
URdiZGg8TceONQkS+Y7v4YzKXk6NiJi9TN30a0UxgGiemFA7xqNDgZX5jg3H
p2ko+FoHOgBdtATlGbV9kTCjSqub5Q5XhWU9uBw8b+z7RFFOGV1C5IJpF7IK
qLbGc3Aj0Gnw0Rgxa5Zd+o0QjrS8iMMOuPxmJzijhMzE4Fvvp548Pt/eEpsc
Q+I5TQgkibi7CV3IOGbRRdcSEy1ObjqsP8G52f8vCoxF1m2uhi5hAZWPPzKF
6lWCU0Ec5PMUvxpPXllWK4kMLbGtNCHqqCiHt0mnOBf8t7MlPCY6zJCxMnIg
QlJ2vqoa1mnU2pBjoEnost1deoPE8cxxWFAFXJ0qkmUSmuDm+kaKQfPYEuEz
LWLLkND7CgeyRicoBlQD754TobRWMtID1bUWDATflOVNxMAl3ggH6VZJ3Gi+
JWGjD8hD3jeTxCTjSzquSli2vMhRH87wsHdz7pf6gkaNoVkZQ1uBHpxdzwxD
RJcS8iNnJOThaCBcAVYPMfbMPjfmAVBYTsFUo/K3uIe9pBlxbaGQ8kPLZkBp
JIUMADi89spA7x0JGk7LMMiN7/LJn82j5cnCyJBM2bVh/oU7Jtm9V34aRMM8
7LgnpSBbrLICOz1M23XKFqaIz5rI0M7k4xGWSZRmi0SNRrsS3NWzal+Y8mEi
ImUnNETn9zCQmsoBkvAEbynk8mOmBsNrvloOWYgVR2neS2iDQCyCCgAHw6iK
RQZMCWZtorKx08TRVOw9wPEzDhpycSdls+VmGDNbcRZTcyHIONFIF0hUYSoC
nBAuW38/kyYQXRguzmlfHqj8Ql0/X12qFOaic+GjGt8/tmEhvJz0b+nNS77H
zadkB8L4IXZZ2UsKuT9RUI8SlPGGMJstAnxPQKRbcIJtcEo4qRqo+UZn96nO
blq4L6A3FvulRTyz2BwjurK6g00NtltiELyGmCJ0uoorrixLJnxeG23DOlFq
mG7poj/2DcDmjuuSHyxp0zycjxH6ppF6m1hcIDvfVpVHxRekMIiHysPK5fl/
KjSVgEs560eUu5HGY3QRS/PaR7ohinHGRpMNn1AMWLRdKC+fV6lrPbmp4A29
S0g0XsAjkY71hAI/zj09nm4Bb1Mp2pH/JvI8xsLg1LjMg5S0w/GlHGFRLFRA
F8IgMSPatLCU3GOa8X0bEIrRjSj0LhRLKGkCc8m+yhQPDfuy3xtjuo5zAVOQ
hiEhQV30ta2FQ39D5skp0xCtNxOduQ6ea2K0vn46Vby9OWTYlLTiOlYzAKfl
fyUH9kULKtrhhVxhfJyW3iZAox4hlRjKsIp9TZiXXoM4rZ0mhWk377Ra/bpV
F57xibyiCAAmD7Tswa+7PpSahuZdBEeu4/KR+cOJJmNtvuXKCvb77AnCtcaH
SG1ybuOKpHlN6QZ/KnvLuYcvVLhKHIwc09Jg0d5ZQWp4nO4OImNheypBR+zR
xdEPxJeW0BBGfiZOdNXDGFoHAXY9IPhB5rnadnlLROwPWAlByCm9uE4HY6Yy
UEEscsh0KsFsnTkA8KidNRZh7sxZvcxGZwwdpRDaACbXTKncYpJP8pUYqnTZ
GtSMRjn1mS5GrjWjRqH3423DPRN4wyf9PDIiYyAfRzBnAbWETZXACF7HQTZt
lu6hse7Au5xVaBXSXw2RnSOFUmmGzzSsMVpDcBf5sgbMJlXNMXtzPuEObSQq
WArBCJMnSgIfhm5Xk6grZUqK+yh5xpwJF9YX+wHEogoiRYVbYQMz5KGgYJgS
LHbE2Si6ROYoURlq//7WbUnHhSJ19RbaVP6jZtfiF3wCki5xPpjMQ659NYVZ
C5uSrAOYQPg291AywawozA9iGBvKkNut2KHMSfRFx02t6vY0jTOCJLH/YF1I
q7L9j7xtx07TPT2J0qX3iDykiAZFkWhTOhUfD/OedAJJN+iTxjhNDKsKZ5Yh
2/aM5NWxp6Fw4iJ9B/yC4y/YThbyyjZfxDRxO34K33tupFHA7sbZiMzhnhtH
VIyZLJFXRQsNpU51thYkQhSCHHJ0hTyjSDpAAx0/yap2U+Tj9qBmmDdzKE9D
AEJC9A5dhhiMlM0a/I0mlpQTQ+KBWl/m5oVC3RBCzIavC0CMBJq6TfGtL+/s
Na47ha1nLseL8OViPerUanBMArJXhJaw9Wd5zG0HdQTwbPtAjvZ141Npoz9g
l1Q25EQuwaQ0DYY7NkjTFA6DUGYCS/S3XHGIrCT1A0H/gJwWvmZGTjmEFLGS
nmNS9anEsXHndswhqmZfCtWCmAwIBYig9M+muKvvqC+Tgb85qowtrNLsWhJc
F3ZXMn8fJ8y2NDwipo/yJFrkeTHItVCv+7BRDb2AZmPSTDWSumKoNEwO9tPo
7q1RkmAgfLLF7e0UubJ2DB2mdmDs4cchRFA5IyTIlZgFyvSM9lHiRgyeF4Hy
nAHygH888wqtQ4fqQf17ZVqYiAZNXVWexgcIF8Y+c6G15BRwIQ+IGqsVtX9g
f4LvSTgdf1kovuy2uBNi8MRp8CTtWvJRTDS9Vkfyic12wA3ecNvLF9T2Mokh
2a6k3DOD+bkELwQ8lDYXVwYKFb832B+sJgo+LIbeuGagbNOSWXSao6dpW6Jh
XWa5e0uMgOvWNEeIWRtyiUKNAiBSDX0nHT25b0QgGmDRBW0O85lyHoZyT0JF
FfzyelOrn5ZzYdsEbr/NJQnfMVYZoJoapOpR5yR2RDjBXFXuUqRxJWGkjIqR
vqLA5lmpw5xesdDEIk45FSxQFCqpZLgQ8l1gpuTNX9VOuaVGrBLttO+RslCo
b3DocxOaDSF2nmXfVO3PxJ5aYL4nlW/yo0PgXIUhH6iJpjJAnK5Y1m7B7Bjq
tqiFAgof+C4B+7jEMKxiw1suzQSwWlLFDtZemFwMGcCKl0u6JqMi4TDShAmi
MQTL2q5dg8MCUyQfcMkmwJMQEQ2BJ2d8xxQOEJRqyvvYgxcTgWt0R1rql/uM
tTfqp6A+XZbjp34IPWiIdbffc7zZCNiCFxEhEM3baoGJk4vA5fqzssH3corE
TGhN0LEG7OM8S0M3jrD2IX+XOYsidM8I2jEYXlK3ztlvLG6FJE+9NyRZ2QB9
fUDMMqDG525mKajKlEYao1hIGT+4HWJrFcnwXhhzW0htXeNiXY5k4xcym2Xa
u4OzRgKLzX1NWvODCAoRiZheMEe2tmn/lw9Rj9iRUJpazSi6TgYrJYJR55hW
0j6xq4DX2aNV586qu6g1bQWE2oVoByv401AiudWpbLOippgK6iJVkblxuaCh
3rP8oXVgbkoJb1EYJWt966wVX1k2OJVJAEa+i7bEvA822+Z0JzXYybWHKRFI
ixGPJZISgrkPd8S1oYFq+p6VugtK/RgYzr9Ig1BLlg+yix+bvQIbogcl7qN1
uo599P6LKHR/XAi1XxPueZ/J0lQjU/GWQvaMn4ZgTJwIyfvsl/ah5weYkEVo
GolplrAHFf/P80KxNxKGymBgByqb5HA35wox9+E094GrjGaI+gaphFPyEhFy
CIBIf0COxQa6Acb8/6fwh2WdL8X7ZTrYoDjG4Vpp/6AUgAmsY9YjUm9+bw45
eM3Z6OdzJvCTcIAABXyXGvsvK+c5tqK+q7GJq8PgQ/0TW4gYfXiQsqcBYXtA
w2ILGC0vNocfXBK9LK2Oixz43kmv0oXjNgxrl0hTp3rcgyah9m/zBoJZjAs2
Jyhy9Fl8ozl8pqtQzWa8UFj2xmtbrJHjtloxgRfSXd+c03ZgF0HAIh5+IE6f
equmZKBcbHEbRFWhVdajekG3vXfBivKILXf+iUNJnl1sORqtXL6IWP3xj3/I
uS4//2xCwHvmKrN7HF4wW0v1VkLhaurR/IHDY2WMFhodKAHHxBwGIkm+kFyK
rDVdkQN5mVxSo/jo+SAxkOE+Km7QCZJkxhs2WNdqsCR9HhtgLqbLE/pv0jgn
uFRow/HV4qkAwShe/TMU/qehGz0VnkrJSNLaGi8VbK/rfSFQ7rRFSOodRvPC
ISGTyIRx9yESYifwuXkV5+xvOjgl5WcUQ0sNTYdJJS4UWJMm3vjp+oDOjjmv
ACkxegqOnU9qv/jyvW1vEnJkQtxU281NzFYu9ZPYmRSyCicSVhpDN1VDR19R
e1d8MFNhBa8S0476dSNHj3CaROg7pMlRs5TB0jMBNgu5OGxeXzlKVqwxWdFw
dz98TLzoAAYJ9l9o/GZb3ihgS407N3EuQgpgZ21x3edMHGw+90RR7YIdSQpo
bE5/wbZj4BcTRCvbFXk+P9kUmHxNE3q3cdcjZ+gf4u8vPzhWANYYhJyaMZEm
F8K0xa+4EY60DTPuegCFR2p9hrV3wnL5ZGP6gGKufqddQDp9MWkhiB0ZQipk
xZ2mRgxjGMol0j3dmBHZZhwRqz8VINkGR9hD2UiCNg2iUAmnlbQfz9J8cVoN
cyxDx+GxsErG0Q+34MYiKNV8XWwJlHQTImQ9SAfCnsNyE4sZDS62I9LyD+I8
kgYwFjoeFDaMwypjHNE5EyY1GneKakIaYeXZm66Ho5asUgWGTdcR6wGLKrRr
dsy34q8yOu2lEjSDzk7p9ILk+4NeEMq0STXPWBkrHTr64afR8VW0ValH9Gka
JSpgllmDENLsh94gvRC7u+O16tHETN/rRR5DqEYISX/MapNqefnqu99zO3v4
RiMVfV6oSN5OMQjos1r81GW6RMhFg+VoBWqEmFPeKNgl78yRje3ZuNWh65rK
kLKYWHvKyRCs0xw5YPaG954qhaV9OJoI6sP6QCiXNQKKCshhLVWZXVIAlmF8
EsKZmbrlI8j6CRZpXLlIp7l4H6zoXrTw9aDAebHRWl4F8Xz82BwrxGQkticd
xnSoJatVJ7NiG2nKjCfRodbw5iQrPN+CWlWgW6N/NSz/DYCyJVcpXWaOaqP6
Irv/hvkVtj8aH7WhfdBQDShNCtuhURZGEzBtBAHYmxa+yilyLHmrvPRD8va+
nE/CF2drRIFN1PeY1KXQTHrPp0FfJnmsHvsgc0ROczREieuR7agwA5cDFxBP
tEpOU6mXjDy5Z3GgqFgxZoOuFBFQHJWUbM35TWNfHw7YcW1VIMp+cDCrWPeM
QNccEpTh8RhiyorJapobnjUcJzdwZycaTKseY8WayQAqah5G2ylpfQloYw0w
+yAcN1A2t9z0nxnj96VqPFgbXchqpRw6uMJMHsX+eDJ0lWB8RJ3QzuUcJNPy
gE5sltcnh9GYDvKVhw2KsDdYM3KEJ81+Uqak77CvKd4imJVNFJoAhVhVde3H
o5y6A4N3mbZPi9QYRUrkOhIHTIUSbPdvy2G8rIw1VJE3WNnB3vFr3rlNNhaB
TfDc/3z9/XdSM/GJWD6AnTWmXkMp1AVFKn2ouLBNtNGZRWfNDCNQxYMkdUdY
5qEpAxSIGwJd3dKhHzjlJ0jQipPKQJ6S0IPmvo49c8eZXwI7I+9lz/UbFPyS
5SybGEx2M4oQe32WcG8q7GrqJRKheShr/4n+5hbo76mXZPzMeY96KSy8cNpX
KCkqbc+Xy+378uwSk1ypJnYVRZv9JYK+VAWV9v9sQimOVg/ZImVidlMPd5OR
YYjgPqSZwcZ4iRyB98uhh1XqU5tYkgnZM3XKJt4Xwj8mTL9YlhLiZy7Ez6go
Rg7KWOWxQyakEOSbH3FV9vFM2jHGZ+a58iBzOPMKPODe75Bn2UigbeNee3/1
SykQiZP4noyDkTzDcbVR9BDEwtNFsgOAOeCVWJvXDLjjA9OYu0vV2ELfngQP
yhMujTJ2tBAX0RzxsoKrGglzS5lqQmPTUH+8t4vb30wAGhGmo8I84EUci4p5
SX2H5mw9T23cgPNvVUS3H8yxPsxgT2dEKKINnr5SjvF4Vj6mKpUnjslfQMPc
tAaTh/m7L6Q4OFOAScGsYANHKYFNuIXLIiQrtiPioYr3KCMWgRGogFcvKPeX
Os1PNOhGZb15tkNVTTjOJp5wNc0bUiY2wQmQR/ZLcxYK/aXDi1MroBxROSat
dAkDN2XdcIdP4gbVY2oB5oHFS4bA0uSuXz5nAYmuLjaRGBiwZmokyu5Kgx44
YhHyc5FV2LIRO+eMGbdAYKh7YeVnSHJPoBtBFqnCmJOjIWHI1sgKaR32DWFO
ianAdf6qQnCHCuotDOotsYt/jScJrcJRu3AHOsANnUelU2LNfpucUsd+Fw5t
pg7BmrdeYTodCiRdCM0hF2IedC9oR2/qv2ByRiJajJFMcjCf2Iz07DKejqZh
8m7PxospkI1L5T2TuIT0qrYLAcV8aF/9KlY8o6XFUCz2DP+Ee+HIXhJSPMNs
3Ce0ZR7whOgsTzb+NI9pG90+7YhM4sOcFMMAs8fCIwznwgFLFA3nu5OyN60S
7Bmf+jDLVpaaTYMv7EIFvi3DpEs5s5jpy1MuQTK4lCgz633Ks8msfN06Q5AO
dNGcCT9yRU3Jxy1gARumbYhOpc7HvUdBd8nDk+bGe4le0SRzyi478y5kF0LO
5Bf3y17Nyq0NMTQ5X/ODTiVODuilW0j+KIT1F44Nx7p0OcnsVZpdc+5JrMI0
Hd0eKLfjfmCxQ4ltDBfYVoGhbo4HDIYpY2BYWomeprx0lld+bqPtdMonsXK9
rfBUw7DuvJ73snCQO2x6eIAnT+/Ebx/6QEjpZjj1oqLIg/sAgq49by4/Zs1S
KN1DBb7Lh/eCiyiHVaUUcFs9ZOp9l1Li+24QTJHPk2/vavBWYwMJmFXhYKNf
gk0LbLtxfM4z2BnY2NS5p6YhoB155AF3eIvd7BZIhGoPnaRUqOKJaHeVHPpa
7OUZxLIPbWOUjCj9JsxdYyj7yIYAACJF3E+TpMbQkSZHCXb1r8qMOUfJ5q+/
xkPoPxHUeaBiQTxtF4tZVvkpg8sJ+ZhIHkLeKOQpWaYP1MUz9s9gfEBxgMCY
NztoE9aD24MVZsEknaBzRQFW38C8CIShUFO1sAXmAHcLymKP/joNRLeI2RG6
PywNFxwu/xZsnjgpT/Xb2OACj4vg5ZW/ylHAcaEs6wbBUjxWmYcgFGyXbPpV
IOxH1lg0g0o2wu46mDuiYn3YxmAvY19GOV9BmexGDWjhXuYoBDVDRluPNNaz
qTgzKnru+as3z6TIDvQu8fxelpiPQ7ph1nILlwyzJ4SKe8cHHifH09G5C1jr
e+l9yWtZPDsKA/QKFeQsZXYBtQYjFOx2oR4j9rrT5qnSgYI6rP8k3YZEqG8A
MYC+o21J5auY4MK2fVYPsOGIZ4dEU7szl9d6OfXcBbvEfjsRTtKt8Hze6Akm
se3uG6qJY7CsM6wFrNjnAb6JbZhBvCW0epww3oZq+9B7rraMlRWSKCnPgSwg
JdBRG9OSYSfWQc/ogp9x71ZyotHsKJ75nkPdMkR+hmPKu05XxeV4no/p1NoR
VuFc7C49OlDFrjEpiLte6lkfUlfcRQHNGw5PG8hrw3lj3VyeeHEfheIqFFSq
7f2TZHTyfg9ctax77QJLSfwDOko1PTjrQTbUvefmqRpnDJhNm31LWJUpuZpz
Etfsyt3clvDvZ5/Sm7/smvPjzz/9kkzK86ewfV+GoMmv2Cx88flvwCyoc/7B
F2OHW7z2E+fMffj4sIWEv9qjwfCI6MfwRKnD48bPgUwTxnDE3AvWUSXlARw8
DuOzjW1GQBBHCq8RXzNZDMOOScoXStMINTutjqtXTOzCVCbn5RvPpRVFAATf
Cy2ay21r++dgnnn+0hM3Jc8y9USPTlnIlMpYCvyMkZEdipukZLuvQdOTdC8u
NJcthrAB4kRpRnpgt32MYp+VcPA+wzxRKOXYuG8eOGzVnpBtJ2S1xKECTeIk
AnTwIbAaQsjxdLGk+xtTBYigF6jLwaNOe8m9mT0zzGF4ihWOtMtcKsku2Tu2
q390C2LzNT5eAwPGyjNPOhDH2HlaqhSLilIHblZgolXvWG1EuliTmJaCPHbm
MMyF0/BmTCQserjYC5QoulxyESrJQ59hS0GTgxQkX81AjoMUv+CwG8MhY0Wc
cHD+qBycREkFpzvP3tLTl/eGCQKhHPfIrLTVoxwmCVByh2E0rfNWiY1jlSyb
LidFAiwLPFvW0rBMif0fqGO8ynU/O72SvTxePvW1Su4+F8MzQWWF5MJNEvlY
2hnaF2RgvD7WfcgCUaQ1hKeTO62cVZ5JWeEFau3z0bSLygsqQ2aiDnE3tp5L
/mGLLgrX4Rqa5gJ/eFZwku06gqtBM6Sx+3IHgPtY7xyfB2DKsmLnfnJWA0Qt
uekBVT1y+XVC1Ae/+w4pjB5uV8SmVTHys0SyS0jOwR5df3edLSwNLxyhkO0P
lG/eICQpdPlufnlZoBfKrbv0Rjl1c4F4yDzBdawdVs9DKOdqyZkL6mykRM6R
XxqQ2UlpCdrCiW/ormj6GFxh1HfsTZFLKadTdj0sD5Hc7Ogcf7+vvS2GwEOL
UQ8W17woWDC1Q27cDllttEL1kBxbxRHqMR4Ly/kC3/KpIN3SsOt2ftmsJy7W
93rClyywIgubJHee1IMp2QuTzdJNkaBYIVAs0bclwqp4ey5qD79ixrxidEZl
VumNbLJzoKbWblRXRArV2E5kVm1DLSWH6Xikw7OspA6Aq7yy6ZAY2TQ4wUnv
JQuT3UNt2U7pwc4rtfaroD8DVHTWer7/wISlEp4Sj0VD7we8wKk619Ie3R8n
ZVIQ4LGnKZuui1kME+9lt/DiacoPnN2rnBvJWSG3QKMkll0PynaxZDlxnDL2
4hu88w3lgr6h4iBsqlupwvn0888+2Gt4WpGXuwYFCIjmCWDZESDSa5hPzpRG
cPerp9WT19efqPZOu6WUFZ8rjFGbvqeTFRHfufJQIg0Qt5c52CBoO6wAwGt1
F1OrR9niYJ/CYSVdi+Uf4k+lGAR1V0beIz0rZAqrIoj5SHoh6bxBKLsmOoiL
BGImQhDTLy+YDQog78Og3VPiIYyz9iusbWEcNBhuqkohKG1Z9Ujb0+GhPY+o
Frzs66HTdqeSAiQAuvXUFjy5hAJjKJAgc4+0W468uM2SyamkmvlMzpLlef7B
dNz+hrjQqKsdnrO6wIR/qH6FJIcWOuFU0zn3fGRrw4bj0oGYoWkN8Ugsi1lI
OwTdgmuDRRIobk+rz7788vFv2P2Jh+yR+0bGZ7gqHt3QKbmUUEdistMzrIof
//L1j3/98S+vf/zrN8W/8W+vin/Vj9/++Nfrj7EyAamlkf0WzhVQhl214uQi
94HnI3nDTfl+fKtH0l+soegn+XDhPNrBhQkaKPxE8qx5FE7f6pZllCo9kSgl
rOQ9OugNodkeQ4iSyaHWG0nzwBfMiVbl2YPHT3FZ5UGHNVy72SnBQlJFCKNH
cOC5SNi9w6Tz1iZ7XhItCUP5uOse6GscD6+0iUsc4YvQE9I5FjXSfcTHihWG
r7GzYN/HiSr4qFdeMdp9KI98lrozLZ1i0zI66HoR84dDnWZP0QNl89wkbNtd
AwoeZvZRdPTiwwbZNW/9mftuJAe25IN4R4Iu4aevvvriaww/FS+oSEM6C7KW
WSK5CRucQ2C0VbgP2CLURAaqOZiZuKuuNE1ys52bHkHGaMpiKJ4WYphREbwP
fYpoOOlxTXblFyY/klk4cB9T44mebsEcYMcE7UrMxXSEzzEO6/j8xWA2LnUw
0UKN5YzoLATpTRfThTzew1GwldMcyC8GRStzXqsU1uFuCx4SIRhMefc0lmwH
hjK1rHES9xLdUaMRhnQE98yJWivbXGmVpvsM+qPY+EPBZwFaGZ+N4iELJ22Z
XrgryyyFRf6T17DN0AUvWMtJk5bo2ZlVSRyGPV2Xrd4/V8QrDWDMkYYYXyAA
xFg/9fsWzt1CNINs8xiuwzYgejoeKjZ6W260XzwYrGKXvTmbYvYlKu68i/vF
im1TFnMvc49OBB8yshhpTxyRFTvsId7sJIiaVASH4wViFzEt4COZTdgvOoEu
RP3VjcyLPWS4YKbumZM0l0j3i6B/8SD0dxb6P28lWDCE0K1p1ata5yH2hZ7R
VbYOz8/juMKwoyewt28mMFKRZ4BZ663QIZSaL0QO0UOTWWETunCmCvdn4JQ+
dvHUtHNJZyPavF/QUfHERaEjZk227znJiW5b3RJzy4VUFKGVQP1bWhJSFKdI
s1YvUE8AyI5K115tuFxdVZ5DoGs/oW1ny/FAmM9OZoy7LZSZhjptxGXVfIUz
a8KBPI1XhKxZe05bt/NLAuYaufZ5pBbOJHvdjOPJL7MQ1spfBGFk2/E3hZyG
167X64I5Hr/9F/jxo+I65Fn5TJJ/XPGB7L76t0d7UEv+0c/Fev079/8AhxEO
kAuoAAA=

-->

</rfc>
