<!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>[13468] CalendarServer/trunk</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/13468">13468</a></dd>
<dt>Author</dt> <dd>sagen@apple.com</dd>
<dt>Date</dt> <dd>2014-05-09 16:38:16 -0700 (Fri, 09 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Refactor the way unit tests create stores and directories; unit test directory records now come from txdav/common/datastore/test/accounts/*xml; also ServersDB is not a global, but instead lives in the directory service.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServertrunkcalendarservertapcaldavpy">CalendarServer/trunk/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_gatewaypy">CalendarServer/trunk/calendarserver/tools/test/test_gateway.py</a></li>
<li><a href="#CalendarServertrunkcalendarservertoolstesttest_resourcespy">CalendarServer/trunk/calendarserver/tools/test/test_resources.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavstdconfigpy">CalendarServer/trunk/twistedcaldav/stdconfig.py</a></li>
<li><a href="#CalendarServertrunktwistedcaldavtestutilpy">CalendarServer/trunk/twistedcaldav/test/util.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingcaldavtesttest_schedulerpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingimiptesttest_inboundpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischedulelocalserverspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischeduleschedulerpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischeduletesttest_localserverspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingischeduletesttest_resourcepy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_cuaddresspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_cuaddress.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_freebusypy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_freebusy.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_implicitpy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_utilspy">CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_utils.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretesttest_attachmentspy">CalendarServer/trunk/txdav/caldav/datastore/test/test_attachments.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretesttest_filepy">CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretesttest_implicitpy">CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretesttest_sqlpy">CalendarServer/trunk/txdav/caldav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretesttest_sql_sharingpy">CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretesttest_utilpy">CalendarServer/trunk/txdav/caldav/datastore/test/test_util.py</a></li>
<li><a href="#CalendarServertrunktxdavcaldavdatastoretestutilpy">CalendarServer/trunk/txdav/caldav/datastore/test/util.py</a></li>
<li><a href="#CalendarServertrunktxdavcarddavdatastoretestcommonpy">CalendarServer/trunk/txdav/carddav/datastore/test/common.py</a></li>
<li><a href="#CalendarServertrunktxdavcarddavdatastoretesttest_filepy">CalendarServer/trunk/txdav/carddav/datastore/test/test_file.py</a></li>
<li><a href="#CalendarServertrunktxdavcarddavdatastoretesttest_sqlpy">CalendarServer/trunk/txdav/carddav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServertrunktxdavcarddavdatastoretesttest_sql_sharingpy">CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastorepoddingresourcepy">CalendarServer/trunk/txdav/common/datastore/podding/resource.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastorepoddingtesttest_conduitpy">CalendarServer/trunk/txdav/common/datastore/podding/test/test_conduit.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastorepoddingtesttest_external_homepy">CalendarServer/trunk/txdav/common/datastore/podding/test/test_external_home.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastorepoddingtesttest_resourcepy">CalendarServer/trunk/txdav/common/datastore/podding/test/test_resource.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastorepoddingtestutilpy">CalendarServer/trunk/txdav/common/datastore/podding/test/util.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoretesttest_sqlpy">CalendarServer/trunk/txdav/common/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoretestutilpy">CalendarServer/trunk/txdav/common/datastore/test/util.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoreupgradetesttest_migratepy">CalendarServer/trunk/txdav/common/datastore/upgrade/test/test_migrate.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoreworktesttest_inbox_cleanuppy">CalendarServer/trunk/txdav/common/datastore/work/test/test_inbox_cleanup.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoreworktesttest_revision_cleanuppy">CalendarServer/trunk/txdav/common/datastore/work/test/test_revision_cleanup.py</a></li>
<li><a href="#CalendarServertrunktxdavdpstesttest_clientpy">CalendarServer/trunk/txdav/dps/test/test_client.py</a></li>
<li><a href="#CalendarServertrunktxdavwhodirectorypy">CalendarServer/trunk/txdav/who/directory.py</a></li>
<li><a href="#CalendarServertrunktxdavwhotesttest_group_attendeespy">CalendarServer/trunk/txdav/who/test/test_group_attendees.py</a></li>
<li><a href="#CalendarServertrunktxdavwhotesttest_utilpy">CalendarServer/trunk/txdav/who/test/test_util.py</a></li>
<li><a href="#CalendarServertrunktxdavwhoutilpy">CalendarServer/trunk/txdav/who/util.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>CalendarServer/trunk/txdav/common/datastore/test/accounts/</li>
<li><a href="#CalendarServertrunktxdavcommondatastoretestaccountsaccountsxml">CalendarServer/trunk/txdav/common/datastore/test/accounts/accounts.xml</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoretestaccountsaugmentsxml">CalendarServer/trunk/txdav/common/datastore/test/accounts/augments.xml</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoretestaccountsgenerate_test_accountspy">CalendarServer/trunk/txdav/common/datastore/test/accounts/generate_test_accounts.py</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoretestaccountsproxiesxml">CalendarServer/trunk/txdav/common/datastore/test/accounts/proxies.xml</a></li>
<li><a href="#CalendarServertrunktxdavcommondatastoretestaccountsresourcesxml">CalendarServer/trunk/txdav/common/datastore/test/accounts/resources.xml</a></li>
<li><a href="#CalendarServertrunktxdavwhotestsupportpy">CalendarServer/trunk/txdav/who/test/support.py</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestaccountsxml">CalendarServer/trunk/twistedcaldav/directory/test/accounts.xml</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestaugmentsxml">CalendarServer/trunk/twistedcaldav/directory/test/augments.xml</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestproxiesxml">CalendarServer/trunk/twistedcaldav/directory/test/proxies.xml</a></li>
<li><a href="#CalendarServertrunktwistedcaldavdirectorytestresourcesxml">CalendarServer/trunk/twistedcaldav/directory/test/resources.xml</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServertrunkcalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tap/caldav.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tap/caldav.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/calendarserver/tap/caldav.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -79,6 +79,9 @@
</span><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.scheduling.imip.inbound import MailRetriever
</span><span class="cx"> from txdav.caldav.datastore.scheduling.imip.inbound import scheduleNextMailPoll
</span><ins>+from txdav.caldav.datastore.scheduling.ischedule.localservers import (
+    buildServersDB
+)
</ins><span class="cx"> from txdav.common.datastore.upgrade.migrate import UpgradeToDatabaseStep
</span><span class="cx"> from txdav.common.datastore.upgrade.sql.upgrade import (
</span><span class="cx">     UpgradeDatabaseCalendarDataStep, UpgradeDatabaseOtherStep,
</span><span class="lines">@@ -126,7 +129,6 @@
</span><span class="cx"> )
</span><span class="cx"> from twisted.application.strports import service as strPortsService
</span><span class="cx"> from txdav.dps.server import DirectoryProxyAMPFactory
</span><del>-
</del><span class="cx"> try:
</span><span class="cx">     from calendarserver.version import version
</span><span class="cx"> except ImportError:
</span><span class="lines">@@ -870,6 +872,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         pool, txnFactory = getDBPool(config)
</span><span class="cx">         directory = DirectoryProxyClientService(config.DirectoryRealmName)
</span><ins>+        if config.Servers.Enabled:
+            directory.setServersDB(buildServersDB(config.Servers.MaxClients))
</ins><span class="cx">         store = storeFromConfig(config, txnFactory, directory)
</span><span class="cx">         logObserver = AMPCommonAccessLoggingObserver()
</span><span class="cx">         result = self.requestProcessingService(options, store, logObserver)
</span><span class="lines">@@ -1478,7 +1482,15 @@
</span><span class="cx">                     # FIXME: right now the store passed *to* the directory is the
</span><span class="cx">                     # calendar/contacts data store, but for a multi-server deployment
</span><span class="cx">                     # it will need its own separate store.
</span><del>-                    store.setDirectoryService(directoryFromConfig(config, store=store))
</del><ins>+                    if config.Servers.Enabled:
+                        serversDB = buildServersDB(config.Servers.MaxClients)
+                    else:
+                        serversDB = None
+                    store.setDirectoryService(
+                        directoryFromConfig(
+                            config, store=store, serversDB=serversDB
+                        )
+                    )
</ins><span class="cx"> 
</span><span class="cx">                 pps = PreProcessingService(
</span><span class="cx">                     createMainService, cp, store, logObserver, storageService
</span><span class="lines">@@ -1897,6 +1909,8 @@
</span><span class="cx">             directory = DirectoryProxyClientService(
</span><span class="cx">                 config.DirectoryRealmName
</span><span class="cx">             )
</span><ins>+            if config.Servers.Enabled:
+                directory.setServersDB(buildServersDB(config.Servers.MaxClients))
</ins><span class="cx">         else:
</span><span class="cx">             # If the master is to act as the DPS server:
</span><span class="cx">             directory = None
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_gatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_gateway.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_gateway.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/calendarserver/tools/test/test_gateway.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -17,26 +17,30 @@
</span><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> from plistlib import readPlistFromString
</span><ins>+import plistlib
</ins><span class="cx"> import xml
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, Deferred, returnValue
</span><del>-
</del><ins>+from twisted.trial.unittest import TestCase
+from twistedcaldav import memcacher
</ins><span class="cx"> from twistedcaldav.config import config
</span><del>-from twistedcaldav.test.util import StoreTestCase, CapturingProcessProtocol
-import plistlib
</del><span class="cx"> from twistedcaldav.memcacheclient import ClientFactory
</span><del>-from twistedcaldav import memcacher
</del><ins>+from twistedcaldav.test.util import CapturingProcessProtocol
+from txdav.common.datastore.test.util import (
+    theStoreBuilder, StubNotifierFactory
+)
</ins><span class="cx"> from txdav.who.idirectory import AutoScheduleMode
</span><ins>+from txdav.who.util import directoryFromConfig
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-class RunCommandTestCase(StoreTestCase):
</del><span class="cx"> 
</span><del>-    def configure(self):
-        &quot;&quot;&quot;
-        Override the standard StoreTestCase configuration
-        &quot;&quot;&quot;
</del><ins>+class RunCommandTestCase(TestCase):
+
+    @inlineCallbacks
+    def setUp(self):
+
</ins><span class="cx">         self.serverRoot = self.mktemp()
</span><span class="cx">         os.mkdir(self.serverRoot)
</span><span class="cx">         absoluteServerRoot = os.path.abspath(self.serverRoot)
</span><span class="lines">@@ -62,7 +66,6 @@
</span><span class="cx">             os.makedirs(runRoot)
</span><span class="cx"> 
</span><span class="cx">         config.reset()
</span><del>-        self.configInit()
</del><span class="cx"> 
</span><span class="cx">         testRoot = os.path.join(os.path.dirname(__file__), &quot;gateway&quot;)
</span><span class="cx">         templateName = os.path.join(testRoot, &quot;caldavd.plist&quot;)
</span><span class="lines">@@ -134,11 +137,9 @@
</span><span class="cx">         copyAugmentFile = FilePath(os.path.join(config.DataRoot, &quot;augments.xml&quot;))
</span><span class="cx">         origAugmentFile.copyTo(copyAugmentFile)
</span><span class="cx"> 
</span><del>-        # # Make sure trial puts the reactor in the right state, by letting it
-        # # run one reactor iteration.  (Ignore me, please.)
-        # d = Deferred()
-        # reactor.callLater(0, d.callback, True)
-        # return d
</del><ins>+        self.notifierFactory = StubNotifierFactory()
+        self.store = yield theStoreBuilder.buildStore(self, self.notifierFactory)
+        self.directory = directoryFromConfig(config, self.store)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span></span></pre></div>
<a id="CalendarServertrunkcalendarservertoolstesttest_resourcespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/tools/test/test_resources.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/tools/test/test_resources.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/calendarserver/tools/test/test_resources.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from calendarserver.tools.resources import migrateResources
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase
</span><del>-from txdav.who.util import InMemoryDirectoryService
</del><ins>+from txdav.who.test.support import InMemoryDirectoryService
</ins><span class="cx"> from twext.who.directory import DirectoryRecord
</span><span class="cx"> from txdav.who.idirectory import RecordType as CalRecordType
</span><span class="cx"> from txdav.who.directory import CalendarDirectoryRecordMixin
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestaccountsxml"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/twistedcaldav/directory/test/accounts.xml (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/accounts.xml        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/twistedcaldav/directory/test/accounts.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -1,389 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
-
-&lt;!--
-Copyright (c) 2006-2014 Apple Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- --&gt;
-
-&lt;!DOCTYPE accounts SYSTEM &quot;../../../conf/auth/accounts.dtd&quot;&gt;
-&lt;directory realm=&quot;Test&quot;&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;D11F03A0-97EA-48AF-9A6C-FAC7F3975766&lt;/uid&gt;
-    &lt;short-name&gt;admin&lt;/short-name&gt;
-    &lt;password&gt;nimda&lt;/password&gt;
-    &lt;full-name&gt;Administrators&lt;/full-name&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
-    &lt;guid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/guid&gt;
-    &lt;short-name&gt;wsanchez&lt;/short-name&gt;
-    &lt;password&gt;zehcnasw&lt;/password&gt;
-    &lt;full-name&gt;Wilfredo Sanchez&lt;/full-name&gt;
-    &lt;email&gt;wsanchez@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
-    &lt;guid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/guid&gt;
-    &lt;short-name&gt;cdaboo&lt;/short-name&gt;
-    &lt;password&gt;oobadc&lt;/password&gt;
-    &lt;full-name&gt;Cyrus Daboo&lt;/full-name&gt;
-    &lt;email&gt;cdaboo@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/uid&gt;
-    &lt;short-name&gt;lecroy&lt;/short-name&gt;
-    &lt;password&gt;yorcel&lt;/password&gt;
-    &lt;full-name&gt;Chris Lecroy&lt;/full-name&gt;
-    &lt;email&gt;lecroy@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
-    &lt;short-name&gt;dreid&lt;/short-name&gt;
-    &lt;password&gt;dierd&lt;/password&gt;
-    &lt;full-name&gt;David Reid&lt;/full-name&gt;
-    &lt;email&gt;dreid@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;8E04787E-336D-41ED-A70B-D233AD0DCE6F&lt;/uid&gt;
-    &lt;guid&gt;8E04787E-336D-41ED-A70B-D233AD0DCE6F&lt;/guid&gt;
-    &lt;short-name&gt;doublequotes&lt;/short-name&gt;
-    &lt;password&gt;setouqelbuod&lt;/password&gt;
-    &lt;full-name&gt;Double &quot;quotey&quot; Quotes&lt;/full-name&gt;
-    &lt;email&gt;doublequotes@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;37DB0C90-4DB1-4932-BC69-3DAB66F374F5&lt;/uid&gt;
-    &lt;guid&gt;37DB0C90-4DB1-4932-BC69-3DAB66F374F5&lt;/guid&gt;
-    &lt;short-name&gt;purgeuser&lt;/short-name&gt;
-    &lt;password&gt;purgeuser&lt;/password&gt;
-    &lt;full-name&gt;Purge User&lt;/full-name&gt;
-    &lt;email&gt;purgeuser@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;home1&lt;/uid&gt;
-    &lt;short-name&gt;home1&lt;/short-name&gt;
-    &lt;password&gt;home1&lt;/password&gt;
-    &lt;full-name&gt;Home One&lt;/full-name&gt;
-    &lt;email&gt;home1@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;home2&lt;/uid&gt;
-    &lt;short-name&gt;home2&lt;/short-name&gt;
-    &lt;password&gt;home2&lt;/password&gt;
-    &lt;full-name&gt;Home Two&lt;/full-name&gt;
-    &lt;email&gt;home2@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;543D28BA-F74F-4D5F-9243-B3E3A61171E5&lt;/uid&gt;
-    &lt;short-name&gt;nocalendar&lt;/short-name&gt;
-    &lt;password&gt;radnelacon&lt;/password&gt;
-    &lt;full-name&gt;No Calendar&lt;/full-name&gt;
-    &lt;email&gt;nocalendar@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;7423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
-    &lt;short-name&gt;usera&lt;/short-name&gt;
-    &lt;password&gt;a&lt;/password&gt;
-    &lt;full-name&gt;a&lt;/full-name&gt;
-    &lt;email&gt;a@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;8A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
-    &lt;short-name&gt;userb&lt;/short-name&gt;
-    &lt;password&gt;b&lt;/password&gt;
-    &lt;full-name&gt;b&lt;/full-name&gt;
-    &lt;email&gt;b@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD2&lt;/uid&gt;
-    &lt;short-name&gt;userc&lt;/short-name&gt;
-    &lt;password&gt;c&lt;/password&gt;
-    &lt;full-name&gt;c&lt;/full-name&gt;
-    &lt;email&gt;c@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;9E1FFAC4-3CCD-45A1-8272-D161C92D2EEE&lt;/uid&gt;
-    &lt;short-name&gt;usercalonly&lt;/short-name&gt;
-    &lt;password&gt;a&lt;/password&gt;
-    &lt;full-name&gt;a calonly&lt;/full-name&gt;
-    &lt;email&gt;a-calonly@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;7678EC8A-A069-4E82-9066-7279C6718507&lt;/uid&gt;
-    &lt;short-name&gt;useradbkonly&lt;/short-name&gt;
-    &lt;password&gt;a&lt;/password&gt;
-    &lt;full-name&gt;a adbkonly&lt;/full-name&gt;
-    &lt;email&gt;a-adbkonly@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;320B73A1-46E2-4180-9563-782DFDBE1F63&lt;/uid&gt;
-    &lt;short-name&gt;nonascii&lt;/short-name&gt;
-    &lt;short-name&gt;nonascii佐藤&lt;/short-name&gt;
-    &lt;password&gt;a&lt;/password&gt;
-    &lt;full-name&gt;佐藤佐藤佐藤&lt;/full-name&gt;
-    &lt;email&gt;nonascii@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;FC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
-    &lt;short-name&gt;delegator&lt;/short-name&gt;
-    &lt;password&gt;a&lt;/password&gt;
-    &lt;full-name&gt;Calendar Delegator&lt;/full-name&gt;
-    &lt;email&gt;calendardelegator@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;EC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
-    &lt;short-name&gt;occasionaldelegate&lt;/short-name&gt;
-    &lt;password&gt;a&lt;/password&gt;
-    &lt;full-name&gt;Occasional Delegate&lt;/full-name&gt;
-    &lt;email&gt;occasional@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;46D9D716-CBEE-490F-907A-66FA6C3767FF&lt;/uid&gt;
-    &lt;short-name&gt;delegateviagroup&lt;/short-name&gt;
-    &lt;password&gt;a&lt;/password&gt;
-    &lt;full-name&gt;Delegate Via Group&lt;/full-name&gt;
-    &lt;email&gt;delegateviagroup@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;00599DAF-3E75-42DD-9DB7-52617E79943F&lt;/uid&gt;
-    &lt;short-name&gt;delegategroup&lt;/short-name&gt;
-    &lt;full-name&gt;Delegate Group&lt;/full-name&gt;
-    &lt;member-uid&gt;46D9D716-CBEE-490F-907A-66FA6C3767FF&lt;/member-uid&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;user01&lt;/uid&gt;
-    &lt;short-name&gt;user01&lt;/short-name&gt;
-    &lt;password&gt;user01&lt;/password&gt;
-    &lt;full-name&gt;User 01&lt;/full-name&gt;
-    &lt;email&gt;user01@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;user02&lt;/uid&gt;
-    &lt;short-name&gt;user02&lt;/short-name&gt;
-    &lt;password&gt;user02&lt;/password&gt;
-    &lt;full-name&gt;User 02&lt;/full-name&gt;
-    &lt;email&gt;user02@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;user03&lt;/uid&gt;
-    &lt;short-name&gt;user03&lt;/short-name&gt;
-    &lt;password&gt;user03&lt;/password&gt;
-    &lt;full-name&gt;User 03&lt;/full-name&gt;
-    &lt;email&gt;user03@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;user04&lt;/uid&gt;
-    &lt;short-name&gt;user04&lt;/short-name&gt;
-    &lt;password&gt;user04&lt;/password&gt;
-    &lt;full-name&gt;User 04&lt;/full-name&gt;
-    &lt;email&gt;user04@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;user05&lt;/uid&gt;
-    &lt;short-name&gt;user05&lt;/short-name&gt;
-    &lt;password&gt;user05&lt;/password&gt;
-    &lt;full-name&gt;User 05&lt;/full-name&gt;
-    &lt;email&gt;user05@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;user06&lt;/uid&gt;
-    &lt;short-name&gt;user06&lt;/short-name&gt;
-    &lt;password&gt;user06&lt;/password&gt;
-    &lt;full-name&gt;User 06&lt;/full-name&gt;
-    &lt;email&gt;user06@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;__wsanchez1__&lt;/uid&gt;
-    &lt;short-name&gt;wsanchez1&lt;/short-name&gt;
-    &lt;short-name&gt;wilfredo_sanchez&lt;/short-name&gt;
-    &lt;password&gt;zehcnasw&lt;/password&gt;
-    &lt;full-name&gt;Wilfredo Sanchez&lt;/full-name&gt;
-    &lt;email&gt;wsanchez@bitbucket.calendarserver.org&lt;/email&gt;
-    &lt;email&gt;wsanchez@devnull.twistedmatrix.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;__glyph1__&lt;/uid&gt;
-    &lt;short-name&gt;glyph1&lt;/short-name&gt;
-    &lt;password&gt;hpylg&lt;/password&gt;
-    &lt;full-name&gt;Glyph Lefkowitz&lt;/full-name&gt;
-    &lt;email&gt;glyph@bitbucket.calendarserver.org&lt;/email&gt;
-    &lt;email&gt;glyph@devnull.twistedmatrix.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;__sagen1__&lt;/uid&gt;
-    &lt;short-name&gt;sagen&lt;/short-name&gt;
-    &lt;short-name&gt;sagen1&lt;/short-name&gt;
-    &lt;password&gt;negas&lt;/password&gt;
-    &lt;full-name&gt;Morgen Sagen&lt;/full-name&gt;
-    &lt;email&gt;sagen@bitbucket.calendarserver.org&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;__cdaboo1__&lt;/uid&gt;
-    &lt;short-name&gt;cdaboo1&lt;/short-name&gt;
-    &lt;password&gt;suryc&lt;/password&gt;
-    &lt;full-name&gt;Cyrus Daboo&lt;/full-name&gt;
-    &lt;email&gt;cdaboo@bitbucket.calendarserver.org&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;__dre1__&lt;/uid&gt;
-    &lt;short-name&gt;dre1&lt;/short-name&gt;
-    &lt;short-name&gt;dre&lt;/short-name&gt;
-    &lt;password&gt;erd&lt;/password&gt;
-    &lt;full-name&gt;Andre LaBranche&lt;/full-name&gt;
-    &lt;email&gt;dre@bitbucket.calendarserver.org&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;__top_group_1__&lt;/uid&gt;
-    &lt;short-name&gt;top-group-1&lt;/short-name&gt;
-    &lt;full-name&gt;Top Group 1&lt;/full-name&gt;
-    &lt;email&gt;topgroup1@example.com&lt;/email&gt;
-    &lt;member-uid&gt;__wsanchez1__&lt;/member-uid&gt;
-    &lt;member-uid&gt;__glyph1__&lt;/member-uid&gt;
-    &lt;member-uid&gt;__sub_group_1__&lt;/member-uid&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;__sub_group_1__&lt;/uid&gt;
-    &lt;short-name&gt;sub-group-1&lt;/short-name&gt;
-    &lt;full-name&gt;Sub Group 1&lt;/full-name&gt;
-    &lt;email&gt;subgroup1@example.com&lt;/email&gt;
-    &lt;member-uid&gt;__sagen1__&lt;/member-uid&gt;
-    &lt;member-uid&gt;__cdaboo1__&lt;/member-uid&gt;
-  &lt;/record&gt;
-
-
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
-    &lt;short-name&gt;managers&lt;/short-name&gt;
-    &lt;password&gt;managers&lt;/password&gt;
-    &lt;full-name&gt;Managers&lt;/full-name&gt;
-      &lt;member-uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;admin&lt;/uid&gt;
-    &lt;short-name&gt;admin&lt;/short-name&gt;
-    &lt;password&gt;admin&lt;/password&gt;
-    &lt;full-name&gt;Administrators&lt;/full-name&gt;
-      &lt;member-uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;grunts&lt;/uid&gt;
-    &lt;short-name&gt;grunts&lt;/short-name&gt;
-    &lt;password&gt;grunts&lt;/password&gt;
-    &lt;full-name&gt;We do all the work&lt;/full-name&gt;
-      &lt;member-uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member-uid&gt;
-      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
-      &lt;member-uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;right_coast&lt;/uid&gt;
-    &lt;short-name&gt;right_coast&lt;/short-name&gt;
-    &lt;password&gt;right_coast&lt;/password&gt;
-    &lt;full-name&gt;East Coast&lt;/full-name&gt;
-      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;left_coast&lt;/uid&gt;
-    &lt;short-name&gt;left_coast&lt;/short-name&gt;
-    &lt;password&gt;left_coast&lt;/password&gt;
-    &lt;full-name&gt;West Coast&lt;/full-name&gt;
-      &lt;member-uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member-uid&gt;
-      &lt;member-uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/member-uid&gt;
-      &lt;member-uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;both_coasts&lt;/uid&gt;
-    &lt;short-name&gt;both_coasts&lt;/short-name&gt;
-    &lt;password&gt;both_coasts&lt;/password&gt;
-    &lt;full-name&gt;Both Coasts&lt;/full-name&gt;
-      &lt;member-uid&gt;right_coast&lt;/member-uid&gt;
-      &lt;member-uid&gt;left_coast&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;recursive1_coasts&lt;/uid&gt;
-    &lt;short-name&gt;recursive1_coasts&lt;/short-name&gt;
-    &lt;password&gt;recursive1_coasts&lt;/password&gt;
-    &lt;full-name&gt;Recursive1 Coasts&lt;/full-name&gt;
-      &lt;member-uid&gt;recursive2_coasts&lt;/member-uid&gt;
-      &lt;member-uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;recursive2_coasts&lt;/uid&gt;
-    &lt;short-name&gt;recursive2_coasts&lt;/short-name&gt;
-    &lt;password&gt;recursive2_coasts&lt;/password&gt;
-    &lt;full-name&gt;Recursive2 Coasts&lt;/full-name&gt;
-      &lt;member-uid&gt;recursive1_coasts&lt;/member-uid&gt;
-      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;group&quot;&gt;
-    &lt;uid&gt;non_calendar_group&lt;/uid&gt;
-    &lt;short-name&gt;non_calendar_group&lt;/short-name&gt;
-    &lt;password&gt;non_calendar_group&lt;/password&gt;
-    &lt;full-name&gt;Non-calendar group&lt;/full-name&gt;
-      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
-      &lt;member-uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/member-uid&gt;
-  &lt;/record&gt;
-
-  &lt;!-- Calverify test records --&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&lt;/uid&gt;
-    &lt;guid&gt;D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&lt;/guid&gt;
-    &lt;short-name&gt;example1&lt;/short-name&gt;
-    &lt;password&gt;example&lt;/password&gt;
-    &lt;full-name&gt;Example User1&lt;/full-name&gt;
-    &lt;email&gt;example1@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;47B16BB4-DB5F-4BF6-85FE-A7DA54230F92&lt;/uid&gt;
-    &lt;guid&gt;47B16BB4-DB5F-4BF6-85FE-A7DA54230F92&lt;/guid&gt;
-    &lt;short-name&gt;example2&lt;/short-name&gt;
-    &lt;password&gt;example&lt;/password&gt;
-    &lt;full-name&gt;Example User2&lt;/full-name&gt;
-    &lt;email&gt;example2@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;AC478592-7783-44D1-B2AE-52359B4E8415&lt;/uid&gt;
-    &lt;guid&gt;AC478592-7783-44D1-B2AE-52359B4E8415&lt;/guid&gt;
-    &lt;short-name&gt;example3&lt;/short-name&gt;
-    &lt;password&gt;example&lt;/password&gt;
-    &lt;full-name&gt;Example User3&lt;/full-name&gt;
-    &lt;email&gt;example3@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-  &lt;record type=&quot;user&quot;&gt;
-    &lt;uid&gt;A89E3A97-1658-4E45-A185-479F3E49D446&lt;/uid&gt;
-    &lt;guid&gt;A89E3A97-1658-4E45-A185-479F3E49D446&lt;/guid&gt;
-    &lt;short-name&gt;example4&lt;/short-name&gt;
-    &lt;password&gt;example&lt;/password&gt;
-    &lt;full-name&gt;Example User4&lt;/full-name&gt;
-    &lt;email&gt;example4@example.com&lt;/email&gt;
-  &lt;/record&gt;
-
-&lt;/directory&gt;
</del></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestaugmentsxml"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/twistedcaldav/directory/test/augments.xml (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/augments.xml        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/twistedcaldav/directory/test/augments.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -1,187 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
-
-&lt;!--
-Copyright (c) 2009-2014 Apple Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- --&gt;
-
-&lt;!DOCTYPE augments SYSTEM &quot;../../../conf/auth/augments.dtd&quot;&gt;
-
-&lt;augments&gt;
-  &lt;!--
-  &lt;record&gt;
-    &lt;uid&gt;Location-Default&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-    &lt;auto-schedule-mode&gt;automatic&lt;/auto-schedule-mode&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;Resource-Default&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-    &lt;auto-schedule-mode&gt;automatic&lt;/auto-schedule-mode&gt;
-  &lt;/record&gt;
-  --&gt;
-
-  &lt;record&gt;
-    &lt;uid&gt;D11F03A0-97EA-48AF-9A6C-FAC7F3975766&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
-    &lt;server-id&gt;00001&lt;/server-id&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
-    &lt;server-id&gt;00002&lt;/server-id&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;543D28BA-F74F-4D5F-9243-B3E3A61171E5&lt;/uid&gt;
-    &lt;enable-calendar&gt;false&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;false&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;user01&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;user02&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;user03&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;user04&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;user05&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;user06&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;right_coast&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;left_coast&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;mercury&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;gemini&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;apollo&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-    &lt;auto-accept-group&gt;both_coasts&lt;/auto-accept-group&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;orion&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;transporter&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;ftlcpu&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;!--
-  &lt;record&gt;
-    &lt;uid&gt;non_calendar_proxy&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
---&gt;
-  &lt;record&gt;
-    &lt;uid&gt;7423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;8A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD2&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;9E1FFAC4-3CCD-45A1-8272-D161C92D2EEE&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;7678EC8A-A069-4E82-9066-7279C6718507&lt;/uid&gt;
-    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;FC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;EC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;enable-login&gt;true&lt;/enable-login&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;00599DAF-3E75-42DD-9DB7-52617E79943F&lt;/uid&gt;
-    &lt;enable-calendar&gt;false&lt;/enable-calendar&gt;
-    &lt;enable-login&gt;false&lt;/enable-login&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;uid&gt;75EA36BE-F71B-40F9-81F9-CF59BF40CA8F&lt;/uid&gt;
-    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
-    &lt;auto-schedule-mode&gt;automatic&lt;/auto-schedule-mode&gt;
-  &lt;/record&gt;
-
-&lt;/augments&gt;
</del></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestproxiesxml"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/twistedcaldav/directory/test/proxies.xml (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/proxies.xml        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/twistedcaldav/directory/test/proxies.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -1,69 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
-
-&lt;!--
-Copyright (c) 2006-2014 Apple Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- --&gt;
-
-&lt;!DOCTYPE proxies SYSTEM &quot;../../../conf/auth/proxies.dtd&quot;&gt;
-
-&lt;proxies&gt;
-  &lt;record&gt;
-    &lt;guid&gt;mercury&lt;/guid&gt;
-    &lt;write-proxies&gt;
-      &lt;member&gt;left_coast&lt;/member&gt;
-    &lt;/write-proxies&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;guid&gt;gemini&lt;/guid&gt;
-    &lt;write-proxies&gt;
-      &lt;member&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member&gt;
-    &lt;/write-proxies&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;guid&gt;apollo&lt;/guid&gt;
-    &lt;write-proxies&gt;
-      &lt;member&gt;both_coasts&lt;/member&gt;
-    &lt;/write-proxies&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;guid&gt;orion&lt;/guid&gt;
-    &lt;write-proxies&gt;
-      &lt;member&gt;recursive1_coasts&lt;/member&gt;
-    &lt;/write-proxies&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;guid&gt;non_calendar_proxy&lt;/guid&gt;
-    &lt;write-proxies&gt;
-      &lt;member&gt;non_calendar_group&lt;/member&gt;
-    &lt;/write-proxies&gt;
-    &lt;read-proxies&gt;
-      &lt;member&gt;recursive2_coasts&lt;/member&gt;
-    &lt;/read-proxies&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;guid&gt;7423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/guid&gt;
-    &lt;write-proxies&gt;
-      &lt;member&gt;8A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member&gt;
-      &lt;member&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD2&lt;/member&gt;
-    &lt;/write-proxies&gt;
-  &lt;/record&gt;
-  &lt;record&gt;
-    &lt;guid&gt;FC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/guid&gt;
-    &lt;write-proxies&gt;
-      &lt;member&gt;EC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/member&gt;
-      &lt;member&gt;00599DAF-3E75-42DD-9DB7-52617E79943F&lt;/member&gt;
-    &lt;/write-proxies&gt;
-  &lt;/record&gt;
-&lt;/proxies&gt;
</del></span></pre></div>
<a id="CalendarServertrunktwistedcaldavdirectorytestresourcesxml"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/twistedcaldav/directory/test/resources.xml (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/directory/test/resources.xml        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/twistedcaldav/directory/test/resources.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -1,120 +0,0 @@
</span><del>-&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
-
-&lt;!--
-Copyright (c) 2006-2014 Apple Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- --&gt;
-
-&lt;!DOCTYPE accounts SYSTEM &quot;../../../conf/auth/accounts.dtd&quot;&gt;
-
-&lt;directory realm=&quot;Test&quot;&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;mercury&lt;/uid&gt;
-    &lt;short-name&gt;mercury&lt;/short-name&gt;
-    &lt;password&gt;mercury&lt;/password&gt;
-    &lt;full-name&gt;Mercury Seven&lt;/full-name&gt;
-    &lt;email&gt;mercury@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;gemini&lt;/uid&gt;
-    &lt;short-name&gt;gemini&lt;/short-name&gt;
-    &lt;password&gt;gemini&lt;/password&gt;
-    &lt;full-name&gt;Gemini Twelve&lt;/full-name&gt;
-    &lt;email&gt;gemini@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;apollo&lt;/uid&gt;
-    &lt;short-name&gt;apollo&lt;/short-name&gt;
-    &lt;password&gt;apollo&lt;/password&gt;
-    &lt;full-name&gt;Apollo Eleven&lt;/full-name&gt;
-    &lt;email&gt;apollo@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;orion&lt;/uid&gt;
-    &lt;short-name&gt;orion&lt;/short-name&gt;
-    &lt;password&gt;orion&lt;/password&gt;
-    &lt;full-name&gt;Orion&lt;/full-name&gt;
-    &lt;email&gt;orion@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;resource&quot;&gt;
-    &lt;uid&gt;transporter&lt;/uid&gt;
-    &lt;short-name&gt;transporter&lt;/short-name&gt;
-    &lt;password&gt;transporter&lt;/password&gt;
-    &lt;full-name&gt;Mass Transporter&lt;/full-name&gt;
-    &lt;email&gt;transporter@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;resource&quot;&gt;
-    &lt;uid&gt;ftlcpu&lt;/uid&gt;
-    &lt;short-name&gt;ftlcpu&lt;/short-name&gt;
-    &lt;password&gt;ftlcpu&lt;/password&gt;
-    &lt;full-name&gt;Faster-Than-Light Microprocessor&lt;/full-name&gt;
-    &lt;email&gt;ftlcpu@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;resource&quot;&gt;
-    &lt;uid&gt;non_calendar_proxy&lt;/uid&gt;
-    &lt;short-name&gt;non_calendar_proxy&lt;/short-name&gt;
-    &lt;password&gt;non_calendar_proxy&lt;/password&gt;
-    &lt;full-name&gt;Non-calendar proxy&lt;/full-name&gt;
-    &lt;email&gt;non_calendar_proxy@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;resource&quot;&gt;
-    &lt;uid&gt;disabled&lt;/uid&gt;
-    &lt;short-name&gt;disabled&lt;/short-name&gt;
-    &lt;password&gt;disabled&lt;/password&gt;
-    &lt;full-name&gt;Disabled Record&lt;/full-name&gt;
-    &lt;email&gt;disabled@example.com&lt;/email&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;__sanchezoffice__&lt;/uid&gt;
-    &lt;short-name&gt;sanchezoffice&lt;/short-name&gt;
-    &lt;full-name&gt;Sanchez Office&lt;/full-name&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;75EA36BE-F71B-40F9-81F9-CF59BF40CA8F&lt;/uid&gt;
-    &lt;guid&gt;75EA36BE-F71B-40F9-81F9-CF59BF40CA8F&lt;/guid&gt;
-    &lt;short-name&gt;location01&lt;/short-name&gt;
-    &lt;password&gt;location01&lt;/password&gt;
-    &lt;full-name&gt;Room 01&lt;/full-name&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;room-addr-1&lt;/uid&gt;
-    &lt;guid&gt;634A102B-6902-464F-9451-8A86A31628C1&lt;/guid&gt;
-    &lt;short-name&gt;room-with-address-1&lt;/short-name&gt;
-    &lt;password&gt;room-addr-2&lt;/password&gt;
-    &lt;full-name&gt;Room with Address 1&lt;/full-name&gt;
-    &lt;associated-address&gt;1-infinite-loop&lt;/associated-address&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;location&quot;&gt;
-    &lt;uid&gt;room-addr-2&lt;/uid&gt;
-    &lt;short-name&gt;room-with-address-2&lt;/short-name&gt;
-    &lt;password&gt;room-addr-2&lt;/password&gt;
-    &lt;full-name&gt;Room with Address 2&lt;/full-name&gt;
-    &lt;associated-address&gt;2-infinite-loop&lt;/associated-address&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;address&quot;&gt;
-    &lt;uid&gt;1-infinite-loop&lt;/uid&gt;
-    &lt;short-name&gt;il1&lt;/short-name&gt;
-    &lt;full-name&gt;One Infinite Loop&lt;/full-name&gt;
-    &lt;street-address&gt;1 Infinite Loop, Cupertino, CA 95014&lt;/street-address&gt;
-    &lt;geographic-location&gt;37.331741,-122.030333&lt;/geographic-location&gt;
-  &lt;/record&gt;
-  &lt;record type=&quot;address&quot;&gt;
-    &lt;uid&gt;2-infinite-loop&lt;/uid&gt;
-    &lt;short-name&gt;il2&lt;/short-name&gt;
-    &lt;full-name&gt;Two Infinite Loop&lt;/full-name&gt;
-    &lt;street-address&gt;2 Infinite Loop, Cupertino, CA 95014&lt;/street-address&gt;
-    &lt;geographic-location&gt;37.332633,-122.030502&lt;/geographic-location&gt;
-  &lt;/record&gt;
-
-&lt;/directory&gt;
</del></span></pre></div>
<a id="CalendarServertrunktwistedcaldavstdconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/stdconfig.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/stdconfig.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/twistedcaldav/stdconfig.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -1651,18 +1651,6 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-def _updateServers(configDict, reloading=False):
-    from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
-    if configDict.Servers.Enabled:
-        Servers.load()
-        Servers.installReverseProxies(
-            configDict.Servers.MaxClients,
-        )
-    else:
-        Servers.clear()
-
-
-
</del><span class="cx"> def _updateCompliance(configDict, reloading=False):
</span><span class="cx"> 
</span><span class="cx">     if configDict.EnableCalDAV:
</span><span class="lines">@@ -1730,7 +1718,7 @@
</span><span class="cx">     _updateICalendar,
</span><span class="cx">     _updateScheduling,
</span><span class="cx">     _updateSharing,
</span><del>-    _updateServers,
</del><ins>+    # _updateServers,
</ins><span class="cx">     _updateCompliance,
</span><span class="cx">     )
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktwistedcaldavtestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/twistedcaldav/test/util.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/twistedcaldav/test/util.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/twistedcaldav/test/util.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -35,10 +35,8 @@
</span><span class="cx"> from twistedcaldav.directory.util import transactionFromRequest
</span><span class="cx"> from twistedcaldav.memcacheclient import ClientFactory
</span><span class="cx"> from twistedcaldav.stdconfig import config
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.common.datastore.file import CommonDataStore
</span><span class="cx"> from txdav.common.datastore.test.util import deriveQuota, CommonCommonTests
</span><del>-from txdav.who.util import directoryFromConfig
</del><span class="cx"> from txdav.xml import element as element
</span><span class="cx"> from txweb2.dav.test.util import SimpleRequest
</span><span class="cx"> import txweb2.dav.test.util
</span><span class="lines">@@ -110,22 +108,17 @@
</span><span class="cx"> 
</span><span class="cx"> class StoreTestCase(CommonCommonTests, txweb2.dav.test.util.TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    A base class for tests that use the SQL store.
</del><ins>+    A base class for tests that use the SQL store and need to create and
+    verify filesystem hierarchies.
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(StoreTestCase, self).setUp()
</span><span class="cx"> 
</span><del>-        self.configure()
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx"> 
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(
-            self, self.notifierFactory, None
-        )
-        self.directory = directoryFromConfig(config, self._sqlCalendarStore)
-        self._sqlCalendarStore.setDirectoryService(self.directory)
-
-        self.rootResource = getRootResource(config, self._sqlCalendarStore)
</del><ins>+        self.rootResource = getRootResource(config, self.store)
</ins><span class="cx">         self.actualRoot = self.rootResource.resource.resource
</span><span class="cx">         self.site = Site(self.actualRoot)
</span><span class="cx"> 
</span><span class="lines">@@ -136,37 +129,12 @@
</span><span class="cx">         return succeed(None)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Return a store for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     def configure(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Adjust the global configuration for this test.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        self.serverRoot = self.mktemp()
-        os.mkdir(self.serverRoot)
</del><ins>+        super(StoreTestCase, self).configure()
</ins><span class="cx"> 
</span><del>-        config.reset()
-        self.configInit()
-
-        config.ServerRoot = os.path.abspath(self.serverRoot)
-        config.ConfigRoot = &quot;config&quot;
-        config.LogRoot = &quot;logs&quot;
-        config.RunRoot = &quot;logs&quot;
-
-        if not os.path.exists(config.DataRoot):
-            os.makedirs(config.DataRoot)
-        if not os.path.exists(config.DocumentRoot):
-            os.makedirs(config.DocumentRoot)
-        if not os.path.exists(config.ConfigRoot):
-            os.makedirs(config.ConfigRoot)
-        if not os.path.exists(config.LogRoot):
-            os.makedirs(config.LogRoot)
-
</del><span class="cx">         config.Memcached.Pools.Default.ClientEnabled = False
</span><span class="cx">         config.Memcached.Pools.Default.ServerEnabled = False
</span><span class="cx">         ClientFactory.allowTestCache = True
</span><span class="lines">@@ -175,19 +143,7 @@
</span><span class="cx">         config.DirectoryAddressBook.Enabled = False
</span><span class="cx">         config.UsePackageTimezones = True
</span><span class="cx"> 
</span><del>-        accounts = FilePath(config.DataRoot).child(&quot;accounts.xml&quot;)
-        accounts.setContent(xmlFile.getContent())
</del><span class="cx"> 
</span><del>-        resources = FilePath(config.DataRoot).child(&quot;resources.xml&quot;)
-        resources.setContent(resourcesFile.getContent())
-
-        augments = FilePath(config.DataRoot).child(&quot;augments.xml&quot;)
-        augments.setContent(augmentsFile.getContent())
-
-        proxies = FilePath(config.DataRoot).child(&quot;proxies.xml&quot;)
-        proxies.setContent(proxiesFile.getContent())
-
-
</del><span class="cx">     def createHierarchy(self, structure, root=None):
</span><span class="cx">         if root is None:
</span><span class="cx">             root = os.path.abspath(self.mktemp())
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingcaldavtesttest_schedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/caldav/test/test_scheduler.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -23,10 +23,10 @@
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.ical import Component
</span><span class="cx"> 
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.common.datastore.test.util import CommonCommonTests, populateCalendarsFrom
</span><span class="cx"> from txdav.caldav.datastore.scheduling.caldav.scheduler import CalDAVScheduler
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> def normalizeiCalendarText(data):
</span><span class="cx">     data = data.replace(&quot;\r\n &quot;, &quot;&quot;)
</span><span class="cx">     data = [line for line in data.splitlines() if not (line.startswith(&quot;UID&quot;) or line.startswith(&quot;DTSTAMP&quot;))]
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(SchedulerFreeBusyRequest, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx">         self.now = DateTime.getNowUTC()
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingimiptesttest_inboundpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/imip/test/test_inbound.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -28,20 +28,19 @@
</span><span class="cx"> from txdav.caldav.datastore.scheduling.imip.inbound import shouldDeleteAllMail
</span><span class="cx"> from txdav.caldav.datastore.scheduling.imip.inbound import IMAP4DownloadProtocol
</span><span class="cx"> from txdav.caldav.datastore.scheduling.itip import iTIPRequestStatus
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><ins>+from txdav.common.datastore.test.util import CommonCommonTests
</ins><span class="cx"> 
</span><span class="cx"> import email
</span><span class="cx"> from twisted.trial import unittest
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class InboundTests(unittest.TestCase):
</del><ins>+class InboundTests(CommonCommonTests, unittest.TestCase):
</ins><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         super(InboundTests, self).setUp()
</span><span class="cx"> 
</span><del>-        self.store = yield buildCalendarStore(self, None)
-        self.directory = self.store.directoryService()
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         self.receiver = MailReceiver(self.store, self.directory)
</span><span class="cx">         self.retriever = MailRetriever(self.store, self.directory,
</span><span class="cx">             ConfigDict({
</span><span class="lines">@@ -283,7 +282,7 @@
</span><span class="cx"> DTSTAMP:20130208T120000Z
</span><span class="cx"> DTSTART:20180601T120000Z
</span><span class="cx"> DTEND:20180601T130000Z
</span><del>-ORGANIZER:urn:uuid:user01
</del><ins>+ORGANIZER:urn:x-uid:user01
</ins><span class="cx"> ATTENDEE:mailto:xyzzy@example.com;PARTSTAT=ACCEPTED
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -292,7 +291,7 @@
</span><span class="cx">         txn = self.store.newTransaction()
</span><span class="cx">         result = (yield injectMessage(
</span><span class="cx">                 txn,
</span><del>-                &quot;urn:uuid:user01&quot;,
</del><ins>+                &quot;urn:x-uid:user01&quot;,
</ins><span class="cx">                 &quot;mailto:xyzzy@example.com&quot;,
</span><span class="cx">                 calendar
</span><span class="cx">             )
</span><span class="lines">@@ -316,7 +315,7 @@
</span><span class="cx"> DTSTAMP:20130208T120000Z
</span><span class="cx"> DTSTART:20180601T120000Z
</span><span class="cx"> DTEND:20180601T130000Z
</span><del>-ORGANIZER:urn:uuid:unknown_user
</del><ins>+ORGANIZER:urn:x-uid:unknown_user
</ins><span class="cx"> ATTENDEE:mailto:xyzzy@example.com;PARTSTAT=ACCEPTED
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -325,7 +324,7 @@
</span><span class="cx">         txn = self.store.newTransaction()
</span><span class="cx">         result = (yield injectMessage(
</span><span class="cx">                 txn,
</span><del>-                &quot;urn:uuid:unknown_user&quot;,
</del><ins>+                &quot;urn:x-uid:unknown_user&quot;,
</ins><span class="cx">                 &quot;mailto:xyzzy@example.com&quot;,
</span><span class="cx">                 calendar
</span><span class="cx">             )
</span><span class="lines">@@ -349,14 +348,14 @@
</span><span class="cx"> DTSTAMP:20130208T120000Z
</span><span class="cx"> DTSTART:20180601T120000Z
</span><span class="cx"> DTEND:20180601T130000Z
</span><del>-ORGANIZER:urn:uuid:user01
</del><ins>+ORGANIZER:urn:x-uid:user01
</ins><span class="cx"> ATTENDEE:mailto:xyzzy@example.com;PARTSTAT=ACCEPTED
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx">         txn = self.store.newTransaction()
</span><span class="cx">         wp = (yield txn.enqueue(IMIPReplyWork,
</span><del>-            organizer=&quot;urn:uuid:user01&quot;,
</del><ins>+            organizer=&quot;urn:x-uid:user01&quot;,
</ins><span class="cx">             attendee=&quot;mailto:xyzzy@example.com&quot;,
</span><span class="cx">             icalendarText=calendar
</span><span class="cx">         ))
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischedulelocalserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/localservers.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> __all__ = [
</span><del>-    &quot;Servers&quot;,
</del><ins>+    &quot;buildServersDB&quot;,
</ins><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> log = Logger()
</span><span class="lines">@@ -122,10 +122,17 @@
</span><span class="cx">                 maxClients,
</span><span class="cx">             )
</span><span class="cx"> 
</span><del>-Servers = ServersDB()   # Global server DB
</del><span class="cx"> 
</span><span class="cx"> 
</span><ins>+def buildServersDB(maxClients=5):
+    serversDB = ServersDB()
+    serversDB.load()
+    serversDB.installReverseProxies(maxClients)
+    return serversDB
</ins><span class="cx"> 
</span><ins>+
+
+
</ins><span class="cx"> class Server(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Represents a server.
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischeduleschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule import xml
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.dkim import DKIMVerifier, \
</span><span class="cx">     DKIMVerificationError, DKIMMissingError
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
</del><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.remoteservers import IScheduleServers
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.utils import getIPsFromHost
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.xml import ischedule_namespace
</span><span class="lines">@@ -57,6 +56,7 @@
</span><span class="cx"> 
</span><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class ErrorResponse(Response):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     A L{Response} object which contains a status code and a L{element.Error}
</span><span class="lines">@@ -339,13 +339,14 @@
</span><span class="cx"> 
</span><span class="cx">         # Check against this server.
</span><span class="cx">         matched = False
</span><del>-        if Servers.getThisServer().checkThisIP(clientip):
</del><ins>+        serversDB = self.txn._store.directoryService().serversDB
+        if serversDB.getThisServer().checkThisIP(clientip):
</ins><span class="cx">             matched = True
</span><span class="cx"> 
</span><span class="cx">         # Checked allowed IPs - if any were defined we only check against them, we do not
</span><span class="cx">         # go on to check the expected server host ip
</span><del>-        elif Servers.getThisServer().hasAllowedFromIP():
-            matched = Servers.getThisServer().checkAllowedFromIP(clientip)
</del><ins>+        elif serversDB.getThisServer().hasAllowedFromIP():
+            matched = serversDB.getThisServer().checkAllowedFromIP(clientip)
</ins><span class="cx">             if not matched:
</span><span class="cx">                 log.error(&quot;Invalid iSchedule connection from client: %s&quot; % (clientip,))
</span><span class="cx"> 
</span><span class="lines">@@ -365,7 +366,7 @@
</span><span class="cx">                 log.debug(&quot;iSchedule cannot lookup client ip '%s': %s&quot; % (clientip, str(e),))
</span><span class="cx"> 
</span><span class="cx">         # Check possible shared secret
</span><del>-        if matched and not Servers.getThisServer().checkSharedSecret(self.headers):
</del><ins>+        if matched and not serversDB.getThisServer().checkSharedSecret(self.headers):
</ins><span class="cx">             log.error(&quot;Invalid iSchedule shared secret&quot;)
</span><span class="cx">             matched = False
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischeduletesttest_localserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -20,10 +20,13 @@
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.stdconfig import config
</span><span class="cx"> 
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers, SERVER_SECRET_HEADER
</del><ins>+from txdav.caldav.datastore.scheduling.ischedule.localservers import (
+    ServersDB, SERVER_SECRET_HEADER
+)
</ins><span class="cx"> 
</span><span class="cx"> import StringIO as StringIO
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class ServerTests(unittest.TestCase):
</span><span class="cx"> 
</span><span class="cx">     data1 = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
</span><span class="lines">@@ -61,7 +64,7 @@
</span><span class="cx">         self.patch(config, &quot;HTTPPort&quot;, 8008)
</span><span class="cx"> 
</span><span class="cx">         xmlFile = StringIO.StringIO(data)
</span><del>-        servers = Servers
</del><ins>+        servers = ServersDB()
</ins><span class="cx">         servers.load(xmlFile, ignoreIPLookupFailures=True)
</span><span class="cx"> 
</span><span class="cx">         return servers
</span><span class="lines">@@ -96,7 +99,7 @@
</span><span class="cx">         self.patch(config, &quot;BindSSLPorts&quot;, [8843])
</span><span class="cx"> 
</span><span class="cx">         xmlFile = StringIO.StringIO(ServerTests.data1)
</span><del>-        servers = Servers
</del><ins>+        servers = ServersDB()
</ins><span class="cx">         servers.load(xmlFile, ignoreIPLookupFailures=True)
</span><span class="cx"> 
</span><span class="cx">         self.assertFalse(servers.getServerById(&quot;00001&quot;).thisServer)
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingischeduletesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -29,45 +29,29 @@
</span><span class="cx">     CommonCommonTests
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><span class="cx"> import txweb2.dav.test.util
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore, \
-    TestCalendarStoreDirectoryRecord
-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers, \
-    Server
</del><ins>+from txdav.caldav.datastore.scheduling.ischedule.localservers import (
+    ServersDB, Server
+)
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class iSchedulePOST (CommonCommonTests, txweb2.dav.test.util.TestCase):
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(iSchedulePOST, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
-        self.directory = self._sqlCalendarStore.directoryService()
</del><span class="cx"> 
</span><ins>+        serversDB = ServersDB()
+        a_server = Server(&quot;A&quot;, &quot;http://localhost:8008&quot;, thisServer=True)
+        serversDB.addServer(a_server)
+        b_server = Server(&quot;B&quot;, &quot;http://localhost:8108&quot;, thisServer=False)
+        serversDB.addServer(b_server)
+        yield self.buildStoreAndDirectory(serversDB=serversDB)
+
</ins><span class="cx">         self.site.resource.putChild(&quot;ischedule&quot;, IScheduleInboxResource(self.site.resource, self.storeUnderTest()))
</span><span class="cx">         self.site.resource.putChild(&quot;podding&quot;, IScheduleInboxResource(self.site.resource, self.storeUnderTest(), podding=True))
</span><span class="cx"> 
</span><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><del>-        # Pod servers
-        a_server = Server(id=&quot;A&quot;, uri=&quot;http://localhost:8008&quot;, thisServer=True)
-        Servers.addServer(a_server)
-        b_server = Server(id=&quot;B&quot;, uri=&quot;http://localhost:8108&quot;, thisServer=False)
-        Servers.addServer(b_server)
-        Servers._thisServer = a_server
-
-        # Podded users
-        for ctr in range(1, 100):
-            self.directory.addRecord(TestCalendarStoreDirectoryRecord(
-                &quot;puser{:02d}&quot;.format(ctr),
-                (&quot;puser{:02d}&quot;.format(ctr),),
-                &quot;Puser {:02d}&quot;.format(ctr),
-                frozenset((
-                    &quot;urn:uuid:puser{:02d}&quot;.format(ctr),
-                    &quot;mailto:puser{:02d}@example.com&quot;.format(ctr),
-                )),
-                thisServer=False,
-                server=b_server,
-            ))
-
</del><span class="cx">         # iSchedule server
</span><span class="cx">         IScheduleServers()
</span><span class="cx">         server = IScheduleServerRecord(&quot;http://127.0.0.1&quot;)
</span><span class="lines">@@ -76,13 +60,6 @@
</span><span class="cx">         self.addCleanup(lambda : IScheduleServers._domainMap.pop(&quot;example.org&quot;)) #@UndefinedVariable
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Return a store for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def populate(self):
</span><span class="cx">         yield populateCalendarsFrom(self.requirements, self.storeUnderTest())
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_cuaddresspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_cuaddress.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_cuaddress.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_cuaddress.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import calendarUserFromCalendarUserAddress, \
</span><span class="cx">     LocalCalendarUser, InvalidCalendarUser
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, CommonCommonTests
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -50,10 +49,9 @@
</span><span class="cx">     def setUp(self):
</span><span class="cx"> 
</span><span class="cx">         yield super(CalendarUser, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
-        self.directory = self._sqlCalendarStore.directoryService()
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><del>-        self.directory.removeRecord(&quot;user03&quot;)
</del><ins>+        yield self.removeRecord(u&quot;user03&quot;)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -62,13 +60,6 @@
</span><span class="cx">         self.notifierFactory.reset()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_lookup(self):
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_freebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_freebusy.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_freebusy.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_freebusy.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.scheduling.freebusy import buildFreeBusyResult, \
</span><span class="cx">     generateFreeBusyInfo
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.common.datastore.test.util import CommonCommonTests, populateCalendarsFrom
</span><span class="cx"> 
</span><span class="cx"> def normalizeiCalendarText(data):
</span><span class="lines">@@ -266,7 +265,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(GenerateFreeBusyInfo, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx">         self.now = DateTime.getNowUTC()
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_implicit.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -34,8 +34,6 @@
</span><span class="cx"> from txdav.caldav.datastore.scheduling.implicit import ImplicitScheduler, \
</span><span class="cx">     ScheduleReplyWork
</span><span class="cx"> from txdav.caldav.datastore.scheduling.scheduler import ScheduleResponseQueue
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore, \
-    buildDirectoryRecord
</del><span class="cx"> from txdav.caldav.icalendarstore import AttendeeAllowedError, \
</span><span class="cx">     ComponentUpdateState
</span><span class="cx"> from txdav.common.datastore.test.util import CommonCommonTests, populateCalendarsFrom
</span><span class="lines">@@ -58,45 +56,18 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class FakeDirectoryService(object):
-
-    def recordWithUID(self, uid):
-        return buildDirectoryRecord(uid)
-
-
-
-class FakeCalendarHome(object):
-
-    def __init__(self, uid):
-        self._uid = uid
-
-
-    def uid(self):
-        return self._uid
-
-
-    def directoryService(self):
-        if not hasattr(self, &quot;_directoryService&quot;):
-            self._directoryService = FakeDirectoryService()
-        return self._directoryService
-
-
-
-class FakeTxn(object):
-
-    def directoryService(self):
-        if not hasattr(self, &quot;_directoryService&quot;):
-            self._directoryService = FakeDirectoryService()
-        return self._directoryService
-
-
-
-class Implicit(TestCase):
</del><ins>+class Implicit(CommonCommonTests, TestCase):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     iCalendar support tests
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def setUp(self):
+        yield super(Implicit, self).setUp()
+        yield self.buildStoreAndDirectory()
+
+
+    @inlineCallbacks
</ins><span class="cx">     def test_removed_attendees(self):
</span><span class="cx"> 
</span><span class="cx">         data = (
</span><span class="lines">@@ -109,9 +80,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -122,9 +93,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -139,9 +110,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -152,12 +123,12 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><del>-                ((&quot;mailto:user2@example.com&quot;, None),),
</del><ins>+                ((&quot;mailto:user02@example.com&quot;, None),),
</ins><span class="cx">             ),
</span><span class="cx">             (
</span><span class="cx">                 &quot;#1.3 Simple component, two removals&quot;,
</span><span class="lines">@@ -168,10 +139,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -182,14 +153,14 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user2@example.com&quot;, None),
-                    (&quot;mailto:user3@example.com&quot;, None),
</del><ins>+                    (&quot;mailto:user02@example.com&quot;, None),
+                    (&quot;mailto:user03@example.com&quot;, None),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -201,10 +172,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -216,15 +187,15 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user2@example.com&quot;, None),
-                    (&quot;mailto:user3@example.com&quot;, None),
</del><ins>+                    (&quot;mailto:user02@example.com&quot;, None),
+                    (&quot;mailto:user03@example.com&quot;, None),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -236,10 +207,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -251,19 +222,19 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> EXDATE:20080801T120000Z
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -275,10 +246,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -290,22 +261,22 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> EXDATE:20080801T120000Z,20080901T120000Z
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -317,10 +288,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -332,10 +303,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> EXDATE:20080801T120000Z,20080901T120000Z
</span><span class="cx"> EXDATE:20081201T120000Z
</span><span class="lines">@@ -343,15 +314,15 @@
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 12, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 12, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 12, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 9, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 12, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 12, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 12, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -363,10 +334,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -374,10 +345,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -388,10 +359,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -399,10 +370,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -417,10 +388,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -428,10 +399,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -442,9 +413,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -452,15 +423,15 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user3@example.com&quot;, None),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user03@example.com&quot;, None),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -472,10 +443,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -483,10 +454,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -497,10 +468,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -508,14 +479,14 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -527,10 +498,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -538,10 +509,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -552,9 +523,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -562,15 +533,15 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user3@example.com&quot;, None),
</del><ins>+                    (&quot;mailto:user03@example.com&quot;, None),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -582,10 +553,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -593,10 +564,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -607,10 +578,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="lines">@@ -626,10 +597,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -637,10 +608,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -651,19 +622,19 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> EXDATE:20080801T120000Z
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user3@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user03@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -675,10 +646,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -686,10 +657,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user4@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user04@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -700,9 +671,9 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -710,15 +681,15 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user3@example.com&quot;, None),
-                    (&quot;mailto:user4@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user03@example.com&quot;, None),
+                    (&quot;mailto:user04@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -730,10 +701,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -741,10 +712,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user4@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user04@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -755,16 +726,16 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user4@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user04@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">             (
</span><span class="lines">@@ -776,10 +747,10 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> END:VEVENT
</span><span class="cx"> BEGIN:VEVENT
</span><span class="lines">@@ -787,10 +758,10 @@
</span><span class="cx"> RECURRENCE-ID:20080801T120000Z
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user4@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user04@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="lines">@@ -801,19 +772,19 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
</ins><span class="cx"> RRULE:FREQ=MONTHLY
</span><span class="cx"> EXDATE:20080801T120000Z
</span><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;,
</span><span class="cx">                 (
</span><del>-                    (&quot;mailto:user1@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user2@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
-                    (&quot;mailto:user4@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</del><ins>+                    (&quot;mailto:user01@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user02@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
+                    (&quot;mailto:user04@example.com&quot;, DateTime(2008, 8, 1, 12, 0, 0, tzid=Timezone(utc=True))),
</ins><span class="cx">                 ),
</span><span class="cx">             ),
</span><span class="cx">         )
</span><span class="lines">@@ -826,12 +797,14 @@
</span><span class="cx">             scheduler.oldInstances = set(scheduler.oldcalendar.getComponentInstances())
</span><span class="cx">             scheduler.calendar = Component.fromString(calendar2)
</span><span class="cx"> 
</span><del>-            scheduler.calendar_home = FakeCalendarHome(&quot;user01&quot;)
-            scheduler.txn = FakeTxn()
</del><ins>+            txn = self.transactionUnderTest()
+            scheduler.txn = txn
+            scheduler.calendar_home = yield self.homeUnderTest(txn=txn, name=u&quot;user01&quot;, create=True)
</ins><span class="cx"> 
</span><span class="cx">             yield scheduler.extractCalendarData()
</span><span class="cx">             scheduler.findRemovedAttendees()
</span><span class="cx">             self.assertEqual(scheduler.cancelledAttendees, set(result), msg=description)
</span><ins>+            yield self.commit()
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -841,9 +814,9 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         data = (
</span><del>-            ((), None, 3, (&quot;mailto:user2@example.com&quot;, &quot;mailto:user3@example.com&quot;, &quot;mailto:user4@example.com&quot;,),),
-            ((&quot;mailto:user2@example.com&quot;,), None, 2, (&quot;mailto:user3@example.com&quot;, &quot;mailto:user4@example.com&quot;,),),
-            ((), (&quot;mailto:user2@example.com&quot;, &quot;mailto:user4@example.com&quot;,) , 2, (&quot;mailto:user2@example.com&quot;, &quot;mailto:user4@example.com&quot;,),),
</del><ins>+            ((), None, 3, (&quot;mailto:user02@example.com&quot;, &quot;mailto:user03@example.com&quot;, &quot;mailto:user04@example.com&quot;,),),
+            ((&quot;mailto:user02@example.com&quot;,), None, 2, (&quot;mailto:user03@example.com&quot;, &quot;mailto:user04@example.com&quot;,),),
+            ((), (&quot;mailto:user02@example.com&quot;, &quot;mailto:user04@example.com&quot;,) , 2, (&quot;mailto:user02@example.com&quot;, &quot;mailto:user04@example.com&quot;,),),
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         calendar = &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="lines">@@ -853,11 +826,11 @@
</span><span class="cx"> UID:12345-67890
</span><span class="cx"> DTSTART:20080601T120000Z
</span><span class="cx"> DTEND:20080601T130000Z
</span><del>-ORGANIZER;CN=&quot;User 01&quot;:mailto:user1@example.com
-ATTENDEE:mailto:user1@example.com
-ATTENDEE:mailto:user2@example.com
-ATTENDEE:mailto:user3@example.com
-ATTENDEE:mailto:user4@example.com
</del><ins>+ORGANIZER;CN=&quot;User 01&quot;:mailto:user01@example.com
+ATTENDEE:mailto:user01@example.com
+ATTENDEE:mailto:user02@example.com
+ATTENDEE:mailto:user03@example.com
+ATTENDEE:mailto:user04@example.com
</ins><span class="cx"> END:VEVENT
</span><span class="cx"> END:VCALENDAR
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -874,14 +847,16 @@
</span><span class="cx">             scheduler.changed_rids = None
</span><span class="cx">             scheduler.reinvites = None
</span><span class="cx"> 
</span><del>-            scheduler.calendar_home = FakeCalendarHome(&quot;user1&quot;)
-            scheduler.txn = FakeTxn()
</del><ins>+            txn = self.transactionUnderTest()
+            scheduler.txn = txn
+            scheduler.calendar_home = yield self.homeUnderTest(txn=txn, name=u&quot;user01&quot;, create=True)
</ins><span class="cx"> 
</span><span class="cx">             # Get some useful information from the calendar
</span><span class="cx">             yield scheduler.extractCalendarData()
</span><ins>+            record = yield self.directory.recordWithUID(scheduler.calendar_home.uid())
</ins><span class="cx">             scheduler.organizerAddress = LocalCalendarUser(
</span><del>-                &quot;mailto:user1@example.com&quot;,
-                buildDirectoryRecord(scheduler.calendar_home.uid()),
</del><ins>+                &quot;mailto:user01@example.com&quot;,
+                record,
</ins><span class="cx">             )
</span><span class="cx"> 
</span><span class="cx">             recipients = []
</span><span class="lines">@@ -894,6 +869,7 @@
</span><span class="cx">             self.assertEqual(count, result_count)
</span><span class="cx">             self.assertEqual(len(recipients), result_count)
</span><span class="cx">             self.assertEqual(set(recipients), set(result_set))
</span><ins>+            yield self.commit()
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -905,7 +881,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(ImplicitRequests, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -939,13 +915,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _createCalendarObject(self, data, user, name):
</span><span class="cx">         calendar_collection = (yield self.calendarUnderTest(home=user))
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoreschedulingtesttest_utilspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_utils.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_utils.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/scheduling/test/test_utils.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -25,8 +25,6 @@
</span><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.scheduling.utils import getCalendarObjectForRecord, \
</span><span class="cx">     extractEmailDomain, uidFromCalendarUserAddress
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore, \
-    buildDirectoryRecord
</del><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, CommonCommonTests
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -107,10 +105,9 @@
</span><span class="cx">     def setUp(self):
</span><span class="cx"> 
</span><span class="cx">         yield super(RecipientCopy, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><del>-        self.directory = self._sqlCalendarStore.directoryService()
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -145,7 +142,7 @@
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="cx">         # Look up resource by UID in home where only one exists
</span><del>-        principal = buildDirectoryRecord(&quot;user01&quot;)
</del><ins>+        principal = yield self.directory.recordWithUID(u&quot;user01&quot;)
</ins><span class="cx">         txn = self.transactionUnderTest()
</span><span class="cx">         resource = (yield getCalendarObjectForRecord(txn, principal, &quot;685BC3A1-195A-49B3-926D-388DDACA78A6&quot;))
</span><span class="cx">         self.assertEqual(resource.name(), &quot;1.ics&quot;)
</span><span class="lines">@@ -165,7 +162,7 @@
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="cx">         # Look up resource by UID in home where two exists
</span><del>-        principal = buildDirectoryRecord(&quot;user02&quot;)
</del><ins>+        principal = yield self.directory.recordWithUID(&quot;user02&quot;)
</ins><span class="cx">         txn = self.transactionUnderTest()
</span><span class="cx">         resource = (yield getCalendarObjectForRecord(txn, principal, &quot;685BC3A1-195A-49B3-926D-388DDACA78A6&quot;))
</span><span class="cx">         self.assertTrue(resource.name() in (&quot;2.ics&quot;, &quot;3.ics&quot;,))
</span><span class="lines">@@ -183,7 +180,7 @@
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><span class="cx">         # Look up resource where principal exists but home does not
</span><del>-        principal = buildDirectoryRecord(&quot;user102&quot;)
</del><ins>+        principal = yield self.directory.recordWithUID(&quot;user102&quot;)  # ASKCYRUS: but user102 doesn't exist
</ins><span class="cx">         txn = self.transactionUnderTest()
</span><span class="cx">         resource = (yield getCalendarObjectForRecord(txn, principal, &quot;685BC3A1-195A-49B3-926D-388DDACA78A6&quot;))
</span><span class="cx">         self.assertTrue(resource is None)
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretesttest_attachmentspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_attachments.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/test_attachments.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_attachments.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -14,8 +14,6 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from txdav.who.util import directoryFromConfig
-
</del><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> from pycalendar.value import Value
</span><span class="cx"> 
</span><span class="lines">@@ -34,7 +32,6 @@
</span><span class="cx"> from txdav.caldav.datastore.sql import CalendarStoreFeatures, DropBoxAttachment, \
</span><span class="cx">     ManagedAttachment
</span><span class="cx"> from txdav.caldav.datastore.test.common import CaptureProtocol
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.caldav.icalendarstore import IAttachmentStorageTransport, IAttachment, \
</span><span class="cx">     QuotaExceeded, AttachmentSizeTooLarge
</span><span class="cx"> from txdav.common.datastore.sql_tables import schema
</span><span class="lines">@@ -99,7 +96,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(AttachmentTests, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1536,18 +1533,13 @@
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(AttachmentMigrationTests, self).setUp()
</span><span class="cx"> 
</span><del>-        self.patch(config.DirectoryService.params, &quot;xmlFile&quot;,
-            os.path.join(
-                os.path.dirname(__file__), &quot;attachments&quot;, &quot;accounts.xml&quot;
-            )
</del><ins>+        attachmentsFilePath = FilePath(
+            os.path.join(os.path.dirname(__file__), &quot;attachments&quot;)
</ins><span class="cx">         )
</span><del>-        self.patch(config.ResourceService.params, &quot;xmlFile&quot;,
-            os.path.join(
-                os.path.dirname(__file__), &quot;attachments&quot;, &quot;resources.xml&quot;
-            )
</del><ins>+        yield self.buildStoreAndDirectory(
+            accounts=attachmentsFilePath.child(&quot;accounts.xml&quot;),
+            resources=attachmentsFilePath.child(&quot;resources.xml&quot;),
</ins><span class="cx">         )
</span><del>-
-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory, directoryFromConfig(config))
</del><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx">         self.paths = {}
</span><span class="lines">@@ -1577,13 +1569,6 @@
</span><span class="cx">         yield txn.commit()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _addAttachment(self, home, calendar, event, dropboxid, name):
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretesttest_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_file.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -13,7 +13,6 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><del>-from txdav.caldav.datastore.test.util import buildDirectory
</del><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> File calendar store tests.
</span><span class="lines">@@ -23,29 +22,27 @@
</span><span class="cx"> # deleted and replaced with either implementation-specific methods on
</span><span class="cx"> # FileStorageTests, or implementation-agnostic methods on CommonTests.
</span><span class="cx"> 
</span><ins>+from pycalendar.datetime import DateTime
+from twext.python.filepath import CachingFilePath as FilePath
+from twisted.internet.defer import inlineCallbacks
</ins><span class="cx"> from twisted.trial import unittest
</span><del>-from twisted.internet.defer import inlineCallbacks
-
-from twext.python.filepath import CachingFilePath as FilePath
-
</del><span class="cx"> from twistedcaldav.ical import Component as VComponent
</span><del>-
</del><ins>+from txdav.caldav.datastore.file import Calendar, CalendarObject
+from txdav.caldav.datastore.file import CalendarStore, CalendarHome
+from txdav.caldav.datastore.test.common import (
+    CommonTests, test_event_text, event1modified_text
+)
+from txdav.common.datastore.test.util import buildTestDirectory
+from txdav.common.datastore.test.util import StubNotifierFactory
+from txdav.common.datastore.test.util import deriveQuota
</ins><span class="cx"> from txdav.common.icommondatastore import HomeChildNameNotAllowedError
</span><ins>+from txdav.common.icommondatastore import NoSuchHomeChildError
</ins><span class="cx"> from txdav.common.icommondatastore import ObjectResourceNameNotAllowedError
</span><span class="cx"> from txdav.common.icommondatastore import ObjectResourceUIDAlreadyExistsError
</span><del>-from txdav.common.icommondatastore import NoSuchHomeChildError
</del><span class="cx"> 
</span><del>-from txdav.caldav.datastore.file import CalendarStore, CalendarHome
-from txdav.caldav.datastore.file import Calendar, CalendarObject
</del><ins>+storePath = FilePath(__file__).parent().child(&quot;calendar_store&quot;)
</ins><span class="cx"> 
</span><del>-from txdav.common.datastore.test.util import deriveQuota
-from txdav.caldav.datastore.test.common import (
-    CommonTests, test_event_text, event1modified_text)
</del><span class="cx"> 
</span><del>-from pycalendar.datetime import DateTime
-
-storePath = FilePath(__file__).parent().child(&quot;calendar_store&quot;)
-
</del><span class="cx"> def _todo(f, why):
</span><span class="cx">     f.todo = why
</span><span class="cx">     return f
</span><span class="lines">@@ -78,12 +75,15 @@
</span><span class="cx">                             resource.setContent(resource.getContent() % {&quot;now&quot;: nowYear})
</span><span class="cx"> 
</span><span class="cx">     testID = test.id()
</span><ins>+    test.counter = 0
+    test.notifierFactory = StubNotifierFactory()
</ins><span class="cx">     test.calendarStore = CalendarStore(
</span><span class="cx">         storeRootPath,
</span><span class="cx">         {&quot;push&quot;: test.notifierFactory} if test.notifierFactory else {},
</span><del>-        buildDirectory(),
</del><ins>+        None,  # must create directory later
</ins><span class="cx">         quota=deriveQuota(test),
</span><span class="cx">     )
</span><ins>+    test.directory = buildTestDirectory(test.calendarStore, test.mktemp())
</ins><span class="cx">     test.txn = test.calendarStore.newTransaction(testID + &quot;(old)&quot;)
</span><span class="cx">     assert test.calendarStore is not None, &quot;No calendar store?&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -131,6 +131,7 @@
</span><span class="cx"> class CalendarHomeTest(unittest.TestCase):
</span><span class="cx"> 
</span><span class="cx">     notifierFactory = None
</span><ins>+
</ins><span class="cx">     def setUp(self):
</span><span class="cx">         return setUpHome1(self)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_implicit.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -30,9 +30,9 @@
</span><span class="cx">     TooManyAttendeesError, InvalidCalendarAccessError, ComponentUpdateState, \
</span><span class="cx">     DuplicatePrivateCommentsError
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_WRITE
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.caldav.datastore.sql import CalendarObject
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class ImplicitRequests (CommonCommonTests, TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Test twistedcaldav.scheduyling.implicit with a Request object.
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(ImplicitRequests, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_sql.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/test_sql.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_sql.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -55,7 +55,6 @@
</span><span class="cx"> from txdav.caldav.datastore.test.common import CommonTests as CalendarCommonTests, \
</span><span class="cx">     test_event_text
</span><span class="cx"> from txdav.caldav.datastore.test.test_file import setUpCalendarStore
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.caldav.datastore.util import _migrateCalendar, migrateHome
</span><span class="cx"> from txdav.caldav.icalendarstore import ComponentUpdateState, InvalidDefaultCalendar, \
</span><span class="cx">     InvalidSplit
</span><span class="lines">@@ -79,7 +78,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(CalendarSQLStorageTests, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx">         self.nowYear = {&quot;now&quot;: DateTime.getToday().getYear()}
</span><span class="lines">@@ -91,13 +90,6 @@
</span><span class="cx">         self.notifierFactory.reset()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def assertCalendarsSimilar(self, a, b, bCalendarFilter=None):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -1990,7 +1982,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(SchedulingTests, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx"> 
</span><span class="cx">         # Make sure homes are provisioned
</span><span class="cx">         txn = self.transactionUnderTest()
</span><span class="lines">@@ -2006,13 +1998,6 @@
</span><span class="cx">         self.notifierFactory.reset()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_doImplicitAttendeeEventFix(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -2181,7 +2166,7 @@
</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:x-uid:room1
</del><ins>+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room-addr-1
</ins><span class="cx"> ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
</span><span class="cx">  CEPTED:urn:x-uid:user01
</span><span class="cx"> CREATED:20131211T221854Z
</span><span class="lines">@@ -2198,7 +2183,7 @@
</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:x-uid:room2
</del><ins>+ T;SCHEDULE-STATUS=2.0:urn:x-uid:room-addr-2
</ins><span class="cx"> ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
</span><span class="cx">  CEPTED:urn:x-uid:user01
</span><span class="cx"> CREATED:20131211T221854Z
</span><span class="lines">@@ -2222,7 +2207,7 @@
</span><span class="cx">         # Check first component
</span><span class="cx">         locProp = components[0].getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(locProp.value(),
</span><del>-            &quot;Conference Room One\n1 Infinite Loop, Cupertino, CA 95014&quot;)
</del><ins>+            &quot;Room with Address 1\n1 Infinite Loop, Cupertino, CA 95014&quot;)
</ins><span class="cx">         structProp = components[0].getProperty(&quot;X-APPLE-STRUCTURED-LOCATION&quot;)
</span><span class="cx">         self.assertEquals(structProp.value(),
</span><span class="cx">             &quot;geo:37.331741,-122.030333&quot;)
</span><span class="lines">@@ -2230,7 +2215,7 @@
</span><span class="cx">         # Check second component
</span><span class="cx">         locProp = components[1].getProperty(&quot;LOCATION&quot;)
</span><span class="cx">         self.assertEquals(locProp.value(),
</span><del>-            &quot;Conference Room Two\n2 Infinite Loop, Cupertino, CA 95014&quot;)
</del><ins>+            &quot;Room with Address 2\n2 Infinite Loop, Cupertino, CA 95014&quot;)
</ins><span class="cx">         structProp = components[1].getProperty(&quot;X-APPLE-STRUCTURED-LOCATION&quot;)
</span><span class="cx">         self.assertEquals(structProp.value(),
</span><span class="cx">             &quot;geo:37.332633,-122.030502&quot;)
</span><span class="lines">@@ -2247,7 +2232,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(CalendarObjectSplitting, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx"> 
</span><span class="cx">         # Make sure homes are provisioned
</span><span class="cx">         txn = self.transactionUnderTest()
</span><span class="lines">@@ -2299,13 +2284,6 @@
</span><span class="cx">         self.notifierFactory.reset()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _splitDetails(self, home):
</span><span class="cx">         # Get home data
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretesttest_sql_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_sql_sharing.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -21,7 +21,6 @@
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><span class="cx"> from txdav.common.datastore.test.util import CommonCommonTests, \
</span><span class="cx">     populateCalendarsFrom
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_READ, \
</span><span class="cx">     _BIND_STATUS_INVITED, _BIND_MODE_DIRECT, _BIND_STATUS_ACCEPTED
</span><span class="cx"> 
</span><span class="lines">@@ -34,7 +33,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(BaseSharingTests, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/test_util.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/test_util.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/test_util.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> 
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, CommonCommonTests
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.util import dropboxIDFromCalendarObject, \
</span><span class="cx">     StorageTransportBase, migrateHome
</span><span class="lines">@@ -323,18 +322,17 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(HomeMigrationTests, self).setUp()
</span><del>-        self.theStore = yield buildCalendarStore(self, self.notifierFactory, homes=(
-            &quot;conflict1&quot;,
-            &quot;conflict2&quot;,
-            &quot;empty_home&quot;,
-            &quot;non_empty_home&quot;,
-        ))
</del><ins>+        yield self.buildStoreAndDirectory(
+            extraUids=(
+                u&quot;conflict1&quot;,
+                u&quot;conflict2&quot;,
+                u&quot;empty_home&quot;,
+                u&quot;non_empty_home&quot;,
+            )
+        )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        return self.theStore
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_migrateEmptyHome(self):
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServertrunktxdavcaldavdatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/caldav/datastore/test/util.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/caldav/datastore/test/util.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/util.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -16,230 +16,23 @@
</span><span class="cx"> ##
</span><span class="cx"> from twisted.trial.unittest import TestCase
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twisted.internet.defer import inlineCallbacks, succeed
</del><ins>+from twisted.internet.defer import inlineCallbacks
</ins><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> Store test utility functions
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-from twistedcaldav.config import config
-from txdav.caldav.icalendardirectoryservice import ICalendarStoreDirectoryService, \
-    ICalendarStoreDirectoryRecord
-from txdav.common.datastore.test.util import TestStoreDirectoryService, \
-    TestStoreDirectoryRecord, theStoreBuilder, CommonCommonTests, \
-    populateCalendarsFrom
-from zope.interface.declarations import implements
</del><ins>+from txdav.common.datastore.test.util import (
+    CommonCommonTests, populateCalendarsFrom
+)
</ins><span class="cx"> 
</span><del>-class TestCalendarStoreDirectoryService(TestStoreDirectoryService):
</del><span class="cx"> 
</span><del>-    implements(ICalendarStoreDirectoryService)
-
-    def __init__(self):
-        super(TestCalendarStoreDirectoryService, self).__init__()
-        self.recordsByCUA = {}
-
-
-    def recordWithCalendarUserAddress(self, cuaddr):
-        return succeed(self.recordsByCUA.get(cuaddr))
-
-
-    def addRecord(self, record):
-        super(TestCalendarStoreDirectoryService, self).addRecord(record)
-        for cuaddr in record.calendarUserAddresses:
-            self.recordsByCUA[cuaddr] = record
-
-
-    def removeRecord(self, uid):
-        record = self.records[uid]
-        del self.records[uid]
-        for cuaddr in record.calendarUserAddresses:
-            del self.recordsByCUA[cuaddr]
-
-
-
-class TestCalendarStoreDirectoryRecord(TestStoreDirectoryRecord):
-
-    implements(ICalendarStoreDirectoryRecord)
-
-    def __init__(
-        self,
-        uid,
-        shortNames,
-        fullName,
-        calendarUserAddresses,
-        cutype=&quot;INDIVIDUAL&quot;,
-        thisServer=True,
-        server=None,
-        associatedAddress=None,
-        streetAddress=None,
-        geographicLocation=None
-    ):
-
-        super(TestCalendarStoreDirectoryRecord, self).__init__(
-            uid, shortNames, fullName, thisServer, server,
-        )
-        self.calendarUserAddresses = calendarUserAddresses
-        self.cutype = cutype
-        self.associatedAddress = associatedAddress
-        self.streetAddress = streetAddress
-        self.geographicLocation = geographicLocation
-
-
-    def canonicalCalendarUserAddress(self):
-        &quot;&quot;&quot;
-            Return a CUA for this record, preferring in this order:
-            urn:x-uid: form
-            urn:uuid: form
-            mailto: form
-            /principals/__uids__/ form
-            first in calendarUserAddresses list (sorted)
-        &quot;&quot;&quot;
-
-        sortedCuas = sorted(self.calendarUserAddresses)
-
-        for prefix in (
-            &quot;urn:x-uid:&quot;,
-            &quot;urn:uuid:&quot;,
-            &quot;mailto:&quot;,
-            &quot;/principals/__uids__/&quot;
-        ):
-            for candidate in sortedCuas:
-                if candidate.startswith(prefix):
-                    return candidate
-
-        # fall back to using the first one
-        return sortedCuas[0]
-
-
-    def calendarsEnabled(self):
-        return True
-
-
-    def enabledAsOrganizer(self):
-        if self.cutype == &quot;INDIVIDUAL&quot;:
-            return True
-        elif self.recordType == &quot;GROUP&quot;:
-            return config.Scheduling.Options.AllowGroupAsOrganizer
-        elif self.recordType == &quot;ROOM&quot;:
-            return config.Scheduling.Options.AllowLocationAsOrganizer
-        elif self.recordType == &quot;RESOURCE&quot;:
-            return config.Scheduling.Options.AllowResourceAsOrganizer
-        else:
-            return False
-
-
-    def getCUType(self):
-        return self.cutype
-
-
-    def canAutoSchedule(self, organizer):
-        return succeed(False)
-
-
-    def getAutoScheduleMode(self, organizer):
-        return succeed(&quot;automatic&quot;)
-
-
-    def isProxyFor(self, other):
-        return succeed(False)
-
-
-
-def buildDirectory(homes=None):
-
-    directory = TestCalendarStoreDirectoryService()
-
-    # User accounts
-    for ctr in range(1, 100):
-        directory.addRecord(TestCalendarStoreDirectoryRecord(
-            &quot;user%02d&quot; % (ctr,),
-            (&quot;user%02d&quot; % (ctr,),),
-            &quot;User %02d&quot; % (ctr,),
-            frozenset((
-                &quot;urn:x-uid:user%02d&quot; % (ctr,),
-                &quot;urn:uuid:user%02d&quot; % (ctr,),
-                &quot;mailto:user%02d@example.com&quot; % (ctr,),
-            )),
-        ))
-
-    homes = set(homes) if homes is not None else set()
-    homes.update((
-        &quot;home1&quot;,
-        &quot;home2&quot;,
-        &quot;home3&quot;,
-        &quot;home_attachments&quot;,
-        &quot;home_bad&quot;,
-        &quot;home_defaults&quot;,
-        &quot;home_no_splits&quot;,
-        &quot;home_provision1&quot;,
-        &quot;home_provision2&quot;,
-        &quot;home_splits&quot;,
-        &quot;home_splits_shared&quot;,
-        &quot;uid1&quot;,
-        &quot;uid2&quot;,
-        &quot;new-home&quot;,
-        &quot;xyzzy&quot;,
-    ))
-    for uid in homes:
-        directory.addRecord(buildDirectoryRecord(uid))
-
-    # Structured Locations
-    directory.addRecord(TestCalendarStoreDirectoryRecord(
-        &quot;il1&quot;, (&quot;il1&quot;,), &quot;1 Infinite Loop&quot;, [],
-        cutype=&quot;ROOM&quot;,
-        geographicLocation=&quot;37.331741,-122.030333&quot;,
-        streetAddress=&quot;1 Infinite Loop, Cupertino, CA 95014&quot;
-    ))
-    directory.addRecord(TestCalendarStoreDirectoryRecord(
-        &quot;il2&quot;, (&quot;il2&quot;,), &quot;2 Infinite Loop&quot;, [],
-        cutype=&quot;ROOM&quot;,
-        geographicLocation=&quot;37.332633,-122.030502&quot;,
-        streetAddress=&quot;2 Infinite Loop, Cupertino, CA 95014&quot;
-    ))
-    directory.addRecord(TestCalendarStoreDirectoryRecord(
-        &quot;room1&quot;, (&quot;room1&quot;,), &quot;Conference Room One&quot;,
-        frozenset((&quot;urn:x-uid:room1&quot;,)),
-        cutype=&quot;ROOM&quot;,
-        associatedAddress=&quot;il1&quot;,
-    ))
-    directory.addRecord(TestCalendarStoreDirectoryRecord(
-        &quot;room2&quot;, (&quot;room2&quot;,), &quot;Conference Room Two&quot;,
-        frozenset((&quot;urn:x-uid:room2&quot;,)),
-        cutype=&quot;ROOM&quot;,
-        associatedAddress=&quot;il2&quot;,
-    ))
-
-    return directory
-
-
-
-def buildDirectoryRecord(uid):
-    return TestCalendarStoreDirectoryRecord(
-        uid,
-        (uid,),
-        uid.capitalize(),
-        frozenset((
-            &quot;urn:x-uid:{0}&quot;.format(uid,),
-            &quot;urn:uuid:{0}&quot;.format(uid,),
-            &quot;mailto:{0}@example.com&quot;.format(uid,),
-        )),
-    )
-
-
-
-def buildCalendarStore(testCase, notifierFactory, directoryService=None, homes=None):
-    if directoryService is None:
-        directoryService = buildDirectory(homes=homes)
-    return theStoreBuilder.buildStore(testCase, notifierFactory, directoryService)
-
-
-
</del><span class="cx"> class CommonStoreTests(CommonCommonTests, TestCase):
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(CommonStoreTests, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -277,10 +70,3 @@
</span><span class="cx">             },
</span><span class="cx">         },
</span><span class="cx">     }
</span><del>-
-
-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
</del></span></pre></div>
<a id="CalendarServertrunktxdavcarddavdatastoretestcommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/carddav/datastore/test/common.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/carddav/datastore/test/common.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/carddav/datastore/test/common.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -201,18 +201,7 @@
</span><span class="cx">         },
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Subclasses must override this to return an L{IAddressBookStore}
-        provider which adheres to the structure detailed by
-        L{CommonTests.requirements}. This attribute is a dict of dict of dicts;
-        the outermost layer representing UIDs mapping to addressbook homes,
-        then addressbook names mapping to addressbook collections, and finally
-        addressbook object names mapping to addressbook object text.
-        &quot;&quot;&quot;
-        raise NotImplementedError()
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     def homeUnderTest(self, txn=None, name=None):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Get the addressbook home detailed by C{requirements['home1']}.
</span></span></pre></div>
<a id="CalendarServertrunktxdavcarddavdatastoretesttest_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/carddav/datastore/test/test_file.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/carddav/datastore/test/test_file.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/carddav/datastore/test/test_file.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -60,6 +60,7 @@
</span><span class="cx">     addressbookPath.parent().makedirs()
</span><span class="cx">     storePath.copyTo(addressbookPath)
</span><span class="cx"> 
</span><ins>+    test.counter = 0
</ins><span class="cx">     test.notifierFactory = StubNotifierFactory()
</span><span class="cx">     test.addressbookStore = AddressBookStore(storeRootPath, {&quot;push&quot;: test.notifierFactory}, None)
</span><span class="cx">     test.txn = test.addressbookStore.newTransaction(test.id() + &quot; (old)&quot;)
</span></span></pre></div>
<a id="CalendarServertrunktxdavcarddavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/carddav/datastore/test/test_sql.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/carddav/datastore/test/test_sql.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/carddav/datastore/test/test_sql.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> from txdav.common.icommondatastore import NoSuchObjectResourceError
</span><span class="cx"> from txdav.common.datastore.sql import EADDRESSBOOKTYPE, CommonObjectResource
</span><span class="cx"> from txdav.common.datastore.sql_tables import  _ABO_KIND_PERSON, _ABO_KIND_GROUP, schema
</span><del>-from txdav.common.datastore.test.util import buildStore, cleanStore
</del><ins>+from txdav.common.datastore.test.util import cleanStore
</ins><span class="cx"> from txdav.carddav.datastore.sql import AddressBook
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentLanguage, ResourceType
</span><span class="lines">@@ -56,20 +56,10 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(AddressBookSQLStorageTests, self).setUp()
</span><del>-        self._sqlStore = yield buildStore(
-            self,
-            self.notifierFactory,
-            homes=(
-                &quot;home1&quot;,
-                &quot;home2&quot;,
-                &quot;home3&quot;,
-                &quot;home_bad&quot;,
-                &quot;home_empty&quot;,
-                &quot;homeNew&quot;,
-                &quot;new-home&quot;,
-                &quot;uid1&quot;,
-                &quot;uid2&quot;,
-                &quot;xyzzy&quot;,
</del><ins>+        yield self.buildStoreAndDirectory(
+            extraUids=(
+                u&quot;home_empty&quot;,
+                u&quot;homeNew&quot;,
</ins><span class="cx">             )
</span><span class="cx">         )
</span><span class="cx">         yield self.populate()
</span><span class="lines">@@ -96,13 +86,7 @@
</span><span class="cx">         self.notifierFactory.reset()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{AddressBookStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlStore
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def assertAddressbooksSimilar(self, a, b, bAddressbookFilter=None):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -252,7 +236,7 @@
</span><span class="cx">         operations, that we do not block other reads of the table.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        addressbookStore = self._sqlStore
</del><ins>+        addressbookStore = self.store
</ins><span class="cx"> 
</span><span class="cx">         txn1 = addressbookStore.newTransaction()
</span><span class="cx">         txn2 = addressbookStore.newTransaction()
</span><span class="lines">@@ -304,7 +288,7 @@
</span><span class="cx">         Test that two concurrent attempts to PUT different address book object resources to the
</span><span class="cx">         same address book home does not cause a deadlock.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = self._sqlStore
</del><ins>+        addressbookStore = self.store
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook now
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span><span class="lines">@@ -373,7 +357,7 @@
</span><span class="cx">         C{INSERT} that violates a unique constraint.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        addressbookStore = self._sqlStore
</del><ins>+        addressbookStore = self.store
</ins><span class="cx"> 
</span><span class="cx">         txn1 = addressbookStore.newTransaction()
</span><span class="cx">         txn2 = addressbookStore.newTransaction()
</span><span class="lines">@@ -410,7 +394,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test that kind property UID is stored correctly in database
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = self._sqlStore
</del><ins>+        addressbookStore = self.store
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook, one user and one group
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span><span class="lines">@@ -456,7 +440,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test that kind property vCard is stored correctly in database
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = self._sqlStore
</del><ins>+        addressbookStore = self.store
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook, one user and one group
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span><span class="lines">@@ -547,7 +531,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test that kind property vCard is stored correctly in database
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        addressbookStore = self._sqlStore
</del><ins>+        addressbookStore = self.store
</ins><span class="cx">         cleanStore(self, addressbookStore)
</span><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook, one user and one group
</span><span class="lines">@@ -739,7 +723,7 @@
</span><span class="cx">         work concurrently without an exception.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-        addressbookStore = self._sqlStore
</del><ins>+        addressbookStore = self.store
</ins><span class="cx"> 
</span><span class="cx">         # Provision the home and addressbook now
</span><span class="cx">         txn = addressbookStore.newTransaction()
</span><span class="lines">@@ -799,7 +783,7 @@
</span><span class="cx">         self.assertTrue(resource._locked)
</span><span class="cx"> 
</span><span class="cx">         # Setup a new transaction to verify the lock and also verify wait behavior
</span><del>-        newTxn = self._sqlStore.newTransaction()
</del><ins>+        newTxn = self.store.newTransaction()
</ins><span class="cx">         newResource = yield self.addressbookObjectUnderTest(txn=newTxn)
</span><span class="cx">         try:
</span><span class="cx">             yield newResource.lock(wait=False)
</span><span class="lines">@@ -818,7 +802,7 @@
</span><span class="cx">         self.assertTrue(resource._locked)
</span><span class="cx"> 
</span><span class="cx">         # Setup a new transaction to verify the lock but pass in an alternative txn directly
</span><del>-        newTxn = self._sqlStore.newTransaction()
</del><ins>+        newTxn = self.store.newTransaction()
</ins><span class="cx"> 
</span><span class="cx">         # FIXME: not sure why, but without this statement here, this portion of the test fails in a funny way.
</span><span class="cx">         # Basically the query in the try block seems to execute twice, failing each time, one of which is caught,
</span></span></pre></div>
<a id="CalendarServertrunktxdavcarddavdatastoretesttest_sql_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/carddav/datastore/test/test_sql_sharing.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -20,7 +20,7 @@
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.vcard import Component as VCard, Component
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from txdav.common.datastore.test.util import CommonCommonTests, buildStore
</del><ins>+from txdav.common.datastore.test.util import CommonCommonTests
</ins><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_READ, \
</span><span class="cx">     _BIND_STATUS_INVITED, _BIND_MODE_DIRECT, _BIND_STATUS_ACCEPTED, \
</span><span class="cx">     _BIND_MODE_WRITE
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(BaseSharingTests, self).setUp()
</span><del>-        self._sqlStore = yield buildStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -136,13 +136,6 @@
</span><span class="cx">     group2_children = [&quot;group2.vcf&quot;, &quot;card1.vcf&quot;, &quot;card3.vcf&quot;, ]
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _createShare(self, mode=_BIND_MODE_READ):
</span><span class="cx">         inviteUID = yield self._inviteShare(mode)
</span><span class="lines">@@ -1209,8 +1202,8 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # Create first events in different addressbook homes
</span><del>-        txn1 = self._sqlStore.newTransaction()
-        txn2 = self._sqlStore.newTransaction()
</del><ins>+        txn1 = self.store.newTransaction()
+        txn2 = self.store.newTransaction()
</ins><span class="cx"> 
</span><span class="cx">         addressbook_uid1_in_txn1 = yield self.addressbookUnderTest(txn1, &quot;addressbook&quot;, &quot;user01&quot;)
</span><span class="cx">         addressbook_uid2_in_txn2 = yield self.addressbookUnderTest(txn2, &quot;addressbook&quot;, &quot;user02&quot;)
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastorepoddingresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/podding/resource.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/podding/resource.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/podding/resource.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -29,12 +29,12 @@
</span><span class="cx">     deliverSchedulePrivilegeSet
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
</del><span class="cx"> from txdav.common.datastore.podding.conduit import FailedCrossPodRequestError
</span><span class="cx"> 
</span><span class="cx"> import base64
</span><span class="cx"> import json
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class ConduitResource(ReadOnlyNoCopyResourceMixIn, DAVResourceWithoutChildrenMixin, DAVResource):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Podding cross-pod RPC conduit resource.
</span><span class="lines">@@ -119,7 +119,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # Check shared secret
</span><del>-        if not Servers.getThisServer().checkSharedSecret(request.headers):
</del><ins>+        if not self.store.directoryService().serversDB.getThisServer().checkSharedSecret(request.headers):
</ins><span class="cx">             self.log.error(&quot;Invalid shared secret header in cross-pod request&quot;)
</span><span class="cx">             raise HTTPError(StatusResponse(responsecode.FORBIDDEN, &quot;Not authorized to make this request&quot;))
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastorepoddingtesttest_conduitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/podding/test/test_conduit.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/podding/test/test_conduit.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/podding/test/test_conduit.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -31,11 +31,9 @@
</span><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.query.filter import Filter
</span><span class="cx"> from txdav.caldav.datastore.scheduling.freebusy import generateFreeBusyInfo
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers, Server
</del><ins>+from txdav.caldav.datastore.scheduling.ischedule.localservers import ServersDB, Server
</ins><span class="cx"> from txdav.caldav.datastore.sql import ManagedAttachment
</span><span class="cx"> from txdav.caldav.datastore.test.common import CaptureProtocol
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore, \
-    TestCalendarStoreDirectoryRecord
</del><span class="cx"> from txdav.common.datastore.podding.conduit import PoddingConduit, \
</span><span class="cx">     FailedCrossPodRequestError
</span><span class="cx"> from txdav.common.datastore.podding.resource import ConduitResource
</span><span class="lines">@@ -63,36 +61,19 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(TestConduit, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
-        self.directory = self._sqlCalendarStore.directoryService()
</del><span class="cx"> 
</span><del>-        for ctr in range(1, 100):
-            self.directory.addRecord(TestCalendarStoreDirectoryRecord(
-                &quot;puser{:02d}&quot;.format(ctr),
-                (&quot;puser{:02d}&quot;.format(ctr),),
-                &quot;Puser {:02d}&quot;.format(ctr),
-                frozenset((
-                    &quot;urn:uuid:puser{:02d}&quot;.format(ctr),
-                    &quot;mailto:puser{:02d}@example.com&quot;.format(ctr),
-                )),
-                thisServer=False,
-            ))
</del><ins>+        serversDB = ServersDB()
+        serversDB.addServer(Server(&quot;A&quot;, &quot;http://127.0.0.1&quot;, &quot;A&quot;, True))
+        serversDB.addServer(Server(&quot;B&quot;, &quot;http://127.0.0.2&quot;, &quot;B&quot;, False))
</ins><span class="cx"> 
</span><ins>+        yield self.buildStoreAndDirectory(serversDB=serversDB)
+
</ins><span class="cx">         self.site.resource.putChild(&quot;conduit&quot;, ConduitResource(self.site.resource, self.storeUnderTest()))
</span><span class="cx"> 
</span><del>-        self.thisServer = Server(&quot;A&quot;, &quot;http://127.0.0.1&quot;, &quot;A&quot;, True)
-        Servers.addServer(self.thisServer)
-
</del><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Return a store for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def populate(self):
</span><span class="cx">         yield populateCalendarsFrom(self.requirements, self.storeUnderTest())
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastorepoddingtesttest_external_homepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/podding/test/test_external_home.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/podding/test/test_external_home.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/podding/test/test_external_home.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -16,10 +16,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers, \
-    Server
-from txdav.caldav.datastore.test.util import buildCalendarStore, \
-    TestCalendarStoreDirectoryRecord
</del><ins>+from txdav.caldav.datastore.scheduling.ischedule.localservers import (
+    ServersDB, Server
+)
</ins><span class="cx"> from txdav.common.datastore.podding.resource import ConduitResource
</span><span class="cx"> from txdav.common.datastore.sql_tables import _HOME_STATUS_NORMAL, \
</span><span class="cx">     _HOME_STATUS_EXTERNAL
</span><span class="lines">@@ -34,34 +33,16 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(ExternalHome, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
-        self.directory = self._sqlCalendarStore.directoryService()
</del><span class="cx"> 
</span><del>-        for ctr in range(1, 100):
-            self.directory.addRecord(TestCalendarStoreDirectoryRecord(
-                &quot;puser{:02d}&quot;.format(ctr),
-                (&quot;puser{:02d}&quot;.format(ctr),),
-                &quot;Puser {:02d}&quot;.format(ctr),
-                frozenset((
-                    &quot;urn:uuid:puser{:02d}&quot;.format(ctr),
-                    &quot;mailto:puser{:02d}@example.com&quot;.format(ctr),
-                )),
-                thisServer=False,
-            ))
</del><ins>+        serversDB = ServersDB()
+        serversDB.addServer(Server(&quot;A&quot;, &quot;http://127.0.0.1&quot;, &quot;A&quot;, True))
+        serversDB.addServer(Server(&quot;B&quot;, &quot;http://127.0.0.2&quot;, &quot;B&quot;, False))
</ins><span class="cx"> 
</span><ins>+        yield self.buildStoreAndDirectory(serversDB=serversDB)
+
</ins><span class="cx">         self.site.resource.putChild(&quot;conduit&quot;, ConduitResource(self.site.resource, self.storeUnderTest()))
</span><span class="cx"> 
</span><del>-        self.thisServer = Server(&quot;A&quot;, &quot;http://127.0.0.1&quot;, &quot;A&quot;, True)
-        Servers.addServer(self.thisServer)
</del><span class="cx"> 
</span><del>-
-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Return a store for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_validNormalHome(self):
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastorepoddingtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/podding/test/test_resource.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/podding/test/test_resource.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/podding/test/test_resource.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -23,8 +23,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> 
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers, Server
-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><ins>+from txdav.caldav.datastore.scheduling.ischedule.localservers import (
+    ServersDB, Server
+)
</ins><span class="cx"> from txdav.common.datastore.podding.resource import ConduitResource
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, CommonCommonTests
</span><span class="cx"> import json
</span><span class="lines">@@ -45,24 +46,17 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(ConduitPOST, self).setUp()
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory)
-        self.directory = self._sqlCalendarStore.directoryService()
</del><span class="cx"> 
</span><del>-        self.site.resource.putChild(&quot;conduit&quot;, ConduitResource(self.site.resource, self.storeUnderTest()))
-
</del><ins>+        serversDB = ServersDB()
</ins><span class="cx">         self.thisServer = Server(&quot;A&quot;, &quot;http://127.0.0.1&quot;, &quot;A&quot;, True)
</span><del>-        Servers.addServer(self.thisServer)
</del><ins>+        serversDB.addServer(self.thisServer)
+        yield self.buildStoreAndDirectory(serversDB=serversDB)
</ins><span class="cx"> 
</span><ins>+        self.site.resource.putChild(&quot;conduit&quot;, ConduitResource(self.site.resource, self.storeUnderTest()))
+
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Return a store for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def populate(self):
</span><span class="cx">         yield populateCalendarsFrom(self.requirements, self.storeUnderTest())
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastorepoddingtestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/podding/test/util.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/podding/test/util.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/podding/test/util.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -16,14 +16,14 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Server, \
-    Servers
-from txdav.caldav.datastore.test.util import \
-    TestCalendarStoreDirectoryRecord, TestCalendarStoreDirectoryService
</del><ins>+from txdav.caldav.datastore.scheduling.ischedule.localservers import (
+    Server, ServersDB
+)
</ins><span class="cx"> from txdav.common.datastore.podding.conduit import PoddingConduit
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_WRITE
</span><del>-from txdav.common.datastore.test.util import CommonCommonTests, SQLStoreBuilder,\
-    theStoreBuilder
</del><ins>+from txdav.common.datastore.test.util import (
+    CommonCommonTests, SQLStoreBuilder, buildTestDirectory
+)
</ins><span class="cx"> 
</span><span class="cx"> import txweb2.dav.test.util
</span><span class="cx"> 
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> import json
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class FakeConduitRequest(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     A conduit request that sends messages internally rather than using HTTP
</span><span class="lines">@@ -103,37 +104,54 @@
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(MultiStoreConduitTest, self).setUp()
</span><span class="cx"> 
</span><del>-        server1 = Server(&quot;A&quot;, &quot;http://127.0.0.1:8008&quot;, &quot;A&quot;, True)
-        Servers.addServer(server1)
</del><ins>+        # Store 1
+        serversDB1 = ServersDB()
+        server1a = Server(&quot;A&quot;, &quot;http://127.0.0.1:8008&quot;, &quot;A&quot;, True)
+        serversDB1.addServer(server1a)
+        server1b = Server(&quot;B&quot;, &quot;http://127.0.0.1:8108&quot;, &quot;B&quot;, False)
+        serversDB1.addServer(server1b)
+        yield self.buildStoreAndDirectory(serversDB=serversDB1)
+        self.store.queryCacher = None     # Cannot use query caching
+        self.store.conduit = self.makeConduit(self.store)
</ins><span class="cx"> 
</span><del>-        server2 = Server(&quot;B&quot;, &quot;http://127.0.0.1:8108&quot;, &quot;B&quot;, False)
-        Servers.addServer(server2)
</del><ins>+        # Store 2
+        serversDB2 = ServersDB()
+        server2a = Server(&quot;A&quot;, &quot;http://127.0.0.1:8008&quot;, &quot;A&quot;, False)
+        serversDB2.addServer(server2a)
+        server2b = Server(&quot;B&quot;, &quot;http://127.0.0.1:8108&quot;, &quot;B&quot;, True)
+        serversDB2.addServer(server2b)
</ins><span class="cx"> 
</span><del>-        self._sqlCalendarStore1 = yield self.makeStore(theStoreBuilder, True, server1, server2)
-        self._sqlCalendarStore2 = yield self.makeStore(self.theStoreBuilder2, False, server1, server2)
</del><ins>+        self.store2 = yield self.buildStore(self.theStoreBuilder2)
+        directory2 = buildTestDirectory(
+            self.store2, self.mktemp(), serversDB=serversDB2
+        )
</ins><span class="cx"> 
</span><del>-        FakeConduitRequest.addServerStore(server1, self._sqlCalendarStore1)
-        FakeConduitRequest.addServerStore(server2, self._sqlCalendarStore2)
</del><ins>+        self.store2.setDirectoryService(directory2)
+        self.store2.queryCacher = None     # Cannot use query caching
+        self.store2.conduit = self.makeConduit(self.store2)
</ins><span class="cx"> 
</span><ins>+        FakeConduitRequest.addServerStore(server1a, self.store)
+        FakeConduitRequest.addServerStore(server2b, self.store2)
</ins><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Return a store for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore1
</del><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def configure(self):
+        super(MultiStoreConduitTest, self).configure()
+        self.config.Servers.Enabled = True
+
+
</ins><span class="cx">     def otherStoreUnderTest(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Return a store for testing.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        return self._sqlCalendarStore2
</del><ins>+        return self.store2
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def newOtherTransaction(self):
</span><span class="cx">         assert self.otherTransaction is None
</span><span class="cx">         store2 = self.otherStoreUnderTest()
</span><span class="cx">         txn = store2.newTransaction()
</span><ins>+
</ins><span class="cx">         @inlineCallbacks
</span><span class="cx">         def maybeCommitThis():
</span><span class="cx">             try:
</span><span class="lines">@@ -165,50 +183,7 @@
</span><span class="cx">         self.otherTransaction = None
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    @inlineCallbacks
-    def makeStore(self, builder, internal, server1, server2):
</del><span class="cx"> 
</span><del>-        directory = self.makeDirectory(internal, server1, server2)
-        store = yield builder.buildStore(self, self.notifierFactory, directory)
-        store.queryCacher = None     # Cannot use query caching
-        store.conduit = self.makeConduit(store)
-        returnValue(store)
-
-
-    def makeDirectory(self, internal, server1, server2):
-
-        directory = TestCalendarStoreDirectoryService()
-
-        # User accounts
-        for ctr in range(1, 100):
-            directory.addRecord(TestCalendarStoreDirectoryRecord(
-                &quot;user%02d&quot; % (ctr,),
-                (&quot;user%02d&quot; % (ctr,),),
-                &quot;User %02d&quot; % (ctr,),
-                frozenset((
-                    &quot;urn:uuid:user%02d&quot; % (ctr,),
-                    &quot;mailto:user%02d@example.com&quot; % (ctr,),
-                )),
-                thisServer=internal,
-                server=server1
-            ))
-
-        for ctr in range(1, 100):
-            directory.addRecord(TestCalendarStoreDirectoryRecord(
-                &quot;puser{:02d}&quot;.format(ctr),
-                (&quot;puser{:02d}&quot;.format(ctr),),
-                &quot;Puser {:02d}&quot;.format(ctr),
-                frozenset((
-                    &quot;urn:uuid:puser{:02d}&quot;.format(ctr),
-                    &quot;mailto:puser{:02d}@example.com&quot;.format(ctr),
-                )),
-                thisServer=not internal,
-                server=server2
-            ))
-
-        return directory
-
-
</del><span class="cx">     def makeConduit(self, store):
</span><span class="cx">         conduit = PoddingConduit(store)
</span><span class="cx">         conduit.conduitRequestClass = FakeConduitRequest
</span><span class="lines">@@ -223,6 +198,7 @@
</span><span class="cx">         yield calendar.inviteUserToShare(shareeGUID, _BIND_MODE_WRITE, &quot;shared&quot;, shareName=&quot;shared-calendar&quot;)
</span><span class="cx">         yield self.commit()
</span><span class="cx"> 
</span><ins>+        # ACK: home2 is None
</ins><span class="cx">         home2 = yield self.homeUnderTest(txn=self.newOtherTransaction(), name=shareeGUID)
</span><span class="cx">         yield home2.acceptShare(&quot;shared-calendar&quot;)
</span><span class="cx">         yield self.otherCommit()
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoretestaccountsaccountsxml"></a>
<div class="addfile"><h4>Added: CalendarServer/trunk/txdav/common/datastore/test/accounts/accounts.xml (0 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/test/accounts/accounts.xml                                (rev 0)
+++ CalendarServer/trunk/txdav/common/datastore/test/accounts/accounts.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -0,0 +1,1829 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;!--
+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ --&gt;
+
+&lt;!DOCTYPE accounts SYSTEM &quot;accounts.dtd&quot;&gt;
+
+&lt;directory realm=&quot;Test Realm&quot;&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;D11F03A0-97EA-48AF-9A6C-FAC7F3975766&lt;/uid&gt;
+    &lt;short-name&gt;admin&lt;/short-name&gt;
+    &lt;password&gt;nimda&lt;/password&gt;
+    &lt;full-name&gt;Administrators&lt;/full-name&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
+    &lt;guid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/guid&gt;
+    &lt;short-name&gt;wsanchez&lt;/short-name&gt;
+    &lt;password&gt;zehcnasw&lt;/password&gt;
+    &lt;full-name&gt;Wilfredo Sanchez&lt;/full-name&gt;
+    &lt;email&gt;wsanchez@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
+    &lt;guid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/guid&gt;
+    &lt;short-name&gt;cdaboo&lt;/short-name&gt;
+    &lt;password&gt;oobadc&lt;/password&gt;
+    &lt;full-name&gt;Cyrus Daboo&lt;/full-name&gt;
+    &lt;email&gt;cdaboo@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/uid&gt;
+    &lt;short-name&gt;lecroy&lt;/short-name&gt;
+    &lt;password&gt;yorcel&lt;/password&gt;
+    &lt;full-name&gt;Chris Lecroy&lt;/full-name&gt;
+    &lt;email&gt;lecroy@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
+    &lt;short-name&gt;dreid&lt;/short-name&gt;
+    &lt;password&gt;dierd&lt;/password&gt;
+    &lt;full-name&gt;David Reid&lt;/full-name&gt;
+    &lt;email&gt;dreid@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;8E04787E-336D-41ED-A70B-D233AD0DCE6F&lt;/uid&gt;
+    &lt;guid&gt;8E04787E-336D-41ED-A70B-D233AD0DCE6F&lt;/guid&gt;
+    &lt;short-name&gt;doublequotes&lt;/short-name&gt;
+    &lt;password&gt;setouqelbuod&lt;/password&gt;
+    &lt;full-name&gt;Double &quot;quotey&quot; Quotes&lt;/full-name&gt;
+    &lt;email&gt;doublequotes@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;37DB0C90-4DB1-4932-BC69-3DAB66F374F5&lt;/uid&gt;
+    &lt;guid&gt;37DB0C90-4DB1-4932-BC69-3DAB66F374F5&lt;/guid&gt;
+    &lt;short-name&gt;purgeuser&lt;/short-name&gt;
+    &lt;password&gt;purgeuser&lt;/password&gt;
+    &lt;full-name&gt;Purge User&lt;/full-name&gt;
+    &lt;email&gt;purgeuser@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;uid1&lt;/uid&gt;
+    &lt;short-name&gt;uid1&lt;/short-name&gt;
+    &lt;password&gt;uid1&lt;/password&gt;
+    &lt;full-name&gt;uid One&lt;/full-name&gt;
+    &lt;email&gt;uid1@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;uid2&lt;/uid&gt;
+    &lt;short-name&gt;uid2&lt;/short-name&gt;
+    &lt;password&gt;uid2&lt;/password&gt;
+    &lt;full-name&gt;uid Two&lt;/full-name&gt;
+    &lt;email&gt;uid2@example.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home1&lt;/uid&gt;
+    &lt;short-name&gt;home1&lt;/short-name&gt;
+    &lt;password&gt;home1&lt;/password&gt;
+    &lt;full-name&gt;Home One&lt;/full-name&gt;
+    &lt;email&gt;home1@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home2&lt;/uid&gt;
+    &lt;short-name&gt;home2&lt;/short-name&gt;
+    &lt;password&gt;home2&lt;/password&gt;
+    &lt;full-name&gt;Home Two&lt;/full-name&gt;
+    &lt;email&gt;home2@example.com&lt;/email&gt;
+  &lt;/record&gt;
+    &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home3&lt;/uid&gt;
+    &lt;short-name&gt;home3&lt;/short-name&gt;
+    &lt;password&gt;home3&lt;/password&gt;
+    &lt;full-name&gt;Home Three&lt;/full-name&gt;
+    &lt;email&gt;home3@example.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home_splits&lt;/uid&gt;
+    &lt;short-name&gt;home_splits&lt;/short-name&gt;
+    &lt;password&gt;home_splits&lt;/password&gt;
+    &lt;full-name&gt;Home Splits&lt;/full-name&gt;
+    &lt;email&gt;home_splits@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home_no_splits&lt;/uid&gt;
+    &lt;short-name&gt;home_no_splits&lt;/short-name&gt;
+    &lt;password&gt;home_no_splits&lt;/password&gt;
+    &lt;full-name&gt;Home NoSplits&lt;/full-name&gt;
+    &lt;email&gt;home_no_splits@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home_defaults&lt;/uid&gt;
+    &lt;short-name&gt;home_defaults&lt;/short-name&gt;
+    &lt;password&gt;home_defaults&lt;/password&gt;
+    &lt;full-name&gt;Home Defaults&lt;/full-name&gt;
+    &lt;email&gt;home_defaults@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home_splits_shared&lt;/uid&gt;
+    &lt;short-name&gt;home_splits_shared&lt;/short-name&gt;
+    &lt;password&gt;home_splits_shared&lt;/password&gt;
+    &lt;full-name&gt;Home SplitsShared&lt;/full-name&gt;
+    &lt;email&gt;home_splits_shared@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;new-home&lt;/uid&gt;
+    &lt;short-name&gt;new-home&lt;/short-name&gt;
+    &lt;password&gt;new-home&lt;/password&gt;
+    &lt;full-name&gt;New Home&lt;/full-name&gt;
+    &lt;email&gt;new-home@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home_provision1&lt;/uid&gt;
+    &lt;short-name&gt;home_provision1&lt;/short-name&gt;
+    &lt;password&gt;home_provision1&lt;/password&gt;
+    &lt;full-name&gt;Home Provision1&lt;/full-name&gt;
+    &lt;email&gt;home_provision1@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home_provision2&lt;/uid&gt;
+    &lt;short-name&gt;home_provision2&lt;/short-name&gt;
+    &lt;password&gt;home_provision2&lt;/password&gt;
+    &lt;full-name&gt;Home Provision2&lt;/full-name&gt;
+    &lt;email&gt;home_provision2@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;home_attachments&lt;/uid&gt;
+    &lt;short-name&gt;home_attachments&lt;/short-name&gt;
+    &lt;password&gt;home_attachments&lt;/password&gt;
+    &lt;full-name&gt;Home Attachments&lt;/full-name&gt;
+    &lt;email&gt;home_attachments@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;xyzzy&lt;/uid&gt;
+    &lt;short-name&gt;xyzzy&lt;/short-name&gt;
+    &lt;password&gt;xyzzy&lt;/password&gt;
+    &lt;full-name&gt;xyzzy&lt;/full-name&gt;
+    &lt;email&gt;xyzzy@example.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;543D28BA-F74F-4D5F-9243-B3E3A61171E5&lt;/uid&gt;
+    &lt;short-name&gt;nocalendar&lt;/short-name&gt;
+    &lt;password&gt;radnelacon&lt;/password&gt;
+    &lt;full-name&gt;No Calendar&lt;/full-name&gt;
+    &lt;email&gt;nocalendar@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;7423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
+    &lt;short-name&gt;usera&lt;/short-name&gt;
+    &lt;password&gt;a&lt;/password&gt;
+    &lt;full-name&gt;a&lt;/full-name&gt;
+    &lt;email&gt;a@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;8A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
+    &lt;short-name&gt;userb&lt;/short-name&gt;
+    &lt;password&gt;b&lt;/password&gt;
+    &lt;full-name&gt;b&lt;/full-name&gt;
+    &lt;email&gt;b@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD2&lt;/uid&gt;
+    &lt;short-name&gt;userc&lt;/short-name&gt;
+    &lt;password&gt;c&lt;/password&gt;
+    &lt;full-name&gt;c&lt;/full-name&gt;
+    &lt;email&gt;c@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;9E1FFAC4-3CCD-45A1-8272-D161C92D2EEE&lt;/uid&gt;
+    &lt;short-name&gt;usercalonly&lt;/short-name&gt;
+    &lt;password&gt;a&lt;/password&gt;
+    &lt;full-name&gt;a calonly&lt;/full-name&gt;
+    &lt;email&gt;a-calonly@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;7678EC8A-A069-4E82-9066-7279C6718507&lt;/uid&gt;
+    &lt;short-name&gt;useradbkonly&lt;/short-name&gt;
+    &lt;password&gt;a&lt;/password&gt;
+    &lt;full-name&gt;a adbkonly&lt;/full-name&gt;
+    &lt;email&gt;a-adbkonly@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;320B73A1-46E2-4180-9563-782DFDBE1F63&lt;/uid&gt;
+    &lt;short-name&gt;nonascii&lt;/short-name&gt;
+    &lt;short-name&gt;nonascii佐藤&lt;/short-name&gt;
+    &lt;password&gt;a&lt;/password&gt;
+    &lt;full-name&gt;佐藤佐藤佐藤&lt;/full-name&gt;
+    &lt;email&gt;nonascii@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;FC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
+    &lt;short-name&gt;delegator&lt;/short-name&gt;
+    &lt;password&gt;a&lt;/password&gt;
+    &lt;full-name&gt;Calendar Delegator&lt;/full-name&gt;
+    &lt;email&gt;calendardelegator@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;EC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
+    &lt;short-name&gt;occasionaldelegate&lt;/short-name&gt;
+    &lt;password&gt;a&lt;/password&gt;
+    &lt;full-name&gt;Occasional Delegate&lt;/full-name&gt;
+    &lt;email&gt;occasional@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;46D9D716-CBEE-490F-907A-66FA6C3767FF&lt;/uid&gt;
+    &lt;short-name&gt;delegateviagroup&lt;/short-name&gt;
+    &lt;password&gt;a&lt;/password&gt;
+    &lt;full-name&gt;Delegate Via Group&lt;/full-name&gt;
+    &lt;email&gt;delegateviagroup@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;00599DAF-3E75-42DD-9DB7-52617E79943F&lt;/uid&gt;
+    &lt;short-name&gt;delegategroup&lt;/short-name&gt;
+    &lt;full-name&gt;Delegate Group&lt;/full-name&gt;
+    &lt;member-uid&gt;46D9D716-CBEE-490F-907A-66FA6C3767FF&lt;/member-uid&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;__wsanchez1__&lt;/uid&gt;
+    &lt;short-name&gt;wsanchez1&lt;/short-name&gt;
+    &lt;short-name&gt;wilfredo_sanchez&lt;/short-name&gt;
+    &lt;password&gt;zehcnasw&lt;/password&gt;
+    &lt;full-name&gt;Wilfredo Sanchez&lt;/full-name&gt;
+    &lt;email&gt;wsanchez@bitbucket.calendarserver.org&lt;/email&gt;
+    &lt;email&gt;wsanchez@devnull.twistedmatrix.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;__glyph1__&lt;/uid&gt;
+    &lt;short-name&gt;glyph1&lt;/short-name&gt;
+    &lt;password&gt;hpylg&lt;/password&gt;
+    &lt;full-name&gt;Glyph Lefkowitz&lt;/full-name&gt;
+    &lt;email&gt;glyph@bitbucket.calendarserver.org&lt;/email&gt;
+    &lt;email&gt;glyph@devnull.twistedmatrix.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;__sagen1__&lt;/uid&gt;
+    &lt;short-name&gt;sagen&lt;/short-name&gt;
+    &lt;short-name&gt;sagen1&lt;/short-name&gt;
+    &lt;password&gt;negas&lt;/password&gt;
+    &lt;full-name&gt;Morgen Sagen&lt;/full-name&gt;
+    &lt;email&gt;sagen@bitbucket.calendarserver.org&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;__cdaboo1__&lt;/uid&gt;
+    &lt;short-name&gt;cdaboo1&lt;/short-name&gt;
+    &lt;password&gt;suryc&lt;/password&gt;
+    &lt;full-name&gt;Cyrus Daboo&lt;/full-name&gt;
+    &lt;email&gt;cdaboo@bitbucket.calendarserver.org&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;__dre1__&lt;/uid&gt;
+    &lt;short-name&gt;dre1&lt;/short-name&gt;
+    &lt;short-name&gt;dre&lt;/short-name&gt;
+    &lt;password&gt;erd&lt;/password&gt;
+    &lt;full-name&gt;Andre LaBranche&lt;/full-name&gt;
+    &lt;email&gt;dre@bitbucket.calendarserver.org&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;__top_group_1__&lt;/uid&gt;
+    &lt;short-name&gt;top-group-1&lt;/short-name&gt;
+    &lt;full-name&gt;Top Group 1&lt;/full-name&gt;
+    &lt;email&gt;topgroup1@example.com&lt;/email&gt;
+    &lt;member-uid&gt;__wsanchez1__&lt;/member-uid&gt;
+    &lt;member-uid&gt;__glyph1__&lt;/member-uid&gt;
+    &lt;member-uid&gt;__sub_group_1__&lt;/member-uid&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;__sub_group_1__&lt;/uid&gt;
+    &lt;short-name&gt;sub-group-1&lt;/short-name&gt;
+    &lt;full-name&gt;Sub Group 1&lt;/full-name&gt;
+    &lt;email&gt;subgroup1@example.com&lt;/email&gt;
+    &lt;member-uid&gt;__sagen1__&lt;/member-uid&gt;
+    &lt;member-uid&gt;__cdaboo1__&lt;/member-uid&gt;
+  &lt;/record&gt;
+
+
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
+    &lt;short-name&gt;managers&lt;/short-name&gt;
+    &lt;password&gt;managers&lt;/password&gt;
+    &lt;full-name&gt;Managers&lt;/full-name&gt;
+      &lt;member-uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;admin&lt;/uid&gt;
+    &lt;short-name&gt;admin&lt;/short-name&gt;
+    &lt;password&gt;admin&lt;/password&gt;
+    &lt;full-name&gt;Administrators&lt;/full-name&gt;
+      &lt;member-uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;grunts&lt;/uid&gt;
+    &lt;short-name&gt;grunts&lt;/short-name&gt;
+    &lt;password&gt;grunts&lt;/password&gt;
+    &lt;full-name&gt;We do all the work&lt;/full-name&gt;
+      &lt;member-uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member-uid&gt;
+      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
+      &lt;member-uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;right_coast&lt;/uid&gt;
+    &lt;short-name&gt;right_coast&lt;/short-name&gt;
+    &lt;password&gt;right_coast&lt;/password&gt;
+    &lt;full-name&gt;East Coast&lt;/full-name&gt;
+      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;left_coast&lt;/uid&gt;
+    &lt;short-name&gt;left_coast&lt;/short-name&gt;
+    &lt;password&gt;left_coast&lt;/password&gt;
+    &lt;full-name&gt;West Coast&lt;/full-name&gt;
+      &lt;member-uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member-uid&gt;
+      &lt;member-uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/member-uid&gt;
+      &lt;member-uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;both_coasts&lt;/uid&gt;
+    &lt;short-name&gt;both_coasts&lt;/short-name&gt;
+    &lt;password&gt;both_coasts&lt;/password&gt;
+    &lt;full-name&gt;Both Coasts&lt;/full-name&gt;
+      &lt;member-uid&gt;right_coast&lt;/member-uid&gt;
+      &lt;member-uid&gt;left_coast&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;recursive1_coasts&lt;/uid&gt;
+    &lt;short-name&gt;recursive1_coasts&lt;/short-name&gt;
+    &lt;password&gt;recursive1_coasts&lt;/password&gt;
+    &lt;full-name&gt;Recursive1 Coasts&lt;/full-name&gt;
+      &lt;member-uid&gt;recursive2_coasts&lt;/member-uid&gt;
+      &lt;member-uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;recursive2_coasts&lt;/uid&gt;
+    &lt;short-name&gt;recursive2_coasts&lt;/short-name&gt;
+    &lt;password&gt;recursive2_coasts&lt;/password&gt;
+    &lt;full-name&gt;Recursive2 Coasts&lt;/full-name&gt;
+      &lt;member-uid&gt;recursive1_coasts&lt;/member-uid&gt;
+      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;group&quot;&gt;
+    &lt;uid&gt;non_calendar_group&lt;/uid&gt;
+    &lt;short-name&gt;non_calendar_group&lt;/short-name&gt;
+    &lt;password&gt;non_calendar_group&lt;/password&gt;
+    &lt;full-name&gt;Non-calendar group&lt;/full-name&gt;
+      &lt;member-uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member-uid&gt;
+      &lt;member-uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/member-uid&gt;
+  &lt;/record&gt;
+
+  &lt;!-- Calverify test records --&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&lt;/uid&gt;
+    &lt;guid&gt;D46F3D71-04B7-43C2-A7B6-6F92F92E61D0&lt;/guid&gt;
+    &lt;short-name&gt;example1&lt;/short-name&gt;
+    &lt;password&gt;example&lt;/password&gt;
+    &lt;full-name&gt;Example User1&lt;/full-name&gt;
+    &lt;email&gt;example1@example.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;47B16BB4-DB5F-4BF6-85FE-A7DA54230F92&lt;/uid&gt;
+    &lt;guid&gt;47B16BB4-DB5F-4BF6-85FE-A7DA54230F92&lt;/guid&gt;
+    &lt;short-name&gt;example2&lt;/short-name&gt;
+    &lt;password&gt;example&lt;/password&gt;
+    &lt;full-name&gt;Example User2&lt;/full-name&gt;
+    &lt;email&gt;example2@example.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;AC478592-7783-44D1-B2AE-52359B4E8415&lt;/uid&gt;
+    &lt;guid&gt;AC478592-7783-44D1-B2AE-52359B4E8415&lt;/guid&gt;
+    &lt;short-name&gt;example3&lt;/short-name&gt;
+    &lt;password&gt;example&lt;/password&gt;
+    &lt;full-name&gt;Example User3&lt;/full-name&gt;
+    &lt;email&gt;example3@example.com&lt;/email&gt;
+  &lt;/record&gt;
+
+  &lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;A89E3A97-1658-4E45-A185-479F3E49D446&lt;/uid&gt;
+    &lt;guid&gt;A89E3A97-1658-4E45-A185-479F3E49D446&lt;/guid&gt;
+    &lt;short-name&gt;example4&lt;/short-name&gt;
+    &lt;password&gt;example&lt;/password&gt;
+    &lt;full-name&gt;Example User4&lt;/full-name&gt;
+    &lt;email&gt;example4@example.com&lt;/email&gt;
+  &lt;/record&gt;
+
+
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user01&lt;/uid&gt;
+    &lt;short-name&gt;user01&lt;/short-name&gt;
+    &lt;password&gt;user01&lt;/password&gt;
+    &lt;full-name&gt;User 01&lt;/full-name&gt;
+    &lt;email&gt;user01@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user02&lt;/uid&gt;
+    &lt;short-name&gt;user02&lt;/short-name&gt;
+    &lt;password&gt;user02&lt;/password&gt;
+    &lt;full-name&gt;User 02&lt;/full-name&gt;
+    &lt;email&gt;user02@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user03&lt;/uid&gt;
+    &lt;short-name&gt;user03&lt;/short-name&gt;
+    &lt;password&gt;user03&lt;/password&gt;
+    &lt;full-name&gt;User 03&lt;/full-name&gt;
+    &lt;email&gt;user03@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user04&lt;/uid&gt;
+    &lt;short-name&gt;user04&lt;/short-name&gt;
+    &lt;password&gt;user04&lt;/password&gt;
+    &lt;full-name&gt;User 04&lt;/full-name&gt;
+    &lt;email&gt;user04@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user05&lt;/uid&gt;
+    &lt;short-name&gt;user05&lt;/short-name&gt;
+    &lt;password&gt;user05&lt;/password&gt;
+    &lt;full-name&gt;User 05&lt;/full-name&gt;
+    &lt;email&gt;user05@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user06&lt;/uid&gt;
+    &lt;short-name&gt;user06&lt;/short-name&gt;
+    &lt;password&gt;user06&lt;/password&gt;
+    &lt;full-name&gt;User 06&lt;/full-name&gt;
+    &lt;email&gt;user06@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user07&lt;/uid&gt;
+    &lt;short-name&gt;user07&lt;/short-name&gt;
+    &lt;password&gt;user07&lt;/password&gt;
+    &lt;full-name&gt;User 07&lt;/full-name&gt;
+    &lt;email&gt;user07@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user08&lt;/uid&gt;
+    &lt;short-name&gt;user08&lt;/short-name&gt;
+    &lt;password&gt;user08&lt;/password&gt;
+    &lt;full-name&gt;User 08&lt;/full-name&gt;
+    &lt;email&gt;user08@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user09&lt;/uid&gt;
+    &lt;short-name&gt;user09&lt;/short-name&gt;
+    &lt;password&gt;user09&lt;/password&gt;
+    &lt;full-name&gt;User 09&lt;/full-name&gt;
+    &lt;email&gt;user09@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user10&lt;/uid&gt;
+    &lt;short-name&gt;user10&lt;/short-name&gt;
+    &lt;password&gt;user10&lt;/password&gt;
+    &lt;full-name&gt;User 10&lt;/full-name&gt;
+    &lt;email&gt;user10@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user11&lt;/uid&gt;
+    &lt;short-name&gt;user11&lt;/short-name&gt;
+    &lt;password&gt;user11&lt;/password&gt;
+    &lt;full-name&gt;User 11&lt;/full-name&gt;
+    &lt;email&gt;user11@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user12&lt;/uid&gt;
+    &lt;short-name&gt;user12&lt;/short-name&gt;
+    &lt;password&gt;user12&lt;/password&gt;
+    &lt;full-name&gt;User 12&lt;/full-name&gt;
+    &lt;email&gt;user12@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user13&lt;/uid&gt;
+    &lt;short-name&gt;user13&lt;/short-name&gt;
+    &lt;password&gt;user13&lt;/password&gt;
+    &lt;full-name&gt;User 13&lt;/full-name&gt;
+    &lt;email&gt;user13@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user14&lt;/uid&gt;
+    &lt;short-name&gt;user14&lt;/short-name&gt;
+    &lt;password&gt;user14&lt;/password&gt;
+    &lt;full-name&gt;User 14&lt;/full-name&gt;
+    &lt;email&gt;user14@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user15&lt;/uid&gt;
+    &lt;short-name&gt;user15&lt;/short-name&gt;
+    &lt;password&gt;user15&lt;/password&gt;
+    &lt;full-name&gt;User 15&lt;/full-name&gt;
+    &lt;email&gt;user15@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user16&lt;/uid&gt;
+    &lt;short-name&gt;user16&lt;/short-name&gt;
+    &lt;password&gt;user16&lt;/password&gt;
+    &lt;full-name&gt;User 16&lt;/full-name&gt;
+    &lt;email&gt;user16@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user17&lt;/uid&gt;
+    &lt;short-name&gt;user17&lt;/short-name&gt;
+    &lt;password&gt;user17&lt;/password&gt;
+    &lt;full-name&gt;User 17&lt;/full-name&gt;
+    &lt;email&gt;user17@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user18&lt;/uid&gt;
+    &lt;short-name&gt;user18&lt;/short-name&gt;
+    &lt;password&gt;user18&lt;/password&gt;
+    &lt;full-name&gt;User 18&lt;/full-name&gt;
+    &lt;email&gt;user18@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user19&lt;/uid&gt;
+    &lt;short-name&gt;user19&lt;/short-name&gt;
+    &lt;password&gt;user19&lt;/password&gt;
+    &lt;full-name&gt;User 19&lt;/full-name&gt;
+    &lt;email&gt;user19@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user20&lt;/uid&gt;
+    &lt;short-name&gt;user20&lt;/short-name&gt;
+    &lt;password&gt;user20&lt;/password&gt;
+    &lt;full-name&gt;User 20&lt;/full-name&gt;
+    &lt;email&gt;user20@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user21&lt;/uid&gt;
+    &lt;short-name&gt;user21&lt;/short-name&gt;
+    &lt;password&gt;user21&lt;/password&gt;
+    &lt;full-name&gt;User 21&lt;/full-name&gt;
+    &lt;email&gt;user21@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user22&lt;/uid&gt;
+    &lt;short-name&gt;user22&lt;/short-name&gt;
+    &lt;password&gt;user22&lt;/password&gt;
+    &lt;full-name&gt;User 22&lt;/full-name&gt;
+    &lt;email&gt;user22@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user23&lt;/uid&gt;
+    &lt;short-name&gt;user23&lt;/short-name&gt;
+    &lt;password&gt;user23&lt;/password&gt;
+    &lt;full-name&gt;User 23&lt;/full-name&gt;
+    &lt;email&gt;user23@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user24&lt;/uid&gt;
+    &lt;short-name&gt;user24&lt;/short-name&gt;
+    &lt;password&gt;user24&lt;/password&gt;
+    &lt;full-name&gt;User 24&lt;/full-name&gt;
+    &lt;email&gt;user24@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user25&lt;/uid&gt;
+    &lt;short-name&gt;user25&lt;/short-name&gt;
+    &lt;password&gt;user25&lt;/password&gt;
+    &lt;full-name&gt;User 25&lt;/full-name&gt;
+    &lt;email&gt;user25@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user26&lt;/uid&gt;
+    &lt;short-name&gt;user26&lt;/short-name&gt;
+    &lt;password&gt;user26&lt;/password&gt;
+    &lt;full-name&gt;User 26&lt;/full-name&gt;
+    &lt;email&gt;user26@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user27&lt;/uid&gt;
+    &lt;short-name&gt;user27&lt;/short-name&gt;
+    &lt;password&gt;user27&lt;/password&gt;
+    &lt;full-name&gt;User 27&lt;/full-name&gt;
+    &lt;email&gt;user27@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user28&lt;/uid&gt;
+    &lt;short-name&gt;user28&lt;/short-name&gt;
+    &lt;password&gt;user28&lt;/password&gt;
+    &lt;full-name&gt;User 28&lt;/full-name&gt;
+    &lt;email&gt;user28@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user29&lt;/uid&gt;
+    &lt;short-name&gt;user29&lt;/short-name&gt;
+    &lt;password&gt;user29&lt;/password&gt;
+    &lt;full-name&gt;User 29&lt;/full-name&gt;
+    &lt;email&gt;user29@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user30&lt;/uid&gt;
+    &lt;short-name&gt;user30&lt;/short-name&gt;
+    &lt;password&gt;user30&lt;/password&gt;
+    &lt;full-name&gt;User 30&lt;/full-name&gt;
+    &lt;email&gt;user30@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user31&lt;/uid&gt;
+    &lt;short-name&gt;user31&lt;/short-name&gt;
+    &lt;password&gt;user31&lt;/password&gt;
+    &lt;full-name&gt;User 31&lt;/full-name&gt;
+    &lt;email&gt;user31@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user32&lt;/uid&gt;
+    &lt;short-name&gt;user32&lt;/short-name&gt;
+    &lt;password&gt;user32&lt;/password&gt;
+    &lt;full-name&gt;User 32&lt;/full-name&gt;
+    &lt;email&gt;user32@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user33&lt;/uid&gt;
+    &lt;short-name&gt;user33&lt;/short-name&gt;
+    &lt;password&gt;user33&lt;/password&gt;
+    &lt;full-name&gt;User 33&lt;/full-name&gt;
+    &lt;email&gt;user33@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user34&lt;/uid&gt;
+    &lt;short-name&gt;user34&lt;/short-name&gt;
+    &lt;password&gt;user34&lt;/password&gt;
+    &lt;full-name&gt;User 34&lt;/full-name&gt;
+    &lt;email&gt;user34@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user35&lt;/uid&gt;
+    &lt;short-name&gt;user35&lt;/short-name&gt;
+    &lt;password&gt;user35&lt;/password&gt;
+    &lt;full-name&gt;User 35&lt;/full-name&gt;
+    &lt;email&gt;user35@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user36&lt;/uid&gt;
+    &lt;short-name&gt;user36&lt;/short-name&gt;
+    &lt;password&gt;user36&lt;/password&gt;
+    &lt;full-name&gt;User 36&lt;/full-name&gt;
+    &lt;email&gt;user36@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user37&lt;/uid&gt;
+    &lt;short-name&gt;user37&lt;/short-name&gt;
+    &lt;password&gt;user37&lt;/password&gt;
+    &lt;full-name&gt;User 37&lt;/full-name&gt;
+    &lt;email&gt;user37@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user38&lt;/uid&gt;
+    &lt;short-name&gt;user38&lt;/short-name&gt;
+    &lt;password&gt;user38&lt;/password&gt;
+    &lt;full-name&gt;User 38&lt;/full-name&gt;
+    &lt;email&gt;user38@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user39&lt;/uid&gt;
+    &lt;short-name&gt;user39&lt;/short-name&gt;
+    &lt;password&gt;user39&lt;/password&gt;
+    &lt;full-name&gt;User 39&lt;/full-name&gt;
+    &lt;email&gt;user39@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user40&lt;/uid&gt;
+    &lt;short-name&gt;user40&lt;/short-name&gt;
+    &lt;password&gt;user40&lt;/password&gt;
+    &lt;full-name&gt;User 40&lt;/full-name&gt;
+    &lt;email&gt;user40@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user41&lt;/uid&gt;
+    &lt;short-name&gt;user41&lt;/short-name&gt;
+    &lt;password&gt;user41&lt;/password&gt;
+    &lt;full-name&gt;User 41&lt;/full-name&gt;
+    &lt;email&gt;user41@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user42&lt;/uid&gt;
+    &lt;short-name&gt;user42&lt;/short-name&gt;
+    &lt;password&gt;user42&lt;/password&gt;
+    &lt;full-name&gt;User 42&lt;/full-name&gt;
+    &lt;email&gt;user42@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user43&lt;/uid&gt;
+    &lt;short-name&gt;user43&lt;/short-name&gt;
+    &lt;password&gt;user43&lt;/password&gt;
+    &lt;full-name&gt;User 43&lt;/full-name&gt;
+    &lt;email&gt;user43@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user44&lt;/uid&gt;
+    &lt;short-name&gt;user44&lt;/short-name&gt;
+    &lt;password&gt;user44&lt;/password&gt;
+    &lt;full-name&gt;User 44&lt;/full-name&gt;
+    &lt;email&gt;user44@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user45&lt;/uid&gt;
+    &lt;short-name&gt;user45&lt;/short-name&gt;
+    &lt;password&gt;user45&lt;/password&gt;
+    &lt;full-name&gt;User 45&lt;/full-name&gt;
+    &lt;email&gt;user45@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user46&lt;/uid&gt;
+    &lt;short-name&gt;user46&lt;/short-name&gt;
+    &lt;password&gt;user46&lt;/password&gt;
+    &lt;full-name&gt;User 46&lt;/full-name&gt;
+    &lt;email&gt;user46@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user47&lt;/uid&gt;
+    &lt;short-name&gt;user47&lt;/short-name&gt;
+    &lt;password&gt;user47&lt;/password&gt;
+    &lt;full-name&gt;User 47&lt;/full-name&gt;
+    &lt;email&gt;user47@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user48&lt;/uid&gt;
+    &lt;short-name&gt;user48&lt;/short-name&gt;
+    &lt;password&gt;user48&lt;/password&gt;
+    &lt;full-name&gt;User 48&lt;/full-name&gt;
+    &lt;email&gt;user48@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user49&lt;/uid&gt;
+    &lt;short-name&gt;user49&lt;/short-name&gt;
+    &lt;password&gt;user49&lt;/password&gt;
+    &lt;full-name&gt;User 49&lt;/full-name&gt;
+    &lt;email&gt;user49@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user50&lt;/uid&gt;
+    &lt;short-name&gt;user50&lt;/short-name&gt;
+    &lt;password&gt;user50&lt;/password&gt;
+    &lt;full-name&gt;User 50&lt;/full-name&gt;
+    &lt;email&gt;user50@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user51&lt;/uid&gt;
+    &lt;short-name&gt;user51&lt;/short-name&gt;
+    &lt;password&gt;user51&lt;/password&gt;
+    &lt;full-name&gt;User 51&lt;/full-name&gt;
+    &lt;email&gt;user51@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user52&lt;/uid&gt;
+    &lt;short-name&gt;user52&lt;/short-name&gt;
+    &lt;password&gt;user52&lt;/password&gt;
+    &lt;full-name&gt;User 52&lt;/full-name&gt;
+    &lt;email&gt;user52@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user53&lt;/uid&gt;
+    &lt;short-name&gt;user53&lt;/short-name&gt;
+    &lt;password&gt;user53&lt;/password&gt;
+    &lt;full-name&gt;User 53&lt;/full-name&gt;
+    &lt;email&gt;user53@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user54&lt;/uid&gt;
+    &lt;short-name&gt;user54&lt;/short-name&gt;
+    &lt;password&gt;user54&lt;/password&gt;
+    &lt;full-name&gt;User 54&lt;/full-name&gt;
+    &lt;email&gt;user54@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user55&lt;/uid&gt;
+    &lt;short-name&gt;user55&lt;/short-name&gt;
+    &lt;password&gt;user55&lt;/password&gt;
+    &lt;full-name&gt;User 55&lt;/full-name&gt;
+    &lt;email&gt;user55@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user56&lt;/uid&gt;
+    &lt;short-name&gt;user56&lt;/short-name&gt;
+    &lt;password&gt;user56&lt;/password&gt;
+    &lt;full-name&gt;User 56&lt;/full-name&gt;
+    &lt;email&gt;user56@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user57&lt;/uid&gt;
+    &lt;short-name&gt;user57&lt;/short-name&gt;
+    &lt;password&gt;user57&lt;/password&gt;
+    &lt;full-name&gt;User 57&lt;/full-name&gt;
+    &lt;email&gt;user57@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user58&lt;/uid&gt;
+    &lt;short-name&gt;user58&lt;/short-name&gt;
+    &lt;password&gt;user58&lt;/password&gt;
+    &lt;full-name&gt;User 58&lt;/full-name&gt;
+    &lt;email&gt;user58@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user59&lt;/uid&gt;
+    &lt;short-name&gt;user59&lt;/short-name&gt;
+    &lt;password&gt;user59&lt;/password&gt;
+    &lt;full-name&gt;User 59&lt;/full-name&gt;
+    &lt;email&gt;user59@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user60&lt;/uid&gt;
+    &lt;short-name&gt;user60&lt;/short-name&gt;
+    &lt;password&gt;user60&lt;/password&gt;
+    &lt;full-name&gt;User 60&lt;/full-name&gt;
+    &lt;email&gt;user60@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user61&lt;/uid&gt;
+    &lt;short-name&gt;user61&lt;/short-name&gt;
+    &lt;password&gt;user61&lt;/password&gt;
+    &lt;full-name&gt;User 61&lt;/full-name&gt;
+    &lt;email&gt;user61@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user62&lt;/uid&gt;
+    &lt;short-name&gt;user62&lt;/short-name&gt;
+    &lt;password&gt;user62&lt;/password&gt;
+    &lt;full-name&gt;User 62&lt;/full-name&gt;
+    &lt;email&gt;user62@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user63&lt;/uid&gt;
+    &lt;short-name&gt;user63&lt;/short-name&gt;
+    &lt;password&gt;user63&lt;/password&gt;
+    &lt;full-name&gt;User 63&lt;/full-name&gt;
+    &lt;email&gt;user63@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user64&lt;/uid&gt;
+    &lt;short-name&gt;user64&lt;/short-name&gt;
+    &lt;password&gt;user64&lt;/password&gt;
+    &lt;full-name&gt;User 64&lt;/full-name&gt;
+    &lt;email&gt;user64@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user65&lt;/uid&gt;
+    &lt;short-name&gt;user65&lt;/short-name&gt;
+    &lt;password&gt;user65&lt;/password&gt;
+    &lt;full-name&gt;User 65&lt;/full-name&gt;
+    &lt;email&gt;user65@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user66&lt;/uid&gt;
+    &lt;short-name&gt;user66&lt;/short-name&gt;
+    &lt;password&gt;user66&lt;/password&gt;
+    &lt;full-name&gt;User 66&lt;/full-name&gt;
+    &lt;email&gt;user66@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user67&lt;/uid&gt;
+    &lt;short-name&gt;user67&lt;/short-name&gt;
+    &lt;password&gt;user67&lt;/password&gt;
+    &lt;full-name&gt;User 67&lt;/full-name&gt;
+    &lt;email&gt;user67@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user68&lt;/uid&gt;
+    &lt;short-name&gt;user68&lt;/short-name&gt;
+    &lt;password&gt;user68&lt;/password&gt;
+    &lt;full-name&gt;User 68&lt;/full-name&gt;
+    &lt;email&gt;user68@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user69&lt;/uid&gt;
+    &lt;short-name&gt;user69&lt;/short-name&gt;
+    &lt;password&gt;user69&lt;/password&gt;
+    &lt;full-name&gt;User 69&lt;/full-name&gt;
+    &lt;email&gt;user69@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user70&lt;/uid&gt;
+    &lt;short-name&gt;user70&lt;/short-name&gt;
+    &lt;password&gt;user70&lt;/password&gt;
+    &lt;full-name&gt;User 70&lt;/full-name&gt;
+    &lt;email&gt;user70@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user71&lt;/uid&gt;
+    &lt;short-name&gt;user71&lt;/short-name&gt;
+    &lt;password&gt;user71&lt;/password&gt;
+    &lt;full-name&gt;User 71&lt;/full-name&gt;
+    &lt;email&gt;user71@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user72&lt;/uid&gt;
+    &lt;short-name&gt;user72&lt;/short-name&gt;
+    &lt;password&gt;user72&lt;/password&gt;
+    &lt;full-name&gt;User 72&lt;/full-name&gt;
+    &lt;email&gt;user72@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user73&lt;/uid&gt;
+    &lt;short-name&gt;user73&lt;/short-name&gt;
+    &lt;password&gt;user73&lt;/password&gt;
+    &lt;full-name&gt;User 73&lt;/full-name&gt;
+    &lt;email&gt;user73@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user74&lt;/uid&gt;
+    &lt;short-name&gt;user74&lt;/short-name&gt;
+    &lt;password&gt;user74&lt;/password&gt;
+    &lt;full-name&gt;User 74&lt;/full-name&gt;
+    &lt;email&gt;user74@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user75&lt;/uid&gt;
+    &lt;short-name&gt;user75&lt;/short-name&gt;
+    &lt;password&gt;user75&lt;/password&gt;
+    &lt;full-name&gt;User 75&lt;/full-name&gt;
+    &lt;email&gt;user75@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user76&lt;/uid&gt;
+    &lt;short-name&gt;user76&lt;/short-name&gt;
+    &lt;password&gt;user76&lt;/password&gt;
+    &lt;full-name&gt;User 76&lt;/full-name&gt;
+    &lt;email&gt;user76@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user77&lt;/uid&gt;
+    &lt;short-name&gt;user77&lt;/short-name&gt;
+    &lt;password&gt;user77&lt;/password&gt;
+    &lt;full-name&gt;User 77&lt;/full-name&gt;
+    &lt;email&gt;user77@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user78&lt;/uid&gt;
+    &lt;short-name&gt;user78&lt;/short-name&gt;
+    &lt;password&gt;user78&lt;/password&gt;
+    &lt;full-name&gt;User 78&lt;/full-name&gt;
+    &lt;email&gt;user78@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user79&lt;/uid&gt;
+    &lt;short-name&gt;user79&lt;/short-name&gt;
+    &lt;password&gt;user79&lt;/password&gt;
+    &lt;full-name&gt;User 79&lt;/full-name&gt;
+    &lt;email&gt;user79@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user80&lt;/uid&gt;
+    &lt;short-name&gt;user80&lt;/short-name&gt;
+    &lt;password&gt;user80&lt;/password&gt;
+    &lt;full-name&gt;User 80&lt;/full-name&gt;
+    &lt;email&gt;user80@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user81&lt;/uid&gt;
+    &lt;short-name&gt;user81&lt;/short-name&gt;
+    &lt;password&gt;user81&lt;/password&gt;
+    &lt;full-name&gt;User 81&lt;/full-name&gt;
+    &lt;email&gt;user81@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user82&lt;/uid&gt;
+    &lt;short-name&gt;user82&lt;/short-name&gt;
+    &lt;password&gt;user82&lt;/password&gt;
+    &lt;full-name&gt;User 82&lt;/full-name&gt;
+    &lt;email&gt;user82@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user83&lt;/uid&gt;
+    &lt;short-name&gt;user83&lt;/short-name&gt;
+    &lt;password&gt;user83&lt;/password&gt;
+    &lt;full-name&gt;User 83&lt;/full-name&gt;
+    &lt;email&gt;user83@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user84&lt;/uid&gt;
+    &lt;short-name&gt;user84&lt;/short-name&gt;
+    &lt;password&gt;user84&lt;/password&gt;
+    &lt;full-name&gt;User 84&lt;/full-name&gt;
+    &lt;email&gt;user84@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user85&lt;/uid&gt;
+    &lt;short-name&gt;user85&lt;/short-name&gt;
+    &lt;password&gt;user85&lt;/password&gt;
+    &lt;full-name&gt;User 85&lt;/full-name&gt;
+    &lt;email&gt;user85@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user86&lt;/uid&gt;
+    &lt;short-name&gt;user86&lt;/short-name&gt;
+    &lt;password&gt;user86&lt;/password&gt;
+    &lt;full-name&gt;User 86&lt;/full-name&gt;
+    &lt;email&gt;user86@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user87&lt;/uid&gt;
+    &lt;short-name&gt;user87&lt;/short-name&gt;
+    &lt;password&gt;user87&lt;/password&gt;
+    &lt;full-name&gt;User 87&lt;/full-name&gt;
+    &lt;email&gt;user87@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user88&lt;/uid&gt;
+    &lt;short-name&gt;user88&lt;/short-name&gt;
+    &lt;password&gt;user88&lt;/password&gt;
+    &lt;full-name&gt;User 88&lt;/full-name&gt;
+    &lt;email&gt;user88@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user89&lt;/uid&gt;
+    &lt;short-name&gt;user89&lt;/short-name&gt;
+    &lt;password&gt;user89&lt;/password&gt;
+    &lt;full-name&gt;User 89&lt;/full-name&gt;
+    &lt;email&gt;user89@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user90&lt;/uid&gt;
+    &lt;short-name&gt;user90&lt;/short-name&gt;
+    &lt;password&gt;user90&lt;/password&gt;
+    &lt;full-name&gt;User 90&lt;/full-name&gt;
+    &lt;email&gt;user90@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user91&lt;/uid&gt;
+    &lt;short-name&gt;user91&lt;/short-name&gt;
+    &lt;password&gt;user91&lt;/password&gt;
+    &lt;full-name&gt;User 91&lt;/full-name&gt;
+    &lt;email&gt;user91@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user92&lt;/uid&gt;
+    &lt;short-name&gt;user92&lt;/short-name&gt;
+    &lt;password&gt;user92&lt;/password&gt;
+    &lt;full-name&gt;User 92&lt;/full-name&gt;
+    &lt;email&gt;user92@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user93&lt;/uid&gt;
+    &lt;short-name&gt;user93&lt;/short-name&gt;
+    &lt;password&gt;user93&lt;/password&gt;
+    &lt;full-name&gt;User 93&lt;/full-name&gt;
+    &lt;email&gt;user93@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user94&lt;/uid&gt;
+    &lt;short-name&gt;user94&lt;/short-name&gt;
+    &lt;password&gt;user94&lt;/password&gt;
+    &lt;full-name&gt;User 94&lt;/full-name&gt;
+    &lt;email&gt;user94@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user95&lt;/uid&gt;
+    &lt;short-name&gt;user95&lt;/short-name&gt;
+    &lt;password&gt;user95&lt;/password&gt;
+    &lt;full-name&gt;User 95&lt;/full-name&gt;
+    &lt;email&gt;user95@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user96&lt;/uid&gt;
+    &lt;short-name&gt;user96&lt;/short-name&gt;
+    &lt;password&gt;user96&lt;/password&gt;
+    &lt;full-name&gt;User 96&lt;/full-name&gt;
+    &lt;email&gt;user96@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user97&lt;/uid&gt;
+    &lt;short-name&gt;user97&lt;/short-name&gt;
+    &lt;password&gt;user97&lt;/password&gt;
+    &lt;full-name&gt;User 97&lt;/full-name&gt;
+    &lt;email&gt;user97@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user98&lt;/uid&gt;
+    &lt;short-name&gt;user98&lt;/short-name&gt;
+    &lt;password&gt;user98&lt;/password&gt;
+    &lt;full-name&gt;User 98&lt;/full-name&gt;
+    &lt;email&gt;user98@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user99&lt;/uid&gt;
+    &lt;short-name&gt;user99&lt;/short-name&gt;
+    &lt;password&gt;user99&lt;/password&gt;
+    &lt;full-name&gt;User 99&lt;/full-name&gt;
+    &lt;email&gt;user99@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user100&lt;/uid&gt;
+    &lt;short-name&gt;user100&lt;/short-name&gt;
+    &lt;password&gt;user100&lt;/password&gt;
+    &lt;full-name&gt;User 100&lt;/full-name&gt;
+    &lt;email&gt;user100@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser01&lt;/uid&gt;
+    &lt;short-name&gt;puser01&lt;/short-name&gt;
+    &lt;password&gt;puser01&lt;/password&gt;
+    &lt;full-name&gt;Puser 01&lt;/full-name&gt;
+    &lt;email&gt;puser01@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser02&lt;/uid&gt;
+    &lt;short-name&gt;puser02&lt;/short-name&gt;
+    &lt;password&gt;puser02&lt;/password&gt;
+    &lt;full-name&gt;Puser 02&lt;/full-name&gt;
+    &lt;email&gt;puser02@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser03&lt;/uid&gt;
+    &lt;short-name&gt;puser03&lt;/short-name&gt;
+    &lt;password&gt;puser03&lt;/password&gt;
+    &lt;full-name&gt;Puser 03&lt;/full-name&gt;
+    &lt;email&gt;puser03@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser04&lt;/uid&gt;
+    &lt;short-name&gt;puser04&lt;/short-name&gt;
+    &lt;password&gt;puser04&lt;/password&gt;
+    &lt;full-name&gt;Puser 04&lt;/full-name&gt;
+    &lt;email&gt;puser04@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser05&lt;/uid&gt;
+    &lt;short-name&gt;puser05&lt;/short-name&gt;
+    &lt;password&gt;puser05&lt;/password&gt;
+    &lt;full-name&gt;Puser 05&lt;/full-name&gt;
+    &lt;email&gt;puser05@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser06&lt;/uid&gt;
+    &lt;short-name&gt;puser06&lt;/short-name&gt;
+    &lt;password&gt;puser06&lt;/password&gt;
+    &lt;full-name&gt;Puser 06&lt;/full-name&gt;
+    &lt;email&gt;puser06@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser07&lt;/uid&gt;
+    &lt;short-name&gt;puser07&lt;/short-name&gt;
+    &lt;password&gt;puser07&lt;/password&gt;
+    &lt;full-name&gt;Puser 07&lt;/full-name&gt;
+    &lt;email&gt;puser07@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser08&lt;/uid&gt;
+    &lt;short-name&gt;puser08&lt;/short-name&gt;
+    &lt;password&gt;puser08&lt;/password&gt;
+    &lt;full-name&gt;Puser 08&lt;/full-name&gt;
+    &lt;email&gt;puser08@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser09&lt;/uid&gt;
+    &lt;short-name&gt;puser09&lt;/short-name&gt;
+    &lt;password&gt;puser09&lt;/password&gt;
+    &lt;full-name&gt;Puser 09&lt;/full-name&gt;
+    &lt;email&gt;puser09@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser10&lt;/uid&gt;
+    &lt;short-name&gt;puser10&lt;/short-name&gt;
+    &lt;password&gt;puser10&lt;/password&gt;
+    &lt;full-name&gt;Puser 10&lt;/full-name&gt;
+    &lt;email&gt;puser10@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser11&lt;/uid&gt;
+    &lt;short-name&gt;puser11&lt;/short-name&gt;
+    &lt;password&gt;puser11&lt;/password&gt;
+    &lt;full-name&gt;Puser 11&lt;/full-name&gt;
+    &lt;email&gt;puser11@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser12&lt;/uid&gt;
+    &lt;short-name&gt;puser12&lt;/short-name&gt;
+    &lt;password&gt;puser12&lt;/password&gt;
+    &lt;full-name&gt;Puser 12&lt;/full-name&gt;
+    &lt;email&gt;puser12@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser13&lt;/uid&gt;
+    &lt;short-name&gt;puser13&lt;/short-name&gt;
+    &lt;password&gt;puser13&lt;/password&gt;
+    &lt;full-name&gt;Puser 13&lt;/full-name&gt;
+    &lt;email&gt;puser13@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser14&lt;/uid&gt;
+    &lt;short-name&gt;puser14&lt;/short-name&gt;
+    &lt;password&gt;puser14&lt;/password&gt;
+    &lt;full-name&gt;Puser 14&lt;/full-name&gt;
+    &lt;email&gt;puser14@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser15&lt;/uid&gt;
+    &lt;short-name&gt;puser15&lt;/short-name&gt;
+    &lt;password&gt;puser15&lt;/password&gt;
+    &lt;full-name&gt;Puser 15&lt;/full-name&gt;
+    &lt;email&gt;puser15@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser16&lt;/uid&gt;
+    &lt;short-name&gt;puser16&lt;/short-name&gt;
+    &lt;password&gt;puser16&lt;/password&gt;
+    &lt;full-name&gt;Puser 16&lt;/full-name&gt;
+    &lt;email&gt;puser16@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser17&lt;/uid&gt;
+    &lt;short-name&gt;puser17&lt;/short-name&gt;
+    &lt;password&gt;puser17&lt;/password&gt;
+    &lt;full-name&gt;Puser 17&lt;/full-name&gt;
+    &lt;email&gt;puser17@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser18&lt;/uid&gt;
+    &lt;short-name&gt;puser18&lt;/short-name&gt;
+    &lt;password&gt;puser18&lt;/password&gt;
+    &lt;full-name&gt;Puser 18&lt;/full-name&gt;
+    &lt;email&gt;puser18@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser19&lt;/uid&gt;
+    &lt;short-name&gt;puser19&lt;/short-name&gt;
+    &lt;password&gt;puser19&lt;/password&gt;
+    &lt;full-name&gt;Puser 19&lt;/full-name&gt;
+    &lt;email&gt;puser19@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser20&lt;/uid&gt;
+    &lt;short-name&gt;puser20&lt;/short-name&gt;
+    &lt;password&gt;puser20&lt;/password&gt;
+    &lt;full-name&gt;Puser 20&lt;/full-name&gt;
+    &lt;email&gt;puser20@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser21&lt;/uid&gt;
+    &lt;short-name&gt;puser21&lt;/short-name&gt;
+    &lt;password&gt;puser21&lt;/password&gt;
+    &lt;full-name&gt;Puser 21&lt;/full-name&gt;
+    &lt;email&gt;puser21@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser22&lt;/uid&gt;
+    &lt;short-name&gt;puser22&lt;/short-name&gt;
+    &lt;password&gt;puser22&lt;/password&gt;
+    &lt;full-name&gt;Puser 22&lt;/full-name&gt;
+    &lt;email&gt;puser22@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser23&lt;/uid&gt;
+    &lt;short-name&gt;puser23&lt;/short-name&gt;
+    &lt;password&gt;puser23&lt;/password&gt;
+    &lt;full-name&gt;Puser 23&lt;/full-name&gt;
+    &lt;email&gt;puser23@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser24&lt;/uid&gt;
+    &lt;short-name&gt;puser24&lt;/short-name&gt;
+    &lt;password&gt;puser24&lt;/password&gt;
+    &lt;full-name&gt;Puser 24&lt;/full-name&gt;
+    &lt;email&gt;puser24@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser25&lt;/uid&gt;
+    &lt;short-name&gt;puser25&lt;/short-name&gt;
+    &lt;password&gt;puser25&lt;/password&gt;
+    &lt;full-name&gt;Puser 25&lt;/full-name&gt;
+    &lt;email&gt;puser25@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser26&lt;/uid&gt;
+    &lt;short-name&gt;puser26&lt;/short-name&gt;
+    &lt;password&gt;puser26&lt;/password&gt;
+    &lt;full-name&gt;Puser 26&lt;/full-name&gt;
+    &lt;email&gt;puser26@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser27&lt;/uid&gt;
+    &lt;short-name&gt;puser27&lt;/short-name&gt;
+    &lt;password&gt;puser27&lt;/password&gt;
+    &lt;full-name&gt;Puser 27&lt;/full-name&gt;
+    &lt;email&gt;puser27@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser28&lt;/uid&gt;
+    &lt;short-name&gt;puser28&lt;/short-name&gt;
+    &lt;password&gt;puser28&lt;/password&gt;
+    &lt;full-name&gt;Puser 28&lt;/full-name&gt;
+    &lt;email&gt;puser28@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser29&lt;/uid&gt;
+    &lt;short-name&gt;puser29&lt;/short-name&gt;
+    &lt;password&gt;puser29&lt;/password&gt;
+    &lt;full-name&gt;Puser 29&lt;/full-name&gt;
+    &lt;email&gt;puser29@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser30&lt;/uid&gt;
+    &lt;short-name&gt;puser30&lt;/short-name&gt;
+    &lt;password&gt;puser30&lt;/password&gt;
+    &lt;full-name&gt;Puser 30&lt;/full-name&gt;
+    &lt;email&gt;puser30@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser31&lt;/uid&gt;
+    &lt;short-name&gt;puser31&lt;/short-name&gt;
+    &lt;password&gt;puser31&lt;/password&gt;
+    &lt;full-name&gt;Puser 31&lt;/full-name&gt;
+    &lt;email&gt;puser31@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser32&lt;/uid&gt;
+    &lt;short-name&gt;puser32&lt;/short-name&gt;
+    &lt;password&gt;puser32&lt;/password&gt;
+    &lt;full-name&gt;Puser 32&lt;/full-name&gt;
+    &lt;email&gt;puser32@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser33&lt;/uid&gt;
+    &lt;short-name&gt;puser33&lt;/short-name&gt;
+    &lt;password&gt;puser33&lt;/password&gt;
+    &lt;full-name&gt;Puser 33&lt;/full-name&gt;
+    &lt;email&gt;puser33@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser34&lt;/uid&gt;
+    &lt;short-name&gt;puser34&lt;/short-name&gt;
+    &lt;password&gt;puser34&lt;/password&gt;
+    &lt;full-name&gt;Puser 34&lt;/full-name&gt;
+    &lt;email&gt;puser34@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser35&lt;/uid&gt;
+    &lt;short-name&gt;puser35&lt;/short-name&gt;
+    &lt;password&gt;puser35&lt;/password&gt;
+    &lt;full-name&gt;Puser 35&lt;/full-name&gt;
+    &lt;email&gt;puser35@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser36&lt;/uid&gt;
+    &lt;short-name&gt;puser36&lt;/short-name&gt;
+    &lt;password&gt;puser36&lt;/password&gt;
+    &lt;full-name&gt;Puser 36&lt;/full-name&gt;
+    &lt;email&gt;puser36@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser37&lt;/uid&gt;
+    &lt;short-name&gt;puser37&lt;/short-name&gt;
+    &lt;password&gt;puser37&lt;/password&gt;
+    &lt;full-name&gt;Puser 37&lt;/full-name&gt;
+    &lt;email&gt;puser37@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser38&lt;/uid&gt;
+    &lt;short-name&gt;puser38&lt;/short-name&gt;
+    &lt;password&gt;puser38&lt;/password&gt;
+    &lt;full-name&gt;Puser 38&lt;/full-name&gt;
+    &lt;email&gt;puser38@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser39&lt;/uid&gt;
+    &lt;short-name&gt;puser39&lt;/short-name&gt;
+    &lt;password&gt;puser39&lt;/password&gt;
+    &lt;full-name&gt;Puser 39&lt;/full-name&gt;
+    &lt;email&gt;puser39@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser40&lt;/uid&gt;
+    &lt;short-name&gt;puser40&lt;/short-name&gt;
+    &lt;password&gt;puser40&lt;/password&gt;
+    &lt;full-name&gt;Puser 40&lt;/full-name&gt;
+    &lt;email&gt;puser40@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser41&lt;/uid&gt;
+    &lt;short-name&gt;puser41&lt;/short-name&gt;
+    &lt;password&gt;puser41&lt;/password&gt;
+    &lt;full-name&gt;Puser 41&lt;/full-name&gt;
+    &lt;email&gt;puser41@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser42&lt;/uid&gt;
+    &lt;short-name&gt;puser42&lt;/short-name&gt;
+    &lt;password&gt;puser42&lt;/password&gt;
+    &lt;full-name&gt;Puser 42&lt;/full-name&gt;
+    &lt;email&gt;puser42@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser43&lt;/uid&gt;
+    &lt;short-name&gt;puser43&lt;/short-name&gt;
+    &lt;password&gt;puser43&lt;/password&gt;
+    &lt;full-name&gt;Puser 43&lt;/full-name&gt;
+    &lt;email&gt;puser43@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser44&lt;/uid&gt;
+    &lt;short-name&gt;puser44&lt;/short-name&gt;
+    &lt;password&gt;puser44&lt;/password&gt;
+    &lt;full-name&gt;Puser 44&lt;/full-name&gt;
+    &lt;email&gt;puser44@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser45&lt;/uid&gt;
+    &lt;short-name&gt;puser45&lt;/short-name&gt;
+    &lt;password&gt;puser45&lt;/password&gt;
+    &lt;full-name&gt;Puser 45&lt;/full-name&gt;
+    &lt;email&gt;puser45@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser46&lt;/uid&gt;
+    &lt;short-name&gt;puser46&lt;/short-name&gt;
+    &lt;password&gt;puser46&lt;/password&gt;
+    &lt;full-name&gt;Puser 46&lt;/full-name&gt;
+    &lt;email&gt;puser46@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser47&lt;/uid&gt;
+    &lt;short-name&gt;puser47&lt;/short-name&gt;
+    &lt;password&gt;puser47&lt;/password&gt;
+    &lt;full-name&gt;Puser 47&lt;/full-name&gt;
+    &lt;email&gt;puser47@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser48&lt;/uid&gt;
+    &lt;short-name&gt;puser48&lt;/short-name&gt;
+    &lt;password&gt;puser48&lt;/password&gt;
+    &lt;full-name&gt;Puser 48&lt;/full-name&gt;
+    &lt;email&gt;puser48@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser49&lt;/uid&gt;
+    &lt;short-name&gt;puser49&lt;/short-name&gt;
+    &lt;password&gt;puser49&lt;/password&gt;
+    &lt;full-name&gt;Puser 49&lt;/full-name&gt;
+    &lt;email&gt;puser49@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser50&lt;/uid&gt;
+    &lt;short-name&gt;puser50&lt;/short-name&gt;
+    &lt;password&gt;puser50&lt;/password&gt;
+    &lt;full-name&gt;Puser 50&lt;/full-name&gt;
+    &lt;email&gt;puser50@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser51&lt;/uid&gt;
+    &lt;short-name&gt;puser51&lt;/short-name&gt;
+    &lt;password&gt;puser51&lt;/password&gt;
+    &lt;full-name&gt;Puser 51&lt;/full-name&gt;
+    &lt;email&gt;puser51@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser52&lt;/uid&gt;
+    &lt;short-name&gt;puser52&lt;/short-name&gt;
+    &lt;password&gt;puser52&lt;/password&gt;
+    &lt;full-name&gt;Puser 52&lt;/full-name&gt;
+    &lt;email&gt;puser52@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser53&lt;/uid&gt;
+    &lt;short-name&gt;puser53&lt;/short-name&gt;
+    &lt;password&gt;puser53&lt;/password&gt;
+    &lt;full-name&gt;Puser 53&lt;/full-name&gt;
+    &lt;email&gt;puser53@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser54&lt;/uid&gt;
+    &lt;short-name&gt;puser54&lt;/short-name&gt;
+    &lt;password&gt;puser54&lt;/password&gt;
+    &lt;full-name&gt;Puser 54&lt;/full-name&gt;
+    &lt;email&gt;puser54@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser55&lt;/uid&gt;
+    &lt;short-name&gt;puser55&lt;/short-name&gt;
+    &lt;password&gt;puser55&lt;/password&gt;
+    &lt;full-name&gt;Puser 55&lt;/full-name&gt;
+    &lt;email&gt;puser55@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser56&lt;/uid&gt;
+    &lt;short-name&gt;puser56&lt;/short-name&gt;
+    &lt;password&gt;puser56&lt;/password&gt;
+    &lt;full-name&gt;Puser 56&lt;/full-name&gt;
+    &lt;email&gt;puser56@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser57&lt;/uid&gt;
+    &lt;short-name&gt;puser57&lt;/short-name&gt;
+    &lt;password&gt;puser57&lt;/password&gt;
+    &lt;full-name&gt;Puser 57&lt;/full-name&gt;
+    &lt;email&gt;puser57@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser58&lt;/uid&gt;
+    &lt;short-name&gt;puser58&lt;/short-name&gt;
+    &lt;password&gt;puser58&lt;/password&gt;
+    &lt;full-name&gt;Puser 58&lt;/full-name&gt;
+    &lt;email&gt;puser58@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser59&lt;/uid&gt;
+    &lt;short-name&gt;puser59&lt;/short-name&gt;
+    &lt;password&gt;puser59&lt;/password&gt;
+    &lt;full-name&gt;Puser 59&lt;/full-name&gt;
+    &lt;email&gt;puser59@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser60&lt;/uid&gt;
+    &lt;short-name&gt;puser60&lt;/short-name&gt;
+    &lt;password&gt;puser60&lt;/password&gt;
+    &lt;full-name&gt;Puser 60&lt;/full-name&gt;
+    &lt;email&gt;puser60@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser61&lt;/uid&gt;
+    &lt;short-name&gt;puser61&lt;/short-name&gt;
+    &lt;password&gt;puser61&lt;/password&gt;
+    &lt;full-name&gt;Puser 61&lt;/full-name&gt;
+    &lt;email&gt;puser61@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser62&lt;/uid&gt;
+    &lt;short-name&gt;puser62&lt;/short-name&gt;
+    &lt;password&gt;puser62&lt;/password&gt;
+    &lt;full-name&gt;Puser 62&lt;/full-name&gt;
+    &lt;email&gt;puser62@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser63&lt;/uid&gt;
+    &lt;short-name&gt;puser63&lt;/short-name&gt;
+    &lt;password&gt;puser63&lt;/password&gt;
+    &lt;full-name&gt;Puser 63&lt;/full-name&gt;
+    &lt;email&gt;puser63@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser64&lt;/uid&gt;
+    &lt;short-name&gt;puser64&lt;/short-name&gt;
+    &lt;password&gt;puser64&lt;/password&gt;
+    &lt;full-name&gt;Puser 64&lt;/full-name&gt;
+    &lt;email&gt;puser64@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser65&lt;/uid&gt;
+    &lt;short-name&gt;puser65&lt;/short-name&gt;
+    &lt;password&gt;puser65&lt;/password&gt;
+    &lt;full-name&gt;Puser 65&lt;/full-name&gt;
+    &lt;email&gt;puser65@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser66&lt;/uid&gt;
+    &lt;short-name&gt;puser66&lt;/short-name&gt;
+    &lt;password&gt;puser66&lt;/password&gt;
+    &lt;full-name&gt;Puser 66&lt;/full-name&gt;
+    &lt;email&gt;puser66@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser67&lt;/uid&gt;
+    &lt;short-name&gt;puser67&lt;/short-name&gt;
+    &lt;password&gt;puser67&lt;/password&gt;
+    &lt;full-name&gt;Puser 67&lt;/full-name&gt;
+    &lt;email&gt;puser67@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser68&lt;/uid&gt;
+    &lt;short-name&gt;puser68&lt;/short-name&gt;
+    &lt;password&gt;puser68&lt;/password&gt;
+    &lt;full-name&gt;Puser 68&lt;/full-name&gt;
+    &lt;email&gt;puser68@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser69&lt;/uid&gt;
+    &lt;short-name&gt;puser69&lt;/short-name&gt;
+    &lt;password&gt;puser69&lt;/password&gt;
+    &lt;full-name&gt;Puser 69&lt;/full-name&gt;
+    &lt;email&gt;puser69@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser70&lt;/uid&gt;
+    &lt;short-name&gt;puser70&lt;/short-name&gt;
+    &lt;password&gt;puser70&lt;/password&gt;
+    &lt;full-name&gt;Puser 70&lt;/full-name&gt;
+    &lt;email&gt;puser70@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser71&lt;/uid&gt;
+    &lt;short-name&gt;puser71&lt;/short-name&gt;
+    &lt;password&gt;puser71&lt;/password&gt;
+    &lt;full-name&gt;Puser 71&lt;/full-name&gt;
+    &lt;email&gt;puser71@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser72&lt;/uid&gt;
+    &lt;short-name&gt;puser72&lt;/short-name&gt;
+    &lt;password&gt;puser72&lt;/password&gt;
+    &lt;full-name&gt;Puser 72&lt;/full-name&gt;
+    &lt;email&gt;puser72@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser73&lt;/uid&gt;
+    &lt;short-name&gt;puser73&lt;/short-name&gt;
+    &lt;password&gt;puser73&lt;/password&gt;
+    &lt;full-name&gt;Puser 73&lt;/full-name&gt;
+    &lt;email&gt;puser73@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser74&lt;/uid&gt;
+    &lt;short-name&gt;puser74&lt;/short-name&gt;
+    &lt;password&gt;puser74&lt;/password&gt;
+    &lt;full-name&gt;Puser 74&lt;/full-name&gt;
+    &lt;email&gt;puser74@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser75&lt;/uid&gt;
+    &lt;short-name&gt;puser75&lt;/short-name&gt;
+    &lt;password&gt;puser75&lt;/password&gt;
+    &lt;full-name&gt;Puser 75&lt;/full-name&gt;
+    &lt;email&gt;puser75@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser76&lt;/uid&gt;
+    &lt;short-name&gt;puser76&lt;/short-name&gt;
+    &lt;password&gt;puser76&lt;/password&gt;
+    &lt;full-name&gt;Puser 76&lt;/full-name&gt;
+    &lt;email&gt;puser76@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser77&lt;/uid&gt;
+    &lt;short-name&gt;puser77&lt;/short-name&gt;
+    &lt;password&gt;puser77&lt;/password&gt;
+    &lt;full-name&gt;Puser 77&lt;/full-name&gt;
+    &lt;email&gt;puser77@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser78&lt;/uid&gt;
+    &lt;short-name&gt;puser78&lt;/short-name&gt;
+    &lt;password&gt;puser78&lt;/password&gt;
+    &lt;full-name&gt;Puser 78&lt;/full-name&gt;
+    &lt;email&gt;puser78@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser79&lt;/uid&gt;
+    &lt;short-name&gt;puser79&lt;/short-name&gt;
+    &lt;password&gt;puser79&lt;/password&gt;
+    &lt;full-name&gt;Puser 79&lt;/full-name&gt;
+    &lt;email&gt;puser79@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser80&lt;/uid&gt;
+    &lt;short-name&gt;puser80&lt;/short-name&gt;
+    &lt;password&gt;puser80&lt;/password&gt;
+    &lt;full-name&gt;Puser 80&lt;/full-name&gt;
+    &lt;email&gt;puser80@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser81&lt;/uid&gt;
+    &lt;short-name&gt;puser81&lt;/short-name&gt;
+    &lt;password&gt;puser81&lt;/password&gt;
+    &lt;full-name&gt;Puser 81&lt;/full-name&gt;
+    &lt;email&gt;puser81@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser82&lt;/uid&gt;
+    &lt;short-name&gt;puser82&lt;/short-name&gt;
+    &lt;password&gt;puser82&lt;/password&gt;
+    &lt;full-name&gt;Puser 82&lt;/full-name&gt;
+    &lt;email&gt;puser82@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser83&lt;/uid&gt;
+    &lt;short-name&gt;puser83&lt;/short-name&gt;
+    &lt;password&gt;puser83&lt;/password&gt;
+    &lt;full-name&gt;Puser 83&lt;/full-name&gt;
+    &lt;email&gt;puser83@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser84&lt;/uid&gt;
+    &lt;short-name&gt;puser84&lt;/short-name&gt;
+    &lt;password&gt;puser84&lt;/password&gt;
+    &lt;full-name&gt;Puser 84&lt;/full-name&gt;
+    &lt;email&gt;puser84@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser85&lt;/uid&gt;
+    &lt;short-name&gt;puser85&lt;/short-name&gt;
+    &lt;password&gt;puser85&lt;/password&gt;
+    &lt;full-name&gt;Puser 85&lt;/full-name&gt;
+    &lt;email&gt;puser85@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser86&lt;/uid&gt;
+    &lt;short-name&gt;puser86&lt;/short-name&gt;
+    &lt;password&gt;puser86&lt;/password&gt;
+    &lt;full-name&gt;Puser 86&lt;/full-name&gt;
+    &lt;email&gt;puser86@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser87&lt;/uid&gt;
+    &lt;short-name&gt;puser87&lt;/short-name&gt;
+    &lt;password&gt;puser87&lt;/password&gt;
+    &lt;full-name&gt;Puser 87&lt;/full-name&gt;
+    &lt;email&gt;puser87@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser88&lt;/uid&gt;
+    &lt;short-name&gt;puser88&lt;/short-name&gt;
+    &lt;password&gt;puser88&lt;/password&gt;
+    &lt;full-name&gt;Puser 88&lt;/full-name&gt;
+    &lt;email&gt;puser88@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser89&lt;/uid&gt;
+    &lt;short-name&gt;puser89&lt;/short-name&gt;
+    &lt;password&gt;puser89&lt;/password&gt;
+    &lt;full-name&gt;Puser 89&lt;/full-name&gt;
+    &lt;email&gt;puser89@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser90&lt;/uid&gt;
+    &lt;short-name&gt;puser90&lt;/short-name&gt;
+    &lt;password&gt;puser90&lt;/password&gt;
+    &lt;full-name&gt;Puser 90&lt;/full-name&gt;
+    &lt;email&gt;puser90@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser91&lt;/uid&gt;
+    &lt;short-name&gt;puser91&lt;/short-name&gt;
+    &lt;password&gt;puser91&lt;/password&gt;
+    &lt;full-name&gt;Puser 91&lt;/full-name&gt;
+    &lt;email&gt;puser91@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser92&lt;/uid&gt;
+    &lt;short-name&gt;puser92&lt;/short-name&gt;
+    &lt;password&gt;puser92&lt;/password&gt;
+    &lt;full-name&gt;Puser 92&lt;/full-name&gt;
+    &lt;email&gt;puser92@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser93&lt;/uid&gt;
+    &lt;short-name&gt;puser93&lt;/short-name&gt;
+    &lt;password&gt;puser93&lt;/password&gt;
+    &lt;full-name&gt;Puser 93&lt;/full-name&gt;
+    &lt;email&gt;puser93@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser94&lt;/uid&gt;
+    &lt;short-name&gt;puser94&lt;/short-name&gt;
+    &lt;password&gt;puser94&lt;/password&gt;
+    &lt;full-name&gt;Puser 94&lt;/full-name&gt;
+    &lt;email&gt;puser94@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser95&lt;/uid&gt;
+    &lt;short-name&gt;puser95&lt;/short-name&gt;
+    &lt;password&gt;puser95&lt;/password&gt;
+    &lt;full-name&gt;Puser 95&lt;/full-name&gt;
+    &lt;email&gt;puser95@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser96&lt;/uid&gt;
+    &lt;short-name&gt;puser96&lt;/short-name&gt;
+    &lt;password&gt;puser96&lt;/password&gt;
+    &lt;full-name&gt;Puser 96&lt;/full-name&gt;
+    &lt;email&gt;puser96@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser97&lt;/uid&gt;
+    &lt;short-name&gt;puser97&lt;/short-name&gt;
+    &lt;password&gt;puser97&lt;/password&gt;
+    &lt;full-name&gt;Puser 97&lt;/full-name&gt;
+    &lt;email&gt;puser97@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser98&lt;/uid&gt;
+    &lt;short-name&gt;puser98&lt;/short-name&gt;
+    &lt;password&gt;puser98&lt;/password&gt;
+    &lt;full-name&gt;Puser 98&lt;/full-name&gt;
+    &lt;email&gt;puser98@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser99&lt;/uid&gt;
+    &lt;short-name&gt;puser99&lt;/short-name&gt;
+    &lt;password&gt;puser99&lt;/password&gt;
+    &lt;full-name&gt;Puser 99&lt;/full-name&gt;
+    &lt;email&gt;puser99@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser100&lt;/uid&gt;
+    &lt;short-name&gt;puser100&lt;/short-name&gt;
+    &lt;password&gt;puser100&lt;/password&gt;
+    &lt;full-name&gt;Puser 100&lt;/full-name&gt;
+    &lt;email&gt;puser100@example.com&lt;/email&gt;
+&lt;/record&gt;
+&lt;/directory&gt;
</ins></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoretestaccountsaugmentsxml"></a>
<div class="addfile"><h4>Added: CalendarServer/trunk/txdav/common/datastore/test/accounts/augments.xml (0 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/test/accounts/augments.xml                                (rev 0)
+++ CalendarServer/trunk/txdav/common/datastore/test/accounts/augments.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -0,0 +1,1356 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;!--
+Copyright (c) 2009-2014 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ --&gt;
+
+&lt;!DOCTYPE augments SYSTEM &quot;../../../conf/auth/augments.dtd&quot;&gt;
+
+&lt;augments&gt;
+  &lt;!--
+  &lt;record&gt;
+    &lt;uid&gt;Location-Default&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;auto-schedule-mode&gt;automatic&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;Resource-Default&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;auto-schedule-mode&gt;automatic&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
+  --&gt;
+
+  &lt;record&gt;
+    &lt;uid&gt;D11F03A0-97EA-48AF-9A6C-FAC7F3975766&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
+    &lt;server-id&gt;00001&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;5A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
+    &lt;server-id&gt;00002&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;8B4288F6-CC82-491D-8EF9-642EF4F3E7D0&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;543D28BA-F74F-4D5F-9243-B3E3A61171E5&lt;/uid&gt;
+    &lt;enable-calendar&gt;false&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;false&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;right_coast&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;left_coast&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;mercury&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;gemini&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;apollo&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;auto-accept-group&gt;both_coasts&lt;/auto-accept-group&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;orion&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;transporter&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;ftlcpu&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;!--
+  &lt;record&gt;
+    &lt;uid&gt;non_calendar_proxy&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+--&gt;
+  &lt;record&gt;
+    &lt;uid&gt;7423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;8A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD2&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;9E1FFAC4-3CCD-45A1-8272-D161C92D2EEE&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;7678EC8A-A069-4E82-9066-7279C6718507&lt;/uid&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;FC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;EC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-login&gt;true&lt;/enable-login&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;00599DAF-3E75-42DD-9DB7-52617E79943F&lt;/uid&gt;
+    &lt;enable-calendar&gt;false&lt;/enable-calendar&gt;
+    &lt;enable-login&gt;false&lt;/enable-login&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;75EA36BE-F71B-40F9-81F9-CF59BF40CA8F&lt;/uid&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;auto-schedule-mode&gt;automatic&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user01&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user02&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user03&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user04&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user05&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user06&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user07&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user08&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user09&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user10&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user11&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user12&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user13&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user14&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user15&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user16&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user17&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user18&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user19&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user20&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user21&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user22&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user23&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user24&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user25&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user26&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user27&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user28&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user29&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user30&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user31&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user32&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user33&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user34&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user35&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user36&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user37&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user38&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user39&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user40&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user41&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user42&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user43&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user44&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user45&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user46&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user47&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user48&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user49&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user50&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user51&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user52&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user53&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user54&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user55&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user56&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user57&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user58&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user59&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user60&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user61&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user62&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user63&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user64&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user65&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user66&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user67&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user68&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user69&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user70&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user71&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user72&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user73&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user74&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user75&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user76&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user77&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user78&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user79&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user80&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user81&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user82&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user83&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user84&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user85&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user86&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user87&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user88&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user89&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user90&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user91&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user92&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user93&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user94&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user95&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user96&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user97&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user98&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user99&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;user100&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser01&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser02&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser03&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser04&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser05&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser06&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser07&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser08&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser09&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser10&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser11&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser12&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser13&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser14&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser15&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser16&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser17&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser18&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser19&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser20&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser21&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser22&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser23&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser24&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser25&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser26&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser27&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser28&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser29&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser30&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser31&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser32&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser33&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser34&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser35&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser36&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser37&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser38&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser39&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser40&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser41&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser42&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser43&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser44&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser45&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser46&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser47&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser48&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser49&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser50&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser51&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser52&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser53&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser54&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser55&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser56&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser57&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser58&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser59&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser60&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser61&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser62&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser63&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser64&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser65&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser66&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser67&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser68&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser69&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser70&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser71&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser72&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser73&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser74&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser75&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser76&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser77&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser78&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser79&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser80&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser81&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser82&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser83&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser84&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser85&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser86&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser87&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser88&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser89&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser90&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser91&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser92&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser93&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser94&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser95&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser96&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser97&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser98&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser99&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;record&gt;
+    &lt;uid&gt;puser100&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&lt;/augments&gt;
</ins></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoretestaccountsgenerate_test_accountspy"></a>
<div class="addfile"><h4>Added: CalendarServer/trunk/txdav/common/datastore/test/accounts/generate_test_accounts.py (0 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/test/accounts/generate_test_accounts.py                                (rev 0)
+++ CalendarServer/trunk/txdav/common/datastore/test/accounts/generate_test_accounts.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -0,0 +1,82 @@
</span><ins>+#!/usr/bin/env python
+
+# Generates test directory records in accounts-test.xml,
+# (overwriting it if it exists in the current directory).
+
+prefix = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;!--
+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ --&gt;
+
+&quot;&quot;&quot;
+
+# accounts-test.xml
+
+out = file(&quot;accounts-test.xml&quot;, &quot;w&quot;)
+out.write(prefix)
+out.write('&lt;!DOCTYPE accounts SYSTEM &quot;accounts.dtd&quot;&gt;\n\n')
+out.write('&lt;directory realm=&quot;Test Realm&quot;&gt;\n')
+
+
+
+# user01-100
+for i in xrange(1, 101):
+    out.write(&quot;&quot;&quot;&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;user{ctr:02d}&lt;/uid&gt;
+    &lt;short-name&gt;user{ctr:02d}&lt;/short-name&gt;
+    &lt;password&gt;user{ctr:02d}&lt;/password&gt;
+    &lt;full-name&gt;User {ctr:02d}&lt;/full-name&gt;
+    &lt;email&gt;user{ctr:02d}@example.com&lt;/email&gt;
+&lt;/record&gt;
+&quot;&quot;&quot;.format(ctr=i))
+for i in xrange(1, 101):
+    out.write(&quot;&quot;&quot;&lt;record type=&quot;user&quot;&gt;
+    &lt;uid&gt;puser{ctr:02d}&lt;/uid&gt;
+    &lt;short-name&gt;puser{ctr:02d}&lt;/short-name&gt;
+    &lt;password&gt;puser{ctr:02d}&lt;/password&gt;
+    &lt;full-name&gt;Puser {ctr:02d}&lt;/full-name&gt;
+    &lt;email&gt;puser{ctr:02d}@example.com&lt;/email&gt;
+&lt;/record&gt;
+&quot;&quot;&quot;.format(ctr=i))
+out.write(&quot;&lt;/directory&gt;\n&quot;)
+out.close()
+
+
+
+out = file(&quot;augments-test.xml&quot;, &quot;w&quot;)
+out.write(prefix)
+out.write('&lt;!DOCTYPE augments SYSTEM &quot;augments.dtd&quot;&gt;\n\n')
+out.write(&quot;&lt;augments&gt;\n&quot;)
+
+for i in xrange(1, 101):
+    out.write(&quot;&quot;&quot;&lt;record&gt;
+    &lt;uid&gt;user{ctr:02d}&lt;/uid&gt;
+    &lt;server-id&gt;A&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&quot;&quot;&quot;.format(ctr=i))
+
+for i in xrange(1, 101):
+    out.write(&quot;&quot;&quot;&lt;record&gt;
+    &lt;uid&gt;puser{ctr:02d}&lt;/uid&gt;
+    &lt;server-id&gt;B&lt;/server-id&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+&lt;/record&gt;
+&quot;&quot;&quot;.format(ctr=i))
+
+out.close()
</ins></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoretestaccountsproxiesxml"></a>
<div class="addfile"><h4>Added: CalendarServer/trunk/txdav/common/datastore/test/accounts/proxies.xml (0 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/test/accounts/proxies.xml                                (rev 0)
+++ CalendarServer/trunk/txdav/common/datastore/test/accounts/proxies.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;!--
+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ --&gt;
+
+&lt;!DOCTYPE proxies SYSTEM &quot;../../../conf/auth/proxies.dtd&quot;&gt;
+
+&lt;proxies&gt;
+  &lt;record&gt;
+    &lt;guid&gt;mercury&lt;/guid&gt;
+    &lt;write-proxies&gt;
+      &lt;member&gt;left_coast&lt;/member&gt;
+    &lt;/write-proxies&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;guid&gt;gemini&lt;/guid&gt;
+    &lt;write-proxies&gt;
+      &lt;member&gt;6423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/member&gt;
+    &lt;/write-proxies&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;guid&gt;apollo&lt;/guid&gt;
+    &lt;write-proxies&gt;
+      &lt;member&gt;both_coasts&lt;/member&gt;
+    &lt;/write-proxies&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;guid&gt;orion&lt;/guid&gt;
+    &lt;write-proxies&gt;
+      &lt;member&gt;recursive1_coasts&lt;/member&gt;
+    &lt;/write-proxies&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;guid&gt;non_calendar_proxy&lt;/guid&gt;
+    &lt;write-proxies&gt;
+      &lt;member&gt;non_calendar_group&lt;/member&gt;
+    &lt;/write-proxies&gt;
+    &lt;read-proxies&gt;
+      &lt;member&gt;recursive2_coasts&lt;/member&gt;
+    &lt;/read-proxies&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;guid&gt;7423F94A-6B76-4A3A-815B-D52CFD77935D&lt;/guid&gt;
+    &lt;write-proxies&gt;
+      &lt;member&gt;8A985493-EE2C-4665-94CF-4DFEA3A89500&lt;/member&gt;
+      &lt;member&gt;9FF60DAD-0BDE-4508-8C77-15F0CA5C8DD2&lt;/member&gt;
+    &lt;/write-proxies&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;guid&gt;FC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/guid&gt;
+    &lt;write-proxies&gt;
+      &lt;member&gt;EC465590-E9E9-4746-ACE8-6C756A49FE4D&lt;/member&gt;
+      &lt;member&gt;00599DAF-3E75-42DD-9DB7-52617E79943F&lt;/member&gt;
+    &lt;/write-proxies&gt;
+  &lt;/record&gt;
+&lt;/proxies&gt;
</ins></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoretestaccountsresourcesxml"></a>
<div class="addfile"><h4>Added: CalendarServer/trunk/txdav/common/datastore/test/accounts/resources.xml (0 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/test/accounts/resources.xml                                (rev 0)
+++ CalendarServer/trunk/txdav/common/datastore/test/accounts/resources.xml        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -0,0 +1,120 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+
+&lt;!--
+Copyright (c) 2006-2014 Apple Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ --&gt;
+
+&lt;!DOCTYPE accounts SYSTEM &quot;../../../conf/auth/accounts.dtd&quot;&gt;
+
+&lt;directory realm=&quot;Test&quot;&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;mercury&lt;/uid&gt;
+    &lt;short-name&gt;mercury&lt;/short-name&gt;
+    &lt;password&gt;mercury&lt;/password&gt;
+    &lt;full-name&gt;Mercury Seven&lt;/full-name&gt;
+    &lt;email&gt;mercury@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;gemini&lt;/uid&gt;
+    &lt;short-name&gt;gemini&lt;/short-name&gt;
+    &lt;password&gt;gemini&lt;/password&gt;
+    &lt;full-name&gt;Gemini Twelve&lt;/full-name&gt;
+    &lt;email&gt;gemini@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;apollo&lt;/uid&gt;
+    &lt;short-name&gt;apollo&lt;/short-name&gt;
+    &lt;password&gt;apollo&lt;/password&gt;
+    &lt;full-name&gt;Apollo Eleven&lt;/full-name&gt;
+    &lt;email&gt;apollo@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;orion&lt;/uid&gt;
+    &lt;short-name&gt;orion&lt;/short-name&gt;
+    &lt;password&gt;orion&lt;/password&gt;
+    &lt;full-name&gt;Orion&lt;/full-name&gt;
+    &lt;email&gt;orion@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;resource&quot;&gt;
+    &lt;uid&gt;transporter&lt;/uid&gt;
+    &lt;short-name&gt;transporter&lt;/short-name&gt;
+    &lt;password&gt;transporter&lt;/password&gt;
+    &lt;full-name&gt;Mass Transporter&lt;/full-name&gt;
+    &lt;email&gt;transporter@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;resource&quot;&gt;
+    &lt;uid&gt;ftlcpu&lt;/uid&gt;
+    &lt;short-name&gt;ftlcpu&lt;/short-name&gt;
+    &lt;password&gt;ftlcpu&lt;/password&gt;
+    &lt;full-name&gt;Faster-Than-Light Microprocessor&lt;/full-name&gt;
+    &lt;email&gt;ftlcpu@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;resource&quot;&gt;
+    &lt;uid&gt;non_calendar_proxy&lt;/uid&gt;
+    &lt;short-name&gt;non_calendar_proxy&lt;/short-name&gt;
+    &lt;password&gt;non_calendar_proxy&lt;/password&gt;
+    &lt;full-name&gt;Non-calendar proxy&lt;/full-name&gt;
+    &lt;email&gt;non_calendar_proxy@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;resource&quot;&gt;
+    &lt;uid&gt;disabled&lt;/uid&gt;
+    &lt;short-name&gt;disabled&lt;/short-name&gt;
+    &lt;password&gt;disabled&lt;/password&gt;
+    &lt;full-name&gt;Disabled Record&lt;/full-name&gt;
+    &lt;email&gt;disabled@example.com&lt;/email&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;__sanchezoffice__&lt;/uid&gt;
+    &lt;short-name&gt;sanchezoffice&lt;/short-name&gt;
+    &lt;full-name&gt;Sanchez Office&lt;/full-name&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;75EA36BE-F71B-40F9-81F9-CF59BF40CA8F&lt;/uid&gt;
+    &lt;guid&gt;75EA36BE-F71B-40F9-81F9-CF59BF40CA8F&lt;/guid&gt;
+    &lt;short-name&gt;location01&lt;/short-name&gt;
+    &lt;password&gt;location01&lt;/password&gt;
+    &lt;full-name&gt;Room 01&lt;/full-name&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;room-addr-1&lt;/uid&gt;
+    &lt;guid&gt;634A102B-6902-464F-9451-8A86A31628C1&lt;/guid&gt;
+    &lt;short-name&gt;room-with-address-1&lt;/short-name&gt;
+    &lt;password&gt;room-addr-2&lt;/password&gt;
+    &lt;full-name&gt;Room with Address 1&lt;/full-name&gt;
+    &lt;associated-address&gt;1-infinite-loop&lt;/associated-address&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;location&quot;&gt;
+    &lt;uid&gt;room-addr-2&lt;/uid&gt;
+    &lt;short-name&gt;room-with-address-2&lt;/short-name&gt;
+    &lt;password&gt;room-addr-2&lt;/password&gt;
+    &lt;full-name&gt;Room with Address 2&lt;/full-name&gt;
+    &lt;associated-address&gt;2-infinite-loop&lt;/associated-address&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;address&quot;&gt;
+    &lt;uid&gt;1-infinite-loop&lt;/uid&gt;
+    &lt;short-name&gt;il1&lt;/short-name&gt;
+    &lt;full-name&gt;One Infinite Loop&lt;/full-name&gt;
+    &lt;street-address&gt;1 Infinite Loop, Cupertino, CA 95014&lt;/street-address&gt;
+    &lt;geographic-location&gt;37.331741,-122.030333&lt;/geographic-location&gt;
+  &lt;/record&gt;
+  &lt;record type=&quot;address&quot;&gt;
+    &lt;uid&gt;2-infinite-loop&lt;/uid&gt;
+    &lt;short-name&gt;il2&lt;/short-name&gt;
+    &lt;full-name&gt;Two Infinite Loop&lt;/full-name&gt;
+    &lt;street-address&gt;2 Infinite Loop, Cupertino, CA 95014&lt;/street-address&gt;
+    &lt;geographic-location&gt;37.332633,-122.030502&lt;/geographic-location&gt;
+  &lt;/record&gt;
+
+&lt;/directory&gt;
</ins></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/test/test_sql.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/test/test_sql.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/test/test_sql.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -26,11 +26,10 @@
</span><span class="cx"> from twisted.trial.unittest import TestCase
</span><span class="cx"> from twisted.internet.defer import Deferred
</span><span class="cx"> 
</span><del>-from txdav.caldav.datastore.test.util import buildDirectoryRecord
</del><span class="cx"> from txdav.common.datastore.sql import log, CommonStoreTransactionMonitor, \
</span><span class="cx">     CommonHome, CommonHomeChild, ECALENDARTYPE
</span><span class="cx"> from txdav.common.datastore.sql_tables import schema
</span><del>-from txdav.common.datastore.test.util import CommonCommonTests, buildStore
</del><ins>+from txdav.common.datastore.test.util import CommonCommonTests
</ins><span class="cx"> from txdav.common.icommondatastore import AllRetriesFailed
</span><span class="cx"> from txdav.common.datastore.sql import fixUUIDNormalization
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="lines">@@ -38,9 +37,10 @@
</span><span class="cx"> from uuid import UUID
</span><span class="cx"> 
</span><span class="cx"> exampleUID = UUID(&quot;a&quot; * 32)
</span><del>-denormalizedUID = str(exampleUID)
</del><ins>+denormalizedUID = unicode(exampleUID)
</ins><span class="cx"> normalizedUID = denormalizedUID.upper()
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class CommonSQLStoreTests(CommonCommonTests, TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Tests for shared functionality in L{txdav.common.datastore.sql}.
</span><span class="lines">@@ -52,19 +52,11 @@
</span><span class="cx">         Set up two stores to migrate between.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         yield super(CommonSQLStoreTests, self).setUp()
</span><del>-        self._sqlStore = yield buildStore(self, self.notifierFactory)
-        self._sqlStore.directoryService().addRecord(buildDirectoryRecord(denormalizedUID))
-        self._sqlStore.directoryService().addRecord(buildDirectoryRecord(normalizedUID))
-        self._sqlStore.directoryService().addRecord(buildDirectoryRecord(&quot;uid&quot;))
</del><ins>+        yield self.buildStoreAndDirectory(
+            extraUids=(denormalizedUID, normalizedUID, u&quot;uid&quot;)
+        )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Return a store for testing.
-        &quot;&quot;&quot;
-        return self._sqlStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_logging(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -72,9 +64,9 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # Patch config to turn on logging then rebuild the store
</span><del>-        self.patch(self._sqlStore, &quot;logLabels&quot;, True)
-        self.patch(self._sqlStore, &quot;logStats&quot;, True)
-        self.patch(self._sqlStore, &quot;logSQL&quot;, True)
</del><ins>+        self.patch(self.store, &quot;logLabels&quot;, True)
+        self.patch(self.store, &quot;logStats&quot;, True)
+        self.patch(self.store, &quot;logSQL&quot;, True)
</ins><span class="cx"> 
</span><span class="cx">         txn = self.transactionUnderTest()
</span><span class="cx">         cs = schema.CALENDARSERVER
</span><span class="lines">@@ -97,7 +89,7 @@
</span><span class="cx">         self.patch(CommonStoreTransactionMonitor, &quot;callLater&quot;, c.callLater)
</span><span class="cx"> 
</span><span class="cx">         # Patch config to turn on log waits then rebuild the store
</span><del>-        self.patch(self._sqlStore, &quot;logTransactionWaits&quot;, 1)
</del><ins>+        self.patch(self.store, &quot;logTransactionWaits&quot;, 1)
</ins><span class="cx"> 
</span><span class="cx">         ctr = [0]
</span><span class="cx">         def counter(*args, **kwargs):
</span><span class="lines">@@ -120,7 +112,7 @@
</span><span class="cx">         self.patch(CommonStoreTransactionMonitor, &quot;callLater&quot;, c.callLater)
</span><span class="cx"> 
</span><span class="cx">         # Patch config to turn on transaction timeouts then rebuild the store
</span><del>-        self.patch(self._sqlStore, &quot;timeoutTransactions&quot;, 1)
</del><ins>+        self.patch(self.store, &quot;timeoutTransactions&quot;, 1)
</ins><span class="cx"> 
</span><span class="cx">         ctr = [0]
</span><span class="cx">         def counter(*args, **kwargs):
</span><span class="lines">@@ -145,8 +137,8 @@
</span><span class="cx">         self.patch(CommonStoreTransactionMonitor, &quot;callLater&quot;, c.callLater)
</span><span class="cx"> 
</span><span class="cx">         # Patch config to turn on log waits then rebuild the store
</span><del>-        self.patch(self._sqlStore, &quot;logTransactionWaits&quot;, 1)
-        self.patch(self._sqlStore, &quot;timeoutTransactions&quot;, 2)
</del><ins>+        self.patch(self.store, &quot;logTransactionWaits&quot;, 1)
+        self.patch(self.store, &quot;timeoutTransactions&quot;, 2)
</ins><span class="cx"> 
</span><span class="cx">         ctr = [0, 0]
</span><span class="cx">         def counter(logStr, *args, **kwargs):
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/test/util.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/test/util.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/test/util.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -23,10 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> 
</span><del>-from zope.interface.declarations import implements
-from txdav.common.idirectoryservice import IStoreDirectoryService, \
-    IStoreDirectoryRecord
-
</del><span class="cx"> # FIXME: Don't import from calendarserver in txdav
</span><span class="cx"> from calendarserver.push.notifier import Notifier
</span><span class="cx"> 
</span><span class="lines">@@ -37,7 +33,7 @@
</span><span class="cx"> from random import Random
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.python.filepath import CachingFilePath
</del><ins>+from twext.python.filepath import CachingFilePath as FilePath
</ins><span class="cx"> from twext.enterprise.adbapi2 import ConnectionPool
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><span class="cx"> from twext.who.directory import DirectoryRecord
</span><span class="lines">@@ -45,12 +41,12 @@
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import Deferred, inlineCallbacks
</span><del>-from twisted.internet.defer import returnValue, succeed
</del><ins>+from twisted.internet.defer import returnValue
</ins><span class="cx"> from twisted.internet.task import deferLater
</span><span class="cx"> from twisted.trial.unittest import TestCase
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav import ical
</span><del>-from twistedcaldav.config import config
</del><ins>+from twistedcaldav.config import config, ConfigDict
</ins><span class="cx"> from twistedcaldav.ical import Component as VComponent, Component
</span><span class="cx"> from twistedcaldav.stdconfig import DEFAULT_CONFIG
</span><span class="cx"> from twistedcaldav.vcard import Component as ABComponent
</span><span class="lines">@@ -62,6 +58,7 @@
</span><span class="cx"> from txdav.common.datastore.sql import CommonDataStore, current_sql_schema
</span><span class="cx"> from txdav.common.datastore.sql_tables import schema
</span><span class="cx"> from txdav.common.icommondatastore import NoSuchHomeChildError
</span><ins>+from txdav.who.util import buildDirectory
</ins><span class="cx"> 
</span><span class="cx"> from txweb2.dav.resource import TwistedGETContentMD5
</span><span class="cx"> 
</span><span class="lines">@@ -103,100 +100,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class TestStoreDirectoryService(object):
</del><span class="cx"> 
</span><del>-    implements(IStoreDirectoryService)
-
-    def __init__(self):
-        self.records = {}
-
-
-    def recordWithUID(self, uid):
-        return succeed(self.records.get(uid))
-
-
-    def recordWithGUID(self, guid):
-        for record in self.records.itervalues():
-            if record.guid == guid:
-                return succeed(record)
-        return succeed(None)
-
-
-    def recordWithCalendarUserAddress(self, cuaddr):
-        if cuaddr.startswith(&quot;urn:x-uid:&quot;):
-            return self.recordWithUID(cuaddr[10:])
-        elif cuaddr.startswith(&quot;urn:uuid:&quot;):
-            return self.recordWithUID(cuaddr[9:])
-        else:
-            return succeed(None)
-
-
-    def addRecord(self, record):
-        self.records[record.uid] = record
-
-
-    def removeRecord(self, uid):
-        del self.records[uid]
-
-
-
-class TestStoreDirectoryRecord(object):
-
-    implements(IStoreDirectoryRecord)
-
-    def __init__(self, uid, shortNames, fullName, thisServer=True, server=None, extras={}):
-        self.uid = uid
-        self.guid = uid
-        self.shortNames = shortNames
-        self.fullName = fullName
-        self.displayName = self.fullName if self.fullName else self.shortNames[0]
-        self._thisServer = thisServer
-        self._server = server
-        self.extras = extras
-
-
-    def thisServer(self):
-        return self._thisServer
-
-
-    def server(self):
-        return self._server
-
-
-    def serverURI(self):
-        return self._server.uri if self._server else &quot;&quot;
-
-
-
-def buildDirectory(homes=None):
-
-    directory = TestStoreDirectoryService()
-
-    # User accounts
-    for ctr in range(1, 100):
-        directory.addRecord(TestStoreDirectoryRecord(
-            &quot;user%02d&quot; % (ctr,),
-            (&quot;user%02d&quot; % (ctr,),),
-            &quot;User %02d&quot; % (ctr,),
-        ))
-
-    homes = set(homes) if homes is not None else set()
-    for uid in homes:
-        directory.addRecord(buildDirectoryRecord(uid))
-
-    return directory
-
-
-
-def buildDirectoryRecord(uid):
-    return TestStoreDirectoryRecord(
-        uid,
-        (uid,),
-        uid.capitalize(),
-    )
-
-
-
</del><span class="cx"> class SQLStoreBuilder(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Test-fixture-builder which can construct a PostgresStore.
</span><span class="lines">@@ -211,7 +115,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a L{PostgresService} to use for building a store.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        dbRoot = CachingFilePath(self.sharedDBPath)
</del><ins>+        dbRoot = FilePath(self.sharedDBPath)
</ins><span class="cx">         return PostgresService(
</span><span class="cx">             dbRoot, serviceFactory, current_sql_schema, resetSchema=True,
</span><span class="cx">             databaseName=&quot;caldav&quot;,
</span><span class="lines">@@ -234,7 +138,7 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         disableMemcacheForTest(TestCase())
</span><span class="cx">         staticQuota = 3000
</span><del>-        attachmentRoot = (CachingFilePath(self.sharedDBPath).child(&quot;attachments&quot;))
</del><ins>+        attachmentRoot = (FilePath(self.sharedDBPath).child(&quot;attachments&quot;))
</ins><span class="cx">         stubsvc = self.createService(lambda cf: Service())
</span><span class="cx"> 
</span><span class="cx">         cp = ConnectionPool(stubsvc.produceConnection, maxConnections=1)
</span><span class="lines">@@ -244,7 +148,7 @@
</span><span class="cx">         cds = CommonDataStore(
</span><span class="cx">             cp.connection,
</span><span class="cx">             {&quot;push&quot;: StubNotifierFactory(), },
</span><del>-            TestStoreDirectoryService(),
</del><ins>+            None,
</ins><span class="cx">             attachmentRoot, &quot;&quot;,
</span><span class="cx">             quota=staticQuota
</span><span class="cx">         )
</span><span class="lines">@@ -258,10 +162,9 @@
</span><span class="cx">         @return: a L{Deferred} which fires with an L{IDataStore}.
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         disableMemcacheForTest(testCase)
</span><del>-        dbRoot = CachingFilePath(self.sharedDBPath)
</del><ins>+        dbRoot = FilePath(self.sharedDBPath)
</ins><span class="cx">         attachmentRoot = dbRoot.child(&quot;attachments&quot;)
</span><del>-        if directoryService is None:
-            directoryService = buildDirectory(homes=homes)
</del><ins>+        # The directory will be given to us later via setDirectoryService
</ins><span class="cx">         if self.sharedService is None:
</span><span class="cx">             ready = Deferred()
</span><span class="cx">             def getReady(connectionFactory, storageService):
</span><span class="lines">@@ -694,6 +597,106 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+
+def buildTestDirectory(
+    store, dataRoot, accounts=None, resources=None, augments=None, proxies=None,
+    serversDB=None
+):
+    &quot;&quot;&quot;
+    @param store: the store for the directory to use
+
+    @param dataRoot: the directory to copy xml files to
+
+    @param accounts: path to the accounts.xml file
+    @type accounts: L{FilePath}
+
+    @param resources: path to the resources.xml file
+    @type resources: L{FilePath}
+
+    @param augments: path to the augments.xml file
+    @type augments: L{FilePath}
+
+    @param proxies: path to the proxies.xml file
+    @type proxies: L{FilePath}
+
+    @return: the directory service
+    @rtype: L{IDirectoryService}
+    &quot;&quot;&quot;
+
+    defaultDirectory = FilePath(__file__).sibling(&quot;accounts&quot;)
+    if accounts is None:
+        accounts = defaultDirectory.child(&quot;accounts.xml&quot;)
+    if resources is None:
+        resources = defaultDirectory.child(&quot;resources.xml&quot;)
+    if augments is None:
+        augments = defaultDirectory.child(&quot;augments.xml&quot;)
+    if proxies is None:
+        proxies = defaultDirectory.child(&quot;proxies.xml&quot;)
+
+    if not os.path.exists(dataRoot):
+        os.makedirs(dataRoot)
+
+    accountsCopy = FilePath(dataRoot).child(&quot;accounts.xml&quot;)
+    accountsCopy.setContent(accounts.getContent())
+
+    resourcesCopy = FilePath(dataRoot).child(&quot;resources.xml&quot;)
+    resourcesCopy.setContent(resources.getContent())
+
+    augmentsCopy = FilePath(dataRoot).child(&quot;augments.xml&quot;)
+    augmentsCopy.setContent(augments.getContent())
+
+    proxiesCopy = FilePath(dataRoot).child(&quot;proxies.xml&quot;)
+    proxiesCopy.setContent(proxies.getContent())
+
+    servicesInfo = (
+        ConfigDict(
+            {
+                &quot;Enabled&quot;: True,
+                &quot;type&quot;: &quot;xml&quot;,
+                &quot;params&quot;: {
+                    &quot;xmlFile&quot;: &quot;accounts.xml&quot;,
+                    &quot;recordTypes&quot;: (&quot;users&quot;, &quot;groups&quot;),
+                },
+            }
+        ),
+        ConfigDict(
+            {
+                &quot;Enabled&quot;: True,
+                &quot;type&quot;: &quot;xml&quot;,
+                &quot;params&quot;: {
+                    &quot;xmlFile&quot;: &quot;resources.xml&quot;,
+                    &quot;recordTypes&quot;: (&quot;locations&quot;, &quot;resources&quot;, &quot;addresses&quot;),
+                },
+            }
+        ),
+    )
+    augmentServiceInfo = ConfigDict(
+        {
+            &quot;type&quot;: &quot;twistedcaldav.directory.augment.AugmentXMLDB&quot;,
+            &quot;params&quot;: {
+                &quot;xmlFiles&quot;: [&quot;augments.xml&quot;, ],
+                &quot;statSeconds&quot;: 15,
+            },
+        }
+    )
+    wikiServiceInfo = ConfigDict(
+        {
+            &quot;Enabled&quot;: True,
+            &quot;CollabHost&quot;: &quot;localhost&quot;,
+            &quot;CollabPort&quot;: 4444,
+        }
+    )
+    directory = buildDirectory(
+        store, dataRoot, servicesInfo, augmentServiceInfo, wikiServiceInfo,
+        serversDB
+    )
+
+    store.setDirectoryService(directory)
+
+    return directory
+
+
+
</ins><span class="cx"> class CommonCommonTests(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Common utility functionality for file/store combination tests.
</span><span class="lines">@@ -703,6 +706,85 @@
</span><span class="cx">     savedStore = None
</span><span class="cx">     assertProvides = assertProvides
</span><span class="cx"> 
</span><ins>+
+    @inlineCallbacks
+    def buildStoreAndDirectory(
+        self, accounts=None, resources=None, augments=None, proxies=None,
+        extraUids=None, serversDB=None
+    ):
+
+        self.serverRoot = self.mktemp()
+        os.mkdir(self.serverRoot)
+
+        self.counter = 0
+        self.notifierFactory = StubNotifierFactory()
+
+        config.reset()
+        self.configure()
+
+        self.store = yield self.buildStore()
+        self._sqlCalendarStore = self.store  # FIXME: remove references to this
+
+        self.directory = buildTestDirectory(
+            self.store, config.DataRoot,
+            accounts=accounts, resources=resources,
+            augments=augments, proxies=proxies,
+            serversDB=serversDB
+        )
+        if extraUids:
+            for uid in extraUids:
+                yield self.addRecordFromFields(
+                    {
+                        self.directory.fieldName.uid:
+                            uid,
+                        self.directory.fieldName.recordType:
+                            self.directory.recordType.user,
+                    }
+                )
+
+
+    def configure(self):
+        &quot;&quot;&quot;
+        Modify the configuration to suit unit tests, with a mktemp-created
+        ServerRoot
+        &quot;&quot;&quot;
+
+        config.ServerRoot = os.path.abspath(self.serverRoot)
+        config.ConfigRoot = &quot;config&quot;
+        config.LogRoot = &quot;logs&quot;
+        config.RunRoot = &quot;logs&quot;
+
+        if not os.path.exists(config.DataRoot):
+            os.makedirs(config.DataRoot)
+        if not os.path.exists(config.DocumentRoot):
+            os.makedirs(config.DocumentRoot)
+        if not os.path.exists(config.ConfigRoot):
+            os.makedirs(config.ConfigRoot)
+        if not os.path.exists(config.LogRoot):
+            os.makedirs(config.LogRoot)
+
+        # Work queues for implicit scheduling slow down tests a lot and require them all to add
+        # &quot;waits&quot; for work to complete. Rewriting all the current tests to do that is not practical
+        # right now, so we will turn this off by default. Instead we will have a set of tests dedicated
+        # to work queue-based scheduling which will patch this option to True.
+        config.Scheduling.Options.WorkQueues.Enabled = False
+
+        self.config = config
+
+
+
+    def buildStore(self, storeBuilder=theStoreBuilder):
+        &quot;&quot;&quot;
+        Builds and returns a store
+        &quot;&quot;&quot;
+
+        # Build the store before the directory; the directory will be assigned
+        # to the store via setDirectoryService()
+        return storeBuilder.buildStore(self, self.notifierFactory, None)
+
+
+
+
</ins><span class="cx">     def transactionUnderTest(self, txn=None):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a transaction from C{storeUnderTest} and save it as
</span><span class="lines">@@ -758,29 +840,12 @@
</span><span class="cx">         return result
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def setUp(self):
-        self.counter = 0
-        self.notifierFactory = StubNotifierFactory()
-        self.configInit()
</del><span class="cx"> 
</span><del>-
-    def configInit(self):
-        &quot;&quot;&quot;
-        Hard code some config options
-        &quot;&quot;&quot;
-
-        # Work queues for implicit scheduling slow down tests a lot and require them all to add
-        # &quot;waits&quot; for work to complete. Rewriting all the current tests to do that is not practical
-        # right now, so we will turn this off by default. Instead we will have a set of tests dedicated
-        # to work queue-based scheduling which will patch this option to True.
-        config.Scheduling.Options.WorkQueues.Enabled = False
-
-
</del><span class="cx">     def storeUnderTest(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        Subclasses must implement this method.
</del><ins>+        Create and return the L{CalendarStore} for testing.
</ins><span class="cx">         &quot;&quot;&quot;
</span><del>-        raise NotImplementedError(&quot;CommonCommonTests subclasses must implement.&quot;)
</del><ins>+        return self.store
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="lines">@@ -855,6 +920,16 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def addRecordFromFields(self, fields):
+        updatedRecord = DirectoryRecord(self.directory, fields)
+        yield self.directory.updateRecords((updatedRecord,), create=True)
+
+    @inlineCallbacks
+    def removeRecord(self, uid):
+        yield self.directory.removeRecords([uid])
+
+
+    @inlineCallbacks
</ins><span class="cx">     def changeRecord(self, record, fieldname, value):
</span><span class="cx">         fields = record.fields.copy()
</span><span class="cx">         fields[fieldname] = value
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoreupgradetesttest_migratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/upgrade/test/test_migrate.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/upgrade/test/test_migrate.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/upgrade/test/test_migrate.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -39,12 +39,12 @@
</span><span class="cx"> from txdav.carddav.datastore.test.common import CommonTests as ABCommonTests
</span><span class="cx"> from txdav.common.datastore.file import CommonDataStore
</span><span class="cx"> from txdav.common.datastore.sql_tables import schema
</span><del>-from txdav.common.datastore.test.util import SQLStoreBuilder, \
-    TestStoreDirectoryService
-from txdav.common.datastore.test.util import theStoreBuilder, \
-    populateCalendarsFrom, StubNotifierFactory, resetCalendarMD5s, \
-    populateAddressBooksFrom, resetAddressBookMD5s, deriveValue, \
-    withSpecialValue
</del><ins>+from txdav.common.datastore.test.util import SQLStoreBuilder
+from txdav.common.datastore.test.util import (
+    populateCalendarsFrom, StubNotifierFactory, resetCalendarMD5s,
+    populateAddressBooksFrom, resetAddressBookMD5s, deriveValue,
+    withSpecialValue, CommonCommonTests
+)
</ins><span class="cx"> from txdav.common.datastore.upgrade.migrate import UpgradeToDatabaseStep, \
</span><span class="cx">     StoreSpawnerService, swapAMP
</span><span class="cx"> from txdav.xml import element
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class HomeMigrationTests(TestCase):
</del><ins>+class HomeMigrationTests(CommonCommonTests, TestCase):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Tests for L{UpgradeToDatabaseStep}.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -161,26 +161,28 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Set up two stores to migrate between.
</span><span class="cx">         &quot;&quot;&quot;
</span><ins>+
+        yield super(HomeMigrationTests, self).setUp()
+        yield self.buildStoreAndDirectory(
+            extraUids=(
+                u&quot;home1&quot;,
+                u&quot;home2&quot;,
+                u&quot;home3&quot;,
+                u&quot;home_defaults&quot;,
+                u&quot;home_no_splits&quot;,
+                u&quot;home_splits&quot;,
+                u&quot;home_splits_shared&quot;,
+            )
+        )
+        self.sqlStore = self.store
+
</ins><span class="cx">         # Add some files to the file store.
</span><span class="cx"> 
</span><span class="cx">         self.filesPath = CachingFilePath(self.mktemp())
</span><span class="cx">         self.filesPath.createDirectory()
</span><span class="cx">         fileStore = self.fileStore = CommonDataStore(
</span><del>-            self.filesPath, {&quot;push&quot;: StubNotifierFactory()}, TestStoreDirectoryService(), True, True
</del><ins>+            self.filesPath, {&quot;push&quot;: StubNotifierFactory()}, self.directory, True, True
</ins><span class="cx">         )
</span><del>-        self.sqlStore = yield theStoreBuilder.buildStore(
-            self,
-            StubNotifierFactory(),
-            homes=(
-                &quot;home1&quot;,
-                &quot;home2&quot;,
-                &quot;home3&quot;,
-                &quot;home_defaults&quot;,
-                &quot;home_no_splits&quot;,
-                &quot;home_splits&quot;,
-                &quot;home_splits_shared&quot;,
-            )
-        )
</del><span class="cx">         self.upgrader = UpgradeToDatabaseStep(self.fileStore, self.sqlStore)
</span><span class="cx"> 
</span><span class="cx">         requirements = CommonTests.requirements
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoreworktesttest_inbox_cleanuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/work/test/test_inbox_cleanup.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/work/test/test_inbox_cleanup.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/work/test/test_inbox_cleanup.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twisted.trial.unittest import TestCase
</span><span class="cx"> from twistedcaldav.config import config
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.common.datastore.sql_tables import schema
</span><span class="cx"> import datetime
</span><span class="cx"> 
</span><span class="lines">@@ -38,7 +37,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(InboxCleanupTests, self).setUp()
</span><del>-        self._sqlStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -121,13 +120,6 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def test_inboxCleanupWorkQueueing(self):
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServertrunktxdavcommondatastoreworktesttest_revision_cleanuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/common/datastore/work/test/test_revision_cleanup.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/common/datastore/work/test/test_revision_cleanup.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/common/datastore/work/test/test_revision_cleanup.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> from twisted.trial.unittest import TestCase
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.vcard import Component as VCard
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore
</del><span class="cx"> from txdav.common.datastore.sql_tables import schema, _BIND_MODE_READ
</span><span class="cx"> from txdav.common.datastore.test.util import CommonCommonTests, populateCalendarsFrom
</span><span class="cx"> from txdav.common.datastore.work.revision_cleanup import FindMinValidRevisionWork, RevisionCleanupWork
</span><span class="lines">@@ -40,7 +39,7 @@
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><span class="cx">         yield super(RevisionCleanupTests, self).setUp()
</span><del>-        self._sqlStore = yield buildCalendarStore(self, self.notifierFactory)
</del><ins>+        yield self.buildStoreAndDirectory()
</ins><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx">         class FakeWork(WorkItem):
</span><span class="lines">@@ -221,13 +220,6 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlStore
-
-
</del><span class="cx">     @inlineCallbacks
</span><span class="cx">     def _createCalendarShare(self):
</span><span class="cx">         # Invite
</span></span></pre></div>
<a id="CalendarServertrunktxdavdpstesttest_clientpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/dps/test/test_client.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/dps/test/test_client.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/dps/test/test_client.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -375,7 +375,7 @@
</span><span class="cx">         records = (yield self.client.recordsWithRecordType(
</span><span class="cx">             RecordType.user
</span><span class="cx">         ))
</span><del>-        self.assertEquals(len(records), 34)
</del><ins>+        self.assertEquals(len(records), 240)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span></span></pre></div>
<a id="CalendarServertrunktxdavwhodirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/who/directory.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/who/directory.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/who/directory.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.ical import Property
</span><del>-from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
</del><span class="cx"> from txdav.caldav.datastore.scheduling.utils import normalizeCUAddr
</span><span class="cx"> from txdav.who.delegates import RecordType as DelegateRecordType
</span><span class="cx"> from txdav.who.idirectory import (
</span><span class="lines">@@ -52,6 +51,14 @@
</span><span class="cx"> 
</span><span class="cx">     guid = &quot;1332A615-4D3A-41FE-B636-FBE25BFB982E&quot;
</span><span class="cx"> 
</span><ins>+
+
+    serversDB = None
+
+    def setServersDB(self, serversDB):
+        self.serversDB = serversDB
+
+
</ins><span class="cx">     # Must maintain the hack for a bit longer:
</span><span class="cx">     def setPrincipalCollection(self, principalCollection):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -395,8 +402,11 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         URL of the server hosting this record. Return None if hosted on this server.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        if config.Servers.Enabled and getattr(self, &quot;serviceNodeUID&quot;, None):
-            return Servers.getServerURIById(self.serviceNodeUID)
</del><ins>+        if (
+            self.service.serversDB is not None and
+            getattr(self, &quot;serviceNodeUID&quot;, None)
+        ):
+            return self.service.serversDB.getServerURIById(self.serviceNodeUID)
</ins><span class="cx">         else:
</span><span class="cx">             return None
</span><span class="cx"> 
</span><span class="lines">@@ -405,8 +415,11 @@
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Server hosting this record. Return None if hosted on this server.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        if config.Servers.Enabled and getattr(self, &quot;serviceNodeUID&quot;, None):
-            return Servers.getServerById(self.serviceNodeUID)
</del><ins>+        if (
+            self.service.serversDB is not None and
+            getattr(self, &quot;serviceNodeUID&quot;, None)
+        ):
+            return self.service.serversDB.getServerById(self.serviceNodeUID)
</ins><span class="cx">         else:
</span><span class="cx">             return None
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunktxdavwhotestsupportpy"></a>
<div class="addfile"><h4>Added: CalendarServer/trunk/txdav/who/test/support.py (0 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/who/test/support.py                                (rev 0)
+++ CalendarServer/trunk/txdav/who/test/support.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+##
+# Copyright (c) 2013 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+from twext.who.idirectory import (
+    RecordType,
+    NoSuchRecordError
+)
+from twext.who.index import DirectoryService as IndexDirectoryService
+from twext.who.util import ConstantsContainer
+from txdav.who.idirectory import (
+    RecordType as CalRecordType
+)
+from twisted.internet.defer import succeed, inlineCallbacks
+
+
+
+class InMemoryDirectoryService(IndexDirectoryService):
+    &quot;&quot;&quot;
+    An in-memory IDirectoryService.  You must call updateRecords( ) if you want
+    to populate this service.
+    &quot;&quot;&quot;
+
+    recordType = ConstantsContainer(
+        (
+            RecordType.user,
+            RecordType.group,
+            CalRecordType.location,
+            CalRecordType.resource,
+            CalRecordType.address
+        )
+    )
+
+
+    def loadRecords(self):
+        pass
+
+
+    @inlineCallbacks
+    def updateRecords(self, records, create=False):
+        recordsByUID = dict(((record.uid, record) for record in records))
+        if not create:
+            # Make sure all the records already exist
+            for uid, record in recordsByUID.items():
+                if uid not in self._index[self.fieldName.uid]:
+                    raise NoSuchRecordError(uid)
+
+        yield self.removeRecords(recordsByUID.keys())
+        self.indexRecords(records)
+
+
+    def removeRecords(self, uids):
+        index = self._index
+        for fieldName in self.indexedFields:
+            for recordSet in index[fieldName].itervalues():
+                for record in list(recordSet):
+                    if record.uid in uids:
+                        recordSet.remove(record)
+        return succeed(None)
</ins></span></pre></div>
<a id="CalendarServertrunktxdavwhotesttest_group_attendeespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/who/test/test_group_attendees.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/who/test/test_group_attendees.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/who/test/test_group_attendees.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -18,17 +18,17 @@
</span><span class="cx">     group attendee tests
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+import os
+
+from twext.python.filepath import CachingFilePath as FilePath
</ins><span class="cx"> from twext.who.directory import DirectoryService
</span><del>-from twext.who.test.test_xml import xmlService
</del><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.trial import unittest
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.ical import Component, normalize_iCalStr, ignoredComponents
</span><del>-from txdav.caldav.datastore.test.util import buildCalendarStore, populateCalendarsFrom, CommonCommonTests
</del><ins>+from txdav.caldav.datastore.test.util import populateCalendarsFrom, CommonCommonTests
</ins><span class="cx"> from txdav.who.directory import CalendarDirectoryRecordMixin
</span><span class="cx"> from txdav.who.groups import GroupCacher
</span><del>-from txdav.who.util import directoryFromConfig
-import os
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> class GroupAttendeeReconciliation(CommonCommonTests, unittest.TestCase):
</span><span class="lines">@@ -38,43 +38,29 @@
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span><del>-        self.patch(config.GroupAttendees, &quot;Enabled&quot;, &quot;True&quot;)
-        self.patch(config.GroupAttendees, &quot;ReconciliationDelaySeconds&quot;, &quot;0&quot;)
-
</del><span class="cx">         yield super(GroupAttendeeReconciliation, self).setUp()
</span><del>-        self.xmlService = xmlService(self.mktemp(), xmlData=None)
</del><span class="cx"> 
</span><del>-        self.patch(
-            config.DirectoryService.params,
-            &quot;xmlFile&quot;,
-            os.path.join(
-                os.path.dirname(__file__), &quot;accounts&quot;, &quot;groupAttendeeAccounts.xml&quot;
-            )
</del><ins>+        accountsFilePath = FilePath(
+            os.path.join(os.path.dirname(__file__), &quot;accounts&quot;)
</ins><span class="cx">         )
</span><del>-        self.patch(
-            config.ResourceService.params,
-            &quot;xmlFile&quot;,
-            os.path.join(
-                os.path.dirname(__file__), &quot;accounts&quot;, &quot;resources.xml&quot;
-            )
</del><ins>+        yield self.buildStoreAndDirectory(
+            accounts=accountsFilePath.child(&quot;groupAttendeeAccounts.xml&quot;),
+            resources=accountsFilePath.child(&quot;resources.xml&quot;),
</ins><span class="cx">         )
</span><del>-        self._sqlCalendarStore = yield buildCalendarStore(self, self.notifierFactory, directoryFromConfig(config))
</del><span class="cx">         yield self.populate()
</span><span class="cx"> 
</span><span class="cx">         self.paths = {}
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def storeUnderTest(self):
-        &quot;&quot;&quot;
-        Create and return a L{CalendarStore} for testing.
-        &quot;&quot;&quot;
-        return self._sqlCalendarStore
</del><ins>+    def configure(self):
+        super(GroupAttendeeReconciliation, self).configure()
+        config.GroupAttendees.Enabled = True
+        config.GroupAttendees.ReconciliationDelaySeconds = 0
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def populate(self):
</span><span class="cx">         yield populateCalendarsFrom(self.requirements, self.storeUnderTest())
</span><del>-        self.notifierFactory.reset()
</del><span class="cx"> 
</span><span class="cx">     requirements = {
</span><span class="cx">         &quot;10000000-0000-0000-0000-000000000001&quot; : None,
</span></span></pre></div>
<a id="CalendarServertrunktxdavwhotesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/who/test/test_util.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/who/test/test_util.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/who/test/test_util.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -20,7 +20,8 @@
</span><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> 
</span><del>-from txdav.who.util import directoryFromConfig, InMemoryDirectoryService
</del><ins>+from txdav.who.util import directoryFromConfig
+from txdav.who.test.support import InMemoryDirectoryService
</ins><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twisted.trial.unittest import TestCase
</span><span class="cx"> from twistedcaldav.config import ConfigDict
</span></span></pre></div>
<a id="CalendarServertrunktxdavwhoutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/txdav/who/util.py (13467 => 13468)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/txdav/who/util.py        2014-05-09 20:48:38 UTC (rev 13467)
+++ CalendarServer/trunk/txdav/who/util.py        2014-05-09 23:38:16 UTC (rev 13468)
</span><span class="lines">@@ -20,10 +20,8 @@
</span><span class="cx"> from twext.python.types import MappingProxyType
</span><span class="cx"> from twext.who.aggregate import DirectoryService as AggregateDirectoryService
</span><span class="cx"> from twext.who.idirectory import (
</span><del>-    FieldName as BaseFieldName, RecordType, DirectoryConfigurationError,
-    NoSuchRecordError
</del><ins>+    FieldName as BaseFieldName, RecordType, DirectoryConfigurationError
</ins><span class="cx"> )
</span><del>-from twext.who.index import DirectoryService as IndexDirectoryService
</del><span class="cx"> from twext.who.ldap import (
</span><span class="cx">     DirectoryService as LDAPDirectoryService, LDAPAttribute,
</span><span class="cx">     FieldName as LDAPFieldName,
</span><span class="lines">@@ -31,7 +29,6 @@
</span><span class="cx"> )
</span><span class="cx"> from twext.who.util import ConstantsContainer
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twisted.internet.defer import succeed, inlineCallbacks
</del><span class="cx"> from twisted.python.filepath import FilePath
</span><span class="cx"> from twisted.python.reflect import namedClass
</span><span class="cx"> from twistedcaldav.config import fullServerPath
</span><span class="lines">@@ -48,16 +45,20 @@
</span><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-def directoryFromConfig(config, store=None):
</del><ins>+def directoryFromConfig(config, store=None, serversDB=None):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Return a directory service based on the config.  If you want to go through
</span><span class="cx">     AMP to talk to one of these as a client, instantiate
</span><span class="cx">     txdav.dps.client.DirectoryService
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-    # MOVE2WHO FIXME: this needs to talk to its own separate database.  In
-    # fact, don't pass store=None if you already have called storeFromConfig()
-    # within this process.  Pass the existing store in here.
</del><ins>+    # Note: Currently the directory needs a store, and the store needs a
+    # directory.  Originally the directory's store was going to be different
+    # from the calendar and contacts store, but we're not doing that, maybe
+    # ever, since it brings more headaches (managing multiple schema upgrades,
+    # etc.) You can pass store=None in here and the store will be created for
+    # you, but don't pass store=None if you already have called storeFromConfig()
+    # within this same process; pass that store in instead.
</ins><span class="cx"> 
</span><span class="cx">     # TODO: use proxyForInterface to ensure we're only using the DPS related
</span><span class="cx">     # store API.  Also define an IDirectoryProxyStore Interface
</span><span class="lines">@@ -65,10 +66,38 @@
</span><span class="cx">         _ignore_pool, txnFactory = getDBPool(config)
</span><span class="cx">         store = storeFromConfig(config, txnFactory, None)
</span><span class="cx"> 
</span><ins>+    return buildDirectory(
+        store,
+        config.DataRoot,
+        [config.DirectoryService, config.ResourceService],
+        config.AugmentService,
+        config.Authentication.Wiki,
+        serversDB=serversDB
+    )
+
+
+def buildDirectory(
+    store, dataRoot, servicesInfo, augmentServiceInfo, wikiServiceInfo,
+    serversDB=None
+):
+    &quot;&quot;&quot;
+    Return a directory without using a config object; suitable for tests
+    which need to have mulitple directory instances.
+
+    @param store: The store.
+    @param dataRoot: The path to the directory containing xml files for any xml
+        based services.
+    @param servicesInfo:  An interable of ConfigDicts mirroring the
+        DirectoryService and ResourceService sections of stdconfig
+    @param augmentServiceInfo: A ConfigDict mirroring the AugmentService section
+        of stdconfig
+    @param wikiServiceInfo: A ConfigDict mirroring the Wiki section of stdconfig
+    @param serversDB: A ServersDB object to assign to the directory
+    &quot;&quot;&quot;
+
</ins><span class="cx">     aggregatedServices = []
</span><span class="cx"> 
</span><del>-    for serviceKey in (&quot;DirectoryService&quot;, &quot;ResourceService&quot;):
-        serviceValue = config.get(serviceKey, None)
</del><ins>+    for serviceValue in servicesInfo:
</ins><span class="cx"> 
</span><span class="cx">         if not serviceValue.Enabled:
</span><span class="cx">             continue
</span><span class="lines">@@ -76,14 +105,9 @@
</span><span class="cx">         directoryType = serviceValue.type.lower()
</span><span class="cx">         params = serviceValue.params
</span><span class="cx"> 
</span><del>-        # TODO: add a &quot;test&quot; directory service that produces test records
-        # from code -- no files needed.
-        # The InMemoryDirectoryService now exists, it just needs hooking up
-        # here.
-
</del><span class="cx">         if &quot;xml&quot; in directoryType:
</span><span class="cx">             xmlFile = params.xmlFile
</span><del>-            xmlFile = fullServerPath(config.DataRoot, xmlFile)
</del><ins>+            xmlFile = fullServerPath(dataRoot, xmlFile)
</ins><span class="cx">             fp = FilePath(xmlFile)
</span><span class="cx">             if not fp.exists():
</span><span class="cx">                 fp.setContent(DEFAULT_XML_CONTENT)
</span><span class="lines">@@ -144,6 +168,10 @@
</span><span class="cx">                 })
</span><span class="cx">             )
</span><span class="cx"> 
</span><ins>+        elif &quot;inmemory&quot; in directoryType:
+            from txdav.who.test.support import InMemoryDirectoryService
+            directory = InMemoryDirectoryService()
+
</ins><span class="cx">         else:
</span><span class="cx">             log.error(&quot;Invalid DirectoryType: {dt}&quot;, dt=directoryType)
</span><span class="cx">             raise DirectoryConfigurationError
</span><span class="lines">@@ -180,14 +208,14 @@
</span><span class="cx">     #
</span><span class="cx">     # Setup the Augment Service
</span><span class="cx">     #
</span><del>-    if config.AugmentService.type:
-        augmentClass = namedClass(config.AugmentService.type)
</del><ins>+    if augmentServiceInfo.type:
+        augmentClass = namedClass(augmentServiceInfo.type)
</ins><span class="cx">         log.info(
</span><span class="cx">             &quot;Configuring augment service of type: {augmentClass}&quot;,
</span><span class="cx">             augmentClass=augmentClass
</span><span class="cx">         )
</span><span class="cx">         try:
</span><del>-            augmentService = augmentClass(**config.AugmentService.params)
</del><ins>+            augmentService = augmentClass(**augmentServiceInfo.params)
</ins><span class="cx">         except IOError:
</span><span class="cx">             log.error(&quot;Could not start augment service&quot;)
</span><span class="cx">             raise
</span><span class="lines">@@ -211,12 +239,12 @@
</span><span class="cx">     aggregatedServices.append(delegateDirectory)
</span><span class="cx"> 
</span><span class="cx">     # Wiki service
</span><del>-    if config.Authentication.Wiki.Enabled:
</del><ins>+    if wikiServiceInfo.Enabled:
</ins><span class="cx">         aggregatedServices.append(
</span><span class="cx">             WikiDirectoryService(
</span><span class="cx">                 userDirectory.realmName,
</span><del>-                config.Authentication.Wiki.CollabHost,
-                config.Authentication.Wiki.CollabPort
</del><ins>+                wikiServiceInfo.CollabHost,
+                wikiServiceInfo.CollabPort
</ins><span class="cx">             )
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="lines">@@ -242,6 +270,9 @@
</span><span class="cx">         log.error(&quot;Could not create directory service&quot;, error=e)
</span><span class="cx">         raise
</span><span class="cx"> 
</span><ins>+    if serversDB is not None:
+        augmented.setServersDB(serversDB)
+
</ins><span class="cx">     return augmented
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -249,47 +280,3 @@
</span><span class="cx"> 
</span><span class="cx"> &lt;directory realm=&quot;Realm&quot;/&gt;
</span><span class="cx"> &quot;&quot;&quot;
</span><del>-
-
-class InMemoryDirectoryService(IndexDirectoryService):
-    &quot;&quot;&quot;
-    An in-memory IDirectoryService.  You must call updateRecords( ) if you want
-    to populate this service.
-    &quot;&quot;&quot;
-
-    recordType = ConstantsContainer(
-        (
-            RecordType.user,
-            RecordType.group,
-            CalRecordType.location,
-            CalRecordType.resource,
-            CalRecordType.address
-        )
-    )
-
-
-    def loadRecords(self):
-        pass
-
-
-    @inlineCallbacks
-    def updateRecords(self, records, create=False):
-        recordsByUID = dict(((record.uid, record) for record in records))
-        if not create:
-            # Make sure all the records already exist
-            for uid, _ignore_record in recordsByUID.items():
-                if uid not in self._index[self.fieldName.uid]:
-                    raise NoSuchRecordError(uid)
-
-        yield self.removeRecords(recordsByUID.keys())
-        self.indexRecords(records)
-
-
-    def removeRecords(self, uids):
-        index = self._index
-        for fieldName in self.indexedFields:
-            for recordSet in index[fieldName].itervalues():
-                for record in list(recordSet):
-                    if record.uid in uids:
-                        recordSet.remove(record)
-        return succeed(None)
</del></span></pre>
</div>
</div>

</body>
</html>