<?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-05" ipr="trust200902" tocInclude="true" tocDepth="4" sortRefs="true" symRefs="true" 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-05"/>
    <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>http://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="2022" month="December" day="9"/>
    <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 defined in the JSContact specification from and to vCard.</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>
        <name>Conventions Used in This Document</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119"/>.</t>
        <t>In the following of this document, the vCard features, namely properties and parameters, are written in uppercase while the Card features are written in camel case wrapped in double quotes.</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.  Its follows the same structure as the <xref target="RFC6350">vCard v4 RFC document</xref>.  Properties and parameters of vCard extension RFCs, including the <xref target="I-D.ietf-calext-vcard-jscontact-extensions">vCard JSContact Extension RFC</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.  They <bcp14>SHOULD</bcp14> generate the same identifier when repeatedly converting the same vCard, but they <bcp14>MAY</bcp14> generate different values.  Consequently, a vCard without UID property <bcp14>MAY</bcp14> not convert to one exact instance of a JSContact card.</t>
        </section>
        <section>
          <name>Choosing identifiers</name>
          <t>Multi-valued 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>SHOULD</bcp14> generate values of short character length.  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 any JSContact type.  vCard properties or parameters having such values <bcp14>MAY</bcp14> convert as 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>
        <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 extension properties <tt>props</tt> or <tt>params</tt> 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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</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-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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</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 extension properties <tt>props</tt> or <tt>params</tt> defined in <xref target="new-jscontact"/>.</t>
          <figure anchor="group_conversion_params">
            <name>An example how to preserve the group name in <tt>params</tt> during conversion.</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    item1.TEL;VALUE=uri:tel:+1-555-555-5555
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "phones": {
      "p1": {
        "@type": "Phone",
        "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>props</tt> during conversion.</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    item2.X-FOO:bar
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "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>DirectoryResource</tt> objects.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</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>A non-localized Card <bcp14>SHOULD NOT</bcp14> provide less information than any of its localizations.</t>
          <t>As a general rule, an implementation <bcp14>SHOULD</bcp14> choose those vCard properties to convert to the non-localized card, that either all have the same LANGUAGE parameter value or none at all.  <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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    FN;LANGUAGE=EN:John Doe
    TITLE;LANGUAGE=EN:Boss
    TITLE;LANGUAGE=fr:Patron
    ...
    END:VCARD

    {
      "@type": "Card",
      "@version" : "1.0",
      ...
      "locale": "en",
      "fullName": "John Doe",
      "titles": {
        "t1": {
          "@type": "Title",
          "title": "Boss"
        }
      },
      "localizations": {
        "fr": {
          "titles/t1/title": "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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    FN:John Doe
    TITLE:Boss
    TITLE;LANGUAGE=fr:Patron
    ...
    END:VCARD

    {
      "@type": "Card",
      "@version" : "1.0",
      ...
      "titles": {
        "t1": {
          "@type": "Title",
          "title": "Boss"
        }
      },
      "localizations": {
        "fr": {
          "titles/t1/title": "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 locale of the main Card.  In this case, implementations <bcp14>MAY</bcp14> choose to add the localized vCard properties only to the localizations object.  Implementations <bcp14>SHOULD</bcp14> avoid this scenario as much as possible.</t>
          <figure anchor="language-patch-no-dominant">
            <name>LANGUAGE conversion example: conflicting locale and language</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    LOCALE:es
    FN:Gabriel García Márquez
    TITLE;LANGUAGE=en:Boss
    TITLE;LANGUAGE=fr:Patron
    ...
    END:VCARD

    {
      "@type": "Card",
      "@version" : "1.0",
      ...
      "locale": "es",
      "fullName": "Gabriel García Márquez",
      "localizations": {
        "en": {
          "titles": {
            "t1": {
              "@type": "Title",
              "title": "Novelist"
            }
        },
        "fr": {
          "titles": {
            "t1": {
              "@type": "Title",
              "title": "É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>
          <t>To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</t>
        </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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</t>
        </section>
        <section anchor="vcard-param-pid">
          <name>PID</name>
          <t>This does not convert to an IANA-registered property in JSContact.  To convert this parameter, 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 to.</t>
          <figure anchor="propid_conversion">
            <name>PROP-ID conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    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
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "phones": {
      "PHONE-A": {
        "@type": "Phone",
        "contexts": { "private": true },
        "features": { "voice": true },
        "number": "tel:+1-555-555-5555;ext=5555",
        "pref": 1
      },
      "PHONE-B": {
        "@type": "Phone",
        "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-ranks">
          <name>RANKS</name>
          <t>The values of this parameter convert to the <tt>rank</tt> property of the NameComponent objects inferred from the N property value.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.  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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.  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.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</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>type</tt> property values defined in later sections.</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"/>.  To convert this parameter for other vCard properties, see <xref target="jscontact-prop-vcardparams"/>.</t>
        </section>
      </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>
        <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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    KIND:individual
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "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>DirectoryResource</tt> object whose <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    SOURCE:http://directory.example.com/addressbooks/jdoe/Jean%20Dupont.vcf
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "directories": {
       ...
       "ENTRY-1": {
         "@type": "DirectoryResource",
         "type": "entry",
         "uri": "http://directory.example.com/addressbooks/jdoe/Jean%20Dupont.vcf"
       },
       ...
    },
    ...
    }
        ]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-xml">
          <name>XML</name>
          <t>This does not convert to an IANA-registered property in JSContact.</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>type</tt> is set to "birth";</t>
              <t/>
            </li>
            <li>
              <t>DEATHDATE and DEATHPLACE convert to <tt>date</tt> and <tt>place</tt> where <tt>type</tt> is set to "death";</t>
              <t/>
            </li>
            <li>ANNIVERSARY converts to <tt>date</tt> where <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    BDAY:19531015T231000Z
    BIRTHPLACE:Mail Drop: TNE QB\n123 Main Street\nAny Town, CA 91921-1234\nU.S.A.
    DEATHDATE:19960415
    DEATHPLACE:4445 Courtright Street\nNew England, ND 58647\nU.S.A.
    ANNIVERSARY:19860201
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "anniversaries": {
      "ANNIVERSARY-1" : {
        "@type": "Anniversary",
        "type": "birth",
        "date": {
          "@type": "Timestamp",
          "utc": "1953-10-15T23:10:00Z"
        },
        "place": {
          "@type": "Address",
          "fullAddress": "Mail Drop: TNE QB\n123 Main Street\nAny Town, CA 91921-1234\nU.S.A."
        }
      },
      "ANNIVERSARY-2" : {
        "@type": "Anniversary",
        "type": "death",
        "date": {
          "@type": "PartialDate",
          "year": 1996,
          "month": 4,
          "year": 15
        },
        "place": {
          "@type": "Address",
          "fullAddress": "4445 Courtright Street\nNew England, ND 58647\nU.S.A."
        }
      },
      "ANNIVERSARY-3" : {
        "@type": "Anniversary",
        "type": "wedding",
        "date": {
          "@type": "PartialDate",
          "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 GRAMMATICAL-GENDER and PRONOUNS properties of <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <section anchor="vcard-prop-grammatical-gender">
          <name>GRAMMATICAL-GENDER and PRONOUNS</name>
          <t>The GRAMMATICAL-GENDER 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>GRAMMATICAL-GENDER and PRONOUNS conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
     GRAMMATICAL-GENDER:NEUTER
     PRONOUNS;PREF=2:they/them
     PRONOUNS;PREF=1:xe/xir
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "speakToAs": {
      "grammaticalGender": "neuter",
      "pronouns": {
        "PRONOUNS-1": {
          "@type": "Pronouns",
          "pronouns": "they/them",
          "pref": 2
        },
        "PRONOUNS-2": {
          "@type": "Pronouns",
          "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 <tt>fullName</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"/>.  Name components <bcp14>SHOULD</bcp14> be ordered such that their values joined by whitespace produce a valid full name of this entity.</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 "type" 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">"type" value</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">Honorific Prefixes</td>
                <td align="left">prefix</td>
              </tr>
              <tr>
                <td align="left">Given Names</td>
                <td align="left">given</td>
              </tr>
              <tr>
                <td align="left">Family Names</td>
                <td align="left">surname</td>
              </tr>
              <tr>
                <td align="left">Additional Names</td>
                <td align="left">middle</td>
              </tr>
              <tr>
                <td align="left">Honorific Suffixes</td>
                <td align="left">suffix</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    FN:Mr.  John Q.  Public\, Esq.
    N;SORT-AS="Public,John":Public;John;Quinlan;Mr.;Esq.
    NICKNAME:Johnny
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "fullName": "Mr.  John Q.  Public, Esq.",
    "name": {
        "@type": "Name",
        "components":[
          { "@type": "NameComponent", "type": "prefix", "value": "Mr."  },
          { "@type": "NameComponent", "type": "given", "value": "John" },
          { "@type": "NameComponent", "type": "surname", "value": "Public" },
          { "@type": "NameComponent", "type": "middle", "value": "Quinlan" },
          { "@type": "NameComponent", "type": "suffix", "value": "Esq." }
        ],
        "sortAs": {
            "surname": "Public",
            "given": "John"
        }
    },
    "nickNames": {
       "NICK-1": {
          "@type": "NickName",
          "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>MediaResource</tt> object whose <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    PHOTO:http://www.example.com/pub/photos/jqpublic.gif
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "media": {
       ...
       "PHOTO-1": {
         "@type": "MediaResource",
         "type": "photo",
         "uri": "http://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.</t>
          <t>The ADR components convert into the <tt>Address</tt> properties as presented in <xref target="adr_components_vs_address_members"/> and <xref target="adr_components_vs_street_component_items"/>.</t>
          <t>The "street address" and "extended address" ADR components <bcp14>MAY</bcp14> be converted into either a single StreetComponent item or a combination of StreetComponent items.</t>
          <table anchor="adr_components_vs_address_members">
            <name>ADR components vs.  Address members conversion</name>
            <thead>
              <tr>
                <th align="left">ADR component</th>
                <th align="left">Address member</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">locality</td>
                <td align="left">locality</td>
              </tr>
              <tr>
                <td align="left">region</td>
                <td align="left">region</td>
              </tr>
              <tr>
                <td align="left">postal code</td>
                <td align="left">postcode</td>
              </tr>
              <tr>
                <td align="left">country name</td>
                <td align="left">country</td>
              </tr>
            </tbody>
          </table>
          <table anchor="adr_components_vs_street_component_items">
            <name>ADR components vs.  StreetComponent items conversion</name>
            <thead>
              <tr>
                <th align="left">ADR component</th>
                <th align="left">Single StreetComponent item</th>
                <th align="left">Combination of StreetComponent items</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">post office box</td>
                <td align="left">postOfficeBox</td>
                <td align="left"/>
              </tr>
              <tr>
                <td align="left">extended address</td>
                <td align="left">extension</td>
                <td align="left">extension, building, floor, room, apartment</td>
              </tr>
              <tr>
                <td align="left">street address</td>
                <td align="left">name</td>
                <td align="left">name, number, direction</td>
              </tr>
            </tbody>
          </table>
          <t>The LABEL parameter converts to the <tt>fullAddress</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"/>.</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>fullAddress</tt> property.</t>
          <figure anchor="adr_conversion">
            <name>ADR conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    ADR;TYPE=work;CC=US:;;54321 Oak St;Reston;VA;20190;USA
    ADR;TYPE=home;CC=US:;;12345 Elm St;Reston;VA;20190;USA
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "addresses": {
      "ADDR-1" : {
        "@type": "Address",
        "contexts": { "work": true },
        "fullAddress": "54321 Oak St\nReston\nVA\n20190\nUSA",
        "street": [
           { "@type": "StreetComponent", "type": "name", "value": "Oak St" },
           { "@type": "StreetComponent", "type": "number", "value": "54321" }
        ],
        "locality": "Reston",
        "region": "VA",
        "country": "USA",
        "postcode": "20190",
        "countryCode": "US"
      },
      "ADDR-2": {
        "@type": "Address",
        "contexts": { "private": true },
        "fullAddress":  "12345 Elm St\nReston\nVA\n20190\nUSA",
        "street": [
           { "@type": "StreetComponent", "type": "name", "value": "Elm St" },
           { "@type": "StreetComponent", "type": "number", "value": "12345" }
        ],
        "locality": "Reston",
        "region": "VA",
        "country": "USA",
        "postcode": "20190",
        "countryCode": "US"
      }
    },
    ...
    }
        ]]></artwork>
          </figure>
        </section>
      </section>
      <section>
        <name>Communications Properties</name>
        <section anchor="vcard-prop-contact-channel-pref">
          <name>CONTACT-CHANNEL-PREF</name>
          <t>A CONTACT-CHANNEL-PREF property converts to an entry in the <tt>preferredContactChannels</tt> property (<xref target="contact_channel_conversion"/>).  The entry key set is defined in <xref target="contact_channel_key_conversion"/>, the related entry values are arrays of <tt>ContactChannelPreference</tt> objects.</t>
          <table anchor="contact_channel_key_conversion">
            <name>CONTACT-CHANNEL-PREF values conversion</name>
            <thead>
              <tr>
                <th align="left">CONTACT-CHANNEL-PREF value</th>
                <th align="left">"preferredContactChannels" key</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">ADR</td>
                <td align="left">addresses</td>
              </tr>
              <tr>
                <td align="left">EMAIL</td>
                <td align="left">emails</td>
              </tr>
              <tr>
                <td align="left">IMPP</td>
                <td align="left">onlineServices</td>
              </tr>
              <tr>
                <td align="left">TEL</td>
                <td align="left">phones</td>
              </tr>
            </tbody>
          </table>
          <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>ContactChannelPreference</tt> objects <bcp14>MUST</bcp14> be empty.</t>
          <figure anchor="contact_channel_conversion">
            <name>LANG conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    CONTACT-CHANNEL-PREF;PREF=1:EMAIL
    CONTACT-CHANNEL-PREF;PREF=2:TEL
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "preferredContactChannels": {
      "emails":[
        {
          "@type": "ContactChannelPreference",
          "pref": 1
        }
      ],
      "phones":[
        {
          "@type": "ContactChannelPreference",
          "pref": 2
        }
      ]
    },
    ...
    }
        ]]></artwork>
          </figure>
          <t>Note: This property is defined in <xref target="I-D.ietf-calext-vcard-jscontact-extensions"/>.</t>
        </section>
        <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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    EMAIL;TYPE=work:jqpublic@xyz.example.com
    EMAIL;PREF=1:jane_doe@example.com
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "emails": {
      "EMAIL-1": {
        "@type": "EmailAddress",
        "contexts": { "work": true },
        "address": "jqpublic@xyz.example.com"
      },
      "EMAIL-2": {
        "@type": "EmailAddress",
        "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 <tt>type</tt> of the OnlineService is set to <tt>impp</tt>.  The entry value is a <tt>OnlineService</tt> object and the <tt>user</tt> property is set to the IMPP value.  </t>
          <t>The 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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    IMPP;PREF=1:xmpp:alice@example.com
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "onlineServices": {
      ...
      "OS-1": {
        "@type": "OnlineService",
        "user": "xmpp:alice@example.com",
        "type": "impp",
        "pref": 1
      },
      ...
    },
    ...
    }
        ]]></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>LanguagePreference</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>LanguagePreference</tt> objects <bcp14>MUST</bcp14> be empty.</t>
          <figure anchor="lang_conversion">
            <name>LANG conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    LANG;TYPE=work;PREF=1:en
    LANG;TYPE=work;PREF=2:fr
    LANG;TYPE=home:fr
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "preferredLanguages": {
      "en":[
        {
          "@type": "LanguagePreference",
          "contexts": { "work": true },
          "pref": 1
        }
      ],
      "fr":[
        {
          "@type": "LanguagePreference",
          "contexts": { "work": true },
          "pref": 2
        },
        {
          "@type": "LanguagePreference",
          "contexts": { "private": true }
        }
      ]
    },
    ...
    }
        ]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-locale">
          <name>LOCALE</name>
          <t>The LOCALE property converts to the <tt>locale</tt> property (<xref target="locale_conversion"/>).</t>
          <figure anchor="locale_conversion">
            <name>LOCALE conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    LOCALE:de-AT
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "locale": "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"/>).  If the value type of the SOCIALPROFILE is TEXT, then the <tt>type</tt> of the OnlineService is set to <tt>username</tt>. Otherwise, the <tt>type</tt> is set to <tt>uri</tt>.  The entry value is a <tt>OnlineService</tt> object and the <tt>user</tt> property is set to the property value.  </t>
          <t>The PREF and TYPE parameters convert according to the rules as defined in <xref target="vcard-parameters"/>.</t>
          <figure anchor="socialprofile_conversion">
            <name>IMPP conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    SOCIALPROFILE;SERVICE-TYPE=Twitter:https://twitter.com/ietf
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "onlineServices": {
      ...
      "OS-1": {
        "@type": "OnlineService",
        "service": "Twitter",
        "user": "https://twitter.com/ietf",
        "type": "uri"
      },
      ...
    },
    ...
    }
        ]]></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 <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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    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
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "phones": {
      "PHONE-1": {
        "@type": "Phone",
        "contexts": { "private": true },
        "features": { "voice": true },
        "number": "tel:+1-555-555-5555;ext=5555",
        "pref": 1
      },
      "PHONE-2": {
        "@type": "Phone",
        "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>SHOULD</bcp14> convert the properties to the <em>same</em> address for the following cases:</t>
          <ul>
            <li>The ALTID parameter values of the properties match.</li>
            <li>The ALTID 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>LinkResource</tt> object whose  <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    CONTACT-URI;PREF=1:mailto:contact@example.com
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "links": {
      ...
      "CONTACT-1": {
        "@type": "LinkResource",
        "type": "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>MediaResource</tt> object whose <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    LOGO:http://www.example.com/pub/logos/abccorp.jpg
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "media": {
      ...
      "LOGO-1": {
        "@type": "MediaResource",
        "type": "logo",
        "uri": "http://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 implementers <bcp14>MAY</bcp14> insert the map entries by order of preference.</t>
          <figure anchor="group_example">
            <name>Group example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    KIND:group
    FN:The Doe family
    MEMBER:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af
    MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
    END:VCARD

      {
        "@type": "Card",
        "@version" : "1.0",
        "kind": "group",
        "fullName": "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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    ORG;SORT-AS="ABC":ABC\, Inc.;North American Division;Marketing
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "organizations": {
      "ORG-1": {
        "@type": "Organization",
        "name": "ABC, Inc.",
        "units":[
          {"@type": "OrgUnit", "name": "North American Division"},
          {"@type": "OrgUnit", "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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    RELATED;TYPE=friend:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
    RELATED;TYPE=contact:http://example.com/directory/jdoe.vcf
    RELATED;VALUE=text:Please contact my assistant Jane Doe for any inquiries.
    ...
    END:VCARD

    {
      "@type" : "Card",
      "@version" : "1.0",
      ...
      "relatedTo" : {
        "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6" : {
          "@type" : "Relation",
          "relation" : {
            "friend" : true
          }
        },
        "http://example.com/directory/jdoe.vcf" : {
          "@type" : "Relation",
          "relation" : {
            "contact" : true
          }
        },
        "Please contact my assistant Jane Doe for any inquiries." : {
          "@type" : "Relation",
          "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>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    TITLE:Research Scientist
    group1.ROLE:Project Leader
    group1.ORG:ABC, Inc.
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "titles": {
      "TITLE-1": {
        "@type": "Title",
        "type": "title",
        "name": "Project Leader"
      },
      "TITLE-2": {
        "@type": "Title",
        "type": "role",
        "name": "Research Scientist",
        "organization": "ORG-1"
      }
    },
    "organizations": {
      "ORG-1": {
        "@type": "Organization",
        "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>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    EXPERTISE;LEVEL=beginner;INDEX=2:chinese literature
    EXPERTISE;INDEX=1;LEVEL=expert:chemistry
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "personalInfo": {
      ...
      "PERSINFO-1" : {
        "@type": "PersonalInfo",
        "type": "expertise",
        "value": "chinese literature",
         "level": "low",
         "position": 2
      },
      "PERSINFO-2" : {
        "@type": "PersonalInfo",
        "type": "expertise",
        "value": "chemistry",
        "level": "high",
        "position": 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>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    HOBBY;INDEX=1;LEVEL=high:reading
    HOBBY;INDEX=2;LEVEL=high:sewing
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "personalInfo": {
      ...
      "PERSINFO-1" : {
        "@type": "PersonalInfo",
        "type": "hobby",
        "value": "reading",
        "level": "high",
        "position": 1
      },
      "PERSINFO-2" : {
        "@type": "PersonalInfo",
        "type": "hobby",
        "value": "sewing",
        "level": "high",
        "position": 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>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    INTEREST;INDEX=1;LEVEL=medium:r&b music
    INTEREST;INDEX=2;LEVEL=high:rock ’n’ roll music
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "personalInfo": {
      ...
      "PERSINFO-1" : {
        "@type": "PersonalInfo",
        "type": "interest",
        "value": "r&b music",
        "level": "medium",
        "position": 1
      },
      "PERSINFO-2" : {
        "@type": "PersonalInfo",
        "type": "interest",
        "value": "rock ’n’ roll music",
        "level": "high",
        "position": 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>DirectoryResource</tt> object whose <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    ORG-DIRECTORY;INDEX=1:http://directory.mycompany.example.com
    ORG-DIRECTORY;PREF=1:ldap://ldap.tech.example/o=Example%20Tech,ou=Engineering
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "directories": {
      ...
      "DIRECTORY-1": {
        "@type": "DirectoryResource",
        "type": "directory",
        "uri": "http://directory.mycompany.example.com",
        "position": 1
      },
      "DIRECTORY-2": {
        "@type": "DirectoryResource",
        "type": "directory",
        "uri": "ldap://ldap.tech.example/o=Example%20Tech,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 implementers <bcp14>MAY</bcp14> insert the map entries by order of preference.</t>
          <figure anchor="categories_conversion">
            <name>CATEGORIES conversion example</name>
            <artwork><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "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>The CLIENTPIDMAP property and the PDI parameter don't have a direct match with a Card feature.</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    CREATED:19940930T143510Z
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    NOTE;CREATED=20221123T150132Z;AUTHOR-NAME="John":
      This fax number is operational 0800 to 1715 EST\, Mon-Fri.
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "notes": {
        "NOTE-1" : {
           "note": "This fax number is operational 0800 to 1715 EST, Mon-Fri.",
           "created": "2022-11-23T15:01:32Z",
           "author": {
             "@type": "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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "prodId": "-//ONLINE DIRECTORY//NONSGML Version 1//EN",
    ...
    }
        ]]></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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    REV:19951031T222710Z
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "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>MediaResource</tt> object whose <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    SOUND:CID:JOHNQPUBLIC.part8.19960229T080000.xyzMail@example.com
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "media": {
      ...
      "SOUND-1": {
        "@type": "MediaResource",
        "type": "sound",
        "uri": "CID:JOHNQPUBLIC.part8.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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "uid": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
    ...
    }
        ]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-url">
          <name>URL</name>
          <t>An URL property converts to an entry in the <tt>links</tt> property (<xref target="url_conversion"/>).  The entry value is a <tt>LinkResource</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    URL:http://example.org/restaurant.french/~chezchic.html
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "links": {
      ...
      "LINK-1": {
        "@type": "LinkResource",
        "uri": "http://example.org/restaurant.french/~chezchic.html"
      },
      ...
    },
    ...
    }
        ]]></artwork>
          </figure>
        </section>
        <section anchor="vcard-prop-version">
          <name>VERSION</name>
          <t>The VERSION property doesn't have a direct match with a JSContact feature.</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    item1.TEL;VALUE=uri:tel:+1-555-555-5555
    item1.X-ABLabel:foo
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "phones": {
      "p1": {
        "@type": "Phone",
        "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>CryptoResource</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    KEY:http://www.example.com/keys/jdoe.cer
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "cryptoKeys": {
      ...
      "KEY-1": {
        "@type": "CryptoResource",
        "uri": "http://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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    CALADRURI;PREF=1:mailto:janedoe@example.com
    CALADRURI:http://example.com/calendar/jdoe
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "schedulingAddresses": {
      ...
      "SCHEDULING-1": {
        "@type": "SchedulingAddress",
        "uri": "mailto:janedoe@example.com",
        "pref": 1
      },
      "SCHEDULING-2": {
        "@type": "SchedulingAddress",
        "uri": "http://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>CalendarResource</tt> object whose <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    CALURI;PREF=1:http://cal.example.com/calA
    CALURI;MEDIATYPE=text/calendar:ftp://ftp.example.com/calA.ics
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "calendars": {
      ...
      "CAL-1": {
        "@type": "CalendarResource",
        "type": "calendar",
        "uri": "http://cal.example.com/calA",
        "pref": 1
      },
      "CAL-2": {
        "@type": "CalendarResource",
        "type": "calendar",
        "uri": "ftp://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>CalendarResource</tt> object whose <tt>type</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[
    BEGIN:VCARD
    VERSION:4.0
    ...
    FBURL;PREF=1:http://www.example.com/busy/janedoe
    FBURL;MEDIATYPE=text/calendar:ftp://example.com/busy/project-a.ifb
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "calendars": {
      ...
      "FBURL-1": {
        "@type": "CalendarResource",
        "type": "freeBusy",
        "uri": "http://www.example.com/busy/janedoe",
        "pref": 1
      },
      "FBURL-2": {
        "@type": "CalendarResource",
        "type": "freeBusy",
        "uri": "ftp://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 extended properties and parameters of which the semantics or purposes are unknown <xref target="RFC6350" section="6.10"/>.</t>
        <t>This section defines JSContact extension 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.  It <bcp14>MAY</bcp14> contain vCard IANA-registered properties which also got converted to an IANA-registered property in the same JSContact object.  In case of conflict, the values of the JSContact property <bcp14>MUST</bcp14> be used.</dd>
            <dt>Example:</dt>
            <dd>
              <t>This illustrates how to convert a vCard extension property:</t>
              <figure anchor="props_conversion">
                <name>JSContact <tt>props</tt> example</name>
                <sourcecode name=""><![CDATA[
    BEGIN:VCARD
    VERSION:4.0
    ...
    item1.X-FOO;X-BAR=Hello:World!
    ...
    END:VCARD

    {
    "@type": "Card",
    "@version" : "1.0",
    ...
    "vCardProps": [
      ["x-foo", {
        "x-bar": "Hello",
        "group": "item1"
      }, "unknown", "World!"]
    ]
    ...
    }
        ]]></sourcecode>
              </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.  Typically, these are parameters for which no IANA-registered property is defined in the JSContact object.  It <bcp14>MAY</bcp14> contain vCard IANA-registered parameters which also got converted to an IANA-registered property in the same JSContact object.  In case of conflict, the values of the JSContact property <bcp14>MUST</bcp14> be used.</dd>
            <dt>Example:</dt>
            <dd>
              <sourcecode><![CDATA[
EMAIL;X-FOO=Bar:jane_doe@example.com
]]></sourcecode>
              <t>converts to</t>
              <sourcecode><![CDATA[
"emails": {
  "email1": {
    "@type": "EmailAddress",
    "address": "jane_doe@example.com",
    "vCardParams": {
      "x-foo": "Bar"
    }
  }
}
]]></sourcecode>
            </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.  <xref target="table_convert_jscontact_to_vcard"/> lists the relevant document sections for each JSContact object type and property.  The following additional rules apply:</t>
        <ul>
          <li>Multi-valued 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>The <tt>fullName</tt> property in JSContact is optional, but it is mandatory in vCard.  If the <tt>fullName</tt> is not set but the <tt>name</tt> property is, then implementations <bcp14>MAY</bcp14> derive the value of the FN property from it.  In this case, they <bcp14>MUST</bcp14> set the DERIVED parameter on the FN property.  Otherwise, they <bcp14>MUST</bcp14> set the FN property with an empty value.</li>
          <li>Vendor-extension and unknown properties convert to vCard as outlined in section <xref target="convert-other-jscontact"/>.</li>
        </ul>
        <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>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>fullAddress</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>region</td>
              <td>
                <xref target="vcard-prop-adr"/>
              </td>
            </tr>
            <tr>
              <td>Address</td>
              <td>street</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>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>place</td>
              <td>
                <xref target="vcard-prop-anniversary"/>
              </td>
            </tr>
            <tr>
              <td>Anniversary</td>
              <td>type</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>CalendarResource</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>CalendarResource</td>
              <td>contexts</td>
              <td>
                <xref target="vcard-param-type"/>
              </td>
            </tr>
            <tr>
              <td>CalendarResource</td>
              <td>label</td>
              <td>
                <xref target="vcard-prop-xablabel"/>
              </td>
            </tr>
            <tr>
              <td>CalendarResource</td>
              <td>mediaType</td>
              <td>
                <xref target="vcard-param-mediatype"/>
              </td>
            </tr>
            <tr>
              <td>CalendarResource</td>
              <td>pref</td>
              <td>
                <xref target="vcard-param-pref"/>
              </td>
            </tr>
            <tr>
              <td>CalendarResource</td>
              <td>type</td>
              <td><xref target="vcard-prop-caladruri"/>, <xref target="vcard-prop-fburl"/></td>
            </tr>
            <tr>
              <td>CalendarResource</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>fullName</td>
              <td>
                <xref target="vcard-prop-fn"/>
              </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>locale</td>
              <td>
                <xref target="vcard-prop-locale"/>
              </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>preferredContactChannels</td>
              <td>
                <xref target="vcard-prop-contact-channel-pref"/>
              </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-grammatical-gender"/>
              </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>ContactChannelPreference</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>ContactChannelPreference</td>
              <td>contexts</td>
              <td>
                <xref target="vcard-param-type"/>
              </td>
            </tr>
            <tr>
              <td>ContactChannelPreference</td>
              <td>pref</td>
              <td>
                <xref target="vcard-param-pref"/>
              </td>
            </tr>
            <tr>
              <td>CryptoResource</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>CryptoResource</td>
              <td>contexts</td>
              <td>
                <xref target="vcard-param-type"/>
              </td>
            </tr>
            <tr>
              <td>CryptoResource</td>
              <td>label</td>
              <td>
                <xref target="vcard-prop-xablabel"/>
              </td>
            </tr>
            <tr>
              <td>CryptoResource</td>
              <td>mediaType</td>
              <td>
                <xref target="vcard-param-mediatype"/>
              </td>
            </tr>
            <tr>
              <td>CryptoResource</td>
              <td>pref</td>
              <td>
                <xref target="vcard-param-pref"/>
              </td>
            </tr>
            <tr>
              <td>CryptoResource</td>
              <td>type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>CryptoResource</td>
              <td>uri</td>
              <td>
                <xref target="vcard-prop-key"/>
              </td>
            </tr>
            <tr>
              <td>DirectoryResource</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>DirectoryResource</td>
              <td>contexts</td>
              <td>
                <xref target="vcard-param-type"/>
              </td>
            </tr>
            <tr>
              <td>DirectoryResource</td>
              <td>label</td>
              <td>
                <xref target="vcard-prop-xablabel"/>
              </td>
            </tr>
            <tr>
              <td>DirectoryResource</td>
              <td>listAs</td>
              <td>
                <xref target="vcard-param-index"/>
              </td>
            </tr>
            <tr>
              <td>DirectoryResource</td>
              <td>mediaType</td>
              <td>
                <xref target="vcard-param-mediatype"/>
              </td>
            </tr>
            <tr>
              <td>DirectoryResource</td>
              <td>pref</td>
              <td>
                <xref target="vcard-param-pref"/>
              </td>
            </tr>
            <tr>
              <td>DirectoryResource</td>
              <td>type</td>
              <td><xref target="vcard-prop-source"/>, <xref target="vcard-prop-org-directory"/></td>
            </tr>
            <tr>
              <td>DirectoryResource</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>LanguagePreference</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>LanguagePreference</td>
              <td>contexts</td>
              <td>
                <xref target="vcard-param-type"/>
              </td>
            </tr>
            <tr>
              <td>LanguagePreference</td>
              <td>pref</td>
              <td>
                <xref target="vcard-param-pref"/>
              </td>
            </tr>
            <tr>
              <td>LinkResource</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>LinkResource</td>
              <td>contexts</td>
              <td>
                <xref target="vcard-param-type"/>
              </td>
            </tr>
            <tr>
              <td>LinkResource</td>
              <td>label</td>
              <td>
                <xref target="vcard-prop-xablabel"/>
              </td>
            </tr>
            <tr>
              <td>LinkResource</td>
              <td>mediaType</td>
              <td>
                <xref target="vcard-param-mediatype"/>
              </td>
            </tr>
            <tr>
              <td>LinkResource</td>
              <td>pref</td>
              <td>
                <xref target="vcard-param-pref"/>
              </td>
            </tr>
            <tr>
              <td>LinkResource</td>
              <td>type</td>
              <td><xref target="vcard-prop-contact-uri"/>, <xref target="vcard-prop-url"/></td>
            </tr>
            <tr>
              <td>LinkResource</td>
              <td>uri</td>
              <td><xref target="vcard-prop-contact-uri"/>, <xref target="vcard-prop-url"/>&gt;</td>
            </tr>
            <tr>
              <td>MediaResource</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>MediaResource</td>
              <td>contexts</td>
              <td>
                <xref target="vcard-param-type"/>
              </td>
            </tr>
            <tr>
              <td>MediaResource</td>
              <td>label</td>
              <td>
                <xref target="vcard-prop-xablabel"/>
              </td>
            </tr>
            <tr>
              <td>MediaResource</td>
              <td>mediaType</td>
              <td>
                <xref target="vcard-param-mediatype"/>
              </td>
            </tr>
            <tr>
              <td>MediaResource</td>
              <td>pref</td>
              <td>
                <xref target="vcard-param-pref"/>
              </td>
            </tr>
            <tr>
              <td>MediaResource</td>
              <td>type</td>
              <td><xref target="vcard-prop-photo"/>, <xref target="vcard-prop-logo"/>, <xref target="vcard-prop-sound"/></td>
            </tr>
            <tr>
              <td>MediaResource</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"/>
              </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>rank</td>
              <td>
                <xref target="vcard-param-ranks"/>
              </td>
            </tr>
            <tr>
              <td>NameComponent</td>
              <td>type</td>
              <td>
                <xref target="vcard-prop-n"/>
              </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>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>type</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-prop-impp"/>, <xref target="vcard-prop-socialprofile"/></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>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>type</td>
              <td><xref target="vcard-prop-expertise"/>, <xref target="vcard-prop-hobby"/>, <xref target="vcard-prop-interest"/></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-grammatical-gender"/>
              </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-grammatical-gender"/>
              </td>
            </tr>
            <tr>
              <td>SpeakToAs</td>
              <td>pronouns</td>
              <td>
                <xref target="vcard-prop-grammatical-gender"/>
              </td>
            </tr>
            <tr>
              <td>StreetComponent</td>
              <td>@type</td>
              <td>not applicable</td>
            </tr>
            <tr>
              <td>StreetComponent</td>
              <td>type</td>
              <td>
                <xref target="vcard-prop-adr"/>
              </td>
            </tr>
            <tr>
              <td>StreetComponent</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>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>
            <tr>
              <td>Title</td>
              <td>type</td>
              <td>
                <xref target="vcard-prop-title"/>
              </td>
            </tr>
          </tbody>
        </table>
      </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 JSContact.  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 exactly once for this property.
              The VALUE parameter <bcp14>MAY</bcp14> be set once, in which case its value
              <bcp14>MUST</bcp14> be URI.  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>SHOULD</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 always is 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 <bcp14>SHOULD</bcp14> be 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 CRLF

  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[
  {
    "@type": "Card",
    "@version" : "1.0",
     ...
     "someUnknownProperty": true
  }

  BEGIN:VCARD
  VERSION:4.0
  ...
  JSCONTACT-PROP;VALUE=TEXT;JSPTR="someUnknownProperty":true
  ...
  END:VCARD
]]></artwork>
              </figure>
              <t>This illustrates how to convert a vendor-extension 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-extension">
                <name>Vendor-extension conversion example</name>
                <artwork><![CDATA[
  {
    "@type": "Card",
    "@version" : "1.0",
     ...
     "example.com:foo": {
       "bar": 1234
     }
  }

  BEGIN:VCARD
  VERSION:4.0
  ...
  JSCONTACT-PROP;VALUE=TEXT;JSPTR="example.com:foo":{"bar":1234}
  ...
  END:VCARD
]]></artwork>
              </figure>
              <t>This illustrates how to convert a vendor-extension 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 property example with path relative to Card</name>
                <artwork><![CDATA[
  {
    "@type": "Card",
    "@version" : "1.0",
     ...
     "phones": {
       "phone1": {
         "@type": "Phone",
         "number": "tel:+33-01-23-45-67"
         ...
        "example.com:foo/bar": "tux hux"
       }
     }
  }

  BEGIN:VCARD
  VERSION:4.0
  TEL:tel:+33-01-23-45-67
  JSCONTACT-PROP;VALUE=TEXT;JSPTR="phones/phone1/example.com:foo~1bar":"tux hux"
  ...
  END:VCARD
]]></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;VALUE=TEXT;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.</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>
              <th align="left">Since Version</th>
              <th align="left">Until Version</th>
              <th align="left">Change Controller</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">vCardParams</td>
              <td align="left">String[String]</td>
              <td align="left">Any JSContact object type that contains the <tt>@type</tt> property.</td>
              <td align="left">
                <xref target="jscontact-prop-vcardparams" format="default"/>
              </td>
              <td align="left">common</td>
              <td align="left">1.0</td>
              <td align="left"/>
              <td align="left">IETF</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>
              <td align="left">1.0</td>
              <td align="left"/>
              <td align="left">IETF</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.</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>
              <th align="left">Since Version</th>
              <th align="left">Until Version</th>
              <th align="left">Change Controller</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>
              <td align="left">1.0</td>
              <td align="left"/>
              <td align="left">IETF</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 of the 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://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.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"/>
      </references>
      <references>
        <name>Informative 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.8605.xml"/>
      </references>
    </references>
  </back>
</rfc>
