<?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"?>
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="4"?>
<?rfc compact="yes"?>
<?rfc subcompact="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc iprnotified="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" category="std" consensus="true" docName="draft-ietf-calext-jscontact-vcard-10" ipr="pre5378Trust200902" tocInclude="true" tocDepth="4" sortRefs="true" symRefs="true" updates="6350" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.10 -->
  <front>
    <title abbrev="jscontact-vcard">JSContact: Converting from and to vCard</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-calext-jscontact-vcard-10"/>
    <author fullname="Mario Loffredo" initials="M." surname="Loffredo">
      <organization>IIT-CNR/Registro.it</organization>
      <address>
        <postal>
          <street>Via Moruzzi,1</street>
          <city>Pisa</city>
          <country>IT</country>
          <code>56124</code>
        </postal>
        <email>mario.loffredo@iit.cnr.it</email>
        <uri>https://www.iit.cnr.it</uri>
      </address>
    </author>
    <author fullname="Robert Stepanek" initials="R." surname="Stepanek">
      <organization>Fastmail</organization>
      <address>
        <postal>
          <street>PO Box 234, Collins St West</street>
          <city>Melbourne</city>
          <country>AU</country>
          <code>VIC 8007</code>
        </postal>
        <email>rsto@fastmailteam.com</email>
        <uri>https://www.fastmail.com</uri>
      </address>
    </author>
    <date year="2023" month="July" day="3"/>
    <area>Applications</area>
    <workgroup>calext</workgroup>
    <keyword>JSON</keyword>
    <keyword>contacts</keyword>
    <keyword>vCard</keyword>
    <keyword>jCard</keyword>
    <abstract>
      <t>This document defines how to convert contact information between the JSContact and vCard data formats.  To achieve this, it updates RFC I-D.ietf-calext-jscontact (JSContact) by registering new JSContact properties.  Similarly, it updates RFC 6350 (vCard) by registering new vCard properties and parameters.</t>
    </abstract>
  </front>
  <middle>
    <section>
      <name>Introduction</name>
      <section>
        <name>Motivation</name>
        <t>The JSContact data model and format <xref target="I-D.ietf-calext-jscontact"/> aims to be an alternative to the widely used vCard <xref target="RFC6350"/> standard and jCard <xref target="RFC7095"/>.</t>
        <t>While applications might prefer JSContact to exchange contact card data with other systems, they are likely to interoperate with services and clients that only support vCard or jCard.  Similarly, existing contact data providers and consumers already using vCard or jCard might want to represent their contact data also in JSContact.</t>
        <t>To achieve this, this document defines standard rules to convert contact data between JSContact and vCard (and consequently jCard). </t>
      </section>
      <section anchor="notational-conventions" numbered="true" toc="default">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      </section>
      <section anchor="abnf-notations">
        <name>ABNF Notations</name>
        <t>The ABNF definitions in this document use the notations of <xref target="RFC5234"/>. ABNF rules not defined in this document either are defined in <xref target="RFC5234"/> (such as the ABNF for CRLF, WSP, DQUOTE, VCHAR, ALPHA, and DIGIT) or <xref target="RFC6350"/>.
    </t>
      </section>
    </section>
    <section anchor="vcard-jscontact-conversion">
      <name>Converting vCard to JSContact</name>
      <t>This section contains the conversion rules from vCard to JSContact Card.  It follows the same structure as the <xref target="RFC6350">vCard v4</xref>.  Properties and parameters of vCard extension RFCs, including the <xref target="I-D.ietf-calext-vcard-jscontact-extensions">vCard JSContact Extension</xref> are added to appropriate subsections.</t>
      <section>
        <name>General rules</name>
        <section>
          <name>The <tt>uid</tt> property</name>
          <t>The UID property in vCard is optional, but the <tt>uid</tt> property in JSContact is mandatory.  Implementations that convert a vCard without UID property <bcp14>MUST</bcp14> generate a unique identifier as a value for the <tt>uid</tt> property.  This value <bcp14>SHOULD</bcp14> be the same when converting the same vCard multiple times, but how to achieve this is implementation-specific.</t>
        </section>
        <section>
          <name>Choosing identifiers</name>
          <t>Multivalued properties in JSContact typically are represented as a JSON object where the object keys are of the <tt>Id</tt> type and the object values are the converted vCard property.  In absence of the PROP-ID parameter (see <xref target="vcard-param-propid"/>), implementations are free to choose any identifier for such entries.  Whatever identifier generation scheme implementations use, they <bcp14>MUST</bcp14> generate values that are valid according to the definition of the <tt>Id</tt> type in <xref target="I-D.ietf-calext-jscontact"/>.  For example, this could be an incrementing number across all <tt>Id</tt>s or only unique within one JSON object.</t>
        </section>
      </section>
      <section anchor="vcard-types">
        <name>vCard Value Data Types</name>
        <section>
          <name>BOOLEAN</name>
          <t>This converts to the JSContact <tt>Boolean</tt> type.</t>
        </section>
        <section anchor="vcard-type-datetime">
          <name>DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP</name>
          <t>The TIMESTAMP type generally converts to the <tt>UTCDateTime</tt>. It converts to the <tt>Timestamp</tt> type for anniversaries.</t>
          <t>The DATE type converts to the <tt>PartialDate</tt> type, which only is relevant for anniversaries.  This does not apply to DATE values that only define a month or a day.</t>
          <t>The TIME, DATE-TIME, DATE-AND-OR-TIME types and DATE type values that only define a month or day do not convert to a JSContact datetime type.  Instead, vCard properties or parameters having such values convert to the properties defined in <xref target="new-jscontact"/>.</t>
        </section>
        <section>
          <name>INTEGER</name>
          <t>This converts to the JSContact <tt>Int</tt> and <tt>UnsignedInt</tt> types.</t>
        </section>
        <section>
          <name>FLOAT</name>
          <t>This converts to the JSContact <tt>Number</tt> type.</t>
        </section>
        <section>
          <name>LANGUAGE-TAG</name>
          <t>This converts to the JSContact <tt>String</tt> type.</t>
        </section>
        <section>
          <name>TEXT</name>
          <t>This converts to the JSContact <tt>String</tt> type.</t>
        </section>
        <section>
          <name>URI</name>
          <t>This converts to the JSContact <tt>String</tt> type.</t>
        </section>
        <section>
          <name>UTC-OFFSET</name>
          <t>This either converts to a <tt>String</tt> containing an IANA TimeZone Database entry name (see <xref target="vcard-prop-tz"/>), or it does not convert to any JSContact type.  For the latter, vCard properties or parameters having such values <bcp14>MAY</bcp14> convert to JSContact as defined in <xref target="new-jscontact"/>. </t>
        </section>
      </section>
      <section anchor="vcard-parameters">
        <name>vCard Parameters</name>
        <t>This section contains the conversion rules for vCard parameters.  A rule typically only applies for specific vCard properties.  To convert a vCard parameter on an arbitrary vCard property, see <xref target="jscontact-prop-vcardparams"/>.</t>
        <section anchor="vcard-param-altid">
          <name>ALTID</name>
          <t>This does not convert to an IANA-registered property in JSContact, but several conversion rules make use of this parameter to combine multiple vCard properties into a single JSContact object instance.  For an example of this see <xref target="vcard-prop-adr"/>.  To preserve the verbatim value of the ALTID parameter, set the JSContact properties defined in <xref target="new-jscontact"/>.</t>
        </section>
        <section anchor="vcard-param-author">
          <name>AUTHOR</name>
          <t>The AUTHOR parameter value of a vCard NOTE property converts to the <tt>uri</tt> property of the Author object for this note.</t>
          <t>Note: This parameter is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-param-author-name">
          <name>AUTHOR-NAME</name>
          <t>The AUTHOR-NAME parameter value of a vCard NOTE property converts to the <tt>name</tt> property of the Author object for this note.</t>
          <t>Note: This parameter is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-param-calscale">
          <name>CALSCALE</name>
          <t>This parameter set on a BDAY, DEATHDATE or ANNIVERSARY property converts to the <tt>calendarScale</tt> property of the <tt>PartialDate</tt> object type.</t>
        </section>
        <section anchor="vcard-param-created">
          <name>CREATED</name>
          <t>The CREATED parameter value of a vCard NOTE property converts to the <tt>created</tt> property of the Note object.</t>
          <t>Note: This parameter is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-param-derived">
          <name>DERIVED</name>
          <t>If this parameter is set to <tt>true</tt> on a vCard property, then implementations <bcp14>MAY</bcp14> choose to not convert that property.  Note: This parameter is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-param-fmt">
          <name>FMT</name>
          <t>This parameter set on an N or ADR property converts to the <tt>defaultSeparator</tt> and <tt>components</tt> properties of the Name and Address object types, respectively.</t>
          <t>If the first FMT parameter value is a separator formatting instruction (possibly having the empty string as separator), then this separator value converts to the value <tt>defaultSeparator</tt> property.  Otherwise, the <tt>defaultSeparator</tt> property is not set.</t>
          <t>The remaining formatting instructions define the order and kind of the <tt>components</tt> property entries.  The kind of a NameComponent or AddressComponent is determined by the type of the name or address component at the position of the positional formatting instruction, the separator formatting instruction converts to a component of kind <tt>separator</tt>.</t>
          <t>In absence of the FMT parameter, implementations <bcp14>MUST</bcp14> convert all property component values of the N or ADR property in the Name or Address components, but their order is implementation-specific.</t>
        </section>
        <section anchor="vcard-param-geo">
          <name>GEO</name>
          <t>This parameter set on an ADR property converts to the JSContact <tt>coordinates</tt> property of the <tt>Address</tt> object that represents the vCard ADR.</t>
        </section>
        <section anchor="vcard-param-group">
          <name>GROUP</name>
          <t>This parameter exclusively is for use in jCard (see <xref target="RFC7095" section="7.1"/>).  It <bcp14>MUST NOT</bcp14> be set in a vCard.  Preserving the exact group name when converting from vCard to JSContact and back to vCard is not necessary.  Any group identifiers will do, as long as the resulting vCard groups its  properties equally to the original vCard.  Implementations that still wish to preserve the exact property group name of a vCard property <bcp14>MAY</bcp14> set the <tt>group</tt> parameter in the JSContact properties <tt>vCardProps</tt> or <tt>vCardParams</tt> defined in <xref target="new-jscontact"/>.</t>
          <figure anchor="group_conversion_params">
            <name>An example how to preserve the group name in <tt>vCardParams</tt> during conversion.</name>
            <artwork><![CDATA[
item1.TEL;VALUE=uri:tel:+1-555-555-5555

"phones": {
  "p1": {
    "number": "tel:+1-555-555-5555",
    "vCardParams" : {
     "group" : "item1"
    }
  }
}
]]></artwork>
          </figure>
          <figure anchor="group_conversion_props">
            <name>An example how to preserve the group name in <tt>vCardProps</tt> during conversion.</name>
            <artwork><![CDATA[
item2.X-FOO:bar

"vCardProps": [
  ["x-foo", {
    "group": "item2"
  }, "unknown", "bar"]
]
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-param-index">
          <name>INDEX</name>
          <t>This parameter set on the EXPERTISE, HOBBY, INTEREST and ORG-DIRECTORY properties defined in <xref target="RFC6715"/> converts to the JSContact <tt>listAs</tt> property of the <tt>PersonalInfo</tt> and <tt>Directory</tt> objects.</t>
        </section>
        <section anchor="vcard-param-language">
          <name>LANGUAGE</name>
          <t>This converts to an entry in the <tt>localizations</tt> property for the vCard property that this parameter is set on.  The value of the LANGUAGE parameter defines the language tag key in the <tt>localizations</tt> property.</t>
          <t>This specification does not define a single standard conversion rule for how to convert the property values.  Instead, building the localizations value is implementation-specific.</t>
          <t>Two options to populate the localizations property are:</t>
          <ul>
            <li>One Patch Per Property: For each vCard property with a LANGUAGE parameter, set the complete path in the PatchObject to the JSContact property that the vCard property converts to.  The value of the patch is the converted property value.  This is simple to process and adequate if the vCard only contains a few properties with LANGUAGE parameter.</li>
            <li>Bundle Patches by Parent: If a PatchObject contains multiple paths that have the same parent paths, then it might be possible to combine these patches into one patch that patches the parent property.  This is possible if the property in the Card is patched in its entirety.</li>
          </ul>
          <t>Generally, localizations only localize properties that are present in the non-localized version of this Card.  <xref target="language-patch-dominant-language"/> illustrates this.</t>
          <figure anchor="language-patch-dominant-language">
            <name>LANGUAGE conversion example: one dominant language</name>
            <artwork><![CDATA[
FN;LANGUAGE=EN:John Doe
TITLE;LANGUAGE=EN:Boss
TITLE;LANGUAGE=fr:Patron

"language": "en",
"name": {
  "full": "John Doe"
},
"titles": {
  "t1": {
    "name": "Boss"
  }
},
"localizations": {
  "fr": {
    "titles/t1/name": "Patron"
  }
}
]]></artwork>
          </figure>
          <t>As a special case, if one or more vCard properties of the same type do not have the LANGUAGE parameter set, then choose them to the non-localized Card.  Convert any with LANGUAGE parameters to the localizations property.  <xref target="language-patch-no-language"/> illustrates this.</t>
          <figure anchor="language-patch-no-language">
            <name>LANGUAGE conversion example: property without language</name>
            <artwork><![CDATA[
FN:John Doe
TITLE:Boss
TITLE;LANGUAGE=fr:Patron

"name": {
  "full": "John Doe"
},
"titles": {
  "t1": {
    "name": "Boss"
  }
},
"localizations": {
  "fr": {
    "titles/t1/name": "Patron"
  }
}
]]></artwork>
          </figure>
          <t>As the least preferred option, <xref target="language-patch-no-dominant"/> illustrates how all vCard properties of the same type have the LANGUAGE parameter set, but none of their language tags match the language of the main Card.  In this case, implementations <bcp14>MAY</bcp14> choose to add the localized vCard properties only to the localizations object.</t>
          <t>The following example uses non-ASCII characters to demonstrate multilingual content.  The ASCII-formatted version of this specification might not show the correct characters.  Please refer to the HTML or PDF versions instead.</t>
          <figure anchor="language-patch-no-dominant">
            <name>LANGUAGE conversion example: conflicting DEFLANGUAGE and LANGUAGE</name>
            <artwork><![CDATA[
DEFLANGUAGE:es
FN:Gabriel García Márquez
TITLE;LANGUAGE=en:Boss
TITLE;LANGUAGE=fr:Patron

"language": "es",
"name" {
  "full": "Gabriel García Márquez"
},
"localizations": {
  "en": {
    "titles": {
      "t1": {
        "name": "Novelist"
      }
  },
  "fr": {
    "titles": {
      "t1": {
        "name": "Écrivain"
      }
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-param-level">
          <name>LEVEL</name>
          <t>The LEVEL parameter as defined in <xref target="RFC6715"/> is directly converted to the <tt>level</tt> property of the <tt>PersonalInfo</tt> type apart from when LEVEL is used in the EXPERTISE property; in this case, the values convert as in the following:
      </t>
          <ul spacing="compact">
            <li>"beginner" converts to "low";</li>
            <li>"average" converts to "medium";</li>
            <li>"expert" converts to "high".</li>
          </ul>
        </section>
        <section anchor="vcard-param-mediatype">
          <name>MEDIATYPE</name>
          <t>This converts to the <tt>mediaType</tt> property of the <tt>Resource</tt> object type.</t>
        </section>
        <section anchor="vcard-param-pid">
          <name>PID</name>
          <t>This converts to an entry in the <tt>vCardParams</tt> property, see <xref target="jscontact-prop-vcardparams"/>.</t>
        </section>
        <section anchor="vcard-param-pref">
          <name>PREF</name>
          <t>This converts to the <tt>pref</tt> property.</t>
        </section>
        <section anchor="vcard-param-propid">
          <name>PROP-ID</name>
          <t>The PROP-ID parameter value of a vCard property converts to the <tt>Id</tt> of the JSContact property to which the vCard property converts.</t>
          <figure anchor="propid_conversion">
            <name>PROP-ID conversion example</name>
            <artwork><![CDATA[
TEL;PROP-ID=PHONE-A;VALUE=uri;PREF=1;TYPE="voice,home"
  :tel:+1-555-555-5555;ext=5555
TEL;PROP-ID=PHONE-B;VALUE=uri;TYPE=home
  :tel:+33-01-23-45-67

"phones": {
  "PHONE-A": {
    "contexts": { "private": true },
    "features": { "voice": true },
    "number": "tel:+1-555-555-5555;ext=5555",
    "pref": 1
  },
  "PHONE-B": {
    "contexts": { "private": true },
    "number": "tel:+33-01-23-45-67"
  }
}
]]></artwork>
          </figure>
          <t>Note: This parameter is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-param-service-type">
          <name>SERVICE-TYPE</name>
          <t>This converts to the <tt>service</tt> property of the <tt>OnlineService</tt> object type.  Note: This parameter is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-param-sortas">
          <name>SORT-AS</name>
          <t>This converts to the <tt>sortAs</tt> properties defined for the <tt>Name</tt>, <tt>Organization</tt> and <tt>OrgUnit</tt> object types.</t>
        </section>
        <section anchor="vcard-param-type">
          <name>TYPE</name>
          <t>This converts to the <tt>contexts</tt> property as well as property-specific <tt>kind</tt> property values defined in later sections. If not specified otherwise for a specific JSContact property, the vCard <tt>home</tt> and <tt>work</tt> parameter values convert to the JSContact <tt>private</tt> and <tt>work</tt> contexts, respectively.</t>
        </section>
        <section anchor="vcard-param-tz">
          <name>TZ</name>
          <t>This parameter set on an ADR property converts to the JSContact <tt>timeZone</tt> property of the <tt>Address</tt> object that represents the vCard ADR.  Also see the conversion of the TZ property in <xref target="vcard-prop-tz"/>.</t>
        </section>
        <section anchor="vcard-param-username">
          <name>USERNAME</name>
          <t>This converts to the <tt>user</tt> property of the <tt>OnlineService</tt> object type.  Note: This parameter is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-param-value">
          <name>VALUE</name>
          <t>This does not convert to an IANA-registered property in JSContact.  To preserve properties with experimental values, see <xref target="jscontact-prop-vcardparams"/> and <xref target="jscontact-prop-vcardprops"/>.</t>
        </section>
      </section>
      <section>
        <name>General Properties</name>
        <section>
          <name>BEGIN and END</name>
          <t>These do not convert to IANA-registered properties in JSContact.</t>
        </section>
        <section anchor="vcard-prop-kind">
          <name>KIND</name>
          <t>The KIND property converts to the <tt>kind</tt> property (<xref target="kind_conversion"/>).  Allowed values are those described in Section 6.1.4 of <xref target="RFC6350"/> and extended with the values declared in <xref target="RFC6473"/> and <xref target="RFC6869"/>.</t>
          <figure anchor="kind_conversion">
            <name>KIND conversion example</name>
            <artwork><![CDATA[
KIND:individual

"kind": "individual"
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-source">
          <name>SOURCE</name>
          <t>A SOURCE property converts to an entry in the <tt>directories</tt> property (<xref target="source_conversion"/>).  The entry value is a <tt>Directory</tt> object whose <tt>kind</tt> property is set to <tt>entry</tt> and <tt>uri</tt> property is set to the SOURCE value.</t>
          <t>The PREF and MEDIATYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="source_conversion">
            <name>SOURCE conversion example</name>
            <artwork><![CDATA[
SOURCE:https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf

"directories": {
   "ENTRY-1": {
     "kind": "entry",
     "uri": "https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf"
   }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-xml">
          <name>XML</name>
          <t>This converts to an entry in the <tt>vCardProps</tt> property, see <xref target="jscontact-prop-vcardprops"/>.</t>
        </section>
      </section>
      <section>
        <name>Identification Properties</name>
        <section anchor="vcard-prop-anniversary">
          <name>BDAY, BIRTHPLACE, DEATHDATE, DEATHPLACE, ANNIVERSARY</name>
          <t>The BDAY and ANNIVERSARY properties and the extensions BIRTHPLACE, DEATHDATE, DEATHPLACE described in <xref target="RFC6474"/> are represented as <tt>Anniversary</tt> objects included in the <tt>anniversaries</tt> property (<xref target="anniversary_conversion"/>):</t>
          <ul spacing="compact">
            <li>
              <t>BDAY and BIRTHPLACE convert to <tt>date</tt> and <tt>place</tt> where <tt>kind</tt> is set to "birth";</t>
              <t/>
            </li>
            <li>
              <t>DEATHDATE and DEATHPLACE convert to <tt>date</tt> and <tt>place</tt> where <tt>kind</tt> is set to "death";</t>
              <t/>
            </li>
            <li>ANNIVERSARY converts to <tt>date</tt> where <tt>kind</tt> is "wedding".</li>
          </ul>
          <t>Both birth and death places are represented as instances of the <tt>Address</tt> object.</t>
          <t>The BIRTHPLACE and DEATHPLACE properties that are represented as geo URIs convert to <tt>Address</tt> instances including only the <tt>coordinates</tt> property.  If the URI value is not a geo URI, the place is ignored.</t>
          <t>The ALTID and LANGUAGE parameters of both BIRTHPLACE and DEATHPLACE properties convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="anniversary_conversion">
            <name>BDAY, BIRTHPLACE, DEATHDATE, DEATHPLACE, ANNIVERSARY conversion example</name>
            <artwork><![CDATA[
BDAY:19531015T231000Z
BIRTHPLACE:
 123 Main Street\nAny Town, CA 91921-1234\nU.S.A.
DEATHDATE:19960415
DEATHPLACE:
 5 Court Street\nNew England, ND 58647\nU.S.A.
ANNIVERSARY:19860201

"anniversaries": {
  "ANNIVERSARY-1" : {
    "kind": "birth",
    "date": {
      "@type": "Timestamp",
      "utc": "1953-10-15T23:10:00Z"
    },
    "place": {
      "full":
         "123 Main Street\nAny Town, CA 91921-1234\nU.S.A."
    }
  },
  "ANNIVERSARY-2" : {
    "kind": "death",
    "date": {
      "year": 1996,
      "month": 4,
      "year": 15
    },
    "place": {
      "full": "5 Court Street\nNew England, ND 58647\nU.S.A."
    }
  },
  "ANNIVERSARY-3" : {
    "kind": "wedding",
    "date": {
      "year": 1986,
      "month": 2,
      "day": 1
    }
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-gender">
          <name>GENDER</name>
          <t>This does not map to an IANA-registered property in JSContact.  To convert this property, see <xref target="jscontact-prop-vcardprops"/>.  Note the alternative JSContact <tt>speakToAs</tt> property which defines how to address and refer to an individual represented by the card, as do the newly defined vCard GRAMGENDER and PRONOUNS properties of <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-prop-gramgender">
          <name>GRAMGENDER and PRONOUNS</name>
          <t>The GRAMGENDER property converts to the <tt>grammaticalGender</tt> property of the <tt>SpeakToAs</tt> object (<xref target="grammatical_gender_pronouns_conversion"/>).</t>
          <t>The PRONOUNS property converts to an entry in the <tt>pronouns</tt> property of the <tt>SpeakToAs</tt> object (<xref target="grammatical_gender_pronouns_conversion"/>).</t>
          <figure anchor="grammatical_gender_pronouns_conversion">
            <name>GRAMGENDER and PRONOUNS conversion example</name>
            <artwork><![CDATA[
GRAMGENDER:NEUTER
PRONOUNS;PREF=2:they/them
PRONOUNS;PREF=1:xe/xir

"speakToAs": {
  "grammaticalGender": "neuter",
  "pronouns": {
    "PRONOUNS-1": {
      "pronouns": "they/them",
      "pref": 2
    },
    "PRONOUNS-2": {
      "pronouns": "xe/xir",
      "pref": 1
    }
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-fn">
          <name>FN</name>
          <t>All the FN instances are represented through the Name object <tt>full</tt> property (<xref target="fn_n_nickname_conversion"/>).  The presence of multiple instances is implicitly associated with the full name translation in various languages regardless of the presence of the ALTID parameter.  Each translation converts according to the rules as defined in <xref target="vcard-parameters"/>.</t>
        </section>
        <section anchor="vcard-prop-n">
          <name>N and NICKNAME</name>
          <t>The N instances convert to equivalent items of the <tt>components</tt> array of the <tt>name</tt> property (<xref target="fn_n_nickname_conversion"/>): the N components convert into related <tt>NameComponent</tt> objects as presented in <xref target="n_components"/>.</t>
          <t>The order of entries in the <tt>components</tt> property is defined by the <xref target="vcard-param-fmt">FMT</xref> parameter.</t>
          <t>Each comma-separated item of the SORT-AS parameter value converts to an entry of the <tt>sortAs</tt> property where the key is the "kind" value related to the sorted N component and the value is the corresponding item.  Absence of a key in the <tt>sortAs</tt> indicates that its related part in the SORT-AS parameter value <bcp14>MUST</bcp14> either the empty string followed by COMMA, or no further SORT-AS parts are defined.</t>
          <table anchor="n_components">
            <name>N components conversion</name>
            <thead>
              <tr>
                <th align="left">N component</th>
                <th align="left">"kind" value</th>
                <th align="left">Remarks</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Honorific Prefixes</td>
                <td align="left">title</td>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">Given Names</td>
                <td align="left">given</td>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">Family Names</td>
                <td align="left">surname, surname2</td>
                <td align="left">The first Family Names item converts to the "surname" NameComponent kind, any additional items to the "surname2" kind.</td>
              </tr>
              <tr>
                <td align="left">Additional Names</td>
                <td align="left">middle</td>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">Honorific Suffixes</td>
                <td align="left">credential, generation</td>
                <td align="left">vCard does not distinguish between generation qualifiers (such as "Jr.") and credentials (such as "Esq.").  Distinguishing these is language-specific and left to implementations. For example, United States names uses generational qualifiers such as "Jr.", "Sr.", French uses "père" (father) and "fils" (son).  Roman numerals such as "III" and "XIV" typically also are generational qualifiers.</td>
              </tr>
            </tbody>
          </table>
          <t>A NICKNAME property converts to an entry in the <tt>nickNames</tt> property (<xref target="fn_n_nickname_conversion"/>).  The entry value is a <tt>NickName</tt> object.  The <tt>name</tt> property is set to the NICKNAME value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="fn_n_nickname_conversion">
            <name>FN, N, NICKNAME conversion example</name>
            <artwork><![CDATA[
FN:John Q. Public, Esq.
N;SORT-AS="Public,John":Public;John;Quinlan;Mr.;Esq.
NICKNAME:Johnny

"name": {
  "full": "Mr.  John Q.  Public, Esq.",
  "components":[
    { "kind": "title", "value": "Mr." },
    { "kind": "given", "value": "John Q." },
    { "kind": "surname", "value": "Public" },
    { "kind": "middle", "value": "Quinlan" },
    { "kind": "credential", "value": "Esq." }
  ],
  "sortAs": {
    "surname": "Public",
    "given": "John"
  }
},
"nickNames": {
   "NICK-1": {
    "name": "Johnny"
   }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-photo">
          <name>PHOTO</name>
          <t>A PHOTO property converts to an entry in the <tt>media</tt> property (<xref target="photo_conversion"/>).  The entry value is a <tt>Media</tt> object whose <tt>kind</tt> property is set to <tt>photo</tt> and <tt>uri</tt> property is set to the PHOTO value.</t>
          <t>The PREF and MEDIATYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="photo_conversion">
            <name>PHOTO conversion example</name>
            <artwork><![CDATA[
PHOTO:https://www.example.com/pub/photos/jqpublic.gif

"media": {
   "PHOTO-1": {
     "kind": "photo",
     "uri": "https://www.example.com/pub/photos/jqpublic.gif"
   }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Delivery Addressing Properties</name>
        <section anchor="vcard-prop-adr">
          <name>ADR</name>
          <t>An ADR property converts to an entry in the <tt>addresses</tt> property (<xref target="adr_conversion"/>).  The entry value is an <tt>Address</tt> object.  The components of the structured ADR value type convert to AddressComponent objects.</t>
          <t>The order of entries in the <tt>components</tt> property is defined by the <xref target="vcard-param-fmt">FMT</xref> parameter.</t>
          <t><xref target="I-D.ietf-calext-vcard-jscontact-extensions"/> defines additional components of the ADR property value, originally defined in <xref target="RFC6350" section="6.3.1"/>.  Applications <bcp14>SHOULD</bcp14> prefer converting these new address components over any entries in the ADR "street address" and "extended address" components.  If only the original address components defined in <xref target="RFC6350"/> are available, then implementations <bcp14>SHOULD</bcp14> attempt to split the values of the "street address" and "extended address" components into their constituent parts.  Otherwise, they <bcp14>MUST</bcp14> convert all of "street address" to AddressComponent kind <tt>name</tt>, and "extended address" to AddressComponent kind "apartment".</t>
          <table anchor="adr_components_vs_street_component_items">
            <name>ADR component to AddressComponent conversion</name>
            <thead>
              <tr>
                <th align="left">ADR component</th>
                <th align="left">Single AddressComponent</th>
                <th align="left">Combination of AddressComponent</th>
                <th align="left">Remarks</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">post office box</td>
                <td align="left">postOfficeBox</td>
                <td align="left"/>
                <td align="left"><xref target="RFC6350" section="6.3.1"/> recommends this ADR component to be empty.</td>
              </tr>
              <tr>
                <td align="left">extended address</td>
                <td align="left">apartment</td>
                <td align="left">apartment, building, floor, room</td>
                <td align="left"><xref target="RFC6350" section="6.3.1"/> recommends this ADR component to be empty.</td>
              </tr>
              <tr>
                <td align="left">street address</td>
                <td align="left">name</td>
                <td align="left">name, district, subdistrict, block, name, number, landmark, direction, apartment, building, floor, room</td>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">locality</td>
                <td align="left">locality</td>
                <td align="left"/>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">region</td>
                <td align="left">region</td>
                <td align="left"/>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">postal code</td>
                <td align="left">postalCode</td>
                <td align="left"/>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">apartment</td>
                <td align="left">apartment</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>. Prefer this over the extended address ADR component.</td>
              </tr>
              <tr>
                <td align="left">block</td>
                <td align="left">block</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</td>
              </tr>
              <tr>
                <td align="left">building</td>
                <td align="left">building</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</td>
              </tr>
              <tr>
                <td align="left">direction</td>
                <td align="left">direction</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</td>
              </tr>
              <tr>
                <td align="left">district</td>
                <td align="left">district</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</td>
              </tr>
              <tr>
                <td align="left">floor</td>
                <td align="left">floor</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>. Prefer this over the extended address ADR component.</td>
              </tr>
              <tr>
                <td align="left">landmark</td>
                <td align="left">landmark</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</td>
              </tr>
              <tr>
                <td align="left">room</td>
                <td align="left">room</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.  Prefer this over the extended address ADR component.</td>
              </tr>
              <tr>
                <td align="left">street number</td>
                <td align="left">number</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</td>
              </tr>
              <tr>
                <td align="left">subdistrict</td>
                <td align="left">subdistrict</td>
                <td align="left"/>
                <td>Defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</td>
              </tr>
            </tbody>
          </table>
          <t>The LABEL parameter converts to the <tt>full</tt> property.</t>
          <t>The GEO parameter converts to the <tt>coordinates</tt> property.</t>
          <t>The TZ parameter converts to the <tt>timeZone</tt> property.</t>
          <t>The CC parameter as defined in <xref target="RFC8605"/> converts to the <tt>countryCode</tt> property.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.  The ADR-specific values of the TYPE parameter defined in Sections 5.1 and 5.2 of <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/> convert to the corresponding entries of the <tt>contexts</tt> property as defined in Section 2.5.1 of <xref target="I-D.ietf-calext-jscontact"/>.</t>
          <t>The ALTID and LANGUAGE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.  Each possible language-dependent alternative is represented as an entry of the PatchObject map where the key references the <tt>full</tt> property.</t>
          <figure anchor="adr_conversion">
            <name>ADR conversion example</name>
            <artwork><![CDATA[
ADR;TYPE=work;CC=US:;;54321 Oak St;Reston;VA;20190;USA
ADR;TYPE=home;CC=US:;;12345 Elm St;Reston;VA;20190;USA

"addresses": {
  "ADDR-1" : {
    "contexts": { "work": true },
    "full": "54321 Oak St\nReston\nVA\n20190\nUSA",
    "components": [
      { "kind": "number", "value": "54321" },
      { "kind": "separator", "value": " " },
      { "kind": "name", "value": "Oak St" },
      { "kind": "locality", "value": "Reston" },
      { "kind": "region", "value": "VA" },
      { "kind": "postcode", "value": "20190" },
      { "kind": "country", "value": "USA" }
    ],
    "countryCode": "US",
    "defaultSeparator": "\n"
  },
  "ADDR-2": {
    "contexts": { "private": true },
    "full":  "12345 Elm St Reston VA 20190 USA",
    "components": [
      { "kind": "number", "value": "12345" },
      { "kind": "name", "value": "Elm St" },
      { "kind": "locality", "value": "Reston" },
      { "kind": "region", "value": "VA" },
      { "kind": "postcode", "value": "20190" },
      { "kind": "country", "value": "USA" }
    ],
    "countryCode": "US",
    "defaultSeparator": " "
  }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Communications Properties</name>
        <section anchor="vcard-prop-email">
          <name>EMAIL</name>
          <t>An EMAIL property converts to an entry in the <tt>emails</tt> property (<xref target="email_conversion"/>).  The entry value is an <tt>EmailAddress</tt> object.  The <tt>address</tt> property is set to the EMAIL value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="email_conversion">
            <name>EMAIL conversion example</name>
            <artwork><![CDATA[
EMAIL;TYPE=work:jqpublic@xyz.example.com
EMAIL;PREF=1:jane_doe@example.com

"emails": {
  "EMAIL-1": {
    "contexts": { "work": true },
    "address": "jqpublic@xyz.example.com"
  },
  "EMAIL-2": {
    "address": "jane_doe@example.com",
    "pref": 1
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-impp">
          <name>IMPP</name>
          <t>An IMPP property converts to an entry in the <tt>onlineServices</tt> property (<xref target="impp_conversion"/>).  The entry value is an <tt>OnlineService</tt> object.  The <tt>vCardName</tt> property is set to "impp" and the <tt>uri</tt> property is set to the IMPP value.</t>
          <t>The SERVICE-TYPE, USERNAME, PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="impp_conversion">
            <name>IMPP conversion example</name>
            <artwork><![CDATA[
IMPP;PREF=1:xmpp:alice@example.com

"onlineServices": {
  "OS-1": {
    "uri": "xmpp:alice@example.com",
    "pref": 1,
    "vCardName": "impp"
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-lang">
          <name>LANG</name>
          <t>A LANG property converts to an entry in the <tt>preferredLanguages</tt> property (<xref target="lang_conversion"/>).  The entry keys correspond to the language tags, the related entry values are arrays of <tt>LanguagePref</tt> objects.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <t>If both PREF and TYPE parameters are missing, the array of <tt>LanguagePref</tt> objects <bcp14>MUST</bcp14> be empty.</t>
          <figure anchor="lang_conversion">
            <name>LANG conversion example</name>
            <artwork><![CDATA[
LANG;TYPE=work;PREF=1:en
LANG;TYPE=work;PREF=2:fr
LANG;TYPE=home:fr

"preferredLanguages": {
  "en":[
    {
      "contexts": { "work": true },
      "pref": 1
    }
  ],
  "fr":[
    {
      "contexts": { "work": true },
      "pref": 2
    },
    {
      "contexts": { "private": true }
    }
  ]
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-deflanguage">
          <name>DEFLANGUAGE</name>
          <t>The DEFLANGUAGE property converts to the <tt>language</tt> property (<xref target="deflanguage_conversion"/>).</t>
          <figure anchor="deflanguage_conversion">
            <name>DEFLANGUAGE conversion example</name>
            <artwork><![CDATA[
DEFLANGUAGE:de-AT

"language": "de-AT"
]]></artwork>
          </figure>
          <t>Note: This property is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-prop-socialprofile">
          <name>SOCIALPROFILE</name>
          <t>A SOCIALPROFILE property converts to an entry in the <tt>onlineServices</tt> property (<xref target="socialprofile_conversion"/>).  The entry value is an <tt>OnlineService</tt> object.  The <tt>vCardName</tt> property is set to "socialprofile" or can be omitted.  If the value type of the SOCIALPROFILE is URI, the <tt>uri</tt> property is set to the SOCIALPROFILE value.  Otherwise, the <tt>user</tt> property is set to the SOCIALPROFILE value.</t>
          <t>The SERVICE-TYPE, USERNAME, PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="socialprofile_conversion">
            <name>SOCIALPROFILE conversion example</name>
            <artwork><![CDATA[
SOCIALPROFILE;SERVICE-TYPE=Mastodon:https://example.com/@foo

"onlineServices": {
  ...
  "OS-1": {
    "service": "Mastodon",
    "uri": "https://example.com/@foo"
  }
}
]]></artwork>
          </figure>
          <t>Note: This property is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-prop-tel">
          <name>TEL</name>
          <t>A TEL property converts to an entry in the <tt>phones</tt> property (<xref target="tel_conversion"/>).  The entry value is a <tt>Phone</tt> object.  The TEL-specific values of the TYPE parameter convert to the <tt>features</tt> property keys: the vCard <tt>cell</tt> parameter value converts to the JSContact <tt>mobile</tt> phone feature, the other parameter values convert to analogous phone features.  The <tt>number</tt> property is set to the TEL value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="tel_conversion">
            <name>TEL conversion example</name>
            <artwork><![CDATA[
TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+1-555-555-5555;ext=5555
TEL;VALUE=uri;TYPE=home:tel:+33-01-23-45-67

"phones": {
  "PHONE-1": {
    "contexts": { "private": true },
    "features": { "voice": true },
    "number": "tel:+1-555-555-5555;ext=5555",
    "pref": 1
  },
  "PHONE-2": {
    "contexts": { "private": true },
    "number": "tel:+33-01-23-45-67"
  }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Geographical Properties</name>
        <section anchor="vcard-prop-geo">
          <name>GEO</name>
          <t>This converts to the <tt>coordinates</tt> property of the <tt>Address</tt> object.  Also see <xref target="combine-geo-props"/> to determine which <tt>Address</tt> object instance to convert to.</t>
        </section>
        <section anchor="vcard-prop-tz">
          <name>TZ</name>
          <t>A value of type TEXT converts to the <tt>timeZone</tt> property in the <tt>Address</tt> object.</t>
          <t>A value of type UTC-OFFSET converts to the <tt>timeZone</tt> property in the <tt>Address</tt> object if the offset has zero minutes and the hour offset is in the range -12 &lt;= 14:</t>
          <ul>
            <li>If the hour offset is zero, use the time zone name <tt>Etc/UTC</tt>.</li>
            <li>Otherwise construct the time zone name with <tt>Etc/GMT</tt> suffixed with the string representation of the reversed sign hour offset, including the sign but excluding leading zeros and minutes.  For example, the UTC offset value <tt>-0500</tt> converts to <tt>Etc/GMT+5</tt>.</li>
          </ul>
          <t>For such property values, also see <xref target="combine-geo-props"/> to determine which <tt>Address</tt> object instance to convert to.</t>
          <t>Any other value of type UTC-OFFSET or URI does not convert to an IANA-registered property in JSContact.  To convert such property, see <xref target="jscontact-prop-vcardprops"/>.</t>
        </section>
        <section anchor="combine-geo-props">
          <name>Combining geographical properties</name>
          <t>In vCard the properties ADR, GEO and TZ occur independently of each other.  In JSContact, they all convert to properties of an <tt>Address</tt> object.  It is implementation-specific if these vCard properties convert to <em>separate</em> address instances in JSContact, or if some or all of them convert to the <em>same</em> address.  That being said, implementations <bcp14>MUST</bcp14> convert the properties to the <em>same</em> address for the following cases:</t>
          <ul>
            <li>The GROUP parameter values of the properties match.</li>
            <li>The GROUP parameters are not set, but are set on any other ADR, GEO and TZ properties.</li>
          </ul>
        </section>
      </section>
      <section>
        <name>Organizational Properties</name>
        <section anchor="vcard-prop-contact-uri">
          <name>CONTACT-URI</name>
          <t>A CONTACT-URI property as defined in <xref target="RFC8605"/> is represented as an entry of the <tt>links</tt> property (<xref target="contact_uri_conversion"/>).  The entry value is a <tt>Link</tt> object whose  <tt>kind</tt> property is set to <tt>contact</tt> and <tt>uri</tt> property is set to the CONTACT-URI value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="contact_uri_conversion">
            <name>CONTACT-URI conversion example</name>
            <artwork><![CDATA[
CONTACT-URI;PREF=1:mailto:contact@example.com

"links": {
  "CONTACT-1": {
    "kind": "contact",
    "uri": "mailto:contact@example.com",
    "pref": 1
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-logo">
          <name>LOGO</name>
          <t>A LOGO property converts to an entry in the <tt>media</tt> property (<xref target="logo_conversion"/>).  The entry value is a <tt>Media</tt> object whose <tt>kind</tt> property is set to <tt>logo</tt> and <tt>uri</tt> property is set to the LOGO value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="logo_conversion">
            <name>LOGO conversion example</name>
            <artwork><![CDATA[
LOGO:https://www.example.com/pub/logos/abccorp.jpg

"media": {
  "LOGO-1": {
    "kind": "logo",
    "uri": "https://www.example.com/pub/logos/abccorp.jpg"
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-member">
          <name>MEMBER</name>
          <t>The uids of the contact cards composing the group are included in the <tt>members</tt> property (<xref target="group_example"/>).</t>
          <t>In this case, the PREF parameter does not have a JSContact counterpart; however, the implementors <bcp14>MAY</bcp14> insert the map entries by order of preference.</t>
          <figure anchor="group_example">
            <name>Group example</name>
            <artwork><![CDATA[
KIND:group
FN:The Doe family
MEMBER:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af
MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519

"kind": "group",
"name": {
  "full": "The Doe family"
},
"uid": "urn:uuid:ab4310aa-fa43-11e9-8f0b-362b9e155667",
"members": {
  "urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af": true,
  "urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519": true
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-org">
          <name>ORG</name>
          <t>An ORG property converts to an entry in the <tt>organizations</tt> property (<xref target="org_conversion"/>).  The entry value is an <tt>Organization</tt> object whose <tt>name</tt> property contains the organizational name, and the <tt>units</tt> property is an array of <tt>OrgUnit</tt> objects each containing the organizational unit name in the <tt>name</tt> property.</t>
          <t>Implementations <bcp14>MAY</bcp14> allow representation of organizational units without the organizational name.  In this case, the first component of the ORG value <bcp14>MUST</bcp14> be an empty string (e.g.,  ORG:;DepartmentA).</t>
          <t>The ALTID, LANGUAGE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <t>The first item of the comma-separated SORT-AS parameter value converts to the <tt>sortAs</tt> property of the <tt>Organization</tt> object.  The subsequent items convert to the <tt>sortAs</tt> property of the corresponding <tt>OrgUnit</tt> object.</t>
          <t>The TYPE parameter converts according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="org_conversion">
            <name>ORG conversion example</name>
            <artwork><![CDATA[
ORG;SORT-AS="ABC":ABC\, Inc.;North American Division;Marketing

"organizations": {
  "ORG-1": {
    "name": "ABC, Inc.",
    "units":[
      { "name": "North American Division" },
      { "name": "Marketing" }
    ],
    "sortAs": "ABC"
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-related">
          <name>RELATED</name>
          <t>This converts to an entry in the <tt>relatedTo</tt> property (<xref target="related_conversion"/>).  The property value converts to the key in the <tt>relatedTo</tt> property.  The TYPE parameters convert to the <tt>relation</tt> of the <tt>Relation</tt> object value.  Any other parameters convert as defined in <xref target="jscontact-prop-vcardparams"/>.</t>
          <figure anchor="related_conversion">
            <name>RELATED conversion example</name>
            <artwork><![CDATA[
RELATED;TYPE=friend:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
RELATED;TYPE=contact:https://example.com/directory/john.vcf
RELATED;VALUE=text:Please contact my deputy John for any inquiries.

"relatedTo" : {
  "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6" : {
    "relation" : {
      "friend" : true
    }
  },
  "https://example.com/directory/john.vcf" : {
    "relation" : {
      "contact" : true
    }
  },
  "Please contact my deputy John for any inquiries." : {
    "relation" : { }
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-title">
          <name>TITLE and ROLE</name>
          <t>Both TITLE and ROLE properties are represented as entries of the <tt>titles</tt> property (<xref target="title_role_conversion"/>).  The entry value is a <tt>Title</tt> object whose <tt>kind</tt> property is set to <tt>title</tt> or <tt>role</tt> for TITLE and ROLE vCard properties, respectively.  The <tt>name</tt> property is set to the vCard property value.</t>
          <t>The value of the <tt>organization</tt> property can be derived if the TITLE or ROLE property is member of a vCard property group and exactly one other ORG property also is part of that group.</t>
          <t>The ALTID and LANGUAGE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="title_role_conversion">
            <name>TITLE and ROLE conversion example</name>
            <artwork><![CDATA[
TITLE:Research Scientist
group1.ROLE:Project Leader
group1.ORG:ABC, Inc.

"titles": {
  "TITLE-1": {
    "kind": "title",
    "name": "Project Leader"
  },
  "TITLE-2": {
    "kind": "role",
    "name": "Research Scientist",
    "organization": "ORG-1"
  }
},
"organizations": {
  "ORG-1": {
    "name": "ABC, Inc."
  }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Personal Information Properties</name>
        <section anchor="vcard-prop-expertise">
          <name>EXPERTISE</name>
          <t>An EXPERTISE property as defined in <xref target="RFC6715"/> is represented as a <tt>PersonalInfo</tt> object in the <tt>personalInfo</tt> property (<xref target="expertise_conversion"/>).  The <tt>kind</tt> property is set to "expertise".</t>
          <t>The INDEX parameter converts according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="expertise_conversion">
            <name>EXPERTISE conversion example</name>
            <artwork><![CDATA[
EXPERTISE;LEVEL=beginner;INDEX=2:Chinese literature
EXPERTISE;INDEX=1;LEVEL=expert:chemistry

"personalInfo": {
  "PERSINFO-1" : {
    "kind": "expertise",
    "value": "Chinese literature",
     "level": "low",
     "listAs": 2
  },
  "PERSINFO-2" : {
    "kind": "expertise",
    "value": "chemistry",
    "level": "high",
    "listAs": 1
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-hobby">
          <name>HOBBY</name>
          <t>A HOBBY property as defined in <xref target="RFC6715"/> is represented as a <tt>PersonalInfo</tt> object in the <tt>personalInfo</tt> property (<xref target="hobby_conversion"/>).  The <tt>kind</tt> property is set to "hobby".</t>
          <t>The INDEX parameter converts according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="hobby_conversion">
            <name>HOBBY conversion example</name>
            <artwork><![CDATA[
HOBBY;INDEX=1;LEVEL=high:reading
HOBBY;INDEX=2;LEVEL=high:sewing

"personalInfo": {
  "PERSINFO-1" : {
    "kind": "hobby",
    "value": "reading",
    "level": "high",
    "listAs": 1
  },
  "PERSINFO-2" : {
    "kind": "hobby",
    "value": "sewing",
    "level": "high",
    "listAs": 2
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-interest">
          <name>INTEREST</name>
          <t>An INTEREST property as defined in <xref target="RFC6715"/> is represented as a <tt>PersonalInfo</tt> object in the <tt>personalInfo</tt> property (<xref target="interest_conversion"/>).  The <tt>kind</tt> property is set to "interest".</t>
          <t>The INDEX parameter converts according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="interest_conversion">
            <name>INTEREST conversion example</name>
            <artwork><![CDATA[
INTEREST;INDEX=1;LEVEL=medium:r&b music
INTEREST;INDEX=2;LEVEL=high:rock&roll music

"personalInfo": {
  "PERSINFO-1" : {
    "kind": "interest",
    "value": "r&b music",
    "level": "medium",
    "listAs": 1
  },
  "PERSINFO-2" : {
    "kind": "interest",
    "value": "rock&roll music",
    "level": "high",
    "listAs": 2
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-org-directory">
          <name>ORG-DIRECTORY</name>
          <t>An ORG-DIRECTORY property as defined in <xref target="RFC6715"/> is represented as an entry of the <tt>directories</tt> property (<xref target="org_directory_conversion"/>).  The entry value is a <tt>Directory</tt> object whose <tt>kind</tt> property is set to <tt>directory</tt> and <tt>uri</tt> property is set to the ORG-DIRECTORY value.</t>
          <t>The INDEX, PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="org_directory_conversion">
            <name>ORG-DIRECTORY conversion example</name>
            <artwork><![CDATA[
ORG-DIRECTORY;INDEX=1:https://directory.mycompany.example.com
ORG-DIRECTORY;PREF=1:ldap://ldap.tech.example/o=Tech,ou=Engineering

"directories": {
  "DIRECTORY-1": {
    "kind": "directory",
    "uri": "https://directory.mycompany.example.com",
    "listAs": 1
  },
  "DIRECTORY-2": {
    "kind": "directory",
    "uri": "ldap://ldap.tech.example/o=Tech,ou=Engineering",
    "pref": 1
  }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Explanatory Properties</name>
        <section anchor="vcard-prop-categories">
          <name>CATEGORIES</name>
          <t>A CATEGORIES property converts to a set of entries of the <tt>keywords</tt> property (<xref target="categories_conversion"/>).  The keys are the comma-separated text values of the CATEGORIES property.</t>
          <t>In this case, the PREF parameter does not have a JSContact counterpart; however, the implementors <bcp14>MAY</bcp14> insert the map entries by order of preference.</t>
          <figure anchor="categories_conversion">
            <name>CATEGORIES conversion example</name>
            <artwork><![CDATA[
CATEGORIES:internet,IETF,Industry,Information Technology

"keywords": {
  "internet": true,
  "IETF": true,
  "Industry": true,
  "Information Technology": true
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-pid">
          <name>CLIENTPIDMAP and PID Parameter</name>
          <t>These convert to the <xref target="jscontact-prop-vcardprops"><tt>vCardProps</tt></xref> and <xref target="jscontact-prop-vcardparams"><tt>vCardParams</tt></xref> properties.</t>
        </section>
        <section anchor="vcard-prop-created">
          <name>CREATED</name>
          <t>The CREATED property converts to the <tt>created</tt> property (<xref target="created_conversion"/>).</t>
          <figure anchor="created_conversion">
            <name>CREATED conversion example</name>
            <artwork><![CDATA[
CREATED:19940930T143510Z

"created": "1994-09-30T14:35:10Z"
]]></artwork>
          </figure>
          <t>Note: This property is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-prop-note">
          <name>NOTE</name>
          <t>A NOTE property converts to a <tt>Note</tt> object in the <tt>notes</tt> map (<xref target="notes_conversion"/>).</t>
          <t>The ALTID and LANGUAGE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="notes_conversion">
            <name>NOTE conversion example</name>
            <artwork><![CDATA[
NOTE;CREATED=20221123T150132Z;AUTHOR-NAME="John":
  Office hours are from 0800 to 1715 EST\, Mon-Fri.

"notes": {
  "NOTE-1" : {
     "note": "Office hours are from 0800 to 1715 EST, Mon-Fri.",
     "created": "2022-11-23T15:01:32Z",
     "author": {
       "name": "John"
     }
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-prodid">
          <name>PRODID</name>
          <t>The PRODID property converts to the <tt>prodId</tt> property (<xref target="prodid_conversion"/>).</t>
          <figure anchor="prodid_conversion">
            <name>PRODID conversion example</name>
            <artwork><![CDATA[
PRODID:ACME Contacts App version 1.23.5

"prodId": "ACME Contacts App version 1.23.5"
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-rev">
          <name>REV</name>
          <t>The REV property converts to the <tt>updated</tt> property (<xref target="rev_conversion"/>).</t>
          <figure anchor="rev_conversion">
            <name>REV conversion example</name>
            <artwork><![CDATA[
REV:19951031T222710Z

"updated": "1995-10-31T22:27:10Z"
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-sound">
          <name>SOUND</name>
          <t>A SOUND property converts to an entry in the <tt>media</tt> property (<xref target="sound_conversion"/>).  The entry value is a <tt>Media</tt> object whose <tt>kind</tt> property is set to <tt>sound</tt> and <tt>uri</tt> property is set to the SOUND value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="sound_conversion">
            <name>SOUND conversion example</name>
            <artwork><![CDATA[
SOUND:CID:JOHNQPUBLIC.19960229T080000.xyzMail@example.com

"media": {
  ...
  "SOUND-1": {
    "kind": "sound",
    "uri": "CID:JOHNQPUBLIC.19960229T080000.xyzMail@example.com"
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-uid">
          <name>UID</name>
          <t>The UID property corresponds to the <tt>uid</tt> property (<xref target="uid_conversion"/>).</t>
          <figure anchor="uid_conversion">
            <name>UID conversion example</name>
            <artwork><![CDATA[
UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

"uid": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-url">
          <name>URL</name>
          <t>A URL property converts to an entry in the <tt>links</tt> property (<xref target="url_conversion"/>).  The entry value is a <tt>Link</tt> object whose <tt>uri</tt> property is set to the URL value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="url_conversion">
            <name>URL conversion example</name>
            <artwork><![CDATA[
URL:https://example.org/restaurant.french/~chezchic.html

"links": {
  "LINK-1": {
    "uri": "https://example.org/restaurant.french/~chezchic.html"
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-version">
          <name>VERSION</name>
          <t>This converts to an entry in the <xref target="jscontact-prop-vcardprops"><tt>vCardProps</tt></xref> property.</t>
        </section>
        <section anchor="vcard-prop-xablabel">
          <name>X-ABLabel</name>
          <t>This property is experimental but widely in use in existing vCard data.  It converts to the <tt>label</tt> property of a JSContact object type.  The X-ABLabel property is preceded by a vCard property group name, and the label converts to the JSContact object which got converted from a vCard property having the same group.</t>
          <t>The group name is not preserved, implementations are free to choose any unique group name when converting back to vCard.  For an example how to preserve the group name see <xref target="vcard-param-group"/>.</t>
          <figure anchor="xablabel_conversion">
            <name>X-ABLabel conversion example</name>
            <artwork><![CDATA[
item1.TEL;VALUE=uri:tel:+1-555-555-5555
item1.X-ABLabel:foo

"phones": {
  "p1": {
    "number": "tel:+1-555-555-5555",
    "label": "foo"
  }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Security Properties</name>
        <section anchor="vcard-prop-key">
          <name>KEY</name>
          <t>A KEY property converts to an entry in the <tt>cryptoKeys</tt> property (<xref target="key_conversion"/>).  The entry value is a <tt>CryptoKey</tt> object whose <tt>uri</tt> property is set to the KEY value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="key_conversion">
            <name>KEY conversion example</name>
            <artwork><![CDATA[
KEY:https://www.example.com/keys/jdoe.cer

"cryptoKeys": {
  "KEY-1": {
    "uri": "https://www.example.com/keys/jdoe.cer"
  }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Calendar Properties</name>
        <section anchor="vcard-prop-caladruri">
          <name>CALADRURI</name>
          <t>A CALADRURI property converts to an entry in the <tt>schedulingAddresses</tt> property (<xref target="caladruri_conversion"/>).  The entry value is a <tt>SchedulingAddress</tt> object whose <tt>uri</tt> property is set to the CALADRURI value.</t>
          <t>The PREF parameter converts according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="caladruri_conversion">
            <name>CALADRURI conversion example</name>
            <artwork><![CDATA[
CALADRURI;PREF=1:mailto:janedoe@example.com
CALADRURI:https://example.com/calendar/jdoe

"schedulingAddresses": {
  "SCHEDULING-1": {
    "uri": "mailto:janedoe@example.com",
    "pref": 1
  },
  "SCHEDULING-2": {
    "uri": "https://example.com/calendar/jdoe"
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-caluri">
          <name>CALURI</name>
          <t>A CALURI property converts to an entry in the <tt>calendars</tt> property (<xref target="caluri_conversion"/>).  The entry value is a <tt>Calendar</tt> object whose <tt>kind</tt> property is set to <tt>calendar</tt> and <tt>uri</tt> property is set to the CALURI value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="caluri_conversion">
            <name>CALURI conversion example</name>
            <artwork><![CDATA[
CALURI;PREF=1:https://cal.example.com/calA
CALURI;MEDIATYPE=text/calendar:https://ftp.example.com/calA.ics

"calendars": {
  "CAL-1": {
    "kind": "calendar",
    "uri": "https://cal.example.com/calA",
    "pref": 1
  },
  "CAL-2": {
    "kind": "calendar",
    "uri": "https://ftp.example.com/calA.ics",
    "mediaType": "text/calendar"
  }
}
]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-fburl">
          <name>FBURL</name>
          <t>An FBURL property converts to an entry in the <tt>calendars</tt> property (<xref target="fburl_conversion"/>).  The entry value is a <tt>Calendar</tt> object whose <tt>kind</tt> property is set to <tt>freeBusy</tt> and <tt>uri</tt> property is set to the FBURL value.</t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="fburl_conversion">
            <name>FBURL conversion example</name>
            <artwork><![CDATA[
FBURL;PREF=1:https://www.example.com/busy/janedoe
FBURL;MEDIATYPE=text/calendar:https://example.com/busy/project-a.ifb

"calendars": {
  "FBURL-1": {
    "kind": "freeBusy",
    "uri": "https://www.example.com/busy/janedoe",
    "pref": 1
  },
  "FBURL-2": {
    "kind": "freeBusy",
    "uri": "https://example.com/busy/project-a.ifb",
    "mediaType": "text/calendar"
  }
}
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="vcard-extended">
        <name>Extended Properties and Parameters</name>
        <t>These convert as specified in <xref target="new-jscontact"/>.</t>
      </section>
      <section anchor="new-jscontact">
        <name>New JSContact properties</name>
        <t>vCards may contain properties or parameters for which no IANA-registered JSContact property is defined.  For example, a vCard may contain properties and parameters of which the semantics or purposes are unknown to the implementation; see <xref target="RFC6350" section="6.10"/>.</t>
        <t>This section defines JSContact properties by which such vCard properties and parameters <bcp14>MAY</bcp14> be represented in JSContact.  Implementations <bcp14>MAY</bcp14> choose to convert differently if they deem that more appropriate.</t>
        <section anchor="jscontact-prop-vcardprops">
          <name>Property <tt>vCardProps</tt></name>
          <dl>
            <dt>Name:</dt>
            <dd>
              <tt>vCardProps</tt>
            </dd>
            <dt>Type:</dt>
            <dd><tt>JCardProp[]</tt>, where <tt>JCardProp</tt> denotes a jCard-encoded vCard property as defined in <xref target="RFC7095" section="3.3"/>.
</dd>
            <dt>Definition:</dt>
            <dd>This property is set on a JSContact object that represents a vCard.  It contains properties that are set in the vCard represented by this JSContact object.  Each entry in this list typically represents a vCard property for which no conversion to an IANA-registered JSContact property is defined.</dd>
            <dt>Example:</dt>
            <dd>
              <t>This illustrates how to convert a vCard extension property:</t>
              <figure anchor="props_conversion">
                <name>JSContact <tt>vCardProps</tt> example</name>
                <artwork><![CDATA[
item1.X-FOO;X-BAR=Hello:World!

"vCardProps": [
  ["x-foo", {
    "x-bar": "Hello",
    "group": "item1"
  }, "unknown", "World!"]
]
]]></artwork>
              </figure>
            </dd>
          </dl>
        </section>
        <section anchor="jscontact-prop-vcardparams">
          <name>Property <tt>vCardParams</tt></name>
          <dl>
            <dt>Name:</dt>
            <dd>
              <tt>vCardParams</tt>
            </dd>
            <dt>Type:</dt>
            <dd>
              <tt>String[String|String[]]</tt>
            </dd>
            <dt>Definition:</dt>
            <dd>This property is set on a JSContact object that represents a vCard property.  Its value <bcp14>MUST</bcp14> be a JSON object containing vCard property parameters, defined as array element 2 in <xref target="RFC7095" section="3.3"/>.  Each entry represents a parameter of the vCard property that converts to the JSContact object.</dd>
            <dt>Example:</dt>
            <dd>
              <t>This illustrates how to convert a vCard extension parameter:</t>
              <figure anchor="params_conversion">
                <name>JSContact <tt>vCardParams</tt> example</name>
                <artwork><![CDATA[
EMAIL;X-FOO=Bar:jane_doe@example.com

"emails": {
  "email1": {
    "address": "jane_doe@example.com",
    "vCardParams": {
      "x-foo": "Bar"
    }
  }
}
]]></artwork>
              </figure>
            </dd>
          </dl>
        </section>
        <section anchor="jscontact-prop-vcardname">
          <name>Property <tt>vCardName</tt></name>
          <dl>
            <dt>Name:</dt>
            <dd>
              <tt>vCardName</tt>
            </dd>
            <dt>Type:</dt>
            <dd>
              <tt>String</tt>
            </dd>
            <dt>Definition:</dt>
            <dd>This property is set on a JSContact object that represents a vCard property or parameter and its value contains the name of that vCard element.  This allows to preserve the name of a vCard element when multiple elements convert the same JSContact object type.  The case-insensitive value <bcp14>MUST</bcp14> be valid according to the <tt>name</tt> ABNF defined in <xref target="RFC6350" section="3.3"/>.</dd>
            <dt>Example:</dt>
            <dd>
              <t>Both vCard IMPP and SOCIALPROFILE convert to OnlineService in JSContact.  The <tt>vCardName</tt> property value indicates that the vCard source element was IMPP:</t>
              <figure anchor="example-vcardname">
                <name>JSContact <tt>vCardName</tt> example</name>
                <artwork><![CDATA[
IMPP:xmpp:alice@example.com

"onlineServices": {
  "os1": {
    "uri": "xmpp:alice@example.com",
    "vCardName": "impp"
  },
}
]]></artwork>
              </figure>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="convert-jscontact-to-vcard">
      <name>Converting JSContact to vCard</name>
      <section>
        <name>Conversion Rules</name>
        <t>A <tt>Card</tt> converts to vCard by applying the reverse rules of converting vCard to JSContact.  In addition to those listed in <xref target="convert_jscontact_to_vcard-reverse-rules"/>, the following rules apply:</t>
        <ul>
          <li>Multivalued JSContact properties convert to separate instances of their equivalent vCard property, and for each the PROP-ID parameter <bcp14>MUST</bcp14> be set to the <tt>Id</tt> of the converted value (see <xref target="vcard-param-propid"/>).</li>
          <li>
            <t>The <tt>full</tt> property in JSContact is optional, but it is mandatory in vCard.  The following rules apply:</t>
            <ul>
              <li>If the <tt>full</tt> property is set, then implementations <bcp14>MUST</bcp14> use its value for the vCard FN property.</li>
              <li>If the <tt>full</tt> property is not set, but the <tt>name</tt> property is, then implementations <bcp14>MUST</bcp14> derive the full name of it by concatenating the name component values.  They <bcp14>MUST</bcp14> use the resulting string as the value of the vCard FN property.  In addition, they <bcp14>MUST</bcp14> set the DERIVED parameter on the FN property.</li>
              <li>Otherwise, they <bcp14>MUST</bcp14> set the FN property to the empty value.</li>
            </ul>
          </li>
          <li>Vendor-specific and unknown properties convert to vCard as outlined in <xref target="convert-other-jscontact"/>.</li>
        </ul>
        <section anchor="jscontact-pronounce">
          <name>Converting the <tt>Pronounce</tt> object</name>
          <t>The Pronounce type has no standard vCard element to convert to.  An initial RFC draft <xref target="I-D.calconnect-vobject-i18n"/> for adding phonetics to vCard exists but has not been further developed.  In lack of standard vCard support, any JSContact property of type Pronounce converts to a vCard JSCONTACT-PROP as outlined in <xref target="convert-other-jscontact"/>.</t>
        </section>
      </section>
      <section anchor="convert-other-jscontact">
        <name>New vCard Properties and Parameters</name>
        <t>JSContact object types may contain properties for which no IANA-registered vCard property is defined.  For example, a JSContact object may contain vendor-specific properties of which the semantics or purpose are unknown.</t>
        <t>This section defines new vCard properties and parameters by which such JSContact properties <bcp14>MAY</bcp14> be represented in vCard.  Implementations <bcp14>MAY</bcp14> choose to convert differently if they deem that more appropriate.</t>
        <section anchor="vcard-prop-jscontact-prop">
          <name>Property <tt>JSCONTACT-PROP</tt></name>
          <dl>
            <dt>Property name:</dt>
            <dd>JSCONTACT-PROP</dd>
            <dt>Purpose:</dt>
            <dd>This property represents a JSContact property in vCard.</dd>
            <dt>Value type:</dt>
            <dd>TEXT, also see Format Definition for value restrictions.</dd>
            <dt>Conformance:</dt>
            <dd>The property can be specified multiple times in a vCard.</dd>
            <dt>Property parameters:</dt>
            <dd>
          The JSPTR parameter <bcp14>MUST</bcp14> be set for this property.
          Other IANA-registered and experimental property parameters can be specified on this property.
        </dd>
            <dt>Description:</dt>
            <dd>
              <t>
            This property converts a JSContact property to vCard.  The vCard property value is the JSON-encoded value of the JSContact property, represented as a TEXT value.  The format of the JSON value <bcp14>MUST</bcp14> be compact, e.g., without insignificant whitespace.
          </t>
              <t>The value of the JSPTR parameter defines the path to that JSContact value within the Card.  The last segment of the JSON pointer either defines the property name or array position of the JSContact value.  The root of the JSON pointer is always the Card object that this vCard converts to, irrespective if the JSON pointer starts with the SOLIDUS (U+002F) character.  If any but the last segment of the JSON pointer points to a non-existent JSContact property or array entry in the Card, then the JSCONTACT-PROP property <bcp14>MUST</bcp14> be ignored and discarded from the vCard.</t>
            </dd>
            <dt>Format definition:</dt>
            <dd>
              <t>This property is defined by the following notation:</t>
              <sourcecode name="" type="abnf"><![CDATA[
jscontact-prop = "JSCONTACT-PROP" jscontact-prop-param ":" TEXT

jscontact-prop-param  = *(
            ; The following are MANDATORY and MUST NOT
            ; occur more than once
            ( ";" jspath-param ) /    ; see next section
            ( ";" "VALUE" "=" "TEXT")
            ;
            ; The following is OPTIONAL,
            ; and MAY occur more than once.
            ;
            (";" other-param)
            ;
            )
]]></sourcecode>
            </dd>
            <dt anchor="vcard-prop-jscontact-prop-examples">Example(s):</dt>
            <dd>
              <t>This illustrates how to convert a property at the top-level in a Card object that is unknown to the implementation.</t>
              <figure anchor="jscontact-prop-unknown">
                <name>Unknown property example</name>
                <artwork><![CDATA[
"someUnknownProperty": true

JSCONTACT-PROP;JSPTR="someUnknownProperty":true
]]></artwork>
              </figure>
              <t>This illustrates how to convert a vendor-specific property at the top-level of a Card object.  Note the required use of quoted string for the JSPTR value which allows the path to include the COLON (U+003A) character.</t>
              <figure anchor="jscontact-prop-vendor-specific">
                <name>Vendor-specific property conversion example</name>
                <artwork><![CDATA[
"example.com:foo": {
  "bar": 1234
}

JSCONTACT-PROP;JSPTR="example.com:foo":{"bar":1234}
]]></artwork>
              </figure>
              <t>This illustrates how to convert a vendor-specific property at a nested level in a Card object using a path relative to the Card object.  Although not recommended, the property name includes the SOLIDUS (U+002F) character which requires escaping in the JSON pointer.</t>
              <figure anchor="jscontact-prop-nested">
                <name>Nested vendor-specific property example with path relative to Card</name>
                <artwork><![CDATA[
"phones": {
  "phone1": {
    "number": "tel:+33-01-23-45-67"
    "example.com:foo/bar": "tux hux"
  }
}

TEL:tel:+33-01-23-45-67
JSCONTACT-PROP;JSPTR="phones/phone1/example.com:foo~1bar":
 "tux hux"
]]></artwork>
              </figure>
            </dd>
          </dl>
        </section>
        <section anchor="vcard-param-jsptr">
          <name>Parameter <tt>JSPTR</tt></name>
          <dl>
            <dt>Parameter name:</dt>
            <dd>JSPTR</dd>
            <dt>Purpose:</dt>
            <dd>
        This parameter contains a JSON pointer <xref target="RFC6901"/> that relates its vCard property to some JSON data.  Its exact semantics depend on the definition of the property where this parameter is set on.
        </dd>
            <dt>Description:</dt>
            <dd>
              <t>This parameter has a single value that <bcp14>MUST</bcp14> be a valid JSON pointer as defined in <xref target="RFC6901"/>.  Currently, its semantics only are defined for the JSCONTACT-PROP property (see <xref target="vcard-prop-jscontact-prop"/>), but it may also be used for other use cases in the future.</t>
            </dd>
            <dt>Format definition:</dt>
            <dd>
              <sourcecode name="" type="abnf"><![CDATA[
jspath-param  = "JSPTR" "=" DQUOTE *QSAFE-CHAR DQUOTE
             ; also see param-value in RFC 6350, section 3.3

]]></sourcecode>
            </dd>
            <dt>Example(s):</dt>
            <dd>
              <t>This illustrates a simple example.  For further examples see <xref target="vcard-prop-jscontact-prop-examples"/>.</t>
              <sourcecode name=""><![CDATA[
JSCONTACT-PROP;JSPTR="example.com:foo":"bar"
]]></sourcecode>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This specification defines how to convert between the JSContact and vCard formats.  The security considerations for parsing and formatting such data apply and are outlined in <xref target="I-D.ietf-calext-jscontact" section="5"/> and <xref target="RFC6350" section="9"/>.</t>
    </section>
    <section anchor="IANA">
      <!-- All drafts are required to have an IANA considerations section.  See RFC 8126 for a guide.-->
      <name>IANA Considerations</name>
      <section>
        <name>New vCard Properties</name>
        <t>IANA is requested to add the following entries to the "vCard Properties" registry, defined in Section 10.3.1. of <xref target="RFC6350"/>.</t>
        <table anchor="new_properties">
          <name>New vCard Properties</name>
          <thead>
            <tr>
              <th align="left">Namespace</th>
              <th align="left">Property</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td/>
              <td align="left">JSCONTACT-PROP</td>
              <td align="left">This document, <xref target="vcard-prop-jscontact-prop"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section>
        <name>New vCard Parameters</name>
        <t>IANA is requested to add the following entries to the "vCard Parameters" registry, defined in Section 10.3.2. of <xref target="RFC6350"/>.</t>
        <table anchor="new_parameters">
          <name>New vCard Parameters</name>
          <thead>
            <tr>
              <th align="left">Namespace</th>
              <th align="left">Parameter</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td/>
              <td align="left">JSPTR</td>
              <td align="left">This document, <xref target="vcard-param-jsptr"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section>
        <name>New JSContact Properties</name>
        <t>IANA is requested to add the following entries to the "JSContact Properties" registry.  The Since Version for all properties is 1.0.  The Until Version for all properties is not set.  All RFC section references are for this document.  The change controller for all these properties is IETF.</t>
        <table anchor="tab-iana-property-registry" align="center">
          <name>Initial Contents of the "JSContact Properties" Registry</name>
          <thead>
            <tr>
              <th align="left">Property Name</th>
              <th align="left">Property Type</th>
              <th align="left">Property Context</th>
              <th align="left">Reference or Description</th>
              <th align="left">Intended Usage</th>
            </tr>
          </thead>
          <!-- Everything in here should be sorted alphabetically: table entries by property name, the references for each property alphabetically by the object type or property they refer to -->
          <tbody>
            <tr>
              <td align="left">vCardName</td>
              <td align="left">String</td>
              <td align="left">Any JSContact object</td>
              <td align="left">
                <xref target="jscontact-prop-vcardname" format="default"/>
              </td>
              <td align="left">common</td>
            </tr>
            <tr>
              <td align="left">vCardParams</td>
              <td align="left">String[String]</td>
              <td align="left">Any JSContact object</td>
              <td align="left">
                <xref target="jscontact-prop-vcardparams" format="default"/>
              </td>
              <td align="left">common</td>
            </tr>
            <tr>
              <td align="left">vCardProps</td>
              <td align="left">JCardProp[]</td>
              <td align="left">Card</td>
              <td align="left">
                <xref target="jscontact-prop-vcardprops" format="default"/>
              </td>
              <td align="left">common</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section>
        <name>New JSContact Types</name>
        <t>IANA is requested to add the following entries to the "JSContact Types" registry.    The Since Version for all properties is 1.0.  The Until Version for all properties is not set.  All RFC section references are for this document.  The change controller for all these properties is IETF.</t>
        <table anchor="tab-iana-jscontact-type-registry" align="left">
          <name>Additional Contents of the "JSContact Types" Registry</name>
          <thead>
            <tr>
              <th align="left">Type Name</th>
              <th align="left">Reference or Description</th>
              <th align="left">Intended Usage</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">JCardProp</td>
              <td align="left">
                <xref target="jscontact-prop-vcardprops" format="default"/>
              </td>
              <td align="left">common</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="impl-status">
      <name>Implementation Status</name>
      <t>NOTE: Please remove this section and the reference to RFC 7942 prior to publication as an RFC.</t>
      <t>This section records the status of known implementations of the protocol as defined in this specification at the time of posting of this Internet-Draft, and is based on a proposal described in <xref target="RFC7942"/>.  The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs.  Please note that the listing of any individual implementation here does not imply endorsement by the IETF.  Furthermore, no effort has been spent to verify the information presented here that was supplied by IETF contributors.  This is not intended as, and must not be construed to be, a catalog of available implementations or their features.  Readers are advised to note that other implementations may exist.</t>
      <t>According to RFC 7942, "this will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.  It is up to the individual working groups to use this information as they see fit".</t>
      <section anchor="it-cnr-iit">
        <name>CNR</name>
        <ul spacing="compact">
          <li>Responsible Organization: National Research Council (CNR) of Italy</li>
          <li>Location: https://github.com/consiglionazionaledellericerche/jscontact-tools</li>
          <li>Description: This implementation includes tools for JSContact creation, validation, serialization/deserialization, and conversion from vCard, xCard and jCard.</li>
          <li>Level of Maturity: This is an "alpha" test implementation.</li>
          <li>Coverage: This implementation includes all features described in this specification.</li>
          <li>Contact Information: Mario Loffredo, mario.loffredo@iit.cnr.it</li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-calext-jscontact.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-calext-vcard-jscontact-extensions.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6350.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6473.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6474.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6715.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6869.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6901.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7095.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      </references>
      <references>
        <name>Informative References</name>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-calconnect-vobject-i18n.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8605.xml"/>
      </references>
    </references>
    <section anchor="convert_jscontact_to_vcard-reverse-rules">
      <name>Reverse Rules of Converting vCard to JSContact Card</name>
      <t><xref target="table_convert_jscontact_to_vcard"/> lists the relevant document sections for each JSContact object type and property.</t>
      <table anchor="table_convert_jscontact_to_vcard">
        <name>Conversion rules by JSContact property</name>
        <thead>
          <tr>
            <th align="left">JSContact Type</th>
            <th align="left">Property Name</th>
            <th align="left">Relevant Section(s)</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>Address</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Address</td>
            <td>components</td>
            <td><xref target="vcard-prop-adr"/>,
              <xref target="vcard-param-fmt"/></td>
          </tr>
          <tr>
            <td>Address</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>coordinates</td>
            <td><xref target="vcard-param-geo"/>, <xref target="vcard-prop-geo"/></td>
          </tr>
          <tr>
            <td>Address</td>
            <td>country</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>countryCode</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>full</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>locality</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>postcode</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>pronounce</td>
            <td>
              <xref target="jscontact-pronounce"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>region</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Address</td>
            <td>timeZone</td>
            <td><xref target="vcard-param-tz"/>, <xref target="vcard-prop-tz"/></td>
          </tr>
          <tr>
            <td>AddressComponent</td>
            <td>pronounce</td>
            <td>
              <xref target="jscontact-pronounce"/>
            </td>
          </tr>
          <tr>
            <td>Anniversary</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Anniversary</td>
            <td>date</td>
            <td>
              <xref target="vcard-prop-anniversary"/>
            </td>
          </tr>
          <tr>
            <td>Anniversary</td>
            <td>kind</td>
            <td>
              <xref target="vcard-prop-anniversary"/>
            </td>
          </tr>
          <tr>
            <td>Anniversary</td>
            <td>place</td>
            <td>
              <xref target="vcard-prop-anniversary"/>
            </td>
          </tr>
          <tr>
            <td>Author</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Author</td>
            <td>name</td>
            <td>
              <xref target="vcard-param-author-name"/>
            </td>
          </tr>
          <tr>
            <td>Author</td>
            <td>uri</td>
            <td>
              <xref target="vcard-param-author"/>
            </td>
          </tr>
          <tr>
            <td>Calendar</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Calendar</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Calendar</td>
            <td>kind</td>
            <td><xref target="vcard-prop-caladruri"/>, <xref target="vcard-prop-fburl"/></td>
          </tr>
          <tr>
            <td>Calendar</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>Calendar</td>
            <td>mediaType</td>
            <td>
              <xref target="vcard-param-mediatype"/>
            </td>
          </tr>
          <tr>
            <td>Calendar</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Calendar</td>
            <td>uri</td>
            <td><xref target="vcard-prop-caladruri"/>, <xref target="vcard-prop-fburl"/></td>
          </tr>
          <tr>
            <td>Card</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Card</td>
            <td>@version</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Card</td>
            <td>addresses</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>anniversaries</td>
            <td>
              <xref target="vcard-prop-anniversary"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>calendars</td>
            <td><xref target="vcard-prop-caladruri"/>, <xref target="vcard-prop-fburl"/></td>
          </tr>
          <tr>
            <td>Card</td>
            <td>created</td>
            <td>
              <xref target="vcard-prop-created"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>directories</td>
            <td><xref target="vcard-prop-source"/>, <xref target="vcard-prop-org-directory"/></td>
          </tr>
          <tr>
            <td>Card</td>
            <td>emails</td>
            <td>
              <xref target="vcard-prop-email"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>keywords</td>
            <td>
              <xref target="vcard-prop-categories"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>kind</td>
            <td>
              <xref target="vcard-prop-kind"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>links</td>
            <td><xref target="vcard-prop-contact-uri"/>, <xref target="vcard-prop-url"/></td>
          </tr>
          <tr>
            <td>Card</td>
            <td>language</td>
            <td>
              <xref target="vcard-prop-deflanguage"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>localizations</td>
            <td>
              <xref target="vcard-param-language"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>media</td>
            <td><xref target="vcard-prop-photo"/>, <xref target="vcard-prop-logo"/>, <xref target="vcard-prop-sound"/></td>
          </tr>
          <tr>
            <td>Card</td>
            <td>members</td>
            <td>
              <xref target="vcard-prop-member"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>name</td>
            <td>
              <xref target="vcard-prop-n"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>nickNames</td>
            <td>
              <xref target="vcard-prop-n"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>notes</td>
            <td>
              <xref target="vcard-prop-note"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>onlineServices</td>
            <td>
              <xref target="vcard-prop-impp"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>organizations</td>
            <td>
              <xref target="vcard-prop-org"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>personalInfo</td>
            <td><xref target="vcard-prop-expertise"/>, <xref target="vcard-prop-hobby"/>, <xref target="vcard-prop-interest"/></td>
          </tr>
          <tr>
            <td>Card</td>
            <td>phones</td>
            <td>
              <xref target="vcard-prop-tel"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>preferredLanguages</td>
            <td>
              <xref target="vcard-prop-lang"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>prodId</td>
            <td>
              <xref target="vcard-prop-prodid"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>relatedTo</td>
            <td>
              <xref target="vcard-prop-related"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>schedulingAddresses</td>
            <td>
              <xref target="vcard-prop-caladruri"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>speakToAs</td>
            <td>
              <xref target="vcard-prop-gramgender"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>titles</td>
            <td>
              <xref target="vcard-prop-title"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>uid</td>
            <td>
              <xref target="vcard-prop-uid"/>
            </td>
          </tr>
          <tr>
            <td>Card</td>
            <td>updated</td>
            <td>
              <xref target="vcard-prop-rev"/>
            </td>
          </tr>
          <tr>
            <td>CryptoKey</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>CryptoKey</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>CryptoKey</td>
            <td>kind</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>CryptoKey</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>CryptoKey</td>
            <td>mediaType</td>
            <td>
              <xref target="vcard-param-mediatype"/>
            </td>
          </tr>
          <tr>
            <td>CryptoKey</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>CryptoKey</td>
            <td>uri</td>
            <td>
              <xref target="vcard-prop-key"/>
            </td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>kind</td>
            <td><xref target="vcard-prop-source"/>, <xref target="vcard-prop-org-directory"/></td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>listAs</td>
            <td>
              <xref target="vcard-param-index"/>
            </td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>mediaType</td>
            <td>
              <xref target="vcard-param-mediatype"/>
            </td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Directory</td>
            <td>uri</td>
            <td><xref target="vcard-prop-source"/>, <xref target="vcard-prop-org-directory"/></td>
          </tr>
          <tr>
            <td>EmailAddress</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>EmailAddress</td>
            <td>address</td>
            <td>
              <xref target="vcard-prop-email"/>
            </td>
          </tr>
          <tr>
            <td>EmailAddress</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>EmailAddress</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>EmailAddress</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>LanguagePref</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>LanguagePref</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>LanguagePref</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Link</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Link</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Link</td>
            <td>kind</td>
            <td><xref target="vcard-prop-contact-uri"/>, <xref target="vcard-prop-url"/></td>
          </tr>
          <tr>
            <td>Link</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>Link</td>
            <td>mediaType</td>
            <td>
              <xref target="vcard-param-mediatype"/>
            </td>
          </tr>
          <tr>
            <td>Link</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Link</td>
            <td>uri</td>
            <td><xref target="vcard-prop-contact-uri"/>, <xref target="vcard-prop-url"/>&gt;</td>
          </tr>
          <tr>
            <td>Media</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Media</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Media</td>
            <td>kind</td>
            <td><xref target="vcard-prop-photo"/>, <xref target="vcard-prop-logo"/>, <xref target="vcard-prop-sound"/></td>
          </tr>
          <tr>
            <td>Media</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>Media</td>
            <td>mediaType</td>
            <td>
              <xref target="vcard-param-mediatype"/>
            </td>
          </tr>
          <tr>
            <td>Media</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Media</td>
            <td>uri</td>
            <td><xref target="vcard-prop-photo"/>, <xref target="vcard-prop-logo"/>, <xref target="vcard-prop-sound"/></td>
          </tr>
          <tr>
            <td>Name</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Name</td>
            <td>components</td>
            <td><xref target="vcard-prop-n"/>,
              <xref target="vcard-param-fmt"/></td>
          </tr>
          <tr>
            <td>Name</td>
            <td>full</td>
            <td>
              <xref target="vcard-prop-fn"/>
            </td>
          </tr>
          <tr>
            <td>Name</td>
            <td>pronounce</td>
            <td>
              <xref target="jscontact-pronounce"/>
            </td>
          </tr>
          <tr>
            <td>Name</td>
            <td>sortAs</td>
            <td>
              <xref target="vcard-param-sortas"/>
            </td>
          </tr>
          <tr>
            <td>NameComponent</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>NameComponent</td>
            <td>kind</td>
            <td>
              <xref target="vcard-prop-n"/>
            </td>
          </tr>
          <tr>
            <td>NameComponent</td>
            <td>pronounce</td>
            <td>
              <xref target="jscontact-pronounce"/>
            </td>
          </tr>
          <tr>
            <td>NameComponent</td>
            <td>value</td>
            <td>
              <xref target="vcard-prop-n"/>
            </td>
          </tr>
          <tr>
            <td>NickName</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>NickName</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>NickName</td>
            <td>name</td>
            <td>
              <xref target="vcard-prop-n"/>
            </td>
          </tr>
          <tr>
            <td>NickName</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Note</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Note</td>
            <td>author</td>
            <td><xref target="vcard-param-author"/>, <xref target="vcard-param-author-name"/></td>
          </tr>
          <tr>
            <td>Note</td>
            <td>created</td>
            <td>
              <xref target="vcard-param-created"/>
            </td>
          </tr>
          <tr>
            <td>Note</td>
            <td>note</td>
            <td>
              <xref target="vcard-prop-note"/>
            </td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>kind</td>
            <td><xref target="vcard-prop-impp"/>, <xref target="vcard-prop-socialprofile"/></td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>service</td>
            <td>
              <xref target="vcard-param-service-type"/>
            </td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>uri</td>
            <td><xref target="vcard-prop-impp"/>, <xref target="vcard-prop-socialprofile"/></td>
          </tr>
          <tr>
            <td>OnlineService</td>
            <td>user</td>
            <td>
              <xref target="vcard-param-username"/>
            </td>
          </tr>
          <tr>
            <td>OrgUnit</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>OrgUnit</td>
            <td>name</td>
            <td>
              <xref target="vcard-prop-org"/>
            </td>
          </tr>
          <tr>
            <td>OrgUnit</td>
            <td>sortAs</td>
            <td>
              <xref target="vcard-param-sortas"/>
            </td>
          </tr>
          <tr>
            <td>Organization</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Organization</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Organization</td>
            <td>name</td>
            <td>
              <xref target="vcard-prop-org"/>
            </td>
          </tr>
          <tr>
            <td>Organization</td>
            <td>sortAs</td>
            <td>
              <xref target="vcard-param-sortas"/>
            </td>
          </tr>
          <tr>
            <td>Organization</td>
            <td>units</td>
            <td>
              <xref target="vcard-prop-org"/>
            </td>
          </tr>
          <tr>
            <td>PartialDate</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>PartialDate</td>
            <td>calendarScale</td>
            <td>
              <xref target="vcard-param-calscale"/>
            </td>
          </tr>
          <tr>
            <td>PartialDate</td>
            <td>day</td>
            <td>
              <xref target="vcard-type-datetime"/>
            </td>
          </tr>
          <tr>
            <td>PartialDate</td>
            <td>month</td>
            <td>
              <xref target="vcard-type-datetime"/>
            </td>
          </tr>
          <tr>
            <td>PartialDate</td>
            <td>year</td>
            <td>
              <xref target="vcard-type-datetime"/>
            </td>
          </tr>
          <tr>
            <td>PatchObject</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>PersonalInfo</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>PersonalInfo</td>
            <td>kind</td>
            <td><xref target="vcard-prop-expertise"/>, <xref target="vcard-prop-hobby"/>, <xref target="vcard-prop-interest"/></td>
          </tr>
          <tr>
            <td>PersonalInfo</td>
            <td>listAs</td>
            <td>
              <xref target="vcard-param-index"/>
            </td>
          </tr>
          <tr>
            <td>PersonalInfo</td>
            <td>level</td>
            <td>
              <xref target="vcard-param-level"/>
            </td>
          </tr>
          <tr>
            <td>PersonalInfo</td>
            <td>value</td>
            <td><xref target="vcard-prop-expertise"/>, <xref target="vcard-prop-hobby"/>, <xref target="vcard-prop-interest"/></td>
          </tr>
          <tr>
            <td>Phone</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Phone</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Phone</td>
            <td>features</td>
            <td>
              <xref target="vcard-prop-tel"/>
            </td>
          </tr>
          <tr>
            <td>Phone</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>Phone</td>
            <td>number</td>
            <td>
              <xref target="vcard-prop-tel"/>
            </td>
          </tr>
          <tr>
            <td>Phone</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Pronouns</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Pronouns</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>Pronouns</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>Pronouns</td>
            <td>pronouns</td>
            <td>
              <xref target="vcard-prop-gramgender"/>
            </td>
          </tr>
          <tr>
            <td>Relation</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Relation</td>
            <td>relation</td>
            <td>
              <xref target="vcard-prop-related"/>
            </td>
          </tr>
          <tr>
            <td>Resource</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>SchedulingAddress</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>SchedulingAddress</td>
            <td>contexts</td>
            <td>
              <xref target="vcard-param-type"/>
            </td>
          </tr>
          <tr>
            <td>SchedulingAddress</td>
            <td>label</td>
            <td>
              <xref target="vcard-prop-xablabel"/>
            </td>
          </tr>
          <tr>
            <td>SchedulingAddress</td>
            <td>pref</td>
            <td>
              <xref target="vcard-param-pref"/>
            </td>
          </tr>
          <tr>
            <td>SchedulingAddress</td>
            <td>uri</td>
            <td>
              <xref target="vcard-prop-caladruri"/>
            </td>
          </tr>
          <tr>
            <td>SpeakToAs</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>SpeakToAs</td>
            <td>grammaticalGender</td>
            <td>
              <xref target="vcard-prop-gramgender"/>
            </td>
          </tr>
          <tr>
            <td>SpeakToAs</td>
            <td>pronouns</td>
            <td>
              <xref target="vcard-prop-gramgender"/>
            </td>
          </tr>
          <tr>
            <td>AddressComponent</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>AddressComponent</td>
            <td>kind</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>AddressComponent</td>
            <td>value</td>
            <td>
              <xref target="vcard-prop-adr"/>
            </td>
          </tr>
          <tr>
            <td>Timestamp</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Timestamp</td>
            <td>utc</td>
            <td>
              <xref target="vcard-type-datetime"/>
            </td>
          </tr>
          <tr>
            <td>Title</td>
            <td>@type</td>
            <td>not applicable</td>
          </tr>
          <tr>
            <td>Title</td>
            <td>kind</td>
            <td>
              <xref target="vcard-prop-title"/>
            </td>
          </tr>
          <tr>
            <td>Title</td>
            <td>name</td>
            <td>
              <xref target="vcard-prop-title"/>
            </td>
          </tr>
          <tr>
            <td>Title</td>
            <td>organization</td>
            <td>
              <xref target="vcard-prop-title"/>
            </td>
          </tr>
        </tbody>
      </table>
    </section>
  </back>
</rfc>
