<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[13328] CalendarServer/branches/users/sagen/newcua-1</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/13328">13328</a></dd>
<dt>Author</dt> <dd>sagen@apple.com</dd>
<dt>Date</dt> <dd>2014-04-18 12:16:12 -0700 (Fri, 18 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge trunk into branch</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServerbranchesuserssagennewcua1calendarservertapcaldavpy">CalendarServer/branches/users/sagen/newcua-1/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1calendarservertoolscalverifypy">CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/calverify.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1calendarservertoolspurgepy">CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/purge.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1calendarservertoolsshellcmdpy">CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/shell/cmd.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1calendarservertoolstesttest_calverifypy">CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_calverify.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1calendarservertoolstesttest_purgepy">CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1calendarservertoolstesttest_purge_old_eventspy">CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge_old_events.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformance_event_createpy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/_event_create.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksbounded_recurrence_autoacceptpy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksevent_autoacceptpy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/event_autoaccept.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksunbounded_recurrence_autoacceptpy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksvfreebusypy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksvfreebusy_vary_attendeespy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy_vary_attendees.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformanceloadtestprofilespy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/loadtest/profiles.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformancesqlusagesqlusagepy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/sqlusage/sqlusage.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1contribperformancetest_event_change_datepy">CalendarServer/branches/users/sagen/newcua-1/contrib/performance/test_event_change_date.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavdirectoryprincipalpy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/principal.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavdirectorytesttest_principalpy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/test_principal.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavdirectorytestutilpy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/util.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavicalpy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/ical.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavsharingpy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/sharing.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavstorebridgepy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/storebridge.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavtesttest_icalendarpy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_icalendar.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavtesttest_sharingpy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_sharing.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavtesttest_upgradepy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_upgrade.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1twistedcaldavupgradepy">CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/upgrade.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingimipinboundpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/imip/inbound.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingimplicitpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/implicit.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingischeduledeliverypy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/ischedule/delivery.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingtesttest_implicitpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoresqlpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretesttest_implicitpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretesttest_queue_schedulingpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_queue_scheduling.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretesttest_sqlpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretestutilpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreutilpy">CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/util.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavcommondatastoresql_schemacurrentsql">CalendarServer/branches/users/sagen/newcua-1/txdav/common/datastore/sql_schema/current.sql</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavwhodirectorypy">CalendarServer/branches/users/sagen/newcua-1/txdav/who/directory.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavwhotesttest_directorypy">CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_directory.py</a></li>
<li><a href="#CalendarServerbranchesuserssagennewcua1txdavwhotesttest_group_attendeespy">CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_group_attendees.py</a></li>
</ul>

<h3>Property Changed</h3>
<ul>
<li><a href="#CalendarServerbranchesuserssagennewcua1">CalendarServer/branches/users/sagen/newcua-1/</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServerbranchesuserssagennewcua1"></a>
<div class="propset"><h4>Property changes: CalendarServer/branches/users/sagen/newcua-1</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4>Modified: svn:mergeinfo</h4></div>
<span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.2-dev:11972,12357-12358,12794,12814
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cross-pod-sharing:12038-12191
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/scheduling-queue-refresh:11783-12557
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/cleanrevisions:12152-12334
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroupfixes:12120-12142
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who:12819-12860
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-2:12861-12898
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-3:12899-12913
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-4:12914-13157
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-5:13158-13163
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><span class="cx">   + /CalDAVTester/trunk:11193-11198
</span><span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.2-dev:11972,12357-12358,12794,12814
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cross-pod-sharing:12038-12191
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/scheduling-queue-refresh:11783-12557
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/cleanrevisions:12152-12334
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroupfixes:12120-12142
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who:12819-12860
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-2:12861-12898
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-3:12899-12913
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-4:12914-13157
</span><span class="cx">/CalendarServer/branches/users/sagen/move2who-5:13158-13163
</span><span class="cx">/CalendarServer/branches/users/sagen/newcua:13309-13327
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><a id="CalendarServerbranchesuserssagennewcua1calendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/calendarserver/tap/caldav.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/calendarserver/tap/caldav.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/calendarserver/tap/caldav.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -604,8 +604,15 @@
</span><span class="cx">             int(config.LogID) if config.LogID else 5
</span><span class="cx">         )
</span><span class="cx"> 
</span><ins>+        # FIXME: uncomment this when purge is working
+        # from calendarserver.tools.purge import scheduleNextPrincipalPurgeUpdate
+        # yield scheduleNextPrincipalPurgeUpdate(
+        #     self.store,
+        #     int(config.LogID) if config.LogID else 5
+        # )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class PreProcessingService(Service):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     A Service responsible for running any work that needs to be finished prior
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1calendarservertoolscalverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/calverify.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/calverify.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/calverify.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -40,7 +40,6 @@
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-import base64
</del><span class="cx"> import collections
</span><span class="cx"> import sys
</span><span class="cx"> import time
</span><span class="lines">@@ -256,7 +255,6 @@
</span><span class="cx"> Options for --ical:
</span><span class="cx"> 
</span><span class="cx"> --badcua   : only look for bad calendar user addresses.
</span><del>---nobase64 : do not apply base64 encoding to CALENDARSERVER-OLD-CUA.
</del><span class="cx"> --uuid     : only scan specified calendar homes. Can be a partial GUID
</span><span class="cx">              to scan all GUIDs with that as a prefix.
</span><span class="cx"> --uid      : scan only calendar data with the specific iCalendar UID.
</span><span class="lines">@@ -299,7 +297,7 @@
</span><span class="cx"> CHANGES
</span><span class="cx"> v8: Detects ORGANIZER or ATTENDEE properties with mailto: calendar user
</span><span class="cx">     addresses for users that have valid directory records. Fix is to
</span><del>-    replace the value with a urn:uuid: form.
</del><ins>+    replace the value with a urn:x-uid: form.
</ins><span class="cx"> 
</span><span class="cx"> v9: Detects double-bookings.
</span><span class="cx"> 
</span><span class="lines">@@ -324,9 +322,7 @@
</span><span class="cx"> 
</span><span class="cx">     optFlags = [
</span><span class="cx">         ['ical', 'i', &quot;Calendar data check.&quot;],
</span><del>-        ['badcua', 'b', &quot;Calendar data check for bad CALENDARSERVER-OLD-CUA only.&quot;],
</del><span class="cx">         ['debug', 'D', &quot;Debug logging.&quot;],
</span><del>-        ['nobase64', 'n', &quot;Do not apply CALENDARSERVER-OLD-CUA base64 transform when fixing.&quot;],
</del><span class="cx">         ['mismatch', 's', &quot;Detect organizer/attendee mismatches.&quot;],
</span><span class="cx">         ['missing', 'm', &quot;Show 'orphaned' homes.&quot;],
</span><span class="cx">         ['double', 'd', &quot;Detect double-bookings.&quot;],
</span><span class="lines">@@ -696,21 +692,6 @@
</span><span class="cx">         try:
</span><span class="cx">             caldata = Calendar.parseText(rows[0][0]) if rows else None
</span><span class="cx">         except ErrorBase:
</span><del>-            caltxt = rows[0][0] if rows else None
-            if caltxt:
-                caltxt = caltxt.replace(&quot;\r\n &quot;, &quot;&quot;)
-                if caltxt.find(&quot;CALENDARSERVER-OLD-CUA=\&quot;//&quot;) != -1:
-                    if doFix:
-                        caltxt = (yield self.fixBadOldCua(resid, caltxt))
-                        try:
-                            caldata = Calendar.parseText(caltxt) if rows else None
-                        except ErrorBase:
-                            self.parseError = &quot;No fix bad CALENDARSERVER-OLD-CUA&quot;
-                            returnValue(None)
-                    else:
-                        self.parseError = &quot;Bad CALENDARSERVER-OLD-CUA&quot;
-                        returnValue(None)
-
</del><span class="cx">             self.parseError = &quot;Failed to parse&quot;
</span><span class="cx">             returnValue(None)
</span><span class="cx"> 
</span><span class="lines">@@ -743,68 +724,7 @@
</span><span class="cx">         returnValue((caldata, rows[0][1], rows[0][2], rows[0][3],) if rows else (None, None, None, None,))
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @inlineCallbacks
-    def fixBadOldCua(self, resid, caltxt):
-        &quot;&quot;&quot;
-        Fix bad CALENDARSERVER-OLD-CUA lines and write fixed data to store. Assumes iCalendar data lines unfolded.
-        &quot;&quot;&quot;
</del><span class="cx"> 
</span><del>-        # Get store objects
-        homeID, calendarID = yield self.getAllResourceInfoForResourceID(resid)
-        home = yield self.txn.calendarHomeWithResourceID(homeID)
-        calendar = yield home.childWithID(calendarID)
-        calendarObj = yield calendar.objectResourceWithID(resid)
-
-        # Do raw data fix one line at a time
-        caltxt = self.fixBadOldCuaLines(caltxt)
-
-        # Re-parse
-        try:
-            component = Component.fromString(caltxt)
-        except InvalidICalendarDataError:
-            returnValue(None)
-
-        # Write out fix, commit and get a new transaction
-        # Use _migrating to ignore possible overridden instance errors - we are either correcting or ignoring those
-        self.txn._migrating = True
-        component = yield calendarObj._setComponentInternal(component, internal_state=ComponentUpdateState.RAW)
-        yield self.txn.commit()
-        self.txn = self.store.newTransaction()
-
-        returnValue(caltxt)
-
-
-    def fixBadOldCuaLines(self, caltxt):
-        &quot;&quot;&quot;
-        Fix bad CALENDARSERVER-OLD-CUA lines. Assumes iCalendar data lines unfolded.
-        &quot;&quot;&quot;
-
-        # Do raw data fix one line at a time
-        lines = caltxt.splitlines()
-        for ctr, line in enumerate(lines):
-            startpos = line.find(&quot;;CALENDARSERVER-OLD-CUA=\&quot;//&quot;)
-            if startpos != -1:
-                endpos = line.find(&quot;urn:uuid:&quot;)
-                if endpos != -1:
-                    endpos += len(&quot;urn:uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\&quot;&quot;)
-                    badparam = line[startpos + len(&quot;;CALENDARSERVER-OLD-CUA=\&quot;&quot;):endpos]
-                    endbadparam = badparam.find(&quot;;&quot;)
-                    if endbadparam != -1:
-                        badparam = badparam[:endbadparam].replace(&quot;\\&quot;, &quot;&quot;)
-                        if badparam.find(&quot;8443&quot;) != -1:
-                            badparam = &quot;https:&quot; + badparam
-                        else:
-                            badparam = &quot;http:&quot; + badparam
-                        if self.options[&quot;nobase64&quot;]:
-                            badparam = &quot;\&quot;&quot; + badparam + &quot;\&quot;&quot;
-                        else:
-                            badparam = &quot;base64-%s&quot; % (base64.b64encode(badparam),)
-                        badparam = &quot;;CALENDARSERVER-OLD-CUA=&quot; + badparam
-                        lines[ctr] = line[:startpos] + badparam + line[endpos:]
-        caltxt = &quot;\r\n&quot;.join(lines) + &quot;\r\n&quot;
-        return caltxt
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def removeEvent(self, resid):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -1274,15 +1194,6 @@
</span><span class="cx">                         else:
</span><span class="cx">                             raise InvalidICalendarDataError(&quot;iCalendar ORGANIZER missing mailto:&quot;)
</span><span class="cx"> 
</span><del>-                # CALENDARSERVER-OLD-CUA needs to be base64 encoded
-                if organizer.hasParameter(&quot;CALENDARSERVER-OLD-CUA&quot;):
-                    oldcua = organizer.parameterValue(&quot;CALENDARSERVER-OLD-CUA&quot;)
-                    if not oldcua.startswith(&quot;base64-&quot;) and not self.options[&quot;nobase64&quot;]:
-                        if doFix:
-                            organizer.setParameter(&quot;CALENDARSERVER-OLD-CUA&quot;, &quot;base64-%s&quot; % (base64.b64encode(oldcua)))
-                        else:
-                            raise InvalidICalendarDataError(&quot;iCalendar ORGANIZER CALENDARSERVER-OLD-CUA not base64&quot;)
-
</del><span class="cx">             for attendee in subcomponent.properties(&quot;ATTENDEE&quot;):
</span><span class="cx">                 cuaddr = attendee.value()
</span><span class="cx"> 
</span><span class="lines">@@ -1307,16 +1218,7 @@
</span><span class="cx">                         else:
</span><span class="cx">                             raise InvalidICalendarDataError(&quot;iCalendar ATTENDEE missing mailto:&quot;)
</span><span class="cx"> 
</span><del>-                # CALENDARSERVER-OLD-CUA needs to be base64 encoded
-                if attendee.hasParameter(&quot;CALENDARSERVER-OLD-CUA&quot;):
-                    oldcua = attendee.parameterValue(&quot;CALENDARSERVER-OLD-CUA&quot;)
-                    if not oldcua.startswith(&quot;base64-&quot;) and not self.options[&quot;nobase64&quot;]:
-                        if doFix:
-                            attendee.setParameter(&quot;CALENDARSERVER-OLD-CUA&quot;, &quot;base64-%s&quot; % (base64.b64encode(oldcua)))
-                        else:
-                            raise InvalidICalendarDataError(&quot;iCalendar ATTENDEE CALENDARSERVER-OLD-CUA not base64&quot;)
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     def attendeesWithoutOrganizer(self, component, doFix):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Look for events with ATTENDEE properties and no ORGANIZER property.
</span><span class="lines">@@ -1521,11 +1423,11 @@
</span><span class="cx"> 
</span><span class="cx">             # If targeting a specific organizer, skip events belonging to others
</span><span class="cx">             if self.options[&quot;uuid&quot;]:
</span><del>-                if not organizer.startswith(&quot;urn:uuid:&quot;) or self.options[&quot;uuid&quot;] != organizer[9:]:
</del><ins>+                if not organizer.startswith(&quot;urn:x-uid:&quot;) or self.options[&quot;uuid&quot;] != organizer[10:]:
</ins><span class="cx">                     continue
</span><span class="cx"> 
</span><span class="cx">             # Cache organizer/attendee states
</span><del>-            if organizer.startswith(&quot;urn:uuid:&quot;) and owner == organizer[9:]:
</del><ins>+            if organizer.startswith(&quot;urn:x-uid:&quot;) and owner == organizer[10:]:
</ins><span class="cx">                 if not onlyAttendee:
</span><span class="cx">                     self.organized.append((owner, resid, uid, md5, organizer, created, modified,))
</span><span class="cx">                     self.organized_byuid[uid] = (owner, resid, uid, md5, organizer, created, modified,)
</span><span class="lines">@@ -1789,9 +1691,9 @@
</span><span class="cx">                 continue
</span><span class="cx"> 
</span><span class="cx">             # Only care about data for hosted organizers
</span><del>-            if not organizer.startswith(&quot;urn:uuid:&quot;):
</del><ins>+            if not organizer.startswith(&quot;urn:x-uid:&quot;):
</ins><span class="cx">                 continue
</span><del>-            organizer = organizer[9:]
</del><ins>+            organizer = organizer[10:]
</ins><span class="cx"> 
</span><span class="cx">             # Skip organizers not enabled for calendaring
</span><span class="cx">             if not (yield self.testForCalendaringUUID(organizer)):
</span><span class="lines">@@ -1913,7 +1815,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            cuaddr = &quot;urn:uuid:%s&quot; % attendee
</del><ins>+            cuaddr = &quot;urn:x-uid:%s&quot; % attendee
</ins><span class="cx"> 
</span><span class="cx">             # Get the organizer's calendar data
</span><span class="cx">             calendar = (yield self.getCalendar(orgresid))
</span><span class="lines">@@ -2073,8 +1975,8 @@
</span><span class="cx">             props = item.getOwner().getProperties().get(definitions.cICalProperty_ATTENDEE, [])
</span><span class="cx">             for prop in props:
</span><span class="cx">                 caladdr = prop.getCalAddressValue().getValue()
</span><del>-                if caladdr.startswith(&quot;urn:uuid:&quot;):
-                    caladdr = caladdr[9:]
</del><ins>+                if caladdr.startswith(&quot;urn:x-uid:&quot;):
+                    caladdr = caladdr[10:]
</ins><span class="cx">                 else:
</span><span class="cx">                     continue
</span><span class="cx">                 if attendee_only is not None and attendee_only != caladdr:
</span><span class="lines">@@ -2610,8 +2512,8 @@
</span><span class="cx">             else:
</span><span class="cx">                 principal = yield self.directoryService().recordWithCalendarUserAddress(organizer)
</span><span class="cx">                 # FIXME: Why the mix of records and principals here?
</span><del>-                if principal is None and organizer.startswith(&quot;urn:uuid:&quot;):
-                    principal = yield self.directoryService().principalCollection.principalForUID(organizer[9:])
</del><ins>+                if principal is None and organizer.startswith(&quot;urn:x-uid:&quot;):
+                    principal = yield self.directoryService().principalCollection.principalForUID(organizer[10:])
</ins><span class="cx">                 if principal is None:
</span><span class="cx">                     if self.options[&quot;invalid-organizer&quot;]:
</span><span class="cx">                         fail = True
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1calendarservertoolspurgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/purge.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/purge.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/purge.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -17,33 +17,193 @@
</span><span class="cx"> ##
</span><span class="cx"> from __future__ import print_function
</span><span class="cx"> 
</span><ins>+import collections
+from getopt import getopt, GetoptError
+import os
+import sys
+
</ins><span class="cx"> from calendarserver.tools import tables
</span><span class="cx"> from calendarserver.tools.cmdline import utilityMain, WorkerService
</span><del>-
-from getopt import getopt, GetoptError
-
</del><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-
</del><span class="cx"> from twext.python.log import Logger
</span><del>-
</del><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-
</del><span class="cx"> from twistedcaldav import caldavxml
</span><del>-
</del><span class="cx"> from txdav.caldav.datastore.query.filter import Filter
</span><ins>+from twext.enterprise.dal.record import fromTable
+from twext.enterprise.dal.syntax import Delete, Select
+from twext.enterprise.jobqueue import WorkItem
+from txdav.common.datastore.sql_tables import schema
+import datetime
</ins><span class="cx"> 
</span><ins>+log = Logger()
</ins><span class="cx"> 
</span><del>-import collections
-import os
-import sys
</del><span class="cx"> 
</span><del>-log = Logger()
-
</del><span class="cx"> DEFAULT_BATCH_SIZE = 100
</span><span class="cx"> DEFAULT_RETAIN_DAYS = 365
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+class PrincipalPurgeScanPollingWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_SCAN_POLLING_WORK)
+):
+
+    group = &quot;principal_purge_scan_polling&quot;
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete all other work items
+        yield Delete(From=self.table, Where=None).on(self.transaction)
+
+        # Schedule next update, 7 days out
+        notBefore = (
+            datetime.datetime.utcnow() +
+            datetime.timedelta(days=7)
+        )
+        log.info(
+            &quot;Scheduling next principal purge scan update: {when}&quot;, when=notBefore
+        )
+        yield self.transaction.enqueue(
+            PrincipalPurgeScanPollingWork,
+            notBefore=notBefore
+        )
+
+        # Do the scan
+        allUIDs = set()
+        for home in (schema.CALENDAR_HOME, schema.ADDRESSBOOK_HOME):
+            for [uid] in (
+                yield Select(
+                    [home.OWNER_UID],
+                    From=home
+                ).on(self.transaction)
+            ):
+                allUIDs.add(uid)
+
+        # Spread out the per-uid checks 1 second apart
+        seconds = 0
+        for uid in allUIDs:
+            notBefore = (
+                datetime.datetime.utcnow() +
+                datetime.timedelta(seconds=seconds)
+            )
+            seconds += 1
+            yield self.transaction.enqueue(
+                PrincipalPurgeCheckWork,
+                uid=uid,
+                notBefore=notBefore
+            )
+
+
+
+
+class PrincipalPurgeCheckWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_CHECK_WORK)
+):
+    &quot;&quot;&quot;
+    Work item for checking for the existence of a UID in the directory
+    &quot;&quot;&quot;
+
+    group = property(lambda self: self.uid)
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete any other work items for this UID
+        yield Delete(
+            From=self.table,
+            Where=self.table.UID == self.uid
+        ).on(self.transaction)
+
+        log.debug(&quot;Checking for existence of {uid} in directory&quot;, uid=self.uid)
+        directory = self.transaction.store().directoryService()
+        record = yield directory.recordWithUID(self.uid)
+
+        if record is None:
+            # Schedule purge of this UID a week from now
+            notBefore = (
+                datetime.datetime.utcnow() +
+                datetime.timedelta(minutes=1)
+            )
+            log.warn(
+                &quot;Principal {uid} is no longer in the directory; scheduling clean-up at {when}&quot;,
+                uid=self.uid, when=notBefore
+            )
+            yield self.transaction.enqueue(
+                PrincipalPurgeWork,
+                uid=self.uid,
+                notBefore=notBefore
+            )
+        else:
+            log.debug(&quot;{uid} is still in the directory&quot;, uid=self.uid)
+
+
+
+class PrincipalPurgeWork(
+    WorkItem,
+    fromTable(schema.PRINCIPAL_PURGE_WORK)
+):
+    &quot;&quot;&quot;
+    Work item for purging a UID's data
+    &quot;&quot;&quot;
+
+    group = property(lambda self: self.uid)
+
+    @inlineCallbacks
+    def doWork(self):
+
+        # Delete any other work items for this UID
+        yield Delete(
+            From=self.table,
+            Where=self.table.UID == self.uid
+        ).on(self.transaction)
+
+        # Check for UID in directory again
+        log.debug(&quot;One last existence check for {uid}&quot;, uid=self.uid)
+        directory = self.transaction.store().directoryService()
+        record = yield directory.recordWithUID(self.uid)
+
+        if record is None:
+            # Time to go
+            service = PurgePrincipalService(self.transaction.store)
+            log.warn(
+                &quot;Cleaning up future events for principal {uid} since they are no longer in directory&quot;,
+                uid=self.uid
+            )
+            yield service.purgeUIDs(
+                self.transaction.store,
+                directory,
+                [self.uid],
+                completely=False,
+                doimplicit=True,
+                proxies=True,
+                when=None
+            )
+        else:
+            log.debug(&quot;{uid} has re-appeared in the directory&quot;, uid=self.uid)
+
+
+@inlineCallbacks
+def scheduleNextPrincipalPurgeUpdate(store, seconds):
+
+    notBefore = (
+        datetime.datetime.utcnow() + datetime.timedelta(seconds=seconds)
+    )
+
+    log.debug(
+        &quot;Scheduling next principal purge update: {when}&quot;, when=notBefore
+    )
+
+    def _enqueue(txn):
+        return txn.enqueue(PrincipalPurgeScanPollingWork, notBefore=notBefore)
+
+    wp = yield store.inTransaction(&quot;scheduleNextPrincipalPurgeUpdate&quot;, _enqueue)
+
+    returnValue(wp)
+
+
+
</ins><span class="cx"> class PurgeOldEventsService(WorkerService):
</span><span class="cx"> 
</span><span class="cx">     cutoff = None
</span><span class="lines">@@ -681,11 +841,10 @@
</span><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     @inlineCallbacks
</span><del>-    def purgeUIDs(cls, store, directory, root, uids, verbose=False, dryrun=False,
</del><ins>+    def purgeUIDs(cls, store, directory, uids, verbose=False, dryrun=False,
</ins><span class="cx">                   completely=False, doimplicit=True, proxies=True, when=None):
</span><span class="cx"> 
</span><span class="cx">         service = cls(store)
</span><del>-        service.root = root
</del><span class="cx">         service.directory = directory
</span><span class="cx">         service.uids = uids
</span><span class="cx">         service.verbose = verbose
</span><span class="lines">@@ -701,10 +860,8 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def doWork(self):
</span><span class="cx"> 
</span><del>-        if self.root is None:
-            self.root = self.rootResource()
</del><span class="cx">         if self.directory is None:
</span><del>-            self.directory = self.root.getDirectory()
</del><ins>+            self.directory = self.store.directoryService()
</ins><span class="cx"> 
</span><span class="cx">         total = 0
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1calendarservertoolsshellcmdpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/shell/cmd.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/shell/cmd.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/shell/cmd.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -36,7 +36,6 @@
</span><span class="cx"> from txdav.common.icommondatastore import NotFoundError
</span><span class="cx"> 
</span><span class="cx"> from calendarserver.version import version
</span><del>-from calendarserver.tap.util import getRootResource
</del><span class="cx"> from calendarserver.tools.tables import Table
</span><span class="cx"> from calendarserver.tools.purge import PurgePrincipalService
</span><span class="cx"> from calendarserver.tools.shell.vfs import Folder, RootFolder
</span><span class="lines">@@ -668,11 +667,6 @@
</span><span class="cx">             self.terminal.write(&quot;Aborting.\n&quot;)
</span><span class="cx">             return
</span><span class="cx"> 
</span><del>-        rootResource = getRootResource(
-            self.protocol.service.config,
-            self.protocol.service.store,
-        )
-
</del><span class="cx">         if dryRun:
</span><span class="cx">             toPurge = &quot;to purge&quot;
</span><span class="cx">         else:
</span><span class="lines">@@ -683,7 +677,6 @@
</span><span class="cx">             count, _ignore_assignments = (yield PurgePrincipalService.purgeUIDs(
</span><span class="cx">                 self.protocol.service.store,
</span><span class="cx">                 directory,
</span><del>-                rootResource,
</del><span class="cx">                 (record.uid,),
</span><span class="cx">                 verbose=False,
</span><span class="cx">                 dryrun=dryRun,
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1calendarservertoolstesttest_calverifypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_calverify.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_calverify.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_calverify.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -157,9 +157,9 @@
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="lines">@@ -178,8 +178,8 @@
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> ORGANIZER:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><del>-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -199,9 +199,9 @@
</span><span class="cx"> SUMMARY:Ancient event
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</ins><span class="cx"> ATTENDEE:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><del>-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -223,39 +223,13 @@
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> ORGANIZER:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><span class="cx"> ATTENDEE:http://demo.com:8008/principals/__uids__/D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</span><del>-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-# Non-base64 Organizer and Attendee parameter
-BAD7_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//Apple Inc.//iCal 4.0.1//EN
-CALSCALE:GREGORIAN
-BEGIN:VEVENT
-CREATED:20100303T181216Z
-UID:BAD7
-DTEND:20100307T151500Z
-TRANSP:OPAQUE
-SUMMARY:Ancient event
-DTSTART:20100307T111500Z
-DTSTAMP:20100303T181220Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;http://demo.com:8008/principals/__uids__/
- D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F9
- 2F92E61D0
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;http://demo.com:8008/principals/__uids__/D
- 46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92
- F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-SEQUENCE:2
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
-
-
</del><span class="cx"> # Base64 Organizer and Attendee parameter
</span><span class="cx"> OK8_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="cx"> VERSION:2.0
</span><span class="lines">@@ -271,73 +245,16 @@
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;base64-aHR0cDovL2RlbW8uY29tOjgwMDgvcHJpbm
</span><span class="cx">  NpcGFscy9fX3VpZHNfXy9ENDZGM0Q3MS0wNEI3LTQzQzItQTdCNi02RjkyRjkyRTYxRDA=&quot;:
</span><del>- urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</del><ins>+ urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
</ins><span class="cx"> ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;base64-aHR0cDovL2RlbW8uY29tOjgwMDgvcHJpbmN
</span><span class="cx">  pcGFscy9fX3VpZHNfXy9ENDZGM0Q3MS0wNEI3LTQzQzItQTdCNi02RjkyRjkyRTYxRDA=&quot;:u
</span><del>- rn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ rn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</span><span class="cx"> 
</span><del>-BAD9_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:BAD9
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyrus
- /;CN=\\&quot;Cyrus Daboo\\&quot;;CUTYPE=INDIVIDUAL;EMAIL=\\&quot;cyrus@example.com\\&quot;;PARTSTAT=ACC
- EPTED:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=c
- yrus@example.com;RSVP=TRUE:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyru
- s/;CN=\\&quot;Cyrus Daboo\\&quot;;EMAIL=\\&quot;cyrus@example.com\\&quot;:urn:uuid:7B2636C7-07F6-4475-9
- 24B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uuid:7B2636C7-
- 07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
</del><span class="cx"> 
</span><span class="cx"> # Non-mailto: Organizer
</span><span class="cx"> BAD10_ICS = &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="lines">@@ -425,8 +342,8 @@
</span><span class="cx"> SUMMARY:Ancient event
</span><span class="cx"> DTSTART:20100307T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><del>-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -457,9 +374,7 @@
</span><span class="cx">                 &quot;bad4.ics&quot; : (BAD4_ICS, metadata,),
</span><span class="cx">                 &quot;bad5.ics&quot; : (BAD5_ICS, metadata,),
</span><span class="cx">                 &quot;bad6.ics&quot; : (BAD6_ICS, metadata,),
</span><del>-                &quot;bad7.ics&quot; : (BAD7_ICS, metadata,),
</del><span class="cx">                 &quot;ok8.ics&quot;  : (OK8_ICS, metadata,),
</span><del>-                &quot;bad9.ics&quot; : (BAD9_ICS, metadata,),
</del><span class="cx">                 &quot;bad10.ics&quot; : (BAD10_ICS, metadata,),
</span><span class="cx">                 &quot;bad11.ics&quot; : (BAD11_ICS, metadata,),
</span><span class="cx">                 &quot;bad12.ics&quot; : (BAD12_ICS, metadata,),
</span><span class="lines">@@ -523,8 +438,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD11&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="lines">@@ -571,8 +484,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD11&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="lines">@@ -598,11 +509,11 @@
</span><span class="cx">         obj = yield self.calendarObjectUnderTest(name=&quot;bad10.ics&quot;)
</span><span class="cx">         ical = yield obj.component()
</span><span class="cx">         org = ical.getOrganizerProperty()
</span><del>-        self.assertEqual(org.value(), &quot;urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;)
</del><ins>+        self.assertEqual(org.value(), &quot;urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&quot;)
</ins><span class="cx">         self.assertFalse(org.hasParameter(&quot;SCHEDULE-AGENT&quot;))
</span><span class="cx">         for attendee in ical.getAllAttendeeProperties():
</span><span class="cx">             self.assertTrue(
</span><del>-                attendee.value().startswith(&quot;urn:uuid:&quot;) or
</del><ins>+                attendee.value().startswith(&quot;urn:x-uid:&quot;) or
</ins><span class="cx">                 attendee.value().startswith(&quot;/principals&quot;)
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="lines">@@ -637,8 +548,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="cx">         )))
</span><span class="lines">@@ -681,8 +590,6 @@
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD4&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD5&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD6&quot;,),
</span><del>-            (&quot;home1&quot;, &quot;BAD7&quot;,),
-            (&quot;home1&quot;, &quot;BAD9&quot;,),
</del><span class="cx">             (&quot;home1&quot;, &quot;BAD10&quot;,),
</span><span class="cx">             (&quot;home1&quot;, &quot;BAD12&quot;,),
</span><span class="cx">         )))
</span><span class="lines">@@ -701,217 +608,8 @@
</span><span class="cx">         self.assertNotEqual(sync_token_old, sync_token_new)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def test_fixBadCuaLines(self):
-        &quot;&quot;&quot;
-        CalVerifyService.fixBadOldCuaLines. Make sure it applies correct fix.
-        &quot;&quot;&quot;
</del><span class="cx"> 
</span><del>-        data = (
-            (
-                &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyrus
- /;CN=&quot;Cyrus Daboo&quot;;CUTYPE=INDIVIDUAL;EMAIL=&quot;cyrus@example.com&quot;;PARTSTAT=ACC
- EPTED:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=c
- yrus@example.com;RSVP=TRUE:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;//example.com\\:8443/principals/users/cyru
- s/;CN=&quot;Cyrus Daboo&quot;;EMAIL=&quot;cyrus@example.com&quot;:urn:uuid:7B2636C7-07F6-4475-9
- 24B-2854107F7A22&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uuid:7B2636C7-
- 07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;),
-                &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=&quot;https://example.com:8443/principals/users/c
- yrus/&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com;RSVP=TRUE:urn:uuid:7B2636C7-0
- 7F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=&quot;https://example.com:8443/principals/users/
- cyrus/&quot;;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uuid:7B2636C7-07F6-4475-
- 924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;),
-                &quot;&quot;&quot;BEGIN:VCALENDAR
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:REQUEST
-PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
-BEGIN:VTIMEZONE
-TZID:US/Pacific
-BEGIN:STANDARD
-DTSTART:19621028T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T090000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T100000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:PDT
-TZOFFSETFROM:-0800
-TZOFFSETTO:-0700
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:PST
-TZOFFSETFROM:-0700
-TZOFFSETTO:-0800
-END:STANDARD
-END:VTIMEZONE
-BEGIN:VEVENT
-UID:32956D5C-579F-46FD-BAE3-4A6C354B8CA3
-DTSTART;TZID=US/Pacific:20111103T150000
-DTEND;TZID=US/Pacific:20111103T160000
-ATTENDEE;CALENDARSERVER-OLD-CUA=base64-aHR0cHM6Ly9leGFtcGxlLmNvbTo4NDQzL3Bya
- W5jaXBhbHMvdXNlcnMvY3lydXMv;CN=Cyrus Daboo;EMAIL=cyrus@example.com;RSVP=TRU
- E:urn:uuid:7B2636C7-07F6-4475-924B-2854107F7A22
-ATTENDEE;CN=John Smith;CUTYPE=INDIVIDUAL;EMAIL=smith@example.com;PARTSTAT=AC
- CEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:E975EB3D-C412-411B-A655-C3BE4949788C
-CREATED:20090730T214912Z
-DTSTAMP:20120421T182823Z
-ORGANIZER;CALENDARSERVER-OLD-CUA=base64-aHR0cHM6Ly9leGFtcGxlLmNvbTo4NDQzL3By
- aW5jaXBhbHMvdXNlcnMvY3lydXMv;CN=Cyrus Daboo;EMAIL=cyrus@example.com:urn:uui
- d:7B2636C7-07F6-4475-924B-2854107F7A22
-RRULE:FREQ=WEEKLY;COUNT=400
-SEQUENCE:18
-SUMMARY:1-on-1
-END:VEVENT
-END:VCALENDAR
-&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;),
-            ),
-        )
</del><span class="cx"> 
</span><del>-        optionsNo64 = {
-            &quot;ical&quot;: True,
-            &quot;nobase64&quot;: True,
-            &quot;verbose&quot;: False,
-            &quot;uid&quot;: &quot;&quot;,
-            &quot;uuid&quot;: &quot;&quot;,
-            &quot;tzid&quot;: &quot;&quot;,
-        }
-        calverifyNo64 = BadDataService(self._sqlCalendarStore, optionsNo64, StringIO(), reactor, config)
-        calverifyNo64.emailDomain = &quot;example.com&quot;
-
-        options64 = {
-            &quot;ical&quot;: True,
-            &quot;nobase64&quot;: False,
-            &quot;verbose&quot;: False,
-            &quot;uid&quot;: &quot;&quot;,
-            &quot;uuid&quot;: &quot;&quot;,
-            &quot;tzid&quot;: &quot;&quot;,
-        }
-        calverify64 = BadDataService(self._sqlCalendarStore, options64, StringIO(), reactor, config)
-        calverify64.emailDomain = &quot;example.com&quot;
-
-        for bad, oknobase64, okbase64 in data:
-            bad = bad.replace(&quot;\r\n &quot;, &quot;&quot;)
-            oknobase64 = oknobase64.replace(&quot;\r\n &quot;, &quot;&quot;)
-            okbase64 = okbase64.replace(&quot;\r\n &quot;, &quot;&quot;)
-            self.assertEqual(calverifyNo64.fixBadOldCuaLines(bad), oknobase64)
-            self.assertEqual(calverify64.fixBadOldCuaLines(bad), okbase64)
-
-
-
</del><span class="cx"> class CalVerifyMismatchTestsBase(StoreTestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Tests calverify for iCalendar mismatch problems.
</span><span class="lines">@@ -964,10 +662,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -986,10 +684,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1007,10 +705,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1029,10 +727,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1050,10 +748,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1071,10 +769,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1093,10 +791,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1114,10 +812,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1135,10 +833,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1157,10 +855,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear - 1, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1178,10 +876,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1200,10 +898,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1221,9 +919,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1241,8 +939,8 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1260,10 +958,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1282,9 +980,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1302,9 +1000,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1322,10 +1020,10 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=DECLINED:urn:uuid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:AC478592-7783-44D1-B2AE-52359B4E8415
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=DECLINED:urn:x-uid:47B16BB4-DB5F-4BF6-85FE-A7DA54230F92
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:AC478592-7783-44D1-B2AE-52359B4E8415
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1583,9 +1281,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1604,9 +1302,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1624,9 +1322,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1810,9 +1508,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1831,9 +1529,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=NEEDS-ACTION:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -1851,9 +1549,9 @@
</span><span class="cx"> DTSTART:%(year)s%(month)02d07T111500Z
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE;PARTSTAT=ACCEPTED:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE;PARTSTAT=ACCEPTED:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2029,9 +1727,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2050,9 +1748,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2070,9 +1768,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2091,9 +1789,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2110,9 +1808,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> TRANSP:TRANSPARENT
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2132,9 +1830,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2151,9 +1849,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> STATUS:CANCELLED
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2173,9 +1871,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=3
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2193,9 +1891,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2215,9 +1913,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=3
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2235,9 +1933,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=2
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -2249,9 +1947,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2287,9 +1985,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2306,9 +2004,9 @@
</span><span class="cx"> DTSTART;VALUE=DATE:%(year)s%(month)02d21
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2327,9 +2025,9 @@
</span><span class="cx"> DURATION:PT2H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2347,9 +2045,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2479,9 +2177,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2500,9 +2198,9 @@
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> DTSTAMP:20100303T181220Z
</span><span class="cx"> SEQUENCE:2
</span><del>-ORGANIZER:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
-ATTENDEE:urn:uuid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ORGANIZER:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
+ATTENDEE:urn:x-uid:D46F3D71-04B7-43C2-A7B6-6F92F92E61D0-1
+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2523,7 +2221,7 @@
</span><span class="cx"> SEQUENCE:2
</span><span class="cx"> ORGANIZER:mailto:foobar@example.com
</span><span class="cx"> ATTENDEE:mailto:foobar@example.com
</span><del>-ATTENDEE:urn:uuid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</del><ins>+ATTENDEE:urn:x-uid:75EA36BE-F71B-40F9-81F9-CF59BF40CA8F
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;) % {&quot;year&quot;: nowYear, &quot;month&quot;: nowMonth}
</span><span class="lines">@@ -2810,9 +2508,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2827,9 +2525,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2844,9 +2542,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now_fwd11)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2863,9 +2561,9 @@
</span><span class="cx"> UID:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> DTSTART:%(now_fwd11)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2882,9 +2580,9 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2901,9 +2599,9 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
+ATTENDEE;CN=Example User2;EMAIL=example2@example.com:urn:x-uid:%(uuid2)s
+ORGANIZER;CN=Example User1;EMAIL=example1@example.com:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_fwd11_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2920,9 +2618,9 @@
</span><span class="cx"> UID:VALID_ORGANIZER_OVERRIDE_ICS
</span><span class="cx"> DTSTART:%(now)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2931,9 +2629,9 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd11)s
</span><span class="cx"> DTSTART:%(now_fwd11)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE:urn:uuid:%(uuid1)s
-ATTENDEE:urn:uuid:%(uuid2)s
-ORGANIZER:urn:uuid:%(uuid1)s
</del><ins>+ATTENDEE:urn:x-uid:%(uuid1)s
+ATTENDEE:urn:x-uid:%(uuid2)s
+ORGANIZER:urn:x-uid:%(uuid1)s
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:INVITE_VALID_ORGANIZER_ICS
</span><span class="cx"> END:VEVENT
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1calendarservertoolstesttest_purgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -877,7 +877,7 @@
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx">         count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</span><del>-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=True))
</del><ins>+            (self.uid,), verbose=False, proxies=False, completely=True))
</ins><span class="cx">         self.assertEquals(count, 2) # 2 events
</span><span class="cx"> 
</span><span class="cx">         # Now you don't
</span><span class="lines">@@ -892,7 +892,6 @@
</span><span class="cx">         count = yield PurgePrincipalService.purgeUIDs(
</span><span class="cx">             self.storeUnderTest(),
</span><span class="cx">             self.directory,
</span><del>-            self.rootResource,
</del><span class="cx">             (self.uid,),
</span><span class="cx">             verbose=False,
</span><span class="cx">             proxies=False,
</span><span class="lines">@@ -922,7 +921,7 @@
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx">         count = (yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</span><del>-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False))
</del><ins>+            (self.uid,), verbose=False, proxies=False, completely=False))
</ins><span class="cx">         self.assertEquals(count, 1) # 2 events
</span><span class="cx"> 
</span><span class="cx">         # Now you still see it
</span><span class="lines">@@ -935,7 +934,7 @@
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx">         count = yield PurgePrincipalService.purgeUIDs(self.storeUnderTest(), self.directory,
</span><del>-            self.rootResource, (self.uid,), verbose=False, proxies=False, completely=False)
</del><ins>+            (self.uid,), verbose=False, proxies=False, completely=False)
</ins><span class="cx">         self.assertEquals(count, 1)
</span><span class="cx"> 
</span><span class="cx">         # And you still do
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1calendarservertoolstesttest_purge_old_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge_old_events.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge_old_events.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/calendarserver/tools/test/test_purge_old_events.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -677,7 +677,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Purge home1
</span><span class="cx">         total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
</span><del>-            self.rootResource, (&quot;home1&quot;,), verbose=False, proxies=False,
</del><ins>+            (&quot;home1&quot;,), verbose=False, proxies=False,
</ins><span class="cx">             when=DateTime(now, 4, 1, 12, 0, 0, 0, Timezone(utc=True)))
</span><span class="cx"> 
</span><span class="cx">         # 4 items deleted: 3 events and 1 vcard
</span><span class="lines">@@ -714,7 +714,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Purge home1 completely
</span><span class="cx">         total = yield PurgePrincipalService.purgeUIDs(self._sqlCalendarStore, self.directory,
</span><del>-            self.rootResource, (&quot;home1&quot;,), verbose=False, proxies=False, completely=True)
</del><ins>+            (&quot;home1&quot;,), verbose=False, proxies=False, completely=True)
</ins><span class="cx"> 
</span><span class="cx">         # 9 items deleted: 8 events and 1 vcard
</span><span class="cx">         self.assertEquals(total, 9)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformance_event_createpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/_event_create.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/_event_create.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/_event_create.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -80,13 +80,13 @@
</span><span class="cx"> 
</span><span class="cx"> attendee = &quot;&quot;&quot;\
</span><span class="cx"> ATTENDEE;CN=User %(SEQUENCE)02d;CUTYPE=INDIVIDUAL;EMAIL=user%(SEQUENCE)02d@example.com;PARTSTAT=NE
</span><del>- EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:uuid:user%(SEQUENCE)02d
</del><ins>+ EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:x-uid:user%(SEQUENCE)02d
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> organizer = &quot;&quot;&quot;\
</span><del>-ORGANIZER;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d@example.com:urn:uuid:user%(SEQUENCE)02d
</del><ins>+ORGANIZER;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d@example.com:urn:x-uid:user%(SEQUENCE)02d
</ins><span class="cx"> ATTENDEE;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d@example.com;PARTSTAT=ACCEPTE
</span><del>- D:urn:uuid:user%(SEQUENCE)02d
</del><ins>+ D:urn:x-uid:user%(SEQUENCE)02d
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> def formatDate(d):
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksbounded_recurrence_autoacceptpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/bounded_recurrence_autoaccept.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> from contrib.performance._event_create import (
</span><span class="cx">     makeAttendees, makeVCalendar, formatDate, measure as _measure)
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def makeEvent(i, organizerSequence, attendeeCount):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Create a new half-hour long event that starts soon and recurs
</span><span class="lines">@@ -38,7 +39,7 @@
</span><span class="cx">     attendees = makeAttendees(attendeeCount)
</span><span class="cx">     attendees.append(
</span><span class="cx">         'ATTENDEE;CN=&quot;Resource 01&quot;;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=T\n'
</span><del>-        ' RUE;SCHEDULE-STATUS=&quot;1.2&quot;:urn:uuid:resource01\n')
</del><ins>+        ' RUE;SCHEDULE-STATUS=&quot;1.2&quot;:urn:x-uid:40000000-0000-0000-0000-000000000001\n')
</ins><span class="cx">     return makeVCalendar(
</span><span class="cx">         uuid4(), start, end, rrule, organizerSequence, attendees)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksevent_autoacceptpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/event_autoaccept.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/event_autoaccept.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/event_autoaccept.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx">     attendees = makeAttendees(attendeeCount)
</span><span class="cx">     attendees.append(
</span><span class="cx">         'ATTENDEE;CN=&quot;Resource 01&quot;;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=T\n'
</span><del>-        ' RUE;SCHEDULE-STATUS=&quot;1.2&quot;:urn:uuid:resource01\n')
</del><ins>+        ' RUE;SCHEDULE-STATUS=&quot;1.2&quot;:urn:x-uid:40000000-0000-0000-0000-000000000001\n')
</ins><span class="cx">     return makeVCalendar(
</span><span class="cx">         uuid4(),
</span><span class="cx">         base + i * interval,
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksunbounded_recurrence_autoacceptpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/unbounded_recurrence_autoaccept.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx">     attendees = makeAttendees(attendeeCount)
</span><span class="cx">     attendees.append(
</span><span class="cx">         'ATTENDEE;CN=&quot;Resource 01&quot;;CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-ACTION;RSVP=T\n'
</span><del>-        ' RUE;SCHEDULE-STATUS=&quot;1.2&quot;:urn:uuid:resource01\n')
</del><ins>+        ' RUE;SCHEDULE-STATUS=&quot;1.2&quot;:urn:x-uid:40000000-0000-0000-0000-000000000001\n')
</ins><span class="cx">     return makeVCalendar(
</span><span class="cx">         uuid4(), start, end, &quot;RRULE:FREQ=WEEKLY&quot;, organizerSequence, attendees)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksvfreebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -73,7 +73,7 @@
</span><span class="cx"> X-CALENDARSERVER-MASK-UID:EC75A61B-08A3-44FD-BFBB-2457BBD0D490
</span><span class="cx"> DTSTAMP:20100729T174751Z
</span><span class="cx"> ORGANIZER:mailto:user01@example.com
</span><del>-SUMMARY:Availability for urn:uuid:user02
</del><ins>+SUMMARY:Availability for urn:x-uid:user02
</ins><span class="cx"> END:VFREEBUSY
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -124,6 +124,7 @@
</span><span class="cx"> @inlineCallbacks
</span><span class="cx"> def measure(host, port, dtrace, events, samples):
</span><span class="cx">     user = password = &quot;user01&quot;
</span><ins>+    uid = &quot;10000000-0000-0000-0000-000000000001&quot;
</ins><span class="cx">     root = &quot;/&quot;
</span><span class="cx">     principal = &quot;/&quot;
</span><span class="cx">     calendar = &quot;vfreebusy-benchmark&quot;
</span><span class="lines">@@ -150,12 +151,12 @@
</span><span class="cx">     headers = Headers({
</span><span class="cx">             &quot;content-type&quot;: [&quot;text/calendar&quot;],
</span><span class="cx">             &quot;originator&quot;: [&quot;mailto:%s@example.com&quot; % (user,)],
</span><del>-            &quot;recipient&quot;: [&quot;urn:uuid:%s, urn:uuid:user02&quot; % (user,)]})
</del><ins>+            &quot;recipient&quot;: [&quot;urn:x-uid:%s, urn:x-uid:10000000-0000-0000-0000-000000000002&quot; % (uid,)]})
</ins><span class="cx"> 
</span><span class="cx">     vfb = VFREEBUSY % {
</span><span class="cx">             &quot;attendees&quot;: &quot;&quot;.join([
</span><del>-                    &quot;ATTENDEE:urn:uuid:%s\n&quot; % (user,),
-                    &quot;ATTENDEE:urn:uuid:user02\n&quot;]),
</del><ins>+                    &quot;ATTENDEE:urn:x-uid:%s\n&quot; % (uid,),
+                    &quot;ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000002\n&quot;]),
</ins><span class="cx">             &quot;start&quot;: formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
</span><span class="cx">             &quot;end&quot;: formatDate(
</span><span class="cx">                 baseTime.replace(hour=0, minute=0) + timedelta(days=1)) + 'Z'}
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformancebenchmarksvfreebusy_vary_attendeespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy_vary_attendees.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/benchmarks/vfreebusy_vary_attendees.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> from contrib.performance.benchmarks.vfreebusy import VFREEBUSY, formatDate, makeEventNear
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> @inlineCallbacks
</span><span class="cx"> def measure(host, port, dtrace, attendees, samples):
</span><span class="cx">     userNumber = 1
</span><span class="lines">@@ -51,7 +52,7 @@
</span><span class="cx">     for i in [userNumber] + targets:
</span><span class="cx">         targetUser = &quot;user%02d&quot; % (i,)
</span><span class="cx">         for path in [&quot;calendars/users/%s/&quot; % (targetUser,),
</span><del>-                     &quot;calendars/__uids__/%s/&quot; % (targetUser,)]:
</del><ins>+                     &quot;calendars/__uids__/10000000-0000-0000-0000-000000000%03d/&quot; % (i,)]:
</ins><span class="cx">             authinfo.add_password(
</span><span class="cx">                 realm=&quot;Test Realm&quot;,
</span><span class="cx">                 uri=&quot;http://%s:%d/%s&quot; % (host, port, path),
</span><span class="lines">@@ -75,14 +76,14 @@
</span><span class="cx"> 
</span><span class="cx">     # And now issue the actual VFREEBUSY request
</span><span class="cx">     method = 'POST'
</span><del>-    uri = 'http://%s:%d/calendars/__uids__/%s/outbox/' % (host, port, user)
</del><ins>+    uri = 'http://%s:%d/calendars/__uids__/10000000-0000-0000-0000-000000000001/outbox/' % (host, port)
</ins><span class="cx">     headers = Headers({
</span><span class="cx">             &quot;content-type&quot;: [&quot;text/calendar&quot;],
</span><span class="cx">             &quot;originator&quot;: [&quot;mailto:%s@example.com&quot; % (user,)],
</span><del>-            &quot;recipient&quot;: [&quot;, &quot;.join([&quot;urn:uuid:user%02d&quot; % (i,) for i in [userNumber] + targets])]})
</del><ins>+            &quot;recipient&quot;: [&quot;, &quot;.join([&quot;urn:x-uid:10000000-0000-0000-0000-000000000%03d&quot; % (i,) for i in [userNumber] + targets])]})
</ins><span class="cx">     body = StringProducer(VFREEBUSY % {
</span><span class="cx">             &quot;attendees&quot;: &quot;&quot;.join([
</span><del>-                    &quot;ATTENDEE:urn:uuid:user%02d\n&quot; % (i,)
</del><ins>+                    &quot;ATTENDEE:urn:x-uid:10000000-0000-0000-0000-000000000%03d\n&quot; % (i,)
</ins><span class="cx">                     for i in [userNumber] + targets]),
</span><span class="cx">             &quot;start&quot;: formatDate(baseTime.replace(hour=0, minute=0)) + 'Z',
</span><span class="cx">             &quot;end&quot;: formatDate(
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformanceloadtestprofilespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/loadtest/profiles.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/loadtest/profiles.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/loadtest/profiles.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -205,7 +205,7 @@
</span><span class="cx">             except IndexError:
</span><span class="cx">                 continue
</span><span class="cx">             cuaddr = u'mailto:%s' % (record.email,)
</span><del>-            uuid = u'urn:uuid:%s' % (record.uid,)
</del><ins>+            uuid = u'urn:x-uid:%s' % (record.uid,)
</ins><span class="cx">             if cuaddr not in invitees and uuid not in invitees:
</span><span class="cx">                 break
</span><span class="cx">         else:
</span><span class="lines">@@ -592,21 +592,21 @@
</span><span class="cx">     A Calendar user who creates new events.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     _eventTemplate = Component.fromString(&quot;&quot;&quot;\
</span><del>-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//Apple Inc.//iCal 4.0.3//EN
-CALSCALE:GREGORIAN
-BEGIN:VEVENT
-CREATED:20101018T155431Z
-UID:C98AD237-55AD-4F7D-9009-0D355D835822
-DTEND;TZID=America/New_York:20101021T130000
-TRANSP:OPAQUE
-SUMMARY:Simple event
-DTSTART;TZID=America/New_York:20101021T120000
-DTSTAMP:20101018T155438Z
-SEQUENCE:2
-END:VEVENT
-END:VCALENDAR
</del><ins>+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.3//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+CREATED:20101018T155431Z
+UID:C98AD237-55AD-4F7D-9009-0D355D835822
+DTEND;TZID=America/New_York:20101021T130000
+TRANSP:OPAQUE
+SUMMARY:Simple event
+DTSTART;TZID=America/New_York:20101021T120000
+DTSTAMP:20101018T155438Z
+SEQUENCE:2
+END:VEVENT
+END:VCALENDAR
</ins><span class="cx"> &quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;))
</span><span class="cx"> 
</span><span class="cx">     def setParameters(
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformancesqlusagesqlusagepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/sqlusage/sqlusage.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/sqlusage/sqlusage.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/sqlusage/sqlusage.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -286,7 +286,7 @@
</span><span class="cx">         for i in range(n - self.currentCount):
</span><span class="cx">             index = self.currentCount + i + 2
</span><span class="cx">             users.append(&quot;user%02d&quot; % (index,))
</span><del>-            uids.append(&quot;urn:uuid:user%02d&quot; % (index,))
</del><ins>+            uids.append(&quot;urn:x-uid:user%02d&quot; % (index,))
</ins><span class="cx">         session.addInvitees(URL(path=calendarhref), uids, True)
</span><span class="cx"> 
</span><span class="cx">         # Now accept each one
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1contribperformancetest_event_change_datepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/contrib/performance/test_event_change_date.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/contrib/performance/test_event_change_date.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/contrib/performance/test_event_change_date.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -51,11 +51,11 @@
</span><span class="cx"> 
</span><span class="cx"> calendarTail = &quot;&quot;&quot;\
</span><span class="cx"> ATTENDEE;CN=User 02;CUTYPE=INDIVIDUAL;EMAIL=user02@example.com;PARTSTAT=NE
</span><del>- EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:use
</del><ins>+ EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:use
</ins><span class="cx">  r02
</span><span class="cx"> CREATED:20100729T193912Z
</span><span class="cx"> DTSTAMP:20100729T195557Z
</span><del>-ORGANIZER;CN=User 03;EMAIL=user03@example.com:urn:uuid:user03
</del><ins>+ORGANIZER;CN=User 03;EMAIL=user03@example.com:urn:x-uid:user03
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:STUFF IS THINGS
</span><span class="cx"> TRANSP:OPAQUE
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavdirectoryprincipalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/principal.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/principal.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/principal.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -117,7 +117,10 @@
</span><span class="cx"> 
</span><span class="cx">     cua = normalizeCUAddr(origCUAddr)
</span><span class="cx"> 
</span><del>-    if cua.startswith(&quot;urn:uuid:&quot;):
</del><ins>+    if cua.startswith(&quot;urn:x-uid:&quot;):
+        return &quot;uid&quot;, cua[10:]
+
+    elif cua.startswith(&quot;urn:uuid:&quot;):
</ins><span class="cx">         return &quot;guid&quot;, uuid.UUID(cua[9:])
</span><span class="cx"> 
</span><span class="cx">     elif cua.startswith(&quot;mailto:&quot;):
</span><span class="lines">@@ -849,9 +852,7 @@
</span><span class="cx">         namespace, name = qname
</span><span class="cx"> 
</span><span class="cx">         if qname == davxml.ResourceID.qname():
</span><del>-            # FIXME: should this return a different CUA flavor if guid is not set on this record?
-            if hasattr(self.record, &quot;guid&quot;):
-                returnValue(davxml.ResourceID(davxml.HRef.fromString(&quot;urn:uuid:%s&quot; % (self.record.guid,))))
</del><ins>+            returnValue(davxml.ResourceID(davxml.HRef.fromString(&quot;urn:x-uid:%s&quot; % (self.record.uid,))))
</ins><span class="cx"> 
</span><span class="cx">         elif namespace == calendarserver_namespace:
</span><span class="cx"> 
</span><span class="lines">@@ -1268,11 +1269,7 @@
</span><span class="cx"> 
</span><span class="cx">     def canonicalCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Return a CUA for this principal, preferring in this order:
-            urn:uuid: form
-            mailto: form
-            /principal/__uids__/ form
-            first in calendarUserAddresses( ) list
</del><ins>+        Return a CUA for this principal
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         return self.record.canonicalCalendarUserAddress()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavdirectorytesttest_principalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/test_principal.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/test_principal.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/test_principal.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -612,21 +612,10 @@
</span><span class="cx">             provisioningResource, recordType, recordResource, record
</span><span class="cx">         ) in (yield self._allRecords()):
</span><span class="cx">             if record.hasCalendars:
</span><del>-                if self.directory.fieldName.guid in record.fields:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith(&quot;urn:uuid:&quot;)
-                    )
-                elif self.directory.fieldName.emailAddresses in record.fields:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith(&quot;mailto:&quot;)
-                    )
-                else:
-                    self.failUnless(
-                        recordResource.canonicalCalendarUserAddress()
-                        .startswith(&quot;/principals/__uids__/&quot;)
-                    )
</del><ins>+                self.failUnless(
+                    recordResource.canonicalCalendarUserAddress()
+                    .startswith(&quot;urn:x-uid:&quot;)
+                )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavdirectorytestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/util.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/util.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/directory/test/util.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -213,6 +213,7 @@
</span><span class="cx"> 
</span><span class="cx">         addresses = set(value(&quot;addresses&quot;))
</span><span class="cx">         if record.hasCalendars:
</span><ins>+            addresses.add(&quot;urn:x-uid:%s&quot; % (record.uid,))
</ins><span class="cx">             addresses.add(&quot;urn:uuid:%s&quot; % (record.guid,))
</span><span class="cx">             addresses.add(&quot;/principals/__uids__/%s/&quot; % (record.uid,))
</span><span class="cx">             addresses.add(&quot;/principals/%s/%s/&quot; % (record.recordType, record.shortNames[0],))
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavicalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/ical.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/ical.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/ical.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -3267,13 +3267,21 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def normalizeCalendarUserAddresses(self, lookupFunction, recordFunction,
-        toUUID=True):
</del><ins>+    def normalizeCalendarUserAddresses(
+        self, lookupFunction, recordFunction, toCanonical=True
+    ):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Do the ORGANIZER/ATTENDEE property normalization.
</span><span class="cx"> 
</span><span class="cx">         @param lookupFunction: function returning full name, guid, CUAs for a given CUA
</span><span class="cx">         @type lookupFunction: L{Function}
</span><ins>+
+        @param recordFunction: function taking a CUA and returning a record
+        @type recordFunction: L{Function}
+
+        @param toCanonical: whether to convert to the canonical CUA form (True)
+            or to the mailto: form (False)
+        @type toCanonical: L{bool}
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         for component in self.subcomponents():
</span><span class="lines">@@ -3288,8 +3296,8 @@
</span><span class="cx">                 # Check that we can lookup this calendar user address - if not
</span><span class="cx">                 # we cannot do anything with it
</span><span class="cx">                 cuaddr = normalizeCUAddr(prop.value())
</span><del>-                name, guid, cutype, cuaddrs = yield lookupFunction(cuaddr, recordFunction, config)
-                if guid is None:
</del><ins>+                name, uid, cutype, cuaddrs = yield lookupFunction(cuaddr, recordFunction, config)
+                if uid is None:
</ins><span class="cx">                     continue
</span><span class="cx"> 
</span><span class="cx">                 # Get any EMAIL parameter
</span><span class="lines">@@ -3300,14 +3308,12 @@
</span><span class="cx">                 # Get any CN parameter
</span><span class="cx">                 oldCN = prop.parameterValue(&quot;CN&quot;)
</span><span class="cx"> 
</span><del>-                if toUUID:
-                    # Always re-write value to urn:uuid
-                    if isinstance(guid, uuid.UUID):
-                        guid = unicode(guid).upper()
-                    prop.setValue(&quot;urn:uuid:{guid}&quot;.format(guid=guid))
</del><ins>+                if toCanonical:
+                    # Always re-write value to urn:x-uid
+                    prop.setValue(&quot;urn:x-uid:{uid}&quot;.format(uid=uid))
</ins><span class="cx"> 
</span><del>-                # If it is already a non-UUID address leave it be
-                elif cuaddr.startswith(&quot;urn:uuid:&quot;):
</del><ins>+                # If it is already a non-x-uid address leave it be
+                elif (cuaddr.startswith(&quot;urn:x-uid:&quot;) or cuaddr.startswith(&quot;urn:uuid:&quot;)):
</ins><span class="cx"> 
</span><span class="cx">                     if oldemail:
</span><span class="cx">                         # Use the EMAIL parameter if it exists
</span><span class="lines">@@ -3364,7 +3370,7 @@
</span><span class="cx">                     prop.removeParameter(&quot;CN&quot;)
</span><span class="cx"> 
</span><span class="cx">                 # Re-write the EMAIL if its value no longer matches
</span><del>-                if oldemail and oldemail not in cuaddrs or oldemail is None and toUUID:
</del><ins>+                if oldemail and oldemail not in cuaddrs or oldemail is None and toCanonical:
</ins><span class="cx">                     if cuaddr.startswith(&quot;mailto:&quot;) and cuaddr in cuaddrs:
</span><span class="cx">                         email = cuaddr[7:]
</span><span class="cx">                     else:
</span><span class="lines">@@ -3388,7 +3394,7 @@
</span><span class="cx"> 
</span><span class="cx">             # For VPOLL also do immediate children
</span><span class="cx">             if component.name() == &quot;VPOLL&quot;:
</span><del>-                yield component.normalizeCalendarUserAddresses(lookupFunction, recordFunction, toUUID)
</del><ins>+                yield component.normalizeCalendarUserAddresses(lookupFunction, recordFunction, toCanonical)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def _reconcileGroupAttendee(self, groupCUA, memberAtttendeeProps):
</span><span class="lines">@@ -3652,21 +3658,21 @@
</span><span class="cx"> 
</span><span class="cx"> # #
</span><span class="cx"> # Utilities
</span><del>-# #p
</del><ins>+# #
</ins><span class="cx"> 
</span><span class="cx"> @inlineCallbacks
</span><del>-def normalizeCUAddress(cuaddr, lookupFunction, recordFunction, toUUID=True):
</del><ins>+def normalizeCUAddress(cuaddr, lookupFunction, recordFunction, toCanonical=True):
</ins><span class="cx">     # Check that we can lookup this calendar user address - if not
</span><span class="cx">     # we cannot do anything with it
</span><del>-    _ignore_name, guid, _ignore_cuType, cuaddrs = (yield lookupFunction(normalizeCUAddr(cuaddr), recordFunction, config))
</del><ins>+    _ignore_name, uid, _ignore_cuType, cuaddrs = (yield lookupFunction(normalizeCUAddr(cuaddr), recordFunction, config))
</ins><span class="cx"> 
</span><del>-    if toUUID:
-        # Always re-write value to urn:uuid
-        if guid:
-            returnValue(&quot;urn:uuid:{0}&quot;.format(guid,))
</del><ins>+    if toCanonical:
+        # Always re-write value to urn:x-uid
+        if uid:
+            returnValue(&quot;urn:x-uid:{0}&quot;.format(uid,))
</ins><span class="cx"> 
</span><del>-    # If it is already a non-UUID address leave it be
-    elif cuaddr.startswith(&quot;urn:uuid:&quot;):
</del><ins>+    # If it is already a non-x-uid address leave it be
+    elif (cuaddr.startswith(&quot;urn:x-uid:&quot;) or cuaddr.startswith(&quot;urn:uuid:&quot;)):
</ins><span class="cx"> 
</span><span class="cx">         # Pick the first mailto,
</span><span class="cx">         # or failing that the first path one,
</span><span class="lines">@@ -3740,6 +3746,9 @@
</span><span class="cx"> def normalize_iCalStr(icalstr, sort=False):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Normalize a string representation of ical data for easy test comparison.
</span><ins>+
+    @param sort: Whether to sort the output
+    @type sort: L{boolean}
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     icalstr = str(icalstr).replace(&quot;\r\n &quot;, &quot;&quot;)
</span><span class="lines">@@ -3756,8 +3765,11 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-def diff_iCalStrs(icalstr1, icalstr2):
-
-    icalstr1 = normalize_iCalStr(icalstr1).splitlines()
-    icalstr2 = normalize_iCalStr(icalstr2).splitlines()
</del><ins>+def diff_iCalStrs(icalstr1, icalstr2, sort=False):
+    &quot;&quot;&quot;
+    @param sort: Whether to sort the output
+    @type sort: L{boolean}
+    &quot;&quot;&quot;
+    icalstr1 = normalize_iCalStr(icalstr1, sort=sort).splitlines()
+    icalstr2 = normalize_iCalStr(icalstr2, sort=sort).splitlines()
</ins><span class="cx">     return &quot;\n&quot;.join(unified_diff(icalstr1, icalstr2))
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavsharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/sharing.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/sharing.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/sharing.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">             @inlineCallbacks
</span><span class="cx">             def invitePropertyElement(invitation, includeUID=True):
</span><span class="cx"> 
</span><del>-                userid = &quot;urn:uuid:&quot; + invitation.shareeUID
</del><ins>+                userid = &quot;urn:x-uid:&quot; + invitation.shareeUID
</ins><span class="cx">                 principal = yield self.principalForUID(invitation.shareeUID)
</span><span class="cx">                 cn = principal.displayName() if principal else invitation.shareeUID
</span><span class="cx">                 returnValue(customxml.InviteUser(
</span><span class="lines">@@ -91,11 +91,11 @@
</span><span class="cx">                     invitations = yield self.validateInvites(request, invitations)
</span><span class="cx"> 
</span><span class="cx">                     ownerPrincipal = yield self.principalForUID(self._newStoreObject.ownerHome().uid())
</span><del>-                    # FIXME:  use urn:uuid in all cases
</del><ins>+                    # FIXME:  use urn:x-uid in all cases
</ins><span class="cx">                     if self.isCalendarCollection():
</span><span class="cx">                         owner = ownerPrincipal.principalURL()
</span><span class="cx">                     else:
</span><del>-                        owner = &quot;urn:uuid:&quot; + ownerPrincipal.principalUID()
</del><ins>+                        owner = &quot;urn:x-uid:&quot; + ownerPrincipal.principalUID()
</ins><span class="cx">                     ownerCN = ownerPrincipal.displayName()
</span><span class="cx"> 
</span><span class="cx">                     returnValue(customxml.Invite(
</span><span class="lines">@@ -437,7 +437,7 @@
</span><span class="cx">             invitations = yield self._newStoreObject.allInvitations()
</span><span class="cx">         for invitation in invitations:
</span><span class="cx">             if invitation.status != _BIND_STATUS_INVALID:
</span><del>-                if not (yield self.validUserIDForShare(&quot;urn:uuid:&quot; + invitation.shareeUID, request)):
</del><ins>+                if not (yield self.validUserIDForShare(&quot;urn:x-uid:&quot; + invitation.shareeUID, request)):
</ins><span class="cx">                     self.log.error(&quot;Invalid sharee detected: {uid}&quot;, uid=invitation.shareeUID)
</span><span class="cx"> 
</span><span class="cx">         returnValue(invitations)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavstorebridgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/storebridge.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/storebridge.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/storebridge.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -1539,7 +1539,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         attendees = (yield self._newStoreCalendarObject.component()).getAttendees()
</span><del>-        attendees = [attendee.split(&quot;urn:uuid:&quot;)[-1] for attendee in attendees]
</del><ins>+        attendees = [attendee.split(&quot;urn:x-uid:&quot;)[-1] for attendee in attendees]
</ins><span class="cx">         document = yield davXMLFromStream(request.stream)
</span><span class="cx">         for ace in document.root_element.children:
</span><span class="cx">             for child in ace.children:
</span><span class="lines">@@ -3928,7 +3928,7 @@
</span><span class="cx">             if jsondata[&quot;shared-type&quot;] == &quot;calendar&quot;:
</span><span class="cx">                 owner = ownerPrincipal.principalURL()
</span><span class="cx">             else:
</span><del>-                owner = &quot;urn:uuid:&quot; + ownerPrincipal.principalUID()
</del><ins>+                owner = &quot;urn:x-uid:&quot; + ownerPrincipal.principalUID()
</ins><span class="cx"> 
</span><span class="cx">             shareePrincipal = yield self.principalForUID(jsondata[&quot;sharee&quot;])
</span><span class="cx"> 
</span><span class="lines">@@ -3949,7 +3949,7 @@
</span><span class="cx">                 customxml.DTStamp.fromString(jsondata[&quot;dtstamp&quot;]),
</span><span class="cx">                 customxml.InviteNotification(
</span><span class="cx">                     customxml.UID.fromString(jsondata[&quot;uid&quot;]),
</span><del>-                    element.HRef.fromString(&quot;urn:uuid:&quot; + jsondata[&quot;sharee&quot;]),
</del><ins>+                    element.HRef.fromString(&quot;urn:x-uid:&quot; + jsondata[&quot;sharee&quot;]),
</ins><span class="cx">                     invitationBindStatusToXMLMap[jsondata[&quot;status&quot;]](),
</span><span class="cx">                     customxml.InviteAccess(invitationBindModeToXMLMap[jsondata[&quot;access&quot;]]()),
</span><span class="cx">                     customxml.HostURL(
</span><span class="lines">@@ -3970,7 +3970,7 @@
</span><span class="cx"> 
</span><span class="cx">             shareePrincipal = yield self.principalForUID(jsondata[&quot;sharee&quot;])
</span><span class="cx"> 
</span><del>-            # FIXME:  use urn:uuid always?
</del><ins>+            # FIXME:  use urn:x-uid always?
</ins><span class="cx">             if jsondata[&quot;shared-type&quot;] == &quot;calendar&quot;:
</span><span class="cx">                 # Prefer mailto:, otherwise use principal URL
</span><span class="cx">                 for cua in shareePrincipal.calendarUserAddresses():
</span><span class="lines">@@ -3979,7 +3979,7 @@
</span><span class="cx">                 else:
</span><span class="cx">                     cua = shareePrincipal.principalURL()
</span><span class="cx">             else:
</span><del>-                cua = &quot;urn:uuid:&quot; + shareePrincipal.principalUID()
</del><ins>+                cua = &quot;urn:x-uid:&quot; + shareePrincipal.principalUID()
</ins><span class="cx"> 
</span><span class="cx">             commonName = shareePrincipal.displayName()
</span><span class="cx">             # record = shareePrincipal.record
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavtesttest_icalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_icalendar.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_icalendar.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_icalendar.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -7598,7 +7598,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def test_normalizeCalendarUserAddressesFromUUID(self):
</del><ins>+    def test_normalizeCalendarUserAddressesFromCanonical(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure mailto is preferred, followed by path form, then http form.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -7612,6 +7612,7 @@
</span><span class="cx"> ATTENDEE:urn:uuid:foo
</span><span class="cx"> ATTENDEE:urn:uuid:bar
</span><span class="cx"> ATTENDEE:urn:uuid:baz
</span><ins>+ATTENDEE:urn:x-uid:buz
</ins><span class="cx"> DTSTAMP:20071114T000000Z
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -7627,24 +7628,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:baz&quot; : (
</span><span class="cx">                         &quot;Baz&quot;,
</span><span class="cx">                         &quot;baz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                       (&quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</del><ins>+                       (&quot;urn:x-uid:baz&quot;, &quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</ins><span class="cx">                     ),
</span><ins>+                    &quot;urn:x-uid:buz&quot; : (
+                        &quot;Buz&quot;,
+                        &quot;buz&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                       (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;, &quot;http://example.com/buz&quot;)
+                    ),
</ins><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=False)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=False)
</ins><span class="cx"> 
</span><span class="cx">         self.assertEquals(&quot;mailto:bar@example.com&quot;,
</span><span class="cx">             component.getAttendeeProperty((&quot;mailto:bar@example.com&quot;,)).value())
</span><span class="lines">@@ -7652,6 +7659,8 @@
</span><span class="cx">             component.getAttendeeProperty((&quot;/foo&quot;,)).value())
</span><span class="cx">         self.assertEquals(&quot;http://example.com/baz&quot;,
</span><span class="cx">             component.getAttendeeProperty((&quot;http://example.com/baz&quot;,)).value())
</span><ins>+        self.assertEquals(&quot;http://example.com/buz&quot;,
+            component.getAttendeeProperty((&quot;http://example.com/buz&quot;,)).value())
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -7686,30 +7695,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;,)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/locations/buzz&quot; : (
</span><span class="cx">                         &quot;{Restricted} Buzz&quot;,
</span><span class="cx">                         &quot;buzz&quot;,
</span><span class="cx">                         &quot;ROOM&quot;,
</span><del>-                        (&quot;urn:uuid:buzz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buzz&quot;, &quot;urn:uuid:buzz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
</ins><span class="cx"> 
</span><span class="cx">         # Location value changed
</span><span class="cx">         prop = component.mainComponent().getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(prop.value(), &quot;{Restricted} Buzz&quot;)
</span><del>-        prop = component.getAttendeeProperty((&quot;urn:uuid:buzz&quot;,))
-        self.assertEquals(&quot;urn:uuid:buzz&quot;, prop.value())
</del><ins>+        prop = component.getAttendeeProperty((&quot;urn:x-uid:buzz&quot;,))
+        self.assertEquals(&quot;urn:x-uid:buzz&quot;, prop.value())
</ins><span class="cx">         self.assertEquals(prop.parameterValue(&quot;CN&quot;), &quot;{Restricted} Buzz&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -7745,30 +7754,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;,)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/locations/buzz&quot; : (
</span><span class="cx">                         &quot;{Restricted} Buzz&quot;,
</span><span class="cx">                         &quot;buzz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buzz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buzz&quot;, &quot;urn:uuid:buzz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
</ins><span class="cx"> 
</span><span class="cx">         # Location value changed
</span><span class="cx">         prop = component.mainComponent().getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(prop.value(), &quot;Fuzz&quot;)
</span><del>-        prop = component.getAttendeeProperty((&quot;urn:uuid:buzz&quot;,))
-        self.assertEquals(&quot;urn:uuid:buzz&quot;, prop.value())
</del><ins>+        prop = component.getAttendeeProperty((&quot;urn:x-uid:buzz&quot;,))
+        self.assertEquals(&quot;urn:x-uid:buzz&quot;, prop.value())
</ins><span class="cx">         self.assertEquals(prop.parameterValue(&quot;CN&quot;), &quot;{Restricted} Buzz&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -7804,30 +7813,30 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;,)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/locations/buzz&quot; : (
</span><span class="cx">                         &quot;{Restricted} Buzz&quot;,
</span><span class="cx">                         &quot;buzz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buzz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buzz&quot;, &quot;urn:uuid:buzz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toUUID=True)
</del><ins>+        yield component.normalizeCalendarUserAddresses(lookupFunction, None, toCanonical=True)
</ins><span class="cx"> 
</span><span class="cx">         # Location value changed
</span><span class="cx">         prop = component.mainComponent().getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(prop.value(), &quot;Buzz&quot;)
</span><del>-        prop = component.getAttendeeProperty((&quot;urn:uuid:buzz&quot;,))
-        self.assertEquals(&quot;urn:uuid:buzz&quot;, prop.value())
</del><ins>+        prop = component.getAttendeeProperty((&quot;urn:x-uid:buzz&quot;,))
+        self.assertEquals(&quot;urn:x-uid:buzz&quot;, prop.value())
</ins><span class="cx">         self.assertEquals(prop.parameterValue(&quot;CN&quot;), &quot;{Restricted} Buzz&quot;)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -8529,7 +8538,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def test_normalizeCUAddressFromUUID(self):
</del><ins>+    def test_normalizeCUAddressFromCanonical(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure mailto is preferred, followed by path form, then http form.
</span><span class="cx">         If CALENDARSERVER-OLD-CUA parameter is present, restore that value.
</span><span class="lines">@@ -8539,7 +8548,11 @@
</span><span class="cx">             (&quot;urn:uuid:foo&quot;, &quot;/foo&quot;),
</span><span class="cx">             (&quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;,),
</span><span class="cx">             (&quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;,),
</span><del>-            (&quot;urn:uuid:buz&quot;, &quot;urn:uuid:buz&quot;,),
</del><ins>+            (&quot;urn:uuid:buz&quot;, &quot;urn:x-uid:buz&quot;,),
+            (&quot;urn:x-uid:foo&quot;, &quot;/foo&quot;),
+            (&quot;urn:x-uid:bar&quot;, &quot;mailto:bar@example.com&quot;,),
+            (&quot;urn:x-uid:baz&quot;, &quot;http://example.com/baz&quot;,),
+            (&quot;urn:x-uid:buz&quot;, &quot;urn:x-uid:buz&quot;,),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         def lookupFunction(cuaddr, ignored1, ignored2):
</span><span class="lines">@@ -8549,44 +8562,68 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:bar&quot; : (
</span><span class="cx">                         &quot;Bar&quot;,
</span><span class="cx">                         &quot;bar&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</del><ins>+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:baz&quot; : (
</span><span class="cx">                         &quot;Baz&quot;,
</span><span class="cx">                         &quot;baz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</del><ins>+                        (&quot;urn:x-uid:baz&quot;, &quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;urn:uuid:buz&quot; : (
</span><span class="cx">                         &quot;Buz&quot;,
</span><span class="cx">                         &quot;buz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;,)
</ins><span class="cx">                     ),
</span><ins>+                    &quot;urn:x-uid:foo&quot; : (
+                        &quot;Foo&quot;,
+                        &quot;foo&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;, &quot;http://example.com/foo&quot;, &quot;/foo&quot;)
+                    ),
+                    &quot;urn:x-uid:bar&quot; : (
+                        &quot;Bar&quot;,
+                        &quot;bar&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:bar&quot;, &quot;urn:uuid:bar&quot;, &quot;mailto:bar@example.com&quot;, &quot;http://example.com/bar&quot;, &quot;/bar&quot;)
+                    ),
+                    &quot;urn:x-uid:baz&quot; : (
+                        &quot;Baz&quot;,
+                        &quot;baz&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:baz&quot;, &quot;urn:uuid:baz&quot;, &quot;http://example.com/baz&quot;)
+                    ),
+                    &quot;urn:x-uid:buz&quot; : (
+                        &quot;Buz&quot;,
+                        &quot;buz&quot;,
+                        &quot;INDIVIDUAL&quot;,
+                        (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;,)
+                    ),
</ins><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">         for cuaddr, result in data:
</span><del>-            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toUUID=False)
</del><ins>+            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toCanonical=False)
</ins><span class="cx">             self.assertEquals(new_cuaddr, result)
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><del>-    def test_normalizeCUAddressToUUID(self):
</del><ins>+    def test_normalizeCUAddressToCanonical(self):
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Ensure http(s) and /path CUA values are tucked away into the property
</span><span class="cx">         using CALENDARSERVER-OLD-CUA parameter.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         data = (
</span><del>-            (&quot;/principals/users/foo&quot;, &quot;urn:uuid:foo&quot;,),
-            (&quot;http://example.com/principals/users/buz&quot;, &quot;urn:uuid:buz&quot;,),
</del><ins>+            (&quot;/principals/users/foo&quot;, &quot;urn:x-uid:foo&quot;,),
+            (&quot;http://example.com/principals/users/buz&quot;, &quot;urn:x-uid:buz&quot;,),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -8597,19 +8634,19 @@
</span><span class="cx">                         &quot;Foo&quot;,
</span><span class="cx">                         &quot;foo&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:foo&quot;,)
</del><ins>+                        (&quot;urn:x-uid:foo&quot;, &quot;urn:uuid:foo&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                     &quot;http://example.com/principals/users/buz&quot; : (
</span><span class="cx">                         &quot;Buz&quot;,
</span><span class="cx">                         &quot;buz&quot;,
</span><span class="cx">                         &quot;INDIVIDUAL&quot;,
</span><del>-                        (&quot;urn:uuid:buz&quot;,)
</del><ins>+                        (&quot;urn:x-uid:buz&quot;, &quot;urn:uuid:buz&quot;,)
</ins><span class="cx">                     ),
</span><span class="cx">                 }[cuaddr]
</span><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">         for cuaddr, result in data:
</span><del>-            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toUUID=True)
</del><ins>+            new_cuaddr = yield normalizeCUAddress(cuaddr, lookupFunction, None, toCanonical=True)
</ins><span class="cx">             self.assertEquals(new_cuaddr, result)
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavtesttest_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_sharing.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_sharing.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_sharing.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -80,6 +80,8 @@
</span><span class="cx">     def __init__(self, cuaddr, test):
</span><span class="cx">         if cuaddr.startswith(&quot;mailto:&quot;):
</span><span class="cx">             name = cuaddr[7:].split('@')[0]
</span><ins>+        elif cuaddr.startswith(&quot;urn:x-uid:&quot;):
+            name = cuaddr[10:]
</ins><span class="cx">         elif cuaddr.startswith(&quot;urn:uuid:&quot;):
</span><span class="cx">             name = cuaddr[9:]
</span><span class="cx">         else:
</span><span class="lines">@@ -324,7 +326,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -354,7 +356,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -403,7 +405,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -478,21 +480,21 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="cx">             ),
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user03&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user03&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 03&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="cx">             ),
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user04&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user04&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 04&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -536,14 +538,14 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="cx">             ),
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user04&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user04&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 04&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -587,14 +589,14 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="cx">             ),
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user03&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user03&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 03&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -704,7 +706,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -719,7 +721,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;user02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -848,7 +850,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -878,7 +880,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span><span class="lines">@@ -922,7 +924,7 @@
</span><span class="cx">         self.assertEquals(self._clearUIDElementValue(propInvite), customxml.Invite(
</span><span class="cx">             customxml.InviteUser(
</span><span class="cx">                 customxml.UID.fromString(&quot;&quot;),
</span><del>-                davxml.HRef.fromString(&quot;urn:uuid:user02&quot;),
</del><ins>+                davxml.HRef.fromString(&quot;urn:x-uid:user02&quot;),
</ins><span class="cx">                 customxml.CommonName.fromString(&quot;User 02&quot;),
</span><span class="cx">                 customxml.InviteAccess(customxml.ReadWriteAccess()),
</span><span class="cx">                 customxml.InviteStatusNoResponse(),
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavtesttest_upgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_upgrade.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_upgrade.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/test/test_upgrade.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -1537,13 +1537,13 @@
</span><span class="cx"> 
</span><span class="cx">         records = {
</span><span class="cx">             &quot;mailto:a@example.com&quot;:
</span><del>-                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:uuid:123&quot;)),
</del><ins>+                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:x-uid:123&quot;)),
</ins><span class="cx">             &quot;mailto:b@example.com&quot;:
</span><del>-                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:uuid:234&quot;)),
</del><ins>+                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:x-uid:234&quot;)),
</ins><span class="cx">             &quot;/principals/users/a&quot;:
</span><del>-                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:uuid:123&quot;)),
</del><ins>+                StubRecord((&quot;User A&quot;,), u&quot;123&quot;, (&quot;mailto:a@example.com&quot;, &quot;urn:x-uid:123&quot;)),
</ins><span class="cx">             &quot;/principals/users/b&quot;:
</span><del>-                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:uuid:234&quot;)),
</del><ins>+                StubRecord((&quot;User B&quot;,), u&quot;234&quot;, (&quot;mailto:b@example.com&quot;, &quot;urn:x-uid:234&quot;)),
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         directory = StubDirectory()
</span><span class="lines">@@ -1681,17 +1681,18 @@
</span><span class="cx"> DTSTART;TZID=US/Pacific:20090203T120000
</span><span class="cx"> DTEND;TZID=US/Pacific:20090203T130000
</span><span class="cx"> ATTENDEE;CN=Wilfredo Sanchez;CUTYPE=INDIVIDUAL;EMAIL=wsanchez@example.com;
</span><del>- PARTSTAT=ACCEPTED:urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D
</del><ins>+ PARTSTAT=ACCEPTED:urn:x-uid:6423F94A-6B76-4A3A-815B-D52CFD77935D
</ins><span class="cx"> ATTENDEE;CN=Double 'quotey' Quotes;CUTYPE=INDIVIDUAL;EMAIL=doublequotes@ex
</span><del>- ample.com;PARTSTAT=ACCEPTED:urn:uuid:8E04787E-336D-41ED-A70B-D233AD0DCE6F
</del><ins>+ ample.com;PARTSTAT=ACCEPTED:urn:x-uid:8E04787E-336D-41ED-A70B-D233AD0DCE6
+ F
</ins><span class="cx"> ATTENDEE;CN=Cyrus Daboo;CUTYPE=INDIVIDUAL;EMAIL=cdaboo@example.com;PARTSTA
</span><del>- T=ACCEPTED;ROLE=REQ-PARTICIPANT:urn:uuid:5A985493-EE2C-4665-94CF-4DFEA3A8
- 9500
</del><ins>+ T=ACCEPTED;ROLE=REQ-PARTICIPANT:urn:x-uid:5A985493-EE2C-4665-94CF-4DFEA3A
+ 89500
</ins><span class="cx"> CREATED:20090203T181910Z
</span><span class="cx"> DESCRIPTION:This has &quot; Bad Quotes &quot; in it
</span><span class="cx"> DTSTAMP:20090203T181924Z
</span><del>-ORGANIZER;CN=Cyrus Daboo;EMAIL=cdaboo@example.com:urn:uuid:5A985493-EE2C-4
- 665-94CF-4DFEA3A89500
</del><ins>+ORGANIZER;CN=Cyrus Daboo;EMAIL=cdaboo@example.com:urn:x-uid:5A985493-EE2C-
+ 4665-94CF-4DFEA3A89500
</ins><span class="cx"> SEQUENCE:2
</span><span class="cx"> SUMMARY:New Event
</span><span class="cx"> TRANSP:OPAQUE
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1twistedcaldavupgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/upgrade.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/upgrade.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/twistedcaldav/upgrade.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -587,7 +587,8 @@
</span><span class="cx"> @inlineCallbacks
</span><span class="cx"> def normalizeCUAddrs(data, directory, cuaCache):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Normalize calendar user addresses to urn:uuid: form.
</del><ins>+    Normalize calendar user addresses in data.  Cache CUA lookup results for
+    great speed.
</ins><span class="cx"> 
</span><span class="cx">     @param data: the calendar data to convert
</span><span class="cx">     @type data: C{str}
</span><span class="lines">@@ -1310,7 +1311,7 @@
</span><span class="cx">         txn = request._newStoreTransaction
</span><span class="cx"> 
</span><span class="cx">         ownerPrincipal = principal
</span><del>-        cua = &quot;urn:uuid:%s&quot; % (uuid,)
</del><ins>+        cua = &quot;urn:x-uid:%s&quot; % (uuid,)
</ins><span class="cx">         owner = LocalCalendarUser(
</span><span class="cx">             cua, ownerPrincipal,
</span><span class="cx">             inbox, ownerPrincipal.scheduleInboxURL()
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingimipinboundpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/imip/inbound.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/imip/inbound.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/imip/inbound.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -327,9 +327,9 @@
</span><span class="cx">             fromAddr = attendee[7:]
</span><span class="cx">             if organizer.startswith(&quot;mailto:&quot;):
</span><span class="cx">                 toAddr = organizer[7:]
</span><del>-            elif organizer.startswith(&quot;urn:uuid:&quot;):
-                guid = organizer[9:]
-                record = yield self.directory.recordWithGUID(guid)
</del><ins>+            elif organizer.startswith(&quot;urn:x-uid:&quot;):
+                uid = organizer[10:]
+                record = yield self.directory.recordWithUID(uid)
</ins><span class="cx">                 try:
</span><span class="cx">                     if record and record.emailAddresses:
</span><span class="cx">                         toAddr = list(record.emailAddresses)[0]
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingimplicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/implicit.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/implicit.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/implicit.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -633,7 +633,7 @@
</span><span class="cx">                 self.calendar.sequenceInSync(self.oldcalendar)
</span><span class="cx"> 
</span><span class="cx">             # Significant change
</span><del>-            no_change, self.changed_rids, self.needs_action_rids, reinvites, recurrence_reschedule, status_cancelled, only_status = yield self.isOrganizerChangeInsignificant()
</del><ins>+            no_change, self.changed_rids, self.needs_action_rids, reinvites, recurrence_reschedule, status_cancelled, only_status = self.isOrganizerChangeInsignificant()
</ins><span class="cx">             if no_change:
</span><span class="cx">                 if reinvites:
</span><span class="cx">                     log.debug(&quot;Implicit - organizer '{organizer}' is re-inviting UID: '{uid}', attendees: {attendees}&quot;, organizer=self.organizer, uid=self.uid, attendees=&quot;, &quot;.join(reinvites))
</span><span class="lines">@@ -721,7 +721,6 @@
</span><span class="cx">                 pass
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @inlineCallbacks
</del><span class="cx">     def isOrganizerChangeInsignificant(self):
</span><span class="cx"> 
</span><span class="cx">         rids = None
</span><span class="lines">@@ -812,16 +811,8 @@
</span><span class="cx">                     only_status = False
</span><span class="cx"> 
</span><span class="cx">             if checkOrganizerValue:
</span><del>-                @inlineCallbacks
-                def _normalizeCUAddress(addr):
-                    if not addr.startswith(&quot;urn:uuid&quot;):
-                        principal = yield self.calendar_home.directoryService().recordWithCalendarUserAddress(addr)
-                        if principal is not None:
-                            addr = principal.canonicalCalendarUserAddress()
-                    returnValue(addr)
-
-                oldOrganizer = yield _normalizeCUAddress(self.oldcalendar.getOrganizer())
-                newOrganizer = yield _normalizeCUAddress(self.calendar.getOrganizer())
</del><ins>+                oldOrganizer = self.oldcalendar.getOrganizer()
+                newOrganizer = self.calendar.getOrganizer()
</ins><span class="cx">                 if oldOrganizer != newOrganizer:
</span><span class="cx">                     log.error(&quot;Cannot change ORGANIZER: UID:{uid}&quot;, uid=self.uid)
</span><span class="cx">                     raise HTTPError(ErrorResponse(
</span><span class="lines">@@ -839,10 +830,10 @@
</span><span class="cx">                 except KeyError:
</span><span class="cx">                     pass
</span><span class="cx"> 
</span><del>-        returnValue((
</del><ins>+        return (
</ins><span class="cx">             no_change, rids, date_changed_rids, reinvites,
</span><span class="cx">             recurrence_reschedule, status_cancelled, only_status
</span><del>-        ))
</del><ins>+        )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def findRemovedAttendees(self):
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingischeduledeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/ischedule/delivery.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -359,7 +359,7 @@
</span><span class="cx">         # The Originator must be the ORGANIZER (for a request) or ATTENDEE (for a reply)
</span><span class="cx">         originator = self.scheduler.organizer.cuaddr if self.scheduler.isiTIPRequest else self.scheduler.attendee
</span><span class="cx">         if self.server.unNormalizeAddresses:
</span><del>-            originator = yield normalizeCUAddress(originator, normalizationLookup, self.scheduler.txn.directoryService().recordWithCalendarUserAddress, toUUID=False)
</del><ins>+            originator = yield normalizeCUAddress(originator, normalizationLookup, self.scheduler.txn.directoryService().recordWithCalendarUserAddress, toCanonical=False)
</ins><span class="cx">         self.headers.addRawHeader(&quot;Originator&quot;, utf8String(originator))
</span><span class="cx">         self.sign_headers.append(&quot;Originator&quot;)
</span><span class="cx"> 
</span><span class="lines">@@ -417,7 +417,7 @@
</span><span class="cx">                 yield normalizedCalendar.normalizeCalendarUserAddresses(
</span><span class="cx">                     normalizationLookup,
</span><span class="cx">                     self.scheduler.txn.directoryService().recordWithCalendarUserAddress,
</span><del>-                    toUUID=False)
</del><ins>+                    toCanonical=False)
</ins><span class="cx"> 
</span><span class="cx">             # For VFREEBUSY we need to strip out ATTENDEEs that do not match the recipient list
</span><span class="cx">             if self.scheduler.isfreebusy:
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreschedulingtesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/test/test_implicit.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -1295,7 +1295,8 @@
</span><span class="cx"> 
</span><span class="cx">         cobj = yield self.calendarObjectUnderTest(home=&quot;user01&quot;, name=&quot;test.ics&quot;)
</span><span class="cx">         comp = yield cobj.component()
</span><del>-        self.assertTrue(comp.getOrganizer().startswith(&quot;mailto:&quot;))
</del><ins>+        # Because CUA normalization happens in component() now too...
+        self.assertTrue(comp.getOrganizer().startswith(&quot;urn:x-uid:&quot;))
</ins><span class="cx">         self.assertFalse(comp.getOrganizerScheduleAgent())
</span><span class="cx"> 
</span><span class="cx">         cobj = yield self.calendarObjectUnderTest(home=&quot;user01&quot;, name=&quot;test.ics&quot;)
</span><span class="lines">@@ -1304,7 +1305,7 @@
</span><span class="cx"> 
</span><span class="cx">         cobj = yield self.calendarObjectUnderTest(home=&quot;user01&quot;, name=&quot;test.ics&quot;)
</span><span class="cx">         comp = yield cobj.component()
</span><del>-        self.assertTrue(comp.getOrganizer().startswith(&quot;urn:uuid:&quot;))
</del><ins>+        self.assertTrue(comp.getOrganizer().startswith(&quot;urn:x-uid:&quot;))
</ins><span class="cx">         self.assertTrue(comp.getOrganizerScheduleAgent())
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/sql.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/sql.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/sql.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -3047,6 +3047,14 @@
</span><span class="cx">             # Fix any bogus data we can
</span><span class="cx">             fixed, unfixed = component.validCalendarData(doFix=True, doRaise=False)
</span><span class="cx"> 
</span><ins>+            # Normalize CUAs:
+            # FIXME: update the DB copy as well so we don't keep going through
+            # this normalization?
+            yield component.normalizeCalendarUserAddresses(
+                normalizationLookup,
+                self.directoryService().recordWithCalendarUserAddress
+            )
+
</ins><span class="cx">             if unfixed:
</span><span class="cx">                 self.log.error(
</span><span class="cx">                     &quot;Calendar data id={0} had unfixable problems:\n  {1}&quot;.format(
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_implicit.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_implicit.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_implicit.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -103,8 +103,8 @@
</span><span class="cx">         calendar_resource1 = (yield self.calendarObjectUnderTest(name=&quot;test.ics&quot;, home=&quot;user01&quot;,))
</span><span class="cx">         calendar1 = (yield calendar_resource1.component())
</span><span class="cx">         calendar1 = str(calendar1).replace(&quot;\r\n &quot;, &quot;&quot;)
</span><del>-        self.assertTrue(&quot;urn:uuid:user01&quot; in calendar1)
-        self.assertTrue(&quot;urn:uuid:user02&quot; in calendar1)
</del><ins>+        self.assertTrue(&quot;urn:x-uid:user01&quot; in calendar1)
+        self.assertTrue(&quot;urn:x-uid:user02&quot; in calendar1)
</ins><span class="cx">         self.assertTrue(&quot;CN=&quot; in calendar1)
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="lines">@@ -543,7 +543,7 @@
</span><span class="cx"> DTSTAMP:20080601T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;
</del><ins>+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:x-uid:user01&quot;;
</ins><span class="cx">  X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -577,7 +577,7 @@
</span><span class="cx">         calendar_resource = (yield self.calendarObjectUnderTest(name=&quot;test.ics&quot;, home=&quot;user01&quot;,))
</span><span class="cx">         calendar1 = (yield calendar_resource.component())
</span><span class="cx">         calendar1 = str(calendar1).replace(&quot;\r\n &quot;, &quot;&quot;)
</span><del>-        self.assertTrue(&quot;X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=\&quot;urn:uuid:user01\&quot;;X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment&quot; in calendar1)
</del><ins>+        self.assertTrue(&quot;X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=\&quot;urn:x-uid:user01\&quot;;X-CALENDARSERVER-DTSTAMP=20131101T100000Z:Someone else's comment&quot; in calendar1)
</ins><span class="cx">         self.assertTrue(&quot;SUMMARY:Changed&quot; in calendar1)
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretesttest_queue_schedulingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_queue_scheduling.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_queue_scheduling.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_queue_scheduling.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -122,10 +122,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -139,10 +139,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -155,10 +155,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> TRANSP:TRANSPARENT
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -172,10 +172,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -188,10 +188,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED;SCHEDULE-STATUS=2.0:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -205,9 +205,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> REQUEST-STATUS:2.0;Success
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -221,10 +221,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:{now}T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com;SCHEDULE-STATUS=1.2:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com;SCHEDULE-STATUS=1.2:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_sql.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_sql.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/test_sql.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -2022,10 +2022,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20130806T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2034,10 +2034,10 @@
</span><span class="cx"> RECURRENCE-ID:20130807T120000Z
</span><span class="cx"> DTSTART:20130807T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -2050,10 +2050,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20130806T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-2
</span><span class="lines">@@ -2063,10 +2063,10 @@
</span><span class="cx"> RECURRENCE-ID:20130807T000000Z
</span><span class="cx"> DTSTART:20130807T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2080,10 +2080,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20130806T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-2
</span><span class="lines">@@ -2093,10 +2093,10 @@
</span><span class="cx"> RECURRENCE-ID:20130807T000000Z
</span><span class="cx"> DTSTART:20130807T000000Z
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1-3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2160,12 +2160,12 @@
</span><span class="cx"> DTSTART;TZID=America/Los_Angeles:20131211T164500
</span><span class="cx"> DTEND;TZID=America/Los_Angeles:20131211T174500
</span><span class="cx"> ATTENDEE;CN=Conference Room One;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
</span><del>- T;SCHEDULE-STATUS=2.0:urn:uuid:room1
</del><ins>+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room1
</ins><span class="cx"> ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
</span><del>- CEPTED:urn:uuid:user01
</del><ins>+ CEPTED:urn:x-uid:user01
</ins><span class="cx"> CREATED:20131211T221854Z
</span><span class="cx"> DTSTAMP:20131211T230632Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY;COUNT=5
</span><span class="cx"> SEQUENCE:8
</span><span class="cx"> SUMMARY:locations
</span><span class="lines">@@ -2177,12 +2177,12 @@
</span><span class="cx"> DTSTART;TZID=America/Los_Angeles:20131214T160000
</span><span class="cx"> DTEND;TZID=America/Los_Angeles:20131214T170000
</span><span class="cx"> ATTENDEE;CN=Conference Room Two;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
</span><del>- T;SCHEDULE-STATUS=2.0:urn:uuid:room2
</del><ins>+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room2
</ins><span class="cx"> ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
</span><del>- CEPTED:urn:uuid:user01
</del><ins>+ CEPTED:urn:x-uid:user01
</ins><span class="cx"> CREATED:20131211T221854Z
</span><span class="cx"> DTSTAMP:20131211T230632Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:8
</span><span class="cx"> SUMMARY:locations
</span><span class="cx"> TRANSP:OPAQUE
</span><span class="lines">@@ -2571,11 +2571,11 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2589,10 +2589,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user05
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user05
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2606,11 +2606,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2624,11 +2624,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user04
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user04
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2637,10 +2637,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2654,12 +2654,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2685,11 +2685,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2703,11 +2703,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:uuid:user04
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:x-uid:user04
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2716,10 +2716,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2741,12 +2741,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2765,12 +2765,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2796,13 +2796,13 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_back25)s
</span><span class="cx"> EXDATE:%(now_back24)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2829,12 +2829,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:uuid:user03
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 03;EMAIL=user03@example.com;RSVP=TRUE:urn:x-uid:user03
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -2854,11 +2854,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
-ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:uuid:user04
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
+ATTENDEE;CN=User 04;EMAIL=user04@example.com;RSVP=TRUE:urn:x-uid:user04
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2881,10 +2881,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:uuid:user05
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:x-uid:user05
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -2908,10 +2908,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:uuid:user05
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 05;EMAIL=user05@example.com;RSVP=TRUE:urn:x-uid:user05
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3188,10 +3188,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3208,10 +3208,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3235,10 +3235,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3251,10 +3251,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3270,10 +3270,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3294,10 +3294,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="cx">  1234567890123456789012345678901234567890
</span><span class="lines">@@ -3459,10 +3459,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3477,10 +3477,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:1234567890123456789012345678901234567890
</span><span class="lines">@@ -3494,10 +3494,10 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -3506,10 +3506,10 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -3518,10 +3518,10 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -3535,10 +3535,10 @@
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3553,10 +3553,10 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3571,10 +3571,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3589,10 +3589,10 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3602,10 +3602,10 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3620,10 +3620,10 @@
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3638,10 +3638,10 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(mid)s;SIZE=14:%(att_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3663,10 +3663,10 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:3
</span><span class="lines">@@ -3681,10 +3681,10 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3694,10 +3694,10 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTACH;FILENAME=new.attachment;FMTTYPE=text/x-fixture;MANAGED-ID=%(past_mid)s;SIZE=14:%(att_past_uri)s
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:%(dtstamp)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:3
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -3913,7 +3913,7 @@
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3930,7 +3930,7 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3966,7 +3966,7 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3983,7 +3983,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -3995,7 +3995,7 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4044,7 +4044,7 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4061,7 +4061,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4073,7 +4073,7 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4096,7 +4096,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4143,7 +4143,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip2 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;C4526F4C-4324-4893-B769-BD766E4A4E7C&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4217,7 +4217,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4253,7 +4253,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;CANCEL&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4336,7 +4336,7 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4371,7 +4371,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4475,7 +4475,7 @@
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=TENTATIVE:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4505,7 +4505,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4541,7 +4541,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4697,7 +4697,7 @@
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=ACCEPTED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4714,7 +4714,7 @@
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=TENTATIVE:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=NEEDS-ACTION:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4726,7 +4726,7 @@
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><span class="cx"> ATTENDEE;PARTSTAT=DECLINED:mailto:cuser01@example.org
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=DECLINED:urn:x-uid:user01
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> ORGANIZER;SCHEDULE-AGENT=NONE:mailto:cuser01@example.org
</span><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:C4526F4C-4324-4893-B769-BD766E4A4E7C
</span><span class="lines">@@ -4758,7 +4758,7 @@
</span><span class="cx">         processor.recipient_calendar = (yield cobj.componentForUser(&quot;user01&quot;))
</span><span class="cx">         processor.message = Component.fromString(itip1 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;12345-67890&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4777,7 +4777,7 @@
</span><span class="cx">         processor.recipient_calendar = None
</span><span class="cx">         processor.message = Component.fromString(itip2 % self.subs)
</span><span class="cx">         processor.originator = RemoteCalendarUser(&quot;mailto:cuser01@example.org&quot;)
</span><del>-        processor.recipient = LocalCalendarUser(&quot;urn:uuid:user01&quot;, None)
</del><ins>+        processor.recipient = LocalCalendarUser(&quot;urn:x-uid:user01&quot;, None)
</ins><span class="cx">         processor.method = &quot;REQUEST&quot;
</span><span class="cx">         processor.uid = &quot;C4526F4C-4324-4893-B769-BD766E4A4E7C&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -4858,11 +4858,11 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4876,10 +4876,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -4893,11 +4893,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4911,11 +4911,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -4924,10 +4924,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -4941,12 +4941,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4972,11 +4972,11 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -4990,11 +4990,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5003,10 +5003,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5028,12 +5028,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_fwd10)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5055,11 +5055,11 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5073,10 +5073,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5093,12 +5093,12 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><span class="cx"> EXDATE:%(now_back24)s
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5112,11 +5112,11 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> ATTENDEE;RSVP=TRUE:mailto:cuser01@example.org
</span><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5204,11 +5204,11 @@
</span><span class="cx"> 
</span><span class="cx">         # Verify cuser02 data
</span><span class="cx">         self.assertEqual(len(details), 2)
</span><del>-        self.assertEqual(details[0][0], &quot;urn:uuid:user01&quot;)
</del><ins>+        self.assertEqual(details[0][0], &quot;urn:x-uid:user01&quot;)
</ins><span class="cx">         self.assertEqual(details[0][1], (&quot;mailto:cuser01@example.org&quot;,))
</span><span class="cx">         self.assertEqual(normalize_iCalStr(details[0][2]), normalize_iCalStr(data_future_external) % relsubs, &quot;Failed future: %s\n%s&quot; % (title, diff_iCalStrs(details[0][2], data_future_external % relsubs),))
</span><span class="cx"> 
</span><del>-        self.assertEqual(details[1][0], &quot;urn:uuid:user01&quot;)
</del><ins>+        self.assertEqual(details[1][0], &quot;urn:x-uid:user01&quot;)
</ins><span class="cx">         self.assertEqual(details[1][1], (&quot;mailto:cuser01@example.org&quot;,))
</span><span class="cx">         self.assertEqual(normalize_iCalStr(details[1][2]), normalize_iCalStr(data_past_external) % relsubs, &quot;Failed past: %s\n%s&quot; % (title, diff_iCalStrs(details[1][2], data_past_external % relsubs),))
</span><span class="cx"> 
</span><span class="lines">@@ -5325,10 +5325,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5342,10 +5342,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5359,10 +5359,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5376,10 +5376,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5388,10 +5388,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5405,10 +5405,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5422,10 +5422,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5446,10 +5446,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back30)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5463,10 +5463,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5475,10 +5475,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5500,10 +5500,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT2H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5517,10 +5517,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5706,10 +5706,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;COUNT=36
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5723,10 +5723,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5740,10 +5740,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back28)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5757,10 +5757,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5769,10 +5769,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5786,10 +5786,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;COUNT=36
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5803,10 +5803,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5827,10 +5827,10 @@
</span><span class="cx"> UID:%(relID)s
</span><span class="cx"> DTSTART:%(now_back28)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;UNTIL=%(now_back14_1)s
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5844,10 +5844,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back25)s
</span><span class="cx"> DTSTART:%(now_back25)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5856,10 +5856,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_back24)s
</span><span class="cx"> DTSTART:%(now_back24)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span><span class="lines">@@ -5881,10 +5881,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:%(now_back14)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> RRULE:FREQ=DAILY;COUNT=36
</span><span class="cx"> SEQUENCE:1
</span><span class="lines">@@ -5898,10 +5898,10 @@
</span><span class="cx"> RECURRENCE-ID:%(now_fwd10)s
</span><span class="cx"> DTSTART:%(now_fwd10)s
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:uuid:user01
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:user02
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;PARTSTAT=ACCEPTED:urn:x-uid:user01
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:user02
</ins><span class="cx"> DTSTAMP:20051222T210507Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:user01
</ins><span class="cx"> RELATED-TO;RELTYPE=X-CALENDARSERVER-RECURRENCE-SET:%(relID)s
</span><span class="cx"> SEQUENCE:1
</span><span class="cx"> END:VEVENT
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/util.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/util.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/test/util.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -81,6 +81,7 @@
</span><span class="cx">     def canonicalCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">             Return a CUA for this record, preferring in this order:
</span><ins>+            urn:x-uid: form
</ins><span class="cx">             urn:uuid: form
</span><span class="cx">             mailto: form
</span><span class="cx">             /principals/__uids__/ form
</span><span class="lines">@@ -90,6 +91,7 @@
</span><span class="cx">         sortedCuas = sorted(self.calendarUserAddresses)
</span><span class="cx"> 
</span><span class="cx">         for prefix in (
</span><ins>+            &quot;urn:x-uid:&quot;,
</ins><span class="cx">             &quot;urn:uuid:&quot;,
</span><span class="cx">             &quot;mailto:&quot;,
</span><span class="cx">             &quot;/principals/__uids__/&quot;
</span><span class="lines">@@ -147,6 +149,7 @@
</span><span class="cx">             (&quot;user%02d&quot; % (ctr,),),
</span><span class="cx">             &quot;User %02d&quot; % (ctr,),
</span><span class="cx">             frozenset((
</span><ins>+                &quot;urn:x-uid:user%02d&quot; % (ctr,),
</ins><span class="cx">                 &quot;urn:uuid:user%02d&quot; % (ctr,),
</span><span class="cx">                 &quot;mailto:user%02d@example.com&quot; % (ctr,),
</span><span class="cx">             )),
</span><span class="lines">@@ -188,13 +191,13 @@
</span><span class="cx">     ))
</span><span class="cx">     directory.addRecord(TestCalendarStoreDirectoryRecord(
</span><span class="cx">         &quot;room1&quot;, (&quot;room1&quot;,), &quot;Conference Room One&quot;,
</span><del>-        frozenset((&quot;urn:uuid:room1&quot;,)),
</del><ins>+        frozenset((&quot;urn:x-uid:room1&quot;,)),
</ins><span class="cx">         cutype=&quot;ROOM&quot;,
</span><span class="cx">         associatedAddress=&quot;il1&quot;,
</span><span class="cx">     ))
</span><span class="cx">     directory.addRecord(TestCalendarStoreDirectoryRecord(
</span><span class="cx">         &quot;room2&quot;, (&quot;room2&quot;,), &quot;Conference Room Two&quot;,
</span><del>-        frozenset((&quot;urn:uuid:room2&quot;,)),
</del><ins>+        frozenset((&quot;urn:x-uid:room2&quot;,)),
</ins><span class="cx">         cutype=&quot;ROOM&quot;,
</span><span class="cx">         associatedAddress=&quot;il2&quot;,
</span><span class="cx">     ))
</span><span class="lines">@@ -209,6 +212,7 @@
</span><span class="cx">         (uid,),
</span><span class="cx">         uid.capitalize(),
</span><span class="cx">         frozenset((
</span><ins>+            &quot;urn:x-uid:{0}&quot;.format(uid,),
</ins><span class="cx">             &quot;urn:uuid:{0}&quot;.format(uid,),
</span><span class="cx">             &quot;mailto:{0}@example.com&quot;.format(uid,),
</span><span class="cx">         )),
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcaldavdatastoreutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/util.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/util.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/caldav/datastore/util.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -104,8 +104,8 @@
</span><span class="cx"> def normalizationLookup(cuaddr, recordFunction, config):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Lookup function to be passed to ical.normalizeCalendarUserAddresses.
</span><del>-    Returns a tuple of (Full name C{str}, guid C{UUID}, cudtype C{str}, and
-    calendar user address list C{str}) for the given cuaddr.
</del><ins>+    Returns a tuple of (Full name C{unicode}, uid C{unicode}, cudtype C{str}, and
+    calendar user address list C{unicode}) for the given cuaddr.
</ins><span class="cx">     recordFunction is called to retrieve the record for the cuaddr.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     try:
</span><span class="lines">@@ -127,15 +127,10 @@
</span><span class="cx">         cuas = set(
</span><span class="cx">             [cua.encode(&quot;utf-8&quot;) for cua in record.calendarUserAddresses]
</span><span class="cx">         )
</span><del>-        try:
-            guid = record.guid
-        except AttributeError:
-            guid = None
</del><ins>+        returnValue((fullName, record.uid, record.getCUType(), cuas))
</ins><span class="cx"> 
</span><del>-        returnValue((fullName, guid, record.getCUType(), cuas))
</del><span class="cx"> 
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> @inlineCallbacks
</span><span class="cx"> def dropboxIDFromCalendarObject(calendarObject):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavcommondatastoresql_schemacurrentsql"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/common/datastore/sql_schema/current.sql (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/common/datastore/sql_schema/current.sql        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/common/datastore/sql_schema/current.sql        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -1007,6 +1007,45 @@
</span><span class="cx"> create index SCHEDULE_REPLY_CANCEL_WORK_JOB_ID on
</span><span class="cx">   SCHEDULE_REPLY_CANCEL_WORK(JOB_ID);
</span><span class="cx"> 
</span><ins>+----------------------------------
+-- Principal Purge Polling Work --
+----------------------------------
+
+create table PRINCIPAL_PURGE_SCAN_POLLING_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null
+);
+
+create index PRINCIPAL_PURGE_SCAN_POLLING_WORK_JOB_ID on
+  PRINCIPAL_PURGE_SCAN_POLLING_WORK(JOB_ID);
+
+--------------------------------
+-- Principal Purge Check Work --
+--------------------------------
+
+create table PRINCIPAL_PURGE_CHECK_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null,
+  UID                           varchar(255) not null
+);
+
+create index PRINCIPAL_PURGE_CHECK_WORK_JOB_ID on
+  PRINCIPAL_PURGE_CHECK_WORK(JOB_ID);
+
+--------------------------
+-- Principal Purge Work --
+--------------------------
+
+create table PRINCIPAL_PURGE_WORK (
+  WORK_ID                       integer      primary key default nextval('WORKITEM_SEQ') not null, -- implicit index
+  JOB_ID                        integer      references JOB not null,
+  UID                           varchar(255) not null
+);
+
+create index PRINCIPAL_PURGE_WORK_JOB_ID on
+  PRINCIPAL_PURGE_WORK(JOB_ID);
+
+
</ins><span class="cx"> --------------------
</span><span class="cx"> -- Schema Version --
</span><span class="cx"> --------------------
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavwhodirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/who/directory.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/who/directory.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/who/directory.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -68,16 +68,23 @@
</span><span class="cx">         from txdav.caldav.datastore.scheduling.cuaddress import normalizeCUAddr
</span><span class="cx">         address = normalizeCUAddr(address)
</span><span class="cx">         record = None
</span><del>-        if address.startswith(&quot;urn:uuid:&quot;):
</del><ins>+
+        if address.startswith(&quot;urn:x-uid:&quot;):
+            uid = address[10:]
+            record = yield self.recordWithUID(uid)
+
+        elif address.startswith(&quot;urn:uuid:&quot;):
</ins><span class="cx">             try:
</span><span class="cx">                 guid = uuid.UUID(address[9:])
</span><span class="cx">             except ValueError:
</span><span class="cx">                 log.info(&quot;Invalid GUID: {guid}&quot;, guid=address[9:])
</span><span class="cx">                 returnValue(None)
</span><span class="cx">             record = yield self.recordWithGUID(guid)
</span><ins>+
</ins><span class="cx">         elif address.startswith(&quot;mailto:&quot;):
</span><span class="cx">             records = yield self.recordsWithEmailAddress(address[7:])
</span><span class="cx">             record = records[0] if records else None
</span><ins>+
</ins><span class="cx">         elif address.startswith(&quot;/principals/&quot;):
</span><span class="cx">             parts = address.split(&quot;/&quot;)
</span><span class="cx">             if len(parts) == 4:
</span><span class="lines">@@ -85,7 +92,6 @@
</span><span class="cx">                     uid = parts[3]
</span><span class="cx">                     record = yield self.recordWithUID(uid)
</span><span class="cx">                 else:
</span><del>-                    # recordType = self.fieldName.lookupByName(parts[2])
</del><span class="cx">                     recordType = self.oldNameToRecordType(parts[2])
</span><span class="cx">                     record = yield self.recordWithShortName(recordType, parts[3])
</span><span class="cx"> 
</span><span class="lines">@@ -259,30 +265,31 @@
</span><span class="cx">         except AttributeError:
</span><span class="cx">             pass
</span><span class="cx"> 
</span><del>-        try:
-            cuas = set(
-                [&quot;mailto:{0}&quot;.format(emailAddress,)
-                 for emailAddress in self.emailAddresses]
-            )
-        except AttributeError:
-            cuas = set()
</del><ins>+        cuas = set()
</ins><span class="cx"> 
</span><ins>+        # urn:x-uid:
+        cuas.add(&quot;urn:x-uid:{}&quot;.format(self.uid))
+
+        # urn:uuid:
</ins><span class="cx">         try:
</span><span class="cx">             if self.guid:
</span><span class="cx">                 if isinstance(self.guid, uuid.UUID):
</span><span class="cx">                     guid = unicode(self.guid).upper()
</span><span class="cx">                 else:
</span><span class="cx">                     guid = self.guid
</span><del>-                cuas.add(&quot;urn:uuid:{guid}&quot;.format(guid=guid))
</del><ins>+                cuas.add(&quot;urn:uuid:{}&quot;.format(guid))
</ins><span class="cx">         except AttributeError:
</span><span class="cx">             # No guid
</span><span class="cx">             pass
</span><del>-        cuas.add(u&quot;/principals/__uids__/{uid}/&quot;.format(uid=self.uid))
-        for shortName in self.shortNames:
-            cuas.add(u&quot;/principals/{rt}/{sn}/&quot;.format(
-                rt=self.service.recordTypeToOldName(self.recordType),
-                sn=shortName)
-            )
</del><ins>+
+        # mailto:
+        try:
+            for emailAddress in self.emailAddresses:
+                cuas.add(u&quot;mailto:{}&quot;.format(emailAddress))
+        except AttributeError:
+            # No emailAddresses
+            pass
+
</ins><span class="cx">         return frozenset(cuas)
</span><span class="cx"> 
</span><span class="cx">     # Mapping from directory record.recordType to RFC2445 CUTYPE values
</span><span class="lines">@@ -346,6 +353,7 @@
</span><span class="cx">     def canonicalCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">             Return a CUA for this record, preferring in this order:
</span><ins>+            urn:x-uid: form
</ins><span class="cx">             urn:uuid: form
</span><span class="cx">             mailto: form
</span><span class="cx">             /principals/__uids__/ form
</span><span class="lines">@@ -355,6 +363,7 @@
</span><span class="cx">         sortedCuas = sorted(self.calendarUserAddresses)
</span><span class="cx"> 
</span><span class="cx">         for prefix in (
</span><ins>+            &quot;urn:x-uid:&quot;,
</ins><span class="cx">             &quot;urn:uuid:&quot;,
</span><span class="cx">             &quot;mailto:&quot;,
</span><span class="cx">             &quot;/principals/__uids__/&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavwhotesttest_directorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_directory.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_directory.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_directory.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -60,20 +60,22 @@
</span><span class="cx">         record = TestDirectoryRecord(
</span><span class="cx">             self.directory,
</span><span class="cx">             {
</span><del>-                FieldName.uid: u&quot;uid&quot;,
</del><ins>+                FieldName.uid: u&quot;test&quot;,
</ins><span class="cx">                 FieldName.shortNames: [u&quot;name&quot;],
</span><span class="cx">                 FieldName.recordType: RecordType.user,
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             record.canonicalCalendarUserAddress(),
</span><del>-            u&quot;/principals/__uids__/uid/&quot;
</del><ins>+            u&quot;urn:x-uid:test&quot;
</ins><span class="cx">         )
</span><span class="cx"> 
</span><ins>+        # Even with email address, canonical still remains urn:x-uid:
+
</ins><span class="cx">         record = TestDirectoryRecord(
</span><span class="cx">             self.directory,
</span><span class="cx">             {
</span><del>-                FieldName.uid: u&quot;uid&quot;,
</del><ins>+                FieldName.uid: u&quot;test&quot;,
</ins><span class="cx">                 FieldName.shortNames: [u&quot;name&quot;],
</span><span class="cx">                 FieldName.emailAddresses: [u&quot;test@example.com&quot;],
</span><span class="cx">                 FieldName.recordType: RecordType.user,
</span><span class="lines">@@ -81,25 +83,57 @@
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(
</span><span class="cx">             record.canonicalCalendarUserAddress(),
</span><del>-            u&quot;mailto:test@example.com&quot;
</del><ins>+            u&quot;urn:x-uid:test&quot;
</ins><span class="cx">         )
</span><span class="cx"> 
</span><ins>+
+    def test_calendarUserAddresses(self):
+        &quot;&quot;&quot;
+        Verify the right CUAs are advertised, which no longer includes the
+        /principals/ flavors (although those are still recognized by
+        recordWithCalendarUserAddress( ) for backwards compatibility).
+        &quot;&quot;&quot;
+
</ins><span class="cx">         record = TestDirectoryRecord(
</span><span class="cx">             self.directory,
</span><span class="cx">             {
</span><del>-                FieldName.uid: u&quot;uid&quot;,
</del><ins>+                FieldName.uid: u&quot;test&quot;,
</ins><span class="cx">                 FieldName.guid: UUID(&quot;E2F6C57F-BB15-4EF9-B0AC-47A7578386F1&quot;),
</span><del>-                FieldName.shortNames: [u&quot;name&quot;],
-                FieldName.emailAddresses: [u&quot;test@example.com&quot;],
</del><ins>+                FieldName.shortNames: [u&quot;name1&quot;, u&quot;name2&quot;],
+                FieldName.emailAddresses: [u&quot;test@example.com&quot;, u&quot;another@example.com&quot;],
</ins><span class="cx">                 FieldName.recordType: RecordType.user,
</span><span class="cx">             }
</span><span class="cx">         )
</span><span class="cx">         self.assertEquals(
</span><del>-            record.canonicalCalendarUserAddress(),
-            u&quot;urn:uuid:E2F6C57F-BB15-4EF9-B0AC-47A7578386F1&quot;
</del><ins>+            record.calendarUserAddresses,
+            frozenset(
+                [
+                    u&quot;urn:x-uid:test&quot;,
+                    u&quot;urn:uuid:E2F6C57F-BB15-4EF9-B0AC-47A7578386F1&quot;,
+                    u&quot;mailto:test@example.com&quot;,
+                    u&quot;mailto:another@example.com&quot;,
+                ]
+            )
</ins><span class="cx">         )
</span><span class="cx"> 
</span><ins>+        record = TestDirectoryRecord(
+            self.directory,
+            {
+                FieldName.uid: u&quot;test&quot;,
+                FieldName.shortNames: [u&quot;name1&quot;, u&quot;name2&quot;],
+                FieldName.recordType: RecordType.user,
+            }
+        )
+        self.assertEquals(
+            record.calendarUserAddresses,
+            frozenset(
+                [
+                    u&quot;urn:x-uid:test&quot;,
+                ]
+            )
+        )
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_recordsFromMatchExpression(self):
</span><span class="cx">         expression = MatchExpression(
</span><span class="lines">@@ -127,7 +161,9 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_recordWithCalendarUserAddress(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Make sure hasCalendars is honored
</del><ins>+        Make sure various CUA forms are recognized and hasCalendars is honored.
+        Note: /principals/ CUAs are recognized but not advertised anymore; see
+        record.calendarUserAddresses.
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # hasCalendars
</span><span class="lines">@@ -135,7 +171,32 @@
</span><span class="cx">             u&quot;mailto:wsanchez@example.com&quot;
</span><span class="cx">         )
</span><span class="cx">         self.assertNotEquals(record, None)
</span><ins>+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
</ins><span class="cx"> 
</span><ins>+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;urn:x-uid:6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;urn:uuid:6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;/principals/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
+        record = yield self.directory.recordWithCalendarUserAddress(
+            u&quot;/principals/users/wsanchez&quot;
+        )
+        self.assertNotEquals(record, None)
+        self.assertEquals(record.uid, u&quot;6423F94A-6B76-4A3A-815B-D52CFD77935D&quot;)
+
</ins><span class="cx">         # no hasCalendars
</span><span class="cx">         record = yield self.directory.recordWithCalendarUserAddress(
</span><span class="cx">             u&quot;mailto:nocalendar@example.com&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagennewcua1txdavwhotesttest_group_attendeespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_group_attendees.py (13327 => 13328)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_group_attendees.py        2014-04-18 19:04:14 UTC (rev 13327)
+++ CalendarServer/branches/users/sagen/newcua-1/txdav/who/test/test_group_attendees.py        2014-04-18 19:16:12 UTC (rev 13328)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> from txdav.who.util import directoryFromConfig
</span><span class="cx"> import os
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class GroupAttendeeReconciliation(CommonCommonTests, unittest.TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     GroupAttendeeReconciliation tests
</span><span class="lines">@@ -41,12 +42,16 @@
</span><span class="cx">         yield super(GroupAttendeeReconciliation, self).setUp()
</span><span class="cx">         self.xmlService = xmlService(self.mktemp(), xmlData=None)
</span><span class="cx"> 
</span><del>-        self.patch(config.DirectoryService.params, &quot;xmlFile&quot;,
</del><ins>+        self.patch(
+            config.DirectoryService.params,
+            &quot;xmlFile&quot;,
</ins><span class="cx">             os.path.join(
</span><span class="cx">                 os.path.dirname(__file__), &quot;accounts&quot;, &quot;groupAttendeeAccounts.xml&quot;
</span><span class="cx">             )
</span><span class="cx">         )
</span><del>-        self.patch(config.ResourceService.params, &quot;xmlFile&quot;,
</del><ins>+        self.patch(
+            config.ResourceService.params,
+            &quot;xmlFile&quot;,
</ins><span class="cx">             os.path.join(
</span><span class="cx">                 os.path.dirname(__file__), &quot;accounts&quot;, &quot;resources.xml&quot;
</span><span class="cx">             )
</span><span class="lines">@@ -77,6 +82,7 @@
</span><span class="cx">         &quot;10000000-0000-0000-0000-000000000008&quot; : None,
</span><span class="cx">         &quot;10000000-0000-0000-0000-000000000009&quot; : None,
</span><span class="cx">         &quot;10000000-0000-0000-0000-000000000010&quot; : None,
</span><ins>+
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -118,12 +124,12 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
-ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000002
+ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -176,10 +182,10 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> ATTENDEE;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:FFFFFFFF-EEEE-DDDD-CCCC-BBBBBBBBBBBB
</span><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -227,11 +233,11 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -271,7 +277,7 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> ORGANIZER:MAILTO:user01@example.com
</span><span class="cx"> ATTENDEE:mailto:user01@example.com
</span><del>-ATTENDEE:urn:uuid:20000000-0000-0000-0000-000000000004
</del><ins>+ATTENDEE:urn:x-uid:20000000-0000-0000-0000-000000000004
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR&quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -283,15 +289,15 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000004
-ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
-ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
-ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
-ATTENDEE;CN=User 10;EMAIL=user10@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000010
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000004
+ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
+ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000008
+ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000009
+ATTENDEE;CN=User 10;EMAIL=user10@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000004&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000010
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -351,16 +357,16 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
-ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 03;CUTYPE=GROUP;EMAIL=group03@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000003
-ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
-ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
-ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
-ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
</del><ins>+ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 03;CUTYPE=GROUP;EMAIL=group03@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000003
+ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000008
+ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000003&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000009
+ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000006
+ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000002&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000007
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -410,10 +416,10 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:uuid:10000000-0000-0000-0000-000000000002
</del><ins>+ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:x-uid:10000000-0000-0000-0000-000000000002
</ins><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -427,11 +433,11 @@
</span><span class="cx"> UID:event1@ninevah.local
</span><span class="cx"> DTSTART;TZID=US/Eastern:20140101T100000
</span><span class="cx"> DURATION:PT1H
</span><del>-ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000002
-ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000001
-ATTENDEE;CN=User 01;EMAIL=user01@example.com;MEMBER=&quot;urn:uuid:20000000-0000-0000-0000-000000000001&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000001
</del><ins>+ATTENDEE;CN=User 02;EMAIL=user02@example.com;RSVP=TRUE:urn:x-uid:10000000-0000-0000-0000-000000000002
+ATTENDEE;CN=Group 01;CUTYPE=GROUP;EMAIL=group01@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:x-uid:20000000-0000-0000-0000-000000000001
+ATTENDEE;CN=User 01;EMAIL=user01@example.com;MEMBER=&quot;urn:x-uid:20000000-0000-0000-0000-000000000001&quot;;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:x-uid:10000000-0000-0000-0000-000000000001
</ins><span class="cx"> CREATED:20060101T150000Z
</span><del>-ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:uuid:10000000-0000-0000-0000-000000000002
</del><ins>+ORGANIZER;CN=User 02;EMAIL=user02@example.com:urn:x-uid:10000000-0000-0000-0000-000000000002
</ins><span class="cx"> SEQUENCE:1
</span><span class="cx"> SUMMARY:event 1
</span><span class="cx"> END:VEVENT
</span></span></pre>
</div>
</div>

</body>
</html>