<?xml version="1.0" encoding="US-ASCII"?>
<grammar xmlns="http://elixir.parserbuilder.com/v1.1.0">
  <!-- Testing -->
  <rule id="test_conversation1">
    <oneOf>
      <item>
        <tag name="xx_partial">
          <literal value="partial"/>
        </tag>
      </item>
      <item>
        <tag name="xx_final">
          <literal value="final"/>
        </tag>
      </item>
    </oneOf>
  </rule>
  <!-- Testing -->
  <!-- Convenience -->
  <rule id="conversation">
    <oneOf>
      <item>
        <tag name="xx_partial">
          <untagAndFlatten>
            <ruleRef uri="continue"/>
          </untagAndFlatten>
        </tag>
      </item>
      <item>
        <tag name="xx_final">
          <ruleRef uri="response"/>
        </tag>
      </item>
    </oneOf>
  </rule>
  <rule id="greeting" postprocess="tag">
    <ruleRef uri="rfc3501_greeting"/>
  </rule>
  <rule id="response">
    <ruleRef uri="rfc3501_response-only"/>
  </rule>
  <rule id="continue">
    <ruleRef uri="rfc3501_continue-req"/>
  </rule>
  <!-- Convenience -->
  <!-- RFC 3501 -->
  <rule id="rfc3501_address">
    <tag name="xx_key_value_map">
      <ignore>
        <literal value="("/>
      </ignore>
      <ruleRef uri="rfc3501_addr-name"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_addr-adl"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_addr-mailbox"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_addr-host"/>
      <ignore>
        <literal value=")"/>
      </ignore>
    </tag>
  </rule>
  <rule id="rfc3501_addr-adl">
    <tag name="adl">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_addr-host">
    <tag name="host">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_addr-mailbox">
    <tag name="mailbox">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_addr-name">
    <tag name="name">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_append" postprocess="tag">
    <ignore>
      <literal value="APPEND"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
    <optional>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_flag-list"/>
    </optional>
    <optional>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_date-time"/>
    </optional>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_literal"/>
  </rule>
  <rule id="rfc3501_astring">
    <untagAndFlatten>
      <oneOf>
        <item>
          <manyOne>
            <ruleRef uri="rfc3501_ASTRING-CHAR"/>
          </manyOne>
        </item>
        <item>
          <ruleRef uri="rfc3501_string"/>
        </item>
      </oneOf>
    </untagAndFlatten>
  </rule>
  <rule id="rfc3501_ASTRING-CHAR">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_ATOM-CHAR"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_resp-specials"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_atom">
    <untagAndFlatten>
      <manyOne>
        <ruleRef uri="rfc3501_ATOM-CHAR"/>
      </manyOne>
    </untagAndFlatten>
  </rule>
  <rule id="rfc3501_ATOM-CHAR">
    <!--any CHAR except atom-specials-->
    <oneOf>
      <item>
        <hexValue value="21"/>
      </item>
      <item>
        <hexRange start="23" end="24"/>
      </item>
      <item>
        <hexRange start="26" end="27"/>
      </item>
      <item>
        <hexRange start="2B" end="5B"/>
      </item>
      <item>
        <hexRange start="5E" end="7A"/>
      </item>
      <item>
        <hexRange start="7C" end="7E"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_atom-specials">
    <oneOf>
      <item>
        <literal value="("/>
      </item>
      <item>
        <literal value=")"/>
      </item>
      <item>
        <literal value="{"/>
      </item>
      <item>
        <ruleRef uri="SP"/>
      </item>
      <item>
        <ruleRef uri="CTL"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_list-wildcards"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_quoted-specials"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_resp-specials"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_authenticate" postprocess="tag">
    <ignore>
      <literal value="AUTHENTICATE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_auth-type"/>
    <many>
      <ruleRef uri="CRLF"/>
      <ruleRef uri="rfc3501_base64"/>
    </many>
  </rule>
  <rule id="rfc3501_auth-type" postprocess="tag">
    <ruleRef uri="rfc3501_atom"/>
  </rule>
  <rule id="rfc3501_base64" postprocess="tag">
    <many>
      <exactly count="4">
        <ruleRef uri="rfc3501_base64-char"/>
      </exactly>
    </many>
    <optional>
      <ruleRef uri="rfc3501_base64-terminal"/>
    </optional>
  </rule>
  <rule id="rfc3501_base64-char" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="ALPHA"/>
      </item>
      <item>
        <ruleRef uri="DIGIT"/>
      </item>
      <item>
        <literal value="+"/>
      </item>
      <item>
        <literal value="/"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_base64-terminal" postprocess="tag">
    <oneOf>
      <item>
        <exactly count="2">
          <ruleRef uri="rfc3501_base64-char"/>
        </exactly>
        <literal value="=="/>
      </item>
      <item>
        <exactly count="3">
          <ruleRef uri="rfc3501_base64-char"/>
        </exactly>
        <literal value="="/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_body">
    <ignore>
      <literal value="("/>
    </ignore>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_body-type-1part"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_body-type-mpart"/>
      </item>
    </oneOf>
    <ignore>
      <literal value=")"/>
    </ignore>
  </rule>
  <rule id="rfc3501_body-extension" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_nstring"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_number"/>
      </item>
      <item>
        <ignore>
          <literal value="("/>
        </ignore>
        <ruleRef uri="rfc3501_body-extension"/>
        <many>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_body-extension"/>
        </many>
        <ignore>
          <literal value=")"/>
        </ignore>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_body-ext-1part" postprocess="tag">
    <ruleRef uri="rfc3501_body-fld-md5"/>
    <optional>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-fld-dsp"/>
      <optional>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_body-fld-lang"/>
        <optional>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_body-fld-loc"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_body-extension"/>
          </many>
        </optional>
      </optional>
    </optional>
  </rule>
  <rule id="rfc3501_body-ext-mpart" postprocess="tag">
    <ruleRef uri="rfc3501_body-fld-param"/>
    <optional>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-fld-dsp"/>
      <optional>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_body-fld-lang"/>
        <optional>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_body-fld-loc"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_body-extension"/>
          </many>
        </optional>
      </optional>
    </optional>
  </rule>
  <rule id="rfc3501_body-fields">
    <ruleRef uri="rfc3501_body-fld-param"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_body-fld-id"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_body-fld-desc"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_body-fld-enc"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_body-fld-octets"/>
  </rule>
  <rule id="rfc3501_body-fld-desc">
    <tag name="desc">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-dsp">
    <tag name="dsp">
      <oneOf>
        <item>
          <ignore>
            <literal value="("/>
          </ignore>
          <ruleRef uri="rfc3501_string"/>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_body-fld-param"/>
          <ignore>
            <literal value=")"/>
          </ignore>
        </item>
        <item>
          <ruleRef uri="rfc3501_nil"/>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-enc">
    <tag name="enc">
      <oneOf>
        <item>
          <ruleRef uri="DQUOTE"/>
          <oneOf>
            <item>
              <literal value="7BIT"/>
            </item>
            <item>
              <literal value="8BIT"/>
            </item>
            <item>
              <literal value="BINARY"/>
            </item>
            <item>
              <literal value="BASE64"/>
            </item>
            <item>
              <literal value="QUOTED-PRINTABLE"/>
            </item>
          </oneOf>
          <ruleRef uri="DQUOTE"/>
        </item>
        <item>
          <ruleRef uri="rfc3501_string"/>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-id">
    <tag name="id">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-lang">
    <tag name="lang">
      <oneOf>
        <item>
          <ruleRef uri="rfc3501_nstring"/>
        </item>
        <item>
          <ignore>
            <literal value="("/>
          </ignore>
          <ruleRef uri="rfc3501_string"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_string"/>
          </many>
          <ignore>
            <literal value=")"/>
          </ignore>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-loc">
    <tag name="loc">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-lines">
    <tag name="lines">
      <ruleRef uri="rfc3501_number"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-md5">
    <tag name="md5">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-octets">
    <tag name="octets">
      <ruleRef uri="rfc3501_number"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-fld-param">
    <tag name="param">
      <oneOf>
        <item>
          <ignore>
            <literal value="("/>
          </ignore>
          <ruleRef uri="rfc3501_key_value_pair"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_key_value_pair"/>
          </many>
          <ignore>
            <literal value=")"/>
          </ignore>
        </item>
        <item>
          <ruleRef uri="rfc3501_nil"/>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_body-type-1part">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_body-type-basic"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_body-type-msg"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_body-type-text"/>
      </item>
    </oneOf>
    <optional>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-ext-1part"/>
    </optional>
  </rule>
  <rule id="rfc3501_body-type-basic">
    <tag name="xx_key_value_map">
      <ruleRef uri="rfc3501_media-basic"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-fields"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-type-mpart">
    <tag name="xx_key_value_map">
      <tag name="parts">
        <manyOne>
          <ruleRef uri="rfc3501_body"/>
        </manyOne>
      </tag>
      <ruleRef uri="SP"/>
      <tag name="media-subtype">
        <ruleRef uri="rfc3501_media-subtype"/>
      </tag>
      <optional>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_body-ext-mpart"/>
      </optional>
    </tag>
  </rule>
  <rule id="rfc3501_body-type-msg">
    <tag name="xx_key_value_map">
      <ruleRef uri="rfc3501_media-message"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-fields"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_envelope"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-fld-lines"/>
    </tag>
  </rule>
  <rule id="rfc3501_body-type-text">
    <tag name="xx_key_value_map">
      <ruleRef uri="rfc3501_media-text"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-fields"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_body-fld-lines"/>
    </tag>
  </rule>
  <rule id="rfc3501_capability">
    <oneOf>
      <item>
        <tag name="auth-type">
          <ignore>
            <literal value="AUTH="/>
          </ignore>
          <untagAndFlatten>
            <ruleRef uri="rfc3501_auth-type"/>
          </untagAndFlatten>
        </tag>
      </item>
      <item>
        <tag name="capability">
          <ruleRef uri="rfc3501_atom"/>
        </tag>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_capability-data">
    <tag name="capabilities">
      <tag name="xx_key_value_map">
        <ignore>
          <literal value="CAPABILITY"/>
        </ignore>
        <many>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_capability"/>
        </many>
        <ruleRef uri="SP"/>
        <ignore>
          <literal value="IMAP4rev1"/>
        </ignore>
        <many>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_capability"/>
        </many>
      </tag>
    </tag>
  </rule>
  <rule id="rfc3501_CHAR8" postprocess="tag">
    <hexRange start="01" end="ff"/>
  </rule>
  <rule id="rfc3501_command" postprocess="tag">
    <ruleRef uri="rfc3501_tag"/>
    <ruleRef uri="SP"/>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_command-any"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_command-auth"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_command-nonauth"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_command-select"/>
      </item>
    </oneOf>
    <ruleRef uri="CRLF"/>
  </rule>
  <rule id="rfc3501_command-any" postprocess="tag">
    <oneOf>
      <item>
        <ignore>
          <literal value="CAPABILITY"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="LOGOUT"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="NOOP"/>
        </ignore>
      </item>
      <item>
        <ruleRef uri="rfc3501_x-command"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_command-auth" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_append"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_create"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_delete"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_examine"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_list"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_lsub"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_rename"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_select"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_status"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_subscribe"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_unsubscribe"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_command-nonauth" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_login"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_authenticate"/>
      </item>
      <item>
        <ignore>
          <literal value="STARTTLS"/>
        </ignore>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_command-select" postprocess="tag">
    <oneOf>
      <item>
        <ignore>
          <literal value="CHECK"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="CLOSE"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="EXPUNGE"/>
        </ignore>
      </item>
      <item>
        <ruleRef uri="rfc3501_copy"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_fetch"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_store"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_uid"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_search"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_continue-req" postprocess="tag">
    <ignore>
      <literal value="+"/>
    </ignore>
    <ruleRef uri="SP"/>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_resp-text"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_base64"/>
      </item>
    </oneOf>
    <ruleRef uri="CRLF"/>
  </rule>
  <rule id="rfc3501_copy" postprocess="tag">
    <ignore>
      <literal value="COPY"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_sequence-set"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="rfc3501_create" postprocess="tag">
    <ignore>
      <literal value="CREATE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="rfc3501_date" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_date-text"/>
      </item>
      <item>
        <ruleRef uri="DQUOTE"/>
        <ruleRef uri="rfc3501_date-text"/>
        <ruleRef uri="DQUOTE"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_date-day" postprocess="tag">
    <repeat min="1" max="2">
      <ruleRef uri="DIGIT"/>
    </repeat>
  </rule>
  <rule id="rfc3501_date-day-fixed">
    <tag name="xx_number">
      <untagAndFlatten>
        <oneOf>
          <item>
            <ruleRef uri="SP"/>
            <ruleRef uri="DIGIT"/>
          </item>
          <item>
            <exactly count="2">
              <ruleRef uri="DIGIT"/>
            </exactly>
          </item>
        </oneOf>
      </untagAndFlatten>
    </tag>
  </rule>
  <rule id="rfc3501_date-month" postprocess="tag">
    <oneOf>
      <item>
        <literal value="Jan"/>
      </item>
      <item>
        <literal value="Feb"/>
      </item>
      <item>
        <literal value="Mar"/>
      </item>
      <item>
        <literal value="Apr"/>
      </item>
      <item>
        <literal value="May"/>
      </item>
      <item>
        <literal value="Jun"/>
      </item>
      <item>
        <literal value="Jul"/>
      </item>
      <item>
        <literal value="Aug"/>
      </item>
      <item>
        <literal value="Sep"/>
      </item>
      <item>
        <literal value="Oct"/>
      </item>
      <item>
        <literal value="Nov"/>
      </item>
      <item>
        <literal value="Dec"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_date-text" postprocess="tag">
    <ruleRef uri="rfc3501_date-day"/>
    <ignore>
      <literal value="-"/>
    </ignore>
    <ruleRef uri="rfc3501_date-month"/>
    <ignore>
      <literal value="-"/>
    </ignore>
    <ruleRef uri="rfc3501_date-year"/>
  </rule>
  <rule id="rfc3501_date-year">
    <tag name="xx_number">
      <untagAndFlatten>
        <exactly count="4">
          <ruleRef uri="DIGIT"/>
        </exactly>
      </untagAndFlatten>
    </tag>
  </rule>
  <rule id="rfc3501_date-time" postprocess="tag">
    <ruleRef uri="DQUOTE"/>
    <ruleRef uri="rfc3501_date-day-fixed"/>
    <ignore>
      <literal value="-"/>
    </ignore>
    <ruleRef uri="rfc3501_date-month"/>
    <ignore>
      <literal value="-"/>
    </ignore>
    <ruleRef uri="rfc3501_date-year"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_time"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_zone"/>
  </rule>
  <rule id="rfc3501_delete" postprocess="tag">
    <ignore>
      <literal value="DELETE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="DIGIT-nz" postprocess="tag">
    <hexRange start="31" end="39"/>
  </rule>
  <rule id="rfc3501_envelope">
    <ignore>
      <literal value="("/>
    </ignore>
    <ruleRef uri="rfc3501_env-date"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-subject"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-from"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-sender"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-reply-to"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-to"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-cc"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-bcc"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-in-reply-to"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_env-message-id"/>
    <ignore>
      <literal value=")"/>
    </ignore>
  </rule>
  <rule id="rfc3501_env-bcc">
    <tag name="bcc">
      <ruleRef uri="rfc3501_env-addresses"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-cc">
    <tag name="cc">
      <ruleRef uri="rfc3501_env-addresses"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-date">
    <tag name="date">
      <oneOf>
        <item>
          <ruleRef uri="DQUOTE"/>
          <ruleRef uri="aux_env-date"/>
          <ruleRef uri="DQUOTE"/>
        </item>
        <item>
          <ruleRef uri="rfc3501_nstring"/>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_env-from">
    <tag name="from">
      <ruleRef uri="rfc3501_env-addresses"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-in-reply-to">
    <tag name="in-reply-to">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-message-id">
    <tag name="message-id">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-reply-to">
    <tag name="reply-to">
      <ruleRef uri="rfc3501_env-addresses"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-sender">
    <tag name="sender">
      <ruleRef uri="rfc3501_env-addresses"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-subject">
    <tag name="subject">
      <ruleRef uri="rfc3501_nstring"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-to">
    <tag name="to">
      <ruleRef uri="rfc3501_env-addresses"/>
    </tag>
  </rule>
  <rule id="rfc3501_examine" postprocess="tag">
    <ignore>
      <literal value="EXAMINE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="rfc3501_fetch" postprocess="tag">
    <ignore>
      <literal value="FETCH"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_sequence-set"/>
    <ruleRef uri="SP"/>
    <oneOf>
      <item>
        <ignore>
          <literal value="ALL"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="FULL"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="FAST"/>
        </ignore>
      </item>
      <item>
        <ruleRef uri="rfc3501_fetch-att"/>
      </item>
      <item>
        <ignore>
          <literal value="("/>
        </ignore>
        <ruleRef uri="rfc3501_fetch-att"/>
        <many>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_fetch-att"/>
        </many>
        <ignore>
          <literal value=")"/>
        </ignore>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_fetch-att" postprocess="tag">
    <oneOf>
      <item>
        <ignore>
          <literal value="ENVELOPE"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="FLAGS"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="INTERNALDATE"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="RFC822"/>
        </ignore>
        <optional>
          <oneOf>
            <item>
              <ignore>
                <literal value=".HEADER"/>
              </ignore>
            </item>
            <item>
              <ignore>
                <literal value=".SIZE"/>
              </ignore>
            </item>
            <item>
              <ignore>
                <literal value=".TEXT"/>
              </ignore>
            </item>
          </oneOf>
        </optional>
      </item>
      <item>
        <ignore>
          <literal value="BODY"/>
        </ignore>
        <optional>
          <ignore>
            <literal value="STRUCTURE"/>
          </ignore>
        </optional>
      </item>
      <item>
        <ignore>
          <literal value="UID"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="BODY"/>
        </ignore>
        <ruleRef uri="rfc3501_section"/>
        <optional>
          <ignore>
            <literal value="&lt;"/>
          </ignore>
          <ruleRef uri="rfc3501_number"/>
          <literal value="."/>
          <ruleRef uri="rfc3501_nz-number"/>
          <ignore>
            <literal value="&gt;"/>
          </ignore>
        </optional>
      </item>
      <item>
        <ignore>
          <literal value="BODY.PEEK"/>
        </ignore>
        <ruleRef uri="rfc3501_section"/>
        <optional>
          <ignore>
            <literal value="&lt;"/>
          </ignore>
          <ruleRef uri="rfc3501_number"/>
          <literal value="."/>
          <ruleRef uri="rfc3501_nz-number"/>
          <ignore>
            <literal value="&gt;"/>
          </ignore>
        </optional>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_flag">
    <oneOf>
      <item>
        <replace value="Answered">
          <literal value="\Answered"/>
        </replace>
      </item>
      <item>
        <replace value="Flagged">
          <literal value="\Flagged"/>
        </replace>
      </item>
      <item>
        <replace value="Deleted">
          <literal value="\Deleted"/>
        </replace>
      </item>
      <item>
        <replace value="Seen">
          <literal value="\Seen"/>
        </replace>
      </item>
      <item>
        <replace value="Draft">
          <literal value="\Draft"/>
        </replace>
      </item>
      <item>
        <ruleRef uri="rfc3501_flag-keyword"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_flag-extension"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_flag-extension" postprocess="tag">
    <ruleRef uri="rfc3501_flag-extension-tagless"/>
  </rule>
  <rule id="rfc3501_flag-fetch" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_flag"/>
      </item>
      <item>
        <replace value="Recent">
          <literal value="\Recent"/>
        </replace>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_flag-keyword">
    <ruleRef uri="rfc3501_atom"/>
  </rule>
  <rule id="rfc3501_flag-list">
    <tag name="flags">
      <ignore>
        <literal value="("/>
      </ignore>
      <optional>
        <ruleRef uri="rfc3501_flag"/>
        <many>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_flag"/>
        </many>
      </optional>
      <ignore>
        <literal value=")"/>
      </ignore>
    </tag>
  </rule>
  <rule id="rfc3501_flag-perm" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_flag"/>
      </item>
      <item>
        <literal value="\*"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_greeting" postprocess="tag">
    <ignore>
      <literal value="*"/>
    </ignore>
    <ruleRef uri="SP"/>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_resp-cond-auth-prefix"/>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_resp-text-tagless"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_resp-cond-bye"/>
      </item>
    </oneOf>
    <ruleRef uri="CRLF"/>
  </rule>
  <rule id="rfc3501_header-fld-name" postprocess="tag">
    <ruleRef uri="rfc3501_astring"/>
  </rule>
  <rule id="rfc3501_header-list" postprocess="tag">
    <ignore>
      <literal value="("/>
    </ignore>
    <ruleRef uri="rfc3501_header-fld-name"/>
    <many>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_header-fld-name"/>
    </many>
    <ignore>
      <literal value=")"/>
    </ignore>
  </rule>
  <rule id="rfc3501_list" postprocess="tag">
    <ignore>
      <literal value="LIST"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_list-mailbox"/>
  </rule>
  <rule id="rfc3501_list-mailbox" postprocess="tag">
    <oneOf>
      <item>
        <manyOne>
          <ruleRef uri="rfc3501_list-char"/>
        </manyOne>
      </item>
      <item>
        <ruleRef uri="rfc3501_string"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_list-char" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_ATOM-CHAR"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_list-wildcards"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_resp-specials"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_list-wildcards" postprocess="tag">
    <oneOf>
      <item>
        <ignore>
          <literal value="%"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="*"/>
        </ignore>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_literal" postprocess="tag">
    <untagAndFlatten>
      <exactlyPi>
        <count>
          <ignore>
            <literal value="{"/>
          </ignore>
          <untagAndFlatten>
            <ruleRef uri="rfc3501_number"/>
          </untagAndFlatten>
          <ignore>
            <literal value="}"/>
            <ruleRef uri="CRLF"/>
          </ignore>
        </count>
        <applyTo>
          <untagAndFlatten>
            <ruleRef uri="rfc3501_CHAR8"/>
          </untagAndFlatten>
        </applyTo>
      </exactlyPi>
    </untagAndFlatten>
  </rule>
  <rule id="rfc3501_login" postprocess="tag">
    <ignore>
      <literal value="LOGIN"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_userid"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_password"/>
  </rule>
  <rule id="rfc3501_lsub" postprocess="tag">
    <ignore>
      <literal value="LSUB"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_list-mailbox"/>
  </rule>
  <rule id="rfc3501_mailbox">
    <tag name="mailbox">
      <oneOf>
        <item>
          <replace value="INBOX">
            <literal value="INBOX"/>
          </replace>
        </item>
        <item>
          <ruleRef uri="rfc3501_astring"/>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_mailbox-data">
    <oneOf>
      <item>
        <ignore>
          <literal value="FLAGS"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_flag-list"/>
      </item>
      <item>
        <ignore>
          <literal value="LIST"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_mailbox-list"/>
      </item>
      <item>
        <ignore>
          <literal value="LSUB"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_mailbox-list"/>
      </item>
      <item>
        <tag name="search">
          <ignore>
            <literal value="SEARCH"/>
          </ignore>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_nz-number"/>
          </many>
        </tag>
      </item>
      <item>
        <tag name="status">
          <tag name="xx_key_value_map">
            <ignore>
              <literal value="STATUS"/>
            </ignore>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_mailbox"/>
            <ruleRef uri="SP"/>
            <ignore>
              <literal value="("/>
            </ignore>
            <optional>
              <ruleRef uri="rfc3501_status-att-list"/>
            </optional>
            <ignore>
              <literal value=")"/>
            </ignore>
          </tag>
        </tag>
      </item>
      <item>
        <tag name="exists">
          <ruleRef uri="rfc3501_number"/>
          <ruleRef uri="SP"/>
          <ignore>
            <literal value="EXISTS"/>
          </ignore>
        </tag>
      </item>
      <item>
        <tag name="recent">
          <ruleRef uri="rfc3501_number"/>
          <ruleRef uri="SP"/>
          <ignore>
            <literal value="RECENT"/>
          </ignore>
        </tag>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_mailbox-list">
    <tag name="xx_key_value_map">
      <ignore>
        <literal value="("/>
      </ignore>
      <optional>
        <ruleRef uri="rfc3501_mbx-list-flags"/>
      </optional>
      <ignore>
        <literal value=")"/>
      </ignore>
      <ruleRef uri="SP"/>
      <tag name="info">
        <oneOf>
          <item>
            <ruleRef uri="DQUOTE"/>
            <ignore>
              <ruleRef uri="rfc3501_QUOTED-CHAR"/>
            </ignore>
            <ruleRef uri="DQUOTE"/>
          </item>
          <item>
            <ruleRef uri="rfc3501_nil"/>
          </item>
        </oneOf>
      </tag>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_mailbox"/>
    </tag>
  </rule>
  <rule id="rfc3501_mbx-list-flags">
    <tag name="flags">
      <oneOf>
        <item>
          <many>
            <ruleRef uri="rfc3501_mbx-list-oflag"/>
            <ruleRef uri="SP"/>
          </many>
          <ruleRef uri="rfc3501_mbx-list-sflag"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_mbx-list-oflag"/>
          </many>
        </item>
        <item>
          <ruleRef uri="rfc3501_mbx-list-oflag"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_mbx-list-oflag"/>
          </many>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_mbx-list-oflag">
    <oneOf>
      <item>
        <replace value="Noinferiors">
          <literal value="\Noinferiors"/>
        </replace>
      </item>
      <item>
        <ruleRef uri="rfc3501_flag-extension-tagless"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_mbx-list-sflag">
    <oneOf>
      <item>
        <replace value="Noselect">
          <literal value="\Noselect"/>
        </replace>
      </item>
      <item>
        <replace value="Marked">
          <literal value="\Marked"/>
        </replace>
      </item>
      <item>
        <replace value="Unmarked">
          <literal value="\Unmarked"/>
        </replace>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_media-basic" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="DQUOTE"/>
        <oneOf>
          <item>
            <replace value="APPLICATION">
              <literal value="APPLICATION"/>
            </replace>
          </item>
          <item>
            <replace value="AUDIO">
              <literal value="AUDIO"/>
            </replace>
          </item>
          <item>
            <replace value="IMAGE">
              <literal value="IMAGE"/>
            </replace>
          </item>
          <item>
            <replace value="MESSAGE">
              <literal value="MESSAGE"/>
            </replace>
          </item>
          <item>
            <replace value="VIDEO">
              <literal value="VIDEO"/>
            </replace>
          </item>
        </oneOf>
        <ruleRef uri="DQUOTE"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_string"/>
      </item>
    </oneOf>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_media-subtype"/>
  </rule>
  <rule id="rfc3501_media-message" postprocess="tag">
    <ruleRef uri="DQUOTE"/>
    <replace value="MESSAGE">
      <literal value="MESSAGE"/>
    </replace>
    <ruleRef uri="DQUOTE"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="DQUOTE"/>
    <replace value="RFC822">
      <literal value="RFC822"/>
    </replace>
    <ruleRef uri="DQUOTE"/>
  </rule>
  <rule id="rfc3501_media-subtype">
    <ruleRef uri="rfc3501_string"/>
  </rule>
  <rule id="rfc3501_media-text">
    <tag name="text">
      <ruleRef uri="DQUOTE"/>
      <ignore>
        <literal value="TEXT"/>
      </ignore>
      <ruleRef uri="DQUOTE"/>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_media-subtype"/>
    </tag>
  </rule>
  <rule id="rfc3501_message-data">
    <tag name="xx_key_value_map">
      <tag name="message-number">
        <ruleRef uri="rfc3501_nz-number"/>
      </tag>
      <ruleRef uri="SP"/>
      <oneOf>
        <item>
          <tag name="action">
            <replace value="EXPUNGE">
              <literal value="EXPUNGE"/>
            </replace>
          </tag>
        </item>
        <item>
          <ignore>
            <literal value="FETCH"/>
          </ignore>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_msg-att"/>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_msg-att">
    <ignore>
      <literal value="("/>
    </ignore>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_msg-att-dynamic"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_msg-att-static"/>
      </item>
    </oneOf>
    <many>
      <ruleRef uri="SP"/>
      <oneOf>
        <item>
          <ruleRef uri="rfc3501_msg-att-dynamic"/>
        </item>
        <item>
          <ruleRef uri="rfc3501_msg-att-static"/>
        </item>
      </oneOf>
    </many>
    <ignore>
      <literal value=")"/>
    </ignore>
  </rule>
  <rule id="rfc3501_msg-att-dynamic">
    <ignore>
      <literal value="FLAGS"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ignore>
      <literal value="("/>
    </ignore>
    <optional>
      <ruleRef uri="rfc3501_flag-fetch"/>
      <many>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_flag-fetch"/>
      </many>
    </optional>
    <ignore>
      <literal value=")"/>
    </ignore>
  </rule>
  <rule id="rfc3501_msg-att-static">
    <oneOf>
      <item>
        <ignore>
          <literal value="ENVELOPE"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_envelope"/>
      </item>
      <item>
        <tag name="internal_date">
          <ignore>
            <literal value="INTERNALDATE"/>
          </ignore>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_date-time"/>
        </tag>
      </item>
      <item>
        <ignore>
          <literal value="RFC822"/>
        </ignore>
        <oneOf>
          <item>
            <tag name="rfc822">
              <ruleRef uri="SP"/>
              <ruleRef uri="rfc3501_nstring"/>
            </tag>
          </item>
          <item>
            <tag name="rfc822_header">
              <ignore>
                <literal value=".HEADER"/>
              </ignore>
              <ruleRef uri="SP"/>
              <ruleRef uri="rfc3501_nstring"/>
            </tag>
          </item>
          <item>
            <tag name="rfc822_text">
              <ignore>
                <literal value=".TEXT"/>
              </ignore>
              <ruleRef uri="SP"/>
              <ruleRef uri="rfc3501_nstring"/>
            </tag>
          </item>
        </oneOf>
      </item>
      <item>
        <tag name="rfc822_size">
          <ignore>
            <literal value="RFC822.SIZE"/>
          </ignore>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_number"/>
        </tag>
      </item>
      <item>
        <ignore>
          <literal value="BODY"/>
        </ignore>
        <optional>
          <ignore>
            <literal value="STRUCTURE"/>
          </ignore>
        </optional>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_body-top-level"/>
      </item>
      <item>
        <ignore>
          <literal value="BODY"/>
        </ignore>
        <ruleRef uri="rfc3501_section"/>
        <optional>
          <ignore>
            <literal value="&lt;"/>
          </ignore>
          <ruleRef uri="rfc3501_number"/>
          <ignore>
            <literal value="&gt;"/>
          </ignore>
        </optional>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_nstring"/>
      </item>
      <item>
        <ignore>
          <literal value="UID"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_uniqueid"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_nil">
    <tag name="xx_nil">
      <ignore>
        <literal value="NIL"/>
      </ignore>
    </tag>
  </rule>
  <rule id="rfc3501_nstring">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_string"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_nil"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_number">
    <tag name="xx_number">
      <untagAndFlatten>
        <manyOne>
          <ruleRef uri="DIGIT"/>
        </manyOne>
      </untagAndFlatten>
    </tag>
  </rule>
  <rule id="rfc3501_nz-number">
    <tag name="xx_number">
      <untagAndFlatten>
        <ruleRef uri="DIGIT-nz"/>
        <many>
          <ruleRef uri="DIGIT"/>
        </many>
      </untagAndFlatten>
    </tag>
  </rule>
  <rule id="rfc3501_password" postprocess="tag">
    <ruleRef uri="rfc3501_astring"/>
  </rule>
  <rule id="rfc3501_quoted" postprocess="tag">
    <ruleRef uri="DQUOTE"/>
    <many>
      <ruleRef uri="rfc3501_QUOTED-CHAR"/>
    </many>
    <ruleRef uri="DQUOTE"/>
  </rule>
  <rule id="rfc3501_QUOTED-CHAR" postprocess="tag">
    <oneOf>
      <item>
        <!--any TEXT-CHAR except quoted-specials-->
        <oneOf>
          <item>
            <hexRange start="01" end="09"/>
          </item>
          <item>
            <hexRange start="0B" end="0C"/>
          </item>
          <item>
            <hexRange start="0E" end="21"/>
          </item>
          <item>
            <hexRange start="23" end="5B"/>
          </item>
          <item>
            <hexRange start="5D" end="7F"/>
          </item>
        </oneOf>
      </item>
      <item>
        <!-- TODO not sure about this -->
        <ignore>
          <literal value="\"/>
        </ignore>
        <ruleRef uri="rfc3501_quoted-specials"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_quoted-specials" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="DQUOTE"/>
      </item>
      <item>
        <ignore>
          <literal value="\"/>
        </ignore>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_rename" postprocess="tag">
    <ignore>
      <literal value="RENAME"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="rfc3501_response">
    <tag name="xx_key_value_map">
      <tag name="payload">
        <many>
          <oneOf>
            <item>
              <ruleRef uri="rfc3501_continue-req"/>
            </item>
            <item>
              <ruleRef uri="rfc3501_response-data"/>
            </item>
          </oneOf>
        </many>
      </tag>
      <ruleRef uri="rfc3501_response-done"/>
    </tag>
  </rule>
  <rule id="rfc3501_response-data">
    <ignore>
      <literal value="*"/>
    </ignore>
    <ruleRef uri="SP"/>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_resp-cond-state"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_resp-cond-bye"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_mailbox-data"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_message-data"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_capability-data"/>
      </item>
    </oneOf>
    <ruleRef uri="CRLF"/>
  </rule>
  <rule id="rfc3501_response-done" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_response-tagged"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_response-fatal"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_response-fatal" postprocess="tag">
    <ignore>
      <literal value="*"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_resp-cond-bye"/>
    <ruleRef uri="CRLF"/>
  </rule>
  <rule id="rfc3501_response-tagged" postprocess="tag">
    <ruleRef uri="rfc3501_tag"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_resp-cond-state-final"/>
    <ruleRef uri="CRLF"/>
  </rule>
  <rule id="rfc3501_resp-cond-auth" postprocess="tag">
    <ruleRef uri="rfc3501_resp-cond-auth-prefix"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_resp-text-tagless"/>
  </rule>
  <rule id="rfc3501_resp-cond-bye" postprocess="tag">
    <!-- TODO might need more work -->
    <ignore>
      <literal value="BYE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_resp-text"/>
  </rule>
  <rule id="rfc3501_resp-cond-state" postprocess="ignore">
    <ignore>
      <ruleRef uri="rfc3501_response_codes"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_resp-text"/>
  </rule>
  <rule id="rfc3501_resp-specials" postprocess="tag">
    <ignore>
      <literal value="]"/>
    </ignore>
  </rule>
  <rule id="rfc3501_resp-text" postprocess="tag">
    <ruleRef uri="rfc3501_resp-text-tagless"/>
  </rule>
  <rule id="rfc3501_resp-text-code" postprocess="tag">
    <!-- TODO refactor this -->
    <oneOf>
      <item>
        <replace value="ALERT">
          <literal value="ALERT"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="BADCHARSET"/>
        </ignore>
        <optional>
          <ruleRef uri="SP"/>
          <ignore>
            <literal value="("/>
          </ignore>
          <ruleRef uri="rfc3501_astring"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_astring"/>
          </many>
          <ignore>
            <literal value=")"/>
          </ignore>
        </optional>
      </item>
      <item>
        <ruleRef uri="rfc3501_capability-data"/>
      </item>
      <item>
        <replace value="PARSE">
          <literal value="PARSE"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="PERMANENTFLAGS"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ignore>
          <literal value="("/>
        </ignore>
        <optional>
          <ruleRef uri="rfc3501_flag-perm"/>
          <many>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_flag-perm"/>
          </many>
        </optional>
        <ignore>
          <literal value=")"/>
        </ignore>
      </item>
      <item>
        <replace value="READ-ONLY">
          <literal value="READ-ONLY"/>
        </replace>
      </item>
      <item>
        <replace value="READ-WRITE">
          <literal value="READ-WRITE"/>
        </replace>
      </item>
      <item>
        <replace value="TRYCREATE">
          <literal value="TRYCREATE"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="UIDNEXT"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_nz-number"/>
      </item>
      <item>
        <literal value="UIDVALIDITY"/>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_nz-number"/>
      </item>
      <item>
        <ignore>
          <literal value="UNSEEN"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_nz-number"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_atom"/>
        <optional>
          <ruleRef uri="SP"/>
          <manyOne>
            <!--any TEXT-CHAR except "]"-->
            <oneOf>
              <item>
                <hexRange start="01" end="09"/>
              </item>
              <item>
                <hexRange start="0B" end="0C"/>
              </item>
              <item>
                <hexRange start="0E" end="5C"/>
              </item>
              <item>
                <hexRange start="5E" end="7F"/>
              </item>
            </oneOf>
          </manyOne>
        </optional>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_search" postprocess="tag">
    <ignore>
      <literal value="SEARCH"/>
    </ignore>
    <optional>
      <ruleRef uri="SP"/>
      <ignore>
        <literal value="CHARSET"/>
      </ignore>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_astring"/>
    </optional>
    <manyOne>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_search-key"/>
    </manyOne>
  </rule>
  <rule id="rfc3501_search-key" postprocess="tag">
    <oneOf>
      <item>
        <replace value="ALL">
          <literal value="ALL"/>
        </replace>
      </item>
      <item>
        <replace value="ANSWERED">
          <literal value="ANSWERED"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="BCC"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <ignore>
          <literal value="BEFORE"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_date"/>
      </item>
      <item>
        <literal value="BODY"/>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <ignore>
          <literal value="CC"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <replace value="DELETED">
          <literal value="DELETED"/>
        </replace>
      </item>
      <item>
        <replace value="FLAGGED">
          <literal value="FLAGGED"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="FROM"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <literal value="KEYWORD"/>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_flag-keyword"/>
      </item>
      <item>
        <replace value="NEW">
          <literal value="NEW"/>
        </replace>
      </item>
      <item>
        <replace value="OLD">
          <literal value="OLD"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="ON"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_date"/>
      </item>
      <item>
        <replace value="RECENT">
          <literal value="RECENT"/>
        </replace>
      </item>
      <item>
        <replace value="SEEN">
          <literal value="SEEN"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="SINCE"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_date"/>
      </item>
      <item>
        <ignore>
          <literal value="SUBJECT"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <ignore>
          <literal value="TEXT"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <ignore>
          <literal value="TO"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <replace value="UNANSWERED">
          <literal value="UNANSWERED"/>
        </replace>
      </item>
      <item>
        <replace value="UNDELETED">
          <literal value="UNDELETED"/>
        </replace>
      </item>
      <item>
        <replace value="UNFLAGGED">
          <literal value="UNFLAGGED"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="UNKEYWORD"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_flag-keyword"/>
      </item>
      <item>
        <replace value="UNSEEN">
          <literal value="UNSEEN"/>
        </replace>
      </item>
      <item>
        <replace value="DRAFT">
          <literal value="DRAFT"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="HEADER"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_header-fld-name"/>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_astring"/>
      </item>
      <item>
        <ignore>
          <literal value="LARGER"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_number"/>
      </item>
      <item>
        <ignore>
          <literal value="NOT"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_search-key"/>
      </item>
      <item>
        <ignore>
          <literal value="OR"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_search-key"/>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_search-key"/>
      </item>
      <item>
        <ignore>
          <literal value="SENTBEFORE"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_date"/>
      </item>
      <item>
        <ignore>
          <literal value="SENTON"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_date"/>
      </item>
      <item>
        <ignore>
          <literal value="SENTSINCE"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_date"/>
      </item>
      <item>
        <ignore>
          <literal value="SMALLER"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_number"/>
      </item>
      <item>
        <ignore>
          <literal value="UID"/>
        </ignore>
        <ruleRef uri="SP"/>
        <ruleRef uri="rfc3501_sequence-set"/>
      </item>
      <item>
        <replace value="UNDRAFT">
          <literal value="UNDRAFT"/>
        </replace>
      </item>
      <item>
        <ruleRef uri="rfc3501_sequence-set"/>
      </item>
      <item>
        <ignore>
          <literal value="("/>
        </ignore>
        <ruleRef uri="rfc3501_search-key"/>
        <many>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_search-key"/>
        </many>
        <ignore>
          <literal value=")"/>
        </ignore>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_section" postprocess="tag">
    <ignore>
      <literal value="["/>
    </ignore>
    <optional>
      <ruleRef uri="rfc3501_section-spec"/>
    </optional>
    <ignore>
      <literal value="]"/>
    </ignore>
  </rule>
  <rule id="rfc3501_section-msgtext" postprocess="tag">
    <oneOf>
      <item>
        <replace value="HEADER">
          <literal value="HEADER"/>
        </replace>
      </item>
      <item>
        <ignore>
          <literal value="HEADER.FIELDS"/>
        </ignore>
        <oneOf>
          <item>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_header-list"/>
          </item>
          <item>
            <ignore>
              <literal value=".NOT"/>
            </ignore>
            <ruleRef uri="SP"/>
            <ruleRef uri="rfc3501_header-list"/>
          </item>
        </oneOf>
      </item>
      <item>
        <replace value="TEXT">
          <literal value="TEXT"/>
        </replace>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_section-part" postprocess="tag">
    <untagAndFlatten>
      <ruleRef uri="rfc3501_nz-number"/>
    </untagAndFlatten>
    <many>
      <literal value="."/>
      <untagAndFlatten>
        <ruleRef uri="rfc3501_nz-number"/>
      </untagAndFlatten>
    </many>
  </rule>
  <rule id="rfc3501_section-spec" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_section-msgtext"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_section-part"/>
        <optional>
          <literal value="."/>
          <ruleRef uri="rfc3501_section-text"/>
        </optional>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_section-text" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_section-msgtext"/>
      </item>
      <item>
        <literal value="MIME"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_select" postprocess="tag">
    <ignore>
      <literal value="SELECT"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="rfc3501_seq-number" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_nz-number"/>
      </item>
      <item>
        <literal value="*"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_seq-range" postprocess="tag">
    <ruleRef uri="rfc3501_seq-number"/>
    <ignore>
      <literal value=":"/>
    </ignore>
    <ruleRef uri="rfc3501_seq-number"/>
  </rule>
  <rule id="rfc3501_sequence-set" postprocess="tag">
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_seq-number"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_seq-range"/>
      </item>
    </oneOf>
    <many>
      <ignore>
        <literal value=","/>
      </ignore>
      <ruleRef uri="rfc3501_sequence-set"/>
    </many>
  </rule>
  <rule id="rfc3501_status" postprocess="tag">
    <ignore>
      <literal value="STATUS"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
    <ruleRef uri="SP"/>
    <ignore>
      <literal value="("/>
    </ignore>
    <ruleRef uri="rfc3501_status-att"/>
    <many>
      <ruleRef uri="SP"/>
      <ruleRef uri="rfc3501_status-att"/>
    </many>
    <ignore>
      <literal value=")"/>
    </ignore>
  </rule>
  <rule id="rfc3501_status-att">
    <tag name="xx_symbol">
      <oneOf>
        <item>
          <replace value="MESSAGES">
            <literal value="MESSAGES"/>
          </replace>
        </item>
        <item>
          <replace value="RECENT">
            <literal value="RECENT"/>
          </replace>
        </item>
        <item>
          <replace value="UIDNEXT">
            <literal value="UIDNEXT"/>
          </replace>
        </item>
        <item>
          <replace value="UIDVALIDITY">
            <literal value="UIDVALIDITY"/>
          </replace>
        </item>
        <item>
          <replace value="UNSEEN">
            <literal value="UNSEEN"/>
          </replace>
        </item>
      </oneOf>
    </tag>
  </rule>
  <rule id="rfc3501_status-att-list">
    <tag name="xx_key_value_pair">
      <tag name="xx_key_value_map">
        <tag name="key">
          <ruleRef uri="rfc3501_status-att"/>
        </tag>
        <ruleRef uri="SP"/>
        <tag name="value">
          <ruleRef uri="rfc3501_number"/>
        </tag>
      </tag>
    </tag>
    <many>
      <ruleRef uri="SP"/>
      <tag name="xx_key_value_pair">
        <tag name="xx_key_value_map">
          <tag name="key">
            <ruleRef uri="rfc3501_status-att"/>
          </tag>
          <ruleRef uri="SP"/>
          <tag name="value">
            <ruleRef uri="rfc3501_number"/>
          </tag>
        </tag>
      </tag>
    </many>
  </rule>
  <rule id="rfc3501_store" postprocess="tag">
    <ignore>
      <literal value="STORE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_sequence-set"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_store-att-flags"/>
  </rule>
  <rule id="rfc3501_store-att-flags" postprocess="tag">
    <!-- TODO -->
    <optional>
      <oneOf>
        <item>
          <literal value="+"/>
        </item>
        <item>
          <literal value="-"/>
        </item>
      </oneOf>
    </optional>
    <literal value="FLAGS"/>
    <optional>
      <literal value=".SILENT"/>
    </optional>
    <ruleRef uri="SP"/>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_flag-list"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_flag"/>
        <many>
          <ruleRef uri="SP"/>
          <ruleRef uri="rfc3501_flag"/>
        </many>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_string">
    <untagAndFlatten>
      <oneOf>
        <item>
          <ruleRef uri="rfc3501_quoted"/>
        </item>
        <item>
          <ruleRef uri="rfc3501_literal"/>
        </item>
      </oneOf>
    </untagAndFlatten>
  </rule>
  <rule id="rfc3501_subscribe" postprocess="tag">
    <ignore>
      <literal value="SUBSCRIBE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="rfc3501_tag" postprocess="tag">
    <untagAndFlatten>
      <manyOne>
        <!--any ASTRING-CHAR except "+"-->
        <oneOf>
          <item>
            <hexValue value="21"/>
          </item>
          <item>
            <hexRange start="23" end="24"/>
          </item>
          <item>
            <hexRange start="26" end="27"/>
          </item>
          <item>
            <hexRange start="2C" end="5B"/>
          </item>
          <item>
            <hexRange start="5D" end="7A"/>
          </item>
          <item>
            <hexRange start="7C" end="7E"/>
          </item>
        </oneOf>
      </manyOne>
    </untagAndFlatten>
  </rule>
  <rule id="rfc3501_text">
    <untagAndFlatten>
      <manyOne>
        <ruleRef uri="rfc3501_TEXT-CHAR"/>
      </manyOne>
    </untagAndFlatten>
  </rule>
  <rule id="rfc3501_TEXT-CHAR">
    <!--any CHAR except CR and LF-->
    <oneOf>
      <item>
        <hexRange start="01" end="09"/>
      </item>
      <item>
        <hexRange start="0B" end="0C"/>
      </item>
      <item>
        <hexRange start="0E" end="7F"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_time">
    <tag name="xx_key_value_map">
      <tag name="hour">
        <tag name="xx_number">
          <untagAndFlatten>
            <exactly count="2">
              <ruleRef uri="DIGIT"/>
            </exactly>
          </untagAndFlatten>
        </tag>
      </tag>
      <ignore>
        <literal value=":"/>
      </ignore>
      <tag name="minute">
        <tag name="xx_number">
          <untagAndFlatten>
            <exactly count="2">
              <ruleRef uri="DIGIT"/>
            </exactly>
          </untagAndFlatten>
        </tag>
      </tag>
      <ignore>
        <literal value=":"/>
      </ignore>
      <tag name="second">
        <tag name="xx_number">
          <untagAndFlatten>
            <exactly count="2">
              <ruleRef uri="DIGIT"/>
            </exactly>
          </untagAndFlatten>
        </tag>
      </tag>
    </tag>
  </rule>
  <rule id="rfc3501_uid" postprocess="tag">
    <ignore>
      <literal value="UID"/>
    </ignore>
    <ruleRef uri="SP"/>
    <oneOf>
      <item>
        <ruleRef uri="rfc3501_copy"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_fetch"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_search"/>
      </item>
      <item>
        <ruleRef uri="rfc3501_store"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_uniqueid" postprocess="tag">
    <ruleRef uri="rfc3501_nz-number"/>
  </rule>
  <rule id="rfc3501_unsubscribe" postprocess="tag">
    <ignore>
      <literal value="UNSUBSCRIBE"/>
    </ignore>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_mailbox"/>
  </rule>
  <rule id="rfc3501_userid" postprocess="tag">
    <ruleRef uri="rfc3501_astring"/>
  </rule>
  <rule id="rfc3501_x-command" postprocess="tag">
    <ignore>
      <literal value="X"/>
    </ignore>
    <ruleRef uri="rfc3501_atom"/>
    <!--experimental command arguments-->
  </rule>
  <rule id="rfc3501_zone">
    <oneOf>
      <item>
        <ignore>
          <literal value="+"/>
        </ignore>
        <tag name="xx_negate">
          <ruleRef uri="rfc3501_zone-unsigned"/>
        </tag>
      </item>
      <item>
        <ignore>
          <literal value="-"/>
        </ignore>
        <ruleRef uri="rfc3501_zone-unsigned"/>
      </item>
    </oneOf>
  </rule>
  <!-- Refactorings -->
  <rule id="rfc3501_response-only">
    <tag name="xx_key_value_map">
      <tag name="payload">
        <many>
          <ruleRef uri="rfc3501_response-data"/>
        </many>
      </tag>
      <ruleRef uri="rfc3501_response-done"/>
    </tag>
  </rule>
  <rule id="rfc3501_env-addresses">
    <oneOf>
      <item>
        <ignore>
          <literal value="("/>
        </ignore>
        <manyOne>
          <ruleRef uri="rfc3501_address"/>
        </manyOne>
        <ignore>
          <literal value=")"/>
        </ignore>
      </item>
      <item>
        <ruleRef uri="rfc3501_nil"/>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_zone-unsigned">
    <tag name="xx_add">
      <tag name="xx_hours_to_minutes">
        <tag name="xx_number">
          <untagAndFlatten>
            <exactly count="2">
              <ruleRef uri="DIGIT"/>
            </exactly>
          </untagAndFlatten>
        </tag>
      </tag>
      <tag name="xx_number">
        <untagAndFlatten>
          <exactly count="2">
            <ruleRef uri="DIGIT"/>
          </exactly>
        </untagAndFlatten>
      </tag>
    </tag>
  </rule>
  <rule id="rfc3501_key_value_pair">
    <tag name="xx_key_value_map">
      <tag name="key">
        <ruleRef uri="rfc3501_string"/>
      </tag>
      <ruleRef uri="SP"/>
      <tag name="value">
        <ruleRef uri="rfc3501_string"/>
      </tag>
    </tag>
  </rule>
  <rule id="rfc3501_resp-cond-auth-prefix">
    <oneOf>
      <item>
        <ignore>
          <literal value="OK"/>
        </ignore>
      </item>
      <item>
        <ignore>
          <literal value="PREAUTH"/>
        </ignore>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_resp-text-tagless">
    <optional>
      <ignore>
        <literal value="["/>
      </ignore>
      <ruleRef uri="rfc3501_resp-text-code"/>
      <ignore>
        <literal value="]"/>
      </ignore>
      <ruleRef uri="SP"/>
    </optional>
    <ruleRef uri="rfc3501_text"/>
  </rule>
  <rule id="rfc3501_resp-cond-state-final">
    <ruleRef uri="rfc3501_response_codes"/>
    <ruleRef uri="SP"/>
    <ruleRef uri="rfc3501_resp-text"/>
  </rule>
  <rule id="rfc3501_response_codes">
    <oneOf>
      <item>
        <tag name="xx_response_ok">
          <ignore>
            <literal value="OK"/>
          </ignore>
        </tag>
      </item>
      <item>
        <tag name="xx_response_no">
          <ignore>
            <literal value="NO"/>
          </ignore>
        </tag>
      </item>
      <item>
        <tag name="xx_response_bad">
          <ignore>
            <literal value="BAD"/>
          </ignore>
        </tag>
      </item>
    </oneOf>
  </rule>
  <rule id="rfc3501_flag-extension-tagless">
    <ignore>
      <literal value="\"/>
    </ignore>
    <ruleRef uri="rfc3501_atom"/>
  </rule>
  <rule id="rfc3501_body-top-level">
    <tag name="body">
      <ruleRef uri="rfc3501_body"/>
    </tag>
  </rule>
  <!-- RFC 3501 -->
  <!-- Auxiliary -->
  <rule id="aux_weekday">
    <oneOf>
      <item>
        <literal value="Mon"/>
      </item>
      <item>
        <literal value="Tue"/>
      </item>
      <item>
        <literal value="Wed"/>
      </item>
      <item>
        <literal value="Thu"/>
      </item>
      <item>
        <literal value="Fri"/>
      </item>
      <item>
        <literal value="Sat"/>
      </item>
      <item>
        <literal value="Sun"/>
      </item>
    </oneOf>
  </rule>
  <rule id="aux_month-name">
    <tag name="xx_number">
      <untagAndFlatten>
        <oneOf>
          <item>
            <replace value="01">
              <literal value="Jan"/>
            </replace>
          </item>
          <item>
            <replace value="02">
              <literal value="Feb"/>
            </replace>
          </item>
          <item>
            <replace value="03">
              <literal value="Mar"/>
            </replace>
          </item>
          <item>
            <replace value="04">
              <literal value="Apr"/>
            </replace>
          </item>
          <item>
            <replace value="05">
              <literal value="May"/>
            </replace>
          </item>
          <item>
            <replace value="06">
              <literal value="Jun"/>
            </replace>
          </item>
          <item>
            <replace value="07">
              <literal value="Jul"/>
            </replace>
          </item>
          <item>
            <replace value="08">
              <literal value="Aug"/>
            </replace>
          </item>
          <item>
            <replace value="09">
              <literal value="Sep"/>
            </replace>
          </item>
          <item>
            <replace value="10">
              <literal value="Oct"/>
            </replace>
          </item>
          <item>
            <replace value="11">
              <literal value="Nov"/>
            </replace>
          </item>
          <item>
            <replace value="12">
              <literal value="Dec"/>
            </replace>
          </item>
        </oneOf>
      </untagAndFlatten>
    </tag>
  </rule>
  <rule id="aux_env-date">
    <tag name="xx_date_time_value">
      <tag name="xx_key_value_map">
        <ignore>
          <optional>
            <ruleRef uri="aux_weekday"/>
            <literal value=","/>
            <ruleRef uri="SP"/>
          </optional>
        </ignore>
        <tag name="date">
          <tag name="xx_date">
            <tag name="xx_key_value_map">
              <tag name="day">
                <ruleRef uri="rfc3501_date-day-fixed"/>
              </tag>
              <ruleRef uri="SP"/>
              <tag name="month">
                <ruleRef uri="aux_month-name"/>
              </tag>
              <ruleRef uri="SP"/>
              <tag name="year">
                <ruleRef uri="rfc3501_date-year"/>
              </tag>
            </tag>
          </tag>
        </tag>
        <ruleRef uri="SP"/>
        <tag name="time">
          <tag name="xx_time_of_day">
            <ruleRef uri="rfc3501_time"/>
          </tag>
        </tag>
        <ruleRef uri="SP"/>
        <tag name="offset">
          <ruleRef uri="rfc3501_zone"/>
        </tag>
        <ignore>
          <optional>
            <ruleRef uri="SP"/>
            <literal value="("/>
            <exactly count="3">
              <ruleRef uri="ALPHA"/>
            </exactly>
            <literal value=")"/>
            <many>
              <ruleRef uri="SP"/>
            </many>
          </optional>
        </ignore>
      </tag>
    </tag>
  </rule>
  <!-- Auxiliary -->
  <!-- CORE RFC -->
  <rule id="ALPHA">
    <oneOf>
      <item>
        <hexRange start="41" end="5A"/>
      </item>
      <item>
        <hexRange start="61" end="7A"/>
      </item>
    </oneOf>
  </rule>
  <rule id="BIT">
    <oneOf>
      <item>
        <literal value="0"/>
      </item>
      <item>
        <literal value="1"/>
      </item>
    </oneOf>
  </rule>
  <rule id="CHAR">
    <hexRange start="01" end="7F"/>
  </rule>
  <rule id="CR" postprocess="ignore">
    <hexValue value="0D"/>
  </rule>
  <rule id="CRLF" postprocess="ignore">
    <ruleRef uri="CR"/>
    <ruleRef uri="LF"/>
  </rule>
  <rule id="CTL">
    <oneOf>
      <item>
        <hexRange start="00" end="1F"/>
      </item>
      <item>
        <hexValue value="7F"/>
      </item>
    </oneOf>
  </rule>
  <rule id="DIGIT">
    <hexRange start="30" end="39"/>
  </rule>
  <rule id="DQUOTE" postprocess="ignore">
    <hexValue value="22"/>
  </rule>
  <rule id="HEXDIG">
    <oneOf>
      <item>
        <ruleRef uri="DIGIT"/>
      </item>
      <item>
        <literal value="A"/>
      </item>
      <item>
        <literal value="B"/>
      </item>
      <item>
        <literal value="C"/>
      </item>
      <item>
        <literal value="D"/>
      </item>
      <item>
        <literal value="E"/>
      </item>
      <item>
        <literal value="F"/>
      </item>
    </oneOf>
  </rule>
  <rule id="HTAB" postprocess="ignore">
    <hexValue value="09"/>
  </rule>
  <rule id="LF" postprocess="ignore">
    <hexValue value="0A"/>
  </rule>
  <rule id="LWSP" postprocess="ignore">
    <many>
      <oneOf>
        <item>
          <ruleRef uri="WSP"/>
        </item>
        <item>
          <ruleRef uri="CRLF"/>
          <ruleRef uri="WSP"/>
        </item>
      </oneOf>
    </many>
  </rule>
  <rule id="OCTET">
    <hexRange start="00" end="FF"/>
  </rule>
  <rule id="SP" postprocess="ignore">
    <hexValue value="20"/>
  </rule>
  <rule id="VCHAR">
    <hexRange start="21" end="7E"/>
  </rule>
  <rule id="WSP" postprocess="ignore">
    <oneOf>
      <item>
        <ruleRef uri="SP"/>
      </item>
      <item>
        <ruleRef uri="HTAB"/>
      </item>
    </oneOf>
  </rule>
</grammar>
