<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-kohbrok-mls-virtual-clients-04" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="MVC">MLS Virtual Clients</title>
    <seriesInfo name="Internet-Draft" value="draft-kohbrok-mls-virtual-clients-04"/>
    <author initials="J." surname="Alwen">
      <organization/>
      <address>
        <email>alwenjo@amazon.com</email>
      </address>
    </author>
    <author initials="K." surname="Kohbrok" fullname="Konrad Kohbrok">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>konrad.kohbrok@datashrine.de</email>
      </address>
    </author>
    <author initials="R." surname="Robert" fullname="Raphael Robert">
      <organization>Phoenix R&amp;D</organization>
      <address>
        <email>ietf@raphaelrobert.com</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <area>Security</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 26?>

<t>This document describes a method that allows multiple MLS clients to emulate a
virtual MLS client. A virtual client allows multiple emulator clients to jointly
participate in an MLS group under a single leaf. Depending on the design of the
application, virtual clients can help hide metadata and improve performance.</t>
    </abstract>
  </front>
  <middle>
    <?line 33?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The MLS protocol facilitates communication between clients, where in an MLS
group, each client is represented by the leaf to which it holds the private key
material. In this document, we propose the notion of a virtual client that is
jointly emulated by a group of emulator clients, where each emulator client
holds the key material necessary to act as the virtual client.</t>
      <t>The use of a virtual client allows multiple distinct clients to be represented
by a single leaf in an MLS group. This pattern of shared group membership
provides a new way for applications to structure groups, can improve performance
and help hide group metadata. The effect of the use of virtual clients depends
largely on how it is applied (see <xref target="applications"/>).</t>
      <t>We discuss technical challenges and propose a concrete scheme that allows a
group of clients to emulate a virtual client that can participate in one or more
MLS groups.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <ul spacing="normal">
        <li>
          <t>Virtual Client: A client for which the secret key material is held by one or
more emulator clients, each of which can act on behalf of the virtual client.</t>
        </li>
        <li>
          <t>Emulator Client: A client that collaborates with other emulator clients in
emulating a virtual client.</t>
        </li>
        <li>
          <t>Emulation group: Group used by emulator clients to coordinate emulation of a
virtual client.</t>
        </li>
        <li>
          <t>Higher-level group: A group that is not an emulation group and that may
contain one or more virtual clients.</t>
        </li>
        <li>
          <t>Simple multi-client: A simple alternative to the concept of virtual clients,
where entities that are represented by more than one client (e.g. a user with
multiple devices) are implemented by including all of the entities' clients in
all groups the entity is participating in.</t>
        </li>
      </ul>
      <t>TODO: Terminology is up for debate. We’ve sometimes called this “user trees”,
but since there are other use cases, we should choose a more neutral name. For
now, it’s virtual client emulation.</t>
    </section>
    <section anchor="applications">
      <name>Applications</name>
      <t>Virtual clients generally allow multiple emulator clients to share membership in
an MLS group, where the virtual client is represented as a single leaf. This is
in contrast to the simple multi-client scenario as defined above.</t>
      <t>Depending on the application, the use of virtual clients can have different
effects. However, in all cases, virtual client emulation introduces a small
amount of overhead for the emulator clients and certain limitations (see
<xref target="limitations"/>).</t>
      <section anchor="virtual-clients-for-performance">
        <name>Virtual clients for performance</name>
        <t>If a group of emulator clients emulate a virtual client in more than one group,
the overhead caused by the emulation process can be outweighed by two
performance benefits.</t>
        <t>On the one hand, the use of virtual clients makes the higher-level groups (in
which the virtual client is a member) smaller. Instead of one leaf for each
emulator client, it only has a single leaf for the virtual client. As the
complexity of most MLS operations depends on the number of group members, this
increases performance for all members of that group.</t>
        <t>At the same time, the virtual client emulation process (see
<xref target="client-emulation"/>) allows emulator clients to carry the benefit of a single
operation in the emulation group to all virtual clients emulated in that group.</t>
      </section>
      <section anchor="metadata-hiding">
        <name>Metadata hiding</name>
        <t>Virtual clients can be used to hide the emulator clients from other members of
higher-level groups. For example, removing group members of the emulator group
will only be visible in the higher-level group as a regular group update.
Similarly, when an emulator client wants to send a message in a higher-level
group, recipients will see the virtual client as the sender and won't be able to
discern which emulator client sent the message, or indeed the fact that the
sender is a virtual client at all.</t>
        <t>Hiding emulator clients behind their virtual client(s) can, for example, hide
the number of devices a human user has, or which device the user is sending
messages from.</t>
        <t>As hiding of emulator clients by design obfuscates the membership in
higher-level groups, it also means that other higher-level group members can't
identify the actual senders and recipients of messages. From the point of view
of other group members, the "end" of the end-to-end encryption and
authentication provided by MLS ends with the virtual client. The relevance of
this fact largely depends on the security goals of the application and the
design of the authentication service.</t>
        <t>If the virtual client is used to hide the emulator clients, the delivery service and
other higher-level group members also lose the ability to enforce policies to
evict stale clients. For example, an emulator client could become stale (i.e.
inactive), while another keeps sending updates. From the point of view of the
higher-level group, the virtual client would remain active.</t>
      </section>
    </section>
    <section anchor="limitations">
      <name>Limitations</name>
      <t>The use of virtual clients comes with a few limitations when compared to MLS,
where all emulator clients are themselves members of the higher-level groups.</t>
      <section anchor="external-remove-proposals">
        <name>External remove proposals</name>
        <t>In some cases, it is desirable for an external sender (e.g. the messaging
provider of a user) to be able to propose the removal of an individual
(non-virtual) client from a group without requiring another client of the same
user to be online. Doing so would allow another client to commit to said remove
proposal and thus remove the client in question from the group.</t>
        <t>This is not possible when using virtual clients. Here, the non-virtual client
would be the emulator client of a virtual client in a higher-level group. While
the server could propose the removal of the client from the emulation group,
this would not effectively remove the client's access to the higher-level groups
through the virtual client.</t>
        <t>For such a removal to take place, another emulator client would have to be
online to update the key material of the virtual client (in addition to the
removal in the emulation group).</t>
        <t>Another possibility would be for emulator clients to provision KeyPackages for
which only a subset of emulator clients have access to. The external sender
could then propose the removal of the virtual client, coupled with the immediate
addition of a new one using one of the KeyPackages.</t>
      </section>
      <section anchor="external-joins">
        <name>External joins</name>
        <t>In a simple multi-client scenario, new (emulator) clients are able to join via
external commit without influencing the operation of any other emulator client
and without requiring another emulator client to be online.</t>
        <t>When using virtual clients and a client wishes to externally join the emulator
group, it will not have immediate access to the secrets of the virtual clients
associated with that group.</t>
        <t>This can be remedied via one of the following options:</t>
        <ul spacing="normal">
          <li>
            <t>Another emulator client could provide it with the necessary secrets</t>
          </li>
          <li>
            <t>The new emulator client could have the virtual client rejoin all higher-level
groups</t>
          </li>
        </ul>
        <t>While the first option has the benefit of not requiring an external commit in
any higher-level groups (thus reducing overhead), it either requires another
emulator client to be online to share the necessary secrets directly, or a way
for the new emulator client to retrieve the necessary without the help of
another client. The latter can be achieved, for example, by encrypting the
relevant secrets such that the new client can retrieve and decrypt them.</t>
        <t>The second option on the other hand additionally requires the new emulator
client to re-upload all KeyPackages of the virtual client, thus further
increasing the difficulty of coordinating actions between emulation group and
higher-level groups.</t>
      </section>
    </section>
    <section anchor="client-emulation">
      <name>Client emulation</name>
      <t>To ensure that all emulator clients can act through the virtual client, they
have to coordinate some of its actions.</t>
      <section anchor="delivery-service">
        <name>Delivery Service</name>
        <t>Client emulation requires that any message sent by an emulator client on behalf
of a virtual client be delivered not just to the rest of the supergroup to which
the the message is sent, but also to all other clients in the emulator group.</t>
      </section>
      <section anchor="generating-virtual-client-secrets">
        <name>Generating Virtual Client Secrets</name>
        <t>Generally, secrets for virtual client operations are derived from the emulation
group. To that end, emulator clients derive an <tt>epoch_base_secret</tt> with every
new epoch of that group.</t>
        <artwork><![CDATA[
emulator_epoch_secret = SafeExportSecret(XXX)
]]></artwork>
        <t>TODO: Replace XXX with the component ID.</t>
        <t>The <tt>emulator_epoch_secret</tt> is in turn used to derive two further secrets, after
which it is deleted.</t>
        <artwork><![CDATA[
epoch_id =
  DeriveSecret(emulator_epoch_secret, "Epoch ID")
epoch_base_secret =
  DeriveSecret(emulator_epoch_secret, "Base Secret")
epoch_encryption_key =
  DeriveSecret(emulator_epoch_secret, "Encryption Key")
]]></artwork>
        <t>The <tt>epoch_base_secret</tt> is then used to key an instance of the PPRF defined in
<xref target="I-D.ietf-mls-extensions"/> using a tree with <tt>2^32</tt> leaves.</t>
        <t>Secrets are derived from the PPRF as follows:</t>
        <artwork><![CDATA[
VirtualClientSecret(Input) = tree_node_[LeafNode(Input)]_secret
]]></artwork>
        <t>Emulator client MUST store both the (punctured) <tt>epoch_base_secret</tt> and the
<tt>epoch_id</tt> until no key material derived from it is actively used anymore. This
is required for the addition of new clients to the emulator group as described
in Section <xref target="adding-emulator-clients"/>.</t>
        <t>When deriving a secret for a virtual client, e.g. for use in a KeyPackage or
LeafNode update, the deriving client samples a random octet string <tt>random</tt> and
hashes it with its leaf index in the emulation group using the hash function of
the emulation group's ciphersuite.</t>
        <artwork><![CDATA[
struct {
  u32 leaf_index;
  opaque random<V>;
} HashInput

pprf_input = Hash(HashInput)
]]></artwork>
        <t>TODO: We could also hash in the specific operation to further separate domains.</t>
        <t>The <tt>pprf_input</tt> is then used to derive an <tt>operation_secret</tt>.</t>
        <artwork><![CDATA[
operation_secret = VirtualClientSecret(pprf_input)
]]></artwork>
        <t>Given an <tt>epoch_id</tt>, <tt>random</tt> and the <tt>leaf_index</tt> of the emulator client
performing the virtual client operation, other emulator clients can derive the
<tt>operation_secret</tt> and use it to perform the same operation.</t>
        <t>Depending on the operation, the acting emulator client will have to derive one
or more secrets from the <tt>operation_secret</tt>.</t>
        <t>There are four types of MLS-related secrets that can be derived from an
<tt>operation_secret</tt>.</t>
        <ul spacing="normal">
          <li>
            <t><tt>signature_key_secret</tt>: Used to derive the signature key in a virtual client's
leaf</t>
          </li>
          <li>
            <t><tt>init_key_secret</tt>: Used to derive the <tt>init_key</tt> HPKE key in a KeyPackage</t>
          </li>
          <li>
            <t><tt>encryption_key_secret</tt>: Used to derive the <tt>encryption_key</tt> HPKE key in the
LeafNode of a virtual client</t>
          </li>
          <li>
            <t><tt>path_generation_secret</tt>: Used to generate <tt>path_secret</tt>s for the UpdatePath
of a virtual client</t>
          </li>
        </ul>
        <artwork><![CDATA[
signature_key_secret =
  DeriveSecret(epoch_base_secret, "Signature Key")

encryption_key_secret =
  DeriveSecret(epoch_base_secret, "Encryption Key")

init_key_secret =
  DeriveSecret(epoch_base_secret, "Init Key")

path_generation_secret =
  DeriveSecret(epoch_base_secret, "Path Generation")
]]></artwork>
        <t>From these secrets, the deriving client can generate the corresponding keypair
by using the secret as the randomness required in the key generation process.</t>
      </section>
      <section anchor="creating-leafnodes-and-updatepaths">
        <name>Creating LeafNodes and UpdatePaths</name>
        <t>When creating a LeafNode, either for a Commit with path, an Update proposal or a
KeyPackage, the creating emulator client MUST derive the necessary secrets from
the current epoch of the emulator group as described in Section
<xref target="generating-virtual-client-secrets"/>.</t>
        <t>Similarly, if an emulator client generates an Commit with an update path, it
MUST use <tt>path_generation_secret</tt> as the <tt>path_secret</tt> for the first
<tt>parent_node</tt> instead of generating it randomly.</t>
        <t>To signal to other emulator clients which epoch to use to derive the necessary
secrets to recreate the key material, the emulator client includes an
DerivationInfoExtension in the LeafNode.</t>
        <sourcecode type="tls"><![CDATA[
struct {
  opaque epoch_id<V>;
  opaque ciphertext<V>;
} DerivationInfoExtension

struct {
  uint32 leaf_index;
  opaque random<V>;
} EpochInfoTBE
]]></sourcecode>
        <t>The <tt>ciphertext</tt> is the serialized EpochInfoTBE encrypted under the epoch's
<tt>epoch_encryption_key</tt> with the <tt>epoch_id</tt> as AAD using the AEAD scheme of the
emulation group's ciphersuite.</t>
        <t>When other emulator clients receive an Update (i.e. either an Update proposal or
a Commit with an UpdatePath) in group that the virtual client is a member in it
uses the <tt>epoch_id</tt> to determine the epoch of the emulator group from which to
derive the secrets necessary to re-create the key material of the LeafNode and a
potential UpdatePath.</t>
      </section>
      <section anchor="adding-emulator-clients">
        <name>Adding emulator clients</name>
        <t>There are two ways of adding new clients to the emulation group. Either new
clients get sent the secret key material of all groups that the virtual client
is currently in, or it joins into all of the virtual client's groups, either via
a regular or an external commit.</t>
        <t>TODO: Specify protocol</t>
      </section>
      <section anchor="virtual-client-actions">
        <name>Virtual client actions</name>
        <t>There are two occasions where emulator clients need to communicate directly to
operate the virtual client. In both cases, the acting emulator client sends a
Commit to the emulation group before taking an action with the virtual client.</t>
        <t>The commit serves two purposes: First, the agreement on message ordering
facilitated by the DS prevents concurrent conflicting actions by two or more
emulator clients. Second, the acting emulator client can attach additional
information to the commit using the SafeAAD mechanism described in Section 4.9
of <xref target="I-D.ietf-mls-extensions"/>.</t>
        <sourcecode type="tls"><![CDATA[
enum {
  reserved(0),
  key_package_upload(1),
  external_join(2),
  255,
} ActionType;

struct {
  ActionType action_type;
  select (VirtualClientAction.action_type) {
    case key_package_upload:
      KeyPackageUpload key_package_upload;
    case external_join:
      ExternalJoin external_join;
  };
} VirtualClientAction;
]]></sourcecode>
        <section anchor="creating-and-uploading-keypackages">
          <name>Creating and uploading KeyPackages</name>
          <t>When creating a KeyPackage, the creating emulator client derives the
<tt>init_secret</tt> as described in <xref target="generating-virtual-client-secrets"/>.</t>
          <t>Before uploading one or more KeyPackages for a virtual client, the uploading
emulator client MUST create a KeyPackageUpload message and send it to the
emulator group as described in <xref target="virtual-client-actions"/>.</t>
          <t>The recipients can use the <tt>leaf_index</tt> of the sender, as well as the <tt>random</tt>
and <tt>epoch_id</tt> to derive the <tt>init_key</tt> for each KeyPackageRef. If the
recipients receive a Welcome, they can then check which <tt>init_key</tt> to use based
on the KeyPackageRef.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  KeyPackageRef key_package_ref<V>;
  opaque random<V>;
} KeyPackageInfo

struct {
  opaque epoch_id<V>;
  KeyPackageInfo key_package_info<V>;
} KeyPackageUpload
]]></sourcecode>
          <t>After successfully sending the message, the sender MUST then upload the
corresponding KeyPackages.</t>
          <t>The <tt>key_package_refs</tt> allow emulator clients to identify which KeyPackage to
use and how to derive it when the virtual client receives a Welcome message.</t>
        </section>
        <section anchor="externally-joining-groups-with-the-virtual-client">
          <name>Externally joining groups with the virtual client</name>
          <t>Before an emulator client uses an external commit to join a group with the
virtual client, it MUST send an ExternalJoin message to the emulation group as
described in <xref target="virtual-client-actions"/>.</t>
          <sourcecode type="tls"><![CDATA[
struct {
  opaque group_id<V>;
} ExternalJoin
]]></sourcecode>
          <t>The sender MUST then use an external join to join the group with GroupID
<tt>group_id</tt>. When creating the commit to join the group externally, it MUST
generate the LeafNode and path as described in
<xref target="creating-leafnodes-and-updatepaths"/>.</t>
        </section>
      </section>
      <section anchor="sending-application-messages">
        <name>Sending application messages</name>
        <t>There are two issues when emulator clients send application messages through a
virtual client: Nonce-reuse and key-reuse. Both issues ares solved as
specified in Section 4.4 of <xref target="I-D.draft-mcmillion-mls-subgroups"/>.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security considerations</name>
      <t>TODO: Detail security considerations once the protocol has evolved a little
more. Starting points:</t>
      <t>Some of the performance benefits of this scheme depend on the fact that one can
update once in the emulation group and “re-use” the new randomness for updates
in multiple higher-level groups. At that point, clients only really recover when
they update the emulation group, i.e. re-using somewhat old randomness of the
emulation group won’t provide real PCS in higher-level groups.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy considerations</name>
      <t>TODO: Specify the metadata hiding properties of the protocol. The details depend
on how we solve some of the problems described throughout this document.
However, using a virtual client should mask add/remove activity in the
underlying emulation group. If it actually hides the identity of the members may
depend on the details of the AS, as well as how we solve the application
messages problem.</t>
    </section>
    <section anchor="performance-considerations">
      <name>Performance considerations</name>
      <t>There are several use cases, where a specific group of clients represents a
higher-level entity such as a user, or a part of an organization. If that group
of clients shares membership in a large number of groups, where its sole purpose
is to represent the higher-level entity, then instead emulating a virtual client
can yield a number of performance benefits, especially if this strategy is
employed across an implementation. Generally, the more emulator clients are
hidden behind a single virtual client and the more clients are replaced by
virtual clients, the higher the potential performance benefits.</t>
      <section anchor="smaller-trees">
        <name>Smaller Trees</name>
        <t>As a general rule, groups where one or more sets of clients are replaced by
virtual clients have fewer members, which leads to cheaper MLS operations where
the cost depends on the group size, e.g., commits with a path, the download size
of the group state for new members, etc. This increase in performance can offset
performance penalties, for example, when using a PQ-secure cipher suite, or if
the application requires high update frequencies (deniability).</t>
      </section>
      <section anchor="fewer-blanks">
        <name>Fewer blanks</name>
        <t>Blanks are typically created in the process of client removals. With virtual
clients, the removal of an emulator client will not cause the leaf of the
virtual client (or indeed any node in the virtual client’s direct path) to be
blanked, except if it is the last remaining emulator client. As a result,
fluctuation in emulator clients does not necessarily lead to blanks in the group
of the corresponding virtual clients, resulting in fewer overall blanks and
better performance for all group members.</t>
      </section>
    </section>
    <section anchor="emulation-costs">
      <name>Emulation costs</name>
      <t>From a performance standpoint, using virtual clients only makes sense if the
performance benefits from smaller trees and fewer blanks outweigh the
performance overhead incurred by emulating the virtual client in the first
place.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="I-D.ietf-mls-extensions">
        <front>
          <title>The Messaging Layer Security (MLS) Extensions</title>
          <author fullname="Raphael Robert" initials="R." surname="Robert">
            <organization>Phoenix R&amp;D</organization>
          </author>
          <date day="21" month="July" year="2025"/>
          <abstract>
            <t>   The Messaging Layer Security (MLS) protocol is an asynchronous group
   authenticated key exchange protocol.  MLS provides a number of
   capabilities to applications, as well as several extension points
   internal to the protocol.  This document provides a consolidated
   application API, guidance for how the protocol's extension points
   should be used, and a few concrete examples of both core protocol
   extensions and uses of the application API.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-mls-extensions-08"/>
      </reference>
      <reference anchor="I-D.draft-mcmillion-mls-subgroups">
        <front>
          <title>MLS Subgroups</title>
          <author fullname="Brendan McMillion" initials="B." surname="McMillion">
         </author>
          <date day="19" month="March" year="2024"/>
          <abstract>
            <t>   This document describes how the user of an MLS-based messaging
   service can synchronize the operation of its devices, such that they
   behave as a single virtual MLS client.  This prevents other users of
   the messaging service from being able to tell when a user changes its
   set of authorized devices, or which device the user sent a message
   from.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-mcmillion-mls-subgroups-00"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA41c644ct5X+z6fgWsB6Buju9SrOj4w3i4w1sqXYjhWNbBkI
sjPsKvY0repip1g1rbYgQ68RIHk5PcmeG1msS8vyH0tdVeS5n+8cHmq5XKrW
tZW90N99e61/dE3bmUo/qpyt26DMet3Ye3j24yNV+qI2O3ixbMymXb7y23Xj
Xy13VVje82fLgj9bfva5Kkxr73xzvNCu3nil3L650G3ThfbhZ5/94bOHyjTW
XOhrW3SNa4/qlT0efFNe6Kd1a5vatssr3Eap0Jq6vDGVr2Hrow1q7y7031pf
LHTwTdvYTYA/HXf4h78rZbp265sLpZcadg4X+s8rfVkdbK00/Gd3xlUX2uAP
P/s/mZ35xderwu/6979Z6W+YNfqCWf7G140pBw98c2dq94tpna8v9LOtt7V7
rZ//51W+0Sv6biWy+lNpWhO2javtqrT9ls9X+rlf26bNdnxu9ltjq/zBR+3o
bLv5U8MfN/QtsaeWy6U269A2pgChvti6oEGh3Q70pUsbisatbdBG7yzIr9Tt
1rQgpsofgt51Vev2lSULERXr1sOOXQVa1kaJ/rMXQOg6/sq/TFbjz32TL/mz
d3VbHdXeNK0r3B6Xd7U2NS191/hur7u6tA1QGlx9B8tU1mxW+srubV3CL9rX
QLxFntxdrf0G/6bMfl+5giS3GNEVdAHLb22111tXWhSAQT3BpqV2u33j763e
22bjm52pC7tiWe5cWVZWqQdosI0vuwIXR8mynOA7sFFf6Y0pXOVa4AR28rtd
Vwshem3bg7V1pGOhD1vbZPwq4nehrSm2UYigtsbuGxvgL7bU6yMxizJA8R22
Dl51rd76qgz0aN+4e5Qi+JfawR8aZ6oV0AwPMxOAvfFVv/fB0me1JxJBfGas
RzINF5ToKpoBEWNER/DdWL2RPeJm9FD19AKdOtKpa1vYEExzRObAcLXhl4YU
rVjqHZA+R+/Y7koXWlfDYpndrW0uVkWcZPY1tsGVJgcC88RYhbuGLcSzUrjf
2R04Xti6vULzAatCz6rtQR/MUYMh6cweaX/wSzCgDsRDK4Cw0ChnrE+hVfbG
Gvdjk0WyQMCbjQXu2PKjVMY2X5K/BFWZ5s6CEkHXW39A0wG+iDrg5ixYq9+8
yYl9+/YcxP2SpFh0AYi3xRYtGpbegqRtfYfMApHRmgxYfV00FmwwFFu7s4PY
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

-->

</rfc>
