<!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>[12853] CalendarServer/trunk/calendarserver/webadmin</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/12853">12853</a></dd>
<dt>Author</dt> <dd>wsanchez@apple.com</dd>
<dt>Date</dt> <dd>2014-03-07 16:08:43 -0800 (Fri, 07 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Jettison a bunch of ballast.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServertrunkcalendarserverwebadminlandingpy">CalendarServer/trunk/calendarserver/webadmin/landing.py</a></li>
<li><a href="#CalendarServertrunkcalendarserverwebadminresourcepy">CalendarServer/trunk/calendarserver/webadmin/resource.py</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#CalendarServertrunkcalendarserverwebadmintemplatehtml">CalendarServer/trunk/calendarserver/webadmin/template.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServertrunkcalendarserverwebadminlandingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/webadmin/landing.py (12852 => 12853)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/webadmin/landing.py        2014-03-07 23:09:08 UTC (rev 12852)
+++ CalendarServer/trunk/calendarserver/webadmin/landing.py        2014-03-08 00:08:43 UTC (rev 12853)
</span><span class="lines">@@ -26,7 +26,6 @@
</span><span class="cx"> # from twisted.web.template import renderer
</span><span class="cx"> 
</span><span class="cx"> from .resource import PageElement, TemplateResource
</span><del>-from .resource import WebAdminResource
</del><span class="cx"> from .logs import LogsResource
</span><span class="cx"> from .principals import PrincipalsResource
</span><span class="cx"> from .work import WorkMonitorResource
</span><span class="lines">@@ -72,14 +71,7 @@
</span><span class="cx">         self.putChild(u&quot;principals&quot;, PrincipalsResource(directory))
</span><span class="cx">         self.putChild(u&quot;work&quot;, WorkMonitorResource(store))
</span><span class="cx"> 
</span><del>-        self.putChild(
-            u&quot;old&quot;,
-            WebAdminResource(
-                path, root, directory, store, principalCollections
-            )
-        )
</del><span class="cx"> 
</span><del>-
</del><span class="cx">     def getChild(self, name):
</span><span class="cx">         bound = super(WebAdminLandingResource, self).getChild(name)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverwebadminresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/trunk/calendarserver/webadmin/resource.py (12852 => 12853)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/webadmin/resource.py        2014-03-07 23:09:08 UTC (rev 12852)
+++ CalendarServer/trunk/calendarserver/webadmin/resource.py        2014-03-08 00:08:43 UTC (rev 12853)
</span><span class="lines">@@ -20,712 +20,23 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> __all__ = [
</span><del>-    &quot;WebAdminResource&quot;,
-    &quot;WebAdminPage&quot;,
</del><ins>+    &quot;PageElement&quot;,
</ins><span class="cx">     &quot;TemplateResource&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-import operator
-import urlparse
-
-from zope.interface.declarations import implements
-
-from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</del><ins>+from twisted.internet.defer import inlineCallbacks, returnValue
</ins><span class="cx"> from twisted.python.modules import getModule
</span><ins>+from twisted.web.template import (
+    Element, renderer, XMLFile, flattenString, tags
+)
+
</ins><span class="cx"> from txweb2.stream import MemoryStream
</span><span class="cx"> from txweb2.resource import Resource
</span><span class="cx"> from txweb2.http import Response
</span><span class="cx"> from txweb2.http_headers import MimeType
</span><del>-from txweb2.http import HTTPError
-from txdav.xml import element as davxml
</del><span class="cx"> 
</span><del>-from twisted.web.iweb import ITemplateLoader
-from twisted.web.template import (
-    Element, renderer, XMLFile, flattenString, tags
-)
</del><span class="cx"> 
</span><del>-from twistedcaldav.config import config
-from twistedcaldav.extensions import DAVFile, ReadOnlyResourceMixIn
</del><span class="cx"> 
</span><del>-from calendarserver.tools.util import (
-    principalForPrincipalID, proxySubprincipal, action_addProxyPrincipal,
-    action_removeProxyPrincipal
-)
-
-
-
-class WebAdminPage(Element):
-    &quot;&quot;&quot;
-    Web administration renderer for HTML.
-
-    @ivar resource: a L{WebAdminResource}.
-    &quot;&quot;&quot;
-
-    loader = XMLFile(
-        getModule(__name__).filePath.sibling(&quot;template.html&quot;)
-    )
-
-    def __init__(self, resource):
-        super(WebAdminPage, self).__init__()
-        self.resource = resource
-
-
-    @renderer
-    def main(self, request, tag):
-        &quot;&quot;&quot;
-        Main renderer, which fills page-global slots like 'title'.
-        &quot;&quot;&quot;
-        searchTerm = request.args.get('resourceSearch', [''])[0]
-        return tag.fillSlots(resourceSearch=searchTerm)
-
-
-    @renderer
-    @inlineCallbacks
-    def hasSearchResults(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which detects if there are resource search results and
-        continues if so.
-        &quot;&quot;&quot;
-        if 'resourceSearch' not in request.args:
-            returnValue('')
-        if (yield self.performSearch(request)):
-            returnValue(tag)
-        else:
-            returnValue('')
-
-
-    @renderer
-    @inlineCallbacks
-    def noSearchResults(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which detects if there are resource search results and
-        continues if so.
-        &quot;&quot;&quot;
-        if 'resourceSearch' not in request.args:
-            returnValue('')
-        rows = yield self.performSearch(request)
-        if rows:
-            returnValue(&quot;&quot;)
-        else:
-            returnValue(tag)
-
-    _searchResults = None
-
-    @inlineCallbacks
-    def performSearch(self, request):
-        &quot;&quot;&quot;
-        Perform a directory search for users, groups, and resources based on
-        the resourceSearch query parameter.  Cache the results of that search
-        so that it will only be done once per request.
-        &quot;&quot;&quot;
-        if self._searchResults is not None:
-            returnValue(self._searchResults)
-        searchTerm = request.args.get('resourceSearch', [''])[0]
-        if searchTerm:
-            results = sorted((yield self.resource.search(searchTerm)),
-                             key=lambda record: record.shortNames[0])
-        else:
-            results = []
-        self._searchResults = results
-        returnValue(results)
-
-
-    @renderer
-    def searchResults(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which renders resource search results.
-        &quot;&quot;&quot;
-        d = self.performSearch(request)
-        return d.addCallback(searchToSlots, tag)
-
-
-    @renderer
-    def resourceDetails(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which fills slots for details of the resource selected by
-        the resourceId request parameter.
-        &quot;&quot;&quot;
-        resourceId = request.args.get('resourceId', [''])[0]
-        propertyName = request.args.get('davPropertyName', [''])[0]
-        proxySearch = request.args.get('proxySearch', [''])[0]
-        if resourceId:
-            principalResource = self.resource.getResourceById(
-                request, resourceId)
-            return DetailsElement(
-                resourceId, principalResource, propertyName, proxySearch, tag,
-                self.resource
-            )
-        else:
-            return &quot;&quot;
-
-
-
-def searchToSlots(results, tag):
-    &quot;&quot;&quot;
-    Convert the result of doing a search to an iterable of tags.
-    &quot;&quot;&quot;
-    for idx, record in enumerate(results):
-        yield tag.clone().fillSlots(
-            rowClass=&quot;even&quot; if (idx % 2 == 0) else &quot;odd&quot;,
-            type=record.recordType,
-            shortName=record.shortNames[0],
-            name=record.fullName,
-            typeStr={
-                &quot;users&quot;: &quot;User&quot;,
-                &quot;groups&quot;: &quot;Group&quot;,
-                &quot;locations&quot;: &quot;Place&quot;,
-                &quot;resources&quot;: &quot;Resource&quot;,
-            }.get(record.recordType, repr(record.recordType)),
-            shortNames=str(&quot;, &quot;.join(record.shortNames)),
-            authIds=str(&quot;, &quot;.join(record.authIDs)),
-            emails=str(&quot;, &quot;.join(record.emailAddresses)),
-        )
-
-
-
-class stan(object):
-    &quot;&quot;&quot;
-    L{ITemplateLoader} wrapper for an existing tag, in the style of Nevow's
-    'stan' loader.
-    &quot;&quot;&quot;
-    implements(ITemplateLoader)
-
-    def __init__(self, tag):
-        self.tag = tag
-
-
-    def load(self):
-        return self.tag
-
-
-
-class DetailsElement(Element):
-
-    def __init__(self, resourceId, principalResource, davPropertyName,
-                 proxySearch, tag, adminResource):
-        self.principalResource = principalResource
-        self.adminResource = adminResource
-        self.proxySearch = proxySearch
-        tag.fillSlots(resourceTitle=unicode(principalResource),
-                      resourceId=resourceId,
-                      davPropertyName=davPropertyName,
-                      proxySearch=proxySearch)
-        try:
-            namespace, name = davPropertyName.split(&quot;#&quot;)
-        except Exception:
-            self.namespace = None
-            self.name = None
-            if davPropertyName:
-                self.error = davPropertyName
-            else:
-                self.error = None
-        else:
-            self.namespace = namespace
-            self.name = name
-            self.error = None
-
-        super(DetailsElement, self).__init__(loader=stan(tag))
-
-
-    @renderer
-    def propertyParseError(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer to display an error when the user specifies an invalid
-        property name.
-        &quot;&quot;&quot;
-        if self.error is None:
-            return &quot;&quot;
-        else:
-            return tag.fillSlots(davPropertyName=self.error)
-
-
-    @renderer
-    @inlineCallbacks
-    def davProperty(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer to display an error when the user specifies an invalid
-        property name.
-        &quot;&quot;&quot;
-        if self.name is not None:
-            try:
-                propval = yield self.principalResource.readProperty(
-                    (self.namespace, self.name), request
-                )
-            except HTTPError:
-                propval = &quot;No such property: &quot; + &quot;#&quot;.join([self.namespace,
-                                                           self.name])
-            else:
-                propval = propval.toxml()
-            returnValue(tag.fillSlots(value=propval))
-        else:
-            returnValue(&quot;&quot;)
-
-
-    @renderer
-    def autoSchedule(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which elides its tag for non-resource-type principals.
-        &quot;&quot;&quot;
-        if (
-            self.principalResource.record.recordType != &quot;users&quot; and
-            self.principalResource.record.recordType != &quot;groups&quot; or
-            self.principalResource.record.recordType == &quot;users&quot; and
-            config.Scheduling.Options.AutoSchedule.AllowUsers
-        ):
-            return tag
-        return &quot;&quot;
-
-
-    @renderer
-    def isAutoSchedule(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag if the resource
-        is auto-schedule.
-        &quot;&quot;&quot;
-        if self.principalResource.getAutoSchedule():
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def isntAutoSchedule(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag if the resource
-        is not auto-schedule.
-        &quot;&quot;&quot;
-        if not self.principalResource.getAutoSchedule():
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def autoScheduleModeDefault(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag based on the
-        resource auto-schedule-mode.
-        &quot;&quot;&quot;
-        if self.principalResource.getAutoScheduleMode() == &quot;default&quot;:
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def autoScheduleModeNone(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag based on the
-        resource auto-schedule-mode.
-        &quot;&quot;&quot;
-        if self.principalResource.getAutoScheduleMode() == &quot;none&quot;:
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def autoScheduleModeAcceptAlways(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag based on the
-        resource auto-schedule-mode.
-        &quot;&quot;&quot;
-        if self.principalResource.getAutoScheduleMode() == &quot;accept-always&quot;:
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def autoScheduleModeDeclineAlways(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag based on the
-        resource auto-schedule-mode.
-        &quot;&quot;&quot;
-        if self.principalResource.getAutoScheduleMode() == &quot;decline-always&quot;:
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def autoScheduleModeAcceptIfFree(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag based on the
-        resource auto-schedule-mode.
-        &quot;&quot;&quot;
-        if self.principalResource.getAutoScheduleMode() == &quot;accept-if-free&quot;:
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def autoScheduleModeDeclineIfBusy(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag based on the
-        resource auto-schedule-mode.
-        &quot;&quot;&quot;
-        if self.principalResource.getAutoScheduleMode() == &quot;decline-if-busy&quot;:
-            tag(selected='selected')
-        return tag
-
-
-    @renderer
-    def autoScheduleModeAutomatic(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which sets the 'selected' attribute on its tag based on the
-        resource auto-schedule-mode.
-        &quot;&quot;&quot;
-        if (
-            self.principalResource.getAutoScheduleMode() == &quot;automatic&quot; or
-            not self.principalResource.getAutoScheduleMode()
-        ):
-            tag(selected='selected')
-        return tag
-
-    _matrix = None
-
-    @inlineCallbacks
-    def proxyMatrix(self, request):
-        &quot;&quot;&quot;
-        Compute a matrix of proxies to display in a 2-column table.
-
-        This value is cached so that multiple renderers may refer to it without
-        causing additional back-end queries.
-
-        @return: a L{Deferred} which fires with a list of 2-tuples of
-            (readProxy, writeProxy).  If there is an unequal number of read and
-            write proxies, the tables will be padded out with C{None}s so that
-            some readProxy or writeProxy values will be C{None} at the end of
-            the table.
-        &quot;&quot;&quot;
-        if self._matrix is not None:
-            returnValue(self._matrix)
-        (readSubPrincipal, writeSubPrincipal) = (
-            proxySubprincipal(self.principalResource, &quot;read&quot;),
-            proxySubprincipal(self.principalResource, &quot;write&quot;)
-        )
-        if readSubPrincipal or writeSubPrincipal:
-            (readMembers, writeMembers) = (
-                (yield readSubPrincipal.readProperty(davxml.GroupMemberSet,
-                                                     None)),
-                (yield writeSubPrincipal.readProperty(davxml.GroupMemberSet,
-                                                      None))
-            )
-            if readMembers.children or writeMembers.children:
-                # FIXME: 'else' case needs to be handled by separate renderer
-                readProxies = []
-                writeProxies = []
-
-                def getres(ref):
-                    return self.adminResource.getResourceById(request,
-                                                              str(proxyHRef))
-                for proxyHRef in sorted(readMembers.children, key=str):
-                    readProxies.append((yield getres(proxyHRef)))
-                for proxyHRef in sorted(writeMembers.children, key=str):
-                    writeProxies.append((yield getres(proxyHRef)))
-                lendiff = len(readProxies) - len(writeProxies)
-                if lendiff &gt; 0:
-                    writeProxies += [None] * lendiff
-                elif lendiff &lt; 0:
-                    readProxies += [None] * -lendiff
-                self._matrix = zip(readProxies, writeProxies)
-            else:
-                self._matrix = []
-        else:
-            self._matrix = []
-        returnValue(self._matrix)
-
-
-    @renderer
-    @inlineCallbacks
-    def noProxies(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which shows its tag if there are no proxies for this resource.
-        &quot;&quot;&quot;
-        mtx = yield self.proxyMatrix(request)
-        if mtx:
-            returnValue(&quot;&quot;)
-        returnValue(tag)
-
-
-    @renderer
-    @inlineCallbacks
-    def hasProxies(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which shows its tag if there are any proxies for this
-        resource.
-        &quot;&quot;&quot;
-        mtx = yield self.proxyMatrix(request)
-        if mtx:
-            returnValue(tag)
-        returnValue(&quot;&quot;)
-
-
-    @renderer
-    @inlineCallbacks
-    def noProxyResults(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which shows its tag if there are no proxy search results for
-        this request.
-        &quot;&quot;&quot;
-        if not self.proxySearch:
-            returnValue(&quot;&quot;)
-        results = yield self.performProxySearch()
-        if results:
-            returnValue(&quot;&quot;)
-        else:
-            returnValue(tag)
-
-
-    @renderer
-    @inlineCallbacks
-    def hasProxyResults(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which shows its tag if there are any proxy search results for
-        this request.
-        &quot;&quot;&quot;
-        results = yield self.performProxySearch()
-        if results:
-            returnValue(tag)
-        else:
-            returnValue(&quot;&quot;)
-
-
-    @renderer
-    @inlineCallbacks
-    def proxyRows(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which does zipping logic to render read-only and read-write
-        rows of existing proxies for the currently-viewed resource.
-        &quot;&quot;&quot;
-        result = []
-        mtx = yield self.proxyMatrix(request)
-        for idx, (readProxy, writeProxy) in enumerate(mtx):
-            result.append(ProxyRow(tag.clone(), idx, readProxy, writeProxy))
-        returnValue(result)
-
-    _proxySearchResults = None
-
-    def performProxySearch(self):
-        if self._proxySearchResults is not None:
-            return succeed(self._proxySearchResults)
-
-        if self.proxySearch:
-            def nameSorted(records):
-                records.sort(key=operator.attrgetter('fullName'))
-                self._proxySearchResults = records
-                return records
-            return self.adminResource.search(
-                self.proxySearch).addCallback(nameSorted)
-        else:
-            return succeed([])
-
-
-    @renderer
-    def proxySearchRows(self, request, tag):
-        &quot;&quot;&quot;
-        Renderer which renders search results for the proxy form.
-        &quot;&quot;&quot;
-        d = self.performProxySearch()
-        return d.addCallback(searchToSlots, tag)
-
-
-
-class ProxyRow(Element):
-
-    def __init__(self, tag, index, readProxy, writeProxy):
-        tag.fillSlots(rowClass=&quot;even&quot; if (index % 2 == 0) else &quot;odd&quot;)
-        super(ProxyRow, self).__init__(loader=stan(tag))
-        self.readProxy = readProxy
-        self.writeProxy = writeProxy
-
-
-    def proxies(self, proxyResource, tag):
-        if proxyResource is None:
-            return ''
-        return tag.fillSlots(proxy=str(proxyResource),
-                             type=proxyResource.record.recordType,
-                             shortName=proxyResource.record.shortNames[0])
-
-
-    def noProxies(self, proxyResource, tag):
-        if proxyResource is None:
-            return tag
-        else:
-            return &quot;&quot;
-
-
-    @renderer
-    def readOnlyProxies(self, request, tag):
-        return self.proxies(self.readProxy, tag)
-
-
-    @renderer
-    def noReadOnlyProxies(self, request, tag):
-        return self.noProxies(self.readProxy, tag)
-
-
-    @renderer
-    def readWriteProxies(self, request, tag):
-        return self.proxies(self.writeProxy, tag)
-
-
-    @renderer
-    def noReadWriteProxies(self, request, tag):
-        return self.noProxies(self.writeProxy, tag)
-
-
-
-class WebAdminResource (ReadOnlyResourceMixIn, DAVFile):
-    &quot;&quot;&quot;
-    Web administration HTTP resource.
-    &quot;&quot;&quot;
-
-    def __init__(self, path, root, directory, store, principalCollections=()):
-        self.root = root
-        self.directory = directory
-        self.store = store
-        super(WebAdminResource, self).__init__(
-            path, principalCollections=principalCollections
-        )
-
-
-    # Only allow administrators to access
-    def defaultAccessControlList(self):
-        return davxml.ACL(*config.AdminACEs)
-
-
-    def etag(self):
-        # Can't be calculated here
-        return succeed(None)
-
-
-    def contentLength(self):
-        # Can't be calculated here
-        return None
-
-
-    def lastModified(self):
-        return None
-
-
-    def exists(self):
-        return True
-
-
-    def displayName(self):
-        return &quot;Web Admin&quot;
-
-
-    def contentType(self):
-        return MimeType.fromString(&quot;text/html; charset=utf-8&quot;)
-
-
-    def contentEncoding(self):
-        return None
-
-
-    def createSimilarFile(self, path):
-        return DAVFile(path, principalCollections=self.principalCollections())
-
-
-    @inlineCallbacks
-    def resourceActions(self, request, principal):
-        &quot;&quot;&quot;
-        Take all actions on the given principal based on the given request.
-        &quot;&quot;&quot;
-
-        def queryValue(arg):
-            return request.args.get(arg, [&quot;&quot;])[0]
-
-        def queryValues(arg):
-            query = urlparse.parse_qs(urlparse.urlparse(request.uri).query,
-                                      True)
-            matches = []
-            for key in query.keys():
-                if key.startswith(arg):
-                    matches.append(key[len(arg):])
-            return matches
-
-        autoSchedule = queryValue(&quot;autoSchedule&quot;)
-        autoScheduleMode = queryValue(&quot;autoScheduleMode&quot;)
-        makeReadProxies = queryValues(&quot;mkReadProxy|&quot;)
-        makeWriteProxies = queryValues(&quot;mkWriteProxy|&quot;)
-        removeProxies = queryValues(&quot;rmProxy|&quot;)
-
-        # Update the auto-schedule value if specified.
-        if autoSchedule is not None and (autoSchedule == &quot;true&quot; or
-                                         autoSchedule == &quot;false&quot;):
-            if (
-                principal.record.recordType != &quot;users&quot; and
-                principal.record.recordType != &quot;groups&quot; or
-                principal.record.recordType == &quot;users&quot; and
-                config.Scheduling.Options.AutoSchedule.AllowUsers
-            ):
-                yield principal.setAutoSchedule(autoSchedule == &quot;true&quot;)
-                yield principal.setAutoScheduleMode(autoScheduleMode)
-
-        # Update the proxies if specified.
-        for proxyId in removeProxies:
-            proxy = self.getResourceById(request, proxyId)
-            yield action_removeProxyPrincipal(
-                self.root, self.directory, self.store,
-                principal, proxy, proxyTypes=[&quot;read&quot;, &quot;write&quot;]
-            )
-
-        for proxyId in makeReadProxies:
-            proxy = self.getResourceById(request, proxyId)
-            yield action_addProxyPrincipal(
-                self.root, self.directory, self.store, principal, &quot;read&quot;, proxy
-            )
-
-        for proxyId in makeWriteProxies:
-            proxy = self.getResourceById(request, proxyId)
-            yield action_addProxyPrincipal(
-                self.root, self.directory, self.store, principal,
-                &quot;write&quot;, proxy
-            )
-
-
-
-    @inlineCallbacks
-    def render(self, request):
-        &quot;&quot;&quot;
-        Create a L{WebAdminPage} to render HTML content for this request, and
-        return a response.
-        &quot;&quot;&quot;
-        resourceId = request.args.get('resourceId', [''])[0]
-        if resourceId:
-            principal = self.getResourceById(request, resourceId)
-            yield self.resourceActions(request, principal)
-        htmlContent = yield flattenString(request, WebAdminPage(self))
-        response = Response()
-        response.stream = MemoryStream(htmlContent)
-        for (header, value) in (
-            (&quot;content-type&quot;, self.contentType()),
-            (&quot;content-encoding&quot;, self.contentEncoding()),
-        ):
-            if value is not None:
-                response.headers.setHeader(header, value)
-        returnValue(response)
-
-
-    def getResourceById(self, request, resourceId):
-        if resourceId.startswith(&quot;/&quot;):
-            return request.locateResource(resourceId)
-        else:
-            return principalForPrincipalID(
-                resourceId, directory=self.directory
-            )
-
-
-    @inlineCallbacks
-    def search(self, searchStr):
-        records = list((
-            yield self.directory.recordsMatchingTokens(
-                searchStr.strip().split()
-            )
-        ))
-        returnValue(records)
-
-
-
-
</del><span class="cx"> class PageElement(Element):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Page element.
</span></span></pre></div>
<a id="CalendarServertrunkcalendarserverwebadmintemplatehtml"></a>
<div class="delfile"><h4>Deleted: CalendarServer/trunk/calendarserver/webadmin/template.html (12852 => 12853)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/trunk/calendarserver/webadmin/template.html        2014-03-07 23:09:08 UTC (rev 12852)
+++ CalendarServer/trunk/calendarserver/webadmin/template.html        2014-03-08 00:08:43 UTC (rev 12853)
</span><span class="lines">@@ -1,247 +0,0 @@
</span><del>-&lt;html xmlns:t=&quot;http://twistedmatrix.com/ns/twisted.web.template/0.1&quot;
-      t:render=&quot;main&quot;&gt;
-  &lt;head&gt;
-    &lt;style&gt;
-      th, .even td, .odd td {
-        padding-right: 0.5em;
-        font-family: monospace;
-      }
-      .even-dir {
-        background-color: #efe0ef;
-      }
-      .even {
-        background-color: #eee;
-      }
-      .odd-dir {
-        background-color: #f0d0ef;
-      }
-      .odd {
-        background-color: #dedede;
-      }
-      .icon {
-        text-align: center;
-      }
-      .listing {
-        margin-left: auto;
-        margin-right: auto;
-        width: 50%;
-        padding: 0.1em;
-      }
-      .content {
-        padding-left: 10px;
-        padding-right: 10px;
-      }
-      body {
-        border: 0;
-        padding: 0;
-        margin: 0;
-        background-color: #efefef;
-      }
-      h1 {
-        padding: 0.1em;
-        padding-left:10px;
-        padding-right:10px;
-        background-color: #777;
-        color: white;
-        border-bottom: thin white dashed;
-      }
-    &lt;/style&gt;
-    &lt;title&gt;Calendar Server Web Administration&lt;/title&gt;
-  &lt;/head&gt;
-  &lt;body&gt;
-    &lt;h1&gt;Calendar Server Web Administration&lt;/h1&gt;
-    &lt;div class=&quot;content&quot;&gt;
-      &lt;h2&gt;Resource Management&lt;/h2&gt;
-      &lt;form id=&quot;frm_resource&quot; name=&quot;resourceForm&quot;&gt;
-        Search for resource to manage:
-        &lt;input type=&quot;text&quot; id=&quot;txt_resourceSearch&quot; name=&quot;resourceSearch&quot;
-        size=&quot;40&quot;&gt;&lt;t:attr name=&quot;value&quot;&gt;&lt;t:slot name=&quot;resourceSearch&quot;
-        /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;input type=&quot;submit&quot; value=&quot;Search&quot; /&gt;
-      &lt;/form&gt;
-      &lt;div t:render=&quot;noSearchResults&quot; style=&quot;margin-top:4px&quot;
-        &gt;No matches found for resource &lt;b&gt;&lt;t:slot name=&quot;resourceSearch&quot; /&gt;&lt;/b&gt;.
-      &lt;/div&gt;
-      &lt;table id=&quot;tab_searchResults&quot; t:render=&quot;hasSearchResults&quot; cellspacing=&quot;0&quot;
-             cellpadding=&quot;3&quot; border=&quot;1&quot; style=&quot;margin-top: 2px&quot;&gt;
-        &lt;tr class=&quot;odd&quot;&gt;
-          &lt;th&gt;ID&lt;/th&gt;
-          &lt;th&gt;Full Name&lt;/th&gt;
-          &lt;th&gt;Type&lt;/th&gt;
-          &lt;th&gt;Short Names&lt;/th&gt;
-          &lt;th&gt;Auth IDs&lt;/th&gt;
-          &lt;th&gt;Email Addresses&lt;/th&gt;
-        &lt;/tr&gt;
-        &lt;tr t:render=&quot;searchResults&quot;&gt;
-          &lt;t:attr name=&quot;class&quot;&gt;&lt;t:slot name=&quot;rowClass&quot; /&gt;&lt;/t:attr&gt;
-          &lt;td&gt;&lt;a&gt;select&lt;t:attr name=&quot;href&quot; &gt;/admin/old/?resourceId=&lt;t:slot
-              name=&quot;type&quot; /&gt;:&lt;t:slot name=&quot;shortName&quot; /&gt;&lt;/t:attr&gt;&lt;/a&gt;&lt;/td&gt;
-          &lt;td&gt;&lt;t:slot name=&quot;name&quot; /&gt;&lt;/td&gt;
-          &lt;td&gt;&lt;t:slot name=&quot;typeStr&quot; /&gt;&lt;/td&gt;
-          &lt;td&gt;&lt;t:slot name=&quot;shortNames&quot; /&gt;&lt;/td&gt;
-          &lt;td&gt;&lt;t:slot name=&quot;authIds&quot; /&gt;&lt;/td&gt;
-          &lt;td&gt;&lt;t:slot name=&quot;emails&quot; /&gt;&lt;/td&gt;
-        &lt;/tr&gt;
-      &lt;/table&gt;
-      &lt;div style=&quot;margin-top:15px; background-color: #777;
-                  border-bottom:1px #ffffff dotted&quot;&gt;&lt;/div&gt;
-      &lt;div style=&quot;background-color: #777; padding-top:2px;
-                  border-bottom:1px #ffffff dotted&quot;&gt;&lt;/div&gt;
-
-      &lt;t:transparent t:render=&quot;resourceDetails&quot;&gt;
-      &lt;h3&gt;Resource Details: &lt;t:slot name=&quot;resourceTitle&quot; /&gt;&lt;/h3&gt;
-
-      &lt;!-- propertyHTML --&gt;
-      &lt;div style=&quot;margin-top:15px; border-bottom:1px #444444 dotted&quot;&gt;&lt;/div&gt;
-      &lt;form id=&quot;frm_davProperty&quot; name=&quot;davPropertyForm&quot; action=&quot;/admin/&quot;
-        style=&quot;margin-top:15px; margin-bottom:0; padding-bottom:0&quot;&gt;
-        Show a DAV property value:
-        &lt;input type=&quot;hidden&quot; id=&quot;hdn_resourceId&quot; name=&quot;resourceId&quot;&gt;&lt;t:attr
-        name=&quot;value&quot;&gt;&lt;t:slot name=&quot;resourceId&quot; /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;input type=&quot;text&quot; id=&quot;txt_davPropertyName&quot; name=&quot;davPropertyName&quot;
-        size=&quot;40&quot;&gt;&lt;t:attr name=&quot;value&quot;&gt;&lt;t:slot name=&quot;davPropertyName&quot;
-        /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;input type=&quot;submit&quot; value=&quot;Get Value&quot; /&gt;
-      &lt;/form&gt;
-
-      &lt;div t:render=&quot;propertyParseError&quot;&gt;
-      Unable to parse property to read: &lt;b&gt;&lt;t:slot name=&quot;davPropertyName&quot; /&gt;&lt;/b&gt;
-      &lt;/div&gt;
-
-      &lt;t:transparent t:render=&quot;davProperty&quot;&gt;
-      &lt;div style=&quot;margin-top: 7px&quot;&gt;Value of property
-        &lt;b&gt;&lt;t:slot name=&quot;davPropertyName&quot; /&gt;&lt;/b&gt;:&lt;/div&gt;
-      &lt;pre style=&quot;margin-top:5px; padding-top:0&quot;&gt;&lt;t:slot name=&quot;value&quot; /&gt;&lt;/pre&gt;
-      &lt;/t:transparent&gt;
-
-      &lt;!-- autoScheduleHtml --&gt;
-
-      &lt;t:transparent t:render=&quot;autoSchedule&quot;&gt;
-      &lt;div style=&quot;margin-top:15px; border-bottom:1px #444444 dotted&quot;&gt;&lt;/div&gt;
-      &lt;form id=&quot;frm_autoSchedule&quot; name=&quot;autoScheduleForm&quot; action=&quot;/admin/&quot;
-        style=&quot;margin-top:15px&quot;&gt;
-        &lt;input type=&quot;hidden&quot; id=&quot;hdn_resourceId&quot; name=&quot;resourceId&quot;
-        &gt;&lt;t:attr name=&quot;value&quot;&gt;&lt;t:slot name=&quot;resourceId&quot; /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;div style=&quot;margin-top:7px&quot;&gt;
-          Auto-Schedule
-          &lt;select id=&quot;sel_autoSchedule&quot; name=&quot;autoSchedule&quot;&gt;
-            &lt;option t:render=&quot;isAutoSchedule&quot; value=&quot;true&quot;&gt;Yes&lt;/option&gt;
-            &lt;option t:render=&quot;isntAutoSchedule&quot; value=&quot;false&quot;&gt;No&lt;/option&gt;
-          &lt;/select&gt;
-          &lt;br/&gt;
-          Auto-Schedule Mode
-          &lt;select id=&quot;sel_autoScheduleMode&quot; name=&quot;autoScheduleMode&quot;&gt;
-            &lt;option t:render=&quot;autoScheduleModeDefault&quot; value=&quot;default&quot;&gt;Default&lt;/option&gt;
-            &lt;option t:render=&quot;autoScheduleModeNone&quot; value=&quot;none&quot;&gt;None&lt;/option&gt;
-            &lt;option t:render=&quot;autoScheduleModeAcceptAlways&quot; value=&quot;accept-always&quot;&gt;Accept Always&lt;/option&gt;
-            &lt;option t:render=&quot;autoScheduleModeDeclineAlways&quot; value=&quot;decline-always&quot;&gt;Decline Always&lt;/option&gt;
-            &lt;option t:render=&quot;autoScheduleModeAcceptIfFree&quot; value=&quot;accept-if-free&quot;&gt;Accept If Free&lt;/option&gt;
-            &lt;option t:render=&quot;autoScheduleModeDeclineIfBusy&quot; value=&quot;decline-if-busy&quot;&gt;Decline If Busy&lt;/option&gt;
-            &lt;option t:render=&quot;autoScheduleModeAutomatic&quot; value=&quot;automatic&quot;&gt;Automatic (Accept and Decline)&lt;/option&gt;
-          &lt;/select&gt;
-          &lt;br/&gt;
-          &lt;input type=&quot;submit&quot; value=&quot;Change&quot; /&gt;
-        &lt;/div&gt;
-      &lt;/form&gt;
-      &lt;/t:transparent&gt;
-
-      &lt;!-- currentProxiesHtml --&gt;
-      &lt;div style=&quot;margin-top:15px; border-bottom:1px #444444 dotted&quot;&gt;&lt;/div&gt;
-      &lt;form id=&quot;frm_proxies&quot; name=&quot;proxiesForm&quot; action=&quot;/admin/&quot;
-        style=&quot;margin-top:15px&quot;&gt;
-        &lt;input type=&quot;hidden&quot; id=&quot;hdn_resourceId&quot; name=&quot;resourceId&quot;
-        &gt;&lt;t:attr name=&quot;value&quot;&gt;&lt;t:slot name=&quot;resourceId&quot; /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;div t:render=&quot;noProxies&quot; style=&quot;margin-top:15px&quot;
-          &gt;This resource has no proxies.&lt;/div&gt;
-        &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; border=&quot;1&quot;
-          t:render=&quot;hasProxies&quot;&gt;
-          &lt;tr class=&quot;odd&quot;&gt;
-            &lt;th colspan=&quot;2&quot;&gt;Read-Only Proxies&lt;/th&gt;
-            &lt;th colspan=&quot;2&quot;&gt;Read-Write Proxies&lt;/th&gt;
-          &lt;/tr&gt;
-          &lt;tr t:render=&quot;proxyRows&quot;&gt;
-            &lt;t:attr name=&quot;class&quot;&gt;&lt;t:slot name=&quot;rowClass&quot; /&gt; &lt;/t:attr&gt;
-            &lt;t:transparent t:render=&quot;readOnlyProxies&quot;&gt;
-            &lt;td&gt;&lt;t:slot name=&quot;proxy&quot; /&gt;&lt;/td&gt;
-            &lt;td&gt;
-              &lt;input type=&quot;submit&quot; value=&quot;Make Read-Write&quot;&gt;&lt;t:attr
-              name=&quot;name&quot;&gt;mkWriteProxy|&lt;t:slot name=&quot;type&quot; /&gt;:&lt;t:slot
-              name=&quot;shortName&quot;/&gt;&lt;/t:attr&gt;&lt;/input&gt;
-              &lt;input type=&quot;submit&quot; value=&quot;Remove Proxy&quot;&gt;&lt;t:attr
-              name=&quot;name&quot;&gt;rmProxy|&lt;t:slot name=&quot;type&quot; /&gt;:&lt;t:slot
-              name=&quot;shortName&quot;/&gt;&lt;/t:attr&gt;&lt;/input&gt;
-            &lt;/td&gt;
-            &lt;/t:transparent&gt;
-
-            &lt;t:transparent t:render=&quot;noReadOnlyProxies&quot;&gt;
-            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;
-            &lt;/t:transparent&gt;
-            &lt;t:transparent t:render=&quot;readWriteProxies&quot;&gt;
-            &lt;td&gt;&lt;t:slot name=&quot;proxy&quot; /&gt;&lt;/td&gt;
-            &lt;td&gt;
-              &lt;input type=&quot;submit&quot; value=&quot;Make Read-Only&quot;&gt;&lt;t:attr
-              name=&quot;name&quot;&gt;mkReadProxy|&lt;t:slot name=&quot;type&quot; /&gt;:&lt;t:slot
-              name=&quot;shortName&quot;/&gt;&lt;/t:attr&gt;&lt;/input&gt;
-              &lt;input type=&quot;submit&quot; value=&quot;Remove Proxy&quot;&gt;&lt;t:attr
-              name=&quot;name&quot;&gt;rmProxy|&lt;t:slot name=&quot;type&quot; /&gt;:&lt;t:slot
-              name=&quot;shortName&quot;/&gt;&lt;/t:attr&gt;&lt;/input&gt;
-            &lt;/td&gt;
-            &lt;/t:transparent&gt;
-            &lt;t:transparent t:render=&quot;noReadWriteProxies&quot;&gt;
-            &lt;td colspan=&quot;2&quot;&gt;&lt;/td&gt;
-            &lt;/t:transparent&gt;
-          &lt;/tr&gt;
-        &lt;/table&gt;
-      &lt;/form&gt;
-
-      &lt;!-- proxySearchHtml --&gt;
-
-      &lt;div style=&quot;margin-top:15px; border-bottom:1px #444444 dotted&quot;&gt;&lt;/div&gt;
-      &lt;div t:render=&quot;noProxyResults&quot;
-        style=&quot;margin-top:4px&quot;
-        &gt;No matches found for proxy resource &lt;b&gt;&lt;t:slot
-          name=&quot;proxySearch&quot; /&gt;&lt;/b&gt;.&lt;/div&gt;
-      &lt;form id=&quot;frm_proxySearch&quot; name=&quot;proxySearchForm&quot; action=&quot;/admin/&quot;
-        style=&quot;margin-top:15px; margin-bottom:0; padding-bottom:0&quot;&gt;
-        Search to add proxies:
-        &lt;input type=&quot;hidden&quot; id=&quot;hdn_resourceId&quot; name=&quot;resourceId&quot;
-        &gt;&lt;t:attr name=&quot;value&quot;&gt;&lt;t:slot name=&quot;resourceId&quot; /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;input type=&quot;text&quot; id=&quot;txt_proxySearch&quot; name=&quot;proxySearch&quot; size=&quot;40&quot;
-        &gt;&lt;t:attr name=&quot;value&quot;&gt;&lt;t:slot name=&quot;proxySearch&quot; /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;input type=&quot;submit&quot; value=&quot;Search&quot;&gt;&lt;/input&gt;
-      &lt;/form&gt;
-      &lt;form t:render=&quot;hasProxyResults&quot;
-        id=&quot;frm_proxyAdd&quot; name=&quot;proxyAddForm&quot; action=&quot;/admin/&quot;
-        style=&quot;margin-top:2px; padding-top:0&quot;&gt;
-        &lt;input type=&quot;hidden&quot; id=&quot;hdn_resourceId&quot; name=&quot;resourceId&quot;
-        &gt;&lt;t:attr name=&quot;value&quot;&gt;&lt;t:slot name=&quot;resourceId&quot; /&gt;&lt;/t:attr&gt;&lt;/input&gt;
-        &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; border=&quot;1&quot;&gt;
-          &lt;tr class=&quot;odd&quot;&gt;
-            &lt;th&gt;Full Name&lt;/th&gt;
-            &lt;th&gt;Type&lt;/th&gt;
-            &lt;th&gt;Short Names&lt;/th&gt;
-            &lt;th&gt;Email Addresses&lt;/th&gt;
-            &lt;th&gt;&lt;/th&gt;
-          &lt;/tr&gt;
-          &lt;tr t:render=&quot;proxySearchRows&quot;&gt;
-            &lt;t:attr name=&quot;class&quot;&gt;&lt;t:slot name=&quot;rowClass&quot; /&gt; &lt;/t:attr&gt;
-            &lt;td&gt;&lt;t:slot name=&quot;name&quot; /&gt;&lt;/td&gt;
-            &lt;td&gt;&lt;t:slot name=&quot;typeStr&quot; /&gt;&lt;/td&gt;
-            &lt;td&gt;&lt;t:slot name=&quot;shortNames&quot; /&gt;&lt;/td&gt;
-            &lt;td&gt;&lt;t:slot name=&quot;emails&quot; /&gt;&lt;/td&gt;
-            &lt;td&gt;
-              &lt;input type=&quot;submit&quot; value=&quot;Make Read-Only Proxy&quot;&gt;&lt;t:attr
-              name=&quot;name&quot;&gt;mkReadProxy|&lt;t:slot name=&quot;type&quot; /&gt;:&lt;t:slot
-              name=&quot;shortName&quot;/&gt;&lt;/t:attr&gt;&lt;/input&gt;
-              &lt;input type=&quot;submit&quot; value=&quot;Make Read-Write Proxy&quot;&gt;&lt;t:attr
-              name=&quot;name&quot;&gt;mkWriteProxy|&lt;t:slot name=&quot;type&quot; /&gt;:&lt;t:slot
-              name=&quot;shortName&quot;/&gt;&lt;/t:attr&gt;&lt;/input&gt;
-            &lt;/td&gt;
-          &lt;/tr&gt;
-        &lt;/table&gt;
-      &lt;/form&gt;
-      &lt;/t:transparent&gt;
-    &lt;/div&gt;
-
-  &lt;/body&gt;
-&lt;/html&gt;
</del></span></pre>
</div>
</div>

</body>
</html>